diff --git a/netbox_proxbox/backend/routes/proxbox/clusters/__init__.py b/netbox_proxbox/backend/routes/proxbox/clusters/__init__.py index 079a414..c93cf61 100755 --- a/netbox_proxbox/backend/routes/proxbox/clusters/__init__.py +++ b/netbox_proxbox/backend/routes/proxbox/clusters/__init__.py @@ -65,7 +65,7 @@ async def proxbox_get_clusters( # Create Cluster Type object before the Cluster itself try: - logger.info("Creating the Cluster Type before Cluster...") + await log(websocket, "Creating the Cluster Type before Cluster...") cluster_type_obj = await ClusterType(nb = nb).post( data = { "name": cluster_type_name, @@ -77,7 +77,7 @@ async def proxbox_get_clusters( # Create the Cluster try: - logger.info("Creating the Cluster...") + await log(websocket, "Creating the Cluster...") cluster_obj = await Cluster(nb = nb).post( data = { "name": px.name, @@ -117,11 +117,19 @@ def find_interface_type( print(f'interface_type: {interface_type} / {type(interface_type)}') return str(interface_type) +from fastapi import WebSocket + +async def log(websocket, msg, level = None): + if level == "debug": logger.debug(msg) + else: logger.info(msg) + + await websocket.send_text(msg) @router.get("/nodes") async def get_nodes( nb: NetboxSessionDep, pxs: ProxmoxSessionsDep, + websocket: WebSocket ): """Get Proxmox Nodes from a Cluster""" @@ -129,6 +137,9 @@ async def get_nodes( result = [] + + await websocket.send_text(data = "Test message") + for px in pxs: # Get Cluster from Netbox based on Proxmox Cluster Name @@ -144,7 +155,9 @@ async def get_nodes( for node in proxmox_nodes: try: - logger.info("Creating Device related with the Virtual Machine(s)") + msg = f"Creating Device '{node.get("node")}' related with the Virtual Machine(s)" + await log(websocket, msg) + current_node = await Device(nb=nb).post( data = { "name": node.get("node"), @@ -152,6 +165,10 @@ async def get_nodes( "status": "active", } ) + + msg = f"Device '{current_node}' created successfully." + await log(websocket, msg) + except Exception as error: raise ProxboxException( message="Error trying to create Netbox Device object.", @@ -183,7 +200,7 @@ async def get_nodes( else: enabled = False try: - logger.info("Creating Netbox interface...") + await log(websocket, f"Creating Netbox '{interface_name}' Interface on '{current_node.name}' Device...") create_interface = await Interface(nb=nb).post(data={ "device": current_node.id, "name": interface_name, @@ -207,7 +224,7 @@ async def get_nodes( if cidr: try: - logger.info("Interface with CIDR/Network. Creating the IP Address object on Netbox...") + await log(websocket, "Interface with CIDR/Network. Creating the IP Address object on Netbox...") # If interface with network configured, create IP Address and attach interface to it. create_ipaddress = await IPAddress(nb=nb, primary_field_value=cidr).post(data={ "address": cidr, @@ -235,7 +252,7 @@ async def get_nodes( print(f'current_node: {current_node}') try: - logger.info("Searching children interface of a bridge.") + await log(websocket, "Searching children interface of a bridge.") netbox_port = await Interface(nb=nb).get( device=current_node.name, name=port @@ -257,9 +274,11 @@ async def get_nodes( # Interface and Bridge Interface must belong to the same Device - logger.info("Creating child interface of a bridge. Bridge interface and child must belong to the same device.") + await log(websocket, "Creating child interface of a bridge. Bridge interface and child must belong to the same device.") if create_interface.device == current_node.id: - print("Creating interface...") + + await log(websocket, f"Creating interface '{port}'...") + try: new_netbox_port = await Interface(nb=nb).post(data={ "device": current_node.id, @@ -270,6 +289,9 @@ async def get_nodes( "description": proxmox_port.get("comments", ""), "bridge": create_interface.id }) + + await log(websocket, f"Interface '{port}' created successfully.") + except Exception as error: raise ProxboxException( message="Error trying to create child interface of bridge interface.", @@ -280,7 +302,7 @@ async def get_nodes( print(f"[2] cidr: {cidr}") if cidr: - logger.info("If interface with network configured, create IP Address and attach interface to it.") + await log(websocket, "If interface with network configured, create IP Address and attach interface to it.") try: create_ipaddress = await IPAddress(nb=nb, primary_field_value=cidr).post(data={ "address": cidr, @@ -292,7 +314,7 @@ async def get_nodes( else: - logger.info("Interface already exists. Attaching Bridge to Interface") + await log(websocket, "Interface already exists. Attaching Bridge to Interface") print(f'create_interface: {create_interface}') # Interface and Bridge Interface must belong to the same Device if create_interface.device == current_node.id: @@ -305,7 +327,7 @@ async def get_nodes( print("\n") - logger.debug(f"Nodes: {nodes}") + await log(websocket, f"Nodes: {nodes}", "debug") result.append({ @@ -315,6 +337,7 @@ async def get_nodes( } }) + return result @router.get("/nodes/interfaces") @@ -325,6 +348,7 @@ async def get_nodes_interfaces(): async def get_virtual_machines( nb: NetboxSessionDep, pxs: ProxmoxSessionsDep, + websocket: WebSocket ): from enum import Enum class VirtualMachineStatus(Enum): @@ -599,7 +623,7 @@ class VirtualMachineStatus(Enum): "status": VirtualMachineStatus(vm.get("status")).name, "vcpus": int(vm.get("maxcpu", 0)), "memory": int(vm_config.get("memory")), - "disk": int(int(vm.get("maxdisk", 0)) / 1000000000), + "disk": int(int(vm.get("maxdisk", 0)) / 1000000), "role": role.id, "custom_fields": { "proxmox_vm_id": vm.get("vmid"), @@ -612,7 +636,7 @@ class VirtualMachineStatus(Enum): } try: - logger.info("Creating Virtual Machine on Netbox...") + await log(websocket, "Creating Virtual Machine on Netbox...") new_virtual_machine = await VirtualMachine(nb = nb).post(data = virtual_machine_data) @@ -644,7 +668,7 @@ class VirtualMachineStatus(Enum): vm_networks = [] network_id = 0 - logger.info("Getting network info and parsing data into JSON (dict)") + await log(websocket, "Getting network info and parsing data into JSON (dict)") while True: network_name = f"net{network_id}" @@ -672,44 +696,50 @@ class VirtualMachineStatus(Enum): if vm_networks: for network in vm_networks: - print(f"network: {network}") - print(f"network (items): {network.items()}") - for k, v in network.items(): - print(f'k: {k} / v: {v}') - - - mac_address = None - - virtio = v.get("virtio", None) - if virtio: mac_address=virtio - - hwaddr = v.get("hwaddr", None) - if hwaddr: mac_address=hwaddr - - try: - logger.info("Try creating VirtualMachine Interface on Netbox...") + try: + print(f"network: {network}") + print(f"network (items): {network.items()}") + for k, v in network.items(): + print(f'k: {k} / v: {v}') - #vm_already_exists = await VMInterface(nb=nb).get({ - # "virtual_machine": new_virtual_machine.id, - # "name": str(k) - #}) - #if not vm_already_exists: - - netbox_interface = await VMInterface(nb=nb).post(data={ - "virtual_machine": new_virtual_machine.id, - "name": str(k), - "enabled": True, - "mac_address": mac_address, - }) + mac_address = None - if netbox_interface: - logger.info(f"Virtual Machine Interface created successfully. {netbox_interface.id} - {netbox_interface.name}") - - except Exception as error: - raise ProxboxException( - message="Error trying to create VM interface on Netbox", - ) + virtio = v.get("virtio", None) + if virtio: mac_address=virtio + + hwaddr = v.get("hwaddr", None) + if hwaddr: mac_address=hwaddr + + await log(websocket, "Try creating VirtualMachine Interface on Netbox...") + try: + + + #vm_already_exists = await VMInterface(nb=nb).get({ + # "virtual_machine": new_virtual_machine.id, + # "name": str(k) + #}) + + #if not vm_already_exists: + + netbox_interface = await VMInterface(nb=nb).post(data={ + "virtual_machine": new_virtual_machine.id, + "name": str(k), + "enabled": True, + "mac_address": mac_address, + }) + + if netbox_interface: + await log(websocket, f"Virtual Machine Interface created successfully. {netbox_interface.id} - {netbox_interface.name}") + + except Exception as error: + raise ProxboxException( + message="Error trying to create VM interface on Netbox", + ) + except Exception as error: + raise ProxboxException( + message=f"Error trying to create {new_virtual_machine.name} VM Network Interfaces", + ) result.append({ "name": px.name, diff --git a/netbox_proxbox/main.py b/netbox_proxbox/main.py index 445d84e..af45d8c 100755 --- a/netbox_proxbox/main.py +++ b/netbox_proxbox/main.py @@ -1,7 +1,7 @@ from typing import Annotated -from fastapi import FastAPI, Request -from fastapi.responses import JSONResponse +from fastapi import FastAPI, Request, WebSocket +from fastapi.responses import JSONResponse, HTMLResponse from netbox_proxbox.backend.exception import ProxboxException @@ -42,10 +42,73 @@ async def proxmoxer_exception_handler(request: Request, exc: ProxboxException): } ) +from netbox_proxbox.backend.session.proxmox import ProxmoxSessionsDep +from netbox_proxbox.backend.session.netbox import NetboxSessionDep + +@app.websocket("/ws") +async def websocket_endpoint( + nb: NetboxSessionDep, + pxs: ProxmoxSessionsDep, + websocket: WebSocket +): + await websocket.accept() + + from netbox_proxbox.backend.routes.proxbox.clusters import get_nodes, get_virtual_machines + + await get_nodes(nb=nb, pxs=pxs, websocket=websocket) + await get_virtual_machines(nb=nb, pxs=pxs, websocket=websocket) + + while True: + data = await websocket.receive_text() + await websocket.send_text(f"Message text was: {data}") + + # # Routes (Endpoints) # + +html = """ + + + + Chat + + +

Log Messages

+ + + + + +""" + +@app.get("/websocket") +async def get(): + return HTMLResponse(html) + + # Netbox Routes app.include_router(netbox_router, prefix="/netbox", tags=["netbox"]) app.include_router(nb_dcim_router, prefix="/netbox/dcim", tags=["netbox / dcim"]) diff --git a/netbox_proxbox/templates/netbox_proxbox/home.html b/netbox_proxbox/templates/netbox_proxbox/home.html index 6100ada..5f1c99a 100755 --- a/netbox_proxbox/templates/netbox_proxbox/home.html +++ b/netbox_proxbox/templates/netbox_proxbox/home.html @@ -2,8 +2,37 @@ {% load static %} {% block content %} +

Log Messages

+ + + +
+ + +
{# Full Update Button#}
{% if perms.netbox_proxbox.add_proxmoxvm %} diff --git a/standalone/package-lock.json b/standalone/package-lock.json index 8c23a95..6b5be1f 100755 --- a/standalone/package-lock.json +++ b/standalone/package-lock.json @@ -12,9 +12,9 @@ "@heroicons/react": "^2.0.18", "clsx": "^2.0.0", "lucide-react": "^0.292.0", - "next": "14.0.1", - "react": "^18", - "react-dom": "^18", + "next": "^14.2.11", + "react": "^18.3.1", + "react-dom": "^18.3.1", "tailwind-merge": "^2.0.0" }, "devDependencies": { @@ -220,9 +220,9 @@ } }, "node_modules/@next/env": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.1.tgz", - "integrity": "sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A==" + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.11.tgz", + "integrity": "sha512-HYsQRSIXwiNqvzzYThrBwq6RhXo3E0n8j8nQnAs8i4fCEo2Zf/3eS0IiRA8XnRg9Ha0YnpkyJZIZg1qEwemrHw==" }, "node_modules/@next/eslint-plugin-next": { "version": "14.0.1", @@ -234,9 +234,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz", - "integrity": "sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.11.tgz", + "integrity": "sha512-eiY9u7wEJZWp/Pga07Qy3ZmNEfALmmSS1HtsJF3y1QEyaExu7boENz11fWqDmZ3uvcyAxCMhTrA1jfVxITQW8g==", "cpu": [ "arm64" ], @@ -249,9 +249,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz", - "integrity": "sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.11.tgz", + "integrity": "sha512-lnB0zYCld4yE0IX3ANrVMmtAbziBb7MYekcmR6iE9bujmgERl6+FK+b0MBq0pl304lYe7zO4yxJus9H/Af8jbg==", "cpu": [ "x64" ], @@ -264,9 +264,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz", - "integrity": "sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.11.tgz", + "integrity": "sha512-Ulo9TZVocYmUAtzvZ7FfldtwUoQY0+9z3BiXZCLSUwU2bp7GqHA7/bqrfsArDlUb2xeGwn3ZuBbKtNK8TR0A8w==", "cpu": [ "arm64" ], @@ -279,9 +279,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz", - "integrity": "sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.11.tgz", + "integrity": "sha512-fH377DnKGyUnkWlmUpFF1T90m0dADBfK11dF8sOQkiELF9M+YwDRCGe8ZyDzvQcUd20Rr5U7vpZRrAxKwd3Rzg==", "cpu": [ "arm64" ], @@ -294,9 +294,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz", - "integrity": "sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.11.tgz", + "integrity": "sha512-a0TH4ZZp4NS0LgXP/488kgvWelNpwfgGTUCDXVhPGH6pInb7yIYNgM4kmNWOxBFt+TIuOH6Pi9NnGG4XWFUyXQ==", "cpu": [ "x64" ], @@ -309,9 +309,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz", - "integrity": "sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.11.tgz", + "integrity": "sha512-DYYZcO4Uir2gZxA4D2JcOAKVs8ZxbOFYPpXSVIgeoQbREbeEHxysVsg3nY4FrQy51e5opxt5mOHl/LzIyZBoKA==", "cpu": [ "x64" ], @@ -324,9 +324,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz", - "integrity": "sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.11.tgz", + "integrity": "sha512-PwqHeKG3/kKfPpM6of1B9UJ+Er6ySUy59PeFu0Un0LBzJTRKKAg2V6J60Yqzp99m55mLa+YTbU6xj61ImTv9mg==", "cpu": [ "arm64" ], @@ -339,9 +339,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz", - "integrity": "sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.11.tgz", + "integrity": "sha512-0U7PWMnOYIvM74GY6rbH6w7v+vNPDVH1gUhlwHpfInJnNe5LkmUZqhp7FNWeNa5wbVgRcRi1F1cyxp4dmeLLvA==", "cpu": [ "ia32" ], @@ -354,9 +354,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz", - "integrity": "sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.11.tgz", + "integrity": "sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==", "cpu": [ "x64" ], @@ -409,11 +409,17 @@ "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==", "dev": true }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -989,9 +995,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "version": "1.0.30001660", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", + "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", "funding": [ { "type": "opencollective", @@ -2084,11 +2090,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, "node_modules/globals": { "version": "13.23.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", @@ -2920,17 +2921,17 @@ "dev": true }, "node_modules/next": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/next/-/next-14.0.1.tgz", - "integrity": "sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA==", + "version": "14.2.11", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.11.tgz", + "integrity": "sha512-8MDFqHBhdmR2wdfaWc8+lW3A/hppFe1ggQ9vgIu/g2/2QEMYJrPoQP6b+VNk56gIug/bStysAmrpUKtj3XN8Bw==", "dependencies": { - "@next/env": "14.0.1", - "@swc/helpers": "0.5.2", + "@next/env": "14.2.11", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" + "styled-jsx": "5.1.1" }, "bin": { "next": "dist/bin/next" @@ -2939,18 +2940,19 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.0.1", - "@next/swc-darwin-x64": "14.0.1", - "@next/swc-linux-arm64-gnu": "14.0.1", - "@next/swc-linux-arm64-musl": "14.0.1", - "@next/swc-linux-x64-gnu": "14.0.1", - "@next/swc-linux-x64-musl": "14.0.1", - "@next/swc-win32-arm64-msvc": "14.0.1", - "@next/swc-win32-ia32-msvc": "14.0.1", - "@next/swc-win32-x64-msvc": "14.0.1" + "@next/swc-darwin-arm64": "14.2.11", + "@next/swc-darwin-x64": "14.2.11", + "@next/swc-linux-arm64-gnu": "14.2.11", + "@next/swc-linux-arm64-musl": "14.2.11", + "@next/swc-linux-x64-gnu": "14.2.11", + "@next/swc-linux-x64-musl": "14.2.11", + "@next/swc-win32-arm64-msvc": "14.2.11", + "@next/swc-win32-ia32-msvc": "14.2.11", + "@next/swc-win32-x64-msvc": "14.2.11" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -2959,6 +2961,9 @@ "@opentelemetry/api": { "optional": true }, + "@playwright/test": { + "optional": true + }, "sass": { "optional": true } @@ -3440,9 +3445,9 @@ ] }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -3451,15 +3456,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-is": { @@ -3647,9 +3652,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -4072,9 +4077,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -4245,18 +4250,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/standalone/package.json b/standalone/package.json index f6ce722..d719277 100755 --- a/standalone/package.json +++ b/standalone/package.json @@ -15,9 +15,9 @@ "@heroicons/react": "^2.0.18", "clsx": "^2.0.0", "lucide-react": "^0.292.0", - "next": "14.0.1", - "react": "^18", - "react-dom": "^18", + "next": "^14.2.11", + "react": "^18.3.1", + "react-dom": "^18.3.1", "tailwind-merge": "^2.0.0" }, "devDependencies": {