diff --git a/.env b/.env index fdc5f95..e60a254 100644 --- a/.env +++ b/.env @@ -1,5 +1,6 @@ # IN PORTS WEB_PORT_IN=80 +SECURE_WEB_PORT_IN=443 MODBUS_ELEVATOR_PORT_IN=3179 COAP_SIMPLE_PORT_IN=5683 COAP_NEGOTIATION_PORT_IN=5684 @@ -8,6 +9,7 @@ TRAEFIK_DASHBOARD_PORT_IN=8080 # OUT PORTS WEB_PORT_OUT=80 +SECURE_WEB_PORT_OUT=443 MODBUS_ELEVATOR_PORT_OUT=3179 COAP_SIMPLE_PORT_OUT=5683 COAP_NEGOTIATION_PORT_OUT=5684 @@ -17,7 +19,7 @@ JAEGER_ENDPOINT=http://host.docker.internal:8085/api/traces STACK_HOSTNAME="plugfest.thingweb.io" BROKER_URI="plugfest.thingweb.io" -PORT=8087 +BROKER_PORT=8087 LOKI_HOSTNAME="http://loki" LOKI_PORT=3100 @@ -26,4 +28,6 @@ LOKI_PORT=3100 HC_INTERVAL=40s HC_TIMEOUT=30s HC_RETRIES=3 -HC_START_PERIOD=60s \ No newline at end of file +HC_START_PERIOD=60s + +SIMPLE_COFFEE_MACHINE_PROTOCOL=https \ No newline at end of file diff --git a/.env.local b/.env.local index ce88d51..444eefc 100644 --- a/.env.local +++ b/.env.local @@ -5,6 +5,7 @@ COAP_SIMPLE_PORT_IN=5683 COAP_NEGOTIATION_PORT_IN=5684 SMART_HOME_SMART_CLOCK_PORT_IN=5685 TRAEFIK_DASHBOARD_PORT_IN=8080 +MOSQUITTO_PORT_IN=1883 # OUT PORTS WEB_PORT_OUT=80 @@ -13,16 +14,21 @@ COAP_SIMPLE_PORT_OUT=5683 COAP_NEGOTIATION_PORT_OUT=5684 SMART_HOME_SMART_CLOCK_PORT_OUT=5685 TRAEFIK_DASHBOARD_PORT_OUT=8080 +MOSQUITTO_PORT_OUT=1883 STACK_HOSTNAME="localhost" -BROKER_URI="localhost" -PORT=8087 +BROKER_URI="mosquitto" +BROKER_PORT=1883 -LOKI_HOSTNAME="http://loki" +LOKI_HOSTNAME="loki" LOKI_PORT=3100 +JAEGER_ENDPOINT=http://jaeger:4318/v1/traces + # Healthcheck Parameters HC_INTERVAL=40s HC_TIMEOUT=30s HC_RETRIES=3 -HC_START_PERIOD=60s \ No newline at end of file +HC_START_PERIOD=60s + +SIMPLE_COFFEE_MACHINE_PROTOCOL=http \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d1736ee..ee1ddea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [24.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: @@ -52,10 +52,10 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Use Node.js 18 + - name: Use Node.js 24 uses: actions/setup-node@v1 with: - node-version: 18 + node-version: 24 - name: Install run: npm ci diff --git a/README.md b/README.md index ffac0fb..1b0da5c 100644 --- a/README.md +++ b/README.md @@ -157,8 +157,7 @@ If you want to build and run the Things from your local source code (for develop 1. Make sure you have Docker and Docker Compose installed. 2. From the project root, run: ```sh - docker-compose -f docker-compose-things-local.yml build - docker-compose -f docker-compose-things-local.yml up + docker compose --env-file .env.local -f docker-compose-things-local.yml up --build ``` 3. The Things will be accessible at the same local URLs as below (e.g., `http://localhost/http-advanced-coffee-machine`). diff --git a/docker-compose-things-local.yml b/docker-compose-things-local.yml index 374365b..c73202d 100644 --- a/docker-compose-things-local.yml +++ b/docker-compose-things-local.yml @@ -10,85 +10,95 @@ services: - HOSTNAME=${STACK_HOSTNAME} - PORT=${COAP_SIMPLE_PORT_OUT} networks: - - things_network + - things_network_local coap-calculator-content-negotiation: build: context: ./things/calculator dockerfile: ./coap/js/Dockerfile-contentneg labels: - traefik.udp.routers.coap-calculator-content-negotiation.entrypoints=coap-calculator-content-negotiation - - traefik.udp.services.coap-calculator-simple.loadbalancer.server.port=${COAP_NEGOTIATION_PORT_OUT} + - traefik.udp.services.coap-calculator-content-negotiation.loadbalancer.server.port=${COAP_NEGOTIATION_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${COAP_NEGOTIATION_PORT_OUT} networks: - - things_network + - things_network_local http-express-calculator-simple: build: context: ./things/calculator dockerfile: ./http/express/Dockerfile-simple labels: - traefik.http.routers.http-express-calculator-simple.rule=PathPrefix(`/http-express-calculator-simple`) + - traefik.http.routers.http-express-calculator-simple.entrypoints=web - traefik.http.services.http-express-calculator-simple.loadbalancer.server.port=${WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${WEB_PORT_OUT} + - EXTERNAL_PORT=${WEB_PORT_OUT} + - PROTOCOL=http - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} healthcheck: - test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-express-calculator-simple || exit 1 + test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-express-calculator-simple interval: ${HC_INTERVAL} timeout: ${HC_TIMEOUT} retries: ${HC_RETRIES} start_period: ${HC_START_PERIOD} networks: - - things_network + - things_network_local http-express-calculator-content-negotiation: build: context: ./things/calculator dockerfile: ./http/express/Dockerfile-contentneg labels: - traefik.http.routers.http-express-calculator-content-negotiation.rule=PathPrefix(`/http-express-calculator-content-negotiation`) + - traefik.http.routers.http-express-calculator-content-negotiation.entrypoints=web - traefik.http.services.http-express-calculator-content-negotiation.loadbalancer.server.port=${WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${WEB_PORT_OUT} + - EXTERNAL_PORT=${WEB_PORT_OUT} + - PROTOCOL=http healthcheck: - test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-express-calculator-content-negotiation || exit 1 + test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-express-calculator-content-negotiation interval: ${HC_INTERVAL} timeout: ${HC_TIMEOUT} retries: ${HC_RETRIES} start_period: ${HC_START_PERIOD} networks: - - things_network + - things_network_local http-flask-calculator: build: context: ./things/calculator dockerfile: ./http/flask/Dockerfile labels: - traefik.http.routers.http-flask-calculator.rule=PathPrefix(`/http-flask-calculator`) + - traefik.http.routers.http-flask-calculator.entrypoints=web - traefik.http.services.http-flask-calculator.loadbalancer.server.port=${WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${WEB_PORT_OUT} + - EXTERNAL_PORT=${WEB_PORT_OUT} + - PROTOCOL=http healthcheck: - test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-flask-calculator || exit 1 + test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-flask-calculator interval: ${HC_INTERVAL} timeout: ${HC_TIMEOUT} retries: ${HC_RETRIES} start_period: ${HC_START_PERIOD} networks: - - things_network + - things_network_local mqtt-calculator: build: context: ./things/calculator dockerfile: ./mqtt/js/Dockerfile environment: - BROKER_URI=${BROKER_URI} + - BROKER_PORT=${BROKER_PORT} - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} networks: - - things_network + - things_network_local modbus-elevator: build: context: ./things/elevator @@ -98,54 +108,66 @@ services: - traefik.tcp.routers.modbus-elevator.rule=HostSNI(`*`) - traefik.tcp.services.modbus-elevator.loadbalancer.server.port=${MODBUS_ELEVATOR_PORT_OUT} networks: - - things_network + - things_network_local http-advanced-coffee-machine: build: context: . dockerfile: ./things/advanced-coffee-machine/http/ts/Dockerfile labels: - traefik.http.routers.http-advanced-coffee-machine.rule=PathPrefix(`/http-advanced-coffee-machine`) + - traefik.http.routers.http-advanced-coffee-machine.entrypoints=web - traefik.http.services.http-advanced-coffee-machine.loadbalancer.server.port=${WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${WEB_PORT_OUT} + - EXTERNAL_PORT=${WEB_PORT_OUT} + - PROTOCOL=http - JAEGER_ENDPOINT=${JAEGER_ENDPOINT} networks: - - things_network + - things_network_local http-data-schema-thing: build: context: ./things/data-schema-thing dockerfile: ./http/ts/Dockerfile labels: - traefik.http.routers.http-data-schema-thing.rule=PathPrefix(`/http-data-schema-thing`) + - traefik.http.routers.http-data-schema-thing.entrypoints=web - traefik.http.services.http-data-schema-thing.loadbalancer.server.port=${WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${WEB_PORT_OUT} + - EXTERNAL_PORT=${WEB_PORT_OUT} + - PROTOCOL=http - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} networks: - - things_network + - things_network_local counter-thing: build: context: ./things/counter-thing dockerfile: ./http/ts/Dockerfile labels: - - traefik.http.routers.counter-thing.rule=PathPrefix(`/counter-thing`) + - traefik.http.routers.counter-thing.rule=PathPrefix(`/counter`) + - traefik.http.routers.counter-thing.entrypoints=web - traefik.http.services.counter-thing.loadbalancer.server.port=${WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${WEB_PORT_OUT} + - EXTERNAL_PORT=${WEB_PORT_OUT} + - PROTOCOL=http - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} networks: - - things_network + - things_network_local smart-home-presence-sensor: build: context: ./mashups/smart-home dockerfile: ./dockerfiles/presence-sensor.Dockerfile + environment: + - PRESENCE_SENSOR_BROKER_URI=${BROKER_URI} + - PRESENCE_SENSOR_BROKER_PORT=${BROKER_PORT} networks: - - things_network + - things_network_local smart-home-simple-coffee-machine: build: context: ./mashups/smart-home @@ -153,15 +175,18 @@ services: labels: # TD is not exposed since it contains hostname that cannot be accessed outside the docker network - traefik.http.routers.smart-home-simple-coffee-machine.rule=PathRegexp(`/smart-home-simple-coffee-machine/.+`) + - traefik.http.routers.smart-home-simple-coffee-machine.entrypoints=web + - traefik.http.routers.smart-home-simple-coffee-machine-secure.rule=PathPrefix(`/smart-home-simple-coffee-machine`) - traefik.http.services.smart-home-simple-coffee-machine.loadbalancer.server.port=${WEB_PORT_OUT} environment: # Since mashup communicates inside the Docker network use of localhost in a TD result as # the mashup container's its own localhost. Therefore hostname given as their docker service name. # In production we will have a dedicated address and this issue won't be a problem. + - SIMPLE_COFFEE_MACHINE_PROTOCOL=http - SIMPLE_COFFEE_MACHINE_HOSTNAME=smart-home-simple-coffee-machine - - PORT=${WEB_PORT_OUT} + - SIMPLE_COFFEE_MACHINE_PORT=${WEB_PORT_OUT} networks: - - things_network + - things_network_local smart-home-smart-clock: build: context: ./mashups/smart-home @@ -174,16 +199,20 @@ services: # the mashup container's its own localhost. Therefore hostname given as their docker service name. # In production we will have a dedicated address and this issue won't be a problem. - SMART_CLOCK_HOSTNAME=smart-home-smart-clock - - PORT=${SMART_HOME_SMART_CLOCK_PORT_OUT} + - SMART_CLOCK_PORT=${SMART_HOME_SMART_CLOCK_PORT_OUT} networks: - - things_network + - things_network_local smart-home-mashup: build: context: ./mashups/smart-home dockerfile: ./dockerfiles/mashup.Dockerfile environment: + - SIMPLE_COFFEE_MACHINE_PROTOCOL=http - SIMPLE_COFFEE_MACHINE_HOSTNAME=smart-home-simple-coffee-machine + - SIMPLE_COFFEE_MACHINE_PORT=${WEB_PORT_OUT} + - SIMPLE_COFFEE_MACHINE_PATH=smart-home-simple-coffee-machine - PRESENCE_SENSOR_BROKER_URI=${BROKER_URI} + - PRESENCE_SENSOR_PORT=${BROKER_PORT} - SMART_CLOCK_HOSTNAME=smart-home-smart-clock - SMART_CLOCK_PORT=${SMART_HOME_SMART_CLOCK_PORT_OUT} depends_on: @@ -192,9 +221,9 @@ services: - smart-home-smart-clock restart: on-failure networks: - - things_network + - things_network_local networks: - things_network: - name: things_network + things_network_local: + name: things_network_local external: true diff --git a/docker-compose-things.yml b/docker-compose-things.yml index 885399e..6c17838 100644 --- a/docker-compose-things.yml +++ b/docker-compose-things.yml @@ -7,6 +7,7 @@ services: environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${COAP_SIMPLE_PORT_OUT} + restart: on-failure deploy: resources: limits: @@ -21,10 +22,11 @@ services: image: thingweb/test-things-coap-calculator-content-negotiation labels: - traefik.udp.routers.coap-calculator-content-negotiation.entrypoints=coap-calculator-content-negotiation - - traefik.udp.services.coap-calculator-simple.loadbalancer.server.port=${COAP_NEGOTIATION_PORT_OUT} + - traefik.udp.services.coap-calculator-content-negotiation.loadbalancer.server.port=${COAP_NEGOTIATION_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - PORT=${COAP_NEGOTIATION_PORT_OUT} + restart: on-failure deploy: resources: limits: @@ -39,22 +41,31 @@ services: image: thingweb/test-things-http-express-calculator-simple labels: - traefik.http.routers.http-express-calculator-simple.rule=PathPrefix(`/http-express-calculator-simple`) - - traefik.http.services.http-express-calculator-simple.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.http-express-calculator-simple.entrypoints=web + - traefik.http.routers.http-express-calculator-simple-secure.rule=PathPrefix(`/http-express-calculator-simple`) + - traefik.http.routers.http-express-calculator-simple-secure.entrypoints=websecure + - traefik.http.routers.http-express-calculator-simple-secure.tls=true + - traefik.http.services.http-express-calculator-simple.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - - PORT=${WEB_PORT_OUT} + - PORT=${SECURE_WEB_PORT_OUT} + - EXTERNAL_PORT=${SECURE_WEB_PORT_OUT} + - PROTOCOL=https - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} + - LOKI_PROTOCOL=http + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M + pids: 250 reservations: cpus: "0.01" - memory: 25M + memory: 128M healthcheck: - test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-express-calculator-simple || exit 1 + test: wget --no-verbose --tries=1 --spider https://${STACK_HOSTNAME}:${SECURE_WEB_PORT_OUT}/http-express-calculator-simple interval: ${HC_INTERVAL} timeout: ${HC_TIMEOUT} retries: ${HC_RETRIES} @@ -65,20 +76,28 @@ services: image: thingweb/test-things-http-express-calculator-content-negotiation labels: - traefik.http.routers.http-express-calculator-content-negotiation.rule=PathPrefix(`/http-express-calculator-content-negotiation`) - - traefik.http.services.http-express-calculator-content-negotiation.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.http-express-calculator-content-negotiation.entrypoints=web + - traefik.http.routers.http-express-calculator-content-negotiation-secure.rule=PathPrefix(`/http-express-calculator-content-negotiation`) + - traefik.http.routers.http-express-calculator-content-negotiation-secure.entrypoints=websecure + - traefik.http.routers.http-express-calculator-content-negotiation-secure.tls=true + - traefik.http.services.http-express-calculator-content-negotiation.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - - PORT=${WEB_PORT_OUT} + - PORT=${SECURE_WEB_PORT_OUT} + - EXTERNAL_PORT=${SECURE_WEB_PORT_OUT} + - PROTOCOL=https + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M + pids: 250 reservations: cpus: "0.01" - memory: 25M + memory: 128M healthcheck: - test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-express-calculator-content-negotiation || exit 1 + test: wget --no-verbose --tries=1 --spider https://${STACK_HOSTNAME}:${SECURE_WEB_PORT_OUT}/http-express-calculator-content-negotiation interval: ${HC_INTERVAL} timeout: ${HC_TIMEOUT} retries: ${HC_RETRIES} @@ -89,20 +108,27 @@ services: image: thingweb/test-things-flask-calculator labels: - traefik.http.routers.http-flask-calculator.rule=PathPrefix(`/http-flask-calculator`) - - traefik.http.services.http-flask-calculator.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.http-flask-calculator.entrypoints=web + - traefik.http.routers.http-flask-calculator-secure.rule=PathPrefix(`/http-flask-calculator`) + - traefik.http.routers.http-flask-calculator-secure.entrypoints=websecure + - traefik.http.routers.http-flask-calculator-secure.tls=true + - traefik.http.services.http-flask-calculator.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - - PORT=${WEB_PORT_OUT} + - PORT=${SECURE_WEB_PORT_OUT} + - EXTERNAL_PORT=${SECURE_WEB_PORT_OUT} + - PROTOCOL=https + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M healthcheck: - test: wget --no-verbose --tries=1 --spider http://${STACK_HOSTNAME}:${WEB_PORT_OUT}/http-flask-calculator || exit 1 + test: wget --no-verbose --tries=1 --spider https://${STACK_HOSTNAME}:${SECURE_WEB_PORT_OUT}/http-flask-calculator interval: ${HC_INTERVAL} timeout: ${HC_TIMEOUT} retries: ${HC_RETRIES} @@ -115,6 +141,7 @@ services: - BROKER_URI=${BROKER_URI} - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} + restart: on-failure deploy: resources: limits: @@ -131,6 +158,7 @@ services: - traefik.tcp.routers.modbus-elevator.entrypoints=modbus-elevator - traefik.tcp.routers.modbus-elevator.rule=HostSNI(`*`) - traefik.tcp.services.modbus-elevator.loadbalancer.server.port=${MODBUS_ELEVATOR_PORT_OUT} + restart: on-failure deploy: resources: limits: @@ -145,71 +173,97 @@ services: image: thingweb/test-things-http-advanced-coffee-machine labels: - traefik.http.routers.http-advanced-coffee-machine.rule=PathPrefix(`/http-advanced-coffee-machine`) - - traefik.http.services.http-advanced-coffee-machine.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.http-advanced-coffee-machine.entrypoints=web + - traefik.http.routers.http-advanced-coffee-machine-secure.rule=PathPrefix(`/http-advanced-coffee-machine`) + - traefik.http.routers.http-advanced-coffee-machine-secure.entrypoints=websecure + - traefik.http.routers.http-advanced-coffee-machine-secure.tls=true + - traefik.http.services.http-advanced-coffee-machine.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - - PORT=${WEB_PORT_OUT} + - PORT=${SECURE_WEB_PORT_OUT} + - EXTERNAL_PORT=${SECURE_WEB_PORT_OUT} + - PROTOCOL=https - JAEGER_ENDPOINT=${JAEGER_ENDPOINT} + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M networks: - things_network http-data-schema-thing: image: thingweb/test-things-http-data-schema-thing labels: - traefik.http.routers.http-data-schema-thing.rule=PathPrefix(`/http-data-schema-thing`) - - traefik.http.services.http-data-schema-thing.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.http-data-schema-thing.entrypoints=web + - traefik.http.routers.http-data-schema-thing-secure.rule=PathPrefix(`/http-data-schema-thing`) + - traefik.http.routers.http-data-schema-thing-secure.entrypoints=websecure + - traefik.http.routers.http-data-schema-thing-secure.tls=true + - traefik.http.services.http-data-schema-thing.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - - PORT=${WEB_PORT_OUT} + - PORT=${SECURE_WEB_PORT_OUT} + - EXTERNAL_PORT=${SECURE_WEB_PORT_OUT} + - PROTOCOL=https - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M networks: - things_network counter-thing: - image: thingweb/test-things-counter-thing + image: thingweb/test-things-counter labels: - - traefik.http.routers.counter-thing.rule=PathPrefix(`/counter-thing`) - - traefik.http.services.counter-thing.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.counter-thing.rule=Host(`${STACK_HOSTNAME}`) && PathPrefix(`/counter`) + - traefik.http.routers.counter-thing.entrypoints=web + - traefik.http.routers.counter-thing.priority=100 + - traefik.http.routers.counter-thing-secure.rule=Host(`${STACK_HOSTNAME}`) && PathPrefix(`/counter`) + - traefik.http.routers.counter-thing-secure.entrypoints=websecure + - traefik.http.routers.counter-thing-secure.tls=true + - traefik.http.services.counter-thing.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: - HOSTNAME=${STACK_HOSTNAME} - - PORT=${WEB_PORT_OUT} + - PORT=${SECURE_WEB_PORT_OUT} + - EXTERNAL_PORT=${SECURE_WEB_PORT_OUT} + - PROTOCOL=https - LOKI_HOSTNAME=${LOKI_HOSTNAME} - LOKI_PORT=${LOKI_PORT} + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M networks: - things_network smart-home-presence-sensor: image: thingweb/test-things-smart-home-presence-sensor + restart: on-failure + environment: + - PRESENCE_SENSOR_BROKER_URI=${BROKER_URI} + - PRESENCE_SENSOR_BROKER_PORT=${BROKER_PORT} deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M networks: - things_network smart-home-simple-coffee-machine: @@ -217,21 +271,27 @@ services: labels: # TD is not exposed since it contains hostname that cannot be accessed outside the docker network - traefik.http.routers.smart-home-simple-coffee-machine.rule=PathRegexp(`/smart-home-simple-coffee-machine/.+`) - - traefik.http.services.smart-home-simple-coffee-machine.loadbalancer.server.port=${WEB_PORT_OUT} + - traefik.http.routers.smart-home-simple-coffee-machine.entrypoints=web + - traefik.http.routers.smart-home-simple-coffee-machine-secure.rule=PathPrefix(`/smart-home-simple-coffee-machine`) + - traefik.http.routers.smart-home-simple-coffee-machine-secure.entrypoints=websecure + - traefik.http.routers.smart-home-simple-coffee-machine-secure.tls=true + - traefik.http.services.smart-home-simple-coffee-machine.loadbalancer.server.port=${SECURE_WEB_PORT_OUT} environment: # Since mashup communicates inside the Docker network use of localhost in a TD result as # the mashup container's its own localhost. Therefore hostname given as their docker service name. # In production we will have a dedicated address and this issue won't be a problem. - - SIMPLE_COFFEE_MACHINE_HOSTNAME=smart-home-simple-coffee-machine - - PORT=${WEB_PORT_OUT} + - SIMPLE_COFFEE_MACHINE_PROTOCOL=https + - SIMPLE_COFFEE_MACHINE_HOSTNAME=${STACK_HOSTNAME} + - SIMPLE_COFFEE_MACHINE_PORT=${SECURE_WEB_PORT_OUT} + restart: on-failure deploy: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M networks: - things_network smart-home-smart-clock: @@ -244,7 +304,8 @@ services: # the mashup container's its own localhost. Therefore hostname given as their docker service name. # In production we will have a dedicated address and this issue won't be a problem. - SMART_CLOCK_HOSTNAME=smart-home-smart-clock - - PORT=${SMART_HOME_SMART_CLOCK_PORT_OUT} + - SMART_CLOCK_PORT=${SMART_HOME_SMART_CLOCK_PORT_OUT} + restart: on-failure deploy: resources: limits: @@ -258,8 +319,12 @@ services: smart-home-mashup: image: thingweb/test-things-smart-home-main environment: - - SIMPLE_COFFEE_MACHINE_HOSTNAME=smart-home-simple-coffee-machine + - SIMPLE_COFFEE_MACHINE_PROTOCOL=https + - SIMPLE_COFFEE_MACHINE_HOSTNAME=${STACK_HOSTNAME} + - SIMPLE_COFFEE_MACHINE_PATH=smart-home-simple-coffee-machine + - SIMPLE_COFFEE_MACHINE_PORT=${SECURE_WEB_PORT_OUT} - PRESENCE_SENSOR_BROKER_URI=${BROKER_URI} + - PRESENCE_SENSOR_PORT=${BROKER_PORT} - SMART_CLOCK_HOSTNAME=smart-home-smart-clock - SMART_CLOCK_PORT=${SMART_HOME_SMART_CLOCK_PORT_OUT} depends_on: @@ -271,10 +336,10 @@ services: resources: limits: cpus: "0.05" - memory: 50M + memory: 256M reservations: cpus: "0.01" - memory: 25M + memory: 128M networks: - things_network diff --git a/mashups/smart-home/dockerfiles/mashup.Dockerfile b/mashups/smart-home/dockerfiles/mashup.Dockerfile index d69bd4c..3c81eef 100644 --- a/mashups/smart-home/dockerfiles/mashup.Dockerfile +++ b/mashups/smart-home/dockerfiles/mashup.Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./package.json . COPY ./tsconfig.json . -RUN npm install +RUN npm pkg delete dependencies.test-things && npm install COPY ./mashup-logic.ts ./mashup-logic.ts diff --git a/mashups/smart-home/dockerfiles/presence-sensor.Dockerfile b/mashups/smart-home/dockerfiles/presence-sensor.Dockerfile index b7b30f9..00e4512 100644 --- a/mashups/smart-home/dockerfiles/presence-sensor.Dockerfile +++ b/mashups/smart-home/dockerfiles/presence-sensor.Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./package.json . COPY ./tsconfig.json . -RUN npm install +RUN npm pkg delete dependencies.test-things && npm install COPY ./things/presence-sensor.ts ./things/presence-sensor.ts diff --git a/mashups/smart-home/dockerfiles/simple-coffee-machine.Dockerfile b/mashups/smart-home/dockerfiles/simple-coffee-machine.Dockerfile index 5a8781b..62496fa 100644 --- a/mashups/smart-home/dockerfiles/simple-coffee-machine.Dockerfile +++ b/mashups/smart-home/dockerfiles/simple-coffee-machine.Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./package.json . COPY ./tsconfig.json . -RUN npm install +RUN npm pkg delete dependencies.test-things && npm install COPY ./things/simple-coffee-machine.ts ./things/simple-coffee-machine.ts diff --git a/mashups/smart-home/dockerfiles/smart-clock.Dockerfile b/mashups/smart-home/dockerfiles/smart-clock.Dockerfile index 39aa018..9e391d5 100644 --- a/mashups/smart-home/dockerfiles/smart-clock.Dockerfile +++ b/mashups/smart-home/dockerfiles/smart-clock.Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./package.json . COPY ./tsconfig.json . -RUN npm install +RUN npm pkg delete dependencies.test-things && npm install COPY ./things/smart-clock.ts ./things/smart-clock.ts diff --git a/mashups/smart-home/mashup-logic.ts b/mashups/smart-home/mashup-logic.ts index 3231eaf..b25b5ef 100644 --- a/mashups/smart-home/mashup-logic.ts +++ b/mashups/smart-home/mashup-logic.ts @@ -32,16 +32,13 @@ const wotHelper = new Helpers(servient); (async () => { const WoT = await servient.start(); - const coffeeMachineURL = - process.env.SIMPLE_COFFEE_MACHINE_HOSTNAME === "smart-home-simple-coffee-machine" - ? `http://${process.env.SIMPLE_COFFEE_MACHINE_HOSTNAME}/smart-home-simple-coffee-machine` - : `http://${process.env.SIMPLE_COFFEE_MACHINE_HOSTNAME}:${process.env.SIMPLE_COFFEE_MACHINE_PORT}/smart-home-simple-coffee-machine`; + const coffeeMachineURL = `${process.env.SIMPLE_COFFEE_MACHINE_PROTOCOL}://${process.env.SIMPLE_COFFEE_MACHINE_HOSTNAME}:${process.env.SIMPLE_COFFEE_MACHINE_PORT}/${process.env.SIMPLE_COFFEE_MACHINE_PATH}`; // we will fetch the TDs of the devices const coffeeMachineTD = (await wotHelper.fetch(coffeeMachineURL)) as WoT.ThingDescription; // Alternatively, this Thing self-hosts its TD at http://plugfest.thingweb.io:8081/coffee-machine that you can fetch const presenceSensorTD = (await wotHelper.fetch( - `mqtt://${process.env.PRESENCE_SENSOR_BROKER_URI}/smart-home-presence-sensor` + `mqtt://${process.env.PRESENCE_SENSOR_BROKER_URI}:${process.env.PRESENCE_SENSOR_PORT}/smart-home-presence-sensor` )) as WoT.ThingDescription; const smartClockTD = (await wotHelper.fetch( `coap://${process.env.SMART_CLOCK_HOSTNAME}:${process.env.SMART_CLOCK_PORT}/smart-home-smart-clock` @@ -53,6 +50,7 @@ const wotHelper = new Helpers(servient); const smartClockThing = await WoT.consume(smartClockTD); let morningCoffeeFlag = false; + let brewInProgress = false; // We subscribe to the presence detection events presenceSensorThing.subscribeEvent("presenceDetected", async (eventData) => { @@ -78,23 +76,29 @@ const wotHelper = new Helpers(servient); ); // To avoid accidental brews, a flag is used to check whether a coffee was brewed before - if (!morningCoffeeFlag) { + if (!morningCoffeeFlag && !brewInProgress) { // As the task indicates, we brew only between 5:00 and 13:00 if (currentTime.hour <= 13 && currentTime.hour >= 5) { - // To brew a coffee, we invoke the brew action in the coffee machine - await coffeeMachineThing.invokeAction("brew", "espresso"); - // We log to indicate to the user that brewing has finished - console.log("brewed espresso"); - // for today we should not brew any more coffee - morningCoffeeFlag = true; + brewInProgress = true; + try { + // To brew a coffee, we invoke the brew action in the coffee machine + await coffeeMachineThing.invokeAction("brew", "espresso"); + // We log to indicate to the user that brewing has finished + console.log("brewed espresso"); + // for today we should not brew any more coffee + morningCoffeeFlag = true; + } catch (error) { + console.error("Coffee order failed:", error); + } finally { + brewInProgress = false; + } } } // we reset the morningCoffeeFlag every day at 1am - setInterval(() => { - if (currentTime.hour === 1) { - morningCoffeeFlag = false; - } - }, 1000); + if (currentTime.hour === 1) { + morningCoffeeFlag = false; + brewInProgress = false; + } }); })(); diff --git a/mashups/smart-home/package.json b/mashups/smart-home/package.json index 2f955f6..a2304e7 100644 --- a/mashups/smart-home/package.json +++ b/mashups/smart-home/package.json @@ -19,12 +19,13 @@ "@node-wot/binding-coap": "0.8.16", "@node-wot/binding-http": "0.8.16", "@node-wot/binding-mqtt": "0.8.16", - "@node-wot/core": "0.8.16" + "@node-wot/core": "0.8.16", + "test-things": "file:../.." }, "devDependencies": { "@types/debug": "^4.1.12", - "@types/node-fetch": "^2.6.11", "@types/node": "^18.15.11", + "@types/node-fetch": "^2.6.11", "dotenv": "^16.4.5", "typescript": "^4.7.4" } diff --git a/mashups/smart-home/things/presence-sensor.ts b/mashups/smart-home/things/presence-sensor.ts index 50ddc90..e0ccc0b 100644 --- a/mashups/smart-home/things/presence-sensor.ts +++ b/mashups/smart-home/things/presence-sensor.ts @@ -25,7 +25,12 @@ dotenv.config(); const thingName = "smart-home-presence-sensor"; // create Servient add MQTT binding with port configuration const servient = new Servient(); -const brokerUri = process.env.PRESENCE_SENSOR_BROKER_URI ?? "mqtt://test.mosquitto.org"; +const brokerHost = process.env.PRESENCE_SENSOR_BROKER_URI; +const brokerPort = process.env.PRESENCE_SENSOR_BROKER_PORT; +const brokerUri = + brokerHost !== undefined && brokerHost !== "" && brokerPort !== undefined && brokerPort !== "" + ? `mqtt://${brokerHost}:${brokerPort}` + : "mqtt://test.mosquitto.org"; servient.addServer(new MqttBrokerServer({ uri: brokerUri })); servient.start().then((WoT) => { diff --git a/mashups/smart-home/things/simple-coffee-machine.ts b/mashups/smart-home/things/simple-coffee-machine.ts index ed84c3f..939edc5 100644 --- a/mashups/smart-home/things/simple-coffee-machine.ts +++ b/mashups/smart-home/things/simple-coffee-machine.ts @@ -27,12 +27,27 @@ const thingName = "smart-home-simple-coffee-machine"; const servient = new Servient(); const hostname = process.env.SIMPLE_COFFEE_MACHINE_HOSTNAME ?? "localhost"; const httpPort = process.env.SIMPLE_COFFEE_MACHINE_PORT ?? "8081"; -servient.addServer( - new HttpServer({ - baseUri: `http://${hostname}:${httpPort}`, - port: parseInt(httpPort), - }) -); + +switch (process.env.SIMPLE_COFFEE_MACHINE_PROTOCOL) { + case "http": + servient.addServer( + new HttpServer({ + baseUri: `http://${hostname}:${httpPort}`, + port: parseInt(httpPort), + }) + ); + break; + case "https": + servient.addServer( + new HttpServer({ + baseUri: `https://${hostname}:${httpPort}`, + port: parseInt(httpPort), + }) + ); + break; + default: + throw new Error("Unsupported protocol: " + process.env.SIMPLE_COFFEE_MACHINE_PROTOCOL); +} let waterAmount = 1000; let beansAmount = 1000; diff --git a/package-lock.json b/package-lock.json index be36cab..95b1703 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,9 @@ "./mashups/*", "./things/*/*/*" ], + "dependencies": { + "test-things": "file:" + }, "devDependencies": { "@node-wot/binding-http": "~0.8.16", "@node-wot/core": "~0.8.16", @@ -34,7 +37,7 @@ "eslint-plugin-unused-imports": "^4.1.4", "eslint-plugin-workspaces": "^0.10.1", "mocha": "^10.7.3", - "prettier": "3.3.3" + "prettier": "^3.3.3" } }, "mashups/smart-home": { @@ -44,7 +47,8 @@ "@node-wot/binding-coap": "0.8.16", "@node-wot/binding-http": "0.8.16", "@node-wot/binding-mqtt": "0.8.16", - "@node-wot/core": "0.8.16" + "@node-wot/core": "0.8.16", + "test-things": "file:../.." }, "devDependencies": { "@types/debug": "^4.1.12", @@ -55,22 +59,19 @@ } }, "mashups/smart-home/node_modules/@types/node": { - "version": "18.19.120", + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, - "mashups/smart-home/node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -99,51 +100,20 @@ } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", "dependencies": { - "colorspace": "1.1.x", + "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, - "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { @@ -160,9 +130,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -194,9 +164,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -210,10 +180,17 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -239,9 +216,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -277,10 +254,17 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -289,9 +273,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -358,9 +342,9 @@ "license": "MIT" }, "node_modules/@napi-rs/snappy-android-arm-eabi": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.3.2.tgz", - "integrity": "sha512-fX0+uNXt+tIqxjUUKh3uekIz5jW7rKsFVCZb/OR1+u5u8XCR28RcMTucMTjhcmMibg0PvYRZLxbICuP1Wx1UWQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.3.3.tgz", + "integrity": "sha512-d4vUFFzNBvazGfB/KU8MnEax6itTIgRWXodPdZDnWKHy9HwVBndpCiedQDcSNHcZNYV36rx034rpn7SAuTL2NA==", "cpu": [ "arm" ], @@ -374,9 +358,9 @@ } }, "node_modules/@napi-rs/snappy-android-arm64": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.3.2.tgz", - "integrity": "sha512-FlN/GGHkQa2SB8y+LXhJky8U133MJb6jqikYgmjQjHRwElB+/5pTtMqLQg2pwJ/70ISAxN5Ct9JlaHadp6Rs+A==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.3.3.tgz", + "integrity": "sha512-Uh+w18dhzjVl85MGhRnojb7OLlX2ErvMsYIunO/7l3Frvc2zQvfqsWsFJanu2dwqlE2YDooeNP84S+ywgN9sxg==", "cpu": [ "arm64" ], @@ -390,9 +374,9 @@ } }, "node_modules/@napi-rs/snappy-darwin-arm64": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.3.2.tgz", - "integrity": "sha512-2j5cHSb34BdnQxBITdXa4NkbPrVc00yI/8BT0laD29Qm7nTXKoUNKYEpD8KYV3IvP2UxFDK7n0nMRqhuo2+fug==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.3.3.tgz", + "integrity": "sha512-AmJn+6yOu/0V0YNHLKmRUNYkn93iv/1wtPayC7O1OHtfY6YqHQ31/MVeeRBiEYtQW9TwVZxXrDirxSB1PxRdtw==", "cpu": [ "arm64" ], @@ -406,9 +390,9 @@ } }, "node_modules/@napi-rs/snappy-darwin-x64": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.3.2.tgz", - "integrity": "sha512-1Har7sh2PMZE8L5hWhuVQMQKmFZwJiSUoCzhCvhKIB983Ei+obqXWewrhxoaShc3fYrc4YS9hXnnLoFCDLzH1g==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.3.3.tgz", + "integrity": "sha512-biLTXBmPjPmO7HIpv+5BaV9Gy/4+QJSUNJW8Pjx1UlWAVnocPy7um+zbvAWStZssTI5sfn/jOClrAegD4w09UA==", "cpu": [ "x64" ], @@ -422,9 +406,9 @@ } }, "node_modules/@napi-rs/snappy-freebsd-x64": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.3.2.tgz", - "integrity": "sha512-oNc4JG+yCAEVRy8e6vKAYJsJpyrXQGl7q4JqX981FRTBGYUISwR4pNgYsBypOj8SUFRYoS/FdG61/ptyh00Hbw==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.3.3.tgz", + "integrity": "sha512-E3R3ewm8Mrjm0yL2TC3VgnphDsQaCPixNJqBbGiz3NTshVDhlPlOgPKF0NGYqKiKaDGdD9PKtUgOR4vagUtn7g==", "cpu": [ "x64" ], @@ -438,9 +422,9 @@ } }, "node_modules/@napi-rs/snappy-linux-arm-gnueabihf": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.3.2.tgz", - "integrity": "sha512-CUOPVs/bCRKghcpsuxw6/t0BnVV25ZRDXC9qQSuR+KSEbXrQPahDuWyJIvI7KM70P1s2lvmdK4WXWag/tl5Y4A==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.3.3.tgz", + "integrity": "sha512-ZuNgtmk9j0KyT7TfLyEnvZJxOhbkyNR761nk04F0Q4NTHMICP28wQj0xgEsnCHUsEeA9OXrRL4R7waiLn+rOQA==", "cpu": [ "arm" ], @@ -454,9 +438,9 @@ } }, "node_modules/@napi-rs/snappy-linux-arm64-gnu": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.3.2.tgz", - "integrity": "sha512-AKqTWTHzw4DIrzA/qQkUozFfQTMQlYbm2WjFfrzebcRB8+o8BpffyUbvqDS/HsOHw9L53x+jqMFOAAjU5rECvg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.3.3.tgz", + "integrity": "sha512-KIzwtq0dAzshzpqZWjg0Q9lUx93iZN7wCCUzCdLYIQ+mvJZKM10VCdn0RcuQze1R3UJTPwpPLXQIVskNMBYyPA==", "cpu": [ "arm64" ], @@ -470,9 +454,9 @@ } }, "node_modules/@napi-rs/snappy-linux-arm64-musl": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.3.2.tgz", - "integrity": "sha512-rUhajSc4PgFZ2DkG3CTOke7LfoQylkKF4uV90DgedbKUjXI61henWSe8I8XhzJEcrpmBFz3udmihJaj172+2iw==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.3.3.tgz", + "integrity": "sha512-AAED4cQS74xPvktsyVmz5sy8vSxG/+3d7Rq2FDBZzj3Fv6v5vux6uZnECPCAqpALCdTtJ61unqpOyqO7hZCt1Q==", "cpu": [ "arm64" ], @@ -486,9 +470,9 @@ } }, "node_modules/@napi-rs/snappy-linux-ppc64-gnu": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-ppc64-gnu/-/snappy-linux-ppc64-gnu-7.3.2.tgz", - "integrity": "sha512-3BqNK9nhBIoUeUeOgY3W/99ArChbKzzHjj4vD0kbkk7eADBatcGTxUzrSIhULlH9vifF28thQQeCu0q/EfpU3A==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-ppc64-gnu/-/snappy-linux-ppc64-gnu-7.3.3.tgz", + "integrity": "sha512-pofO5eSLg8ZTBwVae4WHHwJxJGZI8NEb4r5Mppvq12J/1/Hq1HecClXmfY3A7bdT2fsS2Td+Q7CI9VdBOj2sbA==", "cpu": [ "ppc64" ], @@ -502,9 +486,9 @@ } }, "node_modules/@napi-rs/snappy-linux-riscv64-gnu": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-riscv64-gnu/-/snappy-linux-riscv64-gnu-7.3.2.tgz", - "integrity": "sha512-dvlKU473USFBpIZoJ1eUFGj90LNzv6SvkY3bJZ1c0BKRTvEJ9DRNIjmdN+bHCZznwxn2UrR1Tv2MWqMM0Ww/cQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-riscv64-gnu/-/snappy-linux-riscv64-gnu-7.3.3.tgz", + "integrity": "sha512-OiHYdeuwj0TVBXADUmmQDQ4lL1TB+8EwmXnFgOutoDVXHaUl0CJFyXLa6tYUXe+gRY8hs1v7eb0vyE97LKY06Q==", "cpu": [ "riscv64" ], @@ -518,9 +502,9 @@ } }, "node_modules/@napi-rs/snappy-linux-s390x-gnu": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-s390x-gnu/-/snappy-linux-s390x-gnu-7.3.2.tgz", - "integrity": "sha512-+cNweOf2Z7FC7AyFdrX2L8sCoNx34fc2QGsEBtTQ7H2nj6K2byxcIs1pWT7tPrrBFk24SMw2DtgDf+fUtat1/g==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-s390x-gnu/-/snappy-linux-s390x-gnu-7.3.3.tgz", + "integrity": "sha512-66QdmuV9CTq/S/xifZXlMy3PsZTviAgkqqpZ+7vPCmLtuP+nqhaeupShOFf/sIDsS0gZePazPosPTeTBbhkLHg==", "cpu": [ "s390x" ], @@ -534,9 +518,9 @@ } }, "node_modules/@napi-rs/snappy-linux-x64-gnu": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.3.2.tgz", - "integrity": "sha512-eW1uzodlmb0RitoP1I4xVGRqE50WUOB5T2G6GPceqlwXLs1UzgSpgwZuNbQ7LbRyXI7jK897ukeBBkVOIvhkoQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.3.3.tgz", + "integrity": "sha512-g6KURjOxrgb8yXDEZMuIcHkUr/7TKlDwSiydEQtMtP3n4iI4sNjkcE/WNKlR3+t9bZh1pFGAq7NFRBtouQGHpQ==", "cpu": [ "x64" ], @@ -550,9 +534,9 @@ } }, "node_modules/@napi-rs/snappy-linux-x64-musl": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.3.2.tgz", - "integrity": "sha512-WBmgzN4P6SmKXUxy936Jz2r+sKwHqqosZIxOg8QLJNoIr72eCmoINaolg6AuVCyuPUb9tc2GdPwag4p27gTIOQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.3.3.tgz", + "integrity": "sha512-6UvOyczHknpaKjrlKKSlX3rwpOrfJwiMG6qA0NRKJFgbcCAEUxmN9A8JvW4inP46DKdQ0bekdOxwRtAhFiTDfg==", "cpu": [ "x64" ], @@ -566,9 +550,9 @@ } }, "node_modules/@napi-rs/snappy-openharmony-arm64": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-openharmony-arm64/-/snappy-openharmony-arm64-7.3.2.tgz", - "integrity": "sha512-iZwgBJ8cz79UgBO5eoojObIYV2mKpjF2aGSlixB3R9QJfRaNPeACTShYcd8Bc5QheSPcJjqTswiI/7xIFdcDDw==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-openharmony-arm64/-/snappy-openharmony-arm64-7.3.3.tgz", + "integrity": "sha512-I5mak/5rTprobf7wMCk0vFhClmWOL/QiIJM4XontysnadmP/R9hAcmuFmoMV2GaxC9MblqLA7Z++gy8ou5hJVw==", "cpu": [ "arm64" ], @@ -582,9 +566,9 @@ } }, "node_modules/@napi-rs/snappy-wasm32-wasi": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-wasm32-wasi/-/snappy-wasm32-wasi-7.3.2.tgz", - "integrity": "sha512-ChdMipqIoFg5ysLciGJ5wLoSsXQMo7Zh8+35du4aEO/vrxVyZ12UMyv6+zEn8sBCrY+3e9A+2YOpryZP2BfKiQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-wasm32-wasi/-/snappy-wasm32-wasi-7.3.3.tgz", + "integrity": "sha512-+EroeygVYo9RksOchjF206frhMkfD2PaIun3yH4Zp5j/Y0oIEgs/+VhAYx/f+zHRylQYUIdLzDRclcoepvlR8Q==", "cpu": [ "wasm32" ], @@ -598,9 +582,9 @@ } }, "node_modules/@napi-rs/snappy-win32-arm64-msvc": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.3.2.tgz", - "integrity": "sha512-RAmh06bNKk5wHoOfX6wkFo8FZBKNkSH5J9Q4O648uZpXorf8ZaVQKSpIQaXTZICBVF6+2540FjYGctvhL1b4yw==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.3.3.tgz", + "integrity": "sha512-rxqfntBsCfzgOha/OlG8ld2hs6YSMGhpMUbFjeQLyVDbooY041fRXv3S7yk52DfO6H4QQhLT5+p7cW0mYdhyiQ==", "cpu": [ "arm64" ], @@ -614,9 +598,9 @@ } }, "node_modules/@napi-rs/snappy-win32-ia32-msvc": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.3.2.tgz", - "integrity": "sha512-OP8ySMUm9EEtihDbgqXCcvPFLcD3iAZhy+fZ7sSQhRQHqRxJ4dfAl98Eaec1nIK63pg/FNKJqTHZfCgnmUSL8g==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.3.3.tgz", + "integrity": "sha512-joRV16DsRtqjGt0CdSpxGCkO0UlHGeTZ/GqvdscoALpRKbikR2Top4C61dxEchmOd3lSYsXutuwWWGg3Nr++WA==", "cpu": [ "ia32" ], @@ -630,9 +614,9 @@ } }, "node_modules/@napi-rs/snappy-win32-x64-msvc": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.3.2.tgz", - "integrity": "sha512-fqPHzNVFy5Wrg/U91dsafIaZ6thTyRcK1xU8KLw384MRkaTI3HA4cs66Om8l33P0gHhnvUZOSlvjJEjEXyAH0Q==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.3.3.tgz", + "integrity": "sha512-cEnQwcsdJyOU7HSZODWsHpKuQoSYM4jaqw/hn9pOXYbRN1+02WxYppD3fdMuKN6TOA6YG5KA5PHRNeVilNX86Q==", "cpu": [ "x64" ], @@ -646,15 +630,24 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.3.tgz", - "integrity": "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", + "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.5", - "@emnapi/runtime": "^1.4.5", - "@tybys/wasm-util": "^0.10.0" + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" } }, "node_modules/@node-wot/binding-coap": { @@ -679,21 +672,6 @@ "integrity": "sha512-yqU2Rf94HFZqgHf6Tuyc/IqVD0l3U91KjvypSr1GtJKyrnl6L/kfnxVqN4QOwcF5Zx9tO/HKK+fozGr5AtqA+g==", "license": "MIT" }, - "node_modules/@node-wot/binding-coap/node_modules/wot-thing-description-types": { - "version": "1.1.0-09-November-2023", - "resolved": "https://registry.npmjs.org/wot-thing-description-types/-/wot-thing-description-types-1.1.0-09-November-2023.tgz", - "integrity": "sha512-qgZ1Khg/L3SkIRSm4POVoj0P5MU4GIwxWdyQz2ckZzhnXesgPqe+AUzGxK37ArlxvaMytyjo0Cx2yfKoDHtlkA==", - "license": "W3C-20150513" - }, - "node_modules/@node-wot/binding-coap/node_modules/wot-typescript-definitions": { - "version": "0.8.0-SNAPSHOT.29", - "resolved": "https://registry.npmjs.org/wot-typescript-definitions/-/wot-typescript-definitions-0.8.0-SNAPSHOT.29.tgz", - "integrity": "sha512-V5r/JSbFs/eaWgQavEEvaldjYoMuucJ9Ae0BDfUbSm6d9rJJYLEwfrwFKxBCD25Kdroea+kNlQMrYKk783OREQ==", - "license": "W3C-20150513", - "dependencies": { - "wot-thing-description-types": "1.1.0-09-November-2023" - } - }, "node_modules/@node-wot/binding-http": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/@node-wot/binding-http/-/binding-http-0.8.16.tgz", @@ -725,21 +703,6 @@ "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" } }, - "node_modules/@node-wot/binding-modbus/node_modules/wot-thing-description-types": { - "version": "1.1.0-09-November-2023", - "resolved": "https://registry.npmjs.org/wot-thing-description-types/-/wot-thing-description-types-1.1.0-09-November-2023.tgz", - "integrity": "sha512-qgZ1Khg/L3SkIRSm4POVoj0P5MU4GIwxWdyQz2ckZzhnXesgPqe+AUzGxK37ArlxvaMytyjo0Cx2yfKoDHtlkA==", - "license": "W3C-20150513" - }, - "node_modules/@node-wot/binding-modbus/node_modules/wot-typescript-definitions": { - "version": "0.8.0-SNAPSHOT.29", - "resolved": "https://registry.npmjs.org/wot-typescript-definitions/-/wot-typescript-definitions-0.8.0-SNAPSHOT.29.tgz", - "integrity": "sha512-V5r/JSbFs/eaWgQavEEvaldjYoMuucJ9Ae0BDfUbSm6d9rJJYLEwfrwFKxBCD25Kdroea+kNlQMrYKk783OREQ==", - "license": "W3C-20150513", - "dependencies": { - "wot-thing-description-types": "1.1.0-09-November-2023" - } - }, "node_modules/@node-wot/binding-mqtt": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/@node-wot/binding-mqtt/-/binding-mqtt-0.8.16.tgz", @@ -752,6 +715,113 @@ "rxjs": "5.5.11" } }, + "node_modules/@node-wot/binding-mqtt/node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", + "license": "MIT" + }, + "node_modules/@node-wot/binding-mqtt/node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/@node-wot/binding-mqtt/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@node-wot/binding-mqtt/node_modules/mqtt": { + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.15.2.tgz", + "integrity": "sha512-VWZU2CSUY3U3oN0PSBRDE5SNsFi4zqqNeQ/uv3pZWqY3CrBXD/dhd0ZLjlsk5YnebGlrapi4lRVNJPUNQ5aZ3w==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.4.1", + "help-me": "^5.0.0", + "lru-cache": "^10.4.3", + "minimist": "^1.2.8", + "mqtt-packet": "^9.0.2", + "number-allocator": "^1.0.14", + "readable-stream": "^4.7.0", + "rfdc": "^1.4.1", + "socks": "^2.8.6", + "split2": "^4.2.0", + "worker-timers": "^8.0.23", + "ws": "^8.18.3" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@node-wot/binding-mqtt/node_modules/mqtt-packet": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz", + "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==", + "license": "MIT", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/@node-wot/binding-mqtt/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@node-wot/binding-mqtt/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/@node-wot/binding-mqtt/node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@node-wot/core": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/@node-wot/core/-/core-0.8.16.tgz", @@ -772,6 +842,18 @@ "web-streams-polyfill": "^3.0.1" } }, + "node_modules/@node-wot/core/node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -820,15 +902,15 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.9.0.tgz", - "integrity": "sha512-Ur+TgRmJgAEvg6VQuhkqzsWsqoOtr+QSZ8r8Yf6WrvlZpAl/sdRU+yUXWjA7r8JFS9VbBq7IEp7oMStFuJT2ow==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", + "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", "license": "Apache-2.0", "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/core": { @@ -850,6 +932,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.9.0.tgz", "integrity": "sha512-XLsDLuTqQyw08s0n03zeqmz2ike/iQHiep819SJliJnJJKMbGta+JvaWWgrh/YUEYlbBLc/mQP1cndXtd8lbaA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "1.9.0", @@ -865,49 +948,121 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.9.0.tgz", - "integrity": "sha512-5M/NvJj7ZHZXEU8lkAFhrSrWaHmCCkFLstNbL8p16qpTn1AOZowuSjMOYRoJJBmL5PUobkZ3W8Gjov1UgldPBg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.26.0.tgz", + "integrity": "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.9.0" + "@opentelemetry/core": "1.26.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.9.0.tgz", - "integrity": "sha512-oo8RyuyzEbbXdIfeEG9iA5vmTH4Kld+dZMIZICd5G5SmeNcNes3sLrparpunIGms41wIP2mWiIlcOelDCmGceg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.26.0.tgz", + "integrity": "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.9.0" + "@opentelemetry/core": "1.26.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" } }, "node_modules/@opentelemetry/resources": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.9.0.tgz", - "integrity": "sha512-zCyien0p3XWarU6zv72c/JZ6QlG5QW/hc61Nh5TSR1K9ndnljzAGrH55x4nfyQdubfoh9QxLNh9FXH0fWK6vcg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.9.0", - "@opentelemetry/semantic-conventions": "1.9.0" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" } }, "node_modules/@opentelemetry/sdk-trace-base": { @@ -927,18 +1082,14 @@ "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, - "node_modules/@opentelemetry/sdk-trace-node": { + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.9.0.tgz", - "integrity": "sha512-VTpjiqGQ4s8f0/szgZmVrtNSSmXFNoHwC4PNVwXyNeEqQcqyAygHvobpUG6m7qCiBFh6ZtrCuLdhhqWE04Objw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.9.0.tgz", + "integrity": "sha512-zCyien0p3XWarU6zv72c/JZ6QlG5QW/hc61Nh5TSR1K9ndnljzAGrH55x4nfyQdubfoh9QxLNh9FXH0fWK6vcg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "1.9.0", "@opentelemetry/core": "1.9.0", - "@opentelemetry/propagator-b3": "1.9.0", - "@opentelemetry/propagator-jaeger": "1.9.0", - "@opentelemetry/sdk-trace-base": "1.9.0", - "semver": "^7.3.5" + "@opentelemetry/semantic-conventions": "1.9.0" }, "engines": { "node": ">=14" @@ -947,20 +1098,81 @@ "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.9.0.tgz", - "integrity": "sha512-po7penSfQ/Z8352lRVDpaBrd9znwA5mHGqXR7nDEiVnxkDFkBIhVf/tKeAJDIq/erFpcRowKFeCsr5eqqcSyFQ==", + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.26.0.tgz", + "integrity": "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==", "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.26.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/propagator-b3": "1.26.0", + "@opentelemetry/propagator-jaeger": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "semver": "^7.5.2" + }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@petamoriken/float16": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.2.tgz", - "integrity": "sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==", - "license": "MIT" + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.9.0.tgz", + "integrity": "sha512-po7penSfQ/Z8352lRVDpaBrd9znwA5mHGqXR7nDEiVnxkDFkBIhVf/tKeAJDIq/erFpcRowKFeCsr5eqqcSyFQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@petamoriken/float16": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz", + "integrity": "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==", + "license": "MIT" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", @@ -975,25 +1187,24 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", "license": "BSD-3-Clause", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@protobufjs/aspromise": "^1.1.1" } }, "node_modules/@protobufjs/float": { @@ -1002,12 +1213,6 @@ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", @@ -1021,9 +1226,9 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", "license": "BSD-3-Clause" }, "node_modules/@rtsao/scc": { @@ -1290,10 +1495,20 @@ "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==", "license": "MIT" }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, "node_modules/@thingweb/thing-model": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@thingweb/thing-model/-/thing-model-1.0.4.tgz", - "integrity": "sha512-09oa2VVG2yGTXCKbXco25t5bQ5n/BG+BPhKoR/IZrEKLJVPbml20Y9VZusscTTRNxYR2VBrFdON+WhomtIRrdg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@thingweb/thing-model/-/thing-model-1.0.5.tgz", + "integrity": "sha512-s3ov7eh00888fW3Tvn85HhbWUKP+R7LixYGQOlmkOeqOOrVpl3dr2/wPcEjeuF/AI6D7TdalAWCklWvbfNIlPw==", "license": "EPL-2.0 OR W3C-20150513", "dependencies": { "ajv": "^8.11.0", @@ -1302,7 +1517,7 @@ "json-placeholder-replacer": "^2.0.4", "wot-thing-description-types": "^1.1.0-12-March-2025", "wot-thing-model-types": "^1.1.0-12-March-2025", - "wot-typescript-definitions": "^0.8.0-SNAPSHOT.30" + "wot-typescript-definitions": "^1.0.0-SNAPSHOT.0" } }, "node_modules/@thingweb/thing-model/node_modules/ajv-formats": { @@ -1322,10 +1537,19 @@ } } }, + "node_modules/@thingweb/thing-model/node_modules/wot-typescript-definitions": { + "version": "1.0.0-SNAPSHOT.0", + "resolved": "https://registry.npmjs.org/wot-typescript-definitions/-/wot-typescript-definitions-1.0.0-SNAPSHOT.0.tgz", + "integrity": "sha512-FO23aq5XUE1DioYyYyaYt+4MeoUCWclTV0QBlvB04WtWjEs5lBg3tsvrrLGrQQnn4W8Bdp/3EzMqWtL4r+l/eg==", + "license": "W3C-20150513", + "dependencies": { + "wot-thing-description-types": "1.1.0-12-March-2025" + } + }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "dev": true, "license": "MIT" }, @@ -1351,9 +1575,9 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "license": "MIT", "optional": true, "dependencies": { @@ -1399,9 +1623,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "license": "MIT", "dependencies": { @@ -1415,22 +1639,22 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz", + "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==", "dev": true, "license": "MIT", "dependencies": { @@ -1476,9 +1700,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.18.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz", - "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==", + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -1495,10 +1719,16 @@ "form-data": "^4.0.4" } }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "dev": true, "license": "MIT" }, @@ -1510,35 +1740,45 @@ "license": "MIT" }, "node_modules/@types/readable-stream": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.21.tgz", - "integrity": "sha512-19eKVv9tugr03IgfXlA9UVUVRbW6IuqRO5B92Dl4a6pT7K8uaGrNS0GkxiZD0BOk6PLuXl5FhWl//eX/pzYdTQ==", + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.24.tgz", + "integrity": "sha512-NRvUNC/JFGPJvqdAfEve8oginbM6V08u5NzLWpG8MwA2kTPOLnqk+wpwuPT+mp3aUsxyuT6m2gnrPuHYCruzEg==", "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, "node_modules/@types/tough-cookie": { @@ -1563,21 +1803,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", - "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/type-utils": "8.41.0", - "@typescript-eslint/utils": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1587,23 +1826,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.41.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@typescript-eslint/parser": "^8.67.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", - "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1613,20 +1852,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1636,18 +1875,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1658,9 +1897,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", "dev": true, "license": "MIT", "engines": { @@ -1671,21 +1910,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", - "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/utils": "8.41.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1695,14 +1934,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", "dev": true, "license": "MIT", "engines": { @@ -1714,22 +1953,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1739,20 +1977,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1762,19 +2000,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.67.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1785,22 +2023,22 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "dev": true, "license": "ISC" }, @@ -1836,9 +2074,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -1859,9 +2097,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -1976,15 +2214,16 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2015,12 +2254,10 @@ } }, "node_modules/ansi-color": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", - "integrity": "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==", - "engines": { - "node": "*" - } + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.2.tgz", + "integrity": "sha512-qPx7iZZDHITYrrfzaUFXQpIcF2xYifcQHQflP1pFz8yY3lfU6GgCHb0+hJD7nimYKO7f2iaYYwBpZ+GaNcAhcA==", + "license": "BSD License" }, "node_modules/ansi-colors": { "version": "4.1.3", @@ -2036,7 +2273,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2072,6 +2309,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -2325,10 +2575,14 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -2386,9 +2640,9 @@ } }, "node_modules/bl": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.2.tgz", - "integrity": "sha512-6J3oG82fpJ71WF4l0W6XslkwAPMr+Zcp+AmdxJ0L8LsXNzFeO8GYesV2J9AzGArBjrsb2xR50Ocbn/CL1B44TA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", + "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", "license": "MIT", "dependencies": { "@types/readable-stream": "^4.0.0", @@ -2397,15 +2651,6 @@ "readable-stream": "^4.2.0" } }, - "node_modules/bl/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/bl/node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -2423,23 +2668,23 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -2462,13 +2707,16 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/braces": { @@ -2485,15 +2733,15 @@ } }, "node_modules/broker-factory": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.9.tgz", - "integrity": "sha512-MzvndyD6EcbkBtX4NXm/HfdO1+cOR5ONNdMCXEKfHpxGdMtuDz7+o+nJf7HMtyPH1sUVf/lEIP+DMluC5PgaBQ==", + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.15.tgz", + "integrity": "sha512-ko+aWvgNuP49meGrdjUu7rC+Y+Wai3cCPxP3xWwHsHfehFjOh5ZQM2yC4gEB2UddeZ/YXhm0K1eG/L6fxym2Og==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.3", - "fast-unique-numbers": "^9.0.23", + "@babel/runtime": "^7.29.7", + "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1", - "worker-factory": "^7.0.45" + "worker-factory": "^7.0.50" } }, "node_modules/browser-stdout": { @@ -2608,15 +2856,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -2685,15 +2933,15 @@ "license": "MIT" }, "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", "license": "MIT", "dependencies": { "nofilter": "^3.1.0" }, "engines": { - "node": ">=12.19" + "node": ">=16" } }, "node_modules/chai": { @@ -2848,10 +3096,35 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/coap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/coap/-/coap-1.4.2.tgz", - "integrity": "sha512-kmlhZJTf6GgC7cs7bTj3oq2AOS9uFFw9AWbhVjuyMEiD3ByM8+3m/jSxaFM38aRfINJMxAD5tAwfNkIspX1Ccw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/coap/-/coap-1.5.0.tgz", + "integrity": "sha512-lp0saLVt78XlwzCaFwvkcuJaCitN/XhYOgRLuOUrbm9OY0p42pkZb2WVfzop8hy652ViUMMqluXZHNWLOaccAw==", "license": "MIT", "dependencies": { "@types/readable-stream": "^4.0.14", @@ -2880,15 +3153,6 @@ "node": ">= 0.10" } }, - "node_modules/coap/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/coap/node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -2916,13 +3180,16 @@ } }, "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" } }, "node_modules/color-convert": { @@ -2942,41 +3209,49 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", + "license": "MIT", + "engines": { + "node": ">=12.20" } }, "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" } }, "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "engines": { + "node": ">=12.20" } }, "node_modules/combined-stream": { @@ -2993,10 +3268,14 @@ } }, "node_modules/commist": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", - "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", - "license": "MIT" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "license": "MIT", + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -3075,18 +3354,18 @@ } }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, "node_modules/core-util-is": { @@ -3193,9 +3472,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3360,9 +3639,9 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3420,6 +3699,18 @@ "node": ">= 0.4" } }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3430,7 +3721,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/enabled": { @@ -3467,9 +3758,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -3535,6 +3826,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3554,9 +3864,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3595,15 +3905,18 @@ } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -3758,15 +4071,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -3780,9 +4093,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -3883,10 +4196,17 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3918,9 +4238,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3969,10 +4289,17 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3991,9 +4318,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4003,9 +4330,31 @@ "node": "*" } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "node_modules/eslint-plugin-n/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, "license": "MIT", @@ -4024,10 +4373,17 @@ "eslint": ">=5.16.0" } }, + "node_modules/eslint-plugin-node/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-node/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -4046,9 +4402,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4058,6 +4414,28 @@ "node": "*" } }, + "node_modules/eslint-plugin-node/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-node/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4100,14 +4478,14 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", - "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz", + "integrity": "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==", "dev": true, "license": "MIT", "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", - "eslint": "^9.0.0 || ^8.0.0" + "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -4182,9 +4560,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -4198,10 +4576,17 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -4227,9 +4612,9 @@ "license": "MIT" }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4258,9 +4643,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4350,39 +4735,39 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -4496,12 +4881,12 @@ } }, "node_modules/fast-unique-numbers": { - "version": "9.0.23", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.23.tgz", - "integrity": "sha512-jcRIaHo46nfvyvKRMaFSKXmez4jALQ3Qw49gxM5F4siz8HqkyKPPEexpCOYwBSJI1HovrDr4fEedM8QAJ7oX3w==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.27.tgz", + "integrity": "sha512-nDA9ADeINN8SA2u2wCtU+siWFTTDqQR37XvgPIDDmboWQeExz7X0mImxuaN+kJddliIqy2FpVRmnvRZ+j8i1/A==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.3", + "@babel/runtime": "^7.29.2", "tslib": "^2.8.1" }, "engines": { @@ -4509,9 +4894,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -4547,9 +4932,9 @@ } }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -4562,6 +4947,24 @@ "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==", "license": "ISC" }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -4611,17 +5014,17 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -4719,9 +5122,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -4748,17 +5151,17 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -4860,18 +5263,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4918,34 +5324,6 @@ "node": ">=0.10.0" } }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "license": "MIT", - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "license": "MIT", - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/gauge/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -4959,6 +5337,16 @@ "node": ">=0.10.0" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5035,9 +5423,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.1.tgz", + "integrity": "sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A==", "dev": true, "license": "MIT", "dependencies": { @@ -5058,7 +5446,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -5088,10 +5476,27 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -5241,9 +5646,9 @@ "optional": true }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5263,11 +5668,64 @@ } }, "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "license": "MIT", + "dependencies": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/help-me/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/help-me/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/help-me/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/hexer": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", @@ -5285,6 +5743,14 @@ "node": ">= 0.10.x" } }, + "node_modules/hexer/node_modules/process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/http-calculator": { "resolved": "things/calculator/http/express", "link": true @@ -5294,19 +5760,23 @@ "link": true }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/hyperid": { @@ -5348,6 +5818,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -5386,9 +5857,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -5462,9 +5933,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz", + "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", "license": "MIT", "engines": { "node": ">= 12" @@ -5506,12 +5977,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -5608,13 +6073,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -5658,6 +6123,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5685,24 +6166,28 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "license": "MIT", + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -6003,6 +6488,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -6019,10 +6505,20 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -6090,6 +6586,15 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "license": "MIT" }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6121,9 +6626,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, @@ -6169,13 +6674,10 @@ } }, "node_modules/long": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", - "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.6" - } + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" }, "node_modules/loupe": { "version": "2.3.7", @@ -6188,10 +6690,10 @@ } }, "node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "license": "ISC", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -6278,7 +6780,20 @@ "node": ">=8.6" } }, - "node_modules/mime": { + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", @@ -6325,16 +6840,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6357,16 +6872,16 @@ "optional": true }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/mocha": { @@ -6405,10 +6920,27 @@ "node": ">= 14.0.0" } }, + "node_modules/mocha/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -6449,40 +6981,44 @@ "link": true }, "node_modules/modbus-serial": { - "version": "8.0.21", - "resolved": "https://registry.npmjs.org/modbus-serial/-/modbus-serial-8.0.21.tgz", - "integrity": "sha512-KBhDrMWNf00jf6v1wE/7c6A7ysgE2xx7PfQzSmQViHrGBb4soYEbtnSTf8agoymxwEt8FaDfQCgOLmAojDOOxA==", + "version": "8.0.25", + "resolved": "https://registry.npmjs.org/modbus-serial/-/modbus-serial-8.0.25.tgz", + "integrity": "sha512-T6OHW80k7DtYZF96onavw84IXNu44EW+fybgVftWAGOraL8vTmMZod8w6thOrWj2I2qHC9Gsn2nitVTUDih+6A==", "license": "ISC", "dependencies": { - "debug": "^4.3.1", - "serialport": "^12.0.0" + "debug": "^4.4.3" + }, + "optionalDependencies": { + "serialport": "^13.0.0" } }, "node_modules/modbus-serial/node_modules/@serialport/bindings-cpp": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-12.0.1.tgz", - "integrity": "sha512-r2XOwY2dDvbW7dKqSPIk2gzsr6M6Qpe9+/Ngs94fNaNlcTRCV02PfaoDmRgcubpNVVcLATlxSxPTIDw12dbKOg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-13.0.0.tgz", + "integrity": "sha512-r25o4Bk/vaO1LyUfY/ulR6hCg/aWiN6Wo2ljVlb4Pj5bqWGcSRC4Vse4a9AcapuAu/FeBzHCbKMvRQeCuKjzIQ==", "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { "@serialport/bindings-interface": "1.2.2", - "@serialport/parser-readline": "11.0.0", - "debug": "4.3.4", - "node-addon-api": "7.0.0", - "node-gyp-build": "4.6.0" + "@serialport/parser-readline": "12.0.0", + "debug": "4.4.0", + "node-addon-api": "8.3.0", + "node-gyp-build": "4.8.4" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/bindings-cpp/node_modules/@serialport/parser-delimiter": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-11.0.0.tgz", - "integrity": "sha512-aZLJhlRTjSmEwllLG7S4J8s8ctRAS0cbvCpO87smLvl3e4BgzbVgF6Z6zaJd3Aji2uSiYgfedCdNc4L6W+1E2g==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-12.0.0.tgz", + "integrity": "sha512-gu26tVt5lQoybhorLTPsH2j2LnX3AOP2x/34+DUSTNaUTzu2fBXw+isVjQJpUBFWu6aeQRZw5bJol5X9Gxjblw==", "license": "MIT", + "optional": true, "engines": { "node": ">=12.0.0" }, @@ -6491,12 +7027,13 @@ } }, "node_modules/modbus-serial/node_modules/@serialport/bindings-cpp/node_modules/@serialport/parser-readline": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-11.0.0.tgz", - "integrity": "sha512-rRAivhRkT3YO28WjmmG4FQX6L+KMb5/ikhyylRfzWPw0nSXy97+u07peS9CbHqaNvJkMhH1locp2H36aGMOEIA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-12.0.0.tgz", + "integrity": "sha512-O7cywCWC8PiOMvo/gglEBfAkLjp/SENEML46BXDykfKP5mTPM46XMaX1L0waWU6DXJpBgjaL7+yX6VriVPbN4w==", "license": "MIT", + "optional": true, "dependencies": { - "@serialport/parser-delimiter": "11.0.0" + "@serialport/parser-delimiter": "12.0.0" }, "engines": { "node": ">=12.0.0" @@ -6505,149 +7042,179 @@ "url": "https://opencollective.com/serialport/donate" } }, + "node_modules/modbus-serial/node_modules/@serialport/bindings-cpp/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/modbus-serial/node_modules/@serialport/parser-byte-length": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-12.0.0.tgz", - "integrity": "sha512-0ei0txFAj+s6FTiCJFBJ1T2hpKkX8Md0Pu6dqMrYoirjPskDLJRgZGLqoy3/lnU1bkvHpnJO+9oJ3PB9v8rNlg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-13.0.0.tgz", + "integrity": "sha512-32yvqeTAqJzAEtX5zCrN1Mej56GJ5h/cVFsCDPbF9S1ZSC9FWjOqNAgtByseHfFTSTs/4ZBQZZcZBpolt8sUng==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-cctalk": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-12.0.0.tgz", - "integrity": "sha512-0PfLzO9t2X5ufKuBO34DQKLXrCCqS9xz2D0pfuaLNeTkyGUBv426zxoMf3rsMRodDOZNbFblu3Ae84MOQXjnZw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-13.0.0.tgz", + "integrity": "sha512-RErAe57g9gvnlieVYGIn1xymb1bzNXb2QtUQd14FpmbQQYlcrmuRnJwKa1BgTCujoCkhtaTtgHlbBWOxm8U2uA==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-delimiter": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-12.0.0.tgz", - "integrity": "sha512-gu26tVt5lQoybhorLTPsH2j2LnX3AOP2x/34+DUSTNaUTzu2fBXw+isVjQJpUBFWu6aeQRZw5bJol5X9Gxjblw==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-13.0.0.tgz", + "integrity": "sha512-Qqyb0FX1avs3XabQqNaZSivyVbl/yl0jywImp7ePvfZKLwx7jBZjvL+Hawt9wIG6tfq6zbFM24vzCCK7REMUig==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-inter-byte-timeout": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-12.0.0.tgz", - "integrity": "sha512-GnCh8K0NAESfhCuXAt+FfBRz1Cf9CzIgXfp7SdMgXwrtuUnCC/yuRTUFWRvuzhYKoAo1TL0hhUo77SFHUH1T/w==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-13.0.0.tgz", + "integrity": "sha512-a0w0WecTW7bD2YHWrpTz1uyiWA2fDNym0kjmPeNSwZ2XCP+JbirZt31l43m2ey6qXItTYVuQBthm75sPVeHnGA==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-packet-length": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-packet-length/-/parser-packet-length-12.0.0.tgz", - "integrity": "sha512-p1hiCRqvGHHLCN/8ZiPUY/G0zrxd7gtZs251n+cfNTn+87rwcdUeu9Dps3Aadx30/sOGGFL6brIRGK4l/t7MuQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-packet-length/-/parser-packet-length-13.0.0.tgz", + "integrity": "sha512-60ZDDIqYRi0Xs2SPZUo4Jr5LLIjtb+rvzPKMJCohrO6tAqSDponcNpcB1O4W21mKTxYjqInSz+eMrtk0LLfZIg==", "license": "MIT", + "optional": true, "engines": { "node": ">=8.6.0" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-readline": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-12.0.0.tgz", - "integrity": "sha512-O7cywCWC8PiOMvo/gglEBfAkLjp/SENEML46BXDykfKP5mTPM46XMaX1L0waWU6DXJpBgjaL7+yX6VriVPbN4w==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-13.0.0.tgz", + "integrity": "sha512-dov3zYoyf0dt1Sudd1q42VVYQ4WlliF0MYvAMA3MOyiU1IeG4hl0J6buBA2w4gl3DOCC05tGgLDN/3yIL81gsA==", "license": "MIT", + "optional": true, "dependencies": { - "@serialport/parser-delimiter": "12.0.0" + "@serialport/parser-delimiter": "13.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-ready": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-12.0.0.tgz", - "integrity": "sha512-ygDwj3O4SDpZlbrRUraoXIoIqb8sM7aMKryGjYTIF0JRnKeB1ys8+wIp0RFMdFbO62YriUDextHB5Um5cKFSWg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-13.0.0.tgz", + "integrity": "sha512-JNUQA+y2Rfs4bU+cGYNqOPnNMAcayhhW+XJZihSLQXOHcZsFnOa2F9YtMg9VXRWIcnHldHYtisp62Etjlw24bw==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-regex": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-12.0.0.tgz", - "integrity": "sha512-dCAVh4P/pZrLcPv9NJ2mvPRBg64L5jXuiRxIlyxxdZGH4WubwXVXY/kBTihQmiAMPxbT3yshSX8f2+feqWsxqA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-13.0.0.tgz", + "integrity": "sha512-m7HpIf56G5XcuDdA3DB34Z0pJiwxNRakThEHjSa4mG05OnWYv0IG8l2oUyYfuGMowQWaVnQ+8r+brlPxGVH+eA==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-slip-encoder": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-slip-encoder/-/parser-slip-encoder-12.0.0.tgz", - "integrity": "sha512-0APxDGR9YvJXTRfY+uRGhzOhTpU5akSH183RUcwzN7QXh8/1jwFsFLCu0grmAUfi+fItCkR+Xr1TcNJLR13VNA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-slip-encoder/-/parser-slip-encoder-13.0.0.tgz", + "integrity": "sha512-fUHZEExm6izJ7rg0A1yjXwu4sOzeBkPAjDZPfb+XQoqgtKAk+s+HfICiYn7N2QU9gyaeCO8VKgWwi+b/DowYOg==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/parser-spacepacket": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/parser-spacepacket/-/parser-spacepacket-12.0.0.tgz", - "integrity": "sha512-dozONxhPC/78pntuxpz/NOtVps8qIc/UZzdc/LuPvVsqCoJXiRxOg6ZtCP/W58iibJDKPZPAWPGYeZt9DJxI+Q==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/parser-spacepacket/-/parser-spacepacket-13.0.0.tgz", + "integrity": "sha512-DoXJ3mFYmyD8X/8931agJvrBPxqTaYDsPoly9/cwQSeh/q4EjQND9ySXBxpWz5WcpyCU4jOuusqCSAPsbB30Eg==", "license": "MIT", + "optional": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, "node_modules/modbus-serial/node_modules/@serialport/stream": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-12.0.0.tgz", - "integrity": "sha512-9On64rhzuqKdOQyiYLYv2lQOh3TZU/D3+IWCR5gk0alPel2nwpp4YwDEGiUBfrQZEdQ6xww0PWkzqth4wqwX3Q==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-13.0.0.tgz", + "integrity": "sha512-F7xLJKsjGo2WuEWMSEO1SimRcOA+WtWICsY13r0ahx8s2SecPQH06338g28OT7cW7uRXI7oEQAk62qh5gHJW3g==", "license": "MIT", + "optional": true, "dependencies": { "@serialport/bindings-interface": "1.2.2", - "debug": "4.3.4" + "debug": "4.4.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, - "node_modules/modbus-serial/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/modbus-serial/node_modules/@serialport/stream/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", + "optional": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6658,46 +7225,75 @@ } } }, - "node_modules/modbus-serial/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, "node_modules/modbus-serial/node_modules/node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", - "license": "MIT" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.0.tgz", + "integrity": "sha512-8VOpLHFrOQlAH+qA0ZzuGRlALRA6/LVh8QJldbrC4DY0hXoMP0l4Acq8TzFC018HztWiRqyCEj2aTWY2UvnJUg==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/modbus-serial/node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } }, "node_modules/modbus-serial/node_modules/serialport": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/serialport/-/serialport-12.0.0.tgz", - "integrity": "sha512-AmH3D9hHPFmnF/oq/rvigfiAouAKyK/TjnrkwZRYSFZxNggJxwvbAbfYrLeuvq7ktUdhuHdVdSjj852Z55R+uA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/serialport/-/serialport-13.0.0.tgz", + "integrity": "sha512-PHpnTd8isMGPfFTZNCzOZp9m4mAJSNWle9Jxu6BPTcWq7YXl5qN7tp8Sgn0h+WIGcD6JFz5QDgixC2s4VW7vzg==", "license": "MIT", + "optional": true, "dependencies": { "@serialport/binding-mock": "10.2.2", - "@serialport/bindings-cpp": "12.0.1", - "@serialport/parser-byte-length": "12.0.0", - "@serialport/parser-cctalk": "12.0.0", - "@serialport/parser-delimiter": "12.0.0", - "@serialport/parser-inter-byte-timeout": "12.0.0", - "@serialport/parser-packet-length": "12.0.0", - "@serialport/parser-readline": "12.0.0", - "@serialport/parser-ready": "12.0.0", - "@serialport/parser-regex": "12.0.0", - "@serialport/parser-slip-encoder": "12.0.0", - "@serialport/parser-spacepacket": "12.0.0", - "@serialport/stream": "12.0.0", - "debug": "4.3.4" + "@serialport/bindings-cpp": "13.0.0", + "@serialport/parser-byte-length": "13.0.0", + "@serialport/parser-cctalk": "13.0.0", + "@serialport/parser-delimiter": "13.0.0", + "@serialport/parser-inter-byte-timeout": "13.0.0", + "@serialport/parser-packet-length": "13.0.0", + "@serialport/parser-readline": "13.0.0", + "@serialport/parser-ready": "13.0.0", + "@serialport/parser-regex": "13.0.0", + "@serialport/parser-slip-encoder": "13.0.0", + "@serialport/parser-spacepacket": "13.0.0", + "@serialport/stream": "13.0.0", + "debug": "4.4.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" }, "funding": { "url": "https://opencollective.com/serialport/donate" } }, + "node_modules/modbus-serial/node_modules/serialport/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/modbus/node_modules/@serialport/bindings-cpp": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-12.0.1.tgz", @@ -6952,35 +7548,36 @@ } }, "node_modules/mqtt": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.14.0.tgz", - "integrity": "sha512-H7EmeCJhbGblbWjm6APF5sAH3SkdI7lxHw/UkblZp8fjSNl8b2MsLcdAkIaQKxvZYmiORkdAjffvKjqQWPkd6w==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.8.tgz", + "integrity": "sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==", "license": "MIT", "dependencies": { - "@types/readable-stream": "^4.0.21", - "@types/ws": "^8.18.1", - "commist": "^3.2.0", + "commist": "^1.0.0", "concat-stream": "^2.0.0", - "debug": "^4.4.1", - "help-me": "^5.0.0", - "lru-cache": "^10.4.3", - "minimist": "^1.2.8", - "mqtt-packet": "^9.0.2", - "number-allocator": "^1.0.14", - "readable-stream": "^4.7.0", - "rfdc": "^1.4.1", - "socks": "^2.8.6", - "split2": "^4.2.0", - "worker-timers": "^8.0.23", - "ws": "^8.18.3" + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" }, "bin": { - "mqtt": "build/bin/mqtt.js", - "mqtt_pub": "build/bin/pub.js", - "mqtt_sub": "build/bin/sub.js" + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.0.0" } }, "node_modules/mqtt-calculator": { @@ -7033,46 +7630,62 @@ "ieee754": "^1.1.13" } }, - "node_modules/mqtt/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/mqtt/node_modules/mqtt-packet": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz", - "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==", + "node_modules/mqtt/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { - "bl": "^6.0.8", - "debug": "^4.3.4", - "process-nextick-args": "^2.0.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/mqtt/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/mqtt/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.6.0" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/mqtt/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", + "node_modules/mqtt/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "yallist": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" + } + }, + "node_modules/mqtt/node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" } }, "node_modules/ms": { @@ -7195,6 +7808,35 @@ "node-aead-crypto": "^2.0.0" } }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -7338,6 +7980,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -7449,13 +8107,14 @@ } }, "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.6", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" }, @@ -7557,9 +8216,9 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/pathe": { @@ -7580,13 +8239,13 @@ } }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -7701,6 +8360,7 @@ "version": "6.1.4", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "optional": true, "dependencies": { @@ -7752,9 +8412,10 @@ } }, "node_modules/process": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", - "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -7766,35 +8427,28 @@ "license": "MIT" }, "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", + "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", - "long": "^5.0.0" + "long": "^5.3.2" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7821,9 +8475,9 @@ } }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -7849,12 +8503,13 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -7928,15 +8583,15 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -7995,6 +8650,19 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -8052,6 +8720,12 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", + "license": "MIT" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8078,13 +8752,16 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8166,10 +8843,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -8181,7 +8865,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -8200,9 +8884,9 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -8249,15 +8933,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -8334,9 +9018,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -8346,24 +9030,24 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -8384,15 +9068,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -8455,15 +9130,15 @@ "license": "MIT" }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -8566,14 +9241,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -8585,13 +9260,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -8677,19 +9352,10 @@ "simple-concat": "^1.0.0" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -8710,9 +9376,9 @@ "link": true }, "node_modules/snappy": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/snappy/-/snappy-7.3.2.tgz", - "integrity": "sha512-cEA4Wi0huhCIlGDG+/27q0hELqIe9TBcrOToO4HsAE1n/3ibO9SsbtbRB5pAHHTGw8ihrhG700XOOqyxvwSxng==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/snappy/-/snappy-7.3.3.tgz", + "integrity": "sha512-UDJVCunvgblRpfTOjo/uT7pQzfrTsSICJ4yVS4aq7SsGBaUSpJwaVP15nF//jqinSLpN7boe/BqbUmtWMTQ5MQ==", "license": "MIT", "optional": true, "engines": { @@ -8723,33 +9389,33 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/snappy-android-arm-eabi": "7.3.2", - "@napi-rs/snappy-android-arm64": "7.3.2", - "@napi-rs/snappy-darwin-arm64": "7.3.2", - "@napi-rs/snappy-darwin-x64": "7.3.2", - "@napi-rs/snappy-freebsd-x64": "7.3.2", - "@napi-rs/snappy-linux-arm-gnueabihf": "7.3.2", - "@napi-rs/snappy-linux-arm64-gnu": "7.3.2", - "@napi-rs/snappy-linux-arm64-musl": "7.3.2", - "@napi-rs/snappy-linux-ppc64-gnu": "7.3.2", - "@napi-rs/snappy-linux-riscv64-gnu": "7.3.2", - "@napi-rs/snappy-linux-s390x-gnu": "7.3.2", - "@napi-rs/snappy-linux-x64-gnu": "7.3.2", - "@napi-rs/snappy-linux-x64-musl": "7.3.2", - "@napi-rs/snappy-openharmony-arm64": "7.3.2", - "@napi-rs/snappy-wasm32-wasi": "7.3.2", - "@napi-rs/snappy-win32-arm64-msvc": "7.3.2", - "@napi-rs/snappy-win32-ia32-msvc": "7.3.2", - "@napi-rs/snappy-win32-x64-msvc": "7.3.2" + "@napi-rs/snappy-android-arm-eabi": "7.3.3", + "@napi-rs/snappy-android-arm64": "7.3.3", + "@napi-rs/snappy-darwin-arm64": "7.3.3", + "@napi-rs/snappy-darwin-x64": "7.3.3", + "@napi-rs/snappy-freebsd-x64": "7.3.3", + "@napi-rs/snappy-linux-arm-gnueabihf": "7.3.3", + "@napi-rs/snappy-linux-arm64-gnu": "7.3.3", + "@napi-rs/snappy-linux-arm64-musl": "7.3.3", + "@napi-rs/snappy-linux-ppc64-gnu": "7.3.3", + "@napi-rs/snappy-linux-riscv64-gnu": "7.3.3", + "@napi-rs/snappy-linux-s390x-gnu": "7.3.3", + "@napi-rs/snappy-linux-x64-gnu": "7.3.3", + "@napi-rs/snappy-linux-x64-musl": "7.3.3", + "@napi-rs/snappy-openharmony-arm64": "7.3.3", + "@napi-rs/snappy-wasm32-wasi": "7.3.3", + "@napi-rs/snappy-win32-arm64-msvc": "7.3.3", + "@napi-rs/snappy-win32-ia32-msvc": "7.3.3", + "@napi-rs/snappy-win32-x64-msvc": "7.3.3" } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -8767,12 +9433,12 @@ } }, "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "license": "ISC", - "engines": { - "node": ">= 10.x" + "dependencies": { + "readable-stream": "^3.0.0" } }, "node_modules/stack-trace": { @@ -8785,9 +9451,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8807,6 +9473,12 @@ "node": ">= 0.4" } }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -8851,34 +9523,58 @@ "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "license": "MIT", + "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8888,16 +9584,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -8928,7 +9624,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -8996,9 +9692,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", "license": "MIT", "optional": true, "dependencies": { @@ -9062,6 +9758,10 @@ "ieee754": "^1.1.13" } }, + "node_modules/test-things": { + "resolved": "", + "link": true + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -9091,6 +9791,15 @@ "node": ">= 0.10.x" } }, + "node_modules/thriftrw/node_modules/long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } + }, "node_modules/throwback": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throwback/-/throwback-4.1.0.tgz", @@ -9103,6 +9812,23 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9156,9 +9882,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -9219,9 +9945,9 @@ } }, "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -9367,18 +10093,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -9408,9 +10134,9 @@ } }, "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "dev": true, "license": "MIT" }, @@ -9434,9 +10160,10 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -9483,9 +10210,9 @@ } }, "node_modules/url-polyfill": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.13.tgz", - "integrity": "sha512-tXzkojrv2SujumYthZ/WjF7jaSfNhSXlYMpE5AYdL2I3D7DCeo+mch8KtW2rUuKjDg+3VXODXHVgipt8yGY/eQ==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.14.tgz", + "integrity": "sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==", "license": "MIT" }, "node_modules/url-toolkit": { @@ -9517,6 +10244,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -9653,14 +10381,14 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -9685,13 +10413,13 @@ } }, "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", @@ -9707,9 +10435,9 @@ } }, "node_modules/winston-loki": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/winston-loki/-/winston-loki-6.1.3.tgz", - "integrity": "sha512-DjWtJ230xHyYQWr9mZJa93yhwHttn3JEtSYWP8vXZWJOahiQheUhf+88dSIidbGXB3u0oLweV6G1vkL/ouT62Q==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/winston-loki/-/winston-loki-6.1.6.tgz", + "integrity": "sha512-chNF2zG4l0Cocgt4MmFQ8hS4iSNbbs0GsW4XI+FWCsf2oa8KCEzizyJR7VlnabiCYAs5jMYeFedDBP8TIljw9A==", "license": "MIT", "dependencies": { "async-exit-hook": "2.0.1", @@ -9747,50 +10475,50 @@ } }, "node_modules/worker-factory": { - "version": "7.0.45", - "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.45.tgz", - "integrity": "sha512-FFPCiSv7MD6ZDEfiik/ErM8IrIAWajaXhezLyCo3v0FjhUWud6GXnG2BiTE91jLywXGAVCT8IF48Hhr+D/omMw==", + "version": "7.0.50", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.50.tgz", + "integrity": "sha512-hhwc0G+sFwM4qBuhJIUBn2p1Jf8v/FwmLUANBf/Q+Lt2uI8mfIZQhXaZQACodQD4R7Zp6cn/6702bIvNn2puJQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.3", - "fast-unique-numbers": "^9.0.23", + "@babel/runtime": "^7.29.7", + "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1" } }, "node_modules/worker-timers": { - "version": "8.0.24", - "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.24.tgz", - "integrity": "sha512-Ydu/7TRHlxIRjYSGDge1F92L7y9kzInpwR4CkocRVObPE0eRqC6d+0GFh52Hm+m520RHVKiytOERtCUu5sQDVQ==", + "version": "8.0.34", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.34.tgz", + "integrity": "sha512-WXL+Dqsm0G6dnC66rQsvM3tPT2adhbqSirWUCZGglkALOr8ocS0KlpU0iuKbjflJOlu3ydZikMEVrYnHOM9suw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.3", + "@babel/runtime": "^7.29.7", "tslib": "^2.8.1", - "worker-timers-broker": "^8.0.10", - "worker-timers-worker": "^9.0.10" + "worker-timers-broker": "^8.0.18", + "worker-timers-worker": "^9.0.15" } }, "node_modules/worker-timers-broker": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.10.tgz", - "integrity": "sha512-xvo/9GiuduENbJNdWnvZtkriIkjBKKVbMyw7GXvrBu3n1JHemzZgxqaCcCBNlpfXnRXXF4ekqvXWLh1gb65b8w==", + "version": "8.0.18", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.18.tgz", + "integrity": "sha512-FrjzDVX1wKfZN0gRbCFqv8VHuTncG4sbI/WGEg4tSSQeIsnwqg4YBYWMAHYLJtUDEYYmiK65UKFrVMVk2irDSg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.3", - "broker-factory": "^3.1.9", - "fast-unique-numbers": "^9.0.23", + "@babel/runtime": "^7.29.7", + "broker-factory": "^3.1.15", + "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1", - "worker-timers-worker": "^9.0.10" + "worker-timers-worker": "^9.0.15" } }, "node_modules/worker-timers-worker": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.10.tgz", - "integrity": "sha512-cfCmAkuoN+nGGJShta/g7CQVP3h7rvQA642EQg72fOHCWP5S2P83rLxDiaGv811Hd+19Cgdqt/tpRBIZ5kj/dw==", + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.15.tgz", + "integrity": "sha512-KKUe7lZ/Aignr51H6hOUik8LwTnIgojH/1lwhli8A8qIEIyewogZTpNpMW5B6BF7nmwBOkUoTYgf1H3QShcjSA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.3", + "@babel/runtime": "^7.29.7", "tslib": "^2.8.1", - "worker-factory": "^7.0.45" + "worker-factory": "^7.0.50" } }, "node_modules/workerpool": { @@ -9813,14 +10541,20 @@ "license": "W3C-20150513" }, "node_modules/wot-typescript-definitions": { - "version": "0.8.0-SNAPSHOT.31", - "resolved": "https://registry.npmjs.org/wot-typescript-definitions/-/wot-typescript-definitions-0.8.0-SNAPSHOT.31.tgz", - "integrity": "sha512-BBUWfJnNsSMb60FlUfQN+TWFP2W71LM4g7in83Y+vO6BjGvsyO0KY4jTbazjhLdxxTjbyftrExNkKNwtBIbxfA==", + "version": "0.8.0-SNAPSHOT.29", + "resolved": "https://registry.npmjs.org/wot-typescript-definitions/-/wot-typescript-definitions-0.8.0-SNAPSHOT.29.tgz", + "integrity": "sha512-V5r/JSbFs/eaWgQavEEvaldjYoMuucJ9Ae0BDfUbSm6d9rJJYLEwfrwFKxBCD25Kdroea+kNlQMrYKk783OREQ==", "license": "W3C-20150513", "dependencies": { - "wot-thing-description-types": "1.1.0-12-March-2025" + "wot-thing-description-types": "1.1.0-09-November-2023" } }, + "node_modules/wot-typescript-definitions/node_modules/wot-thing-description-types": { + "version": "1.1.0-09-November-2023", + "resolved": "https://registry.npmjs.org/wot-thing-description-types/-/wot-thing-description-types-1.1.0-09-November-2023.tgz", + "integrity": "sha512-qgZ1Khg/L3SkIRSm4POVoj0P5MU4GIwxWdyQz2ckZzhnXesgPqe+AUzGxK37ArlxvaMytyjo0Cx2yfKoDHtlkA==", + "license": "W3C-20150513" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9839,6 +10573,31 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9846,16 +10605,16 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -9891,10 +10650,16 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { @@ -9902,12 +10667,15 @@ }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", "dev": true, "license": "MIT", "dependencies": { @@ -9949,6 +10717,31 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -9981,11 +10774,12 @@ "@node-wot/core": "0.8.16", "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-jaeger": "1.9.0", - "@opentelemetry/resources": "1.9.0", - "@opentelemetry/sdk-trace-node": "1.9.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-node": "1.26.0", "@opentelemetry/semantic-conventions": "1.9.0", "dotenv": "^16.4.5", "json-placeholder-replacer": "^2.0.5", + "test-things": "file:../../../..", "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" }, "devDependencies": { @@ -9995,17 +10789,6 @@ "typescript": "^4.7.4" } }, - "things/advanced-coffee-machine/http/ts/node_modules/wot-thing-description-types": { - "version": "1.1.0-09-November-2023", - "license": "W3C-20150513" - }, - "things/advanced-coffee-machine/http/ts/node_modules/wot-typescript-definitions": { - "version": "0.8.0-SNAPSHOT.29", - "license": "W3C-20150513", - "dependencies": { - "wot-thing-description-types": "1.1.0-09-November-2023" - } - }, "things/calculator/coap/js": { "name": "coap-calculator", "version": "1.0.0", @@ -10014,7 +10797,8 @@ "cbor": "^9.0.2", "coap": "^1.3.0", "dotenv": "^16.3.1", - "json-placeholder-replacer": "^1.0.35" + "json-placeholder-replacer": "^1.0.35", + "test-things": "file:../../../.." } }, "things/calculator/coap/js/node_modules/cbor": { @@ -10029,6 +10813,8 @@ }, "things/calculator/coap/js/node_modules/json-placeholder-replacer": { "version": "1.0.37", + "resolved": "https://registry.npmjs.org/json-placeholder-replacer/-/json-placeholder-replacer-1.0.37.tgz", + "integrity": "sha512-Ix9Rpcp3UvkCULHrS2Wu58Op+oDLD0ubjlmXDMIKQwvvztvEV6diyaB+Duuuvb6lDHav9PISyRaO9dzzt8tOAQ==", "license": "MIT", "bin": { "jpr": "dist/index.js", @@ -10046,6 +10832,7 @@ "eventsource": "^2.0.2", "express": "^4.18.2", "json-placeholder-replacer": "^1.0.35", + "test-things": "file:../../../..", "winston": "^3.14.2", "winston-loki": "^6.1.2" }, @@ -10053,18 +10840,10 @@ "@types/express": "^4.17.17" } }, - "things/calculator/http/express/node_modules/cbor": { - "version": "9.0.2", - "license": "MIT", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, "things/calculator/http/express/node_modules/json-placeholder-replacer": { "version": "1.0.37", + "resolved": "https://registry.npmjs.org/json-placeholder-replacer/-/json-placeholder-replacer-1.0.37.tgz", + "integrity": "sha512-Ix9Rpcp3UvkCULHrS2Wu58Op+oDLD0ubjlmXDMIKQwvvztvEV6diyaB+Duuuvb6lDHav9PISyRaO9dzzt8tOAQ==", "license": "MIT", "bin": { "jpr": "dist/index.js", @@ -10079,178 +10858,21 @@ "dotenv": "^16.3.1", "json-placeholder-replacer": "^1.0.35", "mqtt": "^4.3.8", + "test-things": "file:../../../..", "winston": "^3.14.2", "winston-loki": "^6.1.2" } }, - "things/calculator/mqtt/js/node_modules/bl": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "things/calculator/mqtt/js/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "things/calculator/mqtt/js/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "things/calculator/mqtt/js/node_modules/commist": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "leven": "^2.1.0", - "minimist": "^1.1.0" - } - }, - "things/calculator/mqtt/js/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "things/calculator/mqtt/js/node_modules/help-me": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "glob": "^7.1.6", - "readable-stream": "^3.6.0" - } - }, "things/calculator/mqtt/js/node_modules/json-placeholder-replacer": { "version": "1.0.37", + "resolved": "https://registry.npmjs.org/json-placeholder-replacer/-/json-placeholder-replacer-1.0.37.tgz", + "integrity": "sha512-Ix9Rpcp3UvkCULHrS2Wu58Op+oDLD0ubjlmXDMIKQwvvztvEV6diyaB+Duuuvb6lDHav9PISyRaO9dzzt8tOAQ==", "license": "MIT", "bin": { "jpr": "dist/index.js", "json-placeholder-replacer": "dist/index.js" } }, - "things/calculator/mqtt/js/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "things/calculator/mqtt/js/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "things/calculator/mqtt/js/node_modules/mqtt": { - "version": "4.3.8", - "license": "MIT", - "dependencies": { - "commist": "^1.0.0", - "concat-stream": "^2.0.0", - "debug": "^4.1.1", - "duplexify": "^4.1.1", - "help-me": "^3.0.0", - "inherits": "^2.0.3", - "lru-cache": "^6.0.0", - "minimist": "^1.2.5", - "mqtt-packet": "^6.8.0", - "number-allocator": "^1.0.9", - "pump": "^3.0.0", - "readable-stream": "^3.6.0", - "reinterval": "^1.1.0", - "rfdc": "^1.3.0", - "split2": "^3.1.0", - "ws": "^7.5.5", - "xtend": "^4.0.2" - }, - "bin": { - "mqtt": "bin/mqtt.js", - "mqtt_pub": "bin/pub.js", - "mqtt_sub": "bin/sub.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "things/calculator/mqtt/js/node_modules/mqtt-packet": { - "version": "6.10.0", - "license": "MIT", - "dependencies": { - "bl": "^4.0.2", - "debug": "^4.1.1", - "process-nextick-args": "^2.0.1" - } - }, - "things/calculator/mqtt/js/node_modules/split2": { - "version": "3.2.2", - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "things/calculator/mqtt/js/node_modules/ws": { - "version": "7.5.10", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "things/counter-thing": {}, "things/counter-thing/http/ts": { "name": "counter-thing", "version": "1.0.0", @@ -10258,6 +10880,7 @@ "@node-wot/binding-http": "0.8.16", "@node-wot/core": "0.8.16", "dotenv": "^16.0.3", + "test-things": "file:../../../..", "winston": "^3.8.2", "winston-loki": "^6.1.2" }, @@ -10269,16 +10892,20 @@ "typescript": "^5.0.4" } }, - "things/counter-thing/node_modules/@types/node": { - "version": "18.19.112", + "things/counter-thing/http/ts/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, - "things/counter-thing/node_modules/typescript": { - "version": "5.8.3", + "things/counter-thing/http/ts/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10289,11 +10916,6 @@ "node": ">=14.17" } }, - "things/counter-thing/node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, "things/data-schema-thing/http/ts": { "name": "http-data-schema-thing", "version": "1.0.0", @@ -10303,26 +10925,27 @@ "@node-wot/core": "0.8.16", "dotenv": "^16.4.5", "json-placeholder-replacer": "^2.0.5", + "test-things": "file:../../../..", "winston": "^3.14.2", "winston-loki": "^6.1.2", "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" }, "devDependencies": { "@types/debug": "^4.1.12", + "@types/node": "^18.0.0", "@types/node-fetch": "^2.6.11", "ts-node": "^10.9.2", "typescript": "^4.7.4" } }, - "things/data-schema-thing/http/ts/node_modules/wot-thing-description-types": { - "version": "1.1.0-09-November-2023", - "license": "W3C-20150513" - }, - "things/data-schema-thing/http/ts/node_modules/wot-typescript-definitions": { - "version": "0.8.0-SNAPSHOT.29", - "license": "W3C-20150513", + "things/data-schema-thing/http/ts/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "license": "MIT", "dependencies": { - "wot-thing-description-types": "1.1.0-09-November-2023" + "undici-types": "~5.26.4" } }, "things/elevator/modbus/js": { @@ -10335,11 +10958,14 @@ "json-placeholder-replacer": "^1.0.35", "modbus": "^1.1.1", "modbus-serial": "^8.0.11", - "serialport": "^11.0.0" + "serialport": "^11.0.0", + "test-things": "file:../../../.." } }, "things/elevator/modbus/js/node_modules/json-placeholder-replacer": { "version": "1.0.37", + "resolved": "https://registry.npmjs.org/json-placeholder-replacer/-/json-placeholder-replacer-1.0.37.tgz", + "integrity": "sha512-Ix9Rpcp3UvkCULHrS2Wu58Op+oDLD0ubjlmXDMIKQwvvztvEV6diyaB+Duuuvb6lDHav9PISyRaO9dzzt8tOAQ==", "license": "MIT", "bin": { "jpr": "dist/index.js", @@ -10352,10 +10978,11 @@ "dependencies": { "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-jaeger": "1.9.0", - "@opentelemetry/resources": "1.9.0", - "@opentelemetry/sdk-trace-node": "1.9.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-node": "1.26.0", "@opentelemetry/semantic-conventions": "1.9.0", "ajv": "^8.12.0", + "test-things": "file:..", "wot-thing-description-types": "^1.1.0-09-November-2023", "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" }, @@ -10363,17 +10990,6 @@ "@types/node": "^22.1.0", "typescript": "^4.7.4" } - }, - "util/node_modules/wot-thing-description-types": { - "version": "1.1.0-09-November-2023", - "license": "W3C-20150513" - }, - "util/node_modules/wot-typescript-definitions": { - "version": "0.8.0-SNAPSHOT.29", - "license": "W3C-20150513", - "dependencies": { - "wot-thing-description-types": "1.1.0-09-November-2023" - } } } } diff --git a/package.json b/package.json index 81cd36d..9b83d34 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,9 @@ "eslint-plugin-unused-imports": "^4.1.4", "eslint-plugin-workspaces": "^0.10.1", "mocha": "^10.7.3", - "prettier": "3.3.3" + "prettier": "^3.3.3" + }, + "dependencies": { + "test-things": "file:" } } diff --git a/scripts/installDependencies.sh b/scripts/installDependencies.sh index e761988..d404a86 100755 --- a/scripts/installDependencies.sh +++ b/scripts/installDependencies.sh @@ -3,6 +3,9 @@ # Install dependencies for npm workspaces packages npm ci +npm --workspace ./util run clean +npm --workspace ./util run build + # Install dependencies for non-npm packages for protocol_directory in things/*/*/* ; do current_path="$(pwd)" diff --git a/scripts/runTests.sh b/scripts/runTests.sh index ff8fdd8..0ceb49b 100755 --- a/scripts/runTests.sh +++ b/scripts/runTests.sh @@ -1,4 +1,5 @@ #!/bin/bash +export PATH="$HOME/.local/bin:$PATH" return_value=0 diff --git a/things/advanced-coffee-machine/advanced-coffee-machine.tm.json b/things/advanced-coffee-machine/advanced-coffee-machine.tm.json index 7891bb5..4a6f1c9 100644 --- a/things/advanced-coffee-machine/advanced-coffee-machine.tm.json +++ b/things/advanced-coffee-machine/advanced-coffee-machine.tm.json @@ -10,7 +10,7 @@ "title": "{{THING_NAME}}", "description": "A smart coffee machine with a range of capabilities.\\nA complementary tutorial is available at http: //www.thingweb.io/smart-coffee-machine.html.", "support": "https://github.com/eclipse-thingweb/node-wot/", - "base": "{{PROTOCOL}}://{{HOSTNAME}}:{{PORT_NUMBER}}/{{THING_NAME}}", + "base": "{{PROTOCOL}}://{{BASE_URI}}/{{THING_NAME}}", "properties": { "allAvailableResources": { "type": "object", diff --git a/things/advanced-coffee-machine/http/ts/Dockerfile b/things/advanced-coffee-machine/http/ts/Dockerfile index 068843f..5a0a1e8 100644 --- a/things/advanced-coffee-machine/http/ts/Dockerfile +++ b/things/advanced-coffee-machine/http/ts/Dockerfile @@ -11,11 +11,10 @@ COPY ./util ../util COPY ./things/advanced-coffee-machine/advanced-coffee-machine.tm.json ./ COPY ./things/advanced-coffee-machine/http/ts ./ -# Build util package first -RUN cd ../util && npm install --legacy-peer-deps && npm run build +RUN cd ../util && npm pkg delete dependencies.test-things && rm -f package-lock.json \ + && npm install --legacy-peer-deps && npm run build -# Install dependencies -RUN npm install --legacy-peer-deps +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install --legacy-peer-deps # Build the project RUN npm run build diff --git a/things/advanced-coffee-machine/http/ts/package.json b/things/advanced-coffee-machine/http/ts/package.json index 375d93b..67d6426 100644 --- a/things/advanced-coffee-machine/http/ts/package.json +++ b/things/advanced-coffee-machine/http/ts/package.json @@ -22,18 +22,19 @@ "dependencies": { "@node-wot/binding-http": "0.8.16", "@node-wot/core": "0.8.16", - "dotenv": "^16.4.5", - "json-placeholder-replacer": "^2.0.5", - "wot-typescript-definitions": "0.8.0-SNAPSHOT.29", "@opentelemetry/api": "1.9.0", - "@opentelemetry/sdk-trace-node": "1.9.0", "@opentelemetry/exporter-jaeger": "1.9.0", - "@opentelemetry/resources": "1.9.0", - "@opentelemetry/semantic-conventions": "1.9.0" + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-node": "1.26.0", + "@opentelemetry/semantic-conventions": "1.9.0", + "dotenv": "^16.4.5", + "json-placeholder-replacer": "^2.0.5", + "test-things": "file:../../../..", + "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" }, "devDependencies": { - "@types/node": "^22.1.0", "@types/debug": "^4.1.12", + "@types/node": "^22.1.0", "@types/node-fetch": "^2.6.11", "typescript": "^4.7.4" } diff --git a/things/advanced-coffee-machine/http/ts/src/main.ts b/things/advanced-coffee-machine/http/ts/src/main.ts index efc6387..ea14f6a 100644 --- a/things/advanced-coffee-machine/http/ts/src/main.ts +++ b/things/advanced-coffee-machine/http/ts/src/main.ts @@ -38,6 +38,15 @@ initTracing("advanced-coffee-machine"); const hostname = process.env.HOSTNAME ?? "localhost"; let portNumber = process.env.PORT != null && process.env.PORT !== "" ? parseInt(process.env.PORT) : 3000; const thingName = "http-advanced-coffee-machine"; +const protocol = (process.env.PROTOCOL ?? "https").toLowerCase(); +const defaultExternalPort = protocol === "http" ? 80 : 443; + +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : defaultExternalPort; + +const baseUri = externalPort === defaultExternalPort ? `${hostname}` : `${hostname}:${externalPort}`; let allAvailableResources: Record; let possibleDrinks: string[]; @@ -107,10 +116,9 @@ if (tmPath != null && tmPath !== "") { const placeholderReplacer = new JsonPlaceholderReplacer(); placeholderReplacer.addVariableMap({ - PROTOCOL: "http", + PROTOCOL: protocol, THING_NAME: thingName, - HOSTNAME: hostname, - PORT_NUMBER: portNumber, + BASE_URI: baseUri, }); let thingDescription = placeholderReplacer.replace(thingModel); @@ -122,7 +130,7 @@ thingDescription = { const servient = new Servient(); servient.addServer( new HttpServer({ - baseUri: `http://${hostname}:${portNumber}`, + baseUri: `${protocol}://${hostname}`, port: portNumber, }) ); diff --git a/things/advanced-coffee-machine/http/ts/test/client.test.ts b/things/advanced-coffee-machine/http/ts/test/client.test.ts index 4eaaf9b..e5bc93b 100644 --- a/things/advanced-coffee-machine/http/ts/test/client.test.ts +++ b/things/advanced-coffee-machine/http/ts/test/client.test.ts @@ -42,12 +42,14 @@ describe("Client Tests", () => { it("should read allAvailableResources property", async () => { const response = await thing.readProperty("allAvailableResources"); const value = await response.value(); - expect(value).to.be.eql({ - water: 100, - milk: 100, - chocolate: 100, - coffeeBeans: 100, - }); + expect(value).to.be.an("object"); + expect(value).to.have.keys("water", "milk", "chocolate", "coffeeBeans"); + + for (const resourceLevel of Object.values(value as Record)) { + expect(resourceLevel).to.be.a("number"); + expect(resourceLevel).to.be.at.least(0); + expect(resourceLevel).to.be.at.most(100); + } }); it("should change water level to 80", async () => { @@ -96,13 +98,24 @@ describe("Client Tests", () => { }); it("should subscribe to outOfResource event", async () => { - await thing.subscribeEvent("outOfResource", async (data) => { - const value = await data.value(); - expect(value).to.be.not.null; + let resolveEvent: (value: unknown) => void; + const eventReceived = new Promise((resolve) => { + resolveEvent = resolve; }); - await thing.invokeAction("makeDrink", undefined, { - uriVariables: { drinkId: "latte", size: "l", quantity: 1000 }, + const subscription = await thing.subscribeEvent("outOfResource", async (data) => { + resolveEvent(await data.value()); }); + + await thing.writeProperty("availableResourceLevel", 0, { uriVariables: { id: "water" } }); + + await expect( + thing.invokeAction("makeDrink", undefined, { + uriVariables: { drinkId: "latte", size: "l", quantity: 1 }, + }) + ).to.be.rejected; + + expect(await eventReceived).to.be.a("string"); + await subscription.stop(); }); }); diff --git a/things/advanced-coffee-machine/http/ts/test/fixtures.ts b/things/advanced-coffee-machine/http/ts/test/fixtures.ts index 2305582..237c501 100644 --- a/things/advanced-coffee-machine/http/ts/test/fixtures.ts +++ b/things/advanced-coffee-machine/http/ts/test/fixtures.ts @@ -20,10 +20,13 @@ import path from "path"; let thingProcess: ChildProcess | undefined; let response: ThingStartResponse; -export const port = 3000; +export const port = Number(process.env.TEST_PORT ?? 3010); export async function mochaGlobalSetup() { try { + process.env.PROTOCOL = "http"; + process.env.HOSTNAME = `localhost:${port}`; + delete process.env.EXTERNAL_PORT; response = await getInitiateMain("node", [path.join(__dirname, "..", "dist", "main.js"), "-p", `${port}`]); thingProcess = response.process; } catch (error: unknown) { diff --git a/things/advanced-coffee-machine/tm.test.js b/things/advanced-coffee-machine/tm.test.js index 34ffc5b..1225b03 100644 --- a/things/advanced-coffee-machine/tm.test.js +++ b/things/advanced-coffee-machine/tm.test.js @@ -10,21 +10,18 @@ describe("Advanced Coffee Machine", () => { let validate; before((done) => { - https.get( - "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/tm-json-schema-validation.json", - function (response) { - const body = []; - response.on("data", (chunk) => { - body.push(chunk); - }); + https.get("https://www.w3.org/2022/wot/tm-schema/v1.1", function (response) { + const body = []; + response.on("data", (chunk) => { + body.push(chunk); + }); - response.on("end", () => { - const tmSchema = JSON.parse(Buffer.concat(body).toString()); - validate = ajv.compile(tmSchema); - done(); - }); - } - ); + response.on("end", () => { + const tmSchema = JSON.parse(Buffer.concat(body).toString()); + validate = ajv.compile(tmSchema); + done(); + }); + }); }); it("should have a valid TM", () => { diff --git a/things/calculator/calculator.tm.json b/things/calculator/calculator.tm.json index f16156e..17c1562 100644 --- a/things/calculator/calculator.tm.json +++ b/things/calculator/calculator.tm.json @@ -15,7 +15,7 @@ } }, "security": ["nosec_sc"], - "base": "{{PROTOCOL}}://{{HOSTNAME}}:{{PORT_NUMBER}}/{{THING_NAME}}/", + "base": "{{PROTOCOL}}://{{HOSTNAME}}/{{THING_NAME}}/", "properties": { "result": { "type": "number", diff --git a/things/calculator/coap/js/.mocharc.json b/things/calculator/coap/js/.mocharc.json index 00d83c4..2d97f7a 100644 --- a/things/calculator/coap/js/.mocharc.json +++ b/things/calculator/coap/js/.mocharc.json @@ -1,5 +1,6 @@ { "exit": true, + "timeout": 5000, "spec": "./test/**.test.js", "require": ["./test/fixtures.js"] } diff --git a/things/calculator/coap/js/Dockerfile-contentneg b/things/calculator/coap/js/Dockerfile-contentneg index 33f8a24..44def0a 100644 --- a/things/calculator/coap/js/Dockerfile-contentneg +++ b/things/calculator/coap/js/Dockerfile-contentneg @@ -4,7 +4,8 @@ WORKDIR /app COPY ./calculator.tm.json . COPY ./coap/js . -RUN npm install +# The workspace-root "test-things" file: dependency resolves to "/" inside the image and crashes npm. +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install ENV TM_PATH="./calculator.tm.json" diff --git a/things/calculator/coap/js/Dockerfile-simple b/things/calculator/coap/js/Dockerfile-simple index 6f9bb69..1770861 100644 --- a/things/calculator/coap/js/Dockerfile-simple +++ b/things/calculator/coap/js/Dockerfile-simple @@ -4,7 +4,8 @@ WORKDIR /app COPY ./calculator.tm.json . COPY ./coap/js . -RUN npm install +# The workspace-root "test-things" file: dependency resolves to "/" inside the image and crashes npm. +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install ENV TM_PATH="./calculator.tm.json" diff --git a/things/calculator/coap/js/coap-content-negotiation-calculator.js b/things/calculator/coap/js/coap-content-negotiation-calculator.js index 5c01a78..937449b 100644 --- a/things/calculator/coap/js/coap-content-negotiation-calculator.js +++ b/things/calculator/coap/js/coap-content-negotiation-calculator.js @@ -48,11 +48,17 @@ if (process.platform === "win32") { const thingModel = JSON.parse(fs.readFileSync(path.join(__dirname, tmPath))); +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : portNumber; +const baseUri = hostname.includes(":") ? hostname : `${hostname}:${externalPort}`; + const placeholderReplacer = new JsonPlaceholderReplacer(); placeholderReplacer.addVariableMap({ PROTOCOL: "coap", THING_NAME: thingName, - HOSTNAME: hostname, + HOSTNAME: baseUri, PORT_NUMBER: portNumber, RESULT_OBSERVABLE: true, LAST_CHANGE_OBSERVABLE: true, diff --git a/things/calculator/coap/js/coap-simple-calculator.js b/things/calculator/coap/js/coap-simple-calculator.js index d91f9c0..0b1cd7a 100644 --- a/things/calculator/coap/js/coap-simple-calculator.js +++ b/things/calculator/coap/js/coap-simple-calculator.js @@ -47,11 +47,18 @@ if (process.platform === "win32") { const thingModel = JSON.parse(fs.readFileSync(path.join(__dirname, tmPath))); +// The TM's base has no port placeholder, so it has to be carried by the hostname. +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : portNumber; +const baseUri = hostname.includes(":") ? hostname : `${hostname}:${externalPort}`; + const placeholderReplacer = new JsonPlaceholderReplacer(); placeholderReplacer.addVariableMap({ PROTOCOL: "coap", THING_NAME: thingName, - HOSTNAME: hostname, + HOSTNAME: baseUri, PORT_NUMBER: portNumber, RESULT_OBSERVABLE: true, LAST_CHANGE_OBSERVABLE: true, diff --git a/things/calculator/coap/js/package.json b/things/calculator/coap/js/package.json index 8aac562..6396dc5 100644 --- a/things/calculator/coap/js/package.json +++ b/things/calculator/coap/js/package.json @@ -20,6 +20,7 @@ "cbor": "^9.0.2", "coap": "^1.3.0", "dotenv": "^16.3.1", - "json-placeholder-replacer": "^1.0.35" + "json-placeholder-replacer": "^1.0.35", + "test-things": "file:../../../.." } } diff --git a/things/calculator/http/express/Dockerfile-contentneg b/things/calculator/http/express/Dockerfile-contentneg index 0931992..a220258 100644 --- a/things/calculator/http/express/Dockerfile-contentneg +++ b/things/calculator/http/express/Dockerfile-contentneg @@ -4,7 +4,8 @@ WORKDIR /app COPY ./calculator.tm.json . COPY ./http/express . -RUN npm install +# The workspace-root "test-things" file: dependency resolves to "/" inside the image and crashes npm. +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install ENV TM_PATH="./calculator.tm.json" diff --git a/things/calculator/http/express/Dockerfile-simple b/things/calculator/http/express/Dockerfile-simple index e2e4f11..01d6640 100644 --- a/things/calculator/http/express/Dockerfile-simple +++ b/things/calculator/http/express/Dockerfile-simple @@ -4,7 +4,8 @@ WORKDIR /app COPY ./calculator.tm.json . COPY ./http/express . -RUN npm install +# The workspace-root "test-things" file: dependency resolves to "/" inside the image and crashes npm. +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install ENV TM_PATH="./calculator.tm.json" diff --git a/things/calculator/http/express/http-content-negotiation-calculator-thing.td.jsonld b/things/calculator/http/express/http-content-negotiation-calculator-thing.td.jsonld index 5790c7d..325b1bf 100644 --- a/things/calculator/http/express/http-content-negotiation-calculator-thing.td.jsonld +++ b/things/calculator/http/express/http-content-negotiation-calculator-thing.td.jsonld @@ -17,7 +17,7 @@ "security": [ "nosec_sc" ], - "base": "http://localhost:3001/http-express-calculator-content-negotiation/", + "base": "http://localhost:3013/http-express-calculator-content-negotiation/", "properties": { "result": { "type": "number", diff --git a/things/calculator/http/express/http-content-negotiation-calculator.js b/things/calculator/http/express/http-content-negotiation-calculator.js index d8fadf0..2980d7d 100644 --- a/things/calculator/http/express/http-content-negotiation-calculator.js +++ b/things/calculator/http/express/http-content-negotiation-calculator.js @@ -24,9 +24,29 @@ require("dotenv").config(); const app = express(); app.use(express.json({ strict: false })); +app.use((req, res, next) => { + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); + + if (req.method === "OPTIONS") { + res.sendStatus(204); + return; + } + + next(); +}); + const hostname = process.env.HOSTNAME ?? "localhost"; let portNumber = process.env.PORT ?? 3001; const thingName = "http-express-calculator-content-negotiation"; +const protocol = (process.env.PROTOCOL ?? "https").toLowerCase(); +const defaultExternalPort = protocol === "http" ? 80 : 443; +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : defaultExternalPort; +const baseUri = externalPort === defaultExternalPort ? `${hostname}` : `${hostname}:${externalPort}`; const TDEndPoint = `/${thingName}`; const resultEndPoint = `/${thingName}/properties/result`; @@ -76,9 +96,9 @@ const thingModel = JSON.parse(fs.readFileSync(path.join(__dirname, tmPath))); const placeholderReplacer = new JsonPlaceholderReplacer(); placeholderReplacer.addVariableMap({ - PROTOCOL: "http", + PROTOCOL: protocol, THING_NAME: thingName, - HOSTNAME: hostname, + HOSTNAME: baseUri, PORT_NUMBER: portNumber, RESULT_OBSERVABLE: true, LAST_CHANGE_OBSERVABLE: true, diff --git a/things/calculator/http/express/http-simple-calculator-thing.td.jsonld b/things/calculator/http/express/http-simple-calculator-thing.td.jsonld index ff984bd..9d5ecac 100644 --- a/things/calculator/http/express/http-simple-calculator-thing.td.jsonld +++ b/things/calculator/http/express/http-simple-calculator-thing.td.jsonld @@ -17,7 +17,7 @@ "security": [ "nosec_sc" ], - "base": "http://localhost:3000/http-express-calculator-simple/", + "base": "http://localhost:3012/http-express-calculator-simple/", "properties": { "result": { "type": "number", diff --git a/things/calculator/http/express/http-simple-calculator.js b/things/calculator/http/express/http-simple-calculator.js index 1212b63..f55f0c9 100644 --- a/things/calculator/http/express/http-simple-calculator.js +++ b/things/calculator/http/express/http-simple-calculator.js @@ -26,9 +26,31 @@ const LokiTransport = require("winston-loki"); const app = express(); app.use(express.json({ strict: false })); +app.use((req, res, next) => { + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); + + if (req.method === "OPTIONS") { + res.sendStatus(204); + return; + } + + next(); +}); + const hostname = process.env.HOSTNAME ?? "localhost"; let portNumber = process.env.PORT ?? 3000; const thingName = "http-express-calculator-simple"; +const protocol = (process.env.PROTOCOL ?? "https").toLowerCase(); +const defaultExternalPort = protocol === "http" ? 80 : 443; + +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : defaultExternalPort; + +const baseUri = externalPort === defaultExternalPort ? `${hostname}` : `${hostname}:${externalPort}`; const logger = createLogger({ transports: [ @@ -91,10 +113,9 @@ const thingModel = JSON.parse(fs.readFileSync(path.join(__dirname, tmPath))); const placeholderReplacer = new JsonPlaceholderReplacer(); placeholderReplacer.addVariableMap({ - PROTOCOL: "http", + PROTOCOL: protocol, THING_NAME: thingName, - HOSTNAME: hostname, - PORT_NUMBER: portNumber, + HOSTNAME: baseUri, RESULT_OBSERVABLE: true, LAST_CHANGE_OBSERVABLE: true, }); diff --git a/things/calculator/http/express/package.json b/things/calculator/http/express/package.json index d33934a..acfd27e 100644 --- a/things/calculator/http/express/package.json +++ b/things/calculator/http/express/package.json @@ -24,6 +24,7 @@ "eventsource": "^2.0.2", "express": "^4.18.2", "json-placeholder-replacer": "^1.0.35", + "test-things": "file:../../../..", "winston": "^3.14.2", "winston-loki": "^6.1.2" }, diff --git a/things/calculator/http/express/test/fixtures.js b/things/calculator/http/express/test/fixtures.js index 231eeb9..410804d 100644 --- a/things/calculator/http/express/test/fixtures.js +++ b/things/calculator/http/express/test/fixtures.js @@ -19,11 +19,14 @@ const path = require("node:path"); let simpleThingProcess; let contentNegotiationThingProcess; let response; -const simplePort = 3000; -const contentNegotiationPort = 3001; +const simplePort = Number(process.env.TEST_PORT_SIMPLE ?? 3012); +const contentNegotiationPort = Number(process.env.TEST_PORT_CONTENT_NEGOTIATION ?? 3013); const mochaGlobalSetup = async function () { try { + process.env.PROTOCOL = "http"; + process.env.HOSTNAME = `localhost:${simplePort}`; + delete process.env.EXTERNAL_PORT; response = await getInitiateMain("node", [ path.join(__dirname, "..", "http-simple-calculator.js"), "-p", @@ -36,6 +39,9 @@ const mochaGlobalSetup = async function () { } try { + process.env.PROTOCOL = "http"; + process.env.HOSTNAME = `localhost:${contentNegotiationPort}`; + delete process.env.EXTERNAL_PORT; response = await getInitiateMain("node", [ path.join(__dirname, "..", "http-content-negotiation-calculator.js"), "-p", diff --git a/things/calculator/http/flask/main.py b/things/calculator/http/flask/main.py index eac0e01..7dc194f 100644 --- a/things/calculator/http/flask/main.py +++ b/things/calculator/http/flask/main.py @@ -18,15 +18,25 @@ log = logging.getLogger('werkzeug') log.disabled = True +@app.after_request +def add_cors_headers(response): + response.headers["Access-Control-Allow-Origin"] = "*" + response.headers["Access-Control-Allow-Methods"] = "GET,POST,OPTIONS" + response.headers["Access-Control-Allow-Headers"] = "Content-Type, Accept, Authorization" + return response + +@app.before_request +def handle_preflight(): + if request.method == "OPTIONS": + return ("", 204) + cli = sys.modules['flask.cli'] cli.show_server_banner = lambda *x: click.echo("ThingIsReady") -hostname = "0.0.0.0" portNumber = 5000 - -if "HOSTNAME" in os.environ: - hostname = os.environ["HOSTNAME"] +protocol = os.getenv("PROTOCOL", "https").lower() +hostname = os.getenv("HOSTNAME", "0.0.0.0") if "PORT" in os.environ: portNumber = os.environ["PORT"] @@ -43,7 +53,7 @@ thingModel["@type"] = 'Thing' thingModel = json.dumps(thingModel) -thingModel = thingModel.replace('{{PROTOCOL}}', 'http') +thingModel = thingModel.replace('{{PROTOCOL}}', protocol) thingModel = thingModel.replace('{{HOSTNAME}}', hostname) thingModel = thingModel.replace('{{PROPERTIES}}', PROPERTIES) thingModel = thingModel.replace('{{ACTIONS}}', ACTIONS) @@ -158,4 +168,4 @@ def stream(): port = 5000 if __name__ == "__main__": - app.run(debug=False, host=hostname, port=port) + app.run(debug=False, host="0.0.0.0", port=port) diff --git a/things/calculator/http/flask/test/td.test.js b/things/calculator/http/flask/test/td.test.js index 6693c0e..3f791fb 100644 --- a/things/calculator/http/flask/test/td.test.js +++ b/things/calculator/http/flask/test/td.test.js @@ -15,7 +15,9 @@ let thingProcess; describe("Calculator HTTP Flask", () => { let validate; - before(async () => { + before(async function () { + this.timeout(30000); + const initiateMain = new Promise(async (resolve, reject) => { thingProcess = spawn("poetry", ["run", "python", "main.py"], { cwd: path.join(__dirname, ".."), @@ -37,21 +39,18 @@ describe("Calculator HTTP Flask", () => { }); const getJSONSchema = new Promise((resolve, reject) => { - https.get( - "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/td-json-schema-validation.json", - function (response) { - const body = []; - response.on("data", (chunk) => { - body.push(chunk); - }); + https.get("https://www.w3.org/2022/wot/td-schema/v1.1", function (response) { + const body = []; + response.on("data", (chunk) => { + body.push(chunk); + }); - response.on("end", () => { - const tdSchema = JSON.parse(Buffer.concat(body).toString()); - validate = ajv.compile(tdSchema); - resolve("Success"); - }); - } - ); + response.on("end", () => { + const tdSchema = JSON.parse(Buffer.concat(body).toString()); + validate = ajv.compile(tdSchema); + resolve("Success"); + }); + }); }); await Promise.all([initiateMain, getJSONSchema]).then((data) => { diff --git a/things/calculator/mqtt/js/Dockerfile b/things/calculator/mqtt/js/Dockerfile index 09e09b6..bcf94ef 100644 --- a/things/calculator/mqtt/js/Dockerfile +++ b/things/calculator/mqtt/js/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./calculator.tm.json . COPY ./mqtt/js . -RUN npm install +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install ENV TM_PATH="./calculator.tm.json" diff --git a/things/calculator/mqtt/js/main.js b/things/calculator/mqtt/js/main.js index a5cbd9f..14944dc 100644 --- a/things/calculator/mqtt/js/main.js +++ b/things/calculator/mqtt/js/main.js @@ -23,8 +23,8 @@ require("dotenv").config(); const { createLogger, transports, format } = require("winston"); const LokiTransport = require("winston-loki"); -const brokerURI = process.env.BROKER_URI ?? "test.mosquitto.org"; -let portNumber = process.env.PORT ?? 1883; +const brokerURI = process.env.BROKER_URI ?? "plugfest.thingweb.io"; +let portNumber = process.env.PORT ?? 8087; const { values: { port }, @@ -148,6 +148,17 @@ broker.on("connect", () => { broker.subscribe(`${thingName}/${ACTIONS}/add`); broker.subscribe(`${thingName}/${ACTIONS}/subtract`); broker.subscribe(`${thingName}/${EVENTS}/update`); + + broker.publish(`${thingName}`, JSON.stringify(thingDescription), { retain: true }, () => { + console.log("ThingIsReady"); + }); +}); + +broker.on("error", (error) => { + console.log(`Cannot connect to broker mqtt://${brokerURI}:${portNumber} - ${error.message}`); + broker.end(true, {}, () => { + process.exit(1); + }); }); const setResult = (value) => { @@ -295,8 +306,3 @@ broker.on("message", (topic, payload, packet) => { setInterval(() => { broker.publish(`${thingName}/${EVENTS}/update`, "Updated the thing!"); }, 500); - -broker.publish(`${thingName}`, JSON.stringify(thingDescription), { - retain: true, -}); -console.log("ThingIsReady"); diff --git a/things/calculator/mqtt/js/mqtt-calculator.td.json b/things/calculator/mqtt/js/mqtt-calculator.td.json index b10141c..a9d78ef 100644 --- a/things/calculator/mqtt/js/mqtt-calculator.td.json +++ b/things/calculator/mqtt/js/mqtt-calculator.td.json @@ -15,7 +15,7 @@ } }, "security": ["nosec_sc"], - "base": "mqtt://test.mosquitto.org:1883/mqtt-calculator/", + "base": "mqtt://localhost/mqtt-calculator/", "properties": { "result": { "type": "number", diff --git a/things/calculator/mqtt/js/package.json b/things/calculator/mqtt/js/package.json index bf2f167..dd35422 100644 --- a/things/calculator/mqtt/js/package.json +++ b/things/calculator/mqtt/js/package.json @@ -20,6 +20,7 @@ "dotenv": "^16.3.1", "json-placeholder-replacer": "^1.0.35", "mqtt": "^4.3.8", + "test-things": "file:../../../..", "winston": "^3.14.2", "winston-loki": "^6.1.2" } diff --git a/things/calculator/mqtt/js/test/fixtures.js b/things/calculator/mqtt/js/test/fixtures.js index e7bcdff..83fa21a 100644 --- a/things/calculator/mqtt/js/test/fixtures.js +++ b/things/calculator/mqtt/js/test/fixtures.js @@ -15,10 +15,12 @@ const { getInitiateMain } = require("../../../../../util/dist/util"); const path = require("node:path"); +require("dotenv").config(); let thingProcess; let response; -const port = 1883; +const port = Number(process.env.BROKER_PORT ?? 8087); +const brokerURI = process.env.BROKER_URI ?? "plugfest.thingweb.io"; exports.mochaGlobalSetup = async function () { try { @@ -35,3 +37,6 @@ exports.mochaGlobalTeardown = function () { thingProcess.kill(); } }; + +exports.port = port; +exports.brokerURI = brokerURI; diff --git a/things/calculator/mqtt/js/test/td.test.js b/things/calculator/mqtt/js/test/td.test.js index ea6b69c..0e5fcd8 100644 --- a/things/calculator/mqtt/js/test/td.test.js +++ b/things/calculator/mqtt/js/test/td.test.js @@ -16,10 +16,10 @@ const chai = require("chai"); const mqtt = require("mqtt"); const { getTDValidate } = require("../../../../../util/dist/util"); -const { port } = require("./fixtures"); +const { port, brokerURI } = require("./fixtures"); const expect = chai.expect; -const hostname = "test.mosquitto.org"; +const hostname = brokerURI; describe("Calculator MQTT JS", () => { let validate; @@ -37,18 +37,27 @@ describe("Calculator MQTT JS", () => { it("should have a valid TD", (done) => { const broker = mqtt.connect(`mqtt://${hostname}`, { port }); - broker.subscribe("mqtt-calculator"); + console.log(`Connecting to MQTT broker at mqtt://${hostname}:${port}`); - let valid = false; + broker.on("connect", () => { + broker.subscribe("mqtt-calculator"); + }); - broker.on("message", (topic, payload, packet) => { - valid = validate(JSON.parse(payload.toString())); - broker.end(); + broker.on("message", (topic, payload) => { + const valid = validate(JSON.parse(payload.toString())); + broker.end(false, {}, () => { + try { + expect(valid, JSON.stringify(validate.errors)).to.be.true; + done(); + } catch (error) { + done(error); + } + }); }); - broker.on("close", () => { - expect(valid).to.be.true; - done(); + broker.on("error", (error) => { + broker.end(true); + done(error); }); }); }); diff --git a/things/calculator/tm.test.js b/things/calculator/tm.test.js index 48f9c5a..6cf371e 100644 --- a/things/calculator/tm.test.js +++ b/things/calculator/tm.test.js @@ -10,21 +10,18 @@ describe("Calculator", () => { let validate; before((done) => { - https.get( - "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/tm-json-schema-validation.json", - function (response) { - const body = []; - response.on("data", (chunk) => { - body.push(chunk); - }); + https.get("https://www.w3.org/2022/wot/tm-schema/v1.1", function (response) { + const body = []; + response.on("data", (chunk) => { + body.push(chunk); + }); - response.on("end", () => { - const tmSchema = JSON.parse(Buffer.concat(body).toString()); - validate = ajv.compile(tmSchema); - done(); - }); - } - ); + response.on("end", () => { + const tmSchema = JSON.parse(Buffer.concat(body).toString()); + validate = ajv.compile(tmSchema); + done(); + }); + }); }); it("should have a valid TM", () => { diff --git a/things/counter-thing/http/ts/Dockerfile b/things/counter-thing/http/ts/Dockerfile index 825e80f..14da1c3 100644 --- a/things/counter-thing/http/ts/Dockerfile +++ b/things/counter-thing/http/ts/Dockerfile @@ -5,8 +5,7 @@ WORKDIR /app # Copy package files COPY ./http/ts/package*.json ./ -# Install dependencies -RUN npm install +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install --include=dev # Copy source code COPY ./http/ts . diff --git a/things/counter-thing/http/ts/counter-thing.td.json b/things/counter-thing/http/ts/counter-thing.td.json index ead7996..8ee77dc 100644 --- a/things/counter-thing/http/ts/counter-thing.td.json +++ b/things/counter-thing/http/ts/counter-thing.td.json @@ -3,6 +3,7 @@ "title": "Counter", "description": "Counter example Thing", "support": "https://github.com/eclipse-thingweb/node-wot/", + "base": "https://plugfest.thingweb.io:3000/counter/", "links": [ { "href": "https://www.thingweb.io/img/favicon/favicon.png", @@ -27,7 +28,7 @@ "readOnly": true, "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/properties/count" + "href": "properties/count" } ] }, @@ -42,7 +43,7 @@ }, "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/properties/countAsImage", + "href": "properties/countAsImage", "contentType": "image/svg+xml" } ] @@ -53,7 +54,7 @@ "readOnly": true, "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/properties/redDotImage", + "href": "properties/redDotImage", "contentType": "image/png;base64" } ] @@ -66,7 +67,7 @@ "readOnly": true, "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/properties/lastChange" + "href": "properties/lastChange" } ] } @@ -77,7 +78,7 @@ "description": "Increment counter value", "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/actions/increment" + "href": "actions/increment" } ] }, @@ -86,7 +87,7 @@ "description": "Decrementing counter value", "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/actions/decrement" + "href": "actions/decrement" } ] }, @@ -95,7 +96,7 @@ "description": "Resetting counter value", "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/actions/reset" + "href": "actions/reset" } ] } @@ -106,7 +107,7 @@ "description": "Change event", "forms": [ { - "href": "http://plugfest.thingweb.io/counter-thing/events/change" + "href": "events/change" } ] } diff --git a/things/counter-thing/http/ts/package-lock.json b/things/counter-thing/http/ts/package-lock.json index 1570f86..1871846 100644 --- a/things/counter-thing/http/ts/package-lock.json +++ b/things/counter-thing/http/ts/package-lock.json @@ -11,6 +11,7 @@ "@node-wot/binding-http": "0.8.16", "@node-wot/core": "0.8.16", "dotenv": "^16.0.3", + "test-things": "file:../../../..", "winston": "^3.8.2", "winston-loki": "^6.1.2" }, @@ -22,6 +23,43 @@ "typescript": "^5.0.4" } }, + "../../../..": { + "name": "test-things", + "license": "EPL-2.0 OR W3C-20150513", + "workspaces": [ + "./util", + "./mashups/*", + "./things/*/*/*" + ], + "dependencies": { + "test-things": "file:" + }, + "devDependencies": { + "@node-wot/binding-http": "~0.8.16", + "@node-wot/core": "~0.8.16", + "@types/chai": "^4.3.17", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^10.0.7", + "@types/node": "^22.4.1", + "@typescript-eslint/eslint-plugin": "^8.6.0", + "@typescript-eslint/parser": "^8.6.0", + "ajv": "^8.12.0", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.1", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-n": "^16.6.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-notice": "^1.0.0", + "eslint-plugin-promise": "^6.6.0", + "eslint-plugin-unused-imports": "^4.1.4", + "eslint-plugin-workspaces": "^0.10.1", + "mocha": "^10.7.3", + "prettier": "3.3.3" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -1627,6 +1665,10 @@ "node": ">=0.10.0" } }, + "node_modules/test-things": { + "resolved": "../../../..", + "link": true + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", diff --git a/things/counter-thing/http/ts/package.json b/things/counter-thing/http/ts/package.json index a92818c..c09c022 100644 --- a/things/counter-thing/http/ts/package.json +++ b/things/counter-thing/http/ts/package.json @@ -12,12 +12,13 @@ "@node-wot/binding-http": "0.8.16", "@node-wot/core": "0.8.16", "dotenv": "^16.0.3", + "test-things": "file:../../../..", "winston": "^3.8.2", "winston-loki": "^6.1.2" }, "devDependencies": { - "@types/node": "^18.15.11", "@types/debug": "^4.1.12", + "@types/node": "^18.15.11", "@types/node-fetch": "^2.6.11", "ts-node": "^10.9.1", "typescript": "^5.0.4" diff --git a/things/counter-thing/http/ts/src/main.ts b/things/counter-thing/http/ts/src/main.ts index 32e594e..42a6e8b 100644 --- a/things/counter-thing/http/ts/src/main.ts +++ b/things/counter-thing/http/ts/src/main.ts @@ -27,6 +27,15 @@ dotenv.config(); const hostname = process.env.HOSTNAME ?? "localhost"; let portNumber = process.env.PORT != null && process.env.PORT !== "" ? parseInt(process.env.PORT) : 3000; const thingName = "counter"; +const protocol = (process.env.PROTOCOL ?? "https").toLowerCase(); +const defaultExternalPort = protocol === "http" ? 80 : 443; + +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : defaultExternalPort; + +const baseUri = externalPort === defaultExternalPort ? `${hostname}` : `${hostname}:${externalPort}`; const logger = createLogger({ transports: [ @@ -89,12 +98,13 @@ const setLastChange = (value: string) => { }; const thingDescription = JSON.parse(fs.readFileSync(path.join(__dirname, "../../counter-thing.td.json"), "utf8")); +thingDescription.base = `${protocol}://${baseUri}/${thingName}/`; // Create Servient and add HTTP binding with port configuration const servient = new Servient(); servient.addServer( new HttpServer({ - baseUri: `http://${hostname}:${portNumber}`, + baseUri: `${protocol}://${hostname}:${portNumber}`, port: portNumber, }) ); diff --git a/things/data-schema-thing/data-schema-thing.tm.json b/things/data-schema-thing/data-schema-thing.tm.json index 4d506d3..5feb0cf 100644 --- a/things/data-schema-thing/data-schema-thing.tm.json +++ b/things/data-schema-thing/data-schema-thing.tm.json @@ -9,7 +9,7 @@ "@type": "tm:ThingModel", "title": "{{THING_NAME}}", "description": "Test Thing", - "base": "{{PROTOCOL}}://{{HOSTNAME}}:{{PORT_NUMBER}}/{{THING_NAME}}", + "base": "{{PROTOCOL}}://{{BASE_URI}}/{{THING_NAME}}", "properties": { "bool": { "title": "Boolean", diff --git a/things/data-schema-thing/http/ts/Dockerfile b/things/data-schema-thing/http/ts/Dockerfile index c67cae8..86d0321 100644 --- a/things/data-schema-thing/http/ts/Dockerfile +++ b/things/data-schema-thing/http/ts/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./data-schema-thing.tm.json . COPY ./http/ts . -RUN npm install +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install RUN npm run build diff --git a/things/data-schema-thing/http/ts/http-data-schema-thing.td.json b/things/data-schema-thing/http/ts/http-data-schema-thing.td.json index ac0d7f1..76061c1 100644 --- a/things/data-schema-thing/http/ts/http-data-schema-thing.td.json +++ b/things/data-schema-thing/http/ts/http-data-schema-thing.td.json @@ -21,12 +21,12 @@ "type": "boolean", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties/bool", + "href": "http://localhost:3011/http-data-schema-thing/properties/bool", "contentType": "application/json", "op": ["readproperty", "writeproperty"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties/bool", + "href": "http://localhost:3011/http-data-schema-thing/properties/bool", "contentType": "application/cbor", "op": ["readproperty", "writeproperty"] } @@ -41,12 +41,12 @@ "type": "integer", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties/int", + "href": "http://localhost:3011/http-data-schema-thing/properties/int", "contentType": "application/json", "op": ["readproperty", "writeproperty"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties/int", + "href": "http://localhost:3011/http-data-schema-thing/properties/int", "contentType": "application/cbor", "op": ["readproperty", "writeproperty"] } @@ -61,12 +61,12 @@ "type": "number", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties/num", + "href": "http://localhost:3011/http-data-schema-thing/properties/num", "contentType": "application/json", "op": ["readproperty", "writeproperty"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties/num", + "href": "http://localhost:3011/http-data-schema-thing/properties/num", "contentType": "application/cbor", "op": ["readproperty", "writeproperty"] } @@ -81,12 +81,12 @@ "type": "string", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties/string", + "href": "http://localhost:3011/http-data-schema-thing/properties/string", "contentType": "application/json", "op": ["readproperty", "writeproperty"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties/string", + "href": "http://localhost:3011/http-data-schema-thing/properties/string", "contentType": "application/cbor", "op": ["readproperty", "writeproperty"] } @@ -102,12 +102,12 @@ "items": {}, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties/array", + "href": "http://localhost:3011/http-data-schema-thing/properties/array", "contentType": "application/json", "op": ["readproperty", "writeproperty"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties/array", + "href": "http://localhost:3011/http-data-schema-thing/properties/array", "contentType": "application/cbor", "op": ["readproperty", "writeproperty"] } @@ -134,12 +134,12 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties/object", + "href": "http://localhost:3011/http-data-schema-thing/properties/object", "contentType": "application/json", "op": ["readproperty", "writeproperty"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties/object", + "href": "http://localhost:3011/http-data-schema-thing/properties/object", "contentType": "application/cbor", "op": ["readproperty", "writeproperty"] } @@ -155,13 +155,13 @@ "description": "Action without input nor output", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/void-void", + "href": "http://localhost:3011/http-data-schema-thing/actions/void-void", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/void-void", + "href": "http://localhost:3011/http-data-schema-thing/actions/void-void", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -175,13 +175,13 @@ "description": "Action without input, but with integer output", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/void-int", + "href": "http://localhost:3011/http-data-schema-thing/actions/void-int", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/void-int", + "href": "http://localhost:3011/http-data-schema-thing/actions/void-int", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -198,13 +198,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/int-void", + "href": "http://localhost:3011/http-data-schema-thing/actions/int-void", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/int-void", + "href": "http://localhost:3011/http-data-schema-thing/actions/int-void", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -224,13 +224,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/int-int", + "href": "http://localhost:3011/http-data-schema-thing/actions/int-int", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/int-int", + "href": "http://localhost:3011/http-data-schema-thing/actions/int-int", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -250,13 +250,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/int-string", + "href": "http://localhost:3011/http-data-schema-thing/actions/int-string", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/int-string", + "href": "http://localhost:3011/http-data-schema-thing/actions/int-string", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -282,13 +282,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/void-obj", + "href": "http://localhost:3011/http-data-schema-thing/actions/void-obj", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/void-obj", + "href": "http://localhost:3011/http-data-schema-thing/actions/void-obj", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -314,13 +314,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/actions/obj-void", + "href": "http://localhost:3011/http-data-schema-thing/actions/obj-void", "contentType": "application/json", "op": ["invokeaction"], "htv:methodName": "POST" }, { - "href": "http://localhost:3000/http-data-schema-thing/actions/obj-void", + "href": "http://localhost:3011/http-data-schema-thing/actions/obj-void", "contentType": "application/cbor", "op": ["invokeaction"], "htv:methodName": "POST" @@ -339,13 +339,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/events/on-bool", + "href": "http://localhost:3011/http-data-schema-thing/events/on-bool", "contentType": "application/json", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] }, { - "href": "http://localhost:3000/http-data-schema-thing/events/on-bool", + "href": "http://localhost:3011/http-data-schema-thing/events/on-bool", "contentType": "application/cbor", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] @@ -360,13 +360,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/events/on-int", + "href": "http://localhost:3011/http-data-schema-thing/events/on-int", "contentType": "application/json", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] }, { - "href": "http://localhost:3000/http-data-schema-thing/events/on-int", + "href": "http://localhost:3011/http-data-schema-thing/events/on-int", "contentType": "application/cbor", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] @@ -381,13 +381,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/events/on-num", + "href": "http://localhost:3011/http-data-schema-thing/events/on-num", "contentType": "application/json", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] }, { - "href": "http://localhost:3000/http-data-schema-thing/events/on-num", + "href": "http://localhost:3011/http-data-schema-thing/events/on-num", "contentType": "application/cbor", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] @@ -402,13 +402,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/events/on-string", + "href": "http://localhost:3011/http-data-schema-thing/events/on-string", "contentType": "application/json", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] }, { - "href": "http://localhost:3000/http-data-schema-thing/events/on-string", + "href": "http://localhost:3011/http-data-schema-thing/events/on-string", "contentType": "application/cbor", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] @@ -423,13 +423,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/events/on-array", + "href": "http://localhost:3011/http-data-schema-thing/events/on-array", "contentType": "application/json", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] }, { - "href": "http://localhost:3000/http-data-schema-thing/events/on-array", + "href": "http://localhost:3011/http-data-schema-thing/events/on-array", "contentType": "application/cbor", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] @@ -444,13 +444,13 @@ }, "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/events/on-object", + "href": "http://localhost:3011/http-data-schema-thing/events/on-object", "contentType": "application/json", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] }, { - "href": "http://localhost:3000/http-data-schema-thing/events/on-object", + "href": "http://localhost:3011/http-data-schema-thing/events/on-object", "contentType": "application/cbor", "subprotocol": "longpoll", "op": ["subscribeevent", "unsubscribeevent"] @@ -458,17 +458,17 @@ ] } }, - "id": "urn:uuid:f7de1594-ac8b-40cb-8bdf-5e29d0aa22ab", + "id": "urn:uuid:c50875c1-349b-4677-8ef3-e211f8d4ac0b", "description": "Test Thing", - "base": "http://localhost:3000/http-data-schema-thing", + "base": "http://localhost:3011/http-data-schema-thing", "forms": [ { - "href": "http://localhost:3000/http-data-schema-thing/properties", + "href": "http://localhost:3011/http-data-schema-thing/properties", "contentType": "application/json", "op": ["readallproperties", "readmultipleproperties", "writeallproperties", "writemultipleproperties"] }, { - "href": "http://localhost:3000/http-data-schema-thing/properties", + "href": "http://localhost:3011/http-data-schema-thing/properties", "contentType": "application/cbor", "op": ["readallproperties", "readmultipleproperties", "writeallproperties", "writemultipleproperties"] } diff --git a/things/data-schema-thing/http/ts/package.json b/things/data-schema-thing/http/ts/package.json index 1b883d8..c349c77 100644 --- a/things/data-schema-thing/http/ts/package.json +++ b/things/data-schema-thing/http/ts/package.json @@ -22,14 +22,16 @@ "@node-wot/core": "0.8.16", "dotenv": "^16.4.5", "json-placeholder-replacer": "^2.0.5", - "wot-typescript-definitions": "0.8.0-SNAPSHOT.29", + "test-things": "file:../../../..", "winston": "^3.14.2", - "winston-loki": "^6.1.2" + "winston-loki": "^6.1.2", + "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" }, "devDependencies": { - "ts-node": "^10.9.2", - "typescript": "^4.7.4", "@types/debug": "^4.1.12", - "@types/node-fetch": "^2.6.11" + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.11", + "ts-node": "^10.9.2", + "typescript": "^4.7.4" } } diff --git a/things/data-schema-thing/http/ts/src/main.ts b/things/data-schema-thing/http/ts/src/main.ts index 2606828..da65fe5 100644 --- a/things/data-schema-thing/http/ts/src/main.ts +++ b/things/data-schema-thing/http/ts/src/main.ts @@ -28,6 +28,15 @@ dotenv.config(); const hostname = process.env.HOSTNAME ?? "localhost"; let portNumber = process.env.PORT != null && process.env.PORT !== "" ? parseInt(process.env.PORT) : 3000; const thingName = "http-data-schema-thing"; +const protocol = (process.env.PROTOCOL ?? "https").toLowerCase(); +const defaultExternalPort = protocol === "http" ? 80 : 443; + +const externalPort = + process.env.EXTERNAL_PORT != null && process.env.EXTERNAL_PORT !== "" + ? parseInt(process.env.EXTERNAL_PORT) + : defaultExternalPort; + +const baseUri = externalPort === defaultExternalPort ? `${hostname}` : `${hostname}:${externalPort}`; const logger = createLogger({ transports: [ @@ -91,10 +100,9 @@ if (tmPath != null && tmPath !== "") { const placeholderReplacer = new JsonPlaceholderReplacer(); placeholderReplacer.addVariableMap({ - PROTOCOL: "http", + PROTOCOL: protocol, THING_NAME: thingName, - HOSTNAME: hostname, - PORT_NUMBER: portNumber, + BASE_URI: baseUri, }); let thingDescription = placeholderReplacer.replace(thingModel); @@ -203,7 +211,7 @@ setObject({ id: 123, name: "abc" }); const servient = new Servient(); servient.addServer( new HttpServer({ - baseUri: `http://${hostname}:${portNumber}`, + baseUri: `${protocol}://${hostname}`, port: portNumber, }) ); diff --git a/things/data-schema-thing/http/ts/test/fixtures.ts b/things/data-schema-thing/http/ts/test/fixtures.ts index 9560980..cc4021c 100644 --- a/things/data-schema-thing/http/ts/test/fixtures.ts +++ b/things/data-schema-thing/http/ts/test/fixtures.ts @@ -19,16 +19,19 @@ import { getInitiateMain, ThingStartResponse } from "../../../../../util/util"; import path from "path"; let thingProcess: ChildProcess | undefined; -let response: ThingStartResponse; -export const port = 3000; +let response: ThingStartResponse | undefined; +export const port = Number(process.env.TEST_PORT ?? 3011); export async function mochaGlobalSetup() { try { + process.env.PROTOCOL = "http"; + process.env.HOSTNAME = `localhost:${port}`; + delete process.env.EXTERNAL_PORT; response = await getInitiateMain("node", [path.join(__dirname, "..", "dist", "main.js"), "-p", `${port}`]); } catch (error) { console.log(error); } finally { - thingProcess = response.process; + thingProcess = response?.process; } } diff --git a/things/data-schema-thing/tm.test.js b/things/data-schema-thing/tm.test.js index 1efa70c..c1eb72a 100644 --- a/things/data-schema-thing/tm.test.js +++ b/things/data-schema-thing/tm.test.js @@ -10,21 +10,18 @@ describe("Test Thing", () => { let validate; before((done) => { - https.get( - "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/tm-json-schema-validation.json", - function (response) { - const body = []; - response.on("data", (chunk) => { - body.push(chunk); - }); + https.get("https://www.w3.org/2022/wot/tm-schema/v1.1", function (response) { + const body = []; + response.on("data", (chunk) => { + body.push(chunk); + }); - response.on("end", () => { - const tmSchema = JSON.parse(Buffer.concat(body).toString()); - validate = ajv.compile(tmSchema); - done(); - }); - } - ); + response.on("end", () => { + const tmSchema = JSON.parse(Buffer.concat(body).toString()); + validate = ajv.compile(tmSchema); + done(); + }); + }); }); it("should have a valid TM", () => { diff --git a/things/elevator/modbus/js/Dockerfile b/things/elevator/modbus/js/Dockerfile index 3547d51..df7dc3a 100644 --- a/things/elevator/modbus/js/Dockerfile +++ b/things/elevator/modbus/js/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY ./elevator.tm.json . COPY ./modbus/js . -RUN npm install +RUN npm pkg delete dependencies.test-things && rm -f package-lock.json && npm install ENV TM_PATH="./elevator.tm.json" diff --git a/things/elevator/modbus/js/package.json b/things/elevator/modbus/js/package.json index 9e58152..85d37fc 100644 --- a/things/elevator/modbus/js/package.json +++ b/things/elevator/modbus/js/package.json @@ -17,11 +17,12 @@ "author": "Eclipse Thingweb (https://thingweb.io/)", "license": "EPL-2.0 OR W3C-20150513", "dependencies": { + "@node-wot/binding-modbus": "~0.8.16", + "dotenv": "^16.3.1", "json-placeholder-replacer": "^1.0.35", "modbus": "^1.1.1", "modbus-serial": "^8.0.11", "serialport": "^11.0.0", - "dotenv": "^16.3.1", - "@node-wot/binding-modbus": "~0.8.16" + "test-things": "file:../../../.." } } diff --git a/things/elevator/tm.test.js b/things/elevator/tm.test.js index 6142856..b37f208 100644 --- a/things/elevator/tm.test.js +++ b/things/elevator/tm.test.js @@ -10,21 +10,18 @@ describe("Elevator", () => { let validate; before((done) => { - https.get( - "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/tm-json-schema-validation.json", - function (response) { - const body = []; - response.on("data", (chunk) => { - body.push(chunk); - }); + https.get("https://www.w3.org/2022/wot/tm-schema/v1.1", function (response) { + const body = []; + response.on("data", (chunk) => { + body.push(chunk); + }); - response.on("end", () => { - const tmSchema = JSON.parse(Buffer.concat(body).toString()); - validate = ajv.compile(tmSchema); - done(); - }); - } - ); + response.on("end", () => { + const tmSchema = JSON.parse(Buffer.concat(body).toString()); + validate = ajv.compile(tmSchema); + done(); + }); + }); }); it("should have a valid TM", () => { diff --git a/util/dist/util.js b/util/dist/util.js index 0e640cd..990085f 100644 --- a/util/dist/util.js +++ b/util/dist/util.js @@ -1,93 +1,80 @@ "use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTDValidate = exports.getInitiateMain = void 0; const ajv_1 = __importDefault(require("ajv")); -const https = __importStar(require("https")); -const spawn = require('node:child_process').spawn; +const node_child_process_1 = require("node:child_process"); +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +function getPortFromArgs(cmdArgs) { + for (let i = 0; i < cmdArgs.length; i++) { + const arg = cmdArgs[i]; + if ((arg === "-p" || arg === "--port") && i + 1 < cmdArgs.length) { + return cmdArgs[i + 1]; + } + if (arg.startsWith("--port=")) { + return arg.slice("--port=".length); + } + } + return undefined; +} const getInitiateMain = (mainCmd, cmdArgs) => { return new Promise((resolve, reject) => { - const thingProcess = spawn(mainCmd, cmdArgs); - // Avoids unsettled promise in case the promise is not settled in a second. + const thingProcess = (0, node_child_process_1.spawn)(mainCmd, cmdArgs); + let settled = false; + const settleResolve = (result) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timeout); + resolve(result); + }; + const settleReject = (error) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timeout); + reject(error); + }; + const startTimeout = Number(process.env.THING_START_TIMEOUT ?? 60000); const timeout = setTimeout(() => { - reject({ - process: thingProcess, - message: 'Thing did not start as expected.' - }); - }, 1000); - thingProcess.stdout.on('data', (data) => { - if (data.toString().includes('ThingIsReady')) { - clearTimeout(timeout); - resolve({ + thingProcess.kill(); + settleReject(new Error(`Thing did not start as expected.${stderr ? `\n${stderr}` : ""}`)); + }, startTimeout); + let stderr = ""; + thingProcess.stdout.on("data", (data) => { + if (data.toString().includes("ThingIsReady")) { + settleResolve({ process: thingProcess, - message: 'Success' + message: "Success", }); } }); - thingProcess.stderr.on('data', (data) => { - reject({ - process: thingProcess, - message: `Error: ${data}` - }); + thingProcess.stderr.on("data", (data) => { + settleReject(new Error(`Process stderr: ${data}`)); }); - thingProcess.on('error', (error) => { - reject({ - process: thingProcess, - message: `Error: ${error}` - }); + thingProcess.on("error", (error) => { + settleReject(new Error(`Process error: ${error.message}`)); }); - thingProcess.on('close', () => { - reject({ - process: thingProcess, - message: 'Failed to initiate the main script.' - }); + thingProcess.on("close", () => { + settleReject(new Error("Failed to initiate the main script.")); }); }); }; exports.getInitiateMain = getInitiateMain; const ajv = new ajv_1.default({ strict: false, allErrors: true, validateFormats: false }); const getTDValidate = async () => { - const tdSchema = await getTDJSONSchema; + const packageJsonPath = require.resolve("wot-thing-description-types/package.json"); + const schemaPath = node_path_1.default.join(node_path_1.default.dirname(packageJsonPath), "schema", "td-json-schema-validation.json"); + const tdSchema = JSON.parse(node_fs_1.default.readFileSync(schemaPath, "utf-8")); return Promise.resolve({ validate: ajv.compile(tdSchema), - message: 'Success' + message: "Success", }); }; exports.getTDValidate = getTDValidate; -const getTDJSONSchema = new Promise((resolve, reject) => { - https.get('https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/td-json-schema-validation.json', function (response) { - const body = []; - response.on('data', (chunk) => { - body.push(chunk); - }); - response.on('end', () => { - const tdSchema = JSON.parse(Buffer.concat(body).toString()); - resolve(tdSchema); - }); - }); -}); +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/util/package.json b/util/package.json index c2e498c..e01ea4a 100644 --- a/util/package.json +++ b/util/package.json @@ -38,10 +38,11 @@ "dependencies": { "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-jaeger": "1.9.0", - "@opentelemetry/resources": "1.9.0", - "@opentelemetry/sdk-trace-node": "1.9.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-node": "1.26.0", "@opentelemetry/semantic-conventions": "1.9.0", "ajv": "^8.12.0", + "test-things": "file:..", "wot-thing-description-types": "^1.1.0-09-November-2023", "wot-typescript-definitions": "0.8.0-SNAPSHOT.29" }, diff --git a/util/tsconfig.json b/util/tsconfig.json index 1bad4f9..4b7c418 100644 --- a/util/tsconfig.json +++ b/util/tsconfig.json @@ -5,7 +5,7 @@ "skipLibCheck": true, "module": "commonjs", "outDir": "dist", - "rootDir": ".", + "rootDir": "./", "strict": true, "composite": true, "incremental": true, @@ -25,5 +25,5 @@ "forceConsistentCasingInFileNames": true }, "include": ["*.ts"], - "exclude": ["dist", "node_modules"] + "exclude": ["dist", "node_modules", "**/*.d.ts"] } diff --git a/util/util.ts b/util/util.ts index a6bcf7b..b079200 100644 --- a/util/util.ts +++ b/util/util.ts @@ -15,7 +15,8 @@ import Ajv, { ValidateFunction } from "ajv"; import { ChildProcess, spawn } from "node:child_process"; -import * as tdSchema from "wot-thing-description-types"; +import fs from "node:fs"; +import path from "node:path"; export type ThingStartResponse = { process?: ChildProcess; @@ -27,32 +28,65 @@ export type ValidateResponse = { message: string; }; +function getPortFromArgs(cmdArgs: string[]): string | undefined { + for (let i = 0; i < cmdArgs.length; i++) { + const arg = cmdArgs[i]; + if ((arg === "-p" || arg === "--port") && i + 1 < cmdArgs.length) { + return cmdArgs[i + 1]; + } + if (arg.startsWith("--port=")) { + return arg.slice("--port=".length); + } + } + return undefined; +} + export const getInitiateMain = (mainCmd: string, cmdArgs: string[]): Promise => { return new Promise((resolve, reject) => { const thingProcess = spawn(mainCmd, cmdArgs); + let settled = false; + let stderr = ""; + const timerRef: { timeout?: NodeJS.Timeout } = {}; + + const settleReject = (err: Error) => { + if (settled) return; + settled = true; + if (timerRef.timeout) clearTimeout(timerRef.timeout); + reject(err); + }; + thingProcess.stderr?.on("data", (data) => { + stderr += data.toString(); + }); + // Give things enough time to initialize transports and announce readiness. + const startTimeout = Number(process.env.THING_START_TIMEOUT ?? 60000); - // Avoids unsettled promise in case the promise is not settled in a second. - const timeout = setTimeout(() => { - reject(new Error("Thing did not start as expected.")); - }, 1000); + timerRef.timeout = setTimeout(() => { + thingProcess.kill(); + settleReject(new Error(`Thing did not start as expected.${stderr ? `\n${stderr}` : ""}`)); + }, startTimeout); + + const settleResolve = (result: ThingStartResponse) => { + if (settled) { + return; + } + settled = true; + if (timerRef.timeout) clearTimeout(timerRef.timeout); + resolve(result); + }; thingProcess.stdout!.on("data", (data: Buffer) => { if (data.toString().includes("ThingIsReady")) { - clearTimeout(timeout); - resolve({ + settleResolve({ process: thingProcess, message: "Success", }); } }); - thingProcess.stderr!.on("data", (data: Buffer) => { - reject(new Error(`Process stderr: ${data}`)); - }); thingProcess.on("error", (error: Error) => { - reject(new Error(`Process error: ${error.message}`)); + settleReject(new Error(`Process error: ${error.message}`)); }); thingProcess.on("close", () => { - reject(new Error("Failed to initiate the main script.")); + settleReject(new Error(`Failed to initiate the main script.${stderr ? `\n${stderr}` : ""}`)); }); }); }; @@ -60,9 +94,13 @@ export const getInitiateMain = (mainCmd: string, cmdArgs: string[]): Promise => { - // Use the wot-thing-description-types package instead of fetching from remote URL + // Load TD schema JSON from the package files + const packageJsonPath = require.resolve("wot-thing-description-types/package.json"); + const schemaPath = path.join(path.dirname(packageJsonPath), "schema", "td-json-schema-validation.json"); + const tdSchema = JSON.parse(fs.readFileSync(schemaPath, "utf-8")) as Record; + return Promise.resolve({ - validate: ajv.compile(tdSchema as Record), + validate: ajv.compile(tdSchema), message: "Success", }); };