From 01b19eb2ed595a2aff581dc96588d5ea2175d9aa Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 14 Apr 2026 20:08:28 -0700 Subject: [PATCH] OTLP and other changes --- README.md | 17 +- docker-compose.yml | 10 + examples/elk/docker/.env | 59 - examples/elk/docker/README.md | 28 - examples/elk/docker/docker-compose.yml | 141 - .../elk/docker/elasticsearch/.dockerignore | 23 - examples/elk/docker/elasticsearch/Dockerfile | 24 - .../elasticsearch/config/elasticsearch.yml | 29 - examples/elk/docker/kibana/.dockerignore | 23 - examples/elk/docker/kibana/Dockerfile | 24 - examples/elk/docker/kibana/config/kibana.yml | 116 - examples/elk/docker/logstash/.dockerignore | 23 - examples/elk/docker/logstash/Dockerfile | 24 - .../elk/docker/logstash/config/logstash.yml | 24 - .../docker/logstash/pipeline/logstash.conf | 54 - .../docker/logstash/templates/userale.json | 151 - examples/elk/docker/setup/.dockerignore | 26 - examples/elk/docker/setup/Dockerfile | 23 - examples/elk/docker/setup/entrypoint.sh | 136 - examples/elk/docker/setup/lib.sh | 257 - .../docker/setup/roles/filebeat_writer.json | 20 - .../docker/setup/roles/heartbeat_writer.json | 18 - .../docker/setup/roles/logstash_writer.json | 34 - .../docker/setup/roles/metricbeat_writer.json | 19 - examples/elk/docker/site/Dockerfile | 41 - examples/elk/kubernetes/README.md | 28 - examples/elk/kubernetes/requirements.txt | 1 - .../elk/kubernetes/resources/elastic.yaml | 39 - .../kubernetes/resources/logstash-auth.yaml | 28 - .../elk/kubernetes/resources/logstash.yaml | 71 - examples/elk/kubernetes/run.sh | 28 - examples/elk/kubernetes/test.py | 33 - jaeger.yaml | 50 + package.json | 2 + products/userale/README.md | 56 +- products/userale/example-server/esm.html | 64 + products/userale/example-server/esm.js | 84 + products/userale/example-server/iife.html | 78 + products/userale/example-server/iife.js | 90 + products/userale/example-server/index.html | 78 + products/userale/example-server/index.js | 90 + .../no-logging.html} | 17 +- products/userale/example-server/server.js | 57 + products/userale/example/README.md | 144 - products/userale/example/log.schema.json | 116 - products/userale/example/server/index.html | 92 - products/userale/example/server/index.js | 177 - .../userale/example/server/no-logging.html | 76 - products/userale/example/server/server.js | 170 - products/userale/example/server/ws-index.html | 92 - products/userale/package.json | 12 +- .../{flagon-userale => core-sdk}/.gitignore | 0 .../{flagon-userale => core-sdk}/CHANGELOG.md | 0 .../CONTRIBUTING.md | 0 products/userale/packages/core-sdk/README.md | 173 + .../core-sdk/build/Configuration.d.ts | 61 + .../packages/core-sdk/build/Packager.d.ts | 77 + .../packages/core-sdk/build/Sender.d.ts | 29 + .../packages/core-sdk/build/UserALE.d.ts | 53 + .../build/attachHandlers.d.ts | 3 +- .../build/configure.d.ts | 1 - .../build/getInitialSettings.d.ts | 14 +- .../core-sdk/build/handlers/attach.d.ts | 26 + .../core-sdk/build/handlers/eventDetails.d.ts | 81 + .../build/main.d.ts} | 16 +- .../userale/packages/core-sdk/build/main.mjs | 1076 + .../packages/core-sdk/build/main.mjs.map | 1 + .../userale/packages/core-sdk/build/otlp.d.ts | 49 + .../packages/core-sdk/build/packageLogs.d.ts | 77 + .../packages/core-sdk/build/sendLogs.d.ts | 29 + .../packages/core-sdk/build/utils/auth.d.ts | 47 + .../build/utils/auth/index.d.ts | 0 .../build/utils/getInitialSettings.d.ts | 33 + .../core-sdk/build/utils/headers.d.ts | 47 + .../build/utils/headers/index.d.ts | 0 .../packages/core-sdk/build/utils/ids.d.ts | 25 + .../build/utils/index.d.ts | 5 +- .../{flagon-userale => core-sdk}/package.json | 13 +- .../src/Configuration.ts} | 3 +- .../userale/packages/core-sdk/src/Packager.ts | 342 + .../userale/packages/core-sdk/src/Sender.ts | 402 + .../userale/packages/core-sdk/src/UserALE.ts | 165 + .../packages/core-sdk/src/handlers/attach.ts | 134 + .../core-sdk/src/handlers/eventDetails.ts | 149 + .../src/index.css => core-sdk/src/main.ts} | 21 +- .../userale/packages/core-sdk/src/types.d.ts | 313 + .../index.ts => core-sdk/src/utils/auth.ts} | 2 +- .../core-sdk/src/utils/getInitialSettings.ts | 136 + .../src/utils/headers.ts} | 2 +- .../packages/core-sdk/src/utils/ids.ts | 35 + .../src/utils/index.ts | 5 +- .../test/globals.d.ts | 0 .../test/jest.config.ts | 7 +- .../test/jest.setup.js | 0 .../test/spec/attachHandlers.spec.ts | 31 +- .../test/spec/auth.spec.ts | 2 +- .../test/spec/configure.spec.ts | 2 +- .../test/spec/getInitialSettings.spec.ts | 53 +- .../spec/getInitialSettings_fetchAll.html | 0 .../spec/getInitialSettings_userParam.html | 0 .../test/spec/headers.spec.ts | 2 +- .../packages/core-sdk/test/spec/otlp.spec.ts | 361 + .../test/spec/packageLogs.spec.ts | 288 +- .../test/spec/sendLogs.spec.ts | 137 +- .../test/spec/testUtils.ts | 38 +- .../test/spec/utils/ids.spec.ts} | 53 +- .../tsconfig.json | 0 .../tsconfig.test.json | 0 .../tsup.config.js | 2 +- .../.gitignore | 0 .../.prettierrc.mjs | 0 products/userale/packages/extension/README.md | 76 + .../assets/icon.png | Bin .../package.json | 6 +- .../postcss.config.js | 0 .../src/background/index.ts | 93 +- .../src/background/ports/log.ts} | 24 +- .../src/content.ts | 31 +- .../src/options/auth.tsx | 0 .../src/options/index.tsx | 0 .../src/options/logging.tsx | 0 .../src/popup.tsx | 0 .../src/style.css | 0 .../src/utils/messaging.ts | 0 .../src/utils/storage.ts | 8 +- .../tailwind.config.js | 0 .../tsconfig.json | 0 .../packages/flagon-userale-ext/README.md | 80 - .../src/background/ports/log.ts | 49 - .../userale/packages/flagon-userale/README.md | 354 - .../packages/flagon-userale/build/main.d.ts | 46 - .../flagon-userale/build/main.global.js | 937 - .../flagon-userale/build/main.global.js.map | 1 - .../packages/flagon-userale/build/main.mjs | 950 - .../flagon-userale/build/main.mjs.map | 1 - .../flagon-userale/build/packageLogs.d.ts | 122 - .../flagon-userale/build/sendLogs.d.ts | 42 - .../flagon-userale/example/Dockerfile | 30 - .../packages/flagon-userale/example/README.md | 144 - .../custom-non-user-events-example/README.md | 64 - .../custom-non-user-events-example/index.js | 89 - .../flagon-userale/example/index.html | 92 - .../packages/flagon-userale/example/index.js | 176 - .../example/kafka-rest-router.js | 126 - .../example/log-label-example/README.md | 83 - .../example/log-label-example/index.html | 62 - .../flagon-userale/example/log.schema.json | 125 - .../flagon-userale/example/no-logging.html | 76 - .../example/react-app-example/.gitignore | 40 - .../example/react-app-example/README.md | 43 - .../react-app-example/package-lock.json | 19688 ---------------- .../example/react-app-example/package.json | 38 - .../react-app-example/public/favicon.ico | Bin 3870 -> 0 bytes .../react-app-example/public/index.html | 57 - .../react-app-example/public/logo192.png | Bin 5347 -> 0 bytes .../react-app-example/public/logo512.png | Bin 9664 -> 0 bytes .../example/react-app-example/src/App.js | 71 - .../example/react-app-example/src/logo.svg | 19 - .../flagon-userale/example/test-client.js | 32 - .../flagon-userale/example/test-client.ts | 40 - .../example/webpackUserAleExample/.gitignore | 22 - .../example/webpackUserAleExample/LICENSE | 201 - .../example/webpackUserAleExample/README.md | 156 - .../webpackUserAleExample/dist/main.js | 161 - .../example/webpackUserAleExample/index.html | 77 - .../example/webpackUserAleExample/index.js | 181 - .../webpackUserAleExample/package-lock.json | 2310 -- .../webpackUserAleExample/package.json | 48 - .../webpackUserAleExample/webpack.config.js | 23 - .../flagon-userale/example/ws-index.html | 92 - .../flagon-userale/src/attachHandlers.ts | 271 - .../flagon-userale/src/getInitialSettings.ts | 171 - .../packages/flagon-userale/src/main.ts | 175 - .../flagon-userale/src/packageLogs.ts | 462 - .../packages/flagon-userale/src/sendLogs.ts | 176 - .../packages/flagon-userale/src/types.d.ts | 161 - .../flagon-userale/test/spec/main.spec.ts | 102 - products/userale/packages/iife/README.md | 92 + .../packages/iife/build/main.global.js | 1014 + .../packages/iife/build/main.global.js.map | 1 + products/userale/packages/iife/package.json | 17 + .../src/index.js => iife/src/main.ts} | 18 +- products/userale/packages/iife/tsconfig.json | 9 + products/userale/packages/iife/tsup.config.js | 48 + products/userale/test/playwright.config.ts | 36 +- products/userale/test/spec/01-iife.spec.ts | 136 + products/userale/test/spec/01-package.spec.ts | 45 - products/userale/test/spec/02-esm.spec.ts | 127 + products/userale/test/spec/02-shared.spec.ts | 99 - ...extension.spec.ts => 03-extension.spec.ts} | 2 +- .../userale/test/spec/03-websocket.spec.ts | 41 - .../test/spec/fixtures/extension.fixture.ts | 10 +- .../test/spec/fixtures/page.fixture.ts | 56 + products/userale/tsconfig.json | 4 +- 194 files changed, 6614 insertions(+), 31583 deletions(-) create mode 100644 docker-compose.yml delete mode 100644 examples/elk/docker/.env delete mode 100644 examples/elk/docker/README.md delete mode 100644 examples/elk/docker/docker-compose.yml delete mode 100644 examples/elk/docker/elasticsearch/.dockerignore delete mode 100644 examples/elk/docker/elasticsearch/Dockerfile delete mode 100644 examples/elk/docker/elasticsearch/config/elasticsearch.yml delete mode 100644 examples/elk/docker/kibana/.dockerignore delete mode 100644 examples/elk/docker/kibana/Dockerfile delete mode 100644 examples/elk/docker/kibana/config/kibana.yml delete mode 100644 examples/elk/docker/logstash/.dockerignore delete mode 100644 examples/elk/docker/logstash/Dockerfile delete mode 100644 examples/elk/docker/logstash/config/logstash.yml delete mode 100644 examples/elk/docker/logstash/pipeline/logstash.conf delete mode 100644 examples/elk/docker/logstash/templates/userale.json delete mode 100644 examples/elk/docker/setup/.dockerignore delete mode 100644 examples/elk/docker/setup/Dockerfile delete mode 100755 examples/elk/docker/setup/entrypoint.sh delete mode 100644 examples/elk/docker/setup/lib.sh delete mode 100644 examples/elk/docker/setup/roles/filebeat_writer.json delete mode 100644 examples/elk/docker/setup/roles/heartbeat_writer.json delete mode 100644 examples/elk/docker/setup/roles/logstash_writer.json delete mode 100644 examples/elk/docker/setup/roles/metricbeat_writer.json delete mode 100644 examples/elk/docker/site/Dockerfile delete mode 100644 examples/elk/kubernetes/README.md delete mode 100644 examples/elk/kubernetes/requirements.txt delete mode 100644 examples/elk/kubernetes/resources/elastic.yaml delete mode 100644 examples/elk/kubernetes/resources/logstash-auth.yaml delete mode 100644 examples/elk/kubernetes/resources/logstash.yaml delete mode 100755 examples/elk/kubernetes/run.sh delete mode 100644 examples/elk/kubernetes/test.py create mode 100644 jaeger.yaml create mode 100644 products/userale/example-server/esm.html create mode 100644 products/userale/example-server/esm.js create mode 100644 products/userale/example-server/iife.html create mode 100644 products/userale/example-server/iife.js create mode 100644 products/userale/example-server/index.html create mode 100644 products/userale/example-server/index.js rename products/userale/{packages/flagon-userale/test/spec/main.html => example-server/no-logging.html} (74%) create mode 100644 products/userale/example-server/server.js delete mode 100644 products/userale/example/README.md delete mode 100644 products/userale/example/log.schema.json delete mode 100644 products/userale/example/server/index.html delete mode 100644 products/userale/example/server/index.js delete mode 100644 products/userale/example/server/no-logging.html delete mode 100644 products/userale/example/server/server.js delete mode 100644 products/userale/example/server/ws-index.html rename products/userale/packages/{flagon-userale => core-sdk}/.gitignore (100%) rename products/userale/packages/{flagon-userale => core-sdk}/CHANGELOG.md (100%) rename products/userale/packages/{flagon-userale => core-sdk}/CONTRIBUTING.md (100%) create mode 100644 products/userale/packages/core-sdk/README.md create mode 100644 products/userale/packages/core-sdk/build/Configuration.d.ts create mode 100644 products/userale/packages/core-sdk/build/Packager.d.ts create mode 100644 products/userale/packages/core-sdk/build/Sender.d.ts create mode 100644 products/userale/packages/core-sdk/build/UserALE.d.ts rename products/userale/packages/{flagon-userale => core-sdk}/build/attachHandlers.d.ts (96%) rename products/userale/packages/{flagon-userale => core-sdk}/build/configure.d.ts (98%) rename products/userale/packages/{flagon-userale => core-sdk}/build/getInitialSettings.d.ts (66%) create mode 100644 products/userale/packages/core-sdk/build/handlers/attach.d.ts create mode 100644 products/userale/packages/core-sdk/build/handlers/eventDetails.d.ts rename products/userale/packages/{flagon-userale/example/react-app-example/src/setupTests.js => core-sdk/build/main.d.ts} (66%) create mode 100644 products/userale/packages/core-sdk/build/main.mjs create mode 100644 products/userale/packages/core-sdk/build/main.mjs.map create mode 100644 products/userale/packages/core-sdk/build/otlp.d.ts create mode 100644 products/userale/packages/core-sdk/build/packageLogs.d.ts create mode 100644 products/userale/packages/core-sdk/build/sendLogs.d.ts create mode 100644 products/userale/packages/core-sdk/build/utils/auth.d.ts rename products/userale/packages/{flagon-userale => core-sdk}/build/utils/auth/index.d.ts (100%) create mode 100644 products/userale/packages/core-sdk/build/utils/getInitialSettings.d.ts create mode 100644 products/userale/packages/core-sdk/build/utils/headers.d.ts rename products/userale/packages/{flagon-userale => core-sdk}/build/utils/headers/index.d.ts (100%) create mode 100644 products/userale/packages/core-sdk/build/utils/ids.d.ts rename products/userale/packages/{flagon-userale => core-sdk}/build/utils/index.d.ts (90%) rename products/userale/packages/{flagon-userale => core-sdk}/package.json (87%) rename products/userale/packages/{flagon-userale/src/configure.ts => core-sdk/src/Configuration.ts} (97%) create mode 100644 products/userale/packages/core-sdk/src/Packager.ts create mode 100644 products/userale/packages/core-sdk/src/Sender.ts create mode 100644 products/userale/packages/core-sdk/src/UserALE.ts create mode 100644 products/userale/packages/core-sdk/src/handlers/attach.ts create mode 100644 products/userale/packages/core-sdk/src/handlers/eventDetails.ts rename products/userale/packages/{flagon-userale/example/react-app-example/src/index.css => core-sdk/src/main.ts} (68%) create mode 100644 products/userale/packages/core-sdk/src/types.d.ts rename products/userale/packages/{flagon-userale/src/utils/auth/index.ts => core-sdk/src/utils/auth.ts} (98%) create mode 100644 products/userale/packages/core-sdk/src/utils/getInitialSettings.ts rename products/userale/packages/{flagon-userale/src/utils/headers/index.ts => core-sdk/src/utils/headers.ts} (98%) create mode 100644 products/userale/packages/core-sdk/src/utils/ids.ts rename products/userale/packages/{flagon-userale => core-sdk}/src/utils/index.ts (90%) rename products/userale/packages/{flagon-userale => core-sdk}/test/globals.d.ts (100%) rename products/userale/packages/{flagon-userale => core-sdk}/test/jest.config.ts (91%) rename products/userale/packages/{flagon-userale => core-sdk}/test/jest.setup.js (100%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/attachHandlers.spec.ts (83%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/auth.spec.ts (98%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/configure.spec.ts (98%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/getInitialSettings.spec.ts (68%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/getInitialSettings_fetchAll.html (100%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/getInitialSettings_userParam.html (100%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/headers.spec.ts (99%) create mode 100644 products/userale/packages/core-sdk/test/spec/otlp.spec.ts rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/packageLogs.spec.ts (54%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/sendLogs.spec.ts (58%) rename products/userale/packages/{flagon-userale => core-sdk}/test/spec/testUtils.ts (58%) rename products/userale/packages/{flagon-userale/example/react-app-example/src/App.css => core-sdk/test/spec/utils/ids.spec.ts} (56%) rename products/userale/packages/{flagon-userale => core-sdk}/tsconfig.json (100%) rename products/userale/packages/{flagon-userale => core-sdk}/tsconfig.test.json (100%) rename products/userale/packages/{flagon-userale => core-sdk}/tsup.config.js (98%) rename products/userale/packages/{flagon-userale-ext => extension}/.gitignore (100%) rename products/userale/packages/{flagon-userale-ext => extension}/.prettierrc.mjs (100%) create mode 100644 products/userale/packages/extension/README.md rename products/userale/packages/{flagon-userale-ext => extension}/assets/icon.png (100%) rename products/userale/packages/{flagon-userale-ext => extension}/package.json (89%) rename products/userale/packages/{flagon-userale-ext => extension}/postcss.config.js (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/background/index.ts (57%) rename products/userale/packages/{flagon-userale-ext/src/background/messages/config_change.ts => extension/src/background/ports/log.ts} (67%) rename products/userale/packages/{flagon-userale-ext => extension}/src/content.ts (68%) rename products/userale/packages/{flagon-userale-ext => extension}/src/options/auth.tsx (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/options/index.tsx (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/options/logging.tsx (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/popup.tsx (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/style.css (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/utils/messaging.ts (100%) rename products/userale/packages/{flagon-userale-ext => extension}/src/utils/storage.ts (92%) rename products/userale/packages/{flagon-userale-ext => extension}/tailwind.config.js (100%) rename products/userale/packages/{flagon-userale-ext => extension}/tsconfig.json (100%) delete mode 100644 products/userale/packages/flagon-userale-ext/README.md delete mode 100644 products/userale/packages/flagon-userale-ext/src/background/ports/log.ts delete mode 100644 products/userale/packages/flagon-userale/README.md delete mode 100644 products/userale/packages/flagon-userale/build/main.d.ts delete mode 100644 products/userale/packages/flagon-userale/build/main.global.js delete mode 100644 products/userale/packages/flagon-userale/build/main.global.js.map delete mode 100644 products/userale/packages/flagon-userale/build/main.mjs delete mode 100644 products/userale/packages/flagon-userale/build/main.mjs.map delete mode 100644 products/userale/packages/flagon-userale/build/packageLogs.d.ts delete mode 100644 products/userale/packages/flagon-userale/build/sendLogs.d.ts delete mode 100644 products/userale/packages/flagon-userale/example/Dockerfile delete mode 100644 products/userale/packages/flagon-userale/example/README.md delete mode 100644 products/userale/packages/flagon-userale/example/custom-non-user-events-example/README.md delete mode 100644 products/userale/packages/flagon-userale/example/custom-non-user-events-example/index.js delete mode 100644 products/userale/packages/flagon-userale/example/index.html delete mode 100644 products/userale/packages/flagon-userale/example/index.js delete mode 100644 products/userale/packages/flagon-userale/example/kafka-rest-router.js delete mode 100644 products/userale/packages/flagon-userale/example/log-label-example/README.md delete mode 100644 products/userale/packages/flagon-userale/example/log-label-example/index.html delete mode 100644 products/userale/packages/flagon-userale/example/log.schema.json delete mode 100644 products/userale/packages/flagon-userale/example/no-logging.html delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/.gitignore delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/README.md delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/package-lock.json delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/package.json delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/public/favicon.ico delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/public/index.html delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/public/logo192.png delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/public/logo512.png delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/src/App.js delete mode 100644 products/userale/packages/flagon-userale/example/react-app-example/src/logo.svg delete mode 100644 products/userale/packages/flagon-userale/example/test-client.js delete mode 100644 products/userale/packages/flagon-userale/example/test-client.ts delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/.gitignore delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/LICENSE delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/README.md delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/dist/main.js delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/index.html delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/index.js delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/package-lock.json delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/package.json delete mode 100644 products/userale/packages/flagon-userale/example/webpackUserAleExample/webpack.config.js delete mode 100644 products/userale/packages/flagon-userale/example/ws-index.html delete mode 100644 products/userale/packages/flagon-userale/src/attachHandlers.ts delete mode 100644 products/userale/packages/flagon-userale/src/getInitialSettings.ts delete mode 100644 products/userale/packages/flagon-userale/src/main.ts delete mode 100644 products/userale/packages/flagon-userale/src/packageLogs.ts delete mode 100644 products/userale/packages/flagon-userale/src/sendLogs.ts delete mode 100644 products/userale/packages/flagon-userale/src/types.d.ts delete mode 100644 products/userale/packages/flagon-userale/test/spec/main.spec.ts create mode 100644 products/userale/packages/iife/README.md create mode 100644 products/userale/packages/iife/build/main.global.js create mode 100644 products/userale/packages/iife/build/main.global.js.map create mode 100644 products/userale/packages/iife/package.json rename products/userale/packages/{flagon-userale/example/react-app-example/src/index.js => iife/src/main.ts} (78%) create mode 100644 products/userale/packages/iife/tsconfig.json create mode 100644 products/userale/packages/iife/tsup.config.js create mode 100644 products/userale/test/spec/01-iife.spec.ts delete mode 100644 products/userale/test/spec/01-package.spec.ts create mode 100644 products/userale/test/spec/02-esm.spec.ts delete mode 100644 products/userale/test/spec/02-shared.spec.ts rename products/userale/test/spec/{01-extension.spec.ts => 03-extension.spec.ts} (97%) delete mode 100644 products/userale/test/spec/03-websocket.spec.ts create mode 100644 products/userale/test/spec/fixtures/page.fixture.ts diff --git a/README.md b/README.md index 26f1766..6cbb5b5 100644 --- a/README.md +++ b/README.md @@ -23,20 +23,23 @@ Flagon is a collection of open-source tools for user behavior analytics, includi ## Repository Structure ```text -/examples # Integration examples /products ├── userale │ └── packages -│ ├── flagon-userale # JavaScript client instrumentation library -│ └── flagon-userale-ext # Browser extension for deploying UserALE -└── distill # Data processing toolkit (Python) -/site # Code for https://flagon.apache.org/ +│ ├── core-sdk # flagon-userale — JS instrumentation library (ESM + types) +│ ├── iife # flagon-userale-iife — script-tag drop-in build +│ └── extension # flagon-userale-ext — browser extension (Chrome MV3 / Firefox) +└── distill # Data processing toolkit (Python) +/site # Code for https://flagon.apache.org/ +docker-compose.yml # Shared OTLP collector (Jaeger) ``` ## Products -- [UserALE Core Library](./products/userale/packages/flagon-userale/README.md) -- [UserALE Browser Extension](./products/userale/packages/flagon-userale-ext/README.md) +- [UserALE](./products/userale/README.md) — behavioral telemetry for web applications + - [Core SDK](./products/userale/packages/core-sdk/README.md) (`flagon-userale`) + - [IIFE build](./products/userale/packages/iife/README.md) (`flagon-userale-iife`) + - [Browser Extension](./products/userale/packages/extension/README.md) (`flagon-userale-ext`) - [Distill Toolkit](./products/distill/README.md) ## Documentation diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..57327fd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + jaeger: + image: cr.jaegertracing.io/jaegertracing/jaeger:2.17.0 + ports: + - "4317:4317" # OTLP/gRPC receiver + - "4318:4318" # OTLP/HTTP receiver + - "16686:16686" # Jaeger UI + volumes: + - ./jaeger.yaml:/jaeger/config.yaml + command: ["--config=/jaeger/config.yaml"] diff --git a/examples/elk/docker/.env b/examples/elk/docker/.env deleted file mode 100644 index 50be155..0000000 --- a/examples/elk/docker/.env +++ /dev/null @@ -1,59 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -ELASTIC_VERSION=8.13.3 - -## Passwords for stack users -# - -# User 'elastic' (built-in) -# -# Superuser role, full access to cluster management and data indices. -# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html -ELASTIC_PASSWORD='changeme' - -# User 'logstash_internal' (custom) -# -# The user Logstash uses to connect and send data to Elasticsearch. -# https://www.elastic.co/guide/en/logstash/current/ls-security.html -LOGSTASH_INTERNAL_PASSWORD='changeme' - -# User 'kibana_system' (built-in) -# -# The user Kibana uses to connect and communicate with Elasticsearch. -# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html -KIBANA_SYSTEM_PASSWORD='changeme' - -# Users 'metricbeat_internal', 'filebeat_internal' and 'heartbeat_internal' (custom) -# -# The users Beats use to connect and send data to Elasticsearch. -# https://www.elastic.co/guide/en/beats/metricbeat/current/feature-roles.html -METRICBEAT_INTERNAL_PASSWORD='' -FILEBEAT_INTERNAL_PASSWORD='' -HEARTBEAT_INTERNAL_PASSWORD='' - -# User 'monitoring_internal' (custom) -# -# The user Metricbeat uses to collect monitoring data from stack components. -# https://www.elastic.co/guide/en/elasticsearch/reference/current/how-monitoring-works.html -MONITORING_INTERNAL_PASSWORD='' - -# User 'beats_system' (built-in) -# -# The user the Beats use when storing monitoring information in Elasticsearch. -# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html -BEATS_SYSTEM_PASSWORD='' diff --git a/examples/elk/docker/README.md b/examples/elk/docker/README.md deleted file mode 100644 index 757057a..0000000 --- a/examples/elk/docker/README.md +++ /dev/null @@ -1,28 +0,0 @@ - - -# Example Docker deployment - -This directory contains a modified [elk stack](https://github.com/deviantony/docker-elk) along with an instrumented site -to demonstrate how to publish logs to elk. - -Prerequisites: Docker engine is running - -Run `docker-compose up setup` to initialize and `docker-compose up` to run. - diff --git a/examples/elk/docker/docker-compose.yml b/examples/elk/docker/docker-compose.yml deleted file mode 100644 index b7d607b..0000000 --- a/examples/elk/docker/docker-compose.yml +++ /dev/null @@ -1,141 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -version: '3.7' - -services: - - # Site - site: - build: ./site - ports: - - 8080:8080 - depends_on: - - "logstash" - command: python -m http.server 8080 - - # The 'setup' service runs a one-off script which initializes users inside - # Elasticsearch — such as 'logstash_internal' and 'kibana_system' — with the - # values of the passwords defined in the '.env' file. It also creates the - # roles required by some of these users. - # - # This task only needs to be performed once, during the *initial* startup of - # the stack. Any subsequent run will reset the passwords of existing users to - # the values defined inside the '.env' file, and the built-in roles to their - # default permissions. - # - # By default, it is excluded from the services started by 'docker compose up' - # due to the non-default profile it belongs to. To run it, either provide the - # '--profile=setup' CLI flag to Compose commands, or "up" the service by name - # such as 'docker compose up setup'. - setup: - profiles: - - setup - build: - context: setup/ - args: - ELASTIC_VERSION: ${ELASTIC_VERSION} - init: true - volumes: - - ./setup/entrypoint.sh:/entrypoint.sh:ro,Z - - ./setup/lib.sh:/lib.sh:ro,Z - - ./setup/roles:/roles:ro,Z - environment: - ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-} - LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-} - KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-} - METRICBEAT_INTERNAL_PASSWORD: ${METRICBEAT_INTERNAL_PASSWORD:-} - FILEBEAT_INTERNAL_PASSWORD: ${FILEBEAT_INTERNAL_PASSWORD:-} - HEARTBEAT_INTERNAL_PASSWORD: ${HEARTBEAT_INTERNAL_PASSWORD:-} - MONITORING_INTERNAL_PASSWORD: ${MONITORING_INTERNAL_PASSWORD:-} - BEATS_SYSTEM_PASSWORD: ${BEATS_SYSTEM_PASSWORD:-} - networks: - - elk - depends_on: - - elasticsearch - - elasticsearch: - build: - context: elasticsearch/ - args: - ELASTIC_VERSION: ${ELASTIC_VERSION} - volumes: - - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z - - elasticsearch:/usr/share/elasticsearch/data:Z - ports: - - 9200:9200 - - 9300:9300 - environment: - node.name: elasticsearch - ES_JAVA_OPTS: -Xms512m -Xmx512m - # Bootstrap password. - # Used to initialize the keystore during the initial startup of - # Elasticsearch. Ignored on subsequent runs. - ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-} - # Use single node discovery in order to disable production mode and avoid bootstrap checks. - # see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html - discovery.type: single-node - networks: - - elk - restart: unless-stopped - - logstash: - build: - context: logstash/ - args: - ELASTIC_VERSION: ${ELASTIC_VERSION} - volumes: - - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z - - ./logstash/pipeline:/usr/share/logstash/pipeline:ro,Z - - ./logstash/templates:/usr/share/logstash/templates:ro,z - ports: - - 5044:5044 - - 50000:50000/tcp - - 50000:50000/udp - - 9600:9600 - environment: - LS_JAVA_OPTS: -Xms256m -Xmx256m - LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-} - networks: - - elk - depends_on: - - elasticsearch - restart: unless-stopped - - kibana: - build: - context: kibana/ - args: - ELASTIC_VERSION: ${ELASTIC_VERSION} - volumes: - - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro,Z - ports: - - 5601:5601 - environment: - KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-} - networks: - - elk - depends_on: - - elasticsearch - restart: unless-stopped - -networks: - elk: - driver: bridge - -volumes: - elasticsearch: diff --git a/examples/elk/docker/elasticsearch/.dockerignore b/examples/elk/docker/elasticsearch/.dockerignore deleted file mode 100644 index e26b22b..0000000 --- a/examples/elk/docker/elasticsearch/.dockerignore +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# Ignore Docker build files -Dockerfile -.dockerignore - -# Ignore OS artifacts -**/.DS_Store diff --git a/examples/elk/docker/elasticsearch/Dockerfile b/examples/elk/docker/elasticsearch/Dockerfile deleted file mode 100644 index 05cdf5e..0000000 --- a/examples/elk/docker/elasticsearch/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -ARG ELASTIC_VERSION - -# https://www.docker.elastic.co/ -FROM docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION} - -# Add your elasticsearch plugins setup here -# Example: RUN elasticsearch-plugin install analysis-icu diff --git a/examples/elk/docker/elasticsearch/config/elasticsearch.yml b/examples/elk/docker/elasticsearch/config/elasticsearch.yml deleted file mode 100644 index 94edbd2..0000000 --- a/examples/elk/docker/elasticsearch/config/elasticsearch.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - ---- -## Default Elasticsearch configuration from Elasticsearch base image. -## https://github.com/elastic/elasticsearch/blob/main/distribution/docker/src/docker/config/elasticsearch.yml -# -cluster.name: docker-cluster -network.host: 0.0.0.0 - -## X-Pack settings -## see https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html -# -xpack.license.self_generated.type: trial -xpack.security.enabled: true diff --git a/examples/elk/docker/kibana/.dockerignore b/examples/elk/docker/kibana/.dockerignore deleted file mode 100644 index e26b22b..0000000 --- a/examples/elk/docker/kibana/.dockerignore +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# Ignore Docker build files -Dockerfile -.dockerignore - -# Ignore OS artifacts -**/.DS_Store diff --git a/examples/elk/docker/kibana/Dockerfile b/examples/elk/docker/kibana/Dockerfile deleted file mode 100644 index bf5b603..0000000 --- a/examples/elk/docker/kibana/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -ARG ELASTIC_VERSION - -# https://www.docker.elastic.co/ -FROM docker.elastic.co/kibana/kibana:${ELASTIC_VERSION} - -# Add your kibana plugins setup here -# Example: RUN kibana-plugin install diff --git a/examples/elk/docker/kibana/config/kibana.yml b/examples/elk/docker/kibana/config/kibana.yml deleted file mode 100644 index 812afde..0000000 --- a/examples/elk/docker/kibana/config/kibana.yml +++ /dev/null @@ -1,116 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - ---- -## Default Kibana configuration from Kibana base image. -## https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts -# -server.name: kibana -server.host: 0.0.0.0 -elasticsearch.hosts: [ http://elasticsearch:9200 ] - -monitoring.ui.container.elasticsearch.enabled: true -monitoring.ui.container.logstash.enabled: true - -## X-Pack security credentials -# -elasticsearch.username: kibana_system -elasticsearch.password: ${KIBANA_SYSTEM_PASSWORD} - -## Encryption keys (optional but highly recommended) -## -## Generate with either -## $ docker container run --rm docker.elastic.co/kibana/kibana:8.6.2 bin/kibana-encryption-keys generate -## $ openssl rand -hex 32 -## -## https://www.elastic.co/guide/en/kibana/current/using-kibana-with-security.html -## https://www.elastic.co/guide/en/kibana/current/kibana-encryption-keys.html -# -#xpack.security.encryptionKey: -#xpack.encryptedSavedObjects.encryptionKey: -#xpack.reporting.encryptionKey: - -## Fleet -## https://www.elastic.co/guide/en/kibana/current/fleet-settings-kb.html -# -xpack.fleet.agents.fleet_server.hosts: [ http://fleet-server:8220 ] - -xpack.fleet.outputs: - - id: fleet-default-output - name: default - type: elasticsearch - hosts: [ http://elasticsearch:9200 ] - is_default: true - is_default_monitoring: true - -xpack.fleet.packages: - - name: fleet_server - version: latest - - name: system - version: latest - - name: elastic_agent - version: latest - - name: docker - version: latest - - name: apm - version: latest - -xpack.fleet.agentPolicies: - - name: Fleet Server Policy - id: fleet-server-policy - description: Static agent policy for Fleet Server - monitoring_enabled: - - logs - - metrics - package_policies: - - name: fleet_server-1 - package: - name: fleet_server - - name: system-1 - package: - name: system - - name: elastic_agent-1 - package: - name: elastic_agent - - name: docker-1 - package: - name: docker - - name: Agent Policy APM Server - id: agent-policy-apm-server - description: Static agent policy for the APM Server integration - monitoring_enabled: - - logs - - metrics - package_policies: - - name: system-1 - package: - name: system - - name: elastic_agent-1 - package: - name: elastic_agent - - name: apm-1 - package: - name: apm - # See the APM package manifest for a list of possible inputs. - # https://github.com/elastic/apm-server/blob/v8.5.0/apmpackage/apm/manifest.yml#L41-L168 - inputs: - - type: apm - vars: - - name: host - value: 0.0.0.0:8200 - - name: url - value: http://apm-server:8200 diff --git a/examples/elk/docker/logstash/.dockerignore b/examples/elk/docker/logstash/.dockerignore deleted file mode 100644 index e26b22b..0000000 --- a/examples/elk/docker/logstash/.dockerignore +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# Ignore Docker build files -Dockerfile -.dockerignore - -# Ignore OS artifacts -**/.DS_Store diff --git a/examples/elk/docker/logstash/Dockerfile b/examples/elk/docker/logstash/Dockerfile deleted file mode 100644 index aca3941..0000000 --- a/examples/elk/docker/logstash/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -ARG ELASTIC_VERSION - -# https://www.docker.elastic.co/ -FROM docker.elastic.co/logstash/logstash:${ELASTIC_VERSION} - -# Add your logstash plugins setup here -# Example: RUN logstash-plugin install logstash-filter-json diff --git a/examples/elk/docker/logstash/config/logstash.yml b/examples/elk/docker/logstash/config/logstash.yml deleted file mode 100644 index 3e03a3b..0000000 --- a/examples/elk/docker/logstash/config/logstash.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - ---- -## Default Logstash configuration from Logstash base image. -## https://github.com/elastic/logstash/blob/main/docker/data/logstash/config/logstash-full.yml -# -http.host: 0.0.0.0 - -node.name: logstash diff --git a/examples/elk/docker/logstash/pipeline/logstash.conf b/examples/elk/docker/logstash/pipeline/logstash.conf deleted file mode 100644 index 518d0ca..0000000 --- a/examples/elk/docker/logstash/pipeline/logstash.conf +++ /dev/null @@ -1,54 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -input { - http { - codec => "json" - port => 50000 - response_headers => { - "Access-Control-Allow-Origin" => "*" - "Access-Control-Allow-Headers" => "Origin, X-Requested-With, Content-Type, Accept" - } - } -} - -## Add your filters / logstash plugins configuration here -filter { - mutate { - remove_field => [ "message", "@version", "headers"] - } - - grok { - match => [ "useraleVersion", "(?\d+).(?\d+)(.(?\d+))?" ] - match => [ "toolVersion", "(?\d+).(?\d+)(.(?\d+))?" ] - } -} - -output { - # Output data to Elasticsearch instance - elasticsearch { - hosts => "elasticsearch:9200" - index => "userale" - manage_template => true - template_overwrite => true - template => "/usr/share/logstash/templates/userale.json" - template_name => "userale" - user => "logstash_internal" - password => "${LOGSTASH_INTERNAL_PASSWORD}" - } - - # Debug - stdout { codec => rubydebug } -} \ No newline at end of file diff --git a/examples/elk/docker/logstash/templates/userale.json b/examples/elk/docker/logstash/templates/userale.json deleted file mode 100644 index 771f413..0000000 --- a/examples/elk/docker/logstash/templates/userale.json +++ /dev/null @@ -1,151 +0,0 @@ -{ - "index_patterns": ["userale"], - "template": { - "settings": - { - "number_of_shards": 1, - "number_of_replicas": 0, - "index.refresh_interval": "5s", - "analysis": { - "analyzer": { - "my_analyzer": { - "tokenizer": "my_tokenizer" - } - }, - "tokenizer": { - "my_tokenizer": { - "type": "path_hierarchy" - } - } - } - }, - "mappings": - { - "dynamic_templates": [ - { - "strings_as_keywords": { - "match_mapping_type": "string", - "mapping": { - "type": "keyword" - } - } - } - ], - "dynamic": "true", - "properties": - { - "userAction": - { - "type": "boolean" - }, - "clientTime": - { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "startTime": - { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "endTime": - { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "count": - { - "type": "integer" - }, - "targetChange": - { - "type": "boolean" - }, - "typeChange": - { - "type": "boolean" - }, - "details": - { - "properties": - { - "alt": - { - "type": "boolean" - }, - "clicks": - { - "type": "integer" - }, - "ctrl": - { - "type": "boolean" - }, - "meta": - { - "type": "boolean" - }, - "shift": - { - "type": "boolean" - }, - "window": - { - "type": "boolean" - }, - "x": - { - "type": "integer" - }, - "y": - { - "type": "integer" - }, - "z": - { - "type": "integer" - } - } - }, - "location": - { - "properties": - { - "x": - { - "type": "integer" - }, - "y": - { - "type": "integer" - } - } - }, - "major_ver": - { - "type": "integer" - }, - "minor_ver": - { - "type": "integer" - }, - "patch_ver": - { - "type": "integer" - }, - "tool_major_ver": - { - "type": "integer" - }, - "tool_minor_ver": - { - "type": "integer" - }, - "tool_patch_ver": - { - "type": "integer" - } - } - } - } -} \ No newline at end of file diff --git a/examples/elk/docker/setup/.dockerignore b/examples/elk/docker/setup/.dockerignore deleted file mode 100644 index 4d2d4f9..0000000 --- a/examples/elk/docker/setup/.dockerignore +++ /dev/null @@ -1,26 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# Ignore Docker build files -Dockerfile -.dockerignore - -# Ignore OS artifacts -**/.DS_Store - -# Ignore Git files -.gitignore diff --git a/examples/elk/docker/setup/Dockerfile b/examples/elk/docker/setup/Dockerfile deleted file mode 100644 index b202ea7..0000000 --- a/examples/elk/docker/setup/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -ARG ELASTIC_VERSION - -# https://www.docker.elastic.co/ -FROM docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION} - -ENTRYPOINT ["/entrypoint.sh"] diff --git a/examples/elk/docker/setup/entrypoint.sh b/examples/elk/docker/setup/entrypoint.sh deleted file mode 100755 index 2099f5a..0000000 --- a/examples/elk/docker/setup/entrypoint.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -set -eu -set -o pipefail - -source "${BASH_SOURCE[0]%/*}"/lib.sh - - -# -------------------------------------------------------- -# Users declarations - -declare -A users_passwords -users_passwords=( - [logstash_internal]="${LOGSTASH_INTERNAL_PASSWORD:-}" - [kibana_system]="${KIBANA_SYSTEM_PASSWORD:-}" - [metricbeat_internal]="${METRICBEAT_INTERNAL_PASSWORD:-}" - [filebeat_internal]="${FILEBEAT_INTERNAL_PASSWORD:-}" - [heartbeat_internal]="${HEARTBEAT_INTERNAL_PASSWORD:-}" - [monitoring_internal]="${MONITORING_INTERNAL_PASSWORD:-}" - [beats_system]="${BEATS_SYSTEM_PASSWORD=:-}" -) - -declare -A users_roles -users_roles=( - [logstash_internal]='logstash_writer' - [metricbeat_internal]='metricbeat_writer' - [filebeat_internal]='filebeat_writer' - [heartbeat_internal]='heartbeat_writer' - [monitoring_internal]='remote_monitoring_collector' -) - -# -------------------------------------------------------- -# Roles declarations - -declare -A roles_files -roles_files=( - [logstash_writer]='logstash_writer.json' - [metricbeat_writer]='metricbeat_writer.json' - [filebeat_writer]='filebeat_writer.json' - [heartbeat_writer]='heartbeat_writer.json' -) - -# -------------------------------------------------------- - - -log 'Waiting for availability of Elasticsearch. This can take several minutes.' - -declare -i exit_code=0 -wait_for_elasticsearch || exit_code=$? - -if ((exit_code)); then - case $exit_code in - 6) - suberr 'Could not resolve host. Is Elasticsearch running?' - ;; - 7) - suberr 'Failed to connect to host. Is Elasticsearch healthy?' - ;; - 28) - suberr 'Timeout connecting to host. Is Elasticsearch healthy?' - ;; - *) - suberr "Connection to Elasticsearch failed. Exit code: ${exit_code}" - ;; - esac - - exit $exit_code -fi - -sublog 'Elasticsearch is running' - -log 'Waiting for initialization of built-in users' - -wait_for_builtin_users || exit_code=$? - -if ((exit_code)); then - suberr 'Timed out waiting for condition' - exit $exit_code -fi - -sublog 'Built-in users were initialized' - -for role in "${!roles_files[@]}"; do - log "Role '$role'" - - declare body_file - body_file="${BASH_SOURCE[0]%/*}/roles/${roles_files[$role]:-}" - if [[ ! -f "${body_file:-}" ]]; then - sublog "No role body found at '${body_file}', skipping" - continue - fi - - sublog 'Creating/updating' - ensure_role "$role" "$(<"${body_file}")" -done - -for user in "${!users_passwords[@]}"; do - log "User '$user'" - if [[ -z "${users_passwords[$user]:-}" ]]; then - sublog 'No password defined, skipping' - continue - fi - - declare -i user_exists=0 - user_exists="$(check_user_exists "$user")" - - if ((user_exists)); then - sublog 'User exists, setting password' - set_user_password "$user" "${users_passwords[$user]}" - else - if [[ -z "${users_roles[$user]:-}" ]]; then - suberr ' No role defined, skipping creation' - continue - fi - - sublog 'User does not exist, creating' - create_user "$user" "${users_passwords[$user]}" "${users_roles[$user]}" - fi -done diff --git a/examples/elk/docker/setup/lib.sh b/examples/elk/docker/setup/lib.sh deleted file mode 100644 index 699722b..0000000 --- a/examples/elk/docker/setup/lib.sh +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -# Log a message. -function log { - echo "[+] $1" -} - -# Log a message at a sub-level. -function sublog { - echo " ⠿ $1" -} - -# Log an error. -function err { - echo "[x] $1" >&2 -} - -# Log an error at a sub-level. -function suberr { - echo " ⠍ $1" >&2 -} - -# Poll the 'elasticsearch' service until it responds with HTTP code 200. -function wait_for_elasticsearch { - local elasticsearch_host="${ELASTICSEARCH_HOST:-elasticsearch}" - - local -a args=( '-s' '-D-' '-m15' '-w' '%{http_code}' "http://${elasticsearch_host}:9200/" ) - - if [[ -n "${ELASTIC_PASSWORD:-}" ]]; then - args+=( '-u' "elastic:${ELASTIC_PASSWORD}" ) - fi - - local -i result=1 - local output - - # retry for max 300s (60*5s) - for _ in $(seq 1 60); do - local -i exit_code=0 - output="$(curl "${args[@]}")" || exit_code=$? - - if ((exit_code)); then - result=$exit_code - fi - - if [[ "${output: -3}" -eq 200 ]]; then - result=0 - break - fi - - sleep 5 - done - - if ((result)) && [[ "${output: -3}" -ne 000 ]]; then - echo -e "\n${output::-3}" - fi - - return $result -} - -# Poll the Elasticsearch users API until it returns users. -function wait_for_builtin_users { - local elasticsearch_host="${ELASTICSEARCH_HOST:-elasticsearch}" - - local -a args=( '-s' '-D-' '-m15' "http://${elasticsearch_host}:9200/_security/user?pretty" ) - - if [[ -n "${ELASTIC_PASSWORD:-}" ]]; then - args+=( '-u' "elastic:${ELASTIC_PASSWORD}" ) - fi - - local -i result=1 - - local line - local -i exit_code - local -i num_users - - # retry for max 30s (30*1s) - for _ in $(seq 1 30); do - num_users=0 - - # read exits with a non-zero code if the last read input doesn't end - # with a newline character. The printf without newline that follows the - # curl command ensures that the final input not only contains curl's - # exit code, but causes read to fail so we can capture the return value. - # Ref. https://unix.stackexchange.com/a/176703/152409 - while IFS= read -r line || ! exit_code="$line"; do - if [[ "$line" =~ _reserved.+true ]]; then - (( num_users++ )) - fi - done < <(curl "${args[@]}"; printf '%s' "$?") - - if ((exit_code)); then - result=$exit_code - fi - - # we expect more than just the 'elastic' user in the result - if (( num_users > 1 )); then - result=0 - break - fi - - sleep 1 - done - - return $result -} - -# Verify that the given Elasticsearch user exists. -function check_user_exists { - local username=$1 - - local elasticsearch_host="${ELASTICSEARCH_HOST:-elasticsearch}" - - local -a args=( '-s' '-D-' '-m15' '-w' '%{http_code}' - "http://${elasticsearch_host}:9200/_security/user/${username}" - ) - - if [[ -n "${ELASTIC_PASSWORD:-}" ]]; then - args+=( '-u' "elastic:${ELASTIC_PASSWORD}" ) - fi - - local -i result=1 - local -i exists=0 - local output - - output="$(curl "${args[@]}")" - if [[ "${output: -3}" -eq 200 || "${output: -3}" -eq 404 ]]; then - result=0 - fi - if [[ "${output: -3}" -eq 200 ]]; then - exists=1 - fi - - if ((result)); then - echo -e "\n${output::-3}" - else - echo "$exists" - fi - - return $result -} - -# Set password of a given Elasticsearch user. -function set_user_password { - local username=$1 - local password=$2 - - local elasticsearch_host="${ELASTICSEARCH_HOST:-elasticsearch}" - - local -a args=( '-s' '-D-' '-m15' '-w' '%{http_code}' - "http://${elasticsearch_host}:9200/_security/user/${username}/_password" - '-X' 'POST' - '-H' 'Content-Type: application/json' - '-d' "{\"password\" : \"${password}\"}" - ) - - if [[ -n "${ELASTIC_PASSWORD:-}" ]]; then - args+=( '-u' "elastic:${ELASTIC_PASSWORD}" ) - fi - - local -i result=1 - local output - - output="$(curl "${args[@]}")" - if [[ "${output: -3}" -eq 200 ]]; then - result=0 - fi - - if ((result)); then - echo -e "\n${output::-3}\n" - fi - - return $result -} - -# Create the given Elasticsearch user. -function create_user { - local username=$1 - local password=$2 - local role=$3 - - local elasticsearch_host="${ELASTICSEARCH_HOST:-elasticsearch}" - - local -a args=( '-s' '-D-' '-m15' '-w' '%{http_code}' - "http://${elasticsearch_host}:9200/_security/user/${username}" - '-X' 'POST' - '-H' 'Content-Type: application/json' - '-d' "{\"password\":\"${password}\",\"roles\":[\"${role}\"]}" - ) - - if [[ -n "${ELASTIC_PASSWORD:-}" ]]; then - args+=( '-u' "elastic:${ELASTIC_PASSWORD}" ) - fi - - local -i result=1 - local output - - output="$(curl "${args[@]}")" - if [[ "${output: -3}" -eq 200 ]]; then - result=0 - fi - - if ((result)); then - echo -e "\n${output::-3}\n" - fi - - return $result -} - -# Ensure that the given Elasticsearch role is up-to-date, create it if required. -function ensure_role { - local name=$1 - local body=$2 - - local elasticsearch_host="${ELASTICSEARCH_HOST:-elasticsearch}" - - local -a args=( '-s' '-D-' '-m15' '-w' '%{http_code}' - "http://${elasticsearch_host}:9200/_security/role/${name}" - '-X' 'POST' - '-H' 'Content-Type: application/json' - '-d' "$body" - ) - - if [[ -n "${ELASTIC_PASSWORD:-}" ]]; then - args+=( '-u' "elastic:${ELASTIC_PASSWORD}" ) - fi - - local -i result=1 - local output - - output="$(curl "${args[@]}")" - if [[ "${output: -3}" -eq 200 ]]; then - result=0 - fi - - if ((result)); then - echo -e "\n${output::-3}\n" - fi - - return $result -} diff --git a/examples/elk/docker/setup/roles/filebeat_writer.json b/examples/elk/docker/setup/roles/filebeat_writer.json deleted file mode 100644 index b24b873..0000000 --- a/examples/elk/docker/setup/roles/filebeat_writer.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "cluster": [ - "manage_ilm", - "manage_index_templates", - "manage_ingest_pipelines", - "monitor", - "read_pipeline" - ], - "indices": [ - { - "names": [ - "filebeat-*" - ], - "privileges": [ - "create_doc", - "manage" - ] - } - ] -} diff --git a/examples/elk/docker/setup/roles/heartbeat_writer.json b/examples/elk/docker/setup/roles/heartbeat_writer.json deleted file mode 100644 index 9f64fa8..0000000 --- a/examples/elk/docker/setup/roles/heartbeat_writer.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "cluster": [ - "manage_ilm", - "manage_index_templates", - "monitor" - ], - "indices": [ - { - "names": [ - "heartbeat-*" - ], - "privileges": [ - "create_doc", - "manage" - ] - } - ] -} diff --git a/examples/elk/docker/setup/roles/logstash_writer.json b/examples/elk/docker/setup/roles/logstash_writer.json deleted file mode 100644 index 1e744f6..0000000 --- a/examples/elk/docker/setup/roles/logstash_writer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "cluster": [ - "manage_index_templates", - "monitor", - "manage_ilm" - ], - "indices": [ - { - "names": [ - "logs-generic-default", - "logstash-*", - "ecs-logstash-*", - "*" - ], - "privileges": [ - "write", - "create", - "create_index", - "manage", - "manage_ilm" - ] - }, - { - "names": [ - "logstash", - "ecs-logstash" - ], - "privileges": [ - "write", - "manage" - ] - } - ] -} diff --git a/examples/elk/docker/setup/roles/metricbeat_writer.json b/examples/elk/docker/setup/roles/metricbeat_writer.json deleted file mode 100644 index 279308c..0000000 --- a/examples/elk/docker/setup/roles/metricbeat_writer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "cluster": [ - "manage_ilm", - "manage_index_templates", - "monitor" - ], - "indices": [ - { - "names": [ - ".monitoring-*-mb", - "metricbeat-*" - ], - "privileges": [ - "create_doc", - "manage" - ] - } - ] -} diff --git a/examples/elk/docker/site/Dockerfile b/examples/elk/docker/site/Dockerfile deleted file mode 100644 index 678e0a4..0000000 --- a/examples/elk/docker/site/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM ruby - -# Install system wide dependencies -RUN apt-get -yqq update && apt-get -yqq install \ - curl \ - sudo - -# Set the work directory -RUN mkdir -p /usr/src -WORKDIR /usr/src - -# Install git -RUN sudo -E apt-get -yqq install \ - git - -# Clone Apache Flagon Site -RUN git clone -b master https://github.com/apache/flagon.git -WORKDIR /usr/src/flagon/site/_site - -# Update data-url to send to logstash -RUN sed -i 's/data-url=\"\"/data-url="http:\/\/localhost:50000"/' index.html -RUN sed -i 's/noSend\: true/noSend\: false/' index.html - -# Install system wide dependencies -RUN apt-get -yqq update && apt-get -yqq install \ - python-is-python3 \ No newline at end of file diff --git a/examples/elk/kubernetes/README.md b/examples/elk/kubernetes/README.md deleted file mode 100644 index 2d5a3fd..0000000 --- a/examples/elk/kubernetes/README.md +++ /dev/null @@ -1,28 +0,0 @@ - - -# Example Kubernetes deployment - -This script and accompanying yaml files provide an example ELK stack kubernetes deployment. This is intended to be a starting point for deploying a userale logging end point. - -Prerequisites: A bash enviroment and Kubernetes running with at least 4 GB memory and 4 CPU cores. - -Use the `run.sh` script to deploy the stack. - -`test.py` is included as a utility to verify that logs are correctly posted to elastic locally. To run `test.py`, you must first install it's requirements via `pip install -r requirements.txt`. diff --git a/examples/elk/kubernetes/requirements.txt b/examples/elk/kubernetes/requirements.txt deleted file mode 100644 index 41d37f2..0000000 --- a/examples/elk/kubernetes/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -elasticsearch-dsl>=8.0.0 diff --git a/examples/elk/kubernetes/resources/elastic.yaml b/examples/elk/kubernetes/resources/elastic.yaml deleted file mode 100644 index 7b5a605..0000000 --- a/examples/elk/kubernetes/resources/elastic.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -apiVersion: elasticsearch.k8s.elastic.co/v1 -kind: Elasticsearch -metadata: - name: quickstart -spec: - version: 8.12.0 - auth: - roles: - - secretName: my-roles-secret - nodeSets: - - name: default - count: 3 - podTemplate: - spec: - containers: - - name: elasticsearch - resources: - requests: - memory: 1Gi - cpu: 1 - limits: - memory: 1Gi \ No newline at end of file diff --git a/examples/elk/kubernetes/resources/logstash-auth.yaml b/examples/elk/kubernetes/resources/logstash-auth.yaml deleted file mode 100644 index 9a53a98..0000000 --- a/examples/elk/kubernetes/resources/logstash-auth.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -kind: Secret -apiVersion: v1 -metadata: - name: my-roles-secret -stringData: - roles.yml: |- - eck_logstash_user_role: - cluster: [ "monitor", "manage_ilm", "read_ilm", "manage_logstash_pipelines", "manage_index_templates", "cluster:admin/ingest/pipeline/get"] - indices: - - names: [ "my-index", "logstash", "logstash-*", "ecs-logstash", "ecs-logstash-*", "logs-*", "metrics-*", "synthetics-*", "traces-*", "userale" ] - privileges: [ "manage", "write", "create_index", "read", "view_index_metadata" ] \ No newline at end of file diff --git a/examples/elk/kubernetes/resources/logstash.yaml b/examples/elk/kubernetes/resources/logstash.yaml deleted file mode 100644 index 234d465..0000000 --- a/examples/elk/kubernetes/resources/logstash.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -apiVersion: logstash.k8s.elastic.co/v1alpha1 -kind: Logstash -metadata: - name: quickstart -spec: - count: 1 - elasticsearchRefs: - - name: quickstart - clusterName: qs - version: 8.12.0 - pipelines: - - pipeline.id: main - config.string: | - input { - http { - codec => "json" - port => 8100 - response_headers => { - "Access-Control-Allow-Origin" => "*" - "Access-Control-Allow-Headers" => "*" - } - } - } - - filter { - mutate { - remove_field => [ "message", "@version", "headers"] - } - - grok { - match => [ "useraleVersion", "(?\d+).(?\d+)(.(?\d+))?" ] - match => [ "toolVersion", "(?\d+).(?\d+)(.(?\d+))?" ] - } - } - - output { - elasticsearch { - hosts => [ "${QS_ES_HOSTS}" ] - user => "${QS_ES_USER}" - password => "${QS_ES_PASSWORD}" - ssl_certificate_authorities => "${QS_ES_SSL_CERTIFICATE_AUTHORITY}" - index => "userale" - } - } - services: - - name: http - service: - spec: - type: NodePort - ports: - - port: 8100 - name: "http" - protocol: TCP - targetPort: 8100 \ No newline at end of file diff --git a/examples/elk/kubernetes/run.sh b/examples/elk/kubernetes/run.sh deleted file mode 100755 index 2de3db3..0000000 --- a/examples/elk/kubernetes/run.sh +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -kubectl create -f https://download.elastic.co/downloads/eck/2.11.0/crds.yaml -kubectl apply -f https://download.elastic.co/downloads/eck/2.11.0/operator.yaml -kubectl apply -f resources/logstash-auth.yaml -kubectl apply -f resources/elastic.yaml -kubectl apply -f resources/logstash.yaml -sleep 10 -kubectl wait --for=condition=Ready pod/quickstart-es-default-0 --timeout=60s -kubectl wait --for=condition=Ready pod/quickstart-ls-0 --timeout=60s -kubectl port-forward service/quickstart-es-http 9200 >/dev/null 2>&1 & -kubectl port-forward service/quickstart-ls-http 8100 >/dev/null 2>&1 & -export ES_PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}') \ No newline at end of file diff --git a/examples/elk/kubernetes/test.py b/examples/elk/kubernetes/test.py deleted file mode 100644 index d60568e..0000000 --- a/examples/elk/kubernetes/test.py +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -from elasticsearch_dsl import connections -from elasticsearch_dsl import Search -from elasticsearch_dsl import Q -import os - -flagonClient = connections.create_connection('flagonTest', hosts=['https://localhost:9200'], basic_auth=("elastic", os.environ['ES_PASSWORD']), verify_certs=False) -AleS = Search(using='flagonTest', index="userale") -qLogType = Q("match", logType="raw") | Q("match", logType="custom") - -elk_search = AleS \ - .query(qLogType) \ - .extra(track_total_hits=True) #breaks return limit of 10000 hits - -elk_response = elk_search.scan() -for hit in elk_response: - print(hit) \ No newline at end of file diff --git a/jaeger.yaml b/jaeger.yaml new file mode 100644 index 0000000..3b3259a --- /dev/null +++ b/jaeger.yaml @@ -0,0 +1,50 @@ +extensions: + jaeger_storage: + backends: + memstore: + memory: + max_traces: 100000 + jaeger_query: + storage: + traces: memstore + http: + endpoint: 0.0.0.0:16686 + healthcheckv2: + use_v2: true + http: + endpoint: 0.0.0.0:13133 + +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + cors: + allowed_origins: + - "http://localhost:8000" + - "http://127.0.0.1:8000" + allowed_headers: + - "Content-Type" + +processors: + batch: + +exporters: + jaeger_storage_exporter: + trace_storage: memstore + debug: + verbosity: basic + +service: + extensions: [jaeger_storage, jaeger_query, healthcheckv2] + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [jaeger_storage_exporter] + logs: + receivers: [otlp] + processors: [batch] + exporters: [debug] diff --git a/package.json b/package.json index 4bfa92b..2eac7e6 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "version": "1.0.0", "scripts": { "prepare": "husky install", + "collector:up": "docker compose up -d", + "collector:down": "docker compose down", "lint": "eslint products/userale/packages/flagon-userale/src products/userale/packages/flagon-userale-ext/src --fix --ext .ts --ext .js", "format": "prettier --ignore-path .gitignore --write 'products/userale/packages/flagon-userale/src/**/*.{ts,js,tsx,jsx}' 'products/userale/packages/flagon-userale-ext/src/**/*.{ts,js,tsx,jsx}'" }, diff --git a/products/userale/README.md b/products/userale/README.md index 0006759..6ea650a 100644 --- a/products/userale/README.md +++ b/products/userale/README.md @@ -1,13 +1,55 @@ # Flagon UserALE -UserALE is a client-side instrumentation library for behavioral analytics. +pnpm workspace containing the UserALE core library, script-tag IIFE build, and browser extension. -This directory contains two packages: -- [`flagon-userale`](./packages/flagon-userale): Core JavaScript library -- [`flagon-userale-ext`](./packages/flagon-userale-ext): Browser extension +## Packages -For details on each, see their respective READMEs. +| Package | npm name | Description | +|---|---|---| +| [`core-sdk/`](./packages/core-sdk/) | `flagon-userale` | Core JS instrumentation library (ESM + TypeScript types) | +| [`iife/`](./packages/iife/) | `flagon-userale-iife` | Script-tag drop-in build — no bundler required | +| [`extension/`](./packages/extension/) | `flagon-userale-ext` | Browser extension built on the core SDK | -📚 [Documentation](https://flagon.incubator.apache.org/userale/) +## Development ---- +```sh +pnpm install +pnpm build # builds all packages; extension picks up core changes automatically +pnpm test # runs unit tests (Jest) then integration tests (Playwright) +``` + +## Test environment + +Playwright integration tests require packages to be built first (`pnpm build`). The test server at [`example-server/server.js`](./example-server/server.js) is started automatically by Playwright and serves three pages: + +| Route | Description | +|---|---| +| `/iife` | IIFE script-tag example | +| `/esm` | ESM core SDK example with callbacks | +| `/no-logging` | Blank page for extension tests (extension instruments the page) | + +To run the server manually (useful when iterating on tests or the example pages): + +```sh +pnpm example:run # static server on :8000 +pnpm example:watch # same, with nodemon reload on example-server/ changes +``` + +The extension integration tests also require a production build of the extension: + +```sh +pnpm --filter flagon-userale-ext build +``` + +## OTLP collector + +All packages emit to an OTLP/HTTP endpoint. For local development, start the shared Jaeger collector from the flagon project root: + +```sh +pnpm collector:up # Jaeger on :4318 (OTLP) and :16686 (UI) +pnpm collector:down +``` + +## Documentation + +[flagon.apache.org/userale](https://flagon.apache.org/userale/) diff --git a/products/userale/example-server/esm.html b/products/userale/example-server/esm.html new file mode 100644 index 0000000..2657a0f --- /dev/null +++ b/products/userale/example-server/esm.html @@ -0,0 +1,64 @@ + + + + UserALE - ESM Example Page + + + + +

+ This page loads UserALE as an ES module. Configuration is set + programmatically via userale.options() and + userale.start() — no script-tag data-* attributes. +

+
+ +

Click events

+
+ +
+ +

Form events

+

Interact with these fields to generate input, change, focus, and submit logs.

+
+ +

+ +
+ +
+ + +

+
+ Choice A
+ Choice B
+ Choice C +
+ +
+ +

Navigation

+ Flagon project page + + diff --git a/products/userale/example-server/esm.js b/products/userale/example-server/esm.js new file mode 100644 index 0000000..9c92148 --- /dev/null +++ b/products/userale/example-server/esm.js @@ -0,0 +1,84 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { UserALE, Configuration } from "/esm-build/main.mjs"; + +const userale = new UserALE( + Configuration.getInstance({ + url: "http://localhost:4318", + userId: "example-user", + toolName: "Apache UserALE ESM Example", + logCountThreshold: 20, + transmitInterval: 1000, + }) +); + +// --------------------------------------------------------------------------- +// addCallbacks — filtering +// --------------------------------------------------------------------------- +userale.addCallbacks({ + filter(log) { + const dropTypes = ["mouseup", "mouseover", "mousedown", "wheel"]; + if (dropTypes.includes(log.type)) { + return false; + } + return log; + }, +}); + +// --------------------------------------------------------------------------- +// addCallbacks — mapping +// --------------------------------------------------------------------------- +userale.addCallbacks({ + map(log) { + if (log.target === "button#test_button") { + return Object.assign({}, log, { customLabel: "map & packageLog Example" }); + } + return log; + }, +}); + +userale.start(); + +// Expose instance for integration tests (stop/start) +window._userale = userale; + +// --------------------------------------------------------------------------- +// Text field demo +// --------------------------------------------------------------------------- +document.addEventListener("change", function (e) { + if (e.target.value === "log") { + userale.log({ + type: "custom-log-demo", + logType: "custom", + userAction: false, + clientTime: Date.now(), + details: { demo: true }, + customField: "I can make this log look like anything I want", + }); + } +}); + +document.addEventListener("change", function (e) { + if (e.target.value === "packageCustomLog") { + userale.packageCustomLog( + { + type: "packageCustomLog-demo", + customLabel: "packageCustomLog demo", + customField: "merged with standard metadata", + }, + () => ({ timestamp: Date.now() }), + true, + ); + } +}); diff --git a/products/userale/example-server/iife.html b/products/userale/example-server/iife.html new file mode 100644 index 0000000..27c9aff --- /dev/null +++ b/products/userale/example-server/iife.html @@ -0,0 +1,78 @@ + + + + UserALE - IIFE Example Page + + + + + + +

+ This page lets you explore UserALE: how it deploys via script tag and what + data it generates. Logs are sent as OTLP to the collector at + data-url — point that at any OpenTelemetry-compatible endpoint. +

+
+ +

Click events

+
+ +
+ +

Form events

+

Interact with these fields to generate input, change, focus, and submit logs.

+
+ +

+ +
+ +
+ + +

+
+ Choice A
+ Choice B
+ Choice C +
+ +
+ +

Navigation

+ Flagon project page + + diff --git a/products/userale/example-server/iife.js b/products/userale/example-server/iife.js new file mode 100644 index 0000000..2b83f4d --- /dev/null +++ b/products/userale/example-server/iife.js @@ -0,0 +1,90 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// --------------------------------------------------------------------------- +// options API +// Set or override config values at runtime. Useful for injecting userId from +// your app's session context rather than a static data-user attribute. +// --------------------------------------------------------------------------- +window.userale.options({ + userId: "example-user", + toolName: "Apache UserALE Example", +}); + +// --------------------------------------------------------------------------- +// addCallbacks — filtering +// Return false (or a falsy value) from a callback to drop a log. +// This example drops high-frequency mouse and interval logs to reduce noise. +// --------------------------------------------------------------------------- +window.userale.addCallbacks({ + filter(log) { + const dropTypes = ["mouseup", "mouseover", "mousedown", "wheel"]; + if (dropTypes.includes(log.type)) { + return false; + } + return log; + }, +}); + +// --------------------------------------------------------------------------- +// addCallbacks — mapping +// Return a modified copy of the log to add or change fields. +// This example tags clicks on the "Click Me!" button with a custom label. +// --------------------------------------------------------------------------- +window.userale.addCallbacks({ + map(log) { + if (log.target === "button#test_button") { + return Object.assign({}, log, { customLabel: "map & packageLog Example" }); + } + return log; + }, +}); + +// --------------------------------------------------------------------------- +// Text field demo — type one of these values to see the corresponding API: +// +// "log" — userale.log(): append a fully custom log object +// "packageCustomLog" — userale.packageCustomLog(): merge custom fields with +// standard UserALE metadata +// --------------------------------------------------------------------------- + +document.addEventListener("change", function (e) { + if (e.target.value === "log") { + // Append a fully custom log built from scratch. + window.userale.log({ + type: "custom-log-demo", + logType: "custom", + userAction: false, + clientTime: Date.now(), + details: { demo: true }, + customField: "I can make this log look like anything I want", + userId: window.userale.options().userId, + toolName: window.userale.options().toolName, + }); + } +}); + +document.addEventListener("change", function (e) { + if (e.target.value === "packageCustomLog") { + // Merge custom fields with standard UserALE metadata automatically. + window.userale.packageCustomLog( + { + type: "packageCustomLog-demo", + customLabel: "packageCustomLog demo", + customField: "merged with standard metadata", + }, + () => ({ timestamp: Date.now() }), + true, + ); + } +}); diff --git a/products/userale/example-server/index.html b/products/userale/example-server/index.html new file mode 100644 index 0000000..3930c2b --- /dev/null +++ b/products/userale/example-server/index.html @@ -0,0 +1,78 @@ + + + + UserALE - Example Page + + + + + + +

+ This page lets you explore UserALE: how it deploys via script tag and what + data it generates. Logs are sent as OTLP to the collector at + data-url — point that at any OpenTelemetry-compatible endpoint. +

+
+ +

Click events

+
+ +
+ +

Form events

+

Interact with these fields to generate input, change, focus, and submit logs.

+
+ +

+ +
+ +
+ + +

+
+ Choice A
+ Choice B
+ Choice C +
+ +
+ +

Navigation

+ Flagon project page + + diff --git a/products/userale/example-server/index.js b/products/userale/example-server/index.js new file mode 100644 index 0000000..2b83f4d --- /dev/null +++ b/products/userale/example-server/index.js @@ -0,0 +1,90 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// --------------------------------------------------------------------------- +// options API +// Set or override config values at runtime. Useful for injecting userId from +// your app's session context rather than a static data-user attribute. +// --------------------------------------------------------------------------- +window.userale.options({ + userId: "example-user", + toolName: "Apache UserALE Example", +}); + +// --------------------------------------------------------------------------- +// addCallbacks — filtering +// Return false (or a falsy value) from a callback to drop a log. +// This example drops high-frequency mouse and interval logs to reduce noise. +// --------------------------------------------------------------------------- +window.userale.addCallbacks({ + filter(log) { + const dropTypes = ["mouseup", "mouseover", "mousedown", "wheel"]; + if (dropTypes.includes(log.type)) { + return false; + } + return log; + }, +}); + +// --------------------------------------------------------------------------- +// addCallbacks — mapping +// Return a modified copy of the log to add or change fields. +// This example tags clicks on the "Click Me!" button with a custom label. +// --------------------------------------------------------------------------- +window.userale.addCallbacks({ + map(log) { + if (log.target === "button#test_button") { + return Object.assign({}, log, { customLabel: "map & packageLog Example" }); + } + return log; + }, +}); + +// --------------------------------------------------------------------------- +// Text field demo — type one of these values to see the corresponding API: +// +// "log" — userale.log(): append a fully custom log object +// "packageCustomLog" — userale.packageCustomLog(): merge custom fields with +// standard UserALE metadata +// --------------------------------------------------------------------------- + +document.addEventListener("change", function (e) { + if (e.target.value === "log") { + // Append a fully custom log built from scratch. + window.userale.log({ + type: "custom-log-demo", + logType: "custom", + userAction: false, + clientTime: Date.now(), + details: { demo: true }, + customField: "I can make this log look like anything I want", + userId: window.userale.options().userId, + toolName: window.userale.options().toolName, + }); + } +}); + +document.addEventListener("change", function (e) { + if (e.target.value === "packageCustomLog") { + // Merge custom fields with standard UserALE metadata automatically. + window.userale.packageCustomLog( + { + type: "packageCustomLog-demo", + customLabel: "packageCustomLog demo", + customField: "merged with standard metadata", + }, + () => ({ timestamp: Date.now() }), + true, + ); + } +}); diff --git a/products/userale/packages/flagon-userale/test/spec/main.html b/products/userale/example-server/no-logging.html similarity index 74% rename from products/userale/packages/flagon-userale/test/spec/main.html rename to products/userale/example-server/no-logging.html index b4b99fe..1986cbe 100644 --- a/products/userale/packages/flagon-userale/test/spec/main.html +++ b/products/userale/example-server/no-logging.html @@ -5,22 +5,19 @@ The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - - - - - - -
- + + UserALE - No Logging + + +

This page has no UserALE instrumentation. Used by extension tests to verify the extension does not log uninstrumented pages by default.

+ + diff --git a/products/userale/example-server/server.js b/products/userale/example-server/server.js new file mode 100644 index 0000000..c587ed1 --- /dev/null +++ b/products/userale/example-server/server.js @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const express = require("express"); +const path = require("path"); + +const app = express(); +const port = process.env.PORT || 8000; + +app.use((req, res, next) => { + res.set({ + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET,OPTIONS", + "Access-Control-Allow-Headers": "Content-Type, Authorization", + }); + if (req.method === "OPTIONS") return res.sendStatus(200); + next(); +}); + +app.use("/build", express.static(path.join(__dirname, "../packages/iife/build"))); +app.use("/esm-build", express.static(path.join(__dirname, "../packages/core-sdk/build"))); +app.use("/", express.static(__dirname)); + +app.get("/", (req, res) => res.sendFile("iife.html", { root: __dirname })); +app.get("/iife", (req, res) => res.sendFile("iife.html", { root: __dirname })); +app.get("/esm", (req, res) => res.sendFile("esm.html", { root: __dirname })); +app.get("/no-logging", (req, res) => res.sendFile("no-logging.html", { root: __dirname })); + +function closeServer() { + console.log("Shutting down..."); + process.exit(0); +} + +process.on("SIGINT", closeServer); +process.on("SIGTERM", closeServer); + +if (require.main === module) { + app.listen(port, () => { + console.log(`UserALE example server running on port ${port}`); + }); +} diff --git a/products/userale/example/README.md b/products/userale/example/README.md deleted file mode 100644 index 861783e..0000000 --- a/products/userale/example/README.md +++ /dev/null @@ -1,144 +0,0 @@ - -# The UserALE Example Utility - -This directory provides - * example usage for UserALE deployed as a **script tag** within a simple HTML Webpage; - * a testing utility for developers to evaluate UserALE modifications to logged events; - * a means of viewing log event structure within a simple UserALE logging server; - * a means of testing UserALE API functions within a simple HTML Webpage. - -If you are interested in examples for a **module** deployment methodology, see the README in the [/webpack examples directory](https://github.com/apache/flagon-useralejs/tree/master/example/webpackUserAleExample). For details about our web extension, see -our [UserALE WebExtension documentation](https://github.com/apache/flagon-useralejs/tree/master/src/UserALEWebExtension). - -## Prerequisites - -Ensure that you have [node.js](https://nodejs.org/) installed. - -You will need to clone the [UserALE repository](https://github.com/apache/flagon-useralejs) and follow [Installation directions](https://github.com/apache/flagon-useralejs#installation). - -## Using the Example Page - -This Example Page is a simple HTML Webpage with UserALE included as a **script tag**. - -To generate UserALE logs with the Example Page, you may need to modify the 'src' HTML5 parameter of the UserALE script tag. - -The `src` parameter should reference the file path to your version of the minified UserALE script, in the /build dir of your cloned `flagon-useralejs` repository or `flagon-userale` node module. See the snippet below. - -``` - -``` -Once you've modified the script tag `src` field, save `index.html`. - -Next open index.html in your browser (you can drag it directly into a tab or double-click it). - -You will see a very simple HTML Webpage with a few interactive features. - -On this page, all user events will be captured and sent to the logging server. See instructions below. - -## Testing with the Example Page - -The UserALE Example page can be used to test the structure of logs after instrumentation or UserALE src code modification. It can also be used to experiment with UserALE API functions. - -In order to experiment with various elements of the UserALE API, simply modify the well documented API examples in `index.js`. Details about the API can be found at the [UserALE parent README](https://github.com/apache/flagon-useralejs/tree/FLAGON-469). However, a complete list of exported functions in the API can be found below: - -| Function | Description | Notes | -|---|---|---| -| userale.options | modify userale's configuration option | see top level README for complete list of options | -| [DEPRECATED] userale.filter | filters out logs from logging queue by keys or values | filters are callbacks with global scope | -| [DEPRECATED] userale.map | modify/add log keys or values | mappings are callbacks with global scope | -| userale.addCallbacks | add one or more callbacks to be executed during log packaging | callbacks have global scope | -| userale.removeCallbacks | remove one or more callbacks by name | Removes callbacks added from userale.addCallbacks | -| userale.log | appends a custom log to the log queue | the custom log object is an object key:value pairs | -| userale.packageLog | transforms the provided event into a log and appends it to the log queue | designed for HTML events | -| userale.packageCustomLog | packages the provided customLog to include standard meta data and appends it to the log queue | designed for non HTML events| -| userale.details | defines the way information is extracted from various events | supports packageLog/packageCustomLog 'details' | -| userale.getSelector | builds a string CSS selector from the provided HTML element id | populates 'target' field in packaged logs | -| userale.buildPath| builds an array of elements from the provided event target, to the root element (DOM path) | populates the 'path' field in packaged logs | -| userale.start | used to start the logging process if | unecessary if 'autostart' is set to true in initial setting (default) | -| userale.stop | halts the logging process. Logs will no longer be sent | will need to invoke userale.start to restart logging | - -NOTE: Each modification of `index.html` or `index.js` will require that you both save the modifications and refresh the webpage in your browser. - -See the [Flagon website](http://flagon.apache.org/) for additional documentation on the [API](http://flagon.apache.org/docs/useralejs/API/) and [testing for scale](http://flagon.apache.org/docs/stack/scaling/). - -## Capturing Logs Using the Logging Server - -The example logging server receives log from any UserALE instrumented page at `localhost:8000`. - -This means you can test logs from your own instrumented application, the [UserALE WebExtension](https://github.com/apache/flagon-useralejs/tree/master/src/UserALEWebExtension), -or the UserALE Example Page, so long as the `data-url` parameter is set to `localhost:8000`. This is the default setting for both the WebExtension and UserALE Example Page. See the example above. - -Once your UserALE script tag is properly configured to point to a minified UserALE script, and `localhost:8000`, you can log to the Example Logging Server. - -from the `/example` directory or its parent directory, run the following: - -``` -$npm run example:watch -``` - -Once started you will see: - -``` -> flagon-userale@2.2.0 example:watch ... -> nodemon -w ./example example/server.js - -[nodemon] 1.19.1 -[nodemon] to restart at any time, enter `rs` -[nodemon] watching: ... -[nodemon] starting `node example/server.js` -UserAle Local running on port 8000 -``` - -Then start using your instrumented application, browser, or the UserALE Example Page, and you will see logs propagating in the terminal: - -``` - -[ { target: 'body', - path: [ 'body', 'html' ], - clientTime: 1504287557492, - location: { x: 0, y: 0 }, - type: 'keydown', - userAction: true, - details: null, - userId: 'example-user', - toolVersion: '2.2.0', - toolName: 'Apache UserALE Example', - useraleVersion: '2.2.0' }, - ... -] -``` - -Kill the logging script with `^C` or as you would any bash script. - -##Reviewing Logs Collected with the Example Server - -In addition to showing in your terminal, logs collected by the UserALE Example Server are written locally to file. - -Find them in `/logs` under the top level flagon-userale dir. A new log file will appear each time you restart the logging server. - -## Contributing - -Contributions are welcome! Simply [submit an issue](https://github.com/apache/flagon-useralejs/issues) for problems you encounter or submit a pull request for your feature or bug fix. The core team will review it and work with you to incorporate it into UserALE. \ No newline at end of file diff --git a/products/userale/example/log.schema.json b/products/userale/example/log.schema.json deleted file mode 100644 index 28571a7..0000000 --- a/products/userale/example/log.schema.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://flagon.incubator.apache.org/log.schema.json", - "title": "Log", - "description": "A raw or custom log produced by userale", - "type": "object", - "properties": { - "target": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "pageUrl": { - "type": "string" - }, - "pageTitle": { - "type": "string" - }, - "userAgent": { - "type": "string" - }, - "clientTime": { - "type": "integer" - }, - "microTime": { - "type": "number", - "minimum": 0, - "maxmaximumi": 1 - }, - "location": { - "type": "object", - "properties": { - "x": { - "type": ["integer", "null"] - }, - "y": { - "type": ["integer", "null"] - } - }, - "required" : ["x", "y"] - }, - "scrnRes": { - "type": "object", - "properties": { - "height": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required" : ["height", "width"] - }, - "type": { - "type": "string" - }, - "logType": { - "type": "string", - "enum": ["raw", "custom"] - }, - "userAction": { - "type": "boolean" - }, - "details": { - "type": ["object", "null"] - }, - "userId": { - "type": ["string", "null"] - }, - "toolVersion": { - "type":["string", "null"] - }, - "toolName": { - "type": ["string", "null"] - }, - "useraleVersion": { - "type": "string" - }, - "sessionId": { - "type": "string" - } - }, - "required": [ - "pageUrl", - "pageTitle", - "pageReferrer", - "userAgent", - "clientTime", - "scrnRes", - "logType", - "userAction", - "details", - "userId", - "toolVersion", - "toolName", - "useraleVersion", - "sessionId" - ], - "if": { - "properties": { "logType": { "const": "raw" } } - }, - "then": { - "required": [ - "target", - "path", - "microTime", - "location", - "type" - ] - } -} \ No newline at end of file diff --git a/products/userale/example/server/index.html b/products/userale/example/server/index.html deleted file mode 100644 index 799c951..0000000 --- a/products/userale/example/server/index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - UserALE - Example Page - - - - - - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - diff --git a/products/userale/example/server/index.js b/products/userale/example/server/index.js deleted file mode 100644 index 20256cc..0000000 --- a/products/userale/example/server/index.js +++ /dev/null @@ -1,177 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** Options API - * - * the 'options' API allows you to dynamically change UserALE params and set meta data values - * pass in variables or properties into the options object, such as from sessionStorage or localStorage - * NOTE: logDetails is set to true (default:false), this will log key strokes, inputs, and change events - * (be careful of your form data and auth workflows!) - */ -console.log -const changeMe = "me"; -window.userale.options({ - userId: changeMe, - logDetails: true, - toolName: "Apache UserALE Example (Custom)", -}); - -/**Filter API - -/**the 'filter' API allows you to eliminate logs you don't want - * use as a global filter and add classes of events or log types to eliminate - * or use in block scope to surgically eliminate logs from specific elements from an event handler - * The filter below reduces logs to capture click, change, select, scroll and submit events on index.html - * Note that for surgical filters, you may need to clear or reset back to a global filter callback - * the same is true for the 'map' API. See examples below: - */ -window.userale.addCallbacks({ - filter(log) { - var type_array = [ - "mouseup", - "mouseover", - "mousedown", - "keydown", - "dblclick", - "blur", - "focus", - "input", - "wheel", - ]; - var logType_array = ["interval"]; - if (type_array.includes(log.type) || logType_array.includes(log.logType)) { - return false; - } - return log; - }, -}); - -/**Log Mapping API - * - * the 'map' API allows you to add or modify new fields to your logs - * this example works with the "Click Me!" button at the top of index.html - */ -document.addEventListener("click", function (e) { - if (e.target.innerHTML === "Click Me!") { - window.userale.addCallbacks({ - map(log) { - return Object.assign({}, log, { - logType: "custom", - customLabel: "map & packageLog Example", - }); - }, - }); - window.userale.packageLog( - e, - window.userale.details(window.userale.options(), e.type) - ); - /**you'll want to reset the map callback function, or set a conditional (e.g., return log), else - * the callback may be applied to other events of the same class (e.g., click) */ - window.userale.removeCallbacks(["map"]); - } else { - return false; - } -}); - -/** Alternate Log Mapping API Example - * Build a global mapping function with conditional logic to modify logs for similar events - * this example works with the "Click Me!" button at the top of index.html - * Also, note that specifying log as a return will keep the scope of this callback limited to only the events you want - */ -//window.userale.map(function (log, e) { -// var targetsForLabels = ["button#test_button"]; -// if (targetsForLabels.includes(log.target)) { -// return Object.assign({}, log, { customLabel: e.target.innerHTML }); -// } else { -// return log; -// } -//}); - -/**'Log' API and Custom Log Functions - * - * the 'log' API generate custom events and add them to the log queue - * pass in any keys:values for fully customized logs - * utilize 'options' and other functions to streamline populating custom logs - * type 'log' into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "log") { - window.userale.log({ - target: window.userale.getSelector(e.target), - path: window.userale.buildPath(e), - clientTime: Date.now(), - type: e.type, - logType: "custom", - userAction: false, - details: { foo: "bar", bar: "foo" }, - customField1: "I can make this log look like anything I want", - customField2: "foo", - userId: window.userale.options().userId, - toolVersion: window.userale.options().version, - toolName: window.userale.options().toolName, - useraleVersion: window.userale.options().useraleVersion, - sessionId: window.userale.options().sessionId, - customLabel: "Custom Log Example", - }); - } -}); - -/**you can also use UserALE' own packaging function for HTML events to strive for standardization - * type 'packageLog into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "packageLog") { - /**You can then use the 'Mapping' API function to modify custom logs created with the packageLog function*/ - window.userale.addCallbacks({ - changeMap(log) { - var targetsForLabels = ["change"]; - if (targetsForLabels.includes(log.type)) { - return Object.assign({}, log, { - logType: "custom", - customLabel: "packageLog Example", - }); - } else { - return log; - } - }, - }); - /**You can also use the details function to package additional log meta data, or add custom details*/ - window.userale.packageLog( - e, - window.userale.details(window.userale.options(), e.type) - ); - } else { - return false; - } -}); - -/**you can also just add boilerplate UserALE meta data to custom logs with the packageCustomLog function - * type 'packageCustomLog into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "packageCustomLog") { - window.userale.packageCustomLog( - { - customLabel: "packageCustomLog Example", - customField1: "foo", - customField2: "bar", - }, - function () { - return { foo: "bar", bar: "foo" }; - }, - true - ); - } else { - return false; - } -}); diff --git a/products/userale/example/server/no-logging.html b/products/userale/example/server/no-logging.html deleted file mode 100644 index 4f5cbb5..0000000 --- a/products/userale/example/server/no-logging.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - UserALE - Example Page - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - \ No newline at end of file diff --git a/products/userale/example/server/server.js b/products/userale/example/server/server.js deleted file mode 100644 index 7ab21d6..0000000 --- a/products/userale/example/server/server.js +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * for additional information. The ASF licenses this file under - * the Apache License, Version 2.0. - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -const express = require("express"); -const http = require("http"); -const ws = require("ws"); -const bodyParser = require("body-parser"); -const fs = require("fs"); -const path = require("path"); - -const app = express(); -const port = process.env.PORT || 8000; - -// --- Setup log file --- -const logDirectory = path.resolve(__dirname, "../logs"); -if (!fs.existsSync(logDirectory)) fs.mkdirSync(logDirectory); - -const logPath = path.join(logDirectory, `logs_${Date.now()}.json`); -const wStream = fs.createWriteStream(logPath); -wStream.write("["); -let firstLog = true; - -function writeLogs(logs) { - if (!Array.isArray(logs) || logs.length === 0) return; - - if (firstLog) { - wStream.write("\n\t"); - firstLog = false; - } else { - wStream.write(",\n\t"); - } - - wStream.write(logs.map(JSON.stringify).join(",\n\t")); -} - -// --- Express Middleware --- -app.use((req, res, next) => { - res.set({ - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Methods": "GET,PUT,POST,DELETE,OPTIONS", - "Access-Control-Allow-Headers": "Content-Type, Authorization, Content-Length, X-Requested-With", - }); - - if (req.method === "OPTIONS") return res.sendStatus(200); - next(); -}); - -app.use(bodyParser.urlencoded({ extended: true, limit: "100mb" })); -app.use(bodyParser.json({ limit: "100mb" })); -app.use(bodyParser.text()); - -app.use("/build", express.static(path.join(__dirname, "../../packages/flagon-userale/build"))); -app.use("/", express.static(__dirname)); - -app.get("/", (req, res) => res.sendFile("index.html", { root: __dirname })); -app.get("/ws", (req, res) => res.sendFile("ws-index.html", { root: __dirname })); -app.get("/no-logging", (req, res) => res.sendFile("no-logging.html", { root: __dirname })); - -app.post("/", (req, res) => { - const body = typeof req.body === "string" ? JSON.parse(req.body) : req.body; - - if ( - (Array.isArray(body) && body.length === 0) || - (typeof body === "object" && body !== null && Object.keys(body).length === 0) - ) { - return res.sendStatus(200); - } - - console.log("HTTP POST:", body); - writeLogs(body); - res.sendStatus(200); -}); - -// --- Shared HTTP + WS Server --- -const httpServer = http.createServer(app); -const wss = new ws.WebSocketServer({ noServer: true }); - -httpServer.on("upgrade", (req, socket, head) => { - if (req.url === "/ws" || req.url === "/") { - wss.handleUpgrade(req, socket, head, (wsSocket) => { - wss.emit("connection", wsSocket, req); - }); - } else { - socket.destroy(); - } -}); - -wss.on("connection", (socket) => { - console.log("WebSocket client connected"); - - socket.on("message", (message) => { - const raw = typeof message === "string" ? message : message.toString(); - let body; - try { - body = JSON.parse(raw); - } catch (err) { - console.warn("Invalid JSON from WebSocket:", raw); - return; - } - - if ( - (Array.isArray(body) && body.length === 0) || - (typeof body === "object" && body !== null && Object.keys(body).length === 0) - ) { - return; - } - - console.log("WebSocket POST:", body); - writeLogs(body); - }); - - socket.on("close", () => console.log("WebSocket client disconnected")); -}); - -// --- Graceful Shutdown --- -function closeLogServer() { - console.log("Shutting down..."); - - wStream.end("\n]", () => { - httpServer.close(() => { - console.log("HTTP server closed."); - wss.close(() => { - console.log("WebSocket server closed."); - process.exit(0); - }); - }); - }); -} - -process.on("SIGINT", closeLogServer); -process.on("SIGTERM", closeLogServer); -process.on("uncaughtException", (err) => { - console.error("Uncaught exception:", err); - closeLogServer(); -}); -process.on("unhandledRejection", (reason) => { - console.error("Unhandled rejection:", reason); - closeLogServer(); -}); - -// --- Conditional Start --- -if (require.main === module) { - httpServer.listen(port, () => { - console.log(`UserAle HTTP + WebSocket server running on port ${port}`); - }); -} diff --git a/products/userale/example/server/ws-index.html b/products/userale/example/server/ws-index.html deleted file mode 100644 index 15650d2..0000000 --- a/products/userale/example/server/ws-index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - UserALE - Example Page - - - - - - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - diff --git a/products/userale/package.json b/products/userale/package.json index 016a4df..008a0c8 100644 --- a/products/userale/package.json +++ b/products/userale/package.json @@ -6,10 +6,10 @@ "format": "prettier --ignore-path .gitignore --write 'packages/**/{src,test}/**/*.{ts,js,tsx,jsx}'", "lint": "eslint 'packages/**/src/**/*.{ts,js,tsx,jsx}' --fix", "build": "pnpm -r run build", - "test": "playwright test -c ./test/playwright.config.ts && pnpm -r test", - "pretest": "npx playwright install", - "example:run": "node example/server/server.js", - "example:watch": "nodemon -w ./example/server example/server/server.js" + "test": "pnpm -r test && pnpm exec playwright test -c ./test/playwright.config.ts", + "pretest": "pnpm exec playwright install", + "example:run": "node example-server/server.js", + "example:watch": "nodemon -w ./example-server example-server/server.js" }, "devDependencies": { "@eslint/js": "^9.29.0", @@ -21,12 +21,10 @@ "eslint-plugin-jest": "^29.0.1", "express": "^4.18.2", "flagon-userale": "workspace:flagon-userale", - "jsonschema": "^1.4.1", "nodemon": "^3.0.2", "pnpm": "^10.0.0", "prettier": "3.6.0", "typescript": "^5.8.3", - "typescript-eslint": "^7.8.0", - "ws": "^8.18.0" + "typescript-eslint": "^7.8.0" } } \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/.gitignore b/products/userale/packages/core-sdk/.gitignore similarity index 100% rename from products/userale/packages/flagon-userale/.gitignore rename to products/userale/packages/core-sdk/.gitignore diff --git a/products/userale/packages/flagon-userale/CHANGELOG.md b/products/userale/packages/core-sdk/CHANGELOG.md similarity index 100% rename from products/userale/packages/flagon-userale/CHANGELOG.md rename to products/userale/packages/core-sdk/CHANGELOG.md diff --git a/products/userale/packages/flagon-userale/CONTRIBUTING.md b/products/userale/packages/core-sdk/CONTRIBUTING.md similarity index 100% rename from products/userale/packages/flagon-userale/CONTRIBUTING.md rename to products/userale/packages/core-sdk/CONTRIBUTING.md diff --git a/products/userale/packages/core-sdk/README.md b/products/userale/packages/core-sdk/README.md new file mode 100644 index 0000000..ca2f6cc --- /dev/null +++ b/products/userale/packages/core-sdk/README.md @@ -0,0 +1,173 @@ + + +# Apache Flagon UserALE + +![Node.js CI](https://github.com/apache/flagon/workflows/userale_ci%20CI/badge.svg) +![npm](https://img.shields.io/npm/v/flagon-userale) +[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) + +Client-side behavioral telemetry for web applications. Captures DOM events and emits them as [OpenTelemetry](https://opentelemetry.io/) log records (OTLP/HTTP JSON) to any compatible collector. + +Part of the [Apache Flagon Project](http://flagon.apache.org/). + +## Install + +```sh +npm install flagon-userale +# or +pnpm add flagon-userale +``` + +## Quickstart + +### ES module (bundler / Node) + +```js +import { UserALE, Configuration } from 'flagon-userale'; + +const userale = new UserALE( + Configuration.getInstance({ + url: 'http://localhost:4318', + userId: 'alice', + toolName: 'my-app', + }) +); + +userale.start(); +``` + +### Script tag (no bundler) + +Use the [`flagon-userale-iife`](../iife/) package instead. It loads via a ` +``` + +## API + +### Lifecycle + +| Method | Description | +|---|---| +| `userale.start()` | Begin capturing events and sending logs | +| `userale.stop()` | Stop sending; clears the transmit interval | +| `userale.capture()` | Attach event handlers without starting the sender (used in extension content scripts) | + +### Callbacks + +Callbacks let you filter, map, or reroute every log before it is sent. + +```js +userale.addCallbacks({ + // Return false to drop the log entirely + filter(log) { + return ['mouseup', 'mouseover'].includes(log.type) ? false : log; + }, + + // Mutate or replace the log object + map(log) { + return { ...log, appVersion: '1.2.3' }; + }, + + // Intercept logs for custom transport (return false to suppress local send) + rerouteLog(log) { + myAnalyticsPipeline.send(log); + return false; + }, +}); + +userale.removeCallbacks(['filter']); +``` + +### Custom logs + +```js +// Emit a fully custom log +userale.log({ + type: 'custom-event', + logType: 'custom', + userAction: false, + clientTime: Date.now(), + details: { myKey: 'myValue' }, +}); + +// Package a log with standard metadata merged in +userale.packageCustomLog( + { type: 'button-click', customLabel: 'Save' }, + () => ({ timestamp: Date.now() }), + true // userAction +); +``` + +### Runtime options + +```js +userale.options({ url: 'https://my-collector/v1/logs', userId: 'bob' }); +``` + +### Flush + +Force-send all queued logs immediately: + +```js +await userale.flush(); +``` + +## Wire format + +UserALE emits [OTLP/HTTP JSON](https://opentelemetry.io/docs/specs/otlp/) to `POST /v1/logs` on the configured endpoint. + +| Log type | OTLP signal | Sent when | +|---|---|---| +| `raw` — DOM events | LogRecord | On every captured DOM event | +| `custom` — developer-emitted | LogRecord | On `userale.log()` / `packageCustomLog()` | +| `interval` — dwell/interaction spans | LogRecord | On periodic transmit interval | + +UserALE-specific fields are attached as `userale.*` attributes. Browser context maps to OTel semantic conventions (`browser.url`, `user_agent.original`, etc.). + +## Local development + +```sh +pnpm install +pnpm build # → build/main.mjs (ESM) +pnpm test # Jest unit tests +``` + +For a runnable demo and full API usage examples, see [`example-server/`](../../example-server/) in the workspace root. Start it with `pnpm example:run` from the workspace root, then visit `http://localhost:8000/esm`. + +For local log collection, start the shared Jaeger collector from the flagon project root: + +```sh +pnpm collector:up # OTLP on :4318, Jaeger UI on :16686 +``` + +## Contributing + +[Submit an issue](https://github.com/apache/flagon/issues) or open a pull request. See the [contribution guide](http://flagon.apache.org/docs/contributing/) and [mailing list](dev-subscribe@flagon.apache.org). + +## License + +Apache License 2.0. See [LICENSE](https://github.com/apache/flagon/blob/master/LICENSE) and [NOTICE](https://github.com/apache/flagon/blob/master/NOTICE). diff --git a/products/userale/packages/core-sdk/build/Configuration.d.ts b/products/userale/packages/core-sdk/build/Configuration.d.ts new file mode 100644 index 0000000..b90fc23 --- /dev/null +++ b/products/userale/packages/core-sdk/build/Configuration.d.ts @@ -0,0 +1,61 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import type { Settings } from "@/types"; +export declare class Configuration { + [key: string]: Settings.ConfigValueTypes; + private static instance; + autostart: boolean; + authHeader: Settings.AuthHeader; + browserSessionId: Settings.SessionId; + custIndex: Settings.CustomIndex; + headers: Settings.Headers; + httpSessionId: Settings.SessionId; + logCountThreshold: number; + logDetails: boolean; + on: boolean; + resolution: number; + sessionId: Settings.SessionId; + time: Settings.TimeFunction; + toolName: Settings.ToolName; + toolVersion: Settings.Version; + transmitInterval: number; + url: string; + userFromParams: Settings.UserFromParams; + useraleVersion: Settings.Version; + userId: Settings.UserId; + version: Settings.Version; + private constructor(); + static getInstance(): Configuration; + private initialize; + /** + * Resets the configuration to its initial state. + */ + reset(): void; + /** + * Shallow merges a newConfig with the configuration class, updating it. + * Retrieves/updates the userid if userFromParams is provided. + * @param {Partial} newConfig Configuration object to merge into the current config. + */ + update(newConfig: Partial): void; + /** + * Attempts to extract the userid from the query parameters of the URL. + * @param {string} param The name of the query parameter containing the userid. + * @return {string | null} The extracted/decoded userid, or null if none is found. + */ + static getUserIdFromParams(param: string): string | null; +} +//# sourceMappingURL=Configuration.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/Packager.d.ts b/products/userale/packages/core-sdk/build/Packager.d.ts new file mode 100644 index 0000000..7af534e --- /dev/null +++ b/products/userale/packages/core-sdk/build/Packager.d.ts @@ -0,0 +1,77 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Callbacks, Logging } from "@/types"; +import type { Configuration } from "@/Configuration"; +export declare class Packager { + logs: Array; + config: Configuration; + cbHandlers: Callbacks.CallbackMap; + private intervalId; + private intervalType; + private intervalPath; + private intervalTimer; + private intervalCounter; + constructor(logs: Array, config: Configuration); + addCallbacks(...newCallbacks: Record[]): Callbacks.CallbackMap; + removeCallbacks(targetKeys: string[]): void; + private applyPipeline; + packageLog(e: Event, detailFcn?: Logging.DynamicDetailFunction | null): boolean; + packageCustomLog(userLog: Logging.UserLog, detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, userAction: boolean): boolean; + packageIntervalLog(e: Event): boolean; +} +/** + * Extracts the millisecond and microsecond portions of a timestamp. + */ +export declare function extractTimeFields(timeStamp: number): { + milli: number; + micro: number; +}; +/** + * Extracts coordinate information from the event. + */ +export declare function getLocation(e: Event): { + x: number | null; + y: number | null; +}; +/** + * Returns the viewport dimensions as a screen resolution estimate. + */ +export declare function getScreenRes(): { + width: number; + height: number; +}; +/** + * Builds a CSS selector string from an event target element. + */ +export declare function getSelector(ele: EventTarget): string; +/** + * Builds a CSS selector path from the event's composed path. + */ +export declare function buildPath(e: Event): string[]; +/** + * Maps an array of event targets to CSS selector strings. + */ +export declare function selectorizePath(path: EventTarget[]): string[]; +/** + * Builds an object of element attributes, attempting JSON parsing on values. + */ +export declare function buildAttrs(e: Event): Logging.JSONObject; +/** + * Builds an object of inline CSS properties from the event target. + */ +export declare function buildCSS(e: Event): Logging.JSONObject; +//# sourceMappingURL=Packager.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/Sender.d.ts b/products/userale/packages/core-sdk/build/Sender.d.ts new file mode 100644 index 0000000..55c987d --- /dev/null +++ b/products/userale/packages/core-sdk/build/Sender.d.ts @@ -0,0 +1,29 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Configuration } from "@/Configuration"; +import { Logging } from "@/types"; +export declare class Sender { + private sendIntervalId; + private activeTraceId; + private activeSpanId; + start(logs: Array, config: Configuration): void; + stop(): void; + onInterval(logs: Array, config: Configuration): ReturnType; + onClose(logs: Array, config: Configuration): void; + flush(logs: Array, config: Configuration): Promise; +} +//# sourceMappingURL=Sender.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/UserALE.d.ts b/products/userale/packages/core-sdk/build/UserALE.d.ts new file mode 100644 index 0000000..3c1f0d2 --- /dev/null +++ b/products/userale/packages/core-sdk/build/UserALE.d.ts @@ -0,0 +1,53 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Configuration } from "@/Configuration"; +import type { Settings, Logging } from "@/types"; +export declare class UserALE { + readonly config: Configuration; + private readonly packager; + private readonly sender; + private readonly logs; + private started; + constructor(config: Configuration); + /** + * Starts capturing events and sending logs. + * In browser contexts waits for the DOM to be ready. + * In worker/service-worker contexts starts immediately. + * Safe to call again after options() — the sender restarts with the new config. + */ + start(): void; + /** + * Captures events and routes them through callbacks, but does not start the + * sender. Use this in content-script contexts where a separate background + * instance owns transport — the rerouteLog callback intercepts every log + * before it can be queued, so no fetch calls are ever made from the page. + */ + capture(): void; + /** + * Stops sending logs and clears the sender interval. + */ + stop(): void; + private whenReady; + private attach; + options(newConfig?: Partial): Settings.Config; + log(customLog: Logging.UserLog | undefined): boolean; + flush(): Promise; + addCallbacks(...newCallbacks: Record[]): void; + removeCallbacks(targetKeys: string[]): void; + packageCustomLog(userLog: Logging.UserLog, detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, userAction: boolean): boolean; +} +//# sourceMappingURL=UserALE.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/attachHandlers.d.ts b/products/userale/packages/core-sdk/build/attachHandlers.d.ts similarity index 96% rename from products/userale/packages/flagon-userale/build/attachHandlers.d.ts rename to products/userale/packages/core-sdk/build/attachHandlers.d.ts index 0c73fc6..f3b5cf9 100644 --- a/products/userale/packages/flagon-userale/build/attachHandlers.d.ts +++ b/products/userale/packages/core-sdk/build/attachHandlers.d.ts @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { Packager } from "@/packageLogs"; import { Events, Logging, Settings } from "@/types"; import { Configuration } from "@/configure"; /** @@ -93,5 +94,5 @@ export declare function defineCustomDetails(options: Settings.DefaultConfig, typ * @param {Configuration} config Configuration singleton to use. * @return {boolean} Whether the operation succeeded */ -export declare function attachHandlers(config: Configuration): boolean; +export declare function attachHandlers(config: Configuration, packager: Packager): boolean; //# sourceMappingURL=attachHandlers.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/configure.d.ts b/products/userale/packages/core-sdk/build/configure.d.ts similarity index 98% rename from products/userale/packages/flagon-userale/build/configure.d.ts rename to products/userale/packages/core-sdk/build/configure.d.ts index 488f922..6e4ce6d 100644 --- a/products/userale/packages/flagon-userale/build/configure.d.ts +++ b/products/userale/packages/core-sdk/build/configure.d.ts @@ -38,7 +38,6 @@ export declare class Configuration { useraleVersion: Settings.Version; userId: Settings.UserId; version: Settings.Version; - websocketsEnabled: boolean; private constructor(); static getInstance(): Configuration; private initialize; diff --git a/products/userale/packages/flagon-userale/build/getInitialSettings.d.ts b/products/userale/packages/core-sdk/build/getInitialSettings.d.ts similarity index 66% rename from products/userale/packages/flagon-userale/build/getInitialSettings.d.ts rename to products/userale/packages/core-sdk/build/getInitialSettings.d.ts index db51818..3dd4417 100644 --- a/products/userale/packages/flagon-userale/build/getInitialSettings.d.ts +++ b/products/userale/packages/core-sdk/build/getInitialSettings.d.ts @@ -18,20 +18,16 @@ import type { Settings } from "./types"; /** * Extracts the initial configuration settings from the * currently executing script tag. - * @return {Object} The extracted configuration object */ export declare function getInitialSettings(): Settings.Config; /** - * defines sessionId, stores it in sessionStorage, checks to see if there is a sessionId in - * storage when script is started. This prevents events like 'submit', which refresh page data - * from refreshing the current user session - * + * Retrieves a session ID from sessionStorage, creating and storing it if absent. + * Preserves the session across page refreshes (e.g. after form submit). */ -export declare function getsessionId(sessionKey: string, value: any): any; +export declare function getOrCreateSessionId(key: string, defaultValue: string): string; /** - * Creates a function to normalize the timestamp of the provided event. - * @param {Event} e An event containing a timeStamp property. - * @return {typeof timeStampScale~tsScaler} The timestamp normalizing function. + * Returns a function that normalises a browser event timestamp to Unix ms, + * accounting for cross-browser quirks in how timeStamp is reported. */ export declare function timeStampScale(e: Event): Settings.TimeFunction; //# sourceMappingURL=getInitialSettings.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/handlers/attach.d.ts b/products/userale/packages/core-sdk/build/handlers/attach.d.ts new file mode 100644 index 0000000..ce58716 --- /dev/null +++ b/products/userale/packages/core-sdk/build/handlers/attach.d.ts @@ -0,0 +1,26 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Packager } from "@/Packager"; +import { Configuration } from "@/Configuration"; +/** + * Hooks the event handlers for each event type of interest. + * @param {Configuration} config Configuration singleton to use. + * @param {Packager} packager Packager instance to route events through. + * @return {boolean} Whether the operation succeeded. + */ +export declare function attachHandlers(config: Configuration, packager: Packager): boolean; +//# sourceMappingURL=attach.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/handlers/eventDetails.d.ts b/products/userale/packages/core-sdk/build/handlers/eventDetails.d.ts new file mode 100644 index 0000000..dff8def --- /dev/null +++ b/products/userale/packages/core-sdk/build/handlers/eventDetails.d.ts @@ -0,0 +1,81 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Events, Logging, Settings } from "@/types"; +/** + * Maps a MouseEvent to an object containing useful information. + */ +export declare function extractMouseDetails(e: MouseEvent): { + clicks: number; + ctrl: boolean; + alt: boolean; + shift: boolean; + meta: boolean; +}; +/** + * Maps a KeyboardEvent to an object containing useful information. + */ +export declare function extractKeyboardDetails(e: KeyboardEvent): { + key: string; + code: string; + ctrl: boolean; + alt: boolean; + shift: boolean; + meta: boolean; +}; +/** + * Maps an InputEvent to an object containing useful information. + */ +export declare function extractInputDetails(e: InputEvent): { + value: string; +}; +/** + * Maps a ChangeEvent to an object containing useful information. + */ +export declare function extractChangeDetails(e: Events.ChangeEvent): { + value: any; +}; +/** + * Maps a WheelEvent to an object containing useful information. + */ +export declare function extractWheelDetails(e: WheelEvent): { + x: number; + y: number; + z: number; +}; +/** + * Maps a ScrollEvent to an object containing useful information. + */ +export declare function extractScrollDetails(): { + x: number; + y: number; +}; +/** + * Maps a ResizeEvent to an object containing useful information. + */ +export declare function extractResizeDetails(): { + width: number; + height: number; +}; +/** + * Defines the event detail extractors and the events to listen for. + */ +export declare function defineDetails(config: Settings.DefaultConfig): Events.EventDetailsMap; +/** + * Returns the detail extractor for a given event type, respecting the config. + */ +export declare function defineCustomDetails(options: Settings.DefaultConfig, type: Events.AllowedEvents): Logging.DynamicDetailFunction | null | undefined; +//# sourceMappingURL=eventDetails.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/react-app-example/src/setupTests.js b/products/userale/packages/core-sdk/build/main.d.ts similarity index 66% rename from products/userale/packages/flagon-userale/example/react-app-example/src/setupTests.js rename to products/userale/packages/core-sdk/build/main.d.ts index 08020be..ef27f61 100644 --- a/products/userale/packages/flagon-userale/example/react-app-example/src/setupTests.js +++ b/products/userale/packages/core-sdk/build/main.d.ts @@ -1,4 +1,4 @@ -/* +/*! * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. @@ -14,9 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import "@testing-library/jest-dom"; +export { UserALE } from "@/UserALE"; +export { Configuration } from "@/Configuration"; +export { defineCustomDetails as details } from "@/handlers/eventDetails"; +export { registerAuthCallback } from "@/utils/auth"; +export { generateTraceId, generateSpanId } from "@/utils/ids"; +export type { Logging, OTLP } from "@/types"; +export { version } from "../package.json"; +//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/main.mjs b/products/userale/packages/core-sdk/build/main.mjs new file mode 100644 index 0000000..8ff8eb9 --- /dev/null +++ b/products/userale/packages/core-sdk/build/main.mjs @@ -0,0 +1,1076 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ +// package.json +var version = "2.4.0"; + +// src/Packager.ts +var Packager = class { + constructor(logs, config) { + this.intervalId = null; + this.intervalType = null; + this.intervalPath = null; + this.intervalTimer = null; + this.intervalCounter = 0; + this.logs = logs; + this.config = config; + this.cbHandlers = {}; + } + addCallbacks(...newCallbacks) { + for (const source of newCallbacks) { + const descriptors = {}; + for (const key of Object.keys(source)) { + const d = Object.getOwnPropertyDescriptor(source, key); + if (d) + descriptors[key] = d; + } + for (const sym of Object.getOwnPropertySymbols(source)) { + const d = Object.getOwnPropertyDescriptor(source, sym); + if (d?.enumerable) + descriptors[sym] = d; + } + Object.defineProperties(this.cbHandlers, descriptors); + } + return this.cbHandlers; + } + removeCallbacks(targetKeys) { + for (const key of targetKeys) { + if (Object.prototype.hasOwnProperty.call(this.cbHandlers, key)) { + delete this.cbHandlers[key]; + } + } + } + applyPipeline(log, e) { + for (const func of Object.values(this.cbHandlers)) { + if (typeof func === "function") { + log = func(log, e); + if (!log) + return null; + } + } + return log; + } + packageLog(e, detailFcn) { + if (!this.config.on) + return false; + const timeFields = extractTimeFields( + e.timeStamp && e.timeStamp > 0 ? this.config.time(e.timeStamp) : Date.now() + ); + const raw = { + target: e.target ? getSelector(e.target) : null, + path: buildPath(e), + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: timeFields.milli, + microTime: timeFields.micro, + location: getLocation(e), + scrnRes: getScreenRes(), + type: e.type, + logType: "raw", + userAction: true, + details: detailFcn ? detailFcn(e) : null, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId, + attributes: buildAttrs(e), + style: buildCSS(e) + }; + const result = this.applyPipeline(raw, e); + if (!result) + return false; + this.logs.push(result); + return true; + } + packageCustomLog(userLog, detailFcn, userAction) { + if (!this.config.on) + return false; + const details = detailFcn.length === 0 ? detailFcn() : null; + const log = Object.assign( + { + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: Date.now(), + scrnRes: getScreenRes(), + logType: "custom", + userAction, + details, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId + }, + userLog + ); + const result = this.applyPipeline(log, null); + if (!result) + return false; + this.logs.push(result); + return true; + } + packageIntervalLog(e) { + const target = e.target ? getSelector(e.target) : null; + const path = buildPath(e); + const type = e.type; + const timestamp = Math.floor( + e.timeStamp && e.timeStamp > 0 ? this.config.time(e.timeStamp) : Date.now() + ); + if (this.intervalId == null) { + this.intervalId = target; + this.intervalType = type; + this.intervalPath = path; + this.intervalTimer = timestamp; + this.intervalCounter = 0; + return true; + } + if ((this.intervalId !== target || this.intervalType !== type) && this.intervalTimer !== null) { + const interval = { + target: this.intervalId, + path: this.intervalPath, + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: this.intervalTimer, + scrnRes: getScreenRes(), + count: this.intervalCounter, + duration: timestamp - this.intervalTimer, + startTime: this.intervalTimer, + endTime: timestamp, + type: this.intervalType, + logType: "interval", + targetChange: this.intervalId !== target, + typeChange: this.intervalType !== type, + userAction: false, + details: null, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId + }; + const result = this.applyPipeline(interval, e); + if (result) + this.logs.push(result); + this.intervalId = target; + this.intervalType = type; + this.intervalPath = path; + this.intervalTimer = timestamp; + this.intervalCounter = 0; + } else if (this.intervalId === target && this.intervalType === type) { + this.intervalCounter += 1; + } + return true; + } +}; +function extractTimeFields(timeStamp) { + return { + milli: Math.floor(timeStamp), + micro: Number((timeStamp % 1).toFixed(3)) + }; +} +function getLocation(e) { + if (e instanceof MouseEvent) { + if (e.pageX != null) { + return { x: e.pageX, y: e.pageY }; + } + return { + x: document.documentElement.scrollLeft + e.clientX, + y: document.documentElement.scrollTop + e.clientY + }; + } + return { x: null, y: null }; +} +function getScreenRes() { + return { width: self.innerWidth, height: self.innerHeight }; +} +function getSelector(ele) { + if (ele instanceof HTMLElement || ele instanceof Element) { + const base = ele.localName || ele.nodeName; + if (base) { + return base + (ele.id ? "#" + ele.id : "") + (ele.className ? "." + ele.className : ""); + } + } else if (ele instanceof Document) { + return "#document"; + } else if (ele === globalThis) { + return "Window"; + } + return "Unknown"; +} +function buildPath(e) { + return selectorizePath(e.composedPath()); +} +function selectorizePath(path) { + return path.map(getSelector); +} +function buildAttrs(e) { + const attributes = {}; + const attributeBlockList = ["style"]; + if (e.target instanceof Element) { + for (const attr2 of e.target.attributes) { + if (attributeBlockList.includes(attr2.name)) + continue; + try { + attributes[attr2.name] = JSON.parse(attr2.value); + } catch { + attributes[attr2.name] = attr2.value; + } + } + } + return attributes; +} +function buildCSS(e) { + const properties = {}; + if (e.target instanceof HTMLElement) { + const styleObj = e.target.style; + for (let i = 0; i < styleObj.length; i++) { + const prop = styleObj[i]; + properties[prop] = styleObj.getPropertyValue(prop); + } + } + return properties; +} + +// src/utils/auth.ts +var authCallback = null; +function updateAuthHeader(config) { + if (authCallback) { + try { + config.authHeader = authCallback(); + } catch (e) { + console.error(`Error encountered while setting the auth header: ${e}`); + } + } +} +function registerAuthCallback(callback) { + try { + verifyCallback(callback); + authCallback = callback; + return true; + } catch { + return false; + } +} +function verifyCallback(callback) { + if (typeof callback !== "function") { + throw new Error("Userale auth callback must be a function"); + } + const result = callback(); + if (typeof result !== "string") { + throw new Error("Userale auth callback must return a string"); + } +} + +// src/utils/headers.ts +var headersCallback = null; +function updateCustomHeaders(config) { + if (headersCallback) { + try { + config.headers = headersCallback(); + } catch (e) { + console.error(`Error encountered while setting the headers: ${e}`); + } + } +} + +// src/utils/ids.ts +function generateTraceId() { + const bytes = new Uint8Array(16); + crypto.getRandomValues(bytes); + return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); +} +function generateSpanId() { + const bytes = new Uint8Array(8); + crypto.getRandomValues(bytes); + return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); +} + +// src/Sender.ts +function encodeValue(v) { + if (v === null || v === void 0) + return { stringValue: "" }; + if (typeof v === "boolean") + return { boolValue: v }; + if (typeof v === "number") { + return Number.isInteger(v) ? { intValue: String(v) } : { doubleValue: v }; + } + if (typeof v === "string") + return { stringValue: v }; + if (Array.isArray(v)) { + return { arrayValue: { values: v.map(encodeValue) } }; + } + if (typeof v === "object") { + return { + kvlistValue: { + values: Object.entries(v).map( + ([k, val]) => ({ key: k, value: encodeValue(val) }) + ) + } + }; + } + return { stringValue: String(v) }; +} +function attr(key, v) { + return { key, value: encodeValue(v) }; +} +function toNanoString(clientTimeMs, microTime = 0) { + return String( + BigInt(Math.floor(clientTimeMs)) * 1000000n + BigInt(Math.round(microTime * 1e6)) + ); +} +function buildResource(config) { + const attributes = [ + attr("service.name", config.toolName ?? "userale"), + attr("service.version", config.toolVersion ?? ""), + attr("userale.version", config.useraleVersion ?? ""), + attr("userale.sessionId", config.sessionId ?? "") + ]; + if (config.userId) + attributes.push(attr("userale.userId", config.userId)); + return { attributes }; +} +var SCOPE = { + name: "flagon-userale", + version: "" +}; +var KNOWN_LOG_KEYS = /* @__PURE__ */ new Set([ + "logType", + "type", + "userAction", + "pageUrl", + "pageTitle", + "pageReferrer", + "userAgent", + "sessionId", + "browserSessionId", + "httpSessionId", + "clientTime", + "microTime", + "target", + "path", + "location", + "scrnRes", + "details", + "attributes", + "style", + "userId", + "toolVersion", + "toolName", + "useraleVersion" +]); +function buildLogRecord(log, spanId, traceId) { + const clientTime = log.clientTime ?? Date.now(); + const microTime = log.logType === "raw" ? log.microTime ?? 0 : 0; + const attributes = [ + attr("userale.logType", log.logType), + attr("userale.type", log.type), + attr("userale.userAction", log.userAction), + attr("browser.url", log.pageUrl), + attr("browser.title", log.pageTitle), + attr("browser.referrer", log.pageReferrer), + attr("user_agent.original", log.userAgent), + attr("userale.sessionId", log.sessionId), + attr("userale.browserSessionId", log.browserSessionId), + attr("userale.httpSessionId", log.httpSessionId), + attr("userale.scrnRes", log.scrnRes) + ]; + if (log.details !== null && log.details !== void 0) { + attributes.push(attr("userale.details", log.details)); + } + if (log.logType === "raw") { + if (log.target !== void 0) + attributes.push(attr("userale.target", log.target)); + if (log.path !== void 0) + attributes.push(attr("userale.path", log.path)); + if (log.location !== void 0) + attributes.push(attr("userale.location", log.location)); + if (Object.keys(log.attributes).length > 0) + attributes.push(attr("userale.attributes", log.attributes)); + if (Object.keys(log.style).length > 0) + attributes.push(attr("userale.style", log.style)); + } + for (const key of Object.keys(log)) { + if (!KNOWN_LOG_KEYS.has(key)) { + const val = log[key]; + if (val !== void 0) + attributes.push(attr(key, val)); + } + } + return { + timeUnixNano: toNanoString(clientTime, microTime), + observedTimeUnixNano: toNanoString(Date.now()), + severityNumber: log.userAction ? 9 : 5, + severityText: log.userAction ? "INFO" : "DEBUG", + eventName: log.type ?? "", + body: { stringValue: log.type ?? "" }, + attributes, + traceId, + spanId + }; +} +function buildSpan(log) { + const attributes = [ + attr("userale.logType", "interval"), + attr("userale.type", log.type), + attr("userale.count", log.count), + attr("userale.targetChange", log.targetChange), + attr("userale.typeChange", log.typeChange), + attr("userale.sessionId", log.sessionId), + attr("userale.browserSessionId", log.browserSessionId), + attr("userale.httpSessionId", log.httpSessionId), + attr("browser.url", log.pageUrl), + attr("browser.title", log.pageTitle), + attr("user_agent.original", log.userAgent) + ]; + if (log.target !== void 0) + attributes.push(attr("userale.target", log.target)); + if (log.path !== void 0) + attributes.push(attr("userale.path", log.path)); + return { + traceId: generateTraceId(), + spanId: generateSpanId(), + name: `userale.${log.type ?? "interval"}`, + kind: 1, + startTimeUnixNano: toNanoString(log.startTime ?? 0), + endTimeUnixNano: toNanoString(log.endTime ?? 0), + attributes, + status: { code: 0 } + }; +} +function buildPayloads(logs, traceId, spanId, config) { + const logRecords = []; + const spans = []; + for (const log of logs) { + if (log.logType === "interval") { + spans.push(buildSpan(log)); + } else { + logRecords.push(buildLogRecord(log, spanId, traceId)); + } + } + const resource = buildResource(config); + const scope = { + ...SCOPE, + version: config.useraleVersion ?? "" + }; + const logsPayload = logRecords.length > 0 ? { + resourceLogs: [ + { + resource, + scopeLogs: [{ scope, logRecords, schemaUrl: "" }], + schemaUrl: "" + } + ] + } : void 0; + const tracesPayload = spans.length > 0 ? { + resourceSpans: [ + { + resource, + scopeSpans: [{ scope, spans, schemaUrl: "" }], + schemaUrl: "" + } + ] + } : void 0; + return { logs: logsPayload, traces: tracesPayload }; +} +function buildHeaders(config) { + updateAuthHeader(config); + updateCustomHeaders(config); + const headers = new Headers({ "Content-Type": "application/json" }); + if (config.authHeader) { + const value = typeof config.authHeader === "function" ? config.authHeader() : config.authHeader; + headers.set("Authorization", value); + } + if (config.headers) { + for (const [key, value] of Object.entries(config.headers)) { + headers.set(key, value); + } + } + return headers; +} +async function exportBatch(logs, traceId, spanId, config) { + const { logs: logsPayload, traces: tracesPayload } = buildPayloads( + logs, + traceId, + spanId, + config + ); + const baseUrl = config.url.replace(/\/$/, ""); + const headers = buildHeaders(config); + const sends = []; + if (logsPayload) { + sends.push( + fetch(`${baseUrl}/v1/logs`, { + method: "POST", + headers, + body: JSON.stringify(logsPayload) + }) + ); + } + if (tracesPayload) { + sends.push( + fetch(`${baseUrl}/v1/traces`, { + method: "POST", + headers, + body: JSON.stringify(tracesPayload) + }) + ); + } + await Promise.all(sends); +} +var Sender = class { + constructor() { + this.activeTraceId = ""; + this.activeSpanId = ""; + } + start(logs, config) { + if (this.sendIntervalId) { + clearInterval(this.sendIntervalId); + } + this.activeTraceId = generateTraceId(); + this.activeSpanId = generateSpanId(); + this.sendIntervalId = this.onInterval(logs, config); + this.onClose(logs, config); + } + stop() { + if (this.sendIntervalId) { + clearInterval(this.sendIntervalId); + this.sendIntervalId = void 0; + } + } + onInterval(logs, config) { + return setInterval(() => { + if (!config.on) + return; + if (logs.length >= config.logCountThreshold) { + exportBatch( + logs.slice(0), + this.activeTraceId, + this.activeSpanId, + config + ); + logs.splice(0); + } + }, config.transmitInterval); + } + onClose(logs, config) { + self.addEventListener("pagehide", () => { + if (!config.on || logs.length === 0) + return; + const { logs: logsPayload, traces: tracesPayload } = buildPayloads( + logs, + this.activeTraceId, + this.activeSpanId, + config + ); + const baseUrl = config.url.replace(/\/$/, ""); + const headers = buildHeaders(config); + if (logsPayload) { + fetch(`${baseUrl}/v1/logs`, { + keepalive: true, + method: "POST", + headers, + body: JSON.stringify(logsPayload) + }).catch((error) => { + console.error(error); + }); + } + if (tracesPayload) { + fetch(`${baseUrl}/v1/traces`, { + keepalive: true, + method: "POST", + headers, + body: JSON.stringify(tracesPayload) + }).catch((error) => { + console.error(error); + }); + } + logs.splice(0); + }); + } + flush(logs, config) { + return exportBatch(logs, this.activeTraceId, this.activeSpanId, config); + } +}; + +// src/handlers/eventDetails.ts +function extractMouseDetails(e) { + return { + clicks: e.detail, + ctrl: e.ctrlKey, + alt: e.altKey, + shift: e.shiftKey, + meta: e.metaKey + }; +} +function extractKeyboardDetails(e) { + return { + key: e.key, + code: e.code, + ctrl: e.ctrlKey, + alt: e.altKey, + shift: e.shiftKey, + meta: e.metaKey + }; +} +function extractChangeDetails(e) { + return { + value: e.target.value + }; +} +function extractWheelDetails(e) { + return { + x: e.deltaX, + y: e.deltaY, + z: e.deltaZ + }; +} +function extractScrollDetails() { + return { + x: window.scrollX, + y: window.scrollY + }; +} +function extractResizeDetails() { + return { + width: window.outerWidth, + height: window.outerHeight + }; +} +function defineDetails(config) { + return { + click: extractMouseDetails, + dblclick: extractMouseDetails, + mousedown: extractMouseDetails, + mouseup: extractMouseDetails, + focus: null, + blur: null, + input: config.logDetails ? extractKeyboardDetails : null, + change: config.logDetails ? extractChangeDetails : null, + dragstart: null, + dragend: null, + drag: null, + drop: null, + keydown: config.logDetails ? extractKeyboardDetails : null, + mouseover: null + }; +} +function defineCustomDetails(options, type) { + const eventType = { + click: extractMouseDetails, + dblclick: extractMouseDetails, + mousedown: extractMouseDetails, + mouseup: extractMouseDetails, + focus: null, + blur: null, + load: null, + input: options.logDetails ? extractKeyboardDetails : null, + change: options.logDetails ? extractChangeDetails : null, + dragstart: null, + dragend: null, + drag: null, + drop: null, + keydown: options.logDetails ? extractKeyboardDetails : null, + mouseover: null, + wheel: extractWheelDetails, + scroll: extractScrollDetails, + resize: extractResizeDetails, + submit: null + }; + return eventType[type]; +} + +// src/handlers/attach.ts +var intervalEvents = [ + "click", + "focus", + "blur", + "input", + "change", + "mouseover", + "submit" +]; +var windowEvents = ["load", "blur", "focus"]; +var bufferedEvents = { + wheel: extractWheelDetails, + scroll: extractScrollDetails, + resize: extractResizeDetails +}; +var refreshEvents = { + submit: null +}; +function attachHandlers(config, packager) { + try { + const events = defineDetails(config); + const bufferBools = {}; + Object.keys(events).forEach(function(ev) { + document.addEventListener( + ev, + function(e) { + packager.packageLog(e, events[ev]); + }, + true + ); + }); + intervalEvents.forEach(function(ev) { + document.addEventListener( + ev, + function(e) { + packager.packageIntervalLog(e); + }, + true + ); + }); + Object.keys(bufferedEvents).forEach( + function(ev) { + bufferBools[ev] = true; + self.addEventListener( + ev, + function(e) { + if (bufferBools[ev]) { + bufferBools[ev] = false; + packager.packageLog(e, bufferedEvents[ev]); + setTimeout(function() { + bufferBools[ev] = true; + }, config.resolution); + } + }, + true + ); + } + ); + Object.keys(refreshEvents).forEach( + function(ev) { + document.addEventListener( + ev, + function(e) { + packager.packageLog(e, events[ev]); + }, + true + ); + } + ); + windowEvents.forEach(function(ev) { + self.addEventListener( + ev, + function(e) { + packager.packageLog(e, function() { + return { window: true }; + }); + }, + true + ); + }); + return true; + } catch { + return false; + } +} + +// src/UserALE.ts +var startLoadTimestamp = Date.now(); +var endLoadTimestamp = startLoadTimestamp; +self.addEventListener("load", () => { + endLoadTimestamp = Date.now(); +}); +var UserALE = class { + constructor(config) { + this.started = false; + this.config = config; + this.config.update({ useraleVersion: version }); + this.logs = []; + this.packager = new Packager(this.logs, this.config); + this.sender = new Sender(); + } + start() { + this.whenReady(() => { + this.attach(); + this.sender.start(this.logs, this.config); + }); + } + capture() { + this.whenReady(() => this.attach()); + } + stop() { + this.started = this.config.on = false; + this.sender.stop(); + } + whenReady(fn) { + if (typeof document === "undefined") { + fn(); + return; + } + if (document.readyState === "interactive" || document.readyState === "complete") { + fn(); + } else { + document.addEventListener("DOMContentLoaded", fn, { once: true }); + } + } + attach() { + if (!this.started) { + attachHandlers(this.config, this.packager); + this.started = this.config.on = true; + if (typeof window !== "undefined" && typeof document !== "undefined") { + this.packager.packageCustomLog( + { + type: "load", + details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp } + }, + () => ({}), + false + ); + } + } else { + this.config.on = true; + } + } + options(newConfig) { + if (newConfig) + this.config.update(newConfig); + return this.config; + } + log(customLog) { + if (customLog) { + this.logs.push(customLog); + return true; + } + return false; + } + flush() { + return this.sender.flush(this.logs, this.config); + } + addCallbacks(...newCallbacks) { + this.packager.addCallbacks(...newCallbacks); + } + removeCallbacks(targetKeys) { + this.packager.removeCallbacks(targetKeys); + } + packageCustomLog(userLog, detailFcn, userAction) { + return this.packager.packageCustomLog(userLog, detailFcn, userAction); + } +}; + +// src/utils/getInitialSettings.ts +var sessionId = null; +var httpSessionId = null; +function getInitialSettings() { + if (typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope) { + return { + authHeader: null, + autostart: true, + browserSessionId: null, + custIndex: null, + headers: null, + httpSessionId: null, + logCountThreshold: 5, + logDetails: false, + resolution: 500, + sessionId, + time: (ts) => ts !== void 0 ? ts : Date.now(), + toolName: null, + toolVersion: null, + transmitInterval: 5e3, + url: "http://localhost:4318", + useraleVersion: null, + userFromParams: null, + userId: null + }; + } + if (sessionId === null) { + sessionId = getOrCreateSessionId( + "userAlesessionId", + "session_" + String(Date.now()) + ); + } + if (httpSessionId === null) { + httpSessionId = getOrCreateSessionId( + "userAleHttpSessionId", + generateSpanId() + ); + } + const script = document.currentScript ?? (() => { + const scripts = document.getElementsByTagName("script"); + return scripts[scripts.length - 1] ?? null; + })(); + const get = (attr2) => script ? script.getAttribute(attr2) : null; + const headers = get("data-headers"); + return { + authHeader: get("data-auth"), + autostart: get("data-autostart") !== "false", + browserSessionId: null, + custIndex: get("data-index"), + headers: headers ? JSON.parse(headers) : null, + httpSessionId, + logCountThreshold: +(get("data-threshold") ?? 5), + logDetails: get("data-log-details") === "true", + resolution: +(get("data-resolution") ?? 500), + sessionId: get("data-session") ?? sessionId, + time: timeStampScale(document.createEvent("CustomEvent")), + toolName: get("data-tool"), + toolVersion: get("data-version"), + transmitInterval: +(get("data-interval") ?? 5e3), + url: get("data-url") ?? "http://localhost:4318", + useraleVersion: get("data-userale-version"), + userFromParams: get("data-user-from-params"), + userId: get("data-user") + }; +} +function getOrCreateSessionId(key, defaultValue) { + const stored = self.sessionStorage.getItem(key); + if (stored === null) { + self.sessionStorage.setItem(key, JSON.stringify(defaultValue)); + return defaultValue; + } + return JSON.parse(stored); +} +function timeStampScale(e) { + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + if (delta < 0) { + return () => e.timeStamp / 1e3; + } else if (delta > e.timeStamp) { + const navStart = performance.timeOrigin; + return (ts) => ts + navStart; + } else { + return (ts) => ts; + } + } + return () => Date.now(); +} + +// src/Configuration.ts +var _Configuration = class { + constructor() { + this.autostart = false; + this.authHeader = null; + this.browserSessionId = null; + this.custIndex = null; + this.headers = null; + this.httpSessionId = null; + this.logCountThreshold = 0; + this.logDetails = false; + this.on = false; + this.resolution = 0; + this.sessionId = null; + this.time = () => Date.now(); + this.toolName = null; + this.toolVersion = null; + this.transmitInterval = 0; + this.url = ""; + this.userFromParams = null; + this.useraleVersion = null; + this.userId = null; + this.version = null; + if (_Configuration.instance === null) { + this.initialize(); + } + } + static getInstance() { + if (_Configuration.instance === null) { + _Configuration.instance = new _Configuration(); + } + return _Configuration.instance; + } + initialize() { + const settings = getInitialSettings(); + this.update(settings); + } + reset() { + this.initialize(); + } + update(newConfig) { + Object.keys(newConfig).forEach((option) => { + if (option === "userFromParams") { + const userParamString = newConfig[option]; + const userId = userParamString ? _Configuration.getUserIdFromParams(userParamString) : null; + if (userId) { + this["userId"] = userId; + } + } + const hasNewUserFromParams = newConfig["userFromParams"]; + const willNullifyUserId = option === "userId" && newConfig[option] === null; + if (willNullifyUserId && hasNewUserFromParams) { + return; + } + const newOption = newConfig[option]; + if (newOption !== void 0) { + this[option] = newOption; + } + }); + } + static getUserIdFromParams(param) { + const userField = param; + const regex = new RegExp("[?&]" + userField + "(=([^&#]*)|&|#|$)"); + const results = window.location.href.match(regex); + if (results && results[2]) { + return decodeURIComponent(results[2].replace(/\+/g, " ")); + } + return null; + } +}; +var Configuration = _Configuration; +Configuration.instance = null; +export { + Configuration, + UserALE, + defineCustomDetails as details, + generateSpanId, + generateTraceId, + registerAuthCallback, + version +}; +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the 'License'); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//# sourceMappingURL=main.mjs.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/main.mjs.map b/products/userale/packages/core-sdk/build/main.mjs.map new file mode 100644 index 0000000..220e0ef --- /dev/null +++ b/products/userale/packages/core-sdk/build/main.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/Packager.ts","../src/utils/auth.ts","../src/utils/headers.ts","../src/utils/ids.ts","../src/Sender.ts","../src/handlers/eventDetails.ts","../src/handlers/attach.ts","../src/UserALE.ts","../src/utils/getInitialSettings.ts","../src/Configuration.ts"],"sourcesContent":["/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Callbacks, Logging } from \"@/types\";\nimport type { Configuration } from \"@/Configuration\";\n\n// ---------------------------------------------------------------------------\n// Packager — owns log queue, config reference, callback map, and interval state\n// ---------------------------------------------------------------------------\n\nexport class Packager {\n logs: Array;\n config: Configuration;\n cbHandlers: Callbacks.CallbackMap;\n\n // Interval logging state\n private intervalId: string | null = null;\n private intervalType: string | null = null;\n private intervalPath: string[] | null = null;\n private intervalTimer: number | null = null;\n private intervalCounter: number = 0;\n\n constructor(logs: Array, config: Configuration) {\n this.logs = logs;\n this.config = config;\n this.cbHandlers = {};\n }\n\n addCallbacks(\n ...newCallbacks: Record[]\n ): Callbacks.CallbackMap {\n for (const source of newCallbacks) {\n const descriptors: PropertyDescriptorMap = {};\n\n for (const key of Object.keys(source)) {\n const d = Object.getOwnPropertyDescriptor(source, key);\n if (d) descriptors[key] = d;\n }\n\n for (const sym of Object.getOwnPropertySymbols(source)) {\n const d = Object.getOwnPropertyDescriptor(source, sym);\n if (d?.enumerable) descriptors[sym as unknown as string] = d;\n }\n\n Object.defineProperties(this.cbHandlers, descriptors);\n }\n return this.cbHandlers;\n }\n\n removeCallbacks(targetKeys: string[]): void {\n for (const key of targetKeys) {\n if (Object.prototype.hasOwnProperty.call(this.cbHandlers, key)) {\n delete this.cbHandlers[key];\n }\n }\n }\n\n private applyPipeline(log: Logging.Log, e: Event | null): Logging.Log | null {\n for (const func of Object.values(this.cbHandlers)) {\n if (typeof func === \"function\") {\n log = func(log, e);\n if (!log) return null;\n }\n }\n return log;\n }\n\n packageLog(\n e: Event,\n detailFcn?: Logging.DynamicDetailFunction | null,\n ): boolean {\n if (!this.config.on) return false;\n\n const timeFields = extractTimeFields(\n e.timeStamp && e.timeStamp > 0\n ? this.config.time(e.timeStamp)\n : Date.now(),\n );\n\n const raw: Logging.RawLog = {\n target: e.target ? getSelector(e.target) : null,\n path: buildPath(e),\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: timeFields.milli,\n microTime: timeFields.micro,\n location: getLocation(e),\n scrnRes: getScreenRes(),\n type: e.type,\n logType: \"raw\",\n userAction: true,\n details: detailFcn ? detailFcn(e) : null,\n userId: this.config.userId,\n toolVersion: this.config.toolVersion,\n toolName: this.config.toolName,\n useraleVersion: this.config.useraleVersion,\n sessionId: this.config.sessionId,\n httpSessionId: this.config.httpSessionId,\n browserSessionId: this.config.browserSessionId,\n attributes: buildAttrs(e),\n style: buildCSS(e),\n };\n\n const result = this.applyPipeline(raw, e);\n if (!result) return false;\n this.logs.push(result);\n return true;\n }\n\n packageCustomLog(\n userLog: Logging.UserLog,\n detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction,\n userAction: boolean,\n ): boolean {\n if (!this.config.on) return false;\n\n const details =\n detailFcn.length === 0\n ? (detailFcn as Logging.StaticDetailFunction)()\n : null;\n\n const log = Object.assign(\n {\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: Date.now(),\n scrnRes: getScreenRes(),\n logType: \"custom\" as const,\n userAction,\n details,\n userId: this.config.userId,\n toolVersion: this.config.toolVersion,\n toolName: this.config.toolName,\n useraleVersion: this.config.useraleVersion,\n sessionId: this.config.sessionId,\n httpSessionId: this.config.httpSessionId,\n browserSessionId: this.config.browserSessionId,\n },\n userLog,\n ) as Logging.Log;\n\n const result = this.applyPipeline(log, null);\n if (!result) return false;\n this.logs.push(result);\n return true;\n }\n\n packageIntervalLog(e: Event): boolean {\n const target = e.target ? getSelector(e.target) : null;\n const path = buildPath(e);\n const type = e.type;\n const timestamp = Math.floor(\n e.timeStamp && e.timeStamp > 0\n ? this.config.time(e.timeStamp)\n : Date.now(),\n );\n\n if (this.intervalId == null) {\n this.intervalId = target;\n this.intervalType = type;\n this.intervalPath = path;\n this.intervalTimer = timestamp;\n this.intervalCounter = 0;\n return true;\n }\n\n if (\n (this.intervalId !== target || this.intervalType !== type) &&\n this.intervalTimer !== null\n ) {\n const interval: Logging.IntervalLog = {\n target: this.intervalId,\n path: this.intervalPath,\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: this.intervalTimer,\n scrnRes: getScreenRes(),\n count: this.intervalCounter,\n duration: timestamp - this.intervalTimer,\n startTime: this.intervalTimer,\n endTime: timestamp,\n type: this.intervalType,\n logType: \"interval\",\n targetChange: this.intervalId !== target,\n typeChange: this.intervalType !== type,\n userAction: false,\n details: null,\n userId: this.config.userId,\n toolVersion: this.config.toolVersion,\n toolName: this.config.toolName,\n useraleVersion: this.config.useraleVersion,\n sessionId: this.config.sessionId,\n httpSessionId: this.config.httpSessionId,\n browserSessionId: this.config.browserSessionId,\n };\n\n const result = this.applyPipeline(interval, e);\n if (result) this.logs.push(result);\n\n this.intervalId = target;\n this.intervalType = type;\n this.intervalPath = path;\n this.intervalTimer = timestamp;\n this.intervalCounter = 0;\n } else if (this.intervalId === target && this.intervalType === type) {\n this.intervalCounter += 1;\n }\n\n return true;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure utility functions — no state, safe to call from anywhere\n// ---------------------------------------------------------------------------\n\n/**\n * Extracts the millisecond and microsecond portions of a timestamp.\n */\nexport function extractTimeFields(timeStamp: number): {\n milli: number;\n micro: number;\n} {\n return {\n milli: Math.floor(timeStamp),\n micro: Number((timeStamp % 1).toFixed(3)),\n };\n}\n\n/**\n * Extracts coordinate information from the event.\n */\nexport function getLocation(e: Event): { x: number | null; y: number | null } {\n if (e instanceof MouseEvent) {\n if (e.pageX != null) {\n return { x: e.pageX, y: e.pageY };\n }\n return {\n x: document.documentElement.scrollLeft + e.clientX,\n y: document.documentElement.scrollTop + e.clientY,\n };\n }\n return { x: null, y: null };\n}\n\n/**\n * Returns the viewport dimensions as a screen resolution estimate.\n */\nexport function getScreenRes(): { width: number; height: number } {\n return { width: self.innerWidth, height: self.innerHeight };\n}\n\n/**\n * Builds a CSS selector string from an event target element.\n */\nexport function getSelector(ele: EventTarget): string {\n if (ele instanceof HTMLElement || ele instanceof Element) {\n const base = ele.localName || ele.nodeName;\n if (base) {\n return (\n base +\n (ele.id ? \"#\" + ele.id : \"\") +\n (ele.className ? \".\" + ele.className : \"\")\n );\n }\n } else if (ele instanceof Document) {\n return \"#document\";\n } else if (ele === globalThis) {\n return \"Window\";\n }\n return \"Unknown\";\n}\n\n/**\n * Builds a CSS selector path from the event's composed path.\n */\nexport function buildPath(e: Event): string[] {\n return selectorizePath(e.composedPath());\n}\n\n/**\n * Maps an array of event targets to CSS selector strings.\n */\nexport function selectorizePath(path: EventTarget[]): string[] {\n return path.map(getSelector);\n}\n\n/**\n * Builds an object of element attributes, attempting JSON parsing on values.\n */\nexport function buildAttrs(e: Event): Logging.JSONObject {\n const attributes: Logging.JSONObject = {};\n const attributeBlockList = [\"style\"];\n\n if (e.target instanceof Element) {\n for (const attr of e.target.attributes) {\n if (attributeBlockList.includes(attr.name)) continue;\n try {\n attributes[attr.name] = JSON.parse(attr.value);\n } catch {\n attributes[attr.name] = attr.value;\n }\n }\n }\n\n return attributes;\n}\n\n/**\n * Builds an object of inline CSS properties from the event target.\n */\nexport function buildCSS(e: Event): Logging.JSONObject {\n const properties: Logging.JSONObject = {};\n if (e.target instanceof HTMLElement) {\n const styleObj = e.target.style;\n for (let i = 0; i < styleObj.length; i++) {\n const prop = styleObj[i];\n properties[prop] = styleObj.getPropertyValue(prop);\n }\n }\n return properties;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/Configuration\";\nimport { Callbacks } from \"@/types\";\n\nexport let authCallback: Callbacks.AuthCallback | null = null;\n\n/**\n * Fetches the most up-to-date auth header string from the auth callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Function} authCallback Callback used to fetch the newest header.\n * @returns {void}\n */\nexport function updateAuthHeader(config: Configuration) {\n if (authCallback) {\n try {\n config.authHeader = authCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the authCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the auth header: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.AuthCallback} callback Callback used to fetch the newest header. Should return a string.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerAuthCallback(callback: Callbacks.AuthCallback) {\n try {\n verifyCallback(callback);\n authCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Function} callback Callback used to fetch the newest header. Should return a string.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.AuthCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale auth callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"string\") {\n throw new Error(\"Userale auth callback must return a string\");\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetAuthCallback() {\n authCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/Configuration\";\nimport { Callbacks } from \"@/types\";\n\nexport let headersCallback: Callbacks.HeadersCallback | null = null;\n\n/**\n * Fetches the most up-to-date custom headers object from the headers callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Callbacks.HeadersCallback} headersCallback Callback used to fetch the newest headers.\n * @returns {void}\n */\nexport function updateCustomHeaders(config: Configuration) {\n if (headersCallback) {\n try {\n config.headers = headersCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the headersCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the headers: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest headers. Should return an object.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerHeadersCallback(callback: Callbacks.HeadersCallback) {\n try {\n verifyCallback(callback);\n headersCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest header. Should return an object.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.HeadersCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale headers callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"object\") {\n throw new Error(\"Userale headers callback must return an object\");\n }\n for (const [key, value] of Object.entries(result)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n throw new Error(\n \"Userale header callback must return an object with string keys and values\",\n );\n }\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetHeadersCallback() {\n headersCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Implements the OTel IdGenerator interface using the Web Crypto API.\n * Method names match opentelemetry-js IdGenerator: generateTraceId / generateSpanId.\n */\n\n/** Generates a random 16-byte (32 hex char) trace ID. */\nexport function generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Generates a random 8-byte (16 hex char) span ID. */\nexport function generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/Configuration\";\nimport { Logging, OTLP } from \"@/types\";\nimport { updateAuthHeader } from \"@/utils/auth\";\nimport { updateCustomHeaders } from \"@/utils/headers\";\nimport { generateSpanId, generateTraceId } from \"@/utils/ids\";\n\n// ---------------------------------------------------------------------------\n// OTLP serialization (pure functions — no state)\n// ---------------------------------------------------------------------------\n\nfunction encodeValue(v: unknown): OTLP.AnyValue {\n if (v === null || v === undefined) return { stringValue: \"\" };\n if (typeof v === \"boolean\") return { boolValue: v };\n if (typeof v === \"number\") {\n return Number.isInteger(v) ? { intValue: String(v) } : { doubleValue: v };\n }\n if (typeof v === \"string\") return { stringValue: v };\n if (Array.isArray(v)) {\n return { arrayValue: { values: v.map(encodeValue) } };\n }\n if (typeof v === \"object\") {\n return {\n kvlistValue: {\n values: Object.entries(v as Record).map(\n ([k, val]) => ({ key: k, value: encodeValue(val) }),\n ),\n },\n };\n }\n return { stringValue: String(v) };\n}\n\nfunction attr(key: string, v: unknown): OTLP.KeyValue {\n return { key, value: encodeValue(v) };\n}\n\n/**\n * Converts a clientTime (ms) and optional microTime (fractional ms) to a\n * nanosecond decimal string as required by OTLP 1.10.0.\n */\nfunction toNanoString(clientTimeMs: number, microTime: number = 0): string {\n return String(\n BigInt(Math.floor(clientTimeMs)) * 1_000_000n +\n BigInt(Math.round(microTime * 1_000_000)),\n );\n}\n\nfunction buildResource(config: Configuration): OTLP.Resource {\n const attributes: OTLP.KeyValue[] = [\n attr(\"service.name\", config.toolName ?? \"userale\"),\n attr(\"service.version\", config.toolVersion ?? \"\"),\n attr(\"userale.version\", config.useraleVersion ?? \"\"),\n attr(\"userale.sessionId\", config.sessionId ?? \"\"),\n ];\n if (config.userId) attributes.push(attr(\"userale.userId\", config.userId));\n return { attributes };\n}\n\nconst SCOPE: OTLP.InstrumentationScope = {\n name: \"flagon-userale\",\n version: \"\",\n};\n\nconst KNOWN_LOG_KEYS = new Set([\n \"logType\",\n \"type\",\n \"userAction\",\n \"pageUrl\",\n \"pageTitle\",\n \"pageReferrer\",\n \"userAgent\",\n \"sessionId\",\n \"browserSessionId\",\n \"httpSessionId\",\n \"clientTime\",\n \"microTime\",\n \"target\",\n \"path\",\n \"location\",\n \"scrnRes\",\n \"details\",\n \"attributes\",\n \"style\",\n \"userId\",\n \"toolVersion\",\n \"toolName\",\n \"useraleVersion\",\n]);\n\nfunction buildLogRecord(\n log: Logging.RawLog | Logging.CustomLog,\n spanId: string,\n traceId: string,\n): OTLP.LogRecord {\n const clientTime = log.clientTime ?? Date.now();\n const microTime = log.logType === \"raw\" ? (log.microTime ?? 0) : 0;\n\n const attributes: OTLP.KeyValue[] = [\n attr(\"userale.logType\", log.logType),\n attr(\"userale.type\", log.type),\n attr(\"userale.userAction\", log.userAction),\n attr(\"browser.url\", log.pageUrl),\n attr(\"browser.title\", log.pageTitle),\n attr(\"browser.referrer\", log.pageReferrer),\n attr(\"user_agent.original\", log.userAgent),\n attr(\"userale.sessionId\", log.sessionId),\n attr(\"userale.browserSessionId\", log.browserSessionId),\n attr(\"userale.httpSessionId\", log.httpSessionId),\n attr(\"userale.scrnRes\", log.scrnRes),\n ];\n\n if (log.details !== null && log.details !== undefined) {\n attributes.push(attr(\"userale.details\", log.details));\n }\n\n if (log.logType === \"raw\") {\n if (log.target !== undefined)\n attributes.push(attr(\"userale.target\", log.target));\n if (log.path !== undefined) attributes.push(attr(\"userale.path\", log.path));\n if (log.location !== undefined)\n attributes.push(attr(\"userale.location\", log.location));\n if (Object.keys(log.attributes).length > 0)\n attributes.push(attr(\"userale.attributes\", log.attributes));\n if (Object.keys(log.style).length > 0)\n attributes.push(attr(\"userale.style\", log.style));\n }\n\n // Catch-all: extra fields added by callbacks are encoded as-is\n for (const key of Object.keys(log)) {\n if (!KNOWN_LOG_KEYS.has(key)) {\n const val = (log as Logging.JSONObject)[key];\n if (val !== undefined) attributes.push(attr(key, val));\n }\n }\n\n return {\n timeUnixNano: toNanoString(clientTime, microTime),\n observedTimeUnixNano: toNanoString(Date.now()),\n severityNumber: log.userAction ? 9 : 5,\n severityText: log.userAction ? \"INFO\" : \"DEBUG\",\n eventName: log.type ?? \"\",\n body: { stringValue: log.type ?? \"\" },\n attributes,\n traceId,\n spanId,\n };\n}\n\nfunction buildSpan(log: Logging.IntervalLog): OTLP.Span {\n const attributes: OTLP.KeyValue[] = [\n attr(\"userale.logType\", \"interval\"),\n attr(\"userale.type\", log.type),\n attr(\"userale.count\", log.count),\n attr(\"userale.targetChange\", log.targetChange),\n attr(\"userale.typeChange\", log.typeChange),\n attr(\"userale.sessionId\", log.sessionId),\n attr(\"userale.browserSessionId\", log.browserSessionId),\n attr(\"userale.httpSessionId\", log.httpSessionId),\n attr(\"browser.url\", log.pageUrl),\n attr(\"browser.title\", log.pageTitle),\n attr(\"user_agent.original\", log.userAgent),\n ];\n if (log.target !== undefined)\n attributes.push(attr(\"userale.target\", log.target));\n if (log.path !== undefined) attributes.push(attr(\"userale.path\", log.path));\n\n return {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n name: `userale.${log.type ?? \"interval\"}`,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: toNanoString(log.startTime ?? 0),\n endTimeUnixNano: toNanoString(log.endTime ?? 0),\n attributes,\n status: { code: 0 }, // STATUS_CODE_UNSET\n };\n}\n\nfunction buildPayloads(\n logs: Logging.Log[],\n traceId: string,\n spanId: string,\n config: Configuration,\n): OTLP.Payloads {\n const logRecords: OTLP.LogRecord[] = [];\n const spans: OTLP.Span[] = [];\n\n for (const log of logs) {\n if (log.logType === \"interval\") {\n spans.push(buildSpan(log));\n } else {\n logRecords.push(buildLogRecord(log, spanId, traceId));\n }\n }\n\n const resource = buildResource(config);\n const scope: OTLP.InstrumentationScope = {\n ...SCOPE,\n version: config.useraleVersion ?? \"\",\n };\n\n const logsPayload: OTLP.ExportLogsServiceRequest | undefined =\n logRecords.length > 0\n ? {\n resourceLogs: [\n {\n resource,\n scopeLogs: [{ scope, logRecords, schemaUrl: \"\" }],\n schemaUrl: \"\",\n },\n ],\n }\n : undefined;\n\n const tracesPayload: OTLP.ExportTraceServiceRequest | undefined =\n spans.length > 0\n ? {\n resourceSpans: [\n {\n resource,\n scopeSpans: [{ scope, spans, schemaUrl: \"\" }],\n schemaUrl: \"\",\n },\n ],\n }\n : undefined;\n\n return { logs: logsPayload, traces: tracesPayload };\n}\n\n// ---------------------------------------------------------------------------\n// HTTP transport (pure — no state)\n// ---------------------------------------------------------------------------\n\nfunction buildHeaders(config: Configuration): Headers {\n updateAuthHeader(config);\n updateCustomHeaders(config);\n\n const headers = new Headers({ \"Content-Type\": \"application/json\" });\n\n if (config.authHeader) {\n const value =\n typeof config.authHeader === \"function\"\n ? config.authHeader()\n : config.authHeader;\n headers.set(\"Authorization\", value as string);\n }\n\n if (config.headers) {\n for (const [key, value] of Object.entries(config.headers)) {\n headers.set(key, value);\n }\n }\n\n return headers;\n}\n\nasync function exportBatch(\n logs: Logging.Log[],\n traceId: string,\n spanId: string,\n config: Configuration,\n): Promise {\n const { logs: logsPayload, traces: tracesPayload } = buildPayloads(\n logs,\n traceId,\n spanId,\n config,\n );\n\n const baseUrl = config.url.replace(/\\/$/, \"\");\n const headers = buildHeaders(config);\n const sends: Promise[] = [];\n\n if (logsPayload) {\n sends.push(\n fetch(`${baseUrl}/v1/logs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(logsPayload),\n }),\n );\n }\n\n if (tracesPayload) {\n sends.push(\n fetch(`${baseUrl}/v1/traces`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(tracesPayload),\n }),\n );\n }\n\n await Promise.all(sends);\n}\n\n// ---------------------------------------------------------------------------\n// Sender — owns interval ID and active trace/span context\n// ---------------------------------------------------------------------------\n\nexport class Sender {\n private sendIntervalId: ReturnType | undefined;\n private activeTraceId: string = \"\";\n private activeSpanId: string = \"\";\n\n start(logs: Array, config: Configuration): void {\n if (this.sendIntervalId) {\n clearInterval(this.sendIntervalId);\n }\n this.activeTraceId = generateTraceId();\n this.activeSpanId = generateSpanId();\n this.sendIntervalId = this.onInterval(logs, config);\n this.onClose(logs, config);\n }\n\n stop(): void {\n if (this.sendIntervalId) {\n clearInterval(this.sendIntervalId);\n this.sendIntervalId = undefined;\n }\n }\n\n onInterval(\n logs: Array,\n config: Configuration,\n ): ReturnType {\n return setInterval(() => {\n if (!config.on) return;\n if (logs.length >= config.logCountThreshold) {\n exportBatch(\n logs.slice(0),\n this.activeTraceId,\n this.activeSpanId,\n config,\n );\n logs.splice(0);\n }\n }, config.transmitInterval);\n }\n\n onClose(logs: Array, config: Configuration): void {\n self.addEventListener(\"pagehide\", () => {\n if (!config.on || logs.length === 0) return;\n\n const { logs: logsPayload, traces: tracesPayload } = buildPayloads(\n logs,\n this.activeTraceId,\n this.activeSpanId,\n config,\n );\n\n const baseUrl = config.url.replace(/\\/$/, \"\");\n const headers = buildHeaders(config);\n\n if (logsPayload) {\n fetch(`${baseUrl}/v1/logs`, {\n keepalive: true,\n method: \"POST\",\n headers,\n body: JSON.stringify(logsPayload),\n }).catch((error) => {\n console.error(error);\n });\n }\n\n if (tracesPayload) {\n fetch(`${baseUrl}/v1/traces`, {\n keepalive: true,\n method: \"POST\",\n headers,\n body: JSON.stringify(tracesPayload),\n }).catch((error) => {\n console.error(error);\n });\n }\n\n logs.splice(0);\n });\n }\n\n flush(logs: Array, config: Configuration): Promise {\n return exportBatch(logs, this.activeTraceId, this.activeSpanId, config);\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Events, Logging, Settings } from \"@/types\";\n\n/**\n * Maps a MouseEvent to an object containing useful information.\n */\nexport function extractMouseDetails(e: MouseEvent) {\n return {\n clicks: e.detail,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\n/**\n * Maps a KeyboardEvent to an object containing useful information.\n */\nexport function extractKeyboardDetails(e: KeyboardEvent) {\n return {\n key: e.key,\n code: e.code,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\n/**\n * Maps an InputEvent to an object containing useful information.\n */\nexport function extractInputDetails(e: InputEvent) {\n return {\n value: (e.target as HTMLInputElement).value,\n };\n}\n\n/**\n * Maps a ChangeEvent to an object containing useful information.\n */\nexport function extractChangeDetails(e: Events.ChangeEvent) {\n return {\n value: e.target.value,\n };\n}\n\n/**\n * Maps a WheelEvent to an object containing useful information.\n */\nexport function extractWheelDetails(e: WheelEvent) {\n return {\n x: e.deltaX,\n y: e.deltaY,\n z: e.deltaZ,\n };\n}\n\n/**\n * Maps a ScrollEvent to an object containing useful information.\n */\nexport function extractScrollDetails() {\n return {\n x: window.scrollX,\n y: window.scrollY,\n };\n}\n\n/**\n * Maps a ResizeEvent to an object containing useful information.\n */\nexport function extractResizeDetails() {\n return {\n width: window.outerWidth,\n height: window.outerHeight,\n };\n}\n\n/**\n * Defines the event detail extractors and the events to listen for.\n */\nexport function defineDetails(\n config: Settings.DefaultConfig,\n): Events.EventDetailsMap {\n return {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n input: config.logDetails ? extractKeyboardDetails : null,\n change: config.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: config.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n };\n}\n\n/**\n * Returns the detail extractor for a given event type, respecting the config.\n */\nexport function defineCustomDetails(\n options: Settings.DefaultConfig,\n type: Events.AllowedEvents,\n): Logging.DynamicDetailFunction | null | undefined {\n const eventType: Events.EventDetailsMap = {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n load: null,\n input: options.logDetails ? extractKeyboardDetails : null,\n change: options.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: options.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n submit: null,\n };\n return eventType[type];\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Packager } from \"@/Packager\";\nimport { Events } from \"@/types\";\nimport { Configuration } from \"@/Configuration\";\nimport {\n defineDetails,\n extractWheelDetails,\n extractScrollDetails,\n extractResizeDetails,\n} from \"@/handlers/eventDetails\";\n\n//@todo: Investigate drag events and their behavior\nconst intervalEvents: Array = [\n \"click\",\n \"focus\",\n \"blur\",\n \"input\",\n \"change\",\n \"mouseover\",\n \"submit\",\n];\nconst windowEvents: Array = [\"load\", \"blur\", \"focus\"];\n\nconst bufferedEvents: Events.EventDetailsMap = {\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n};\n\nconst refreshEvents: Events.EventDetailsMap = {\n submit: null,\n};\n\n/**\n * Hooks the event handlers for each event type of interest.\n * @param {Configuration} config Configuration singleton to use.\n * @param {Packager} packager Packager instance to route events through.\n * @return {boolean} Whether the operation succeeded.\n */\nexport function attachHandlers(\n config: Configuration,\n packager: Packager,\n): boolean {\n try {\n const events = defineDetails(config);\n\n const bufferBools: Events.EventBoolMap =\n {} as Events.EventBoolMap;\n\n (Object.keys(events) as Events.AllowedEvents[]).forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packager.packageLog(e, events[ev]);\n },\n true,\n );\n });\n\n intervalEvents.forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packager.packageIntervalLog(e);\n },\n true,\n );\n });\n\n (Object.keys(bufferedEvents) as Events.BufferedEvents[]).forEach(\n function (ev) {\n bufferBools[ev] = true;\n\n self.addEventListener(\n ev,\n function (e) {\n if (bufferBools[ev]) {\n bufferBools[ev] = false;\n packager.packageLog(e, bufferedEvents[ev]);\n setTimeout(function () {\n bufferBools[ev] = true;\n }, config.resolution);\n }\n },\n true,\n );\n },\n );\n\n (Object.keys(refreshEvents) as Events.RefreshEvents[]).forEach(\n function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packager.packageLog(e, events[ev]);\n },\n true,\n );\n },\n );\n\n windowEvents.forEach(function (ev) {\n self.addEventListener(\n ev,\n function (e) {\n packager.packageLog(e, function () {\n return { window: true };\n });\n },\n true,\n );\n });\n\n return true;\n } catch {\n return false;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { version as userAleVersion } from \"../package.json\";\nimport { Configuration } from \"@/Configuration\";\nimport { Packager } from \"@/Packager\";\nimport { Sender } from \"@/Sender\";\nimport { attachHandlers } from \"@/handlers/attach\";\n\nimport type { Settings, Logging } from \"@/types\";\n\n// ---------------------------------------------------------------------------\n// Page-load timing — captured at module evaluation time\n// ---------------------------------------------------------------------------\n\nconst startLoadTimestamp = Date.now();\nlet endLoadTimestamp: number = startLoadTimestamp;\n\nself.addEventListener(\"load\", () => {\n endLoadTimestamp = Date.now();\n});\n\n// ---------------------------------------------------------------------------\n// UserALE — composes Configuration, Packager, and Sender into one object\n// whose lifetime matches the instrumentation session.\n// ---------------------------------------------------------------------------\n\nexport class UserALE {\n readonly config: Configuration;\n private readonly packager: Packager;\n private readonly sender: Sender;\n private readonly logs: Array;\n private started: boolean = false;\n\n constructor(config: Configuration) {\n this.config = config;\n this.config.update({ useraleVersion: userAleVersion });\n this.logs = [];\n this.packager = new Packager(this.logs, this.config);\n this.sender = new Sender();\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n /**\n * Starts capturing events and sending logs.\n * In browser contexts waits for the DOM to be ready.\n * In worker/service-worker contexts starts immediately.\n * Safe to call again after options() — the sender restarts with the new config.\n */\n start(): void {\n this.whenReady(() => {\n this.attach();\n this.sender.start(this.logs, this.config);\n });\n }\n\n /**\n * Captures events and routes them through callbacks, but does not start the\n * sender. Use this in content-script contexts where a separate background\n * instance owns transport — the rerouteLog callback intercepts every log\n * before it can be queued, so no fetch calls are ever made from the page.\n */\n capture(): void {\n this.whenReady(() => this.attach());\n }\n\n /**\n * Stops sending logs and clears the sender interval.\n */\n stop(): void {\n this.started = this.config.on = false;\n this.sender.stop();\n }\n\n private whenReady(fn: () => void): void {\n if (typeof document === \"undefined\") {\n fn();\n return;\n }\n if (\n document.readyState === \"interactive\" ||\n document.readyState === \"complete\"\n ) {\n fn();\n } else {\n document.addEventListener(\"DOMContentLoaded\", fn, { once: true });\n }\n }\n\n private attach(): void {\n if (!this.started) {\n attachHandlers(this.config, this.packager);\n this.started = this.config.on = true;\n\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n this.packager.packageCustomLog(\n {\n type: \"load\",\n details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp },\n },\n () => ({}),\n false,\n );\n }\n } else {\n this.config.on = true;\n }\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n options(newConfig?: Partial): Settings.Config {\n if (newConfig) this.config.update(newConfig);\n return this.config;\n }\n\n log(customLog: Logging.UserLog | undefined): boolean {\n if (customLog) {\n this.logs.push(customLog as Logging.Log);\n return true;\n }\n return false;\n }\n\n flush(): Promise {\n return this.sender.flush(this.logs, this.config);\n }\n\n addCallbacks(\n ...newCallbacks: Record[]\n ): void {\n this.packager.addCallbacks(...newCallbacks);\n }\n\n removeCallbacks(targetKeys: string[]): void {\n this.packager.removeCallbacks(targetKeys);\n }\n\n packageCustomLog(\n userLog: Logging.UserLog,\n detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction,\n userAction: boolean,\n ): boolean {\n return this.packager.packageCustomLog(userLog, detailFcn, userAction);\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the 'License'); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Settings } from \"@/types\";\nimport { generateSpanId } from \"@/utils/ids\";\n\nlet sessionId: string | null = null;\nlet httpSessionId: string | null = null;\n\n/**\n * Extracts the initial configuration settings from the\n * currently executing script tag.\n */\nexport function getInitialSettings(): Settings.Config {\n if (\n typeof WorkerGlobalScope !== \"undefined\" &&\n self instanceof WorkerGlobalScope\n ) {\n return {\n authHeader: null,\n autostart: true,\n browserSessionId: null,\n custIndex: null,\n headers: null,\n httpSessionId: null,\n logCountThreshold: 5,\n logDetails: false,\n resolution: 500,\n sessionId,\n time: (ts?: number) => (ts !== undefined ? ts : Date.now()),\n toolName: null,\n toolVersion: null,\n transmitInterval: 5000,\n url: \"http://localhost:4318\",\n useraleVersion: null,\n userFromParams: null,\n userId: null,\n };\n }\n\n if (sessionId === null) {\n sessionId = getOrCreateSessionId(\n \"userAlesessionId\",\n \"session_\" + String(Date.now()),\n );\n }\n\n if (httpSessionId === null) {\n httpSessionId = getOrCreateSessionId(\n \"userAleHttpSessionId\",\n generateSpanId(),\n );\n }\n\n const script =\n document.currentScript ??\n ((): Element | null => {\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1] ?? null;\n })();\n\n const get = (attr: string): string | null =>\n script ? script.getAttribute(attr) : null;\n\n const headers = get(\"data-headers\");\n\n return {\n authHeader: get(\"data-auth\"),\n autostart: get(\"data-autostart\") !== \"false\",\n browserSessionId: null,\n custIndex: get(\"data-index\"),\n headers: headers ? JSON.parse(headers) : null,\n httpSessionId,\n logCountThreshold: +(get(\"data-threshold\") ?? 5),\n logDetails: get(\"data-log-details\") === \"true\",\n resolution: +(get(\"data-resolution\") ?? 500),\n sessionId: get(\"data-session\") ?? sessionId,\n time: timeStampScale(document.createEvent(\"CustomEvent\")),\n toolName: get(\"data-tool\"),\n toolVersion: get(\"data-version\"),\n transmitInterval: +(get(\"data-interval\") ?? 5000),\n url: get(\"data-url\") ?? \"http://localhost:4318\",\n useraleVersion: get(\"data-userale-version\"),\n userFromParams: get(\"data-user-from-params\"),\n userId: get(\"data-user\"),\n };\n}\n\n/**\n * Retrieves a session ID from sessionStorage, creating and storing it if absent.\n * Preserves the session across page refreshes (e.g. after form submit).\n */\nexport function getOrCreateSessionId(\n key: string,\n defaultValue: string,\n): string {\n const stored = self.sessionStorage.getItem(key);\n if (stored === null) {\n self.sessionStorage.setItem(key, JSON.stringify(defaultValue));\n return defaultValue;\n }\n return JSON.parse(stored) as string;\n}\n\n/**\n * Returns a function that normalises a browser event timestamp to Unix ms,\n * accounting for cross-browser quirks in how timeStamp is reported.\n */\nexport function timeStampScale(e: Event): Settings.TimeFunction {\n if (e.timeStamp && e.timeStamp > 0) {\n const delta = Date.now() - e.timeStamp;\n if (delta < 0) {\n return () => e.timeStamp / 1000;\n } else if (delta > e.timeStamp) {\n const navStart = performance.timeOrigin;\n return (ts: number) => ts + navStart;\n } else {\n return (ts: number) => ts;\n }\n }\n return () => Date.now();\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInitialSettings } from \"@/utils/getInitialSettings\";\nimport type { Settings } from \"@/types\";\n\n// Singleton Configuration class\nexport class Configuration {\n [key: string]: Settings.ConfigValueTypes;\n // Private static property to hold the singleton instance\n private static instance: Configuration | null = null;\n\n // Public properties corresponding to fields in the Config interface\n public autostart: boolean = false;\n public authHeader: Settings.AuthHeader = null;\n public browserSessionId: Settings.SessionId = null;\n public custIndex: Settings.CustomIndex = null;\n public headers: Settings.Headers = null;\n public httpSessionId: Settings.SessionId = null;\n public logCountThreshold: number = 0;\n public logDetails: boolean = false;\n public on: boolean = false;\n public resolution: number = 0;\n public sessionId: Settings.SessionId = null;\n public time: Settings.TimeFunction = () => Date.now();\n public toolName: Settings.ToolName = null;\n public toolVersion: Settings.Version = null;\n public transmitInterval: number = 0;\n public url: string = \"\";\n public userFromParams: Settings.UserFromParams = null;\n public useraleVersion: Settings.Version = null;\n public userId: Settings.UserId = null;\n public version: Settings.Version = null;\n\n // Private constructor to prevent external instantiation\n private constructor() {\n // Call the initialization method only if it's the first time instantiating\n if (Configuration.instance === null) {\n this.initialize();\n }\n }\n\n // Static method to get the singleton instance\n public static getInstance(): Configuration {\n if (Configuration.instance === null) {\n Configuration.instance = new Configuration();\n }\n return Configuration.instance;\n }\n\n private initialize(): void {\n const settings = getInitialSettings();\n this.update(settings);\n }\n\n /**\n * Resets the configuration to its initial state.\n */\n public reset(): void {\n this.initialize();\n }\n\n /**\n * Shallow merges a newConfig with the configuration class, updating it.\n * Retrieves/updates the userid if userFromParams is provided.\n * @param {Partial} newConfig Configuration object to merge into the current config.\n */\n public update(newConfig: Partial): void {\n Object.keys(newConfig).forEach((option) => {\n if (option === \"userFromParams\") {\n const userParamString = newConfig[option] as Settings.UserFromParams;\n const userId = userParamString\n ? Configuration.getUserIdFromParams(userParamString)\n : null;\n if (userId) {\n this[\"userId\"] = userId;\n }\n }\n const hasNewUserFromParams = newConfig[\"userFromParams\"];\n const willNullifyUserId =\n option === \"userId\" && newConfig[option] === null;\n if (willNullifyUserId && hasNewUserFromParams) {\n return;\n }\n\n const newOption = newConfig[option];\n if (newOption !== undefined) {\n this[option] = newOption;\n }\n });\n }\n\n /**\n * Attempts to extract the userid from the query parameters of the URL.\n * @param {string} param The name of the query parameter containing the userid.\n * @return {string | null} The extracted/decoded userid, or null if none is found.\n */\n public static getUserIdFromParams(param: string) {\n const userField = param;\n const regex = new RegExp(\"[?&]\" + userField + \"(=([^&#]*)|&|#|$)\");\n const results = window.location.href.match(regex);\n\n if (results && results[2]) {\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n }\n return null;\n }\n}\n"],"mappings":"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","names":["attr","attr"]} \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/otlp.d.ts b/products/userale/packages/core-sdk/build/otlp.d.ts new file mode 100644 index 0000000..e2a9765 --- /dev/null +++ b/products/userale/packages/core-sdk/build/otlp.d.ts @@ -0,0 +1,49 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * OTLP/HTTP JSON serialization for UserALE logs. + * Compliant with OTLP Specification 1.10.0. + * + * Logs with logType "raw" or "custom" are emitted as OTLP LogRecords (POST /v1/logs). + * Logs with logType "interval" are emitted as OTLP Spans (POST /v1/traces). + */ +import { Logging, OTLP } from "@/types"; +/** + * Generates a random 16-byte (32 hex char) trace ID using the Web Crypto API. + */ +export declare function generateTraceId(): string; +/** + * Generates a random 8-byte (16 hex char) span ID using the Web Crypto API. + */ +export declare function generateSpanId(): string; +/** + * Partitions a UserALE log batch into OTLP ExportLogsServiceRequest and + * ExportTraceServiceRequest payloads, compliant with OTLP 1.10.0. + * + * @param logs The batch of UserALE logs to serialize. + * @param traceId The active page-session trace ID (32 hex chars). + * @param spanId The active page-session root span ID (16 hex chars). + * @param config The active UserALE configuration (used for resource attributes). + */ +export declare function buildOtlpPayloads(logs: Logging.Log[], traceId: string, spanId: string, config: { + toolName: string | null; + toolVersion: string | null; + useraleVersion: string | null; + sessionId: string | null; + userId: string | null; +}): OTLP.Payloads; +//# sourceMappingURL=otlp.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/packageLogs.d.ts b/products/userale/packages/core-sdk/build/packageLogs.d.ts new file mode 100644 index 0000000..af33738 --- /dev/null +++ b/products/userale/packages/core-sdk/build/packageLogs.d.ts @@ -0,0 +1,77 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Callbacks, Logging } from "@/types"; +import type { Configuration } from "@/configure"; +export declare class Packager { + logs: Array; + config: Configuration; + cbHandlers: Callbacks.CallbackMap; + private intervalId; + private intervalType; + private intervalPath; + private intervalTimer; + private intervalCounter; + constructor(logs: Array, config: Configuration); + addCallbacks(...newCallbacks: Record[]): Callbacks.CallbackMap; + removeCallbacks(targetKeys: string[]): void; + private applyPipeline; + packageLog(e: Event, detailFcn?: Logging.DynamicDetailFunction | null): boolean; + packageCustomLog(userLog: Logging.UserLog, detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, userAction: boolean): boolean; + packageIntervalLog(e: Event): boolean; +} +/** + * Extracts the millisecond and microsecond portions of a timestamp. + */ +export declare function extractTimeFields(timeStamp: number): { + milli: number; + micro: number; +}; +/** + * Extracts coordinate information from the event. + */ +export declare function getLocation(e: Event): { + x: number | null; + y: number | null; +}; +/** + * Returns the viewport dimensions as a screen resolution estimate. + */ +export declare function getScreenRes(): { + width: number; + height: number; +}; +/** + * Builds a CSS selector string from an event target element. + */ +export declare function getSelector(ele: EventTarget): string; +/** + * Builds a CSS selector path from the event's composed path. + */ +export declare function buildPath(e: Event): string[]; +/** + * Maps an array of event targets to CSS selector strings. + */ +export declare function selectorizePath(path: EventTarget[]): string[]; +/** + * Builds an object of element attributes, attempting JSON parsing on values. + */ +export declare function buildAttrs(e: Event): Logging.JSONObject; +/** + * Builds an object of inline CSS properties from the event target. + */ +export declare function buildCSS(e: Event): Logging.JSONObject; +//# sourceMappingURL=packageLogs.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/sendLogs.d.ts b/products/userale/packages/core-sdk/build/sendLogs.d.ts new file mode 100644 index 0000000..c9e3d56 --- /dev/null +++ b/products/userale/packages/core-sdk/build/sendLogs.d.ts @@ -0,0 +1,29 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Configuration } from "@/configure"; +import { Logging } from "@/types"; +export declare class Sender { + private sendIntervalId; + private activeTraceId; + private activeSpanId; + start(logs: Array, config: Configuration): void; + stop(): void; + onInterval(logs: Array, config: Configuration): ReturnType; + onClose(logs: Array, config: Configuration): void; + flush(logs: Array, config: Configuration): Promise; +} +//# sourceMappingURL=sendLogs.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/utils/auth.d.ts b/products/userale/packages/core-sdk/build/utils/auth.d.ts new file mode 100644 index 0000000..fba5733 --- /dev/null +++ b/products/userale/packages/core-sdk/build/utils/auth.d.ts @@ -0,0 +1,47 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Configuration } from "@/Configuration"; +import { Callbacks } from "@/types"; +export declare let authCallback: Callbacks.AuthCallback | null; +/** + * Fetches the most up-to-date auth header string from the auth callback + * and updates the config object with the new value. + * @param {Configuration} config Configuration object to be updated. + * @param {Function} authCallback Callback used to fetch the newest header. + * @returns {void} + */ +export declare function updateAuthHeader(config: Configuration): void; +/** + * Registers the provided callback to be used when updating the auth header. + * @param {Callbacks.AuthCallback} callback Callback used to fetch the newest header. Should return a string. + * @returns {boolean} Whether the operation succeeded. + */ +export declare function registerAuthCallback(callback: Callbacks.AuthCallback): boolean; +/** + * Verify that the provided callback is a function which returns a string + * @param {Function} callback Callback used to fetch the newest header. Should return a string. + * @throws {Error} If the callback is not a function or does not return a string. + * @returns {void} + */ +export declare function verifyCallback(callback: Callbacks.AuthCallback): void; +/** + * Resets the authCallback to null. Used for primarily for testing, but could be used + * to remove the callback in production. + * @returns {void} + */ +export declare function resetAuthCallback(): void; +//# sourceMappingURL=auth.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/utils/auth/index.d.ts b/products/userale/packages/core-sdk/build/utils/auth/index.d.ts similarity index 100% rename from products/userale/packages/flagon-userale/build/utils/auth/index.d.ts rename to products/userale/packages/core-sdk/build/utils/auth/index.d.ts diff --git a/products/userale/packages/core-sdk/build/utils/getInitialSettings.d.ts b/products/userale/packages/core-sdk/build/utils/getInitialSettings.d.ts new file mode 100644 index 0000000..e2709ce --- /dev/null +++ b/products/userale/packages/core-sdk/build/utils/getInitialSettings.d.ts @@ -0,0 +1,33 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the 'License'); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import type { Settings } from "@/types"; +/** + * Extracts the initial configuration settings from the + * currently executing script tag. + */ +export declare function getInitialSettings(): Settings.Config; +/** + * Retrieves a session ID from sessionStorage, creating and storing it if absent. + * Preserves the session across page refreshes (e.g. after form submit). + */ +export declare function getOrCreateSessionId(key: string, defaultValue: string): string; +/** + * Returns a function that normalises a browser event timestamp to Unix ms, + * accounting for cross-browser quirks in how timeStamp is reported. + */ +export declare function timeStampScale(e: Event): Settings.TimeFunction; +//# sourceMappingURL=getInitialSettings.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/core-sdk/build/utils/headers.d.ts b/products/userale/packages/core-sdk/build/utils/headers.d.ts new file mode 100644 index 0000000..8bf4dad --- /dev/null +++ b/products/userale/packages/core-sdk/build/utils/headers.d.ts @@ -0,0 +1,47 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Configuration } from "@/Configuration"; +import { Callbacks } from "@/types"; +export declare let headersCallback: Callbacks.HeadersCallback | null; +/** + * Fetches the most up-to-date custom headers object from the headers callback + * and updates the config object with the new value. + * @param {Configuration} config Configuration object to be updated. + * @param {Callbacks.HeadersCallback} headersCallback Callback used to fetch the newest headers. + * @returns {void} + */ +export declare function updateCustomHeaders(config: Configuration): void; +/** + * Registers the provided callback to be used when updating the auth header. + * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest headers. Should return an object. + * @returns {boolean} Whether the operation succeeded. + */ +export declare function registerHeadersCallback(callback: Callbacks.HeadersCallback): boolean; +/** + * Verify that the provided callback is a function which returns a string + * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest header. Should return an object. + * @throws {Error} If the callback is not a function or does not return a string. + * @returns {void} + */ +export declare function verifyCallback(callback: Callbacks.HeadersCallback): void; +/** + * Resets the authCallback to null. Used for primarily for testing, but could be used + * to remove the callback in production. + * @returns {void} + */ +export declare function resetHeadersCallback(): void; +//# sourceMappingURL=headers.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/utils/headers/index.d.ts b/products/userale/packages/core-sdk/build/utils/headers/index.d.ts similarity index 100% rename from products/userale/packages/flagon-userale/build/utils/headers/index.d.ts rename to products/userale/packages/core-sdk/build/utils/headers/index.d.ts diff --git a/products/userale/packages/core-sdk/build/utils/ids.d.ts b/products/userale/packages/core-sdk/build/utils/ids.d.ts new file mode 100644 index 0000000..63802ed --- /dev/null +++ b/products/userale/packages/core-sdk/build/utils/ids.d.ts @@ -0,0 +1,25 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Implements the OTel IdGenerator interface using the Web Crypto API. + * Method names match opentelemetry-js IdGenerator: generateTraceId / generateSpanId. + */ +/** Generates a random 16-byte (32 hex char) trace ID. */ +export declare function generateTraceId(): string; +/** Generates a random 8-byte (16 hex char) span ID. */ +export declare function generateSpanId(): string; +//# sourceMappingURL=ids.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/utils/index.d.ts b/products/userale/packages/core-sdk/build/utils/index.d.ts similarity index 90% rename from products/userale/packages/flagon-userale/build/utils/index.d.ts rename to products/userale/packages/core-sdk/build/utils/index.d.ts index 97191b2..23b7b2a 100644 --- a/products/userale/packages/flagon-userale/build/utils/index.d.ts +++ b/products/userale/packages/core-sdk/build/utils/index.d.ts @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { authCallback, updateAuthHeader, registerAuthCallback, resetAuthCallback, verifyCallback as verifyAuthCallback, } from "./auth"; -export { headersCallback, updateCustomHeaders, registerHeadersCallback, resetHeadersCallback, verifyCallback as verifyHeadersCallback, } from "./headers"; +export { authCallback, updateAuthHeader, registerAuthCallback, resetAuthCallback, verifyCallback as verifyAuthCallback, } from "@/utils/auth"; +export { headersCallback, updateCustomHeaders, registerHeadersCallback, resetHeadersCallback, verifyCallback as verifyHeadersCallback, } from "@/utils/headers"; +export { generateTraceId, generateSpanId } from "@/utils/ids"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/package.json b/products/userale/packages/core-sdk/package.json similarity index 87% rename from products/userale/packages/flagon-userale/package.json rename to products/userale/packages/core-sdk/package.json index e31609f..51f06c0 100644 --- a/products/userale/packages/flagon-userale/package.json +++ b/products/userale/packages/core-sdk/package.json @@ -49,8 +49,7 @@ }, "homepage": "https://flagon.apache.org/", "engines": { - "node": ">= 18.x", - "npm": ">= 9.x" + "node": ">= 18.x" }, "devDependencies": { "@babel/preset-typescript": "^7.27.1", @@ -58,26 +57,18 @@ "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.6", "@types/node": "^20.14.2", - "@types/ws": "^8.5.12", "@typescript/lib-dom": "npm:@types/web@^0.0.144", - "body-parser": "^1.20.2", - "commander": "^12.1.0", - "cypress": "^13.6.0", "cz-conventional-changelog": "^3.3.0", - "dom-storage": "^2.1.0", - "express": "^4.18.2", "global-jsdom": "^24.0.0", "globals": "^15.2.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jsdom": "^24.0.0", - "jsonschema": "^1.4.1", "ts-jest": "^29.4.0", "ts-node": "^10.9.2", "tsup": "^5.10.0", "typescript": "^5.8.3", - "whatwg-fetch": "^3.6.20", - "ws": "^8.18.0" + "whatwg-fetch": "^3.6.20" }, "config": { "commitizen": { diff --git a/products/userale/packages/flagon-userale/src/configure.ts b/products/userale/packages/core-sdk/src/Configuration.ts similarity index 97% rename from products/userale/packages/flagon-userale/src/configure.ts rename to products/userale/packages/core-sdk/src/Configuration.ts index a3d08ac..0e3c7c7 100644 --- a/products/userale/packages/flagon-userale/src/configure.ts +++ b/products/userale/packages/core-sdk/src/Configuration.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { getInitialSettings } from "@/getInitialSettings"; +import { getInitialSettings } from "@/utils/getInitialSettings"; import type { Settings } from "@/types"; // Singleton Configuration class @@ -45,7 +45,6 @@ export class Configuration { public useraleVersion: Settings.Version = null; public userId: Settings.UserId = null; public version: Settings.Version = null; - public websocketsEnabled: boolean = false; // Private constructor to prevent external instantiation private constructor() { diff --git a/products/userale/packages/core-sdk/src/Packager.ts b/products/userale/packages/core-sdk/src/Packager.ts new file mode 100644 index 0000000..d0f554c --- /dev/null +++ b/products/userale/packages/core-sdk/src/Packager.ts @@ -0,0 +1,342 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Callbacks, Logging } from "@/types"; +import type { Configuration } from "@/Configuration"; + +// --------------------------------------------------------------------------- +// Packager — owns log queue, config reference, callback map, and interval state +// --------------------------------------------------------------------------- + +export class Packager { + logs: Array; + config: Configuration; + cbHandlers: Callbacks.CallbackMap; + + // Interval logging state + private intervalId: string | null = null; + private intervalType: string | null = null; + private intervalPath: string[] | null = null; + private intervalTimer: number | null = null; + private intervalCounter: number = 0; + + constructor(logs: Array, config: Configuration) { + this.logs = logs; + this.config = config; + this.cbHandlers = {}; + } + + addCallbacks( + ...newCallbacks: Record[] + ): Callbacks.CallbackMap { + for (const source of newCallbacks) { + const descriptors: PropertyDescriptorMap = {}; + + for (const key of Object.keys(source)) { + const d = Object.getOwnPropertyDescriptor(source, key); + if (d) descriptors[key] = d; + } + + for (const sym of Object.getOwnPropertySymbols(source)) { + const d = Object.getOwnPropertyDescriptor(source, sym); + if (d?.enumerable) descriptors[sym as unknown as string] = d; + } + + Object.defineProperties(this.cbHandlers, descriptors); + } + return this.cbHandlers; + } + + removeCallbacks(targetKeys: string[]): void { + for (const key of targetKeys) { + if (Object.prototype.hasOwnProperty.call(this.cbHandlers, key)) { + delete this.cbHandlers[key]; + } + } + } + + private applyPipeline(log: Logging.Log, e: Event | null): Logging.Log | null { + for (const func of Object.values(this.cbHandlers)) { + if (typeof func === "function") { + log = func(log, e); + if (!log) return null; + } + } + return log; + } + + packageLog( + e: Event, + detailFcn?: Logging.DynamicDetailFunction | null, + ): boolean { + if (!this.config.on) return false; + + const timeFields = extractTimeFields( + e.timeStamp && e.timeStamp > 0 + ? this.config.time(e.timeStamp) + : Date.now(), + ); + + const raw: Logging.RawLog = { + target: e.target ? getSelector(e.target) : null, + path: buildPath(e), + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: timeFields.milli, + microTime: timeFields.micro, + location: getLocation(e), + scrnRes: getScreenRes(), + type: e.type, + logType: "raw", + userAction: true, + details: detailFcn ? detailFcn(e) : null, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId, + attributes: buildAttrs(e), + style: buildCSS(e), + }; + + const result = this.applyPipeline(raw, e); + if (!result) return false; + this.logs.push(result); + return true; + } + + packageCustomLog( + userLog: Logging.UserLog, + detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, + userAction: boolean, + ): boolean { + if (!this.config.on) return false; + + const details = + detailFcn.length === 0 + ? (detailFcn as Logging.StaticDetailFunction)() + : null; + + const log = Object.assign( + { + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: Date.now(), + scrnRes: getScreenRes(), + logType: "custom" as const, + userAction, + details, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId, + }, + userLog, + ) as Logging.Log; + + const result = this.applyPipeline(log, null); + if (!result) return false; + this.logs.push(result); + return true; + } + + packageIntervalLog(e: Event): boolean { + const target = e.target ? getSelector(e.target) : null; + const path = buildPath(e); + const type = e.type; + const timestamp = Math.floor( + e.timeStamp && e.timeStamp > 0 + ? this.config.time(e.timeStamp) + : Date.now(), + ); + + if (this.intervalId == null) { + this.intervalId = target; + this.intervalType = type; + this.intervalPath = path; + this.intervalTimer = timestamp; + this.intervalCounter = 0; + return true; + } + + if ( + (this.intervalId !== target || this.intervalType !== type) && + this.intervalTimer !== null + ) { + const interval: Logging.IntervalLog = { + target: this.intervalId, + path: this.intervalPath, + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: this.intervalTimer, + scrnRes: getScreenRes(), + count: this.intervalCounter, + duration: timestamp - this.intervalTimer, + startTime: this.intervalTimer, + endTime: timestamp, + type: this.intervalType, + logType: "interval", + targetChange: this.intervalId !== target, + typeChange: this.intervalType !== type, + userAction: false, + details: null, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId, + }; + + const result = this.applyPipeline(interval, e); + if (result) this.logs.push(result); + + this.intervalId = target; + this.intervalType = type; + this.intervalPath = path; + this.intervalTimer = timestamp; + this.intervalCounter = 0; + } else if (this.intervalId === target && this.intervalType === type) { + this.intervalCounter += 1; + } + + return true; + } +} + +// --------------------------------------------------------------------------- +// Pure utility functions — no state, safe to call from anywhere +// --------------------------------------------------------------------------- + +/** + * Extracts the millisecond and microsecond portions of a timestamp. + */ +export function extractTimeFields(timeStamp: number): { + milli: number; + micro: number; +} { + return { + milli: Math.floor(timeStamp), + micro: Number((timeStamp % 1).toFixed(3)), + }; +} + +/** + * Extracts coordinate information from the event. + */ +export function getLocation(e: Event): { x: number | null; y: number | null } { + if (e instanceof MouseEvent) { + if (e.pageX != null) { + return { x: e.pageX, y: e.pageY }; + } + return { + x: document.documentElement.scrollLeft + e.clientX, + y: document.documentElement.scrollTop + e.clientY, + }; + } + return { x: null, y: null }; +} + +/** + * Returns the viewport dimensions as a screen resolution estimate. + */ +export function getScreenRes(): { width: number; height: number } { + return { width: self.innerWidth, height: self.innerHeight }; +} + +/** + * Builds a CSS selector string from an event target element. + */ +export function getSelector(ele: EventTarget): string { + if (ele instanceof HTMLElement || ele instanceof Element) { + const base = ele.localName || ele.nodeName; + if (base) { + return ( + base + + (ele.id ? "#" + ele.id : "") + + (ele.className ? "." + ele.className : "") + ); + } + } else if (ele instanceof Document) { + return "#document"; + } else if (ele === globalThis) { + return "Window"; + } + return "Unknown"; +} + +/** + * Builds a CSS selector path from the event's composed path. + */ +export function buildPath(e: Event): string[] { + return selectorizePath(e.composedPath()); +} + +/** + * Maps an array of event targets to CSS selector strings. + */ +export function selectorizePath(path: EventTarget[]): string[] { + return path.map(getSelector); +} + +/** + * Builds an object of element attributes, attempting JSON parsing on values. + */ +export function buildAttrs(e: Event): Logging.JSONObject { + const attributes: Logging.JSONObject = {}; + const attributeBlockList = ["style"]; + + if (e.target instanceof Element) { + for (const attr of e.target.attributes) { + if (attributeBlockList.includes(attr.name)) continue; + try { + attributes[attr.name] = JSON.parse(attr.value); + } catch { + attributes[attr.name] = attr.value; + } + } + } + + return attributes; +} + +/** + * Builds an object of inline CSS properties from the event target. + */ +export function buildCSS(e: Event): Logging.JSONObject { + const properties: Logging.JSONObject = {}; + if (e.target instanceof HTMLElement) { + const styleObj = e.target.style; + for (let i = 0; i < styleObj.length; i++) { + const prop = styleObj[i]; + properties[prop] = styleObj.getPropertyValue(prop); + } + } + return properties; +} diff --git a/products/userale/packages/core-sdk/src/Sender.ts b/products/userale/packages/core-sdk/src/Sender.ts new file mode 100644 index 0000000..b2a603c --- /dev/null +++ b/products/userale/packages/core-sdk/src/Sender.ts @@ -0,0 +1,402 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Configuration } from "@/Configuration"; +import { Logging, OTLP } from "@/types"; +import { updateAuthHeader } from "@/utils/auth"; +import { updateCustomHeaders } from "@/utils/headers"; +import { generateSpanId, generateTraceId } from "@/utils/ids"; + +// --------------------------------------------------------------------------- +// OTLP serialization (pure functions — no state) +// --------------------------------------------------------------------------- + +function encodeValue(v: unknown): OTLP.AnyValue { + if (v === null || v === undefined) return { stringValue: "" }; + if (typeof v === "boolean") return { boolValue: v }; + if (typeof v === "number") { + return Number.isInteger(v) ? { intValue: String(v) } : { doubleValue: v }; + } + if (typeof v === "string") return { stringValue: v }; + if (Array.isArray(v)) { + return { arrayValue: { values: v.map(encodeValue) } }; + } + if (typeof v === "object") { + return { + kvlistValue: { + values: Object.entries(v as Record).map( + ([k, val]) => ({ key: k, value: encodeValue(val) }), + ), + }, + }; + } + return { stringValue: String(v) }; +} + +function attr(key: string, v: unknown): OTLP.KeyValue { + return { key, value: encodeValue(v) }; +} + +/** + * Converts a clientTime (ms) and optional microTime (fractional ms) to a + * nanosecond decimal string as required by OTLP 1.10.0. + */ +function toNanoString(clientTimeMs: number, microTime: number = 0): string { + return String( + BigInt(Math.floor(clientTimeMs)) * 1_000_000n + + BigInt(Math.round(microTime * 1_000_000)), + ); +} + +function buildResource(config: Configuration): OTLP.Resource { + const attributes: OTLP.KeyValue[] = [ + attr("service.name", config.toolName ?? "userale"), + attr("service.version", config.toolVersion ?? ""), + attr("userale.version", config.useraleVersion ?? ""), + attr("userale.sessionId", config.sessionId ?? ""), + ]; + if (config.userId) attributes.push(attr("userale.userId", config.userId)); + return { attributes }; +} + +const SCOPE: OTLP.InstrumentationScope = { + name: "flagon-userale", + version: "", +}; + +const KNOWN_LOG_KEYS = new Set([ + "logType", + "type", + "userAction", + "pageUrl", + "pageTitle", + "pageReferrer", + "userAgent", + "sessionId", + "browserSessionId", + "httpSessionId", + "clientTime", + "microTime", + "target", + "path", + "location", + "scrnRes", + "details", + "attributes", + "style", + "userId", + "toolVersion", + "toolName", + "useraleVersion", +]); + +function buildLogRecord( + log: Logging.RawLog | Logging.CustomLog, + spanId: string, + traceId: string, +): OTLP.LogRecord { + const clientTime = log.clientTime ?? Date.now(); + const microTime = log.logType === "raw" ? (log.microTime ?? 0) : 0; + + const attributes: OTLP.KeyValue[] = [ + attr("userale.logType", log.logType), + attr("userale.type", log.type), + attr("userale.userAction", log.userAction), + attr("browser.url", log.pageUrl), + attr("browser.title", log.pageTitle), + attr("browser.referrer", log.pageReferrer), + attr("user_agent.original", log.userAgent), + attr("userale.sessionId", log.sessionId), + attr("userale.browserSessionId", log.browserSessionId), + attr("userale.httpSessionId", log.httpSessionId), + attr("userale.scrnRes", log.scrnRes), + ]; + + if (log.details !== null && log.details !== undefined) { + attributes.push(attr("userale.details", log.details)); + } + + if (log.logType === "raw") { + if (log.target !== undefined) + attributes.push(attr("userale.target", log.target)); + if (log.path !== undefined) attributes.push(attr("userale.path", log.path)); + if (log.location !== undefined) + attributes.push(attr("userale.location", log.location)); + if (Object.keys(log.attributes).length > 0) + attributes.push(attr("userale.attributes", log.attributes)); + if (Object.keys(log.style).length > 0) + attributes.push(attr("userale.style", log.style)); + } + + // Catch-all: extra fields added by callbacks are encoded as-is + for (const key of Object.keys(log)) { + if (!KNOWN_LOG_KEYS.has(key)) { + const val = (log as Logging.JSONObject)[key]; + if (val !== undefined) attributes.push(attr(key, val)); + } + } + + return { + timeUnixNano: toNanoString(clientTime, microTime), + observedTimeUnixNano: toNanoString(Date.now()), + severityNumber: log.userAction ? 9 : 5, + severityText: log.userAction ? "INFO" : "DEBUG", + eventName: log.type ?? "", + body: { stringValue: log.type ?? "" }, + attributes, + traceId, + spanId, + }; +} + +function buildSpan(log: Logging.IntervalLog): OTLP.Span { + const attributes: OTLP.KeyValue[] = [ + attr("userale.logType", "interval"), + attr("userale.type", log.type), + attr("userale.count", log.count), + attr("userale.targetChange", log.targetChange), + attr("userale.typeChange", log.typeChange), + attr("userale.sessionId", log.sessionId), + attr("userale.browserSessionId", log.browserSessionId), + attr("userale.httpSessionId", log.httpSessionId), + attr("browser.url", log.pageUrl), + attr("browser.title", log.pageTitle), + attr("user_agent.original", log.userAgent), + ]; + if (log.target !== undefined) + attributes.push(attr("userale.target", log.target)); + if (log.path !== undefined) attributes.push(attr("userale.path", log.path)); + + return { + traceId: generateTraceId(), + spanId: generateSpanId(), + name: `userale.${log.type ?? "interval"}`, + kind: 1, // SPAN_KIND_INTERNAL + startTimeUnixNano: toNanoString(log.startTime ?? 0), + endTimeUnixNano: toNanoString(log.endTime ?? 0), + attributes, + status: { code: 0 }, // STATUS_CODE_UNSET + }; +} + +function buildPayloads( + logs: Logging.Log[], + traceId: string, + spanId: string, + config: Configuration, +): OTLP.Payloads { + const logRecords: OTLP.LogRecord[] = []; + const spans: OTLP.Span[] = []; + + for (const log of logs) { + if (log.logType === "interval") { + spans.push(buildSpan(log)); + } else { + logRecords.push(buildLogRecord(log, spanId, traceId)); + } + } + + const resource = buildResource(config); + const scope: OTLP.InstrumentationScope = { + ...SCOPE, + version: config.useraleVersion ?? "", + }; + + const logsPayload: OTLP.ExportLogsServiceRequest | undefined = + logRecords.length > 0 + ? { + resourceLogs: [ + { + resource, + scopeLogs: [{ scope, logRecords, schemaUrl: "" }], + schemaUrl: "", + }, + ], + } + : undefined; + + const tracesPayload: OTLP.ExportTraceServiceRequest | undefined = + spans.length > 0 + ? { + resourceSpans: [ + { + resource, + scopeSpans: [{ scope, spans, schemaUrl: "" }], + schemaUrl: "", + }, + ], + } + : undefined; + + return { logs: logsPayload, traces: tracesPayload }; +} + +// --------------------------------------------------------------------------- +// HTTP transport (pure — no state) +// --------------------------------------------------------------------------- + +function buildHeaders(config: Configuration): Headers { + updateAuthHeader(config); + updateCustomHeaders(config); + + const headers = new Headers({ "Content-Type": "application/json" }); + + if (config.authHeader) { + const value = + typeof config.authHeader === "function" + ? config.authHeader() + : config.authHeader; + headers.set("Authorization", value as string); + } + + if (config.headers) { + for (const [key, value] of Object.entries(config.headers)) { + headers.set(key, value); + } + } + + return headers; +} + +async function exportBatch( + logs: Logging.Log[], + traceId: string, + spanId: string, + config: Configuration, +): Promise { + const { logs: logsPayload, traces: tracesPayload } = buildPayloads( + logs, + traceId, + spanId, + config, + ); + + const baseUrl = config.url.replace(/\/$/, ""); + const headers = buildHeaders(config); + const sends: Promise[] = []; + + if (logsPayload) { + sends.push( + fetch(`${baseUrl}/v1/logs`, { + method: "POST", + headers, + body: JSON.stringify(logsPayload), + }), + ); + } + + if (tracesPayload) { + sends.push( + fetch(`${baseUrl}/v1/traces`, { + method: "POST", + headers, + body: JSON.stringify(tracesPayload), + }), + ); + } + + await Promise.all(sends); +} + +// --------------------------------------------------------------------------- +// Sender — owns interval ID and active trace/span context +// --------------------------------------------------------------------------- + +export class Sender { + private sendIntervalId: ReturnType | undefined; + private activeTraceId: string = ""; + private activeSpanId: string = ""; + + start(logs: Array, config: Configuration): void { + if (this.sendIntervalId) { + clearInterval(this.sendIntervalId); + } + this.activeTraceId = generateTraceId(); + this.activeSpanId = generateSpanId(); + this.sendIntervalId = this.onInterval(logs, config); + this.onClose(logs, config); + } + + stop(): void { + if (this.sendIntervalId) { + clearInterval(this.sendIntervalId); + this.sendIntervalId = undefined; + } + } + + onInterval( + logs: Array, + config: Configuration, + ): ReturnType { + return setInterval(() => { + if (!config.on) return; + if (logs.length >= config.logCountThreshold) { + exportBatch( + logs.slice(0), + this.activeTraceId, + this.activeSpanId, + config, + ); + logs.splice(0); + } + }, config.transmitInterval); + } + + onClose(logs: Array, config: Configuration): void { + self.addEventListener("pagehide", () => { + if (!config.on || logs.length === 0) return; + + const { logs: logsPayload, traces: tracesPayload } = buildPayloads( + logs, + this.activeTraceId, + this.activeSpanId, + config, + ); + + const baseUrl = config.url.replace(/\/$/, ""); + const headers = buildHeaders(config); + + if (logsPayload) { + fetch(`${baseUrl}/v1/logs`, { + keepalive: true, + method: "POST", + headers, + body: JSON.stringify(logsPayload), + }).catch((error) => { + console.error(error); + }); + } + + if (tracesPayload) { + fetch(`${baseUrl}/v1/traces`, { + keepalive: true, + method: "POST", + headers, + body: JSON.stringify(tracesPayload), + }).catch((error) => { + console.error(error); + }); + } + + logs.splice(0); + }); + } + + flush(logs: Array, config: Configuration): Promise { + return exportBatch(logs, this.activeTraceId, this.activeSpanId, config); + } +} diff --git a/products/userale/packages/core-sdk/src/UserALE.ts b/products/userale/packages/core-sdk/src/UserALE.ts new file mode 100644 index 0000000..fcc95cb --- /dev/null +++ b/products/userale/packages/core-sdk/src/UserALE.ts @@ -0,0 +1,165 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { version as userAleVersion } from "../package.json"; +import { Configuration } from "@/Configuration"; +import { Packager } from "@/Packager"; +import { Sender } from "@/Sender"; +import { attachHandlers } from "@/handlers/attach"; + +import type { Settings, Logging } from "@/types"; + +// --------------------------------------------------------------------------- +// Page-load timing — captured at module evaluation time +// --------------------------------------------------------------------------- + +const startLoadTimestamp = Date.now(); +let endLoadTimestamp: number = startLoadTimestamp; + +self.addEventListener("load", () => { + endLoadTimestamp = Date.now(); +}); + +// --------------------------------------------------------------------------- +// UserALE — composes Configuration, Packager, and Sender into one object +// whose lifetime matches the instrumentation session. +// --------------------------------------------------------------------------- + +export class UserALE { + readonly config: Configuration; + private readonly packager: Packager; + private readonly sender: Sender; + private readonly logs: Array; + private started: boolean = false; + + constructor(config: Configuration) { + this.config = config; + this.config.update({ useraleVersion: userAleVersion }); + this.logs = []; + this.packager = new Packager(this.logs, this.config); + this.sender = new Sender(); + } + + // ------------------------------------------------------------------------- + // Lifecycle + // ------------------------------------------------------------------------- + + /** + * Starts capturing events and sending logs. + * In browser contexts waits for the DOM to be ready. + * In worker/service-worker contexts starts immediately. + * Safe to call again after options() — the sender restarts with the new config. + */ + start(): void { + this.whenReady(() => { + this.attach(); + this.sender.start(this.logs, this.config); + }); + } + + /** + * Captures events and routes them through callbacks, but does not start the + * sender. Use this in content-script contexts where a separate background + * instance owns transport — the rerouteLog callback intercepts every log + * before it can be queued, so no fetch calls are ever made from the page. + */ + capture(): void { + this.whenReady(() => this.attach()); + } + + /** + * Stops sending logs and clears the sender interval. + */ + stop(): void { + this.started = this.config.on = false; + this.sender.stop(); + } + + private whenReady(fn: () => void): void { + if (typeof document === "undefined") { + fn(); + return; + } + if ( + document.readyState === "interactive" || + document.readyState === "complete" + ) { + fn(); + } else { + document.addEventListener("DOMContentLoaded", fn, { once: true }); + } + } + + private attach(): void { + if (!this.started) { + attachHandlers(this.config, this.packager); + this.started = this.config.on = true; + + if (typeof window !== "undefined" && typeof document !== "undefined") { + this.packager.packageCustomLog( + { + type: "load", + details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp }, + }, + () => ({}), + false, + ); + } + } else { + this.config.on = true; + } + } + + // ------------------------------------------------------------------------- + // Public API + // ------------------------------------------------------------------------- + + options(newConfig?: Partial): Settings.Config { + if (newConfig) this.config.update(newConfig); + return this.config; + } + + log(customLog: Logging.UserLog | undefined): boolean { + if (customLog) { + this.logs.push(customLog as Logging.Log); + return true; + } + return false; + } + + flush(): Promise { + return this.sender.flush(this.logs, this.config); + } + + addCallbacks( + ...newCallbacks: Record[] + ): void { + this.packager.addCallbacks(...newCallbacks); + } + + removeCallbacks(targetKeys: string[]): void { + this.packager.removeCallbacks(targetKeys); + } + + packageCustomLog( + userLog: Logging.UserLog, + detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, + userAction: boolean, + ): boolean { + return this.packager.packageCustomLog(userLog, detailFcn, userAction); + } +} diff --git a/products/userale/packages/core-sdk/src/handlers/attach.ts b/products/userale/packages/core-sdk/src/handlers/attach.ts new file mode 100644 index 0000000..69a08a6 --- /dev/null +++ b/products/userale/packages/core-sdk/src/handlers/attach.ts @@ -0,0 +1,134 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Packager } from "@/Packager"; +import { Events } from "@/types"; +import { Configuration } from "@/Configuration"; +import { + defineDetails, + extractWheelDetails, + extractScrollDetails, + extractResizeDetails, +} from "@/handlers/eventDetails"; + +//@todo: Investigate drag events and their behavior +const intervalEvents: Array = [ + "click", + "focus", + "blur", + "input", + "change", + "mouseover", + "submit", +]; +const windowEvents: Array = ["load", "blur", "focus"]; + +const bufferedEvents: Events.EventDetailsMap = { + wheel: extractWheelDetails, + scroll: extractScrollDetails, + resize: extractResizeDetails, +}; + +const refreshEvents: Events.EventDetailsMap = { + submit: null, +}; + +/** + * Hooks the event handlers for each event type of interest. + * @param {Configuration} config Configuration singleton to use. + * @param {Packager} packager Packager instance to route events through. + * @return {boolean} Whether the operation succeeded. + */ +export function attachHandlers( + config: Configuration, + packager: Packager, +): boolean { + try { + const events = defineDetails(config); + + const bufferBools: Events.EventBoolMap = + {} as Events.EventBoolMap; + + (Object.keys(events) as Events.AllowedEvents[]).forEach(function (ev) { + document.addEventListener( + ev, + function (e) { + packager.packageLog(e, events[ev]); + }, + true, + ); + }); + + intervalEvents.forEach(function (ev) { + document.addEventListener( + ev, + function (e) { + packager.packageIntervalLog(e); + }, + true, + ); + }); + + (Object.keys(bufferedEvents) as Events.BufferedEvents[]).forEach( + function (ev) { + bufferBools[ev] = true; + + self.addEventListener( + ev, + function (e) { + if (bufferBools[ev]) { + bufferBools[ev] = false; + packager.packageLog(e, bufferedEvents[ev]); + setTimeout(function () { + bufferBools[ev] = true; + }, config.resolution); + } + }, + true, + ); + }, + ); + + (Object.keys(refreshEvents) as Events.RefreshEvents[]).forEach( + function (ev) { + document.addEventListener( + ev, + function (e) { + packager.packageLog(e, events[ev]); + }, + true, + ); + }, + ); + + windowEvents.forEach(function (ev) { + self.addEventListener( + ev, + function (e) { + packager.packageLog(e, function () { + return { window: true }; + }); + }, + true, + ); + }); + + return true; + } catch { + return false; + } +} diff --git a/products/userale/packages/core-sdk/src/handlers/eventDetails.ts b/products/userale/packages/core-sdk/src/handlers/eventDetails.ts new file mode 100644 index 0000000..1c64abe --- /dev/null +++ b/products/userale/packages/core-sdk/src/handlers/eventDetails.ts @@ -0,0 +1,149 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Events, Logging, Settings } from "@/types"; + +/** + * Maps a MouseEvent to an object containing useful information. + */ +export function extractMouseDetails(e: MouseEvent) { + return { + clicks: e.detail, + ctrl: e.ctrlKey, + alt: e.altKey, + shift: e.shiftKey, + meta: e.metaKey, + }; +} + +/** + * Maps a KeyboardEvent to an object containing useful information. + */ +export function extractKeyboardDetails(e: KeyboardEvent) { + return { + key: e.key, + code: e.code, + ctrl: e.ctrlKey, + alt: e.altKey, + shift: e.shiftKey, + meta: e.metaKey, + }; +} + +/** + * Maps an InputEvent to an object containing useful information. + */ +export function extractInputDetails(e: InputEvent) { + return { + value: (e.target as HTMLInputElement).value, + }; +} + +/** + * Maps a ChangeEvent to an object containing useful information. + */ +export function extractChangeDetails(e: Events.ChangeEvent) { + return { + value: e.target.value, + }; +} + +/** + * Maps a WheelEvent to an object containing useful information. + */ +export function extractWheelDetails(e: WheelEvent) { + return { + x: e.deltaX, + y: e.deltaY, + z: e.deltaZ, + }; +} + +/** + * Maps a ScrollEvent to an object containing useful information. + */ +export function extractScrollDetails() { + return { + x: window.scrollX, + y: window.scrollY, + }; +} + +/** + * Maps a ResizeEvent to an object containing useful information. + */ +export function extractResizeDetails() { + return { + width: window.outerWidth, + height: window.outerHeight, + }; +} + +/** + * Defines the event detail extractors and the events to listen for. + */ +export function defineDetails( + config: Settings.DefaultConfig, +): Events.EventDetailsMap { + return { + click: extractMouseDetails, + dblclick: extractMouseDetails, + mousedown: extractMouseDetails, + mouseup: extractMouseDetails, + focus: null, + blur: null, + input: config.logDetails ? extractKeyboardDetails : null, + change: config.logDetails ? extractChangeDetails : null, + dragstart: null, + dragend: null, + drag: null, + drop: null, + keydown: config.logDetails ? extractKeyboardDetails : null, + mouseover: null, + }; +} + +/** + * Returns the detail extractor for a given event type, respecting the config. + */ +export function defineCustomDetails( + options: Settings.DefaultConfig, + type: Events.AllowedEvents, +): Logging.DynamicDetailFunction | null | undefined { + const eventType: Events.EventDetailsMap = { + click: extractMouseDetails, + dblclick: extractMouseDetails, + mousedown: extractMouseDetails, + mouseup: extractMouseDetails, + focus: null, + blur: null, + load: null, + input: options.logDetails ? extractKeyboardDetails : null, + change: options.logDetails ? extractChangeDetails : null, + dragstart: null, + dragend: null, + drag: null, + drop: null, + keydown: options.logDetails ? extractKeyboardDetails : null, + mouseover: null, + wheel: extractWheelDetails, + scroll: extractScrollDetails, + resize: extractResizeDetails, + submit: null, + }; + return eventType[type]; +} diff --git a/products/userale/packages/flagon-userale/example/react-app-example/src/index.css b/products/userale/packages/core-sdk/src/main.ts similarity index 68% rename from products/userale/packages/flagon-userale/example/react-app-example/src/index.css rename to products/userale/packages/core-sdk/src/main.ts index c166df2..94c4796 100644 --- a/products/userale/packages/flagon-userale/example/react-app-example/src/index.css +++ b/products/userale/packages/core-sdk/src/main.ts @@ -1,4 +1,4 @@ -/* +/*! * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. @@ -15,16 +15,11 @@ * limitations under the License. */ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} +export { UserALE } from "@/UserALE"; +export { Configuration } from "@/Configuration"; +export { defineCustomDetails as details } from "@/handlers/eventDetails"; +export { registerAuthCallback } from "@/utils/auth"; +export { generateTraceId, generateSpanId } from "@/utils/ids"; +export type { Logging, OTLP } from "@/types"; -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} +export { version } from "../package.json"; diff --git a/products/userale/packages/core-sdk/src/types.d.ts b/products/userale/packages/core-sdk/src/types.d.ts new file mode 100644 index 0000000..3538e37 --- /dev/null +++ b/products/userale/packages/core-sdk/src/types.d.ts @@ -0,0 +1,313 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export declare namespace Settings { + type Version = string | null; + type UserId = string | null; + type SessionId = string | null; + type UserFromParams = string | null; + type ToolName = string | null; + type AuthHeader = CallableFunction | string | null; + type CustomIndex = string | null; + type HeaderObject = { [key: string]: string }; + type Headers = HeaderObject | null; + type TimeFunction = (() => number) | ((ts: number) => number); + + type ConfigValueTypes = + | string + | number + | boolean + | null + | Version + | UserId + | SessionId + | UserFromParams + | ToolName + | AuthHeader + | CustomIndex + | Headers + | TimeFunction; + + export interface DefaultConfig { + [key: string]: ConfigValueTypes; + } + + export interface Config extends DefaultConfig { + autostart: boolean; + authHeader: AuthHeader; + browserSessionId: SessionId; + custIndex: CustomIndex; + headers: Headers; + httpSessionId: SessionId; + logCountThreshold: number; + logDetails: boolean; + on?: boolean; + resolution: number; + sessionId: SessionId; + time: TimeFunction; + toolName: ToolName; + toolVersion?: Version; + transmitInterval: number; + url: string; + userFromParams: UserFromParams; + useraleVersion: Version; + userId: UserId; + version?: Version; + } + + export interface IConfiguration extends Config { + getInstance(): Configuration; + configure(newConfig: Config): void; + } +} + +export declare namespace Logging { + type JSONValue = + | string + | number + | boolean + | null + | undefined + | { [key: string]: JSONValue } + | JSONValue[]; + + type JSONObject = { [key: string]: JSONValue }; + + /** Fields shared by all log types. */ + interface BaseLog { + pageUrl: string; + pageTitle: string; + pageReferrer: string; + userAgent: string; + clientTime: number; + scrnRes: { width: number; height: number }; + logType: "raw" | "custom" | "interval"; + userAction: boolean; + details: JSONObject | null; + userId: string | null; + toolVersion: string | null; + toolName: string | null; + useraleVersion: string | null; + sessionId: string | null; + httpSessionId: string | null; + browserSessionId: string | null; + } + + /** A raw log produced by a DOM event. */ + interface RawLog extends BaseLog { + logType: "raw"; + target: string | null; + path: string[]; + microTime: number; + location: { x: number | null; y: number | null }; + type: string; + attributes: JSONObject; + style: JSONObject; + } + + /** A developer-emitted custom log. */ + interface CustomLog extends BaseLog { + logType: "custom"; + type: string; + [key: string]: JSONValue; + } + + /** An interval log summarising a run of repeated events. */ + interface IntervalLog extends BaseLog { + logType: "interval"; + target: string | null; + path: string[] | null; + type: string | null; + count: number; + duration: number; + startTime: number; + endTime: number; + targetChange: boolean; + typeChange: boolean; + } + + /** Union of all log shapes. Used as the element type of the log queue. */ + export type Log = RawLog | CustomLog | IntervalLog; + + /** Arbitrary log passed directly to the queue via the public log() API. */ + export type UserLog = JSONObject; + + export type DynamicDetailFunction = ( + e: E, + ) => JSONObject; + export type StaticDetailFunction = () => JSONObject; +} + +export declare namespace Events { + type FormElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement; + type ChangeEvent = Event; + export type RawEvents = + | "dblclick" + | "mouseup" + | "mousedown" + | "dragstart" + | "dragend" + | "drag" + | "drop" + | "keydown"; + export type IntervalEvents = + | "click" + | "focus" + | "blur" + | "input" + | "change" + | "mouseover" + | "submit"; + export type WindowEvents = "load" | "blur" | "focus"; + export type BufferedEvents = "wheel" | "scroll" | "resize"; + export type RefreshEvents = "submit"; + export type AllowedEvents = + | RawEvents + | IntervalEvents + | WindowEvents + | BufferedEvents + | RefreshEvents; + + export type EventDetailsMap = Partial<{ + [key in T]: + | Logging.DynamicDetailFunction< + | MouseEvent + | KeyboardEvent + | InputEvent + | Events.ChangeEvent + | WheelEvent + > + | Logging.StaticDetailFunction + | null; + }>; + + export type EventBoolMap = Partial<{ + [key in T]: boolean; + }>; +} + +export declare namespace Callbacks { + export type AuthCallback = () => string; + export type HeadersCallback = () => Settings.HeaderObject; + + export type CallbackMap = { + [key in string]: CallableFunction; + }; +} + +export declare namespace Extension { + export type PluginConfig = { urlWhitelist: string }; + export type ConfigPayload = { + useraleConfig: Partial; + pluginConfig: PluginConfig; + }; +} + +/** + * OTLP/HTTP JSON types compliant with OTLP Specification 1.10.0. + * All 64-bit integer fields (timeUnixNano, etc.) are decimal strings per spec. + * traceId is a 32-char hex string; spanId is a 16-char hex string. + */ +export declare namespace OTLP { + export type AnyValue = + | { stringValue: string } + | { boolValue: boolean } + | { intValue: string } + | { doubleValue: number } + | { arrayValue: { values: AnyValue[] } } + | { kvlistValue: { values: KeyValue[] } } + | { bytesValue: string }; + + export type KeyValue = { key: string; value: AnyValue }; + + export interface Resource { + attributes: KeyValue[]; + droppedAttributesCount?: number; + } + + export interface InstrumentationScope { + name: string; + version: string; + attributes?: KeyValue[]; + } + + export interface LogRecord { + timeUnixNano: string; + observedTimeUnixNano: string; + severityNumber: number; + severityText: string; + eventName: string; + body: AnyValue; + attributes: KeyValue[]; + droppedAttributesCount?: number; + traceId: string; + spanId: string; + flags?: number; + } + + export interface ScopeLogs { + scope: InstrumentationScope; + logRecords: LogRecord[]; + schemaUrl: string; + } + + export interface ResourceLogs { + resource: Resource; + scopeLogs: ScopeLogs[]; + schemaUrl: string; + } + + export interface ExportLogsServiceRequest { + resourceLogs: ResourceLogs[]; + } + + export interface Span { + traceId: string; + spanId: string; + parentSpanId?: string; + traceState?: string; + name: string; + kind: number; + startTimeUnixNano: string; + endTimeUnixNano: string; + attributes: KeyValue[]; + droppedAttributesCount?: number; + status?: { code: number; message?: string }; + } + + export interface ScopeSpans { + scope: InstrumentationScope; + spans: Span[]; + schemaUrl: string; + } + + export interface ResourceSpans { + resource: Resource; + scopeSpans: ScopeSpans[]; + schemaUrl: string; + } + + export interface ExportTraceServiceRequest { + resourceSpans: ResourceSpans[]; + } + + export interface Payloads { + /** POST to /v1/logs — undefined if no log records in batch */ + logs: ExportLogsServiceRequest | undefined; + /** POST to /v1/traces — undefined if no spans in batch */ + traces: ExportTraceServiceRequest | undefined; + } +} diff --git a/products/userale/packages/flagon-userale/src/utils/auth/index.ts b/products/userale/packages/core-sdk/src/utils/auth.ts similarity index 98% rename from products/userale/packages/flagon-userale/src/utils/auth/index.ts rename to products/userale/packages/core-sdk/src/utils/auth.ts index 38ef65f..6144e57 100644 --- a/products/userale/packages/flagon-userale/src/utils/auth/index.ts +++ b/products/userale/packages/core-sdk/src/utils/auth.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { Configuration } from "@/configure"; +import { Configuration } from "@/Configuration"; import { Callbacks } from "@/types"; export let authCallback: Callbacks.AuthCallback | null = null; diff --git a/products/userale/packages/core-sdk/src/utils/getInitialSettings.ts b/products/userale/packages/core-sdk/src/utils/getInitialSettings.ts new file mode 100644 index 0000000..da5e358 --- /dev/null +++ b/products/userale/packages/core-sdk/src/utils/getInitialSettings.ts @@ -0,0 +1,136 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the 'License'); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Settings } from "@/types"; +import { generateSpanId } from "@/utils/ids"; + +let sessionId: string | null = null; +let httpSessionId: string | null = null; + +/** + * Extracts the initial configuration settings from the + * currently executing script tag. + */ +export function getInitialSettings(): Settings.Config { + if ( + typeof WorkerGlobalScope !== "undefined" && + self instanceof WorkerGlobalScope + ) { + return { + authHeader: null, + autostart: true, + browserSessionId: null, + custIndex: null, + headers: null, + httpSessionId: null, + logCountThreshold: 5, + logDetails: false, + resolution: 500, + sessionId, + time: (ts?: number) => (ts !== undefined ? ts : Date.now()), + toolName: null, + toolVersion: null, + transmitInterval: 5000, + url: "http://localhost:4318", + useraleVersion: null, + userFromParams: null, + userId: null, + }; + } + + if (sessionId === null) { + sessionId = getOrCreateSessionId( + "userAlesessionId", + "session_" + String(Date.now()), + ); + } + + if (httpSessionId === null) { + httpSessionId = getOrCreateSessionId( + "userAleHttpSessionId", + generateSpanId(), + ); + } + + const script = + document.currentScript ?? + ((): Element | null => { + const scripts = document.getElementsByTagName("script"); + return scripts[scripts.length - 1] ?? null; + })(); + + const get = (attr: string): string | null => + script ? script.getAttribute(attr) : null; + + const headers = get("data-headers"); + + return { + authHeader: get("data-auth"), + autostart: get("data-autostart") !== "false", + browserSessionId: null, + custIndex: get("data-index"), + headers: headers ? JSON.parse(headers) : null, + httpSessionId, + logCountThreshold: +(get("data-threshold") ?? 5), + logDetails: get("data-log-details") === "true", + resolution: +(get("data-resolution") ?? 500), + sessionId: get("data-session") ?? sessionId, + time: timeStampScale(document.createEvent("CustomEvent")), + toolName: get("data-tool"), + toolVersion: get("data-version"), + transmitInterval: +(get("data-interval") ?? 5000), + url: get("data-url") ?? "http://localhost:4318", + useraleVersion: get("data-userale-version"), + userFromParams: get("data-user-from-params"), + userId: get("data-user"), + }; +} + +/** + * Retrieves a session ID from sessionStorage, creating and storing it if absent. + * Preserves the session across page refreshes (e.g. after form submit). + */ +export function getOrCreateSessionId( + key: string, + defaultValue: string, +): string { + const stored = self.sessionStorage.getItem(key); + if (stored === null) { + self.sessionStorage.setItem(key, JSON.stringify(defaultValue)); + return defaultValue; + } + return JSON.parse(stored) as string; +} + +/** + * Returns a function that normalises a browser event timestamp to Unix ms, + * accounting for cross-browser quirks in how timeStamp is reported. + */ +export function timeStampScale(e: Event): Settings.TimeFunction { + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + if (delta < 0) { + return () => e.timeStamp / 1000; + } else if (delta > e.timeStamp) { + const navStart = performance.timeOrigin; + return (ts: number) => ts + navStart; + } else { + return (ts: number) => ts; + } + } + return () => Date.now(); +} diff --git a/products/userale/packages/flagon-userale/src/utils/headers/index.ts b/products/userale/packages/core-sdk/src/utils/headers.ts similarity index 98% rename from products/userale/packages/flagon-userale/src/utils/headers/index.ts rename to products/userale/packages/core-sdk/src/utils/headers.ts index cd23e62..093c7b4 100644 --- a/products/userale/packages/flagon-userale/src/utils/headers/index.ts +++ b/products/userale/packages/core-sdk/src/utils/headers.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { Configuration } from "@/configure"; +import { Configuration } from "@/Configuration"; import { Callbacks } from "@/types"; export let headersCallback: Callbacks.HeadersCallback | null = null; diff --git a/products/userale/packages/core-sdk/src/utils/ids.ts b/products/userale/packages/core-sdk/src/utils/ids.ts new file mode 100644 index 0000000..9f756be --- /dev/null +++ b/products/userale/packages/core-sdk/src/utils/ids.ts @@ -0,0 +1,35 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Implements the OTel IdGenerator interface using the Web Crypto API. + * Method names match opentelemetry-js IdGenerator: generateTraceId / generateSpanId. + */ + +/** Generates a random 16-byte (32 hex char) trace ID. */ +export function generateTraceId(): string { + const bytes = new Uint8Array(16); + crypto.getRandomValues(bytes); + return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); +} + +/** Generates a random 8-byte (16 hex char) span ID. */ +export function generateSpanId(): string { + const bytes = new Uint8Array(8); + crypto.getRandomValues(bytes); + return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); +} diff --git a/products/userale/packages/flagon-userale/src/utils/index.ts b/products/userale/packages/core-sdk/src/utils/index.ts similarity index 90% rename from products/userale/packages/flagon-userale/src/utils/index.ts rename to products/userale/packages/core-sdk/src/utils/index.ts index 610bdc8..5c0d438 100644 --- a/products/userale/packages/flagon-userale/src/utils/index.ts +++ b/products/userale/packages/core-sdk/src/utils/index.ts @@ -20,11 +20,12 @@ export { registerAuthCallback, resetAuthCallback, verifyCallback as verifyAuthCallback, -} from "./auth"; +} from "@/utils/auth"; export { headersCallback, updateCustomHeaders, registerHeadersCallback, resetHeadersCallback, verifyCallback as verifyHeadersCallback, -} from "./headers"; +} from "@/utils/headers"; +export { generateTraceId, generateSpanId } from "@/utils/ids"; diff --git a/products/userale/packages/flagon-userale/test/globals.d.ts b/products/userale/packages/core-sdk/test/globals.d.ts similarity index 100% rename from products/userale/packages/flagon-userale/test/globals.d.ts rename to products/userale/packages/core-sdk/test/globals.d.ts diff --git a/products/userale/packages/flagon-userale/test/jest.config.ts b/products/userale/packages/core-sdk/test/jest.config.ts similarity index 91% rename from products/userale/packages/flagon-userale/test/jest.config.ts rename to products/userale/packages/core-sdk/test/jest.config.ts index 6202fc3..406fb28 100644 --- a/products/userale/packages/flagon-userale/test/jest.config.ts +++ b/products/userale/packages/core-sdk/test/jest.config.ts @@ -22,15 +22,16 @@ * https://jestjs.io/docs/configuration */ -/** @type {import('jest').Config} */ -const config = { +import type { Config } from "jest"; + +const config: Config = { rootDir: "../", preset: "ts-jest", moduleNameMapper: { "^@/(.*)$": "/src/$1", }, setupFiles: ["/test/jest.setup.js"], - testMatch: ["/test/spec/(*.)+(spec|test).[tj]s?(x)"], + testMatch: ["/test/spec/**/*.(spec|test).[tj]s?(x)"], transform: { "^.+\\.tsx?$": [ "ts-jest", diff --git a/products/userale/packages/flagon-userale/test/jest.setup.js b/products/userale/packages/core-sdk/test/jest.setup.js similarity index 100% rename from products/userale/packages/flagon-userale/test/jest.setup.js rename to products/userale/packages/core-sdk/test/jest.setup.js diff --git a/products/userale/packages/flagon-userale/test/spec/attachHandlers.spec.ts b/products/userale/packages/core-sdk/test/spec/attachHandlers.spec.ts similarity index 83% rename from products/userale/packages/flagon-userale/test/spec/attachHandlers.spec.ts rename to products/userale/packages/core-sdk/test/spec/attachHandlers.spec.ts index 3a6a6f7..f3389c2 100644 --- a/products/userale/packages/flagon-userale/test/spec/attachHandlers.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/attachHandlers.spec.ts @@ -18,18 +18,20 @@ * limitations under the License. */ import { jest } from "@jest/globals"; - -jest.unstable_mockModule("@/packageLogs", () => ({ - packageLog: jest.fn(), -})); - -import { attachHandlers } from "@/attachHandlers"; +import { attachHandlers } from "@/handlers/attach"; import { Events } from "@/types"; -import { Configuration } from "@/configure"; -import { packageLog } from "@/packageLogs"; +import { Configuration } from "@/Configuration"; +import type { Packager } from "@/Packager"; const config = Configuration.getInstance(); +function makeMockPackager(): Packager { + return { + packageLog: jest.fn(), + packageIntervalLog: jest.fn(), + } as unknown as Packager; +} + describe("attachHandlers", () => { beforeEach(() => config.reset()); @@ -67,7 +69,6 @@ describe("attachHandlers", () => { missingIntervalEvents, ); - // Acts as a kind of Proxy for addEventListener. Keeps track of added listeners. const listenerHook = (eventList: Events.AllowedEvents[]) => (ev: Events.AllowedEvents) => { const evIndex = eventList.indexOf(ev); @@ -87,7 +88,7 @@ describe("attachHandlers", () => { .mockImplementation(listenerHook(missingWindowEvents) as any); config.update({ logDetails: true }); - attachHandlers(config); + attachHandlers(config, makeMockPackager()); expect(duplicateEvents).toBe(0); expect(missingDocumentAndIntervalEvents.length).toBe(0); @@ -104,11 +105,12 @@ describe("attachHandlers", () => { "resize", ]; const rate = 500; + const mockPackager = makeMockPackager(); + jest .spyOn(global.document, "addEventListener") .mockImplementation(() => {}); - // Tries to call an event 3 times. Twice in quick succession, then once after the set delay. - // Number of actual calls to packageLog are recorded in callCount. Should amount to exactly 2 calls. + const listenerHook = (ev: string, fn: CallableFunction) => { if ( !testingEvent && @@ -119,7 +121,7 @@ describe("attachHandlers", () => { fn(); setTimeout(() => { fn(); - expect(packageLog).toHaveBeenCalledTimes(2); + expect(mockPackager.packageLog).toHaveBeenCalledTimes(2); }, rate + 1); } }; @@ -128,13 +130,12 @@ describe("attachHandlers", () => { .mockImplementation(listenerHook as any); config.update({ resolution: rate }); - attachHandlers(config); + attachHandlers(config, mockPackager); done(); }); describe("defineDetails", () => { - // TODO: clarify what constitutes "high detail events" and what is "correct" it.skip("configures high detail events correctly", () => {}); }); }); diff --git a/products/userale/packages/flagon-userale/test/spec/auth.spec.ts b/products/userale/packages/core-sdk/test/spec/auth.spec.ts similarity index 98% rename from products/userale/packages/flagon-userale/test/spec/auth.spec.ts rename to products/userale/packages/core-sdk/test/spec/auth.spec.ts index da15319..d7013bf 100644 --- a/products/userale/packages/flagon-userale/test/spec/auth.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/auth.spec.ts @@ -17,7 +17,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Configuration } from "@/configure"; +import { Configuration } from "@/Configuration"; import { authCallback, registerAuthCallback, diff --git a/products/userale/packages/flagon-userale/test/spec/configure.spec.ts b/products/userale/packages/core-sdk/test/spec/configure.spec.ts similarity index 98% rename from products/userale/packages/flagon-userale/test/spec/configure.spec.ts rename to products/userale/packages/core-sdk/test/spec/configure.spec.ts index 2dd8d85..4557cb0 100644 --- a/products/userale/packages/flagon-userale/test/spec/configure.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/configure.spec.ts @@ -17,7 +17,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Configuration } from "@/configure"; +import { Configuration } from "@/Configuration"; describe("configure", () => { const config = Configuration.getInstance(); diff --git a/products/userale/packages/flagon-userale/test/spec/getInitialSettings.spec.ts b/products/userale/packages/core-sdk/test/spec/getInitialSettings.spec.ts similarity index 68% rename from products/userale/packages/flagon-userale/test/spec/getInitialSettings.spec.ts rename to products/userale/packages/core-sdk/test/spec/getInitialSettings.spec.ts index 4d2fa8f..1dd1af3 100644 --- a/products/userale/packages/flagon-userale/test/spec/getInitialSettings.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/getInitialSettings.spec.ts @@ -15,9 +15,7 @@ * limitations under the License. */ import "global-jsdom/register"; - -import { createEnvFromFile } from "./testUtils"; -import { timeStampScale } from "@/getInitialSettings"; +import { getInitialSettings, timeStampScale } from "@/utils/getInitialSettings"; describe("getInitialSettings", () => { describe("timeStampScale", () => { @@ -62,9 +60,36 @@ describe("getInitialSettings", () => { }); describe("getInitialSettings", () => { - it("fetches all settings from a script tag", async () => { - const dom = await createEnvFromFile("getInitialSettings_fetchAll.html"); - const config = dom.window.userale.options(); + function injectScript(attrs: Record): HTMLScriptElement { + const script = document.createElement("script"); + for (const [k, v] of Object.entries(attrs)) { + script.setAttribute(k, v); + } + document.head.appendChild(script); + return script; + } + + afterEach(() => { + // Remove any injected script tags between tests + document + .querySelectorAll("script[data-url], script[data-user]") + .forEach((el) => el.remove()); + }); + + it("fetches all settings from a script tag", () => { + injectScript({ + "data-url": "http://test.com", + "data-interval": "100", + "data-threshold": "10", + "data-user": "testuser", + "data-version": "1.0.0", + "data-log-details": "false", + "data-resolution": "100", + "data-tool": "testtool", + }); + + const config = getInitialSettings(); + expect(config).toHaveProperty("autostart", true); expect(config).toHaveProperty("url", "http://test.com"); expect(config).toHaveProperty("transmitInterval", 100); @@ -74,17 +99,15 @@ describe("getInitialSettings", () => { expect(config).toHaveProperty("logDetails", false); expect(config).toHaveProperty("resolution", 100); expect(config).toHaveProperty("toolName", "testtool"); - expect(config).toHaveProperty("websocketsEnabled", false); - dom.window.close(); }); - it("grabs user id from params", async () => { - const dom = await createEnvFromFile("getInitialSettings_userParam.html", { - url: "file://" + __dirname + "../" + "?user=fakeuser", - }); - const config = dom.window.userale.options(); - expect(config.userId).toBe("fakeuser"); - dom.window.close(); + it("grabs user id from params", () => { + // jsdom doesn't allow changing window.location.search after construction, + // so we simulate userFromParams by injecting the attribute directly. + injectScript({ "data-user-from-params": "user" }); + + const config = getInitialSettings(); + expect(config).toHaveProperty("userFromParams", "user"); }); }); }); diff --git a/products/userale/packages/flagon-userale/test/spec/getInitialSettings_fetchAll.html b/products/userale/packages/core-sdk/test/spec/getInitialSettings_fetchAll.html similarity index 100% rename from products/userale/packages/flagon-userale/test/spec/getInitialSettings_fetchAll.html rename to products/userale/packages/core-sdk/test/spec/getInitialSettings_fetchAll.html diff --git a/products/userale/packages/flagon-userale/test/spec/getInitialSettings_userParam.html b/products/userale/packages/core-sdk/test/spec/getInitialSettings_userParam.html similarity index 100% rename from products/userale/packages/flagon-userale/test/spec/getInitialSettings_userParam.html rename to products/userale/packages/core-sdk/test/spec/getInitialSettings_userParam.html diff --git a/products/userale/packages/flagon-userale/test/spec/headers.spec.ts b/products/userale/packages/core-sdk/test/spec/headers.spec.ts similarity index 99% rename from products/userale/packages/flagon-userale/test/spec/headers.spec.ts rename to products/userale/packages/core-sdk/test/spec/headers.spec.ts index 2c00141..04de693 100644 --- a/products/userale/packages/flagon-userale/test/spec/headers.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/headers.spec.ts @@ -17,7 +17,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Configuration } from "@/configure"; +import { Configuration } from "@/Configuration"; import { headersCallback, registerHeadersCallback, diff --git a/products/userale/packages/core-sdk/test/spec/otlp.spec.ts b/products/userale/packages/core-sdk/test/spec/otlp.spec.ts new file mode 100644 index 0000000..535099f --- /dev/null +++ b/products/userale/packages/core-sdk/test/spec/otlp.spec.ts @@ -0,0 +1,361 @@ +/** + * @jest-environment jsdom + */ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "whatwg-fetch"; +import { Configuration } from "@/Configuration"; +import { Sender } from "@/Sender"; +import type { Logging, OTLP } from "@/types"; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function makeRawLog(overrides: Partial = {}): Logging.RawLog { + return { + logType: "raw", + type: "click", + pageUrl: "http://example.com/", + pageTitle: "Test Page", + pageReferrer: "", + userAgent: "TestAgent/1.0", + clientTime: 1700000000000, + microTime: 0.123, + scrnRes: { width: 1920, height: 1080 }, + userAction: true, + details: null, + userId: "user-1", + toolVersion: "1.0.0", + toolName: "test-tool", + useraleVersion: "2.4.0", + sessionId: "session-1", + httpSessionId: "http-1", + browserSessionId: null, + target: "button#submit", + path: ["button#submit", "form", "body"], + location: { x: 100, y: 200 }, + attributes: { "data-action": "submit" }, + style: {}, + ...overrides, + }; +} + +function makeIntervalLog( + overrides: Partial = {}, +): Logging.IntervalLog { + return { + logType: "interval", + type: "mouseover", + pageUrl: "http://example.com/", + pageTitle: "Test Page", + pageReferrer: "", + userAgent: "TestAgent/1.0", + clientTime: 1700000001000, + scrnRes: { width: 1920, height: 1080 }, + userAction: false, + details: null, + userId: null, + toolVersion: null, + toolName: null, + useraleVersion: "2.4.0", + sessionId: "session-1", + httpSessionId: "http-1", + browserSessionId: null, + target: "div#nav", + path: ["div#nav", "body"], + count: 42, + duration: 5000, + startTime: 1700000000000, + endTime: 1700000005000, + targetChange: false, + typeChange: false, + ...overrides, + }; +} + +function makeCustomLog( + overrides: Partial = {}, +): Logging.CustomLog { + return { + logType: "custom", + type: "load", + pageUrl: "http://example.com/", + pageTitle: "Test Page", + pageReferrer: "", + userAgent: "TestAgent/1.0", + clientTime: 1700000000000, + scrnRes: { width: 1920, height: 1080 }, + userAction: false, + details: { pageLoadTime: 350 }, + userId: null, + toolVersion: null, + toolName: null, + useraleVersion: "2.4.0", + sessionId: "session-1", + httpSessionId: "http-1", + browserSessionId: null, + ...overrides, + }; +} + +function unwrap(v: OTLP.AnyValue): unknown { + if ("stringValue" in v) return v.stringValue; + if ("boolValue" in v) return v.boolValue; + if ("intValue" in v) return v.intValue; + if ("doubleValue" in v) return v.doubleValue; + if ("arrayValue" in v) return v.arrayValue.values.map(unwrap); + if ("kvlistValue" in v) return v.kvlistValue.values; + if ("bytesValue" in v) return v.bytesValue; +} + +function attrValue(attrs: OTLP.KeyValue[], key: string): unknown { + const kv = attrs.find((a) => a.key === key); + return kv ? unwrap(kv.value) : undefined; +} + +/** Parse the JSON body sent to a given OTLP endpoint from the fetch spy. */ +function sentBody( + fetchSpy: jest.SpyInstance, + path: "/v1/logs" | "/v1/traces", +): unknown { + const call = fetchSpy.mock.calls.find(([url]: [string]) => + url.includes(path), + ); + return call ? JSON.parse(call[1].body as string) : undefined; +} + +// --------------------------------------------------------------------------- +// Setup +// --------------------------------------------------------------------------- + +const config = Configuration.getInstance(); +let sender: Sender; +let fetchSpy: jest.SpyInstance; + +beforeEach(() => { + config.reset(); + config.update({ + on: true, + url: "http://localhost:4318", + toolName: "test-tool", + toolVersion: "1.0.0", + sessionId: "session-abc123", + }); + fetchSpy = jest + .spyOn(global, "fetch") + .mockResolvedValue(new Response(null, { status: 200 })); + sender = new Sender(); + jest.useFakeTimers(); + sender.start([], config); + jest.useRealTimers(); +}); + +afterEach(() => { + fetchSpy.mockRestore(); +}); + +// --------------------------------------------------------------------------- +// Payload routing +// --------------------------------------------------------------------------- + +describe("OTLP payload routing", () => { + it("sends raw logs to /v1/logs only", async () => { + await sender.flush([makeRawLog()], config); + expect(fetchSpy.mock.calls.map(([url]: [string]) => url)).toEqual([ + "http://localhost:4318/v1/logs", + ]); + }); + + it("sends custom logs to /v1/logs only", async () => { + await sender.flush([makeCustomLog()], config); + expect(fetchSpy.mock.calls.map(([url]: [string]) => url)).toEqual([ + "http://localhost:4318/v1/logs", + ]); + }); + + it("sends interval logs to /v1/traces only", async () => { + await sender.flush([makeIntervalLog()], config); + expect(fetchSpy.mock.calls.map(([url]: [string]) => url)).toEqual([ + "http://localhost:4318/v1/traces", + ]); + }); + + it("sends a mixed batch to both endpoints", async () => { + await sender.flush( + [makeRawLog(), makeIntervalLog(), makeCustomLog()], + config, + ); + const urls = fetchSpy.mock.calls.map(([url]: [string]) => url).sort(); + expect(urls).toEqual([ + "http://localhost:4318/v1/logs", + "http://localhost:4318/v1/traces", + ]); + }); + + it("makes no fetch calls for an empty batch", async () => { + await sender.flush([], config); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("puts 2 log records and 1 span in a mixed batch", async () => { + await sender.flush( + [makeRawLog(), makeCustomLog(), makeIntervalLog()], + config, + ); + const logsBody = sentBody( + fetchSpy, + "/v1/logs", + ) as OTLP.ExportLogsServiceRequest; + const tracesBody = sentBody( + fetchSpy, + "/v1/traces", + ) as OTLP.ExportTraceServiceRequest; + expect(logsBody.resourceLogs[0].scopeLogs[0].logRecords).toHaveLength(2); + expect(tracesBody.resourceSpans[0].scopeSpans[0].spans).toHaveLength(1); + }); +}); + +// --------------------------------------------------------------------------- +// LogRecord structure +// --------------------------------------------------------------------------- + +describe("LogRecord serialization", () => { + async function getRecord( + log: Logging.RawLog | Logging.CustomLog, + ): Promise { + await sender.flush([log], config); + const body = sentBody( + fetchSpy, + "/v1/logs", + ) as OTLP.ExportLogsServiceRequest; + return body.resourceLogs[0].scopeLogs[0].logRecords[0]; + } + + it("wires a hex traceId and spanId onto log records", async () => { + const record = await getRecord(makeRawLog()); + expect(record.traceId).toMatch(/^[0-9a-f]{32}$/); + expect(record.spanId).toMatch(/^[0-9a-f]{16}$/); + }); + + it("maps userAction=true → INFO (9), false → DEBUG (5)", async () => { + const infoRecord = await getRecord(makeRawLog({ userAction: true })); + expect(infoRecord.severityNumber).toBe(9); + expect(infoRecord.severityText).toBe("INFO"); + + fetchSpy.mockClear(); + const debugRecord = await getRecord(makeRawLog({ userAction: false })); + expect(debugRecord.severityNumber).toBe(5); + expect(debugRecord.severityText).toBe("DEBUG"); + }); + + it("encodes timeUnixNano with microTime precision", async () => { + const record = await getRecord(makeRawLog()); + const expected = String( + BigInt(1700000000000) * 1_000_000n + + BigInt(Math.round(0.123 * 1_000_000)), + ); + expect(record.timeUnixNano).toBe(expected); + }); + + it("uses microTime=0 for custom logs", async () => { + const record = await getRecord(makeCustomLog()); + expect(record.timeUnixNano).toBe( + String(BigInt(1700000000000) * 1_000_000n), + ); + }); + + it("omits raw-only attributes from custom logs", async () => { + const record = await getRecord(makeCustomLog()); + expect( + record.attributes.find((a) => a.key === "userale.target"), + ).toBeUndefined(); + expect( + record.attributes.find((a) => a.key === "userale.location"), + ).toBeUndefined(); + }); + + it("omits userale.details when null, includes it when set", async () => { + const withNull = await getRecord(makeRawLog({ details: null })); + expect( + withNull.attributes.find((a) => a.key === "userale.details"), + ).toBeUndefined(); + + fetchSpy.mockClear(); + const withDetails = await getRecord( + makeRawLog({ details: { foo: "bar" } }), + ); + expect(attrValue(withDetails.attributes, "userale.details")).toBeDefined(); + }); + + it("encodes extra callback fields as catch-all attributes", async () => { + const log = { ...makeRawLog(), customLabel: "my-label" } as Logging.Log; + await sender.flush([log], config); + const body = sentBody( + fetchSpy, + "/v1/logs", + ) as OTLP.ExportLogsServiceRequest; + const attrs = body.resourceLogs[0].scopeLogs[0].logRecords[0].attributes; + expect(attrValue(attrs, "customLabel")).toBe("my-label"); + }); +}); + +// --------------------------------------------------------------------------- +// Span structure +// --------------------------------------------------------------------------- + +describe("Span serialization", () => { + async function getSpan(log: Logging.IntervalLog): Promise { + await sender.flush([log], config); + const body = sentBody( + fetchSpy, + "/v1/traces", + ) as OTLP.ExportTraceServiceRequest; + return body.resourceSpans[0].scopeSpans[0].spans[0]; + } + + it("generates a unique traceId and spanId per span", async () => { + await sender.flush([makeIntervalLog(), makeIntervalLog()], config); + const body = sentBody( + fetchSpy, + "/v1/traces", + ) as OTLP.ExportTraceServiceRequest; + const spans = body.resourceSpans[0].scopeSpans[0].spans; + expect(spans[0].traceId).toMatch(/^[0-9a-f]{32}$/); + expect(spans[0].spanId).toMatch(/^[0-9a-f]{16}$/); + expect(spans[0].traceId).not.toBe(spans[1].traceId); + expect(spans[0].spanId).not.toBe(spans[1].spanId); + }); + + it("sets startTimeUnixNano and endTimeUnixNano from startTime/endTime", async () => { + const span = await getSpan(makeIntervalLog()); + expect(span.startTimeUnixNano).toBe( + String(BigInt(1700000000000) * 1_000_000n), + ); + expect(span.endTimeUnixNano).toBe( + String(BigInt(1700000005000) * 1_000_000n), + ); + }); + + it("encodes interval-specific attributes", async () => { + const span = await getSpan(makeIntervalLog()); + expect(attrValue(span.attributes, "userale.count")).toBe("42"); + expect(attrValue(span.attributes, "userale.targetChange")).toBe(false); + expect(attrValue(span.attributes, "userale.typeChange")).toBe(false); + }); +}); diff --git a/products/userale/packages/flagon-userale/test/spec/packageLogs.spec.ts b/products/userale/packages/core-sdk/test/spec/packageLogs.spec.ts similarity index 54% rename from products/userale/packages/flagon-userale/test/spec/packageLogs.spec.ts rename to products/userale/packages/core-sdk/test/spec/packageLogs.spec.ts index 5f30a44..47b0ea9 100644 --- a/products/userale/packages/flagon-userale/test/spec/packageLogs.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/packageLogs.spec.ts @@ -19,49 +19,41 @@ */ import { JSDOM } from "jsdom"; import "global-jsdom/register"; -import { Configuration } from "@/configure"; +import { Configuration } from "@/Configuration"; import { - addCallbacks, + Packager, buildPath, - cbHandlers, extractTimeFields, getLocation, getSelector, - initPackager, - logs, - packageLog, - removeCallbacks, selectorizePath, buildAttrs, buildCSS, -} from "@/packageLogs"; +} from "@/Packager"; import type { Logging } from "@/types"; const config = Configuration.getInstance(); -describe("packageLogs", () => { - beforeEach(() => config.reset()); +function makePackager() { + config.reset(); + return new Packager([], config); +} +describe("packageLogs", () => { describe("addCallbacks", () => { it("adds a single callback", () => { - // Given - config.update({ on: false }); - initPackager([], config); + const p = makePackager(); const fn = { func1() { return true; }, }; - // When - addCallbacks(fn); - // Then - expect(Object.keys(cbHandlers)).toEqual(Object.keys(fn)); + p.addCallbacks(fn); + expect(Object.keys(p.cbHandlers)).toEqual(Object.keys(fn)); }); it("adds a list of callbacks", () => { - // Given - config.update({ on: false }); - initPackager([], config); + const p = makePackager(); const fns = { func1() { return true; @@ -70,34 +62,26 @@ describe("packageLogs", () => { return false; }, }; - // When - addCallbacks(fns); - // Then - expect(Object.keys(cbHandlers)).toEqual(Object.keys(fns)); + p.addCallbacks(fns); + expect(Object.keys(p.cbHandlers)).toEqual(Object.keys(fns)); }); }); describe("removeCallbacks", () => { it("removes a single callback", () => { - // Given - config.update({ on: false }); - initPackager([], config); + const p = makePackager(); const fn = { func() { return true; }, }; - // When - addCallbacks(fn); - removeCallbacks(Object.keys(fn)); - // Then - expect(Object.keys(cbHandlers)).toHaveLength(0); + p.addCallbacks(fn); + p.removeCallbacks(Object.keys(fn)); + expect(Object.keys(p.cbHandlers)).toHaveLength(0); }); it("removes a list of callbacks", () => { - // Given - config.update({ on: false }); - initPackager([], config); + const p = makePackager(); const fns = { func1() { return true; @@ -106,39 +90,26 @@ describe("packageLogs", () => { return false; }, }; - // When - addCallbacks(fns); - removeCallbacks(Object.keys(fns)); - // Then - expect(Object.keys(cbHandlers)).toHaveLength(0); + p.addCallbacks(fns); + p.removeCallbacks(Object.keys(fns)); + expect(Object.keys(p.cbHandlers)).toHaveLength(0); }); }); describe("packageLog", () => { it("only executes if on", () => { - // Given - let evt: Event; config.update({ on: true }); - initPackager([], config); - evt = new Event("test"); - // When - let success = packageLog(evt); - // Then - expect(success).toBe(true); - // Given + const p = new Packager([], config); + expect(p.packageLog(new Event("test"))).toBe(true); + config.update({ on: false }); - initPackager([], config); - evt = {} as Event; - // When - success = packageLog(evt); - // Then - expect(success).toBe(false); + const p2 = new Packager([], config); + expect(p2.packageLog({} as Event)).toBe(false); }); it("calls detailFcn with the event as an argument if provided", () => { - // Given config.update({ on: true }); - initPackager([], config); + const p = new Packager([], config); let called = false; const evt = new Event("test"); const detailFcn = (e: Event) => { @@ -146,121 +117,86 @@ describe("packageLogs", () => { expect(e).toBe(evt); return {}; }; - // When - packageLog(evt, detailFcn); - // Then + p.packageLog(evt, detailFcn); expect(called).toBe(true); }); it("packages logs", () => { - // Given config.update({ on: true }); - initPackager([], config); - const evt = new Event("test"); - // When - const success = packageLog(evt); - // Then - expect(success).toBe(true); + const p = new Packager([], config); + expect(p.packageLog(new Event("test"))).toBe(true); }); - it("filters logs when a handler is assigned and returns false", () => { - // Given - let filterCalled = false; - const filter = { + it("filters logs when a handler returns false", () => { + config.update({ on: true }); + const p = new Packager([], config); + const evt = new Event("test"); + + p.packageLog(evt); + expect(p.logs.length).toBe(1); + + p.addCallbacks({ filterAll() { - filterCalled = true; return false; }, - }; - const evt = new Event("test"); - config.update({ on: true }); - initPackager([], config); - // When - packageLog(evt); - // Then - expect(logs.length).toBe(1); - // Given - addCallbacks(filter); - // When - packageLog(evt); - // Then - expect(filterCalled).toBe(true); - expect(logs.length).toBe(1); + }); + p.packageLog(evt); + expect(p.logs.length).toBe(1); }); - it("assigns logs to the callback's return value if a handler is assigned", () => { - // Given + it("assigns logs to the callback's return value", () => { + config.update({ on: true }); + const p = new Packager([], config); + const mappedLog = { type: "foo" } as Logging.Log; let mapperCalled = false; - const mappedLog = { type: "foo" }; - const mapper = { + p.addCallbacks({ mapper() { mapperCalled = true; return mappedLog; }, - }; - const evt = new Event("test"); - config.update({ on: true }); - initPackager([], config); - addCallbacks(mapper); - // When - packageLog(evt); - // Then + }); + p.packageLog(new Event("test")); expect(mapperCalled).toBe(true); - expect(logs.indexOf(mappedLog)).toBe(0); + expect(p.logs.indexOf(mappedLog)).toBe(0); }); it("does not call a subsequent handler if the log is filtered out", () => { - // Given - let mapperCalled = false; - const filter = () => false; - const mapper = (log: Logging.Log) => { - mapperCalled = true; - return log; - }; - const evt = new Event("test"); config.update({ on: true }); - initPackager([], config); - addCallbacks({ filter, mapper }); - // addCallbacks(mapper); - // When - packageLog(evt); - // Then + const p = new Packager([], config); + let mapperCalled = false; + p.addCallbacks({ + filter: () => false, + mapper: (log: Logging.Log) => { + mapperCalled = true; + return log; + }, + }); + p.packageLog(new Event("test")); expect(mapperCalled).toBe(false); }); - it("does not attempt to call a non-function filter/mapper", () => { - const evt = new Event("test"); + it("does not attempt to call a non-function callback", () => { config.update({ on: true }); - initPackager([], config); - packageLog(evt); - - // @ts-ignore - // This is a test case to check if the function throws an error when - // the callback is not a function. Should only occur in a - // Javascript environment - addCallbacks("foo"); - packageLog(evt); - - expect(logs.length).toBe(2); + const p = new Packager([], config); + const evt = new Event("test"); + p.packageLog(evt); + // @ts-ignore — JS-only scenario + p.addCallbacks("foo"); + p.packageLog(evt); + expect(p.logs.length).toBe(2); }); }); describe("extractTimeFields", () => { it("returns the millisecond and microsecond portions of a timestamp", () => { - const timeStamp = 123.456; - const fields = { milli: 123, micro: 0.456 }; - const ret = extractTimeFields(timeStamp); - - expect(ret.milli).toBe(fields.milli); - expect(ret.micro).toBe(fields.micro); + const ret = extractTimeFields(123.456); + expect(ret.milli).toBe(123); + expect(ret.micro).toBe(0.456); }); it("sets micro to 0 when no decimal is present", () => { - const timeStamp = 123; - const fields = { milli: 123, micro: 0 }; - const ret = extractTimeFields(timeStamp); - - expect(ret.milli).toBe(fields.milli); - expect(ret.micro).toBe(fields.micro); + const ret = extractTimeFields(123); + expect(ret.milli).toBe(123); + expect(ret.micro).toBe(0); }); it("always returns an object", () => { const stampVariants = [ @@ -271,10 +207,8 @@ describe("packageLogs", () => { ["foo", "bar"], 123, ]; - stampVariants.forEach((variant) => { // @ts-ignore - // This should only occur in a Javascript environment. const ret = extractTimeFields(variant); expect(!!ret).toBe(true); expect(typeof ret).toBe("object"); @@ -285,9 +219,7 @@ describe("packageLogs", () => { describe("getLocation", () => { it("returns event page location", () => { new JSDOM(``); - const document = window.document; - const ele = document.createElement("div"); - // Create a click in the top left corner of the viewport + const ele = window.document.createElement("div"); const evt = new window.MouseEvent("click", { view: window, bubbles: true, @@ -295,41 +227,39 @@ describe("packageLogs", () => { clientX: 0, clientY: 0, }); - document.body.appendChild(ele); + window.document.body.appendChild(ele); ele.addEventListener("click", (e) => { - // Expect the click location to be the top left corner of the viewport - let expectedLocation = { x: window.scrollX, y: window.scrollY }; - expect(getLocation(e)).toEqual(expectedLocation); + expect(getLocation(e)).toEqual({ + x: window.scrollX, + y: window.scrollY, + }); }); ele.dispatchEvent(evt); }); it("calculates page location if unavailable", () => { new JSDOM(``); - const document = window.document; - const ele = document.createElement("div"); + const ele = window.document.createElement("div"); const evt = new window.MouseEvent("click", { view: window, bubbles: true, cancelable: true, }); - document.body.appendChild(ele); + window.document.body.appendChild(ele); ele.addEventListener("click", (e) => { - document.documentElement.scrollLeft = 0; - document.documentElement.scrollTop = 0; - const originalDocument = global.document; - global.document = document; + window.document.documentElement.scrollLeft = 0; + window.document.documentElement.scrollTop = 0; + const original = global.document; + global.document = window.document; expect(getLocation(e)).toEqual({ x: 0, y: 0 }); - global.document = originalDocument; + global.document = original; }); ele.dispatchEvent(evt); }); it("handles null", () => { // @ts-ignore - // This should only occur in a Javascript environment. - const location = getLocation(null); - expect(location).toEqual({ x: null, y: null }); + expect(getLocation(null)).toEqual({ x: null, y: null }); }); }); @@ -346,8 +276,7 @@ describe("packageLogs", () => { describe("getSelector", () => { it("builds a selector", () => { new JSDOM(``); - const document = window.document; - const element = document.createElement("div"); + const element = window.document.createElement("div"); expect(getSelector(element)).toBe("div"); element.id = "bar"; expect(getSelector(element)).toBe("div#bar"); @@ -361,10 +290,8 @@ describe("packageLogs", () => { new JSDOM(``); expect(getSelector(window)).toBe("Window"); }); - it("handles a non-null unknown value", () => { // @ts-ignore - // This should only occur in a Javascript environment. expect(getSelector("foo")).toBe("Unknown"); }); }); @@ -372,25 +299,28 @@ describe("packageLogs", () => { describe("buildPath", () => { it("builds a path", () => { new JSDOM(``); - let actualPath; - const document = window.document; - const ele = document.createElement("div"); + let actualPath: string[] | undefined; + const ele = window.document.createElement("div"); const evt = new window.Event("CustomEvent", { bubbles: true, cancelable: true, }); - document.body.appendChild(ele); + window.document.body.appendChild(ele); ele.addEventListener("CustomEvent", (e) => (actualPath = buildPath(e))); ele.dispatchEvent(evt); - const expectedPath = ["div", "body", "html", "#document", "Window"]; - expect(actualPath).toEqual(expectedPath); + expect(actualPath).toEqual([ + "div", + "body", + "html", + "#document", + "Window", + ]); }); }); test("buildAttrs", () => { - let result; - const document = window.document; - const ele = document.createElement("div"); + let result: any; + const ele = window.document.createElement("div"); const evt = new window.Event("CustomEvent", { bubbles: true, cancelable: true, @@ -398,7 +328,7 @@ describe("packageLogs", () => { ele.setAttribute("data-json", '{"key": "value"}'); ele.setAttribute("data-string", "hello"); ele.setAttribute("style", "color: red;"); - document.body.appendChild(ele); + window.document.body.appendChild(ele); ele.addEventListener("CustomEvent", (e) => (result = buildAttrs(e))); ele.dispatchEvent(evt); expect(result).toEqual({ @@ -409,21 +339,17 @@ describe("packageLogs", () => { }); test("buildCSS", () => { - let result; - const document = window.document; - const ele = document.createElement("div"); + let result: any; + const ele = window.document.createElement("div"); const evt = new window.Event("CustomEvent", { bubbles: true, cancelable: true, }); ele.style.color = "red"; ele.style.marginTop = "10px"; - document.body.appendChild(ele); + window.document.body.appendChild(ele); ele.addEventListener("CustomEvent", (e) => (result = buildCSS(e))); ele.dispatchEvent(evt); - expect(result).toEqual({ - color: "red", - "margin-top": "10px", - }); + expect(result).toEqual({ color: "red", "margin-top": "10px" }); }); }); diff --git a/products/userale/packages/flagon-userale/test/spec/sendLogs.spec.ts b/products/userale/packages/core-sdk/test/spec/sendLogs.spec.ts similarity index 58% rename from products/userale/packages/flagon-userale/test/spec/sendLogs.spec.ts rename to products/userale/packages/core-sdk/test/spec/sendLogs.spec.ts index f7fc602..dcc9405 100644 --- a/products/userale/packages/flagon-userale/test/spec/sendLogs.spec.ts +++ b/products/userale/packages/core-sdk/test/spec/sendLogs.spec.ts @@ -18,29 +18,49 @@ * limitations under the License. */ import "whatwg-fetch"; -import { Configuration } from "@/configure"; -import { initSender, sendOnInterval, sendOnClose } from "@/sendLogs"; +import { Configuration } from "@/Configuration"; +import { Sender } from "@/Sender"; import { registerAuthCallback, registerHeadersCallback } from "@/utils"; import type { Logging } from "@/types"; const config = Configuration.getInstance(); -let xhrMock: Partial; + +function stubLog(fields: Record = {}): Logging.Log { + return { + logType: "custom", + type: "test", + pageUrl: "", + pageTitle: "", + pageReferrer: "", + userAgent: "", + clientTime: Date.now(), + scrnRes: { width: 0, height: 0 }, + userAction: false, + details: null, + userId: null, + toolVersion: null, + toolName: null, + useraleVersion: null, + sessionId: null, + httpSessionId: null, + browserSessionId: null, + ...fields, + } as Logging.Log; +} describe("sendLogs", () => { + let fetchSpy: jest.SpyInstance; + beforeEach(() => { config.reset(); - xhrMock = { - open: jest.fn(), - send: jest.fn(), - setRequestHeader: jest.fn(), - readyState: 4, - status: 200, - responseText: "response", - }; - jest - .spyOn(window, "XMLHttpRequest") - .mockImplementation(() => xhrMock as XMLHttpRequest); + fetchSpy = jest + .spyOn(global, "fetch") + .mockResolvedValue(new Response(null, { status: 200 })); + }); + + afterEach(() => { + fetchSpy.mockRestore(); }); it("sends logs on an interval", (done) => { @@ -53,22 +73,20 @@ describe("sendLogs", () => { const logs: Array = []; jest.useFakeTimers(); - sendOnInterval(logs, config); + const sender = new Sender(); + sender.onInterval(logs, config); jest.advanceTimersByTime(config.transmitInterval * 2); - // Make sure it doesn't make requests for no reason - expect(xhrMock.send).not.toHaveBeenCalled(); + expect(fetchSpy).not.toHaveBeenCalled(); - // Make sure it respects the logCountThreshold - logs.push({ foo: "bar1" }); + logs.push(stubLog({ type: "bar1" })); jest.advanceTimersByTime(config.transmitInterval); expect(logs.length).toEqual(1); - // Make sure it sends the logs and clears the array - logs.push({ foo: "bar2" }); + logs.push(stubLog({ type: "bar2" })); jest.advanceTimersByTime(config.transmitInterval); expect(logs.length).toEqual(0); - expect(xhrMock.send).toHaveBeenCalledTimes(1); + expect(fetchSpy).toHaveBeenCalled(); jest.useRealTimers(); done(); @@ -84,53 +102,46 @@ describe("sendLogs", () => { }); jest.useFakeTimers(); - sendOnInterval(logs, config); + const sender = new Sender(); + sender.onInterval(logs, config); - // Make sure it respects the logCountThreshold - logs.push({ foo: "bar1" }); + logs.push(stubLog({ type: "bar1" })); jest.advanceTimersByTime(config.transmitInterval); - expect(logs.length).toEqual(0); - expect(xhrMock.send).toHaveBeenCalledTimes(1); + expect(fetchSpy).toHaveBeenCalled(); config.on = false; + fetchSpy.mockClear(); - logs.push({ foo: "bar2" }); + logs.push(stubLog({ type: "bar2" })); jest.advanceTimersByTime(config.transmitInterval); expect(logs.length).toEqual(1); - expect(xhrMock.send).toHaveBeenCalledTimes(1); + expect(fetchSpy).not.toHaveBeenCalled(); jest.useRealTimers(); done(); }); it("sends logs on page exit with fetch", () => { - const fetchSpy = jest.spyOn(global, "fetch"); - config.update({ on: true, url: "http://test.com" }); - sendOnClose([], config); - config.update({ on: true, url: "http://test.com" }); - sendOnClose([{ foo: "bar" }], config); + const sender = new Sender(); + sender.onClose([], config); + sender.onClose([stubLog()], config); global.window.dispatchEvent(new window.CustomEvent("pagehide")); expect(fetchSpy).toHaveBeenCalledTimes(1); - - fetchSpy.mockRestore(); }); it("does not send logs on page exit when config is off", () => { - const fetchSpy = jest.spyOn(global, "fetch"); - config.update({ on: false, url: "test" }); - sendOnClose([{ foo: "bar" }], config); + const sender = new Sender(); + sender.onClose([stubLog()], config); global.window.dispatchEvent(new window.CustomEvent("pagehide")); expect(fetchSpy).not.toHaveBeenCalled(); - - fetchSpy.mockRestore(); }); - it("sends logs with proper auth header when using registerAuthCallback", (done) => { + it("sends logs with Authorization header when using registerAuthCallback", (done) => { const logs: Array = []; config.update({ on: true, @@ -140,30 +151,25 @@ describe("sendLogs", () => { }); jest.useFakeTimers(); - const authCallback = jest.fn().mockReturnValue("fakeAuthToken"); + const authCallback = jest.fn().mockReturnValue("Bearer fakeAuthToken"); registerAuthCallback(authCallback); - initSender(logs, config); - logs.push({ foo: "bar" }); + const sender = new Sender(); + sender.start(logs, config); + logs.push(stubLog()); jest.advanceTimersByTime(config.transmitInterval); - expect(xhrMock.send).toHaveBeenCalledTimes(1); - - // Filter only calls to setRequestHeader with 'Authorization' - const calls = (xhrMock.setRequestHeader as jest.Mock).mock.calls; - const authHeaderCall = calls.find( - ([header]) => header.toLowerCase() === "authorization", - ); - - expect(authHeaderCall?.[0].toLowerCase()).toBe("authorization"); - expect(authHeaderCall?.[1]).toBe("fakeAuthToken"); + expect(fetchSpy).toHaveBeenCalled(); + const [, fetchOptions] = fetchSpy.mock.calls[0] as [string, RequestInit]; + const headers = new Headers(fetchOptions.headers as HeadersInit); + expect(headers.get("Authorization")).toBe("Bearer fakeAuthToken"); jest.useRealTimers(); done(); }); - it("sends logs with proper custom headers when using registerHeadersCallback", (done) => { + it("sends logs with custom headers when using registerHeadersCallback", (done) => { const logs: Array = []; config.update({ on: true, @@ -173,29 +179,24 @@ describe("sendLogs", () => { }); jest.useFakeTimers(); - // Mock the authCallback function const customHeaders = { "x-api-token": "someString", "x-abc-def": "someOtherString", }; const headersCallback = jest.fn().mockReturnValue(customHeaders); - - // Register the authCallback registerHeadersCallback(headersCallback); - // Initialize sender with logs and config - initSender(logs, config); - - // Simulate log entry - logs.push({ foo: "bar" }); + const sender = new Sender(); + sender.start(logs, config); + logs.push(stubLog()); - // Trigger interval to send logs jest.advanceTimersByTime(config.transmitInterval); - // Verify that the request has the proper auth header - expect(xhrMock.send).toHaveBeenCalledTimes(1); + expect(fetchSpy).toHaveBeenCalled(); + const [, fetchOptions] = fetchSpy.mock.calls[0] as [string, RequestInit]; + const headers = new Headers(fetchOptions.headers as HeadersInit); for (const [key, value] of Object.entries(customHeaders)) { - expect(xhrMock.setRequestHeader).toHaveBeenCalledWith(key, value); + expect(headers.get(key)).toBe(value); } jest.useRealTimers(); diff --git a/products/userale/packages/flagon-userale/test/spec/testUtils.ts b/products/userale/packages/core-sdk/test/spec/testUtils.ts similarity index 58% rename from products/userale/packages/flagon-userale/test/spec/testUtils.ts rename to products/userale/packages/core-sdk/test/spec/testUtils.ts index f6fc45b..5e90ec0 100644 --- a/products/userale/packages/flagon-userale/test/spec/testUtils.ts +++ b/products/userale/packages/core-sdk/test/spec/testUtils.ts @@ -14,9 +14,30 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { JSDOM } from "jsdom"; -// @ts-ignore -import Storage from "dom-storage"; +import fs from "fs"; +import path from "path"; +import { JSDOM, ResourceLoader } from "jsdom"; + +// Maps http://localhost/build/* → packages/core-sdk/build/* +// so JSDOM can load the IIFE bundle while still using an http origin +// (required for sessionStorage/localStorage to be available). +class LocalResourceLoader extends ResourceLoader { + fetch(url: string, options: Parameters[1]) { + const buildPrefix = "http://localhost/build/"; + if (url.startsWith(buildPrefix)) { + const filePath = path.join( + __dirname, + "../../build", + url.slice(buildPrefix.length), + ); + const buf = Buffer.from(fs.readFileSync(filePath)); + const p = Promise.resolve(buf) as ReturnType; + p!.abort = () => {}; + return p; + } + return super.fetch(url, options); + } +} export function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); @@ -25,15 +46,8 @@ export function sleep(ms: number) { export async function createEnvFromFile(fileName: string, extraConfig = {}) { const dom = await JSDOM.fromFile(__dirname + "/" + fileName, { runScripts: "dangerously", - resources: "usable", - beforeParse: (window) => { - Object.defineProperty(window, "localStorage", { - value: new Storage(null, { strict: true }), - }); - Object.defineProperty(window, "sessionStorage", { - value: new Storage(null, { strict: true }), - }); - }, + resources: new LocalResourceLoader(), + url: "http://localhost/", ...extraConfig, }); await sleep(100); // wait for external scripts to load diff --git a/products/userale/packages/flagon-userale/example/react-app-example/src/App.css b/products/userale/packages/core-sdk/test/spec/utils/ids.spec.ts similarity index 56% rename from products/userale/packages/flagon-userale/example/react-app-example/src/App.css rename to products/userale/packages/core-sdk/test/spec/utils/ids.spec.ts index 72c93f1..314b3af 100644 --- a/products/userale/packages/flagon-userale/example/react-app-example/src/App.css +++ b/products/userale/packages/core-sdk/test/spec/utils/ids.spec.ts @@ -1,4 +1,4 @@ -/* +/*! * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. @@ -15,41 +15,24 @@ * limitations under the License. */ -.App { - text-align: center; -} +import { generateTraceId, generateSpanId } from "@/utils/ids"; -.App-logo { - height: 40vmin; - pointer-events: none; -} +describe("generateTraceId", () => { + it("returns a 32-char lowercase hex string", () => { + expect(generateTraceId()).toMatch(/^[0-9a-f]{32}$/); + }); -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} + it("returns unique values on each call", () => { + expect(generateTraceId()).not.toBe(generateTraceId()); + }); +}); -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} +describe("generateSpanId", () => { + it("returns a 16-char lowercase hex string", () => { + expect(generateSpanId()).toMatch(/^[0-9a-f]{16}$/); + }); -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} + it("returns unique values on each call", () => { + expect(generateSpanId()).not.toBe(generateSpanId()); + }); +}); diff --git a/products/userale/packages/flagon-userale/tsconfig.json b/products/userale/packages/core-sdk/tsconfig.json similarity index 100% rename from products/userale/packages/flagon-userale/tsconfig.json rename to products/userale/packages/core-sdk/tsconfig.json diff --git a/products/userale/packages/flagon-userale/tsconfig.test.json b/products/userale/packages/core-sdk/tsconfig.test.json similarity index 100% rename from products/userale/packages/flagon-userale/tsconfig.test.json rename to products/userale/packages/core-sdk/tsconfig.test.json diff --git a/products/userale/packages/flagon-userale/tsup.config.js b/products/userale/packages/core-sdk/tsup.config.js similarity index 98% rename from products/userale/packages/flagon-userale/tsup.config.js rename to products/userale/packages/core-sdk/tsup.config.js index bd9e84e..3f6ecde 100644 --- a/products/userale/packages/flagon-userale/tsup.config.js +++ b/products/userale/packages/core-sdk/tsup.config.js @@ -24,7 +24,7 @@ export default defineConfig([ tsconfig: './tsconfig.json', entry: ['src/main.ts'], outDir: 'build', - format: ['esm', 'iife'], + format: ['esm'], name: 'userale', target: 'es2021', dts: false, diff --git a/products/userale/packages/flagon-userale-ext/.gitignore b/products/userale/packages/extension/.gitignore similarity index 100% rename from products/userale/packages/flagon-userale-ext/.gitignore rename to products/userale/packages/extension/.gitignore diff --git a/products/userale/packages/flagon-userale-ext/.prettierrc.mjs b/products/userale/packages/extension/.prettierrc.mjs similarity index 100% rename from products/userale/packages/flagon-userale-ext/.prettierrc.mjs rename to products/userale/packages/extension/.prettierrc.mjs diff --git a/products/userale/packages/extension/README.md b/products/userale/packages/extension/README.md new file mode 100644 index 0000000..e4556e8 --- /dev/null +++ b/products/userale/packages/extension/README.md @@ -0,0 +1,76 @@ + + +# Flagon UserALE Browser Extension + +A browser extension that instruments any website with [UserALE](../core-sdk/) behavioral telemetry — no code changes to the target page required. Captured events are forwarded as OTLP/HTTP JSON to a configurable collector endpoint. + +Built with [Plasmo](https://docs.plasmo.com/). Supports Chrome (MV3). + +## How it works + +1. The content script injects UserALE into every page matching the URL allowlist +2. Logs are intercepted via a `rerouteLog` callback and forwarded to the background service worker over a Plasmo port — no fetch calls are made from the page context +3. The background service worker applies the allowlist filter and forwards matching logs to the configured OTLP endpoint via `userale.log()` +4. Browser tab events (activate, create, update, close, etc.) are packaged as custom logs alongside DOM events + +## Development + +```sh +pnpm install +pnpm dev +``` + +Load the unpacked extension: +- **Chrome** — `chrome://extensions/` → Developer Mode → Load unpacked → `build/chrome-mv3-dev/` + +## Production build + +```sh +pnpm build +``` + +Outputs a production bundle under `build/chrome-mv3-prod/`. Run `pnpm package` to produce a zipped bundle ready for browser store submission. + +## Configuration + +Click the extension icon to open the options page: + +| Option | Description | Default | +|---|---|---| +| Logging endpoint | OTLP/HTTP collector URL | `http://localhost:4318` | +| URL allowlist | Regex of page URLs to instrument | `https://flagon.apache.org/` | +| OAuth credentials | Bearer token for authenticated endpoints | — | + +Changes take effect immediately without reloading the extension. + +## OTLP collector + +Start the shared Jaeger collector from the flagon project root: + +```sh +pnpm collector:up # OTLP on :4318, Jaeger UI on :16686 +pnpm collector:down +``` + +Logs appear at `http://localhost:16686`. The default logging endpoint in the extension options is already set to `http://localhost:4318`. + +## Resources + +- [UserALE core SDK](../core-sdk/) +- [Apache Flagon documentation](https://flagon.apache.org/userale/) diff --git a/products/userale/packages/flagon-userale-ext/assets/icon.png b/products/userale/packages/extension/assets/icon.png similarity index 100% rename from products/userale/packages/flagon-userale-ext/assets/icon.png rename to products/userale/packages/extension/assets/icon.png diff --git a/products/userale/packages/flagon-userale-ext/package.json b/products/userale/packages/extension/package.json similarity index 89% rename from products/userale/packages/flagon-userale-ext/package.json rename to products/userale/packages/extension/package.json index 996a623..709897e 100644 --- a/products/userale/packages/flagon-userale-ext/package.json +++ b/products/userale/packages/extension/package.json @@ -11,11 +11,11 @@ "package": "plasmo package" }, "dependencies": { - "@plasmohq/messaging": "^0.7.1", + "@plasmohq/messaging": "^0.7.2", "@types/webextension-polyfill": "^0.12.3", - "flagon-userale": "file:../flagon-userale/", + "flagon-userale": "workspace:*", "pkce-challenge": "^5.0.0", - "plasmo": "0.90.3", + "plasmo": "0.90.5", "react": "18.2.0", "react-dom": "18.2.0", "webextension-polyfill": "^0.12.0" diff --git a/products/userale/packages/flagon-userale-ext/postcss.config.js b/products/userale/packages/extension/postcss.config.js similarity index 100% rename from products/userale/packages/flagon-userale-ext/postcss.config.js rename to products/userale/packages/extension/postcss.config.js diff --git a/products/userale/packages/flagon-userale-ext/src/background/index.ts b/products/userale/packages/extension/src/background/index.ts similarity index 57% rename from products/userale/packages/flagon-userale-ext/src/background/index.ts rename to products/userale/packages/extension/src/background/index.ts index fd4a514..ace6fbe 100644 --- a/products/userale/packages/flagon-userale-ext/src/background/index.ts +++ b/products/userale/packages/extension/src/background/index.ts @@ -17,50 +17,75 @@ * under the License. */ +import { Configuration, UserALE } from "flagon-userale" + import { getStoredOptions } from "~/utils/storage" import { sendToContent } from "~utils/messaging" +import type { StoredOptions } from "~utils/storage" -import { setOptions } from "./messages/config_change" +export const userale = new UserALE(Configuration.getInstance()) -// Top level await is not supported so immediately execute this async function to set options from storage +let allowListRegExp: RegExp +export function setOptions(options: StoredOptions) { + userale.options({ url: options.loggingUrl }) + userale.start() + allowListRegExp = new RegExp(options.allowList) +} + +export function getAllowListRegExp() { + return allowListRegExp +} + +// Top level await is not supported so immediately execute this async function to set options from storage ;(async () => { const options = await getStoredOptions() setOptions(options) })() -// Takes a tabId and event data, gets the tab, and sends it -function sendTabEvent(tabId: number, data: Record, type: string) { - chrome.tabs.get(tabId, (tab) => { - if (!tab) return - sendTabEventFromTab(tab, data, type) - }) -} +// Tracks tabs where the content script has registered itself, mapped to their last known URL. +// Used to (a) filter tab events to only instrumented tabs and (b) emit onRemoved with the correct pageUrl. +const readyTabs = new Map() + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.type === "content-script-ready" && sender.tab?.id != null) { + readyTabs.set(sender.tab.id, sender.tab.url ?? "") + return false + } + + if (message.type === "config_change") { + setOptions(message.body) + sendResponse({}) + return false + } +}) -// Sends an event directly from a tab object +// Tab event handlers +// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs + +// Sends a tab event to the content script of the given tab. +// All tab events route through here so the readyTabs guard is applied in one place. function sendTabEventFromTab( tab: chrome.tabs.Tab, data: Record, type: string ) { - const payload = { - type, - tab, - data - } - - sendToContent(tab.id!, { type: "tab-event", payload }).catch((err) => + if (tab.id == null || !readyTabs.has(tab.id)) return + sendToContent(tab.id, { + type: "tab-event", + payload: { type, tab, data } + }).catch((err) => console.warn(`Failed to send ${type} to tab ${tab.id}:`, err.message) ) } -// Tab event handlers -// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs - -// TODO handle events that are sent when the tab isn't active. -// For example: -// onCreated events are sent before the content script listener is ready. -// onDeleted events are sent afeter the content script listener is shut down. +// Takes a tabId and event data, gets the full tab object, then delegates to sendTabEventFromTab. +function sendTabEvent(tabId: number, data: Record, type: string) { + chrome.tabs.get(tabId, (tab) => { + if (!tab) return + sendTabEventFromTab(tab, data, type) + }) +} chrome.tabs.onActivated.addListener((activeInfo) => sendTabEvent(activeInfo.tabId, activeInfo, "tabs.onActivated") @@ -82,28 +107,30 @@ chrome.tabs.onMoved.addListener((tabId, moveInfo) => sendTabEvent(tabId, moveInfo, "tabs.onMoved") ) -chrome.tabs.onRemoved.addListener((tabId, removeInfo) => - sendTabEvent(tabId, removeInfo, "tabs.onRemoved") -) +chrome.tabs.onRemoved.addListener((tabId) => { + readyTabs.delete(tabId) +}) -chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => +chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { + if (tab.url) readyTabs.set(tabId, tab.url) sendTabEventFromTab(tab, changeInfo, "tabs.onUpdated") -) +}) chrome.tabs.onZoomChange.addListener((zoomChangeInfo) => sendTabEvent(zoomChangeInfo.tabId, zoomChangeInfo, "tabs.onZoomChange") ) chrome.tabs.onHighlighted.addListener((highlightInfo) => { - // Note: No tabId is available, so send with windowId and tabIds const data = { ...highlightInfo } - // Loop over highlightInfo.tabIds and call sendTabEvent on each for (const tabId of highlightInfo.tabIds) { sendTabEvent(tabId, data, "tabs.onHighlighted") } }) chrome.tabs.onReplaced.addListener((addedTabId, removedTabId) => { - const data = { addedTabId, removedTabId } - sendTabEvent(addedTabId, data, "tabs.onReplaced") + // Transfer the URL from the removed tab to the added tab if it was instrumented + const pageUrl = readyTabs.get(removedTabId) + readyTabs.delete(removedTabId) + if (pageUrl != null) readyTabs.set(addedTabId, pageUrl) + sendTabEvent(addedTabId, { addedTabId, removedTabId }, "tabs.onReplaced") }) diff --git a/products/userale/packages/flagon-userale-ext/src/background/messages/config_change.ts b/products/userale/packages/extension/src/background/ports/log.ts similarity index 67% rename from products/userale/packages/flagon-userale-ext/src/background/messages/config_change.ts rename to products/userale/packages/extension/src/background/ports/log.ts index ec6b7c1..da25257 100644 --- a/products/userale/packages/flagon-userale-ext/src/background/messages/config_change.ts +++ b/products/userale/packages/extension/src/background/ports/log.ts @@ -17,25 +17,21 @@ * under the License. */ -import * as userale from "flagon-userale" +import { generateTraceId } from "flagon-userale" import type { PlasmoMessaging } from "@plasmohq/messaging" -import type { StoredOptions } from "~utils/storage" +import { getAllowListRegExp, userale } from "~/background/index" -let allowListRegExp: RegExp +const browserSessionId = generateTraceId() -const handler: PlasmoMessaging.MessageHandler = async (req, res) => { - setOptions(req.body) -} - -export function setOptions(options: StoredOptions) { - userale.options({ url: options.loggingUrl }) - allowListRegExp = new RegExp(options.allowList) -} - -export function getAllowListRegExp() { - return allowListRegExp +const handler: PlasmoMessaging.PortHandler = async (req, res) => { + const log = req.body + log.browserSessionId = browserSessionId + const allowListRegExp = getAllowListRegExp() + if (allowListRegExp.test(log.pageUrl)) { + userale.log(log) + } } export default handler diff --git a/products/userale/packages/flagon-userale-ext/src/content.ts b/products/userale/packages/extension/src/content.ts similarity index 68% rename from products/userale/packages/flagon-userale-ext/src/content.ts rename to products/userale/packages/extension/src/content.ts index e7a97b5..bd69324 100644 --- a/products/userale/packages/flagon-userale-ext/src/content.ts +++ b/products/userale/packages/extension/src/content.ts @@ -17,7 +17,7 @@ * under the License. */ -import * as userale from "flagon-userale" +import { Configuration, UserALE } from "flagon-userale" import type { PlasmoCSConfig } from "plasmo" import { getPort } from "@plasmohq/messaging/port" @@ -29,35 +29,36 @@ export const config: PlasmoCSConfig = { const logPort = getPort("log") +chrome.runtime.sendMessage({ type: "content-script-ready" }) + +// Capture events only — the rerouteLog callback forwards every log to the +// background service worker via the port, returning false so nothing is +// queued locally. The sender is never started, so no fetch calls are made +// from the page context (which would be blocked by CORS on HTTPS sites). +const userale = new UserALE(Configuration.getInstance()) userale.addCallbacks({ rerouteLog(log) { - console.log(log) logPort.postMessage({ body: log }) return false } }) +userale.capture() chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.type == "tab-event") { const { type, tab, data } = message.payload - userale.packageCustomLog( - { type }, - () => { - return data - }, - true - ) + userale.packageCustomLog({ type }, () => data, true) sendResponse({ status: "received" }) - } else if (message.type === "issue-report") { + return false + } + + if (message.type === "issue-report") { userale.packageCustomLog( { type: message.type }, - () => { - return message.payload - }, + () => message.payload, true ) sendResponse({ status: "received" }) + return false } - - return true }) diff --git a/products/userale/packages/flagon-userale-ext/src/options/auth.tsx b/products/userale/packages/extension/src/options/auth.tsx similarity index 100% rename from products/userale/packages/flagon-userale-ext/src/options/auth.tsx rename to products/userale/packages/extension/src/options/auth.tsx diff --git a/products/userale/packages/flagon-userale-ext/src/options/index.tsx b/products/userale/packages/extension/src/options/index.tsx similarity index 100% rename from products/userale/packages/flagon-userale-ext/src/options/index.tsx rename to products/userale/packages/extension/src/options/index.tsx diff --git a/products/userale/packages/flagon-userale-ext/src/options/logging.tsx b/products/userale/packages/extension/src/options/logging.tsx similarity index 100% rename from products/userale/packages/flagon-userale-ext/src/options/logging.tsx rename to products/userale/packages/extension/src/options/logging.tsx diff --git a/products/userale/packages/flagon-userale-ext/src/popup.tsx b/products/userale/packages/extension/src/popup.tsx similarity index 100% rename from products/userale/packages/flagon-userale-ext/src/popup.tsx rename to products/userale/packages/extension/src/popup.tsx diff --git a/products/userale/packages/flagon-userale-ext/src/style.css b/products/userale/packages/extension/src/style.css similarity index 100% rename from products/userale/packages/flagon-userale-ext/src/style.css rename to products/userale/packages/extension/src/style.css diff --git a/products/userale/packages/flagon-userale-ext/src/utils/messaging.ts b/products/userale/packages/extension/src/utils/messaging.ts similarity index 100% rename from products/userale/packages/flagon-userale-ext/src/utils/messaging.ts rename to products/userale/packages/extension/src/utils/messaging.ts diff --git a/products/userale/packages/flagon-userale-ext/src/utils/storage.ts b/products/userale/packages/extension/src/utils/storage.ts similarity index 92% rename from products/userale/packages/flagon-userale-ext/src/utils/storage.ts rename to products/userale/packages/extension/src/utils/storage.ts index a8be357..fcb82f9 100644 --- a/products/userale/packages/flagon-userale-ext/src/utils/storage.ts +++ b/products/userale/packages/extension/src/utils/storage.ts @@ -19,8 +19,6 @@ import browser from "webextension-polyfill" -import { sendToBackground } from "@plasmohq/messaging" - export const STORAGE_KEYS = { accessToken: "accessToken", allowList: "allowList", @@ -38,7 +36,7 @@ export type StoredOptions = { const DEFAULT_OPTIONS: StoredOptions = { accessToken: "", allowList: "https://flagon.apache.org/", - loggingUrl: "http://localhost:8000" + loggingUrl: "http://localhost:4318" } export async function getStoredOptions(): Promise { @@ -67,8 +65,8 @@ export async function setStoredOptions(values: Partial) { await browser.storage.local.set(values) // Notify the background script of the change - return await sendToBackground({ - name: "config_change", + return await chrome.runtime.sendMessage({ + type: "config_change", body: values }) } diff --git a/products/userale/packages/flagon-userale-ext/tailwind.config.js b/products/userale/packages/extension/tailwind.config.js similarity index 100% rename from products/userale/packages/flagon-userale-ext/tailwind.config.js rename to products/userale/packages/extension/tailwind.config.js diff --git a/products/userale/packages/flagon-userale-ext/tsconfig.json b/products/userale/packages/extension/tsconfig.json similarity index 100% rename from products/userale/packages/flagon-userale-ext/tsconfig.json rename to products/userale/packages/extension/tsconfig.json diff --git a/products/userale/packages/flagon-userale-ext/README.md b/products/userale/packages/flagon-userale-ext/README.md deleted file mode 100644 index 9729cfd..0000000 --- a/products/userale/packages/flagon-userale-ext/README.md +++ /dev/null @@ -1,80 +0,0 @@ - - -# Flagon UserALE Browser Extension - -This package provides a browser extension for [Flagon UserALE](https://flagon.apache.org/userale/), enabling effortless, no-code instrumentation of websites. It captures user interactions and sends behavioral logs to a logging endpoint. - -The extension is built with [Plasmo](https://docs.plasmo.com/) and supports modern browser environments like Chrome and Firefox. - ---- - -## Features - -✅ Passive user interaction logging -✅ No code changes required on instrumented pages -✅ Configurable via extension options (logging endpoint, user ID, tool metadata) -✅ Supports local development and custom deployments - ---- - -## Getting Started (Development) - -1. Install dependencies: - -```bash -pnpm install -``` - -2. Start the development build: - -```bash -pnpm dev -``` - -3. Load the extension in your browser: - - **Chrome**: Visit `chrome://extensions/`, enable Developer Mode, click "Load unpacked", and select the `build/chrome-mv3-dev/` directory. - - **Firefox**: Visit `about:debugging`, "This Firefox", "Load Temporary Add-on", and select the `manifest.json` file in `build/firefox-mv3-dev/`. - ---- - -## Building for Production - -To create a production build: - -```bash -pnpm build -``` - -This outputs a zipped production bundle. - ---- - -## Extension Options - -After installing the extension, click the icon in your browser toolbar to open the **Options** page. From here you can configure: -- **Logging Endpoint** – Where logs will be sent -- **URL allowlist** – A regex of URL's to allow logging on -- **OAuth Credentials** – Details of an OAuth login to authenticate with the logging endpoint. - ---- - -## Resources - -- 📚 [UserALE Documentation](https://flagon.apache.org/userale/) - diff --git a/products/userale/packages/flagon-userale-ext/src/background/ports/log.ts b/products/userale/packages/flagon-userale-ext/src/background/ports/log.ts deleted file mode 100644 index a5aea48..0000000 --- a/products/userale/packages/flagon-userale-ext/src/background/ports/log.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import * as userale from "flagon-userale" - -import type { PlasmoMessaging } from "@plasmohq/messaging" - -import { getAllowListRegExp } from "~/background/messages/config_change" - -const handler: PlasmoMessaging.PortHandler = async (req, res) => { - const log = req.body - log.browserSessionId = browserSessionId - const allowListRegExp = getAllowListRegExp() - if (allowListRegExp.test(log.pageUrl)) { - console.log(log) - userale.log(log) - } -} - -const browserSessionId = generateSessionId() - -// TODO move this to a shared utils workspace (this is from packages/flagon-userale/src/, but shouldn't be publicly exported) -function generateSessionId(): string { - // 32 digit hex -> 128 bits of info -> 2^64 ~= 10^19 sessions needed for 50% chance of collison - const len = 32 - const arr = new Uint8Array(len / 2) - self.crypto.getRandomValues(arr) - return Array.from(arr, (dec) => { - return dec.toString(16).padStart(2, "0") - }).join("") -} - -export default handler diff --git a/products/userale/packages/flagon-userale/README.md b/products/userale/packages/flagon-userale/README.md deleted file mode 100644 index 845b7bf..0000000 --- a/products/userale/packages/flagon-userale/README.md +++ /dev/null @@ -1,354 +0,0 @@ - - -# Apache Flagon UserALE - -![Node.js CI](https://github.com/apache/flagon/workflows/userale_ci%20CI/badge.svg) -[![Known Vulnerabilities](https://snyk.io/test/npm/flagon-userale/badge.svg)](https://snyk.io/test/npm/flagon-userale) -![Maintenance](https://img.shields.io/maintenance/yes/2025) -![npm](https://img.shields.io/npm/v/flagon-userale) -[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) -![Node.js](https://img.shields.io/badge/Node.js%20Support-16.x%2C%2018.x-orange) - -Apache UserALE is part of the [Apache Flagon Project](http://flagon.apache.org/). It is a client side instrumentation library written in JavaScript designed for easy deployment and lightweight configuration in gathering logs from your web applications for user behavioral analytics. - -Once included in your project, Apache UserALE provides a comprehensive behavioral logging capability, capturing every event on every element rendered in your DOM. - -Additional documentation and a demonstration can be found at the [Apache Flagon website](http://flagon.apache.org/userale/). - -### Quickstart Guide - -1. Include UserALE in your project as either a [module or script tag](#installation) -1. Set up a logging end-point. Try our [example server utility](https://github.com/apache/flagon/tree/master/example#capturing-logs-using-the-logging-server) or try out our [Elasticsearch (ELK) stack example](https://github.com/apache/flagon/tree/master/docker). -1. Configure [UserALE settings](#configure) using our API, including where to POST logs to (port:8000 for UserALE example or port:8100 of ELK/Logstash) -1. Further explore the [UserALE API](#usage) to customize your log feed, add filters, custom logs, and modify logs themselves. Explore a few [examples](#examples) here and a wider set in our [example utility](https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.js). -1. Visualize and analyze your logs. See our sample [kibana dahsboards](https://github.com/apache/flagon/tree/master/examples/elk/docker) for behavioral analytics. - -## Table of Contents -[What's New](#whats-new-in-version-210) -[Installation](#installation) -[Configure](#configure) -[Usage](#usage) -[Examples](#examples) -[Indexing, Storing, and Visualizing Logs](#indexing-storing-and-visualizing-logs) -[Modifying Source](#modifying-source) -[Contributing](#contributing) -[License](#license) - -## What's New in Version 2.4.0? - -- Refactors Map and Filter APIs as generalized callbacks for functionality -- Adds additional UserALE API examples utilizing generalized callbacks -- Minor updates to update deprecated downstream dev dependencies -- Minor changes to documentation, updated examples - -See our [CHANGELOG](https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale/CHANGELOG.md) for a complete list of changes. - -## Installation - -Either through cloning our [source repo](https://github.com/apache/flagon) or by using npm: - -```html -npm install flagon-userale - -or - -npm install flagon-userale --engine-strict (enforces supported Node.js versions) - -``` - -To include UserALE as an object in your project, include as a `module`: - -```html -import * as userale from 'flagon-userale'; - -or - -const userale = require('flagon-userale'); -``` -Our [webpack example](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example/webpackUserAleExample) illustrates this use-case. - -You can also include UserALE as a `script-tag`. A pre-built version of the userale script is included in our package and -repositories: - -```html - -``` -Our [script tag example](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example) illustrates this use-case - -If you include UserALE as a `script-tag`, consider installing via npm as a development dependency: - -```html -npm install --save-dev flagon-userale -``` - -Or if you want to use a CDN, then you can use something like - -```html - -``` - -We also support a [WebExtension](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale-ext) that can be added to your browser in developer mode. Follow the link for instructions. - -Once UserALE is installed in your project, your application will start generating logs automatically. - -## Configure - -Some configuration is necessary. At minimum you will need to provide UserALE an end-point to ship logs to; default behavior is to ship logs to `localhost:8000`. - -**NOTE**: In order to facilitate testing configuration and usage of UserALE, we have included an [example logging server](https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale/example#capturing-logs-using-the-logging-server) in our -[example directory](https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale/example). This is a very helpful utility -that works with both included [module examples](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example/webpackUserAleExample) -and [script-tag examples](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example). We strongly recommend experimenting with it. - -Configuration details follow: - -If you have included UserALE in your project as a `module`, you will need to use our `userale.options()` function, which exposes library configuration options through our API. - -For example, if you do *not* want UserALE to start logging automatically, you can modify this behavior through the `userale.options()` API (`autostart` config). - -Then, you can use the `userale.start()` API export to begin logging at the appropriate time during page load or triggered from an event: - -```html -const changeMe = "me"; -userale.options({ - "userId": changeMe, - "autostart": false, - "url": "http://localhost:8000/", - "version": "next", - "logDetails": false, - "sessionId": "this one" -}); - -userale.start(); - -``` - -Additional examples of `userale.options()` can be found in our [example directory](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example). - -The complete list of configurable parameters that can be configured via `userale.options()` is: - -| Param | Description | Default | -|---|---|---| -| url | Logging URL | http://localhost:8000 | -| autostart | Should UserALE start on page load | true | -| transmitInterval | Delay between transmit checks | 5000 (ms) | -| logCountThreshold | Minimum number of logs to send | 5 | -| userId | User identifier | null | -| sessionId | Session identifier | null | -| version | Application version identifier | null | -| logDetails | Toggle detailed logs (keys pressed and input/change values) | false | -| resolution | Delay between instances of high frequency logs (mouseover, scroll, etc.) | 500 (ms) | -| userFromParams | Query param in the page URL to fetch userId from | null | -| toolName | Name of tool being logged | null | -| authHeader | Authorization header to be passed to logging endpoint | null | - -If you have included UserALE as a `script-tag` in your project, you can use HTML data parameters to pass configuration options to the library through the script tag. For example: - -```html - -``` - -You have access to the same parameters listed above, however, naming conventions vary slightly for use in HTML: - -| Param | Description | Default | -|---|---|---| -| data-url | Logging URL | http://localhost:8000 | -| data-autostart | Should UserALE start on page load | true | -| data-interval | Delay between transmit checks | 5000 (ms) | -| data-threshold | Minimum number of logs to send | 5 | -| data-user | User identifier | null | -| data-version | Application version identifier | null | -| data-log-details | Toggle detailed logs (keys pressed and input/change values) | false | -| data-resolution | Delay between instances of high frequency logs (mouseover, scroll, etc.) | 500 (ms) | -| data-user-from-params | Query param in the page URL to fetch userId from | null | -| data-tool | Name of tool being logged | null | -| data-auth | Authorization header to be passed to logging endpoint | null | - -If you are using our [WebExtension](https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale-ext/), -you can modify some of these parameters via the extensions' `options` page. - -## Usage - -Including UserALE in your project as a `module` attaches the UserALE script as an object to the page. - -We have exposed a number of functions that assist you in modifying, filtering, and customizing logs - -A complete list of available functions are as follows: - -| Function | Description | Notes | -|---|---|---| -| userale.options | modify userale's configuration option | see top level README for complete list of options | -| [DEPRECATED] userale.filter | filters out logs from logging queue by keys or values | filters are callbacks with global scope | -| [DEPRECATED] userale.map | modify/add log keys or values | mappings are callbacks with global scope | -| userale.addCallbacks | add one or more callbacks to be executed during log packaging | callbacks have global scope | -| userale.removeCallbacks | remove one or more callbacks by name | Removes callbacks added from userale.addCallbacks | -| userale.log | appends a custom log to the log queue | the custom log object is an object key:value pairs | -| userale.packageLog | transforms the provided event into a log and appends it to the log queue | designed for HTML events | -| userale.packageCustomLog | packages the provided customLog to include standard meta data and appends it to the log queue | designed for non HTML events| -| userale.details | defines the way information is extracted from various events | supports packageLog/packageCustomLog 'details' | -| userale.getSelector | builds a string CSS selector from the provided HTML element id | populates 'target' field in packaged logs | -| userale.buildPath| builds an array of elements from the provided event target, to the root element (DOM path) | populates the 'path' field in packaged logs | -| userale.start | used to start the logging process if | unecessary if 'autostart' is set to true in initial setting (default) | -| userale.stop | halts the logging process. Logs will no longer be sent | will need to invoke userale.start to restart logging | - -Including UserALE as a `script-tag` provides you access to the same functions listed above. However, UserALE essentially -becomes a property of the DOM. As such, you'll need to call functions as a window property: - -```html -userale.options = window.userale.options -``` - -## Examples - -We provide a number of examples to illustrate how the functions above -can be used with sample webpages and logging servers. These are tailored for [module examples](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example/webpackUserAleExample) -and [script-tag examples](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example). -Select examples are below: - -Filter your logs with `userale.filter`: - -```html -userale.filter(function (log) { - var type_array = ['mouseup', 'mouseover', 'mousedown', 'keydown', 'dblclick', 'blur', 'focus', 'input', 'wheel']; - var logType_array = ['interval']; - return !type_array.includes(log.type) && !logType_array.includes(log.logType); -}); -``` - -Modify (add/remove) log fields with surgical precision using `userale.map`: - -```html -userale.map(function (log) { - var targetsForLabels = ["button#test_button"]; - if (targetsForLabels.includes(log.target)) { - return Object.assign({}, log, { CustomLabel: "Click me!" }); - } else { - return log; - } - }); -``` - -(Additional examples illustrate [precision custom labeling](https://github.com/apache/flagon/tree/master/products/userale/packages/flagon-userale/example/log-label-example), using a variety of functions.) - -Generate custom logs with `userale.log`: - -```html -document.addEventListener('change', function(e) { - if (e.target.value === 'log') { - userale.log({ - target: userale.getSelector(e.target), - path: userale.buildPath(e), - type: e.type, - logType: 'custom', - userAction: false, - details: 'I can make this log look like anything I want', - customField1: 'foo', - customField2: 'bar', - userId: userale.options().userId, - toolVersion: userale.options().version, - toolName: userale.options().toolName, - useraleVersion: userale.options().useraleVersion, - sessionId: userale.options().sessionId, - customLabel: "(custom) Log Example" - }); - } -}); -``` - -User our own log packaging pipeline to streamline custom HTML event logging with `userale.packageLog`: - -```html -document.addEventListener('change', function(e){ - if (e.target.value === 'packageLog') { - /**You can then use the 'Mapping' API function to modify custom logs created with the packageLog function*/ - userale.map(function (log) { - var targetsForLabels = ['change']; - if (targetsForLabels.includes(log.type)) { - return Object.assign({}, log, { logType: 'custom', customLabel: 'packageLog Example' }); - } else { - return log; - } - }); - /**You can also use the details function to package additional log meta data, or add custom details*/ - userale.packageLog(e, userale.details(userale.options(),'change')); - } else { - return false - } -}); -``` - -Again, see [Usage](#usage) for differences in invoking these functions with `module` and `script-tag` includes. - -You can find additional examples on our [website](http://flagon.apache.org/docs/useralejs/API/). - -## Indexing, Storing and Visualizing Logs - -We recommend Elastic products, specifically an [ELK cluster](https://www.elastic.co/what-is/elk-stack), for indexing and storing logs in productions. - -You can find a 'sand-box' ELK build, configuration files, and visualization/dashboards tailored for UserALE in the [examples](https://github.com/apache/flagon/tree/master/examples). - -## Modifying Source - -You may wish to modify UserALE to suite your needs. After making modification to [UserALE src](https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale/src), -you will need to rebuild the UserALE script (and run tests). - -To (re)build UserALE: - -``` -npm run build -``` - -To run UserALE unit tests: -``` -npm run test -``` - -We use gulp-mocha for unit tests. The results will print to your terminal: -``` -... - attachHandlers - ✓ attaches all the event handlers without duplicates - ✓ debounces bufferedEvents (505ms) - defineDetails - - configures high detail events correctly -... - - 45 passing (954ms) - 1 pending -``` -Any failing tests will also be logged in the terminal. If there are failing tests, please consider [submitting an issue report](https://github.com/apache/flagon/issues). - -For more guidance on modifying Flagon UserALE src code, check out [the guide on our website](http://flagon.apache.org/docs/useralejs/modifying/). - -## Contributing - -Contributions are welcome! Simply [submit an issue](https://github.com/apache/flagon/issues). Pull requests are welcome. The core team will review it and work with you to incorporate it into UserALE. If you want to become a contributor to the project, see our [contribution guide](http://flagon.apache.org/docs/contributing/). - -Join the conversation: tell us your needs, wishes, and interests by joining our [mailing list](dev-subscribe@flagon.apache.org)! - -## License - -Apache Flagon UserALE is provided under Apache License version 2.0. See [LICENSE](https://github.com/apache/flagon/blob/master/LICENSE) and [NOTICE](https://github.com/apache/flagon/blob/master/NOTICE) files at MASTER for more details. diff --git a/products/userale/packages/flagon-userale/build/main.d.ts b/products/userale/packages/flagon-userale/build/main.d.ts deleted file mode 100644 index 3052f9b..0000000 --- a/products/userale/packages/flagon-userale/build/main.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import type { Settings, Logging } from "@/types"; -export declare let started: boolean; -export { defineCustomDetails as details } from "@/attachHandlers"; -export { registerAuthCallback as registerAuthCallback } from "@/utils"; -export { addCallbacks as addCallbacks, removeCallbacks as removeCallbacks, packageLog as packageLog, packageCustomLog as packageCustomLog, getSelector as getSelector, buildPath as buildPath, } from "@/packageLogs"; -export type { Logging } from "@/types"; -export declare const version: string; -/** - * Used to start the logging process if the - * autostart configuration option is set to false. - */ -export declare function start(): void; -/** - * Halts the logging process. Logs will no longer be sent. - */ -export declare function stop(): void; -/** - * Updates the current configuration - * object with the provided values. - * @param {Partial} newConfig The configuration options to use. - * @return {Settings.Config} Returns the updated configuration. - */ -export declare function options(newConfig: Partial | undefined): Settings.Config; -/** - * Appends a log to the log queue. - * @param {Logging.CustomLog} customLog The log to append. - * @return {boolean} Whether the operation succeeded. - */ -export declare function log(customLog: Logging.CustomLog | undefined): boolean; -//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/main.global.js b/products/userale/packages/flagon-userale/build/main.global.js deleted file mode 100644 index 043d727..0000000 --- a/products/userale/packages/flagon-userale/build/main.global.js +++ /dev/null @@ -1,937 +0,0 @@ -"use strict"; -/* Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to you under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.*/ -(() => { - // src/packageLogs.ts - var logs; - var config; - var intervalId; - var intervalType; - var intervalPath; - var intervalTimer; - var intervalCounter; - var intervalLog; - var filterHandler = null; - var mapHandler = null; - var cbHandlers = {}; - function addCallbacks(...newCallbacks) { - newCallbacks.forEach((source) => { - let descriptors = {}; - descriptors = Object.keys(source).reduce((descriptors2, key) => { - descriptors2[key] = Object.getOwnPropertyDescriptor(source, key); - return descriptors2; - }, descriptors); - Object.getOwnPropertySymbols(source).forEach((sym) => { - const descriptor = Object.getOwnPropertyDescriptor(source, sym); - if (descriptor?.enumerable) { - descriptors[sym] = descriptor; - } - }); - Object.defineProperties(cbHandlers, descriptors); - }); - return cbHandlers; - } - function removeCallbacks(targetKeys) { - targetKeys.forEach((key) => { - if (Object.prototype.hasOwnProperty.call(cbHandlers, key)) { - delete cbHandlers[key]; - } - }); - } - function initPackager(newLogs, newConfig) { - logs = newLogs; - config = newConfig; - cbHandlers = {}; - intervalId = null; - intervalType = null; - intervalPath = null; - intervalTimer = null; - intervalCounter = 0; - intervalLog = null; - } - function packageLog(e, detailFcn) { - if (!config.on) { - return false; - } - let details = null; - if (detailFcn) { - details = detailFcn(e); - } - const timeFields = extractTimeFields( - e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now() - ); - let log2 = { - target: e.target ? getSelector(e.target) : null, - path: buildPath(e), - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - clientTime: timeFields.milli, - microTime: timeFields.micro, - location: getLocation(e), - scrnRes: getScreenRes(), - type: e.type, - logType: "raw", - userAction: true, - details, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId, - attributes: buildAttrs(e), - style: buildCSS(e) - }; - if (typeof filterHandler === "function" && !filterHandler(log2)) { - return false; - } - if (typeof mapHandler === "function") { - log2 = mapHandler(log2, e); - } - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - log2 = func(log2, e); - if (!log2) { - return false; - } - } - } - logs.push(log2); - return true; - } - function packageCustomLog(customLog, detailFcn, userAction) { - if (!config.on) { - return false; - } - let details = null; - if (detailFcn.length === 0) { - const staticDetailFcn = detailFcn; - details = staticDetailFcn(); - } - const metaData = { - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - clientTime: Date.now(), - scrnRes: getScreenRes(), - logType: "custom", - userAction, - details, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId - }; - let log2 = Object.assign(metaData, customLog); - if (typeof filterHandler === "function" && !filterHandler(log2)) { - return false; - } - if (typeof mapHandler === "function") { - log2 = mapHandler(log2); - } - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - log2 = func(log2, null); - if (!log2) { - return false; - } - } - } - logs.push(log2); - return true; - } - function extractTimeFields(timeStamp) { - return { - milli: Math.floor(timeStamp), - micro: Number((timeStamp % 1).toFixed(3)) - }; - } - function packageIntervalLog(e) { - try { - const target = e.target ? getSelector(e.target) : null; - const path = buildPath(e); - const type = e.type; - const timestamp = Math.floor( - e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now() - ); - if (intervalId == null) { - intervalId = target; - intervalType = type; - intervalPath = path; - intervalTimer = timestamp; - intervalCounter = 0; - } - if ((intervalId !== target || intervalType !== type) && intervalTimer) { - intervalLog = { - target: intervalId, - path: intervalPath, - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - count: intervalCounter, - duration: timestamp - intervalTimer, - startTime: intervalTimer, - endTime: timestamp, - type: intervalType, - logType: "interval", - targetChange: intervalId !== target, - typeChange: intervalType !== type, - userAction: false, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId - }; - if (typeof filterHandler === "function" && !filterHandler(intervalLog)) { - return false; - } - if (typeof mapHandler === "function") { - intervalLog = mapHandler(intervalLog, e); - } - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - intervalLog = func(intervalLog, null); - if (!intervalLog) { - return false; - } - } - } - if (intervalLog) - logs.push(intervalLog); - intervalId = target; - intervalType = type; - intervalPath = path; - intervalTimer = timestamp; - intervalCounter = 0; - } - if (intervalId == target && intervalType == type && intervalCounter) { - intervalCounter = intervalCounter + 1; - } - return true; - } catch { - return false; - } - } - function getLocation(e) { - if (e instanceof MouseEvent) { - if (e.pageX != null) { - return { x: e.pageX, y: e.pageY }; - } else if (e.clientX != null) { - return { - x: document.documentElement.scrollLeft + e.clientX, - y: document.documentElement.scrollTop + e.clientY - }; - } - } else { - return { x: null, y: null }; - } - } - function getScreenRes() { - return { width: self.innerWidth, height: self.innerHeight }; - } - function getSelector(ele) { - if (ele instanceof HTMLElement || ele instanceof Element) { - if (ele.localName) { - return ele.localName + (ele.id ? "#" + ele.id : "") + (ele.className ? "." + ele.className : ""); - } else if (ele.nodeName) { - return ele.nodeName + (ele.id ? "#" + ele.id : "") + (ele.className ? "." + ele.className : ""); - } - } else if (ele instanceof Document) { - return "#document"; - } else if (ele === globalThis) { - return "Window"; - } - return "Unknown"; - } - function buildPath(e) { - const path = e.composedPath(); - return selectorizePath(path); - } - function selectorizePath(path) { - let i = 0; - let pathEle; - const pathSelectors = []; - while (pathEle = path[i]) { - pathSelectors.push(getSelector(pathEle)); - ++i; - pathEle = path[i]; - } - return pathSelectors; - } - function buildAttrs(e) { - const attributes = {}; - const attributeBlackList = ["style"]; - if (e.target && e.target instanceof Element) { - for (const attr of e.target.attributes) { - if (attributeBlackList.includes(attr.name)) - continue; - let val = attr.value; - try { - val = JSON.parse(val); - } catch { - } - attributes[attr.name] = val; - } - } - return attributes; - } - function buildCSS(e) { - const properties = {}; - if (e.target && e.target instanceof HTMLElement) { - const styleObj = e.target.style; - for (let i = 0; i < styleObj.length; i++) { - const prop = styleObj[i]; - properties[prop] = styleObj.getPropertyValue(prop); - } - } - return properties; - } - - // src/attachHandlers.ts - var events; - var bufferBools; - var bufferedEvents; - var refreshEvents; - var intervalEvents = [ - "click", - "focus", - "blur", - "input", - "change", - "mouseover", - "submit" - ]; - var windowEvents = ["load", "blur", "focus"]; - function extractMouseDetails(e) { - return { - clicks: e.detail, - ctrl: e.ctrlKey, - alt: e.altKey, - shift: e.shiftKey, - meta: e.metaKey - }; - } - function extractKeyboardDetails(e) { - return { - key: e.key, - code: e.code, - ctrl: e.ctrlKey, - alt: e.altKey, - shift: e.shiftKey, - meta: e.metaKey - }; - } - function extractChangeDetails(e) { - return { - value: e.target.value - }; - } - function extractWheelDetails(e) { - return { - x: e.deltaX, - y: e.deltaY, - z: e.deltaZ - }; - } - function extractScrollDetails() { - return { - x: window.scrollX, - y: window.scrollY - }; - } - function extractResizeDetails() { - return { - width: window.outerWidth, - height: window.outerHeight - }; - } - function defineDetails(config3) { - events = { - click: extractMouseDetails, - dblclick: extractMouseDetails, - mousedown: extractMouseDetails, - mouseup: extractMouseDetails, - focus: null, - blur: null, - input: config3.logDetails ? extractKeyboardDetails : null, - change: config3.logDetails ? extractChangeDetails : null, - dragstart: null, - dragend: null, - drag: null, - drop: null, - keydown: config3.logDetails ? extractKeyboardDetails : null, - mouseover: null - }; - bufferBools = {}; - bufferedEvents = { - wheel: extractWheelDetails, - scroll: extractScrollDetails, - resize: extractResizeDetails - }; - refreshEvents = { - submit: null - }; - } - function defineCustomDetails(options2, type) { - const eventType = { - click: extractMouseDetails, - dblclick: extractMouseDetails, - mousedown: extractMouseDetails, - mouseup: extractMouseDetails, - focus: null, - blur: null, - load: null, - input: options2.logDetails ? extractKeyboardDetails : null, - change: options2.logDetails ? extractChangeDetails : null, - dragstart: null, - dragend: null, - drag: null, - drop: null, - keydown: options2.logDetails ? extractKeyboardDetails : null, - mouseover: null, - wheel: extractWheelDetails, - scroll: extractScrollDetails, - resize: extractResizeDetails, - submit: null - }; - return eventType[type]; - } - function attachHandlers(config3) { - try { - defineDetails(config3); - Object.keys(events).forEach(function(ev) { - document.addEventListener( - ev, - function(e) { - packageLog(e, events[ev]); - }, - true - ); - }); - intervalEvents.forEach(function(ev) { - document.addEventListener( - ev, - function(e) { - packageIntervalLog(e); - }, - true - ); - }); - Object.keys(bufferedEvents).forEach( - function(ev) { - bufferBools[ev] = true; - self.addEventListener( - ev, - function(e) { - if (bufferBools[ev]) { - bufferBools[ev] = false; - packageLog(e, bufferedEvents[ev]); - setTimeout(function() { - bufferBools[ev] = true; - }, config3.resolution); - } - }, - true - ); - } - ); - Object.keys(refreshEvents).forEach( - function(ev) { - document.addEventListener( - ev, - function(e) { - packageLog(e, events[ev]); - }, - true - ); - } - ); - windowEvents.forEach(function(ev) { - self.addEventListener( - ev, - function(e) { - packageLog(e, function() { - return { window: true }; - }); - }, - true - ); - }); - return true; - } catch { - return false; - } - } - - // src/utils/auth/index.ts - var authCallback = null; - function updateAuthHeader(config3) { - if (authCallback) { - try { - config3.authHeader = authCallback(); - } catch (e) { - console.error(`Error encountered while setting the auth header: ${e}`); - } - } - } - function registerAuthCallback(callback) { - try { - verifyCallback(callback); - authCallback = callback; - return true; - } catch { - return false; - } - } - function verifyCallback(callback) { - if (typeof callback !== "function") { - throw new Error("Userale auth callback must be a function"); - } - const result = callback(); - if (typeof result !== "string") { - throw new Error("Userale auth callback must return a string"); - } - } - - // src/utils/headers/index.ts - var headersCallback = null; - function updateCustomHeaders(config3) { - if (headersCallback) { - try { - config3.headers = headersCallback(); - } catch (e) { - console.error(`Error encountered while setting the headers: ${e}`); - } - } - } - - // package.json - var version = "2.4.0"; - - // src/getInitialSettings.ts - var sessionId = null; - var httpSessionId = null; - function getInitialSettings() { - if (typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope) { - const settings2 = { - authHeader: null, - autostart: true, - browserSessionId: null, - custIndex: null, - headers: null, - httpSessionId: null, - logCountThreshold: 5, - logDetails: false, - resolution: 500, - sessionId, - time: (ts) => ts !== void 0 ? ts : Date.now(), - toolName: null, - toolVersion: null, - transmitInterval: 5e3, - url: "http://localhost:8000", - useraleVersion: null, - userFromParams: null, - userId: null - }; - return settings2; - } - if (sessionId === null) { - sessionId = getsessionId( - "userAlesessionId", - "session_" + String(Date.now()) - ); - } - if (httpSessionId === null) { - httpSessionId = getsessionId( - "userAleHttpSessionId", - generatehttpSessionId() - ); - } - const script = document.currentScript || function() { - const scripts = document.getElementsByTagName("script"); - return scripts[scripts.length - 1]; - }(); - const get = script ? script.getAttribute.bind(script) : function() { - return null; - }; - const headers = get("data-headers"); - const settings = { - authHeader: get("data-auth") || null, - autostart: get("data-autostart") === "false" ? false : true, - browserSessionId: null, - custIndex: get("data-index") || null, - headers: headers ? JSON.parse(headers) : null, - httpSessionId, - logCountThreshold: +(get("data-threshold") || 5), - logDetails: get("data-log-details") === "true" ? true : false, - resolution: +(get("data-resolution") || 500), - sessionId: get("data-session") || sessionId, - time: timeStampScale(document.createEvent("CustomEvent")), - toolName: get("data-tool") || null, - toolVersion: get("data-version") || null, - transmitInterval: +(get("data-interval") || 5e3), - url: get("data-url") || "http://localhost:8000", - useraleVersion: get("data-userale-version") || null, - userFromParams: get("data-user-from-params") || null, - userId: get("data-user") || null - }; - return settings; - } - function getsessionId(sessionKey, value) { - if (self.sessionStorage.getItem(sessionKey) === null) { - self.sessionStorage.setItem(sessionKey, JSON.stringify(value)); - return value; - } - return JSON.parse(self.sessionStorage.getItem(sessionKey) || ""); - } - function timeStampScale(e) { - let tsScaler; - if (e.timeStamp && e.timeStamp > 0) { - const delta = Date.now() - e.timeStamp; - if (delta < 0) { - tsScaler = function() { - return e.timeStamp / 1e3; - }; - } else if (delta > e.timeStamp) { - const navStart = performance.timeOrigin; - tsScaler = function(ts) { - return ts + navStart; - }; - } else { - tsScaler = function(ts) { - return ts; - }; - } - } else { - tsScaler = function() { - return Date.now(); - }; - } - return tsScaler; - } - function generatehttpSessionId() { - const len = 32; - const arr = new Uint8Array(len / 2); - window.crypto.getRandomValues(arr); - return Array.from(arr, (dec) => { - return dec.toString(16).padStart(2, "0"); - }).join(""); - } - - // src/configure.ts - var _Configuration = class { - constructor() { - this.autostart = false; - this.authHeader = null; - this.browserSessionId = null; - this.custIndex = null; - this.headers = null; - this.httpSessionId = null; - this.logCountThreshold = 0; - this.logDetails = false; - this.on = false; - this.resolution = 0; - this.sessionId = null; - this.time = () => Date.now(); - this.toolName = null; - this.toolVersion = null; - this.transmitInterval = 0; - this.url = ""; - this.userFromParams = null; - this.useraleVersion = null; - this.userId = null; - this.version = null; - this.websocketsEnabled = false; - if (_Configuration.instance === null) { - this.initialize(); - } - } - static getInstance() { - if (_Configuration.instance === null) { - _Configuration.instance = new _Configuration(); - } - return _Configuration.instance; - } - initialize() { - const settings = getInitialSettings(); - this.update(settings); - } - reset() { - this.initialize(); - } - update(newConfig) { - Object.keys(newConfig).forEach((option) => { - if (option === "userFromParams") { - const userParamString = newConfig[option]; - const userId = userParamString ? _Configuration.getUserIdFromParams(userParamString) : null; - if (userId) { - this["userId"] = userId; - } - } - const hasNewUserFromParams = newConfig["userFromParams"]; - const willNullifyUserId = option === "userId" && newConfig[option] === null; - if (willNullifyUserId && hasNewUserFromParams) { - return; - } - const newOption = newConfig[option]; - if (newOption !== void 0) { - this[option] = newOption; - } - }); - } - static getUserIdFromParams(param) { - const userField = param; - const regex = new RegExp("[?&]" + userField + "(=([^&#]*)|&|#|$)"); - const results = window.location.href.match(regex); - if (results && results[2]) { - return decodeURIComponent(results[2].replace(/\+/g, " ")); - } - return null; - } - }; - var Configuration = _Configuration; - Configuration.instance = null; - - // src/sendLogs.ts - var sendIntervalId; - var wsock; - function initSender(logs3, config3) { - if (sendIntervalId) { - clearInterval(sendIntervalId); - } - const url = new URL(config3.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - wsock = new WebSocket(config3.url); - } - sendIntervalId = sendOnInterval(logs3, config3); - sendOnClose(logs3, config3); - } - function sendOnInterval(logs3, config3) { - return setInterval(function() { - if (!config3.on) { - return; - } - if (logs3.length >= config3.logCountThreshold) { - sendLogs(logs3.slice(0), config3, 0); - logs3.splice(0); - } - }, config3.transmitInterval); - } - function sendOnClose(logs3, config3) { - self.addEventListener("pagehide", function() { - if (!config3.on) { - return; - } - if (logs3.length > 0) { - const url = new URL(config3.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - const data = JSON.stringify(logs3); - wsock.send(data); - } else { - const headers = new Headers(); - headers.set("Content-Type", "application/json;charset=UTF-8"); - if (config3.authHeader) { - headers.set("Authorization", config3.authHeader.toString()); - } - fetch(config3.url, { - keepalive: true, - method: "POST", - headers, - body: JSON.stringify(logs3) - }).catch((error) => { - console.error(error); - }); - } - logs3.splice(0); - } - }); - } - async function sendLogs(logs3, config3, retries) { - const data = JSON.stringify(logs3); - const url = new URL(config3.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - wsock.send(data); - return; - } - const headers = new Headers({ - "Content-Type": "application/json;charset=UTF-8" - }); - updateAuthHeader(config3); - if (config3.authHeader) { - const authHeaderValue = typeof config3.authHeader === "function" ? config3.authHeader() : config3.authHeader; - headers.set("Authorization", authHeaderValue); - } - updateCustomHeaders(config3); - if (config3.headers) { - for (const [header, value] of Object.entries(config3.headers)) { - headers.set(header, value); - } - } - async function attemptSend(remainingRetries) { - try { - const response = await fetch(config3.url, { - method: "POST", - headers, - body: data - }); - if (!response.ok) { - if (remainingRetries > 0) { - return attemptSend(remainingRetries - 1); - } else { - throw new Error(`Failed to send logs: ${response.statusText}`); - } - } - } catch (error) { - if (remainingRetries > 0) { - return attemptSend(remainingRetries - 1); - } - throw error; - } - } - return attemptSend(retries); - } - - // src/main.ts - var config2 = Configuration.getInstance(); - var logs2 = []; - var startLoadTimestamp = Date.now(); - var endLoadTimestamp; - self.onload = function() { - endLoadTimestamp = Date.now(); - }; - var started = false; - config2.update({ - useraleVersion: version - }); - initPackager(logs2, config2); - if (config2.autostart) { - setup(config2); - } - function setup(config3) { - if (!started) { - setTimeout(function() { - let state; - try { - state = document.readyState; - } catch (error) { - state = "complete"; - } - if (config3.autostart && (state === "interactive" || state === "complete")) { - attachHandlers(config3); - initSender(logs2, config3); - started = config3.on = true; - if (typeof window !== "undefined" && typeof document !== "undefined") { - packageCustomLog( - { - type: "load", - details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp } - }, - () => ({}), - false - ); - } - } else { - setup(config3); - } - }, 100); - } - } - var version2 = version; - function start() { - if (!started || config2.autostart === false) { - started = config2.on = true; - config2.update({ autostart: true }); - } - } - function stop() { - started = config2.on = false; - config2.update({ autostart: false }); - } - function options(newConfig) { - if (newConfig) { - config2.update(newConfig); - } - return config2; - } - function log(customLog) { - if (customLog) { - logs2.push(customLog); - return true; - } else { - return false; - } - } - if (typeof window !== "undefined") { - window.userale = { - start, - stop, - options, - log, - version, - details: defineCustomDetails, - registerAuthCallback, - addCallbacks, - removeCallbacks, - packageLog, - packageCustomLog, - getSelector, - buildPath - }; - } -})(); -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the 'License'); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//# sourceMappingURL=main.global.js.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/main.global.js.map b/products/userale/packages/flagon-userale/build/main.global.js.map deleted file mode 100644 index 26355dc..0000000 --- a/products/userale/packages/flagon-userale/build/main.global.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/packageLogs.ts","../src/attachHandlers.ts","../src/utils/auth/index.ts","../src/utils/headers/index.ts","../src/getInitialSettings.ts","../src/configure.ts","../src/sendLogs.ts","../src/main.ts"],"sourcesContent":["/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Callbacks, Logging } from \"@/types\";\nimport { Configuration } from \"@/configure\";\n\nexport let logs: Array;\nlet config: Configuration;\n\n// Interval Logging Globals\nlet intervalId: string | null;\nlet intervalType: string | null;\nlet intervalPath: string[] | null;\nlet intervalTimer: number | null;\nlet intervalCounter: number | null;\nlet intervalLog: Logging.Log | null;\n\nexport const filterHandler: CallableFunction | null = null;\nexport const mapHandler: CallableFunction | null = null;\nexport let cbHandlers: Callbacks.CallbackMap = {};\n\n/**\n * Adds named callbacks to be executed when logging.\n * @param {Object } newCallbacks An object containing named callback functions.\n */\nexport function addCallbacks(\n ...newCallbacks: Record[]\n) {\n newCallbacks.forEach((source) => {\n let descriptors: { [key in string | symbol]: any } = {};\n\n descriptors = Object.keys(source).reduce((descriptors, key) => {\n descriptors[key] = Object.getOwnPropertyDescriptor(source, key);\n return descriptors;\n }, descriptors);\n\n Object.getOwnPropertySymbols(source).forEach((sym) => {\n const descriptor = Object.getOwnPropertyDescriptor(source, sym);\n if (descriptor?.enumerable) {\n descriptors[sym] = descriptor;\n }\n });\n Object.defineProperties(cbHandlers, descriptors);\n });\n return cbHandlers;\n}\n\n/**\n * Removes callbacks by name.\n * @param {String[]} targetKeys A list of names of functions to remove.\n */\nexport function removeCallbacks(targetKeys: string[]) {\n targetKeys.forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(cbHandlers, key)) {\n delete cbHandlers[key];\n }\n });\n}\n\n/**\n * Assigns the config and log container to be used by the logging functions.\n * @param {Array} newLogs Log container.\n * @param {Object} newConfig Configuration to use while logging.\n */\nexport function initPackager(\n newLogs: Array,\n newConfig: Configuration,\n) {\n logs = newLogs;\n config = newConfig;\n cbHandlers = {};\n intervalId = null;\n intervalType = null;\n intervalPath = null;\n intervalTimer = null;\n intervalCounter = 0;\n intervalLog = null;\n}\n\n/**\n * Transforms the provided HTML event into a log and appends it to the log queue.\n * @param {Event} e The event to be logged.\n * @param {Function} detailFcn The function to extract additional log parameters from the event.\n * @return {boolean} Whether the event was logged.\n */\nexport function packageLog(\n e: Event,\n detailFcn?: Logging.DynamicDetailFunction | null,\n) {\n if (!config.on) {\n return false;\n }\n\n let details = null;\n if (detailFcn) {\n details = detailFcn(e);\n }\n\n const timeFields = extractTimeFields(\n e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now(),\n );\n\n let log: Logging.Log = {\n target: e.target ? getSelector(e.target) : null,\n path: buildPath(e),\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: timeFields.milli,\n microTime: timeFields.micro,\n location: getLocation(e),\n scrnRes: getScreenRes(),\n type: e.type,\n logType: \"raw\",\n userAction: true,\n details: details,\n userId: config.userId,\n toolVersion: config.toolVersion,\n toolName: config.toolName,\n useraleVersion: config.useraleVersion,\n sessionId: config.sessionId,\n httpSessionId: config.httpSessionId,\n browserSessionId: config.browserSessionId,\n attributes: buildAttrs(e),\n style: buildCSS(e),\n };\n\n if (typeof filterHandler === \"function\" && !filterHandler(log)) {\n return false;\n }\n\n if (typeof mapHandler === \"function\") {\n log = mapHandler(log, e);\n }\n\n for (const func of Object.values(cbHandlers)) {\n if (typeof func === \"function\") {\n log = func(log, e);\n if (!log) {\n return false;\n }\n }\n }\n\n logs.push(log);\n return true;\n}\n\n/**\n * Packages the provided customLog to include standard meta data and appends it to the log queue.\n * @param {Logging.CustomLog} customLog The behavior to be logged.\n * @param {Logging.DynamicDetailFunction} detailFcn The function to extract additional log parameters from the event.\n * @param {boolean} userAction Indicates user behavior (true) or system behavior (false)\n * @return {boolean} Whether the event was logged.\n */\nexport function packageCustomLog(\n customLog: Logging.CustomLog,\n detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction,\n userAction: boolean,\n): boolean {\n if (!config.on) {\n return false;\n }\n\n let details = null;\n if (detailFcn.length === 0) {\n // In the case of a union, the type checker will default to the more stringent\n // type, i.e. the DetailFunction that expects an argument for safety purposes.\n // To avoid this, we must explicitly check the type by asserting it receives\n // no arguments (detailFcn.length === 0) and then cast it to the\n // StaticDetailFunction type.\n const staticDetailFcn = detailFcn as Logging.StaticDetailFunction;\n details = staticDetailFcn();\n }\n\n const metaData = {\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: Date.now(),\n scrnRes: getScreenRes(),\n logType: \"custom\",\n userAction: userAction,\n details: details,\n userId: config.userId,\n toolVersion: config.toolVersion,\n toolName: config.toolName,\n useraleVersion: config.useraleVersion,\n sessionId: config.sessionId,\n httpSessionId: config.httpSessionId,\n browserSessionId: config.browserSessionId,\n };\n\n let log = Object.assign(metaData, customLog);\n\n if (typeof filterHandler === \"function\" && !filterHandler(log)) {\n return false;\n }\n\n if (typeof mapHandler === \"function\") {\n log = mapHandler(log);\n }\n\n for (const func of Object.values(cbHandlers)) {\n if (typeof func === \"function\") {\n log = func(log, null);\n if (!log) {\n return false;\n }\n }\n }\n\n logs.push(log);\n\n return true;\n}\n\n/**\n * Extract the millisecond and microsecond portions of a timestamp.\n * @param {Number} timeStamp The timestamp to split into millisecond and microsecond fields.\n * @return {Object} An object containing the millisecond\n * and microsecond portions of the timestamp.\n */\nexport function extractTimeFields(timeStamp: number) {\n return {\n milli: Math.floor(timeStamp),\n micro: Number((timeStamp % 1).toFixed(3)),\n };\n}\n\n/**\n * Track intervals and gather details about it.\n * @param {Object} e\n * @return boolean\n */\nexport function packageIntervalLog(e: Event) {\n try {\n const target = e.target ? getSelector(e.target) : null;\n const path = buildPath(e);\n const type = e.type;\n const timestamp = Math.floor(\n e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now(),\n );\n\n // Init - this should only happen once on initialization\n if (intervalId == null) {\n intervalId = target;\n intervalType = type;\n intervalPath = path;\n intervalTimer = timestamp;\n intervalCounter = 0;\n }\n\n if ((intervalId !== target || intervalType !== type) && intervalTimer) {\n // When to create log? On transition end\n // @todo Possible for intervalLog to not be pushed in the event the interval never ends...\n\n intervalLog = {\n target: intervalId,\n path: intervalPath,\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n count: intervalCounter,\n duration: timestamp - intervalTimer, // microseconds\n startTime: intervalTimer,\n endTime: timestamp,\n type: intervalType,\n logType: \"interval\",\n targetChange: intervalId !== target,\n typeChange: intervalType !== type,\n userAction: false,\n userId: config.userId,\n toolVersion: config.toolVersion,\n toolName: config.toolName,\n useraleVersion: config.useraleVersion,\n sessionId: config.sessionId,\n httpSessionId: config.httpSessionId,\n browserSessionId: config.browserSessionId,\n };\n\n if (typeof filterHandler === \"function\" && !filterHandler(intervalLog)) {\n return false;\n }\n\n if (typeof mapHandler === \"function\") {\n intervalLog = mapHandler(intervalLog, e);\n }\n\n for (const func of Object.values(cbHandlers)) {\n if (typeof func === \"function\") {\n intervalLog = func(intervalLog, null);\n if (!intervalLog) {\n return false;\n }\n }\n }\n\n if (intervalLog) logs.push(intervalLog);\n\n // Reset\n intervalId = target;\n intervalType = type;\n intervalPath = path;\n intervalTimer = timestamp;\n intervalCounter = 0;\n }\n\n // Interval is still occuring, just update counter\n if (intervalId == target && intervalType == type && intervalCounter) {\n intervalCounter = intervalCounter + 1;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts coordinate information from the event\n * depending on a few browser quirks.\n * @param {Event} e The event to extract coordinate information from.\n * @return {Object} An object containing nullable x and y coordinates for the event.\n */\nexport function getLocation(e: Event) {\n if (e instanceof MouseEvent) {\n if (e.pageX != null) {\n return { x: e.pageX, y: e.pageY };\n } else if (e.clientX != null) {\n return {\n x: document.documentElement.scrollLeft + e.clientX,\n y: document.documentElement.scrollTop + e.clientY,\n };\n }\n } else {\n return { x: null, y: null };\n }\n}\n\n/**\n * Extracts innerWidth and innerHeight to provide estimates of screen resolution\n * @return {Object} An object containing the innerWidth and InnerHeight\n */\nexport function getScreenRes() {\n return { width: self.innerWidth, height: self.innerHeight };\n}\n\n/**\n * Builds a string CSS selector from the provided element\n * @param {EventTarget} ele The element from which the selector is built.\n * @return {string} The CSS selector for the element, or Unknown if it can't be determined.\n */\nexport function getSelector(ele: EventTarget) {\n if (ele instanceof HTMLElement || ele instanceof Element) {\n if (ele.localName) {\n return (\n ele.localName +\n (ele.id ? \"#\" + ele.id : \"\") +\n (ele.className ? \".\" + ele.className : \"\")\n );\n } else if (ele.nodeName) {\n return (\n ele.nodeName +\n (ele.id ? \"#\" + ele.id : \"\") +\n (ele.className ? \".\" + ele.className : \"\")\n );\n }\n } else if (ele instanceof Document) {\n return \"#document\";\n } else if (ele === globalThis) {\n return \"Window\";\n }\n return \"Unknown\";\n}\n\n/**\n * Builds an array of elements from the provided event target, to the root element.\n * @param {Event} e Event from which the path should be built.\n * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element.\n */\nexport function buildPath(e: Event) {\n const path = e.composedPath();\n return selectorizePath(path);\n}\n\n/**\n * Builds a CSS selector path from the provided list of elements.\n * @param {EventTarget[]} path Array of HTML Elements from which the path should be built.\n * @return {string[]} Array of string CSS selectors.\n */\nexport function selectorizePath(path: EventTarget[]) {\n let i = 0;\n let pathEle;\n const pathSelectors: string[] = [];\n while ((pathEle = path[i])) {\n pathSelectors.push(getSelector(pathEle));\n ++i;\n pathEle = path[i];\n }\n return pathSelectors;\n}\n\n/**\n * Builds an object containing attributes of an element.\n * Attempts to parse all attribute values as JSON text.\n * @param {Event} e Event from which the target element's attributes should be extracted.\n * @return {Record} Object with element attributes as key-value pairs.\n */\nexport function buildAttrs(e: Event): Record {\n const attributes: Record = {};\n const attributeBlackList = [\"style\"];\n\n if (e.target && e.target instanceof Element) {\n for (const attr of e.target.attributes) {\n if (attributeBlackList.includes(attr.name)) continue;\n let val: any = attr.value;\n try {\n val = JSON.parse(val);\n } catch {\n // Ignore parsing errors, fallback to raw string value\n }\n attributes[attr.name] = val;\n }\n }\n\n return attributes;\n}\n\n/**\n * Builds an object containing all CSS properties of an element.\n * @param {Event} e Event from which the target element's properties should be extracted.\n * @return {Record} Object with all CSS properties as key-value pairs.\n */\nexport function buildCSS(e: Event): Record {\n const properties: Record = {};\n if (e.target && e.target instanceof HTMLElement) {\n const styleObj = e.target.style;\n for (let i = 0; i < styleObj.length; i++) {\n const prop = styleObj[i];\n properties[prop] = styleObj.getPropertyValue(prop);\n }\n }\n return properties;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { packageLog, packageIntervalLog } from \"@/packageLogs\";\nimport { Events, Logging, Settings } from \"@/types\";\nimport { Configuration } from \"@/configure\";\n\n//@todo: Investigate drag events and their behavior\nlet events: Events.EventDetailsMap;\nlet bufferBools: Events.EventBoolMap;\nlet bufferedEvents: Events.EventDetailsMap;\nlet refreshEvents: Events.EventDetailsMap;\nconst intervalEvents: Array = [\n \"click\",\n \"focus\",\n \"blur\",\n \"input\",\n \"change\",\n \"mouseover\",\n \"submit\",\n];\nconst windowEvents: Array = [\"load\", \"blur\", \"focus\"];\n\n/**\n * Maps a MouseEvent to an object containing useful information.\n * @param {MouseEvent} e Event to extract data from\n */\nexport function extractMouseDetails(e: MouseEvent) {\n return {\n clicks: e.detail,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n // 'text' : e.target.innerHTML\n };\n}\n\n/** Maps a KeyboardEvent to an object containing useful infromation\n * @param {KeyboardEvent} e Event to extract data from\n */\nexport function extractKeyboardDetails(e: KeyboardEvent) {\n return {\n key: e.key,\n code: e.code,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\n/**\n * Maps an InputEvent to an object containing useful information.\n * @param {InputEvent} e Event to extract data from\n */\nexport function extractInputDetails(e: InputEvent) {\n return {\n value: (e.target as HTMLInputElement).value,\n };\n}\n\n/**\n * Maps a ChangeEvent to an object containing useful information.\n * @param {Events.ChangeEvent} e Event to extract data from\n */\nexport function extractChangeDetails(e: Events.ChangeEvent) {\n return {\n value: e.target.value,\n };\n}\n\n/**\n * Maps a WheelEvent to an object containing useful information.\n * @param {WheelEvent} e Event to extract data from\n */\nexport function extractWheelDetails(e: WheelEvent) {\n return {\n x: e.deltaX,\n y: e.deltaY,\n z: e.deltaZ,\n };\n}\n\n/**\n * Maps a ScrollEvent to an object containing useful information.\n */\nexport function extractScrollDetails() {\n return {\n x: window.scrollX,\n y: window.scrollY,\n };\n}\n\n/**\n * Maps a ResizeEvent to an object containing useful information.\n */\nexport function extractResizeDetails() {\n return {\n width: window.outerWidth,\n height: window.outerHeight,\n };\n}\n\n/**\n * Defines the way information is extracted from various events.\n * Also defines which events we will listen to.\n * @param {Settings.Config} config Configuration object to read from.\n */\nexport function defineDetails(config: Settings.DefaultConfig): void {\n // Events list\n // Keys are event types\n // Values are functions that return details object if applicable\n events = {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n input: config.logDetails ? extractKeyboardDetails : null,\n change: config.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: config.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n };\n\n bufferBools = {};\n bufferedEvents = {\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n };\n\n refreshEvents = {\n submit: null,\n };\n}\n\n/**\n * Defines the way information is extracted from various events.\n * Also defines which events we will listen to.\n * @param {Settings.Config} options UserALE Configuration object to read from.\n * @param {Events.AllowedEvents} type of html event (e.g., 'click', 'mouseover', etc.), such as passed to addEventListener methods.\n */\nexport function defineCustomDetails(\n options: Settings.DefaultConfig,\n type: Events.AllowedEvents,\n): Logging.DynamicDetailFunction | null | undefined {\n // Events list\n // Keys are event types\n // Values are functions that return details object if applicable\n const eventType: Events.EventDetailsMap = {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n load: null,\n input: options.logDetails ? extractKeyboardDetails : null,\n change: options.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: options.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n submit: null,\n };\n return eventType[type];\n}\n\n/**\n * Hooks the event handlers for each event type of interest.\n * @param {Configuration} config Configuration singleton to use.\n * @return {boolean} Whether the operation succeeded\n */\nexport function attachHandlers(config: Configuration): boolean {\n try {\n defineDetails(config);\n\n (Object.keys(events) as Events.AllowedEvents[]).forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packageLog(e, events[ev]);\n },\n true,\n );\n });\n\n intervalEvents.forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packageIntervalLog(e);\n },\n true,\n );\n });\n\n (Object.keys(bufferedEvents) as Events.BufferedEvents[]).forEach(\n function (ev) {\n bufferBools[ev] = true;\n\n self.addEventListener(\n ev,\n function (e) {\n if (bufferBools[ev]) {\n bufferBools[ev] = false;\n packageLog(e, bufferedEvents[ev]);\n setTimeout(function () {\n bufferBools[ev] = true;\n }, config.resolution);\n }\n },\n true,\n );\n },\n );\n\n (Object.keys(refreshEvents) as Events.RefreshEvents[]).forEach(\n function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packageLog(e, events[ev]);\n },\n true,\n );\n },\n );\n\n windowEvents.forEach(function (ev) {\n self.addEventListener(\n ev,\n function (e) {\n packageLog(e, function () {\n return { window: true };\n });\n },\n true,\n );\n });\n\n return true;\n } catch {\n return false;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/configure\";\nimport { Callbacks } from \"@/types\";\n\nexport let authCallback: Callbacks.AuthCallback | null = null;\n\n/**\n * Fetches the most up-to-date auth header string from the auth callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Function} authCallback Callback used to fetch the newest header.\n * @returns {void}\n */\nexport function updateAuthHeader(config: Configuration) {\n if (authCallback) {\n try {\n config.authHeader = authCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the authCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the auth header: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.AuthCallback} callback Callback used to fetch the newest header. Should return a string.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerAuthCallback(callback: Callbacks.AuthCallback) {\n try {\n verifyCallback(callback);\n authCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Function} callback Callback used to fetch the newest header. Should return a string.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.AuthCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale auth callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"string\") {\n throw new Error(\"Userale auth callback must return a string\");\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetAuthCallback() {\n authCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/configure\";\nimport { Callbacks } from \"@/types\";\n\nexport let headersCallback: Callbacks.HeadersCallback | null = null;\n\n/**\n * Fetches the most up-to-date custom headers object from the headers callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Callbacks.HeadersCallback} headersCallback Callback used to fetch the newest headers.\n * @returns {void}\n */\nexport function updateCustomHeaders(config: Configuration) {\n if (headersCallback) {\n try {\n config.headers = headersCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the headersCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the headers: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest headers. Should return an object.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerHeadersCallback(callback: Callbacks.HeadersCallback) {\n try {\n verifyCallback(callback);\n headersCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest header. Should return an object.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.HeadersCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale headers callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"object\") {\n throw new Error(\"Userale headers callback must return an object\");\n }\n for (const [key, value] of Object.entries(result)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n throw new Error(\n \"Userale header callback must return an object with string keys and values\",\n );\n }\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetHeadersCallback() {\n headersCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the 'License'); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Settings } from \"./types\";\n\nlet sessionId: string | null = null;\nlet httpSessionId: string | null = null;\n\n/**\n * Extracts the initial configuration settings from the\n * currently executing script tag.\n * @return {Object} The extracted configuration object\n */\nexport function getInitialSettings(): Settings.Config {\n if (\n typeof WorkerGlobalScope !== \"undefined\" &&\n self instanceof WorkerGlobalScope\n ) {\n const settings: Settings.Config = {\n authHeader: null,\n autostart: true,\n browserSessionId: null,\n custIndex: null,\n headers: null,\n httpSessionId: null,\n logCountThreshold: +5,\n logDetails: false,\n resolution: +500,\n sessionId: sessionId,\n time: (ts?: number) => (ts !== undefined ? ts : Date.now()),\n toolName: null,\n toolVersion: null,\n transmitInterval: +5000,\n url: \"http://localhost:8000\",\n useraleVersion: null,\n userFromParams: null,\n userId: null,\n };\n return settings;\n }\n\n if (sessionId === null) {\n sessionId = getsessionId(\n \"userAlesessionId\",\n \"session_\" + String(Date.now()),\n );\n }\n\n if (httpSessionId === null) {\n httpSessionId = getsessionId(\n \"userAleHttpSessionId\",\n generatehttpSessionId(),\n );\n }\n\n const script =\n document.currentScript ||\n (function () {\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n })();\n\n const get = script\n ? script.getAttribute.bind(script)\n : function () {\n return null;\n };\n const headers = get(\"data-headers\");\n const settings: Settings.Config = {\n authHeader: get(\"data-auth\") || null,\n autostart: get(\"data-autostart\") === \"false\" ? false : true,\n browserSessionId: null,\n custIndex: get(\"data-index\") || null,\n headers: headers ? JSON.parse(headers) : null,\n httpSessionId: httpSessionId,\n logCountThreshold: +(get(\"data-threshold\") || 5),\n logDetails: get(\"data-log-details\") === \"true\" ? true : false,\n resolution: +(get(\"data-resolution\") || 500),\n sessionId: get(\"data-session\") || sessionId,\n time: timeStampScale(document.createEvent(\"CustomEvent\")),\n toolName: get(\"data-tool\") || null,\n toolVersion: get(\"data-version\") || null,\n transmitInterval: +(get(\"data-interval\") || 5000),\n url: get(\"data-url\") || \"http://localhost:8000\",\n useraleVersion: get(\"data-userale-version\") || null,\n userFromParams: get(\"data-user-from-params\") || null,\n userId: get(\"data-user\") || null,\n };\n return settings;\n}\n\n/**\n * defines sessionId, stores it in sessionStorage, checks to see if there is a sessionId in\n * storage when script is started. This prevents events like 'submit', which refresh page data\n * from refreshing the current user session\n *\n */\nexport function getsessionId(sessionKey: string, value: any) {\n if (self.sessionStorage.getItem(sessionKey) === null) {\n self.sessionStorage.setItem(sessionKey, JSON.stringify(value));\n return value;\n }\n\n return JSON.parse(self.sessionStorage.getItem(sessionKey) || \"\");\n}\n\n/**\n * Creates a function to normalize the timestamp of the provided event.\n * @param {Event} e An event containing a timeStamp property.\n * @return {typeof timeStampScale~tsScaler} The timestamp normalizing function.\n */\nexport function timeStampScale(e: Event): Settings.TimeFunction {\n let tsScaler: Settings.TimeFunction;\n if (e.timeStamp && e.timeStamp > 0) {\n const delta = Date.now() - e.timeStamp;\n /**\n * Returns a timestamp depending on various browser quirks.\n * @param {?Number} ts A timestamp to use for normalization.\n * @return {Number} A normalized timestamp.\n */\n\n if (delta < 0) {\n tsScaler = function () {\n return e.timeStamp / 1000;\n };\n } else if (delta > e.timeStamp) {\n const navStart = performance.timeOrigin;\n tsScaler = function (ts) {\n return ts + navStart;\n };\n } else {\n tsScaler = function (ts) {\n return ts;\n };\n }\n } else {\n tsScaler = function () {\n return Date.now();\n };\n }\n\n return tsScaler;\n}\n\n/**\n * Creates a cryptographiclly random string to represent this http session.\n * @return {String} A random 32 digit hex string\n */\nfunction generatehttpSessionId(): string {\n // 32 digit hex -> 128 bits of info -> 2^64 ~= 10^19 sessions needed for 50% chance of collison\n const len = 32;\n const arr = new Uint8Array(len / 2);\n window.crypto.getRandomValues(arr);\n return Array.from(arr, (dec) => {\n return dec.toString(16).padStart(2, \"0\");\n }).join(\"\");\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInitialSettings } from \"@/getInitialSettings\";\nimport type { Settings } from \"@/types\";\n\n// Singleton Configuration class\nexport class Configuration {\n [key: string]: Settings.ConfigValueTypes;\n // Private static property to hold the singleton instance\n private static instance: Configuration | null = null;\n\n // Public properties corresponding to fields in the Config interface\n public autostart: boolean = false;\n public authHeader: Settings.AuthHeader = null;\n public browserSessionId: Settings.SessionId = null;\n public custIndex: Settings.CustomIndex = null;\n public headers: Settings.Headers = null;\n public httpSessionId: Settings.SessionId = null;\n public logCountThreshold: number = 0;\n public logDetails: boolean = false;\n public on: boolean = false;\n public resolution: number = 0;\n public sessionId: Settings.SessionId = null;\n public time: Settings.TimeFunction = () => Date.now();\n public toolName: Settings.ToolName = null;\n public toolVersion: Settings.Version = null;\n public transmitInterval: number = 0;\n public url: string = \"\";\n public userFromParams: Settings.UserFromParams = null;\n public useraleVersion: Settings.Version = null;\n public userId: Settings.UserId = null;\n public version: Settings.Version = null;\n public websocketsEnabled: boolean = false;\n\n // Private constructor to prevent external instantiation\n private constructor() {\n // Call the initialization method only if it's the first time instantiating\n if (Configuration.instance === null) {\n this.initialize();\n }\n }\n\n // Static method to get the singleton instance\n public static getInstance(): Configuration {\n if (Configuration.instance === null) {\n Configuration.instance = new Configuration();\n }\n return Configuration.instance;\n }\n\n private initialize(): void {\n const settings = getInitialSettings();\n this.update(settings);\n }\n\n /**\n * Resets the configuration to its initial state.\n */\n public reset(): void {\n this.initialize();\n }\n\n /**\n * Shallow merges a newConfig with the configuration class, updating it.\n * Retrieves/updates the userid if userFromParams is provided.\n * @param {Partial} newConfig Configuration object to merge into the current config.\n */\n public update(newConfig: Partial): void {\n Object.keys(newConfig).forEach((option) => {\n if (option === \"userFromParams\") {\n const userParamString = newConfig[option] as Settings.UserFromParams;\n const userId = userParamString\n ? Configuration.getUserIdFromParams(userParamString)\n : null;\n if (userId) {\n this[\"userId\"] = userId;\n }\n }\n const hasNewUserFromParams = newConfig[\"userFromParams\"];\n const willNullifyUserId =\n option === \"userId\" && newConfig[option] === null;\n if (willNullifyUserId && hasNewUserFromParams) {\n return;\n }\n\n const newOption = newConfig[option];\n if (newOption !== undefined) {\n this[option] = newOption;\n }\n });\n }\n\n /**\n * Attempts to extract the userid from the query parameters of the URL.\n * @param {string} param The name of the query parameter containing the userid.\n * @return {string | null} The extracted/decoded userid, or null if none is found.\n */\n public static getUserIdFromParams(param: string) {\n const userField = param;\n const regex = new RegExp(\"[?&]\" + userField + \"(=([^&#]*)|&|#|$)\");\n const results = window.location.href.match(regex);\n\n if (results && results[2]) {\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n }\n return null;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/configure\";\nimport { Logging } from \"@/types\";\nimport { updateAuthHeader, updateCustomHeaders } from \"@/utils\";\n\nlet sendIntervalId: string | number | NodeJS.Timeout | undefined;\nlet wsock: WebSocket;\n\n/**\n * Initializes the log queue processors.\n * @param {Array} logs Array of logs to append to.\n * @param {Configuration} config Configuration object to use when logging.\n */\nexport function initSender(logs: Array, config: Configuration) {\n if (sendIntervalId) {\n clearInterval(sendIntervalId);\n }\n\n const url = new URL(config.url);\n if (url.protocol === \"ws:\" || url.protocol === \"wss:\") {\n wsock = new WebSocket(config.url);\n }\n\n sendIntervalId = sendOnInterval(logs, config);\n sendOnClose(logs, config);\n}\n\n/**\n * Checks the provided log array on an interval, flushing the logs\n * if the queue has reached the threshold specified by the provided config.\n * @param {Array} logs Array of logs to read from.\n * @param {Configuration} config Configuration singleton to be read from.\n * @return {Number} The newly created interval id.\n */\nexport function sendOnInterval(\n logs: Array,\n config: Configuration,\n): NodeJS.Timeout {\n return setInterval(function () {\n if (!config.on) {\n return;\n }\n\n if (logs.length >= config.logCountThreshold) {\n sendLogs(logs.slice(0), config, 0); // Send a copy\n logs.splice(0); // Clear array reference (no reassignment)\n }\n }, config.transmitInterval);\n}\n\n// /**\n// * Attempts to flush the remaining logs when the window is closed.\n// * @param {Array} logs Array of logs to be flushed.\n// * @param {Configuration} config Configuration singleton to be read from.\n// */\nexport function sendOnClose(\n logs: Array,\n config: Configuration,\n): void {\n self.addEventListener(\"pagehide\", function () {\n if (!config.on) {\n return;\n }\n\n if (logs.length > 0) {\n const url = new URL(config.url);\n\n if (url.protocol === \"ws:\" || url.protocol === \"wss:\") {\n const data = JSON.stringify(logs);\n wsock.send(data);\n } else {\n const headers: HeadersInit = new Headers();\n headers.set(\"Content-Type\", \"application/json;charset=UTF-8\");\n\n if (config.authHeader) {\n headers.set(\"Authorization\", config.authHeader.toString());\n }\n\n fetch(config.url, {\n keepalive: true,\n method: \"POST\",\n headers: headers,\n body: JSON.stringify(logs),\n }).catch((error) => {\n console.error(error);\n });\n }\n logs.splice(0); // clear log queue\n }\n });\n}\n\n/**\n * Sends the provided array of logs to the specified url,\n * retrying the request up to the specified number of retries.\n * @param {Array} logs Array of logs to send.\n * @param {Configuration} config configuration singleton.\n * @param {Number} retries Maximum number of attempts to send the logs.\n */\nexport async function sendLogs(\n logs: Array,\n config: Configuration,\n retries: number,\n): Promise {\n const data = JSON.stringify(logs);\n const url = new URL(config.url);\n\n if (url.protocol === \"ws:\" || url.protocol === \"wss:\") {\n wsock.send(data);\n return;\n }\n\n // Build headers\n const headers = new Headers({\n \"Content-Type\": \"application/json;charset=UTF-8\",\n });\n\n updateAuthHeader(config);\n if (config.authHeader) {\n const authHeaderValue =\n typeof config.authHeader === \"function\"\n ? config.authHeader()\n : config.authHeader;\n headers.set(\"Authorization\", authHeaderValue);\n }\n\n // Update custom headers last to allow them to over-write the defaults. This assumes\n // the user knows what they are doing and may want to over-write the defaults.\n updateCustomHeaders(config);\n if (config.headers) {\n for (const [header, value] of Object.entries(config.headers)) {\n headers.set(header, value);\n }\n }\n\n async function attemptSend(remainingRetries: number): Promise {\n try {\n const response = await fetch(config.url, {\n method: \"POST\",\n headers,\n body: data,\n });\n\n if (!response.ok) {\n if (remainingRetries > 0) {\n return attemptSend(remainingRetries - 1);\n } else {\n throw new Error(`Failed to send logs: ${response.statusText}`);\n }\n }\n } catch (error) {\n if (remainingRetries > 0) {\n return attemptSend(remainingRetries - 1);\n }\n throw error;\n }\n }\n\n return attemptSend(retries);\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { defineCustomDetails } from \"@/attachHandlers\";\nimport { registerAuthCallback } from \"@/utils\";\nimport {\n addCallbacks,\n removeCallbacks,\n packageLog,\n packageCustomLog,\n getSelector,\n buildPath,\n initPackager,\n} from \"@/packageLogs\";\nimport { version as userAleVersion } from \"../package.json\";\nimport { Configuration } from \"@/configure\";\nimport { attachHandlers } from \"@/attachHandlers\";\nimport { initSender } from \"@/sendLogs\";\n\nimport type { Settings, Logging } from \"@/types\";\n\nconst config = Configuration.getInstance();\nconst logs: Array = [];\n\nconst startLoadTimestamp = Date.now();\nlet endLoadTimestamp: number;\nself.onload = function () {\n endLoadTimestamp = Date.now();\n};\n\nexport let started = false;\nexport { defineCustomDetails as details } from \"@/attachHandlers\";\nexport { registerAuthCallback as registerAuthCallback } from \"@/utils\";\nexport {\n addCallbacks as addCallbacks,\n removeCallbacks as removeCallbacks,\n packageLog as packageLog,\n packageCustomLog as packageCustomLog,\n getSelector as getSelector,\n buildPath as buildPath,\n} from \"@/packageLogs\";\nexport type { Logging } from \"@/types\";\n\nconfig.update({\n useraleVersion: userAleVersion,\n});\ninitPackager(logs, config);\nif (config.autostart) {\n setup(config);\n}\n\n/**\n * Hooks the global event listener, and starts up the\n * logging interval.\n * @param {Configuration} config Configuration settings for the logger\n */\nfunction setup(config: Configuration) {\n if (!started) {\n setTimeout(function () {\n let state;\n try {\n state = document.readyState;\n } catch (error) {\n // Assume there is no DOM and this is a web worker context\n state = \"complete\";\n }\n\n if (\n config.autostart &&\n (state === \"interactive\" || state === \"complete\")\n ) {\n attachHandlers(config);\n initSender(logs, config);\n started = config.on = true;\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n packageCustomLog(\n {\n type: \"load\",\n details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp },\n },\n () => ({}),\n false,\n );\n }\n } else {\n setup(config);\n }\n }, 100);\n }\n}\n\n// Export the Userale API\nexport const version = userAleVersion;\n\n/**\n * Used to start the logging process if the\n * autostart configuration option is set to false.\n */\nexport function start(): void {\n if (!started || config.autostart === false) {\n started = config.on = true;\n config.update({ autostart: true });\n }\n}\n\n/**\n * Halts the logging process. Logs will no longer be sent.\n */\nexport function stop(): void {\n started = config.on = false;\n config.update({ autostart: false });\n}\n\n/**\n * Updates the current configuration\n * object with the provided values.\n * @param {Partial} newConfig The configuration options to use.\n * @return {Settings.Config} Returns the updated configuration.\n */\nexport function options(\n newConfig: Partial | undefined,\n): Settings.Config {\n if (newConfig) {\n config.update(newConfig);\n }\n\n return config;\n}\n\n/**\n * Appends a log to the log queue.\n * @param {Logging.CustomLog} customLog The log to append.\n * @return {boolean} Whether the operation succeeded.\n */\nexport function log(customLog: Logging.CustomLog | undefined) {\n if (customLog) {\n logs.push(customLog);\n return true;\n } else {\n return false;\n }\n}\n\n// Only attach to window in IIFE builds\nif (typeof window !== \"undefined\") {\n (window as any).userale = {\n start,\n stop,\n options,\n log,\n version: userAleVersion,\n details: defineCustomDetails,\n registerAuthCallback,\n addCallbacks,\n removeCallbacks,\n packageLog,\n packageCustomLog,\n getSelector,\n buildPath,\n };\n}\n"],"mappings":"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","names":["descriptors","log","config","options","config","config","settings","logs","config","config","logs","version"]} \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/main.mjs b/products/userale/packages/flagon-userale/build/main.mjs deleted file mode 100644 index 3fd60b0..0000000 --- a/products/userale/packages/flagon-userale/build/main.mjs +++ /dev/null @@ -1,950 +0,0 @@ -/* Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to you under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.*/ -// src/packageLogs.ts -var logs; -var config; -var intervalId; -var intervalType; -var intervalPath; -var intervalTimer; -var intervalCounter; -var intervalLog; -var filterHandler = null; -var mapHandler = null; -var cbHandlers = {}; -function addCallbacks(...newCallbacks) { - newCallbacks.forEach((source) => { - let descriptors = {}; - descriptors = Object.keys(source).reduce((descriptors2, key) => { - descriptors2[key] = Object.getOwnPropertyDescriptor(source, key); - return descriptors2; - }, descriptors); - Object.getOwnPropertySymbols(source).forEach((sym) => { - const descriptor = Object.getOwnPropertyDescriptor(source, sym); - if (descriptor?.enumerable) { - descriptors[sym] = descriptor; - } - }); - Object.defineProperties(cbHandlers, descriptors); - }); - return cbHandlers; -} -function removeCallbacks(targetKeys) { - targetKeys.forEach((key) => { - if (Object.prototype.hasOwnProperty.call(cbHandlers, key)) { - delete cbHandlers[key]; - } - }); -} -function initPackager(newLogs, newConfig) { - logs = newLogs; - config = newConfig; - cbHandlers = {}; - intervalId = null; - intervalType = null; - intervalPath = null; - intervalTimer = null; - intervalCounter = 0; - intervalLog = null; -} -function packageLog(e, detailFcn) { - if (!config.on) { - return false; - } - let details = null; - if (detailFcn) { - details = detailFcn(e); - } - const timeFields = extractTimeFields( - e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now() - ); - let log2 = { - target: e.target ? getSelector(e.target) : null, - path: buildPath(e), - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - clientTime: timeFields.milli, - microTime: timeFields.micro, - location: getLocation(e), - scrnRes: getScreenRes(), - type: e.type, - logType: "raw", - userAction: true, - details, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId, - attributes: buildAttrs(e), - style: buildCSS(e) - }; - if (typeof filterHandler === "function" && !filterHandler(log2)) { - return false; - } - if (typeof mapHandler === "function") { - log2 = mapHandler(log2, e); - } - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - log2 = func(log2, e); - if (!log2) { - return false; - } - } - } - logs.push(log2); - return true; -} -function packageCustomLog(customLog, detailFcn, userAction) { - if (!config.on) { - return false; - } - let details = null; - if (detailFcn.length === 0) { - const staticDetailFcn = detailFcn; - details = staticDetailFcn(); - } - const metaData = { - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - clientTime: Date.now(), - scrnRes: getScreenRes(), - logType: "custom", - userAction, - details, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId - }; - let log2 = Object.assign(metaData, customLog); - if (typeof filterHandler === "function" && !filterHandler(log2)) { - return false; - } - if (typeof mapHandler === "function") { - log2 = mapHandler(log2); - } - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - log2 = func(log2, null); - if (!log2) { - return false; - } - } - } - logs.push(log2); - return true; -} -function extractTimeFields(timeStamp) { - return { - milli: Math.floor(timeStamp), - micro: Number((timeStamp % 1).toFixed(3)) - }; -} -function packageIntervalLog(e) { - try { - const target = e.target ? getSelector(e.target) : null; - const path = buildPath(e); - const type = e.type; - const timestamp = Math.floor( - e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now() - ); - if (intervalId == null) { - intervalId = target; - intervalType = type; - intervalPath = path; - intervalTimer = timestamp; - intervalCounter = 0; - } - if ((intervalId !== target || intervalType !== type) && intervalTimer) { - intervalLog = { - target: intervalId, - path: intervalPath, - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - count: intervalCounter, - duration: timestamp - intervalTimer, - startTime: intervalTimer, - endTime: timestamp, - type: intervalType, - logType: "interval", - targetChange: intervalId !== target, - typeChange: intervalType !== type, - userAction: false, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId - }; - if (typeof filterHandler === "function" && !filterHandler(intervalLog)) { - return false; - } - if (typeof mapHandler === "function") { - intervalLog = mapHandler(intervalLog, e); - } - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - intervalLog = func(intervalLog, null); - if (!intervalLog) { - return false; - } - } - } - if (intervalLog) - logs.push(intervalLog); - intervalId = target; - intervalType = type; - intervalPath = path; - intervalTimer = timestamp; - intervalCounter = 0; - } - if (intervalId == target && intervalType == type && intervalCounter) { - intervalCounter = intervalCounter + 1; - } - return true; - } catch { - return false; - } -} -function getLocation(e) { - if (e instanceof MouseEvent) { - if (e.pageX != null) { - return { x: e.pageX, y: e.pageY }; - } else if (e.clientX != null) { - return { - x: document.documentElement.scrollLeft + e.clientX, - y: document.documentElement.scrollTop + e.clientY - }; - } - } else { - return { x: null, y: null }; - } -} -function getScreenRes() { - return { width: self.innerWidth, height: self.innerHeight }; -} -function getSelector(ele) { - if (ele instanceof HTMLElement || ele instanceof Element) { - if (ele.localName) { - return ele.localName + (ele.id ? "#" + ele.id : "") + (ele.className ? "." + ele.className : ""); - } else if (ele.nodeName) { - return ele.nodeName + (ele.id ? "#" + ele.id : "") + (ele.className ? "." + ele.className : ""); - } - } else if (ele instanceof Document) { - return "#document"; - } else if (ele === globalThis) { - return "Window"; - } - return "Unknown"; -} -function buildPath(e) { - const path = e.composedPath(); - return selectorizePath(path); -} -function selectorizePath(path) { - let i = 0; - let pathEle; - const pathSelectors = []; - while (pathEle = path[i]) { - pathSelectors.push(getSelector(pathEle)); - ++i; - pathEle = path[i]; - } - return pathSelectors; -} -function buildAttrs(e) { - const attributes = {}; - const attributeBlackList = ["style"]; - if (e.target && e.target instanceof Element) { - for (const attr of e.target.attributes) { - if (attributeBlackList.includes(attr.name)) - continue; - let val = attr.value; - try { - val = JSON.parse(val); - } catch { - } - attributes[attr.name] = val; - } - } - return attributes; -} -function buildCSS(e) { - const properties = {}; - if (e.target && e.target instanceof HTMLElement) { - const styleObj = e.target.style; - for (let i = 0; i < styleObj.length; i++) { - const prop = styleObj[i]; - properties[prop] = styleObj.getPropertyValue(prop); - } - } - return properties; -} - -// src/attachHandlers.ts -var events; -var bufferBools; -var bufferedEvents; -var refreshEvents; -var intervalEvents = [ - "click", - "focus", - "blur", - "input", - "change", - "mouseover", - "submit" -]; -var windowEvents = ["load", "blur", "focus"]; -function extractMouseDetails(e) { - return { - clicks: e.detail, - ctrl: e.ctrlKey, - alt: e.altKey, - shift: e.shiftKey, - meta: e.metaKey - }; -} -function extractKeyboardDetails(e) { - return { - key: e.key, - code: e.code, - ctrl: e.ctrlKey, - alt: e.altKey, - shift: e.shiftKey, - meta: e.metaKey - }; -} -function extractChangeDetails(e) { - return { - value: e.target.value - }; -} -function extractWheelDetails(e) { - return { - x: e.deltaX, - y: e.deltaY, - z: e.deltaZ - }; -} -function extractScrollDetails() { - return { - x: window.scrollX, - y: window.scrollY - }; -} -function extractResizeDetails() { - return { - width: window.outerWidth, - height: window.outerHeight - }; -} -function defineDetails(config3) { - events = { - click: extractMouseDetails, - dblclick: extractMouseDetails, - mousedown: extractMouseDetails, - mouseup: extractMouseDetails, - focus: null, - blur: null, - input: config3.logDetails ? extractKeyboardDetails : null, - change: config3.logDetails ? extractChangeDetails : null, - dragstart: null, - dragend: null, - drag: null, - drop: null, - keydown: config3.logDetails ? extractKeyboardDetails : null, - mouseover: null - }; - bufferBools = {}; - bufferedEvents = { - wheel: extractWheelDetails, - scroll: extractScrollDetails, - resize: extractResizeDetails - }; - refreshEvents = { - submit: null - }; -} -function defineCustomDetails(options2, type) { - const eventType = { - click: extractMouseDetails, - dblclick: extractMouseDetails, - mousedown: extractMouseDetails, - mouseup: extractMouseDetails, - focus: null, - blur: null, - load: null, - input: options2.logDetails ? extractKeyboardDetails : null, - change: options2.logDetails ? extractChangeDetails : null, - dragstart: null, - dragend: null, - drag: null, - drop: null, - keydown: options2.logDetails ? extractKeyboardDetails : null, - mouseover: null, - wheel: extractWheelDetails, - scroll: extractScrollDetails, - resize: extractResizeDetails, - submit: null - }; - return eventType[type]; -} -function attachHandlers(config3) { - try { - defineDetails(config3); - Object.keys(events).forEach(function(ev) { - document.addEventListener( - ev, - function(e) { - packageLog(e, events[ev]); - }, - true - ); - }); - intervalEvents.forEach(function(ev) { - document.addEventListener( - ev, - function(e) { - packageIntervalLog(e); - }, - true - ); - }); - Object.keys(bufferedEvents).forEach( - function(ev) { - bufferBools[ev] = true; - self.addEventListener( - ev, - function(e) { - if (bufferBools[ev]) { - bufferBools[ev] = false; - packageLog(e, bufferedEvents[ev]); - setTimeout(function() { - bufferBools[ev] = true; - }, config3.resolution); - } - }, - true - ); - } - ); - Object.keys(refreshEvents).forEach( - function(ev) { - document.addEventListener( - ev, - function(e) { - packageLog(e, events[ev]); - }, - true - ); - } - ); - windowEvents.forEach(function(ev) { - self.addEventListener( - ev, - function(e) { - packageLog(e, function() { - return { window: true }; - }); - }, - true - ); - }); - return true; - } catch { - return false; - } -} - -// src/utils/auth/index.ts -var authCallback = null; -function updateAuthHeader(config3) { - if (authCallback) { - try { - config3.authHeader = authCallback(); - } catch (e) { - console.error(`Error encountered while setting the auth header: ${e}`); - } - } -} -function registerAuthCallback(callback) { - try { - verifyCallback(callback); - authCallback = callback; - return true; - } catch { - return false; - } -} -function verifyCallback(callback) { - if (typeof callback !== "function") { - throw new Error("Userale auth callback must be a function"); - } - const result = callback(); - if (typeof result !== "string") { - throw new Error("Userale auth callback must return a string"); - } -} - -// src/utils/headers/index.ts -var headersCallback = null; -function updateCustomHeaders(config3) { - if (headersCallback) { - try { - config3.headers = headersCallback(); - } catch (e) { - console.error(`Error encountered while setting the headers: ${e}`); - } - } -} - -// package.json -var version = "2.4.0"; - -// src/getInitialSettings.ts -var sessionId = null; -var httpSessionId = null; -function getInitialSettings() { - if (typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope) { - const settings2 = { - authHeader: null, - autostart: true, - browserSessionId: null, - custIndex: null, - headers: null, - httpSessionId: null, - logCountThreshold: 5, - logDetails: false, - resolution: 500, - sessionId, - time: (ts) => ts !== void 0 ? ts : Date.now(), - toolName: null, - toolVersion: null, - transmitInterval: 5e3, - url: "http://localhost:8000", - useraleVersion: null, - userFromParams: null, - userId: null - }; - return settings2; - } - if (sessionId === null) { - sessionId = getsessionId( - "userAlesessionId", - "session_" + String(Date.now()) - ); - } - if (httpSessionId === null) { - httpSessionId = getsessionId( - "userAleHttpSessionId", - generatehttpSessionId() - ); - } - const script = document.currentScript || function() { - const scripts = document.getElementsByTagName("script"); - return scripts[scripts.length - 1]; - }(); - const get = script ? script.getAttribute.bind(script) : function() { - return null; - }; - const headers = get("data-headers"); - const settings = { - authHeader: get("data-auth") || null, - autostart: get("data-autostart") === "false" ? false : true, - browserSessionId: null, - custIndex: get("data-index") || null, - headers: headers ? JSON.parse(headers) : null, - httpSessionId, - logCountThreshold: +(get("data-threshold") || 5), - logDetails: get("data-log-details") === "true" ? true : false, - resolution: +(get("data-resolution") || 500), - sessionId: get("data-session") || sessionId, - time: timeStampScale(document.createEvent("CustomEvent")), - toolName: get("data-tool") || null, - toolVersion: get("data-version") || null, - transmitInterval: +(get("data-interval") || 5e3), - url: get("data-url") || "http://localhost:8000", - useraleVersion: get("data-userale-version") || null, - userFromParams: get("data-user-from-params") || null, - userId: get("data-user") || null - }; - return settings; -} -function getsessionId(sessionKey, value) { - if (self.sessionStorage.getItem(sessionKey) === null) { - self.sessionStorage.setItem(sessionKey, JSON.stringify(value)); - return value; - } - return JSON.parse(self.sessionStorage.getItem(sessionKey) || ""); -} -function timeStampScale(e) { - let tsScaler; - if (e.timeStamp && e.timeStamp > 0) { - const delta = Date.now() - e.timeStamp; - if (delta < 0) { - tsScaler = function() { - return e.timeStamp / 1e3; - }; - } else if (delta > e.timeStamp) { - const navStart = performance.timeOrigin; - tsScaler = function(ts) { - return ts + navStart; - }; - } else { - tsScaler = function(ts) { - return ts; - }; - } - } else { - tsScaler = function() { - return Date.now(); - }; - } - return tsScaler; -} -function generatehttpSessionId() { - const len = 32; - const arr = new Uint8Array(len / 2); - window.crypto.getRandomValues(arr); - return Array.from(arr, (dec) => { - return dec.toString(16).padStart(2, "0"); - }).join(""); -} - -// src/configure.ts -var _Configuration = class { - constructor() { - this.autostart = false; - this.authHeader = null; - this.browserSessionId = null; - this.custIndex = null; - this.headers = null; - this.httpSessionId = null; - this.logCountThreshold = 0; - this.logDetails = false; - this.on = false; - this.resolution = 0; - this.sessionId = null; - this.time = () => Date.now(); - this.toolName = null; - this.toolVersion = null; - this.transmitInterval = 0; - this.url = ""; - this.userFromParams = null; - this.useraleVersion = null; - this.userId = null; - this.version = null; - this.websocketsEnabled = false; - if (_Configuration.instance === null) { - this.initialize(); - } - } - static getInstance() { - if (_Configuration.instance === null) { - _Configuration.instance = new _Configuration(); - } - return _Configuration.instance; - } - initialize() { - const settings = getInitialSettings(); - this.update(settings); - } - reset() { - this.initialize(); - } - update(newConfig) { - Object.keys(newConfig).forEach((option) => { - if (option === "userFromParams") { - const userParamString = newConfig[option]; - const userId = userParamString ? _Configuration.getUserIdFromParams(userParamString) : null; - if (userId) { - this["userId"] = userId; - } - } - const hasNewUserFromParams = newConfig["userFromParams"]; - const willNullifyUserId = option === "userId" && newConfig[option] === null; - if (willNullifyUserId && hasNewUserFromParams) { - return; - } - const newOption = newConfig[option]; - if (newOption !== void 0) { - this[option] = newOption; - } - }); - } - static getUserIdFromParams(param) { - const userField = param; - const regex = new RegExp("[?&]" + userField + "(=([^&#]*)|&|#|$)"); - const results = window.location.href.match(regex); - if (results && results[2]) { - return decodeURIComponent(results[2].replace(/\+/g, " ")); - } - return null; - } -}; -var Configuration = _Configuration; -Configuration.instance = null; - -// src/sendLogs.ts -var sendIntervalId; -var wsock; -function initSender(logs3, config3) { - if (sendIntervalId) { - clearInterval(sendIntervalId); - } - const url = new URL(config3.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - wsock = new WebSocket(config3.url); - } - sendIntervalId = sendOnInterval(logs3, config3); - sendOnClose(logs3, config3); -} -function sendOnInterval(logs3, config3) { - return setInterval(function() { - if (!config3.on) { - return; - } - if (logs3.length >= config3.logCountThreshold) { - sendLogs(logs3.slice(0), config3, 0); - logs3.splice(0); - } - }, config3.transmitInterval); -} -function sendOnClose(logs3, config3) { - self.addEventListener("pagehide", function() { - if (!config3.on) { - return; - } - if (logs3.length > 0) { - const url = new URL(config3.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - const data = JSON.stringify(logs3); - wsock.send(data); - } else { - const headers = new Headers(); - headers.set("Content-Type", "application/json;charset=UTF-8"); - if (config3.authHeader) { - headers.set("Authorization", config3.authHeader.toString()); - } - fetch(config3.url, { - keepalive: true, - method: "POST", - headers, - body: JSON.stringify(logs3) - }).catch((error) => { - console.error(error); - }); - } - logs3.splice(0); - } - }); -} -async function sendLogs(logs3, config3, retries) { - const data = JSON.stringify(logs3); - const url = new URL(config3.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - wsock.send(data); - return; - } - const headers = new Headers({ - "Content-Type": "application/json;charset=UTF-8" - }); - updateAuthHeader(config3); - if (config3.authHeader) { - const authHeaderValue = typeof config3.authHeader === "function" ? config3.authHeader() : config3.authHeader; - headers.set("Authorization", authHeaderValue); - } - updateCustomHeaders(config3); - if (config3.headers) { - for (const [header, value] of Object.entries(config3.headers)) { - headers.set(header, value); - } - } - async function attemptSend(remainingRetries) { - try { - const response = await fetch(config3.url, { - method: "POST", - headers, - body: data - }); - if (!response.ok) { - if (remainingRetries > 0) { - return attemptSend(remainingRetries - 1); - } else { - throw new Error(`Failed to send logs: ${response.statusText}`); - } - } - } catch (error) { - if (remainingRetries > 0) { - return attemptSend(remainingRetries - 1); - } - throw error; - } - } - return attemptSend(retries); -} - -// src/main.ts -var config2 = Configuration.getInstance(); -var logs2 = []; -var startLoadTimestamp = Date.now(); -var endLoadTimestamp; -self.onload = function() { - endLoadTimestamp = Date.now(); -}; -var started = false; -config2.update({ - useraleVersion: version -}); -initPackager(logs2, config2); -if (config2.autostart) { - setup(config2); -} -function setup(config3) { - if (!started) { - setTimeout(function() { - let state; - try { - state = document.readyState; - } catch (error) { - state = "complete"; - } - if (config3.autostart && (state === "interactive" || state === "complete")) { - attachHandlers(config3); - initSender(logs2, config3); - started = config3.on = true; - if (typeof window !== "undefined" && typeof document !== "undefined") { - packageCustomLog( - { - type: "load", - details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp } - }, - () => ({}), - false - ); - } - } else { - setup(config3); - } - }, 100); - } -} -var version2 = version; -function start() { - if (!started || config2.autostart === false) { - started = config2.on = true; - config2.update({ autostart: true }); - } -} -function stop() { - started = config2.on = false; - config2.update({ autostart: false }); -} -function options(newConfig) { - if (newConfig) { - config2.update(newConfig); - } - return config2; -} -function log(customLog) { - if (customLog) { - logs2.push(customLog); - return true; - } else { - return false; - } -} -if (typeof window !== "undefined") { - window.userale = { - start, - stop, - options, - log, - version, - details: defineCustomDetails, - registerAuthCallback, - addCallbacks, - removeCallbacks, - packageLog, - packageCustomLog, - getSelector, - buildPath - }; -} -export { - addCallbacks, - buildPath, - defineCustomDetails as details, - getSelector, - log, - options, - packageCustomLog, - packageLog, - registerAuthCallback, - removeCallbacks, - start, - started, - stop, - version2 as version -}; -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the 'License'); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//# sourceMappingURL=main.mjs.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/main.mjs.map b/products/userale/packages/flagon-userale/build/main.mjs.map deleted file mode 100644 index 887b699..0000000 --- a/products/userale/packages/flagon-userale/build/main.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/packageLogs.ts","../src/attachHandlers.ts","../src/utils/auth/index.ts","../src/utils/headers/index.ts","../src/getInitialSettings.ts","../src/configure.ts","../src/sendLogs.ts","../src/main.ts"],"sourcesContent":["/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Callbacks, Logging } from \"@/types\";\nimport { Configuration } from \"@/configure\";\n\nexport let logs: Array;\nlet config: Configuration;\n\n// Interval Logging Globals\nlet intervalId: string | null;\nlet intervalType: string | null;\nlet intervalPath: string[] | null;\nlet intervalTimer: number | null;\nlet intervalCounter: number | null;\nlet intervalLog: Logging.Log | null;\n\nexport const filterHandler: CallableFunction | null = null;\nexport const mapHandler: CallableFunction | null = null;\nexport let cbHandlers: Callbacks.CallbackMap = {};\n\n/**\n * Adds named callbacks to be executed when logging.\n * @param {Object } newCallbacks An object containing named callback functions.\n */\nexport function addCallbacks(\n ...newCallbacks: Record[]\n) {\n newCallbacks.forEach((source) => {\n let descriptors: { [key in string | symbol]: any } = {};\n\n descriptors = Object.keys(source).reduce((descriptors, key) => {\n descriptors[key] = Object.getOwnPropertyDescriptor(source, key);\n return descriptors;\n }, descriptors);\n\n Object.getOwnPropertySymbols(source).forEach((sym) => {\n const descriptor = Object.getOwnPropertyDescriptor(source, sym);\n if (descriptor?.enumerable) {\n descriptors[sym] = descriptor;\n }\n });\n Object.defineProperties(cbHandlers, descriptors);\n });\n return cbHandlers;\n}\n\n/**\n * Removes callbacks by name.\n * @param {String[]} targetKeys A list of names of functions to remove.\n */\nexport function removeCallbacks(targetKeys: string[]) {\n targetKeys.forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(cbHandlers, key)) {\n delete cbHandlers[key];\n }\n });\n}\n\n/**\n * Assigns the config and log container to be used by the logging functions.\n * @param {Array} newLogs Log container.\n * @param {Object} newConfig Configuration to use while logging.\n */\nexport function initPackager(\n newLogs: Array,\n newConfig: Configuration,\n) {\n logs = newLogs;\n config = newConfig;\n cbHandlers = {};\n intervalId = null;\n intervalType = null;\n intervalPath = null;\n intervalTimer = null;\n intervalCounter = 0;\n intervalLog = null;\n}\n\n/**\n * Transforms the provided HTML event into a log and appends it to the log queue.\n * @param {Event} e The event to be logged.\n * @param {Function} detailFcn The function to extract additional log parameters from the event.\n * @return {boolean} Whether the event was logged.\n */\nexport function packageLog(\n e: Event,\n detailFcn?: Logging.DynamicDetailFunction | null,\n) {\n if (!config.on) {\n return false;\n }\n\n let details = null;\n if (detailFcn) {\n details = detailFcn(e);\n }\n\n const timeFields = extractTimeFields(\n e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now(),\n );\n\n let log: Logging.Log = {\n target: e.target ? getSelector(e.target) : null,\n path: buildPath(e),\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: timeFields.milli,\n microTime: timeFields.micro,\n location: getLocation(e),\n scrnRes: getScreenRes(),\n type: e.type,\n logType: \"raw\",\n userAction: true,\n details: details,\n userId: config.userId,\n toolVersion: config.toolVersion,\n toolName: config.toolName,\n useraleVersion: config.useraleVersion,\n sessionId: config.sessionId,\n httpSessionId: config.httpSessionId,\n browserSessionId: config.browserSessionId,\n attributes: buildAttrs(e),\n style: buildCSS(e),\n };\n\n if (typeof filterHandler === \"function\" && !filterHandler(log)) {\n return false;\n }\n\n if (typeof mapHandler === \"function\") {\n log = mapHandler(log, e);\n }\n\n for (const func of Object.values(cbHandlers)) {\n if (typeof func === \"function\") {\n log = func(log, e);\n if (!log) {\n return false;\n }\n }\n }\n\n logs.push(log);\n return true;\n}\n\n/**\n * Packages the provided customLog to include standard meta data and appends it to the log queue.\n * @param {Logging.CustomLog} customLog The behavior to be logged.\n * @param {Logging.DynamicDetailFunction} detailFcn The function to extract additional log parameters from the event.\n * @param {boolean} userAction Indicates user behavior (true) or system behavior (false)\n * @return {boolean} Whether the event was logged.\n */\nexport function packageCustomLog(\n customLog: Logging.CustomLog,\n detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction,\n userAction: boolean,\n): boolean {\n if (!config.on) {\n return false;\n }\n\n let details = null;\n if (detailFcn.length === 0) {\n // In the case of a union, the type checker will default to the more stringent\n // type, i.e. the DetailFunction that expects an argument for safety purposes.\n // To avoid this, we must explicitly check the type by asserting it receives\n // no arguments (detailFcn.length === 0) and then cast it to the\n // StaticDetailFunction type.\n const staticDetailFcn = detailFcn as Logging.StaticDetailFunction;\n details = staticDetailFcn();\n }\n\n const metaData = {\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: Date.now(),\n scrnRes: getScreenRes(),\n logType: \"custom\",\n userAction: userAction,\n details: details,\n userId: config.userId,\n toolVersion: config.toolVersion,\n toolName: config.toolName,\n useraleVersion: config.useraleVersion,\n sessionId: config.sessionId,\n httpSessionId: config.httpSessionId,\n browserSessionId: config.browserSessionId,\n };\n\n let log = Object.assign(metaData, customLog);\n\n if (typeof filterHandler === \"function\" && !filterHandler(log)) {\n return false;\n }\n\n if (typeof mapHandler === \"function\") {\n log = mapHandler(log);\n }\n\n for (const func of Object.values(cbHandlers)) {\n if (typeof func === \"function\") {\n log = func(log, null);\n if (!log) {\n return false;\n }\n }\n }\n\n logs.push(log);\n\n return true;\n}\n\n/**\n * Extract the millisecond and microsecond portions of a timestamp.\n * @param {Number} timeStamp The timestamp to split into millisecond and microsecond fields.\n * @return {Object} An object containing the millisecond\n * and microsecond portions of the timestamp.\n */\nexport function extractTimeFields(timeStamp: number) {\n return {\n milli: Math.floor(timeStamp),\n micro: Number((timeStamp % 1).toFixed(3)),\n };\n}\n\n/**\n * Track intervals and gather details about it.\n * @param {Object} e\n * @return boolean\n */\nexport function packageIntervalLog(e: Event) {\n try {\n const target = e.target ? getSelector(e.target) : null;\n const path = buildPath(e);\n const type = e.type;\n const timestamp = Math.floor(\n e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now(),\n );\n\n // Init - this should only happen once on initialization\n if (intervalId == null) {\n intervalId = target;\n intervalType = type;\n intervalPath = path;\n intervalTimer = timestamp;\n intervalCounter = 0;\n }\n\n if ((intervalId !== target || intervalType !== type) && intervalTimer) {\n // When to create log? On transition end\n // @todo Possible for intervalLog to not be pushed in the event the interval never ends...\n\n intervalLog = {\n target: intervalId,\n path: intervalPath,\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n count: intervalCounter,\n duration: timestamp - intervalTimer, // microseconds\n startTime: intervalTimer,\n endTime: timestamp,\n type: intervalType,\n logType: \"interval\",\n targetChange: intervalId !== target,\n typeChange: intervalType !== type,\n userAction: false,\n userId: config.userId,\n toolVersion: config.toolVersion,\n toolName: config.toolName,\n useraleVersion: config.useraleVersion,\n sessionId: config.sessionId,\n httpSessionId: config.httpSessionId,\n browserSessionId: config.browserSessionId,\n };\n\n if (typeof filterHandler === \"function\" && !filterHandler(intervalLog)) {\n return false;\n }\n\n if (typeof mapHandler === \"function\") {\n intervalLog = mapHandler(intervalLog, e);\n }\n\n for (const func of Object.values(cbHandlers)) {\n if (typeof func === \"function\") {\n intervalLog = func(intervalLog, null);\n if (!intervalLog) {\n return false;\n }\n }\n }\n\n if (intervalLog) logs.push(intervalLog);\n\n // Reset\n intervalId = target;\n intervalType = type;\n intervalPath = path;\n intervalTimer = timestamp;\n intervalCounter = 0;\n }\n\n // Interval is still occuring, just update counter\n if (intervalId == target && intervalType == type && intervalCounter) {\n intervalCounter = intervalCounter + 1;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts coordinate information from the event\n * depending on a few browser quirks.\n * @param {Event} e The event to extract coordinate information from.\n * @return {Object} An object containing nullable x and y coordinates for the event.\n */\nexport function getLocation(e: Event) {\n if (e instanceof MouseEvent) {\n if (e.pageX != null) {\n return { x: e.pageX, y: e.pageY };\n } else if (e.clientX != null) {\n return {\n x: document.documentElement.scrollLeft + e.clientX,\n y: document.documentElement.scrollTop + e.clientY,\n };\n }\n } else {\n return { x: null, y: null };\n }\n}\n\n/**\n * Extracts innerWidth and innerHeight to provide estimates of screen resolution\n * @return {Object} An object containing the innerWidth and InnerHeight\n */\nexport function getScreenRes() {\n return { width: self.innerWidth, height: self.innerHeight };\n}\n\n/**\n * Builds a string CSS selector from the provided element\n * @param {EventTarget} ele The element from which the selector is built.\n * @return {string} The CSS selector for the element, or Unknown if it can't be determined.\n */\nexport function getSelector(ele: EventTarget) {\n if (ele instanceof HTMLElement || ele instanceof Element) {\n if (ele.localName) {\n return (\n ele.localName +\n (ele.id ? \"#\" + ele.id : \"\") +\n (ele.className ? \".\" + ele.className : \"\")\n );\n } else if (ele.nodeName) {\n return (\n ele.nodeName +\n (ele.id ? \"#\" + ele.id : \"\") +\n (ele.className ? \".\" + ele.className : \"\")\n );\n }\n } else if (ele instanceof Document) {\n return \"#document\";\n } else if (ele === globalThis) {\n return \"Window\";\n }\n return \"Unknown\";\n}\n\n/**\n * Builds an array of elements from the provided event target, to the root element.\n * @param {Event} e Event from which the path should be built.\n * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element.\n */\nexport function buildPath(e: Event) {\n const path = e.composedPath();\n return selectorizePath(path);\n}\n\n/**\n * Builds a CSS selector path from the provided list of elements.\n * @param {EventTarget[]} path Array of HTML Elements from which the path should be built.\n * @return {string[]} Array of string CSS selectors.\n */\nexport function selectorizePath(path: EventTarget[]) {\n let i = 0;\n let pathEle;\n const pathSelectors: string[] = [];\n while ((pathEle = path[i])) {\n pathSelectors.push(getSelector(pathEle));\n ++i;\n pathEle = path[i];\n }\n return pathSelectors;\n}\n\n/**\n * Builds an object containing attributes of an element.\n * Attempts to parse all attribute values as JSON text.\n * @param {Event} e Event from which the target element's attributes should be extracted.\n * @return {Record} Object with element attributes as key-value pairs.\n */\nexport function buildAttrs(e: Event): Record {\n const attributes: Record = {};\n const attributeBlackList = [\"style\"];\n\n if (e.target && e.target instanceof Element) {\n for (const attr of e.target.attributes) {\n if (attributeBlackList.includes(attr.name)) continue;\n let val: any = attr.value;\n try {\n val = JSON.parse(val);\n } catch {\n // Ignore parsing errors, fallback to raw string value\n }\n attributes[attr.name] = val;\n }\n }\n\n return attributes;\n}\n\n/**\n * Builds an object containing all CSS properties of an element.\n * @param {Event} e Event from which the target element's properties should be extracted.\n * @return {Record} Object with all CSS properties as key-value pairs.\n */\nexport function buildCSS(e: Event): Record {\n const properties: Record = {};\n if (e.target && e.target instanceof HTMLElement) {\n const styleObj = e.target.style;\n for (let i = 0; i < styleObj.length; i++) {\n const prop = styleObj[i];\n properties[prop] = styleObj.getPropertyValue(prop);\n }\n }\n return properties;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { packageLog, packageIntervalLog } from \"@/packageLogs\";\nimport { Events, Logging, Settings } from \"@/types\";\nimport { Configuration } from \"@/configure\";\n\n//@todo: Investigate drag events and their behavior\nlet events: Events.EventDetailsMap;\nlet bufferBools: Events.EventBoolMap;\nlet bufferedEvents: Events.EventDetailsMap;\nlet refreshEvents: Events.EventDetailsMap;\nconst intervalEvents: Array = [\n \"click\",\n \"focus\",\n \"blur\",\n \"input\",\n \"change\",\n \"mouseover\",\n \"submit\",\n];\nconst windowEvents: Array = [\"load\", \"blur\", \"focus\"];\n\n/**\n * Maps a MouseEvent to an object containing useful information.\n * @param {MouseEvent} e Event to extract data from\n */\nexport function extractMouseDetails(e: MouseEvent) {\n return {\n clicks: e.detail,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n // 'text' : e.target.innerHTML\n };\n}\n\n/** Maps a KeyboardEvent to an object containing useful infromation\n * @param {KeyboardEvent} e Event to extract data from\n */\nexport function extractKeyboardDetails(e: KeyboardEvent) {\n return {\n key: e.key,\n code: e.code,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\n/**\n * Maps an InputEvent to an object containing useful information.\n * @param {InputEvent} e Event to extract data from\n */\nexport function extractInputDetails(e: InputEvent) {\n return {\n value: (e.target as HTMLInputElement).value,\n };\n}\n\n/**\n * Maps a ChangeEvent to an object containing useful information.\n * @param {Events.ChangeEvent} e Event to extract data from\n */\nexport function extractChangeDetails(e: Events.ChangeEvent) {\n return {\n value: e.target.value,\n };\n}\n\n/**\n * Maps a WheelEvent to an object containing useful information.\n * @param {WheelEvent} e Event to extract data from\n */\nexport function extractWheelDetails(e: WheelEvent) {\n return {\n x: e.deltaX,\n y: e.deltaY,\n z: e.deltaZ,\n };\n}\n\n/**\n * Maps a ScrollEvent to an object containing useful information.\n */\nexport function extractScrollDetails() {\n return {\n x: window.scrollX,\n y: window.scrollY,\n };\n}\n\n/**\n * Maps a ResizeEvent to an object containing useful information.\n */\nexport function extractResizeDetails() {\n return {\n width: window.outerWidth,\n height: window.outerHeight,\n };\n}\n\n/**\n * Defines the way information is extracted from various events.\n * Also defines which events we will listen to.\n * @param {Settings.Config} config Configuration object to read from.\n */\nexport function defineDetails(config: Settings.DefaultConfig): void {\n // Events list\n // Keys are event types\n // Values are functions that return details object if applicable\n events = {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n input: config.logDetails ? extractKeyboardDetails : null,\n change: config.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: config.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n };\n\n bufferBools = {};\n bufferedEvents = {\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n };\n\n refreshEvents = {\n submit: null,\n };\n}\n\n/**\n * Defines the way information is extracted from various events.\n * Also defines which events we will listen to.\n * @param {Settings.Config} options UserALE Configuration object to read from.\n * @param {Events.AllowedEvents} type of html event (e.g., 'click', 'mouseover', etc.), such as passed to addEventListener methods.\n */\nexport function defineCustomDetails(\n options: Settings.DefaultConfig,\n type: Events.AllowedEvents,\n): Logging.DynamicDetailFunction | null | undefined {\n // Events list\n // Keys are event types\n // Values are functions that return details object if applicable\n const eventType: Events.EventDetailsMap = {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n load: null,\n input: options.logDetails ? extractKeyboardDetails : null,\n change: options.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: options.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n submit: null,\n };\n return eventType[type];\n}\n\n/**\n * Hooks the event handlers for each event type of interest.\n * @param {Configuration} config Configuration singleton to use.\n * @return {boolean} Whether the operation succeeded\n */\nexport function attachHandlers(config: Configuration): boolean {\n try {\n defineDetails(config);\n\n (Object.keys(events) as Events.AllowedEvents[]).forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packageLog(e, events[ev]);\n },\n true,\n );\n });\n\n intervalEvents.forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packageIntervalLog(e);\n },\n true,\n );\n });\n\n (Object.keys(bufferedEvents) as Events.BufferedEvents[]).forEach(\n function (ev) {\n bufferBools[ev] = true;\n\n self.addEventListener(\n ev,\n function (e) {\n if (bufferBools[ev]) {\n bufferBools[ev] = false;\n packageLog(e, bufferedEvents[ev]);\n setTimeout(function () {\n bufferBools[ev] = true;\n }, config.resolution);\n }\n },\n true,\n );\n },\n );\n\n (Object.keys(refreshEvents) as Events.RefreshEvents[]).forEach(\n function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packageLog(e, events[ev]);\n },\n true,\n );\n },\n );\n\n windowEvents.forEach(function (ev) {\n self.addEventListener(\n ev,\n function (e) {\n packageLog(e, function () {\n return { window: true };\n });\n },\n true,\n );\n });\n\n return true;\n } catch {\n return false;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/configure\";\nimport { Callbacks } from \"@/types\";\n\nexport let authCallback: Callbacks.AuthCallback | null = null;\n\n/**\n * Fetches the most up-to-date auth header string from the auth callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Function} authCallback Callback used to fetch the newest header.\n * @returns {void}\n */\nexport function updateAuthHeader(config: Configuration) {\n if (authCallback) {\n try {\n config.authHeader = authCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the authCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the auth header: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.AuthCallback} callback Callback used to fetch the newest header. Should return a string.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerAuthCallback(callback: Callbacks.AuthCallback) {\n try {\n verifyCallback(callback);\n authCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Function} callback Callback used to fetch the newest header. Should return a string.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.AuthCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale auth callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"string\") {\n throw new Error(\"Userale auth callback must return a string\");\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetAuthCallback() {\n authCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/configure\";\nimport { Callbacks } from \"@/types\";\n\nexport let headersCallback: Callbacks.HeadersCallback | null = null;\n\n/**\n * Fetches the most up-to-date custom headers object from the headers callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Callbacks.HeadersCallback} headersCallback Callback used to fetch the newest headers.\n * @returns {void}\n */\nexport function updateCustomHeaders(config: Configuration) {\n if (headersCallback) {\n try {\n config.headers = headersCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the headersCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the headers: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest headers. Should return an object.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerHeadersCallback(callback: Callbacks.HeadersCallback) {\n try {\n verifyCallback(callback);\n headersCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest header. Should return an object.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.HeadersCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale headers callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"object\") {\n throw new Error(\"Userale headers callback must return an object\");\n }\n for (const [key, value] of Object.entries(result)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n throw new Error(\n \"Userale header callback must return an object with string keys and values\",\n );\n }\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetHeadersCallback() {\n headersCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the 'License'); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Settings } from \"./types\";\n\nlet sessionId: string | null = null;\nlet httpSessionId: string | null = null;\n\n/**\n * Extracts the initial configuration settings from the\n * currently executing script tag.\n * @return {Object} The extracted configuration object\n */\nexport function getInitialSettings(): Settings.Config {\n if (\n typeof WorkerGlobalScope !== \"undefined\" &&\n self instanceof WorkerGlobalScope\n ) {\n const settings: Settings.Config = {\n authHeader: null,\n autostart: true,\n browserSessionId: null,\n custIndex: null,\n headers: null,\n httpSessionId: null,\n logCountThreshold: +5,\n logDetails: false,\n resolution: +500,\n sessionId: sessionId,\n time: (ts?: number) => (ts !== undefined ? ts : Date.now()),\n toolName: null,\n toolVersion: null,\n transmitInterval: +5000,\n url: \"http://localhost:8000\",\n useraleVersion: null,\n userFromParams: null,\n userId: null,\n };\n return settings;\n }\n\n if (sessionId === null) {\n sessionId = getsessionId(\n \"userAlesessionId\",\n \"session_\" + String(Date.now()),\n );\n }\n\n if (httpSessionId === null) {\n httpSessionId = getsessionId(\n \"userAleHttpSessionId\",\n generatehttpSessionId(),\n );\n }\n\n const script =\n document.currentScript ||\n (function () {\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n })();\n\n const get = script\n ? script.getAttribute.bind(script)\n : function () {\n return null;\n };\n const headers = get(\"data-headers\");\n const settings: Settings.Config = {\n authHeader: get(\"data-auth\") || null,\n autostart: get(\"data-autostart\") === \"false\" ? false : true,\n browserSessionId: null,\n custIndex: get(\"data-index\") || null,\n headers: headers ? JSON.parse(headers) : null,\n httpSessionId: httpSessionId,\n logCountThreshold: +(get(\"data-threshold\") || 5),\n logDetails: get(\"data-log-details\") === \"true\" ? true : false,\n resolution: +(get(\"data-resolution\") || 500),\n sessionId: get(\"data-session\") || sessionId,\n time: timeStampScale(document.createEvent(\"CustomEvent\")),\n toolName: get(\"data-tool\") || null,\n toolVersion: get(\"data-version\") || null,\n transmitInterval: +(get(\"data-interval\") || 5000),\n url: get(\"data-url\") || \"http://localhost:8000\",\n useraleVersion: get(\"data-userale-version\") || null,\n userFromParams: get(\"data-user-from-params\") || null,\n userId: get(\"data-user\") || null,\n };\n return settings;\n}\n\n/**\n * defines sessionId, stores it in sessionStorage, checks to see if there is a sessionId in\n * storage when script is started. This prevents events like 'submit', which refresh page data\n * from refreshing the current user session\n *\n */\nexport function getsessionId(sessionKey: string, value: any) {\n if (self.sessionStorage.getItem(sessionKey) === null) {\n self.sessionStorage.setItem(sessionKey, JSON.stringify(value));\n return value;\n }\n\n return JSON.parse(self.sessionStorage.getItem(sessionKey) || \"\");\n}\n\n/**\n * Creates a function to normalize the timestamp of the provided event.\n * @param {Event} e An event containing a timeStamp property.\n * @return {typeof timeStampScale~tsScaler} The timestamp normalizing function.\n */\nexport function timeStampScale(e: Event): Settings.TimeFunction {\n let tsScaler: Settings.TimeFunction;\n if (e.timeStamp && e.timeStamp > 0) {\n const delta = Date.now() - e.timeStamp;\n /**\n * Returns a timestamp depending on various browser quirks.\n * @param {?Number} ts A timestamp to use for normalization.\n * @return {Number} A normalized timestamp.\n */\n\n if (delta < 0) {\n tsScaler = function () {\n return e.timeStamp / 1000;\n };\n } else if (delta > e.timeStamp) {\n const navStart = performance.timeOrigin;\n tsScaler = function (ts) {\n return ts + navStart;\n };\n } else {\n tsScaler = function (ts) {\n return ts;\n };\n }\n } else {\n tsScaler = function () {\n return Date.now();\n };\n }\n\n return tsScaler;\n}\n\n/**\n * Creates a cryptographiclly random string to represent this http session.\n * @return {String} A random 32 digit hex string\n */\nfunction generatehttpSessionId(): string {\n // 32 digit hex -> 128 bits of info -> 2^64 ~= 10^19 sessions needed for 50% chance of collison\n const len = 32;\n const arr = new Uint8Array(len / 2);\n window.crypto.getRandomValues(arr);\n return Array.from(arr, (dec) => {\n return dec.toString(16).padStart(2, \"0\");\n }).join(\"\");\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInitialSettings } from \"@/getInitialSettings\";\nimport type { Settings } from \"@/types\";\n\n// Singleton Configuration class\nexport class Configuration {\n [key: string]: Settings.ConfigValueTypes;\n // Private static property to hold the singleton instance\n private static instance: Configuration | null = null;\n\n // Public properties corresponding to fields in the Config interface\n public autostart: boolean = false;\n public authHeader: Settings.AuthHeader = null;\n public browserSessionId: Settings.SessionId = null;\n public custIndex: Settings.CustomIndex = null;\n public headers: Settings.Headers = null;\n public httpSessionId: Settings.SessionId = null;\n public logCountThreshold: number = 0;\n public logDetails: boolean = false;\n public on: boolean = false;\n public resolution: number = 0;\n public sessionId: Settings.SessionId = null;\n public time: Settings.TimeFunction = () => Date.now();\n public toolName: Settings.ToolName = null;\n public toolVersion: Settings.Version = null;\n public transmitInterval: number = 0;\n public url: string = \"\";\n public userFromParams: Settings.UserFromParams = null;\n public useraleVersion: Settings.Version = null;\n public userId: Settings.UserId = null;\n public version: Settings.Version = null;\n public websocketsEnabled: boolean = false;\n\n // Private constructor to prevent external instantiation\n private constructor() {\n // Call the initialization method only if it's the first time instantiating\n if (Configuration.instance === null) {\n this.initialize();\n }\n }\n\n // Static method to get the singleton instance\n public static getInstance(): Configuration {\n if (Configuration.instance === null) {\n Configuration.instance = new Configuration();\n }\n return Configuration.instance;\n }\n\n private initialize(): void {\n const settings = getInitialSettings();\n this.update(settings);\n }\n\n /**\n * Resets the configuration to its initial state.\n */\n public reset(): void {\n this.initialize();\n }\n\n /**\n * Shallow merges a newConfig with the configuration class, updating it.\n * Retrieves/updates the userid if userFromParams is provided.\n * @param {Partial} newConfig Configuration object to merge into the current config.\n */\n public update(newConfig: Partial): void {\n Object.keys(newConfig).forEach((option) => {\n if (option === \"userFromParams\") {\n const userParamString = newConfig[option] as Settings.UserFromParams;\n const userId = userParamString\n ? Configuration.getUserIdFromParams(userParamString)\n : null;\n if (userId) {\n this[\"userId\"] = userId;\n }\n }\n const hasNewUserFromParams = newConfig[\"userFromParams\"];\n const willNullifyUserId =\n option === \"userId\" && newConfig[option] === null;\n if (willNullifyUserId && hasNewUserFromParams) {\n return;\n }\n\n const newOption = newConfig[option];\n if (newOption !== undefined) {\n this[option] = newOption;\n }\n });\n }\n\n /**\n * Attempts to extract the userid from the query parameters of the URL.\n * @param {string} param The name of the query parameter containing the userid.\n * @return {string | null} The extracted/decoded userid, or null if none is found.\n */\n public static getUserIdFromParams(param: string) {\n const userField = param;\n const regex = new RegExp(\"[?&]\" + userField + \"(=([^&#]*)|&|#|$)\");\n const results = window.location.href.match(regex);\n\n if (results && results[2]) {\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n }\n return null;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/configure\";\nimport { Logging } from \"@/types\";\nimport { updateAuthHeader, updateCustomHeaders } from \"@/utils\";\n\nlet sendIntervalId: string | number | NodeJS.Timeout | undefined;\nlet wsock: WebSocket;\n\n/**\n * Initializes the log queue processors.\n * @param {Array} logs Array of logs to append to.\n * @param {Configuration} config Configuration object to use when logging.\n */\nexport function initSender(logs: Array, config: Configuration) {\n if (sendIntervalId) {\n clearInterval(sendIntervalId);\n }\n\n const url = new URL(config.url);\n if (url.protocol === \"ws:\" || url.protocol === \"wss:\") {\n wsock = new WebSocket(config.url);\n }\n\n sendIntervalId = sendOnInterval(logs, config);\n sendOnClose(logs, config);\n}\n\n/**\n * Checks the provided log array on an interval, flushing the logs\n * if the queue has reached the threshold specified by the provided config.\n * @param {Array} logs Array of logs to read from.\n * @param {Configuration} config Configuration singleton to be read from.\n * @return {Number} The newly created interval id.\n */\nexport function sendOnInterval(\n logs: Array,\n config: Configuration,\n): NodeJS.Timeout {\n return setInterval(function () {\n if (!config.on) {\n return;\n }\n\n if (logs.length >= config.logCountThreshold) {\n sendLogs(logs.slice(0), config, 0); // Send a copy\n logs.splice(0); // Clear array reference (no reassignment)\n }\n }, config.transmitInterval);\n}\n\n// /**\n// * Attempts to flush the remaining logs when the window is closed.\n// * @param {Array} logs Array of logs to be flushed.\n// * @param {Configuration} config Configuration singleton to be read from.\n// */\nexport function sendOnClose(\n logs: Array,\n config: Configuration,\n): void {\n self.addEventListener(\"pagehide\", function () {\n if (!config.on) {\n return;\n }\n\n if (logs.length > 0) {\n const url = new URL(config.url);\n\n if (url.protocol === \"ws:\" || url.protocol === \"wss:\") {\n const data = JSON.stringify(logs);\n wsock.send(data);\n } else {\n const headers: HeadersInit = new Headers();\n headers.set(\"Content-Type\", \"application/json;charset=UTF-8\");\n\n if (config.authHeader) {\n headers.set(\"Authorization\", config.authHeader.toString());\n }\n\n fetch(config.url, {\n keepalive: true,\n method: \"POST\",\n headers: headers,\n body: JSON.stringify(logs),\n }).catch((error) => {\n console.error(error);\n });\n }\n logs.splice(0); // clear log queue\n }\n });\n}\n\n/**\n * Sends the provided array of logs to the specified url,\n * retrying the request up to the specified number of retries.\n * @param {Array} logs Array of logs to send.\n * @param {Configuration} config configuration singleton.\n * @param {Number} retries Maximum number of attempts to send the logs.\n */\nexport async function sendLogs(\n logs: Array,\n config: Configuration,\n retries: number,\n): Promise {\n const data = JSON.stringify(logs);\n const url = new URL(config.url);\n\n if (url.protocol === \"ws:\" || url.protocol === \"wss:\") {\n wsock.send(data);\n return;\n }\n\n // Build headers\n const headers = new Headers({\n \"Content-Type\": \"application/json;charset=UTF-8\",\n });\n\n updateAuthHeader(config);\n if (config.authHeader) {\n const authHeaderValue =\n typeof config.authHeader === \"function\"\n ? config.authHeader()\n : config.authHeader;\n headers.set(\"Authorization\", authHeaderValue);\n }\n\n // Update custom headers last to allow them to over-write the defaults. This assumes\n // the user knows what they are doing and may want to over-write the defaults.\n updateCustomHeaders(config);\n if (config.headers) {\n for (const [header, value] of Object.entries(config.headers)) {\n headers.set(header, value);\n }\n }\n\n async function attemptSend(remainingRetries: number): Promise {\n try {\n const response = await fetch(config.url, {\n method: \"POST\",\n headers,\n body: data,\n });\n\n if (!response.ok) {\n if (remainingRetries > 0) {\n return attemptSend(remainingRetries - 1);\n } else {\n throw new Error(`Failed to send logs: ${response.statusText}`);\n }\n }\n } catch (error) {\n if (remainingRetries > 0) {\n return attemptSend(remainingRetries - 1);\n }\n throw error;\n }\n }\n\n return attemptSend(retries);\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { defineCustomDetails } from \"@/attachHandlers\";\nimport { registerAuthCallback } from \"@/utils\";\nimport {\n addCallbacks,\n removeCallbacks,\n packageLog,\n packageCustomLog,\n getSelector,\n buildPath,\n initPackager,\n} from \"@/packageLogs\";\nimport { version as userAleVersion } from \"../package.json\";\nimport { Configuration } from \"@/configure\";\nimport { attachHandlers } from \"@/attachHandlers\";\nimport { initSender } from \"@/sendLogs\";\n\nimport type { Settings, Logging } from \"@/types\";\n\nconst config = Configuration.getInstance();\nconst logs: Array = [];\n\nconst startLoadTimestamp = Date.now();\nlet endLoadTimestamp: number;\nself.onload = function () {\n endLoadTimestamp = Date.now();\n};\n\nexport let started = false;\nexport { defineCustomDetails as details } from \"@/attachHandlers\";\nexport { registerAuthCallback as registerAuthCallback } from \"@/utils\";\nexport {\n addCallbacks as addCallbacks,\n removeCallbacks as removeCallbacks,\n packageLog as packageLog,\n packageCustomLog as packageCustomLog,\n getSelector as getSelector,\n buildPath as buildPath,\n} from \"@/packageLogs\";\nexport type { Logging } from \"@/types\";\n\nconfig.update({\n useraleVersion: userAleVersion,\n});\ninitPackager(logs, config);\nif (config.autostart) {\n setup(config);\n}\n\n/**\n * Hooks the global event listener, and starts up the\n * logging interval.\n * @param {Configuration} config Configuration settings for the logger\n */\nfunction setup(config: Configuration) {\n if (!started) {\n setTimeout(function () {\n let state;\n try {\n state = document.readyState;\n } catch (error) {\n // Assume there is no DOM and this is a web worker context\n state = \"complete\";\n }\n\n if (\n config.autostart &&\n (state === \"interactive\" || state === \"complete\")\n ) {\n attachHandlers(config);\n initSender(logs, config);\n started = config.on = true;\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n packageCustomLog(\n {\n type: \"load\",\n details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp },\n },\n () => ({}),\n false,\n );\n }\n } else {\n setup(config);\n }\n }, 100);\n }\n}\n\n// Export the Userale API\nexport const version = userAleVersion;\n\n/**\n * Used to start the logging process if the\n * autostart configuration option is set to false.\n */\nexport function start(): void {\n if (!started || config.autostart === false) {\n started = config.on = true;\n config.update({ autostart: true });\n }\n}\n\n/**\n * Halts the logging process. Logs will no longer be sent.\n */\nexport function stop(): void {\n started = config.on = false;\n config.update({ autostart: false });\n}\n\n/**\n * Updates the current configuration\n * object with the provided values.\n * @param {Partial} newConfig The configuration options to use.\n * @return {Settings.Config} Returns the updated configuration.\n */\nexport function options(\n newConfig: Partial | undefined,\n): Settings.Config {\n if (newConfig) {\n config.update(newConfig);\n }\n\n return config;\n}\n\n/**\n * Appends a log to the log queue.\n * @param {Logging.CustomLog} customLog The log to append.\n * @return {boolean} Whether the operation succeeded.\n */\nexport function log(customLog: Logging.CustomLog | undefined) {\n if (customLog) {\n logs.push(customLog);\n return true;\n } else {\n return false;\n }\n}\n\n// Only attach to window in IIFE builds\nif (typeof window !== \"undefined\") {\n (window as any).userale = {\n start,\n stop,\n options,\n log,\n version: userAleVersion,\n details: defineCustomDetails,\n registerAuthCallback,\n addCallbacks,\n removeCallbacks,\n packageLog,\n packageCustomLog,\n getSelector,\n buildPath,\n };\n}\n"],"mappings":"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","names":["descriptors","log","config","options","config","config","settings","logs","config","config","logs","version"]} \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/packageLogs.d.ts b/products/userale/packages/flagon-userale/build/packageLogs.d.ts deleted file mode 100644 index b5b0ff8..0000000 --- a/products/userale/packages/flagon-userale/build/packageLogs.d.ts +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Callbacks, Logging } from "@/types"; -import { Configuration } from "@/configure"; -export declare let logs: Array; -export declare const filterHandler: CallableFunction | null; -export declare const mapHandler: CallableFunction | null; -export declare let cbHandlers: Callbacks.CallbackMap; -/** - * Adds named callbacks to be executed when logging. - * @param {Object } newCallbacks An object containing named callback functions. - */ -export declare function addCallbacks(...newCallbacks: Record[]): Callbacks.CallbackMap; -/** - * Removes callbacks by name. - * @param {String[]} targetKeys A list of names of functions to remove. - */ -export declare function removeCallbacks(targetKeys: string[]): void; -/** - * Assigns the config and log container to be used by the logging functions. - * @param {Array} newLogs Log container. - * @param {Object} newConfig Configuration to use while logging. - */ -export declare function initPackager(newLogs: Array, newConfig: Configuration): void; -/** - * Transforms the provided HTML event into a log and appends it to the log queue. - * @param {Event} e The event to be logged. - * @param {Function} detailFcn The function to extract additional log parameters from the event. - * @return {boolean} Whether the event was logged. - */ -export declare function packageLog(e: Event, detailFcn?: Logging.DynamicDetailFunction | null): boolean; -/** - * Packages the provided customLog to include standard meta data and appends it to the log queue. - * @param {Logging.CustomLog} customLog The behavior to be logged. - * @param {Logging.DynamicDetailFunction} detailFcn The function to extract additional log parameters from the event. - * @param {boolean} userAction Indicates user behavior (true) or system behavior (false) - * @return {boolean} Whether the event was logged. - */ -export declare function packageCustomLog(customLog: Logging.CustomLog, detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, userAction: boolean): boolean; -/** - * Extract the millisecond and microsecond portions of a timestamp. - * @param {Number} timeStamp The timestamp to split into millisecond and microsecond fields. - * @return {Object} An object containing the millisecond - * and microsecond portions of the timestamp. - */ -export declare function extractTimeFields(timeStamp: number): { - milli: number; - micro: number; -}; -/** - * Track intervals and gather details about it. - * @param {Object} e - * @return boolean - */ -export declare function packageIntervalLog(e: Event): boolean; -/** - * Extracts coordinate information from the event - * depending on a few browser quirks. - * @param {Event} e The event to extract coordinate information from. - * @return {Object} An object containing nullable x and y coordinates for the event. - */ -export declare function getLocation(e: Event): { - x: number; - y: number; -} | { - x: null; - y: null; -} | undefined; -/** - * Extracts innerWidth and innerHeight to provide estimates of screen resolution - * @return {Object} An object containing the innerWidth and InnerHeight - */ -export declare function getScreenRes(): { - width: number; - height: number; -}; -/** - * Builds a string CSS selector from the provided element - * @param {EventTarget} ele The element from which the selector is built. - * @return {string} The CSS selector for the element, or Unknown if it can't be determined. - */ -export declare function getSelector(ele: EventTarget): string; -/** - * Builds an array of elements from the provided event target, to the root element. - * @param {Event} e Event from which the path should be built. - * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element. - */ -export declare function buildPath(e: Event): string[]; -/** - * Builds a CSS selector path from the provided list of elements. - * @param {EventTarget[]} path Array of HTML Elements from which the path should be built. - * @return {string[]} Array of string CSS selectors. - */ -export declare function selectorizePath(path: EventTarget[]): string[]; -/** - * Builds an object containing attributes of an element. - * Attempts to parse all attribute values as JSON text. - * @param {Event} e Event from which the target element's attributes should be extracted. - * @return {Record} Object with element attributes as key-value pairs. - */ -export declare function buildAttrs(e: Event): Record; -/** - * Builds an object containing all CSS properties of an element. - * @param {Event} e Event from which the target element's properties should be extracted. - * @return {Record} Object with all CSS properties as key-value pairs. - */ -export declare function buildCSS(e: Event): Record; -//# sourceMappingURL=packageLogs.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/build/sendLogs.d.ts b/products/userale/packages/flagon-userale/build/sendLogs.d.ts deleted file mode 100644 index 8a3ed1d..0000000 --- a/products/userale/packages/flagon-userale/build/sendLogs.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Configuration } from "@/configure"; -import { Logging } from "@/types"; -/** - * Initializes the log queue processors. - * @param {Array} logs Array of logs to append to. - * @param {Configuration} config Configuration object to use when logging. - */ -export declare function initSender(logs: Array, config: Configuration): void; -/** - * Checks the provided log array on an interval, flushing the logs - * if the queue has reached the threshold specified by the provided config. - * @param {Array} logs Array of logs to read from. - * @param {Configuration} config Configuration singleton to be read from. - * @return {Number} The newly created interval id. - */ -export declare function sendOnInterval(logs: Array, config: Configuration): NodeJS.Timeout; -export declare function sendOnClose(logs: Array, config: Configuration): void; -/** - * Sends the provided array of logs to the specified url, - * retrying the request up to the specified number of retries. - * @param {Array} logs Array of logs to send. - * @param {Configuration} config configuration singleton. - * @param {Number} retries Maximum number of attempts to send the logs. - */ -export declare function sendLogs(logs: Array, config: Configuration, retries: number): Promise; -//# sourceMappingURL=sendLogs.d.ts.map \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/Dockerfile b/products/userale/packages/flagon-userale/example/Dockerfile deleted file mode 100644 index 18d2464..0000000 --- a/products/userale/packages/flagon-userale/example/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -ARG BUILDPLATFORM=${BUILDPLATFORM:-amd64} -FROM --platform=${BUILDPLATFORM} node:18-bullseye-slim AS flagon-node - -WORKDIR /app -RUN --mount=type=bind,target=./package.json,src=./package.json \ - --mount=type=bind,target=./package-lock.json,src=./package-lock.json \ - npm ci --ignore-scripts -COPY ./src src/ -COPY ./example example/ - - -EXPOSE 8000 -ENTRYPOINT ["node"] diff --git a/products/userale/packages/flagon-userale/example/README.md b/products/userale/packages/flagon-userale/example/README.md deleted file mode 100644 index 861783e..0000000 --- a/products/userale/packages/flagon-userale/example/README.md +++ /dev/null @@ -1,144 +0,0 @@ - -# The UserALE Example Utility - -This directory provides - * example usage for UserALE deployed as a **script tag** within a simple HTML Webpage; - * a testing utility for developers to evaluate UserALE modifications to logged events; - * a means of viewing log event structure within a simple UserALE logging server; - * a means of testing UserALE API functions within a simple HTML Webpage. - -If you are interested in examples for a **module** deployment methodology, see the README in the [/webpack examples directory](https://github.com/apache/flagon-useralejs/tree/master/example/webpackUserAleExample). For details about our web extension, see -our [UserALE WebExtension documentation](https://github.com/apache/flagon-useralejs/tree/master/src/UserALEWebExtension). - -## Prerequisites - -Ensure that you have [node.js](https://nodejs.org/) installed. - -You will need to clone the [UserALE repository](https://github.com/apache/flagon-useralejs) and follow [Installation directions](https://github.com/apache/flagon-useralejs#installation). - -## Using the Example Page - -This Example Page is a simple HTML Webpage with UserALE included as a **script tag**. - -To generate UserALE logs with the Example Page, you may need to modify the 'src' HTML5 parameter of the UserALE script tag. - -The `src` parameter should reference the file path to your version of the minified UserALE script, in the /build dir of your cloned `flagon-useralejs` repository or `flagon-userale` node module. See the snippet below. - -``` - -``` -Once you've modified the script tag `src` field, save `index.html`. - -Next open index.html in your browser (you can drag it directly into a tab or double-click it). - -You will see a very simple HTML Webpage with a few interactive features. - -On this page, all user events will be captured and sent to the logging server. See instructions below. - -## Testing with the Example Page - -The UserALE Example page can be used to test the structure of logs after instrumentation or UserALE src code modification. It can also be used to experiment with UserALE API functions. - -In order to experiment with various elements of the UserALE API, simply modify the well documented API examples in `index.js`. Details about the API can be found at the [UserALE parent README](https://github.com/apache/flagon-useralejs/tree/FLAGON-469). However, a complete list of exported functions in the API can be found below: - -| Function | Description | Notes | -|---|---|---| -| userale.options | modify userale's configuration option | see top level README for complete list of options | -| [DEPRECATED] userale.filter | filters out logs from logging queue by keys or values | filters are callbacks with global scope | -| [DEPRECATED] userale.map | modify/add log keys or values | mappings are callbacks with global scope | -| userale.addCallbacks | add one or more callbacks to be executed during log packaging | callbacks have global scope | -| userale.removeCallbacks | remove one or more callbacks by name | Removes callbacks added from userale.addCallbacks | -| userale.log | appends a custom log to the log queue | the custom log object is an object key:value pairs | -| userale.packageLog | transforms the provided event into a log and appends it to the log queue | designed for HTML events | -| userale.packageCustomLog | packages the provided customLog to include standard meta data and appends it to the log queue | designed for non HTML events| -| userale.details | defines the way information is extracted from various events | supports packageLog/packageCustomLog 'details' | -| userale.getSelector | builds a string CSS selector from the provided HTML element id | populates 'target' field in packaged logs | -| userale.buildPath| builds an array of elements from the provided event target, to the root element (DOM path) | populates the 'path' field in packaged logs | -| userale.start | used to start the logging process if | unecessary if 'autostart' is set to true in initial setting (default) | -| userale.stop | halts the logging process. Logs will no longer be sent | will need to invoke userale.start to restart logging | - -NOTE: Each modification of `index.html` or `index.js` will require that you both save the modifications and refresh the webpage in your browser. - -See the [Flagon website](http://flagon.apache.org/) for additional documentation on the [API](http://flagon.apache.org/docs/useralejs/API/) and [testing for scale](http://flagon.apache.org/docs/stack/scaling/). - -## Capturing Logs Using the Logging Server - -The example logging server receives log from any UserALE instrumented page at `localhost:8000`. - -This means you can test logs from your own instrumented application, the [UserALE WebExtension](https://github.com/apache/flagon-useralejs/tree/master/src/UserALEWebExtension), -or the UserALE Example Page, so long as the `data-url` parameter is set to `localhost:8000`. This is the default setting for both the WebExtension and UserALE Example Page. See the example above. - -Once your UserALE script tag is properly configured to point to a minified UserALE script, and `localhost:8000`, you can log to the Example Logging Server. - -from the `/example` directory or its parent directory, run the following: - -``` -$npm run example:watch -``` - -Once started you will see: - -``` -> flagon-userale@2.2.0 example:watch ... -> nodemon -w ./example example/server.js - -[nodemon] 1.19.1 -[nodemon] to restart at any time, enter `rs` -[nodemon] watching: ... -[nodemon] starting `node example/server.js` -UserAle Local running on port 8000 -``` - -Then start using your instrumented application, browser, or the UserALE Example Page, and you will see logs propagating in the terminal: - -``` - -[ { target: 'body', - path: [ 'body', 'html' ], - clientTime: 1504287557492, - location: { x: 0, y: 0 }, - type: 'keydown', - userAction: true, - details: null, - userId: 'example-user', - toolVersion: '2.2.0', - toolName: 'Apache UserALE Example', - useraleVersion: '2.2.0' }, - ... -] -``` - -Kill the logging script with `^C` or as you would any bash script. - -##Reviewing Logs Collected with the Example Server - -In addition to showing in your terminal, logs collected by the UserALE Example Server are written locally to file. - -Find them in `/logs` under the top level flagon-userale dir. A new log file will appear each time you restart the logging server. - -## Contributing - -Contributions are welcome! Simply [submit an issue](https://github.com/apache/flagon-useralejs/issues) for problems you encounter or submit a pull request for your feature or bug fix. The core team will review it and work with you to incorporate it into UserALE. \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/custom-non-user-events-example/README.md b/products/userale/packages/flagon-userale/example/custom-non-user-events-example/README.md deleted file mode 100644 index 7db8369..0000000 --- a/products/userale/packages/flagon-userale/example/custom-non-user-events-example/README.md +++ /dev/null @@ -1,64 +0,0 @@ - -## Logging Custom, Non-User Events Examples -UserALE' API provides significant customization options; you can use it extend UserALE' out-of-the-box capabilities and log non-user events. - -### XMLHttpRequests -For user-workflow segmentation or more comprehensive instrumentation, it may be desirable to capture when the client sends requests to other services. - - -```JavaScript - req.onreadystatechange = function () { - if (req.readyState == XMLHttpRequest.DONE) { - userale.log({ - clientTime: Date.now(), - type: 'XMLHttpRequest', - logType: 'custom', - userAction: 'false', - details: JSON.parse(req.response), - userId: userale.options().userId, - useraleVersion: userale.options().useraleVersion, - sessionId: userale.options().sessionId, - }); - } - } -``` -The example above uses the `userale.log` API, allowing users to script their own log. However, the same effect is achieve with the `userale.packageCustomLog` API, which adds custom user field to the canonical UserALE schema. - -The method above will similarly work with other types of requests (e.g., fetch, websocket, etc..) - -### Custom Integrations -In the example below, custom UserALE logs can be used for integration with other instrumentation packages such as [OpenTelemetry](https://github.com/open-telemetry/opentelemetry-js). We can grab traceId's created by OpenTelemetry for tracing client requests throughout distributed systems and associate them with UserALE Logs. See the `index.js` for complete example modified from the [OpenTelemetry UserInteraction Plugin](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/web/opentelemetry-instrumentation-user-interaction). -```JavaScript - req.onreadystatechange = function () { - if (req.readyState == XMLHttpRequest.DONE) { - userale.log({ - clientTime: Date.now(), - type: 'XMLHttpRequest', - logType: 'custom', - userAction: 'false', - details: JSON.parse(req.response), - userId: userale.options().userId, - useraleVersion: userale.options().useraleVersion, - sessionId: userale.options().sessionId, - traceId: trace.getSpan(context.active())._spanContext.traceId - }); - } - } -``` \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/custom-non-user-events-example/index.js b/products/userale/packages/flagon-userale/example/custom-non-user-events-example/index.js deleted file mode 100644 index 4b6564a..0000000 --- a/products/userale/packages/flagon-userale/example/custom-non-user-events-example/index.js +++ /dev/null @@ -1,89 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { - ConsoleSpanExporter, - SimpleSpanProcessor, -} from "@opentelemetry/sdk-trace-base"; -import { WebTracerProvider } from "@opentelemetry/sdk-trace-web"; -import { UserInteractionInstrumentation } from "@opentelemetry/instrumentation-user-interaction"; -import { ZoneContextManager } from "@opentelemetry/context-zone"; -import { registerInstrumentations } from "@opentelemetry/instrumentation"; -// or if you already have zone.js -// import { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep'; - -const userale = require("flagon-userale"); - -const provider = new WebTracerProvider({ - contextManager: new ZoneContextManager(), -}); - -provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); -provider.register(); - -registerInstrumentations({ - instrumentations: [new UserInteractionInstrumentation()], -}); - -// and some test -const btn1 = document.createElement("button"); -btn1.append(document.createTextNode("btn1")); -btn1.addEventListener("click", () => { - console.log("clicked"); -}); -document.querySelector("body").append(btn1); - -const btn2 = document.createElement("button"); -btn2.append(document.createTextNode("btn2")); -btn2.addEventListener("click", () => { - getData("https://httpbin.org/get").then(() => { - getData("https://httpbin.org/get").then(() => { - console.log("data downloaded 2"); - }); - getData("https://httpbin.org/get").then(() => { - console.log("data downloaded 3"); - }); - console.log("data downloaded 1"); - }); -}); -document.querySelector("body").append(btn2); - -function getData(url, resolve) { - return new Promise(async (resolve, reject) => { - const req = new XMLHttpRequest(); - req.open("GET", url, true); - req.setRequestHeader("Content-Type", "application/json"); - req.setRequestHeader("Accept", "application/json"); - req.send(); - req.onload = function () { - resolve(); - }; - req.onreadystatechange = function () { - if (req.readyState == XMLHttpRequest.DONE) { - console.log(req.response); - userale.log({ - clientTime: Date.now(), - type: "XMLHttpRequest", - logType: "custom", - userAction: "false", - details: JSON.parse(req.response), - userId: userale.options().userId, - useraleVersion: userale.options().useraleVersion, - sessionId: userale.options().sessionId, - traceId: trace.getSpan(context.active())._spanContext.traceId, - }); - } - }; - }); -} -// now click on buttons diff --git a/products/userale/packages/flagon-userale/example/index.html b/products/userale/packages/flagon-userale/example/index.html deleted file mode 100644 index 60268f9..0000000 --- a/products/userale/packages/flagon-userale/example/index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - UserALE - Example Page - - - - - - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - diff --git a/products/userale/packages/flagon-userale/example/index.js b/products/userale/packages/flagon-userale/example/index.js deleted file mode 100644 index bd0dfa1..0000000 --- a/products/userale/packages/flagon-userale/example/index.js +++ /dev/null @@ -1,176 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** Options API - * - * the 'options' API allows you to dynamically change UserALE params and set meta data values - * pass in variables or properties into the options object, such as from sessionStorage or localStorage - * NOTE: logDetails is set to true (default:false), this will log key strokes, inputs, and change events - * (be careful of your form data and auth workflows!) - */ -const changeMe = "me"; -window.userale.options({ - userId: changeMe, - logDetails: true, - toolName: "Apache UserALE Example (Custom)", -}); - -/**Filter API - -/**the 'filter' API allows you to eliminate logs you don't want - * use as a global filter and add classes of events or log types to eliminate - * or use in block scope to surgically eliminate logs from specific elements from an event handler - * The filter below reduces logs to capture click, change, select, scroll and submit events on index.html - * Note that for surgical filters, you may need to clear or reset back to a global filter callback - * the same is true for the 'map' API. See examples below: - */ -window.userale.addCallbacks({ - filter(log) { - var type_array = [ - "mouseup", - "mouseover", - "mousedown", - "keydown", - "dblclick", - "blur", - "focus", - "input", - "wheel", - ]; - var logType_array = ["interval"]; - if (type_array.includes(log.type) || logType_array.includes(log.logType)) { - return false; - } - return log; - }, -}); - -/**Log Mapping API - * - * the 'map' API allows you to add or modify new fields to your logs - * this example works with the "Click Me!" button at the top of index.html - */ -document.addEventListener("click", function (e) { - if (e.target.innerHTML === "Click Me!") { - window.userale.addCallbacks({ - map(log) { - return Object.assign({}, log, { - logType: "custom", - customLabel: "map & packageLog Example", - }); - }, - }); - window.userale.packageLog( - e, - window.userale.details(window.userale.options(), e.type) - ); - /**you'll want to reset the map callback function, or set a conditional (e.g., return log), else - * the callback may be applied to other events of the same class (e.g., click) */ - window.userale.removeCallbacks(["map"]); - } else { - return false; - } -}); - -/** Alternate Log Mapping API Example - * Build a global mapping function with conditional logic to modify logs for similar events - * this example works with the "Click Me!" button at the top of index.html - * Also, note that specifying log as a return will keep the scope of this callback limited to only the events you want - */ -//window.userale.map(function (log, e) { -// var targetsForLabels = ["button#test_button"]; -// if (targetsForLabels.includes(log.target)) { -// return Object.assign({}, log, { customLabel: e.target.innerHTML }); -// } else { -// return log; -// } -//}); - -/**'Log' API and Custom Log Functions - * - * the 'log' API generate custom events and add them to the log queue - * pass in any keys:values for fully customized logs - * utilize 'options' and other functions to streamline populating custom logs - * type 'log' into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "log") { - window.userale.log({ - target: window.userale.getSelector(e.target), - path: window.userale.buildPath(e), - clientTime: Date.now(), - type: e.type, - logType: "custom", - userAction: false, - details: { foo: "bar", bar: "foo" }, - customField1: "I can make this log look like anything I want", - customField2: "foo", - userId: window.userale.options().userId, - toolVersion: window.userale.options().version, - toolName: window.userale.options().toolName, - useraleVersion: window.userale.options().useraleVersion, - sessionId: window.userale.options().sessionId, - customLabel: "Custom Log Example", - }); - } -}); - -/**you can also use UserALE' own packaging function for HTML events to strive for standardization - * type 'packageLog into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "packageLog") { - /**You can then use the 'Mapping' API function to modify custom logs created with the packageLog function*/ - window.userale.addCallbacks({ - changeMap(log) { - var targetsForLabels = ["change"]; - if (targetsForLabels.includes(log.type)) { - return Object.assign({}, log, { - logType: "custom", - customLabel: "packageLog Example", - }); - } else { - return log; - } - }, - }); - /**You can also use the details function to package additional log meta data, or add custom details*/ - window.userale.packageLog( - e, - window.userale.details(window.userale.options(), e.type) - ); - } else { - return false; - } -}); - -/**you can also just add boilerplate UserALE meta data to custom logs with the packageCustomLog function - * type 'packageCustomLog into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "packageCustomLog") { - window.userale.packageCustomLog( - { - customLabel: "packageCustomLog Example", - customField1: "foo", - customField2: "bar", - }, - function () { - return { foo: "bar", bar: "foo" }; - }, - true - ); - } else { - return false; - } -}); diff --git a/products/userale/packages/flagon-userale/example/kafka-rest-router.js b/products/userale/packages/flagon-userale/example/kafka-rest-router.js deleted file mode 100644 index aac788e..0000000 --- a/products/userale/packages/flagon-userale/example/kafka-rest-router.js +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -const commander = require("commander"); -const { program } = require("commander"); -const express = require("express"); -const bodyParser = require("body-parser"); - -// Functions. -const myParseInt = (value, _dummyPrevious) => { - // parseInt takes a string and a radix - const parsedValue = parseInt(value, 10); - if (isNaN(parsedValue)) { - throw new commander.InvalidArgumentError("Not a number."); - } - return parsedValue; -}; - -const configureCors = (req, res, next) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "POST,OPTIONS"); - res.header( - "Access-Control-Allow-Headers", - "Content-Type, Authorization, Content-Length, X-Requested-With", - ); - - // intercept OPTIONS method - if ("OPTIONS" == req.method) { - res.sendStatus(200); - } else { - next(); - } -}; - -const transformAndForward = async (req, res) => { - try { - const body = typeof req.body === "string" ? JSON.parse(req.body) : req.body; - - // Sometimes UserALE sends empty buffers or empty objects, these need to be filtered out - const isEmptyArray = Array.isArray(body) && body.length === 0; - const isEmptyObject = - typeof body === "object" && - body !== null && - Object.keys(body).length === 0; - if (isEmptyArray || isEmptyObject) return; - - if (options.verbose) console.log(JSON.stringify(body, null, 3)); - - const transformedPayload = { - records: body.map((log) => ({ - key: log["sessionId"], - value: log, - })), - }; - - if (options.verbose) - console.log(JSON.stringify(transformedPayload, null, 3)); - - const response = await fetch(options.forwardTo, { - method: "POST", - body: JSON.stringify(transformedPayload), - headers: { "Content-Type": "application/json" }, - }); - - const statusCode = response.status; - - res.status(statusCode).send(`Forwarded status code: ${statusCode}`); - } catch (error) { - console.error("Error: ", error); - res.status(500).send("Internal service error"); - } -}; - -const gracefulShutdown = () => { - process.exit(); -}; - -// Args -program - .requiredOption("-f, --forward-to ", "Forwarding address") - .option("-p, --port ", "Port number", myParseInt, 8000) - .option("-v, --verbose", "Enable verbose mode", false) - .parse(process.argv); -const options = program.opts(); -console.log(options); - -// Configure app -const app = express(); - -app.set("port", options.port); -app.use(configureCors); -app.use(bodyParser.urlencoded({ extended: true, limit: "100mb" })); -app.use(bodyParser.json({ limit: "100mb" })); -app.use(bodyParser.text()); - -// Routes -app.post("/", transformAndForward); - -// Server -app.listen(app.get("port"), () => { - console.log( - "UserALE Karapace Router started...", - `\n\tPort: ${app.get("port")}`, - `\n\tForwarding address: ${options.forwardTo}`, - `\n\tVerbose: ${options.verbose}`, - ); -}); - -process.on("SIGTERM", () => gracefulShutdown()); -process.on("SIGINT", () => gracefulShutdown()); diff --git a/products/userale/packages/flagon-userale/example/log-label-example/README.md b/products/userale/packages/flagon-userale/example/log-label-example/README.md deleted file mode 100644 index 6e85e00..0000000 --- a/products/userale/packages/flagon-userale/example/log-label-example/README.md +++ /dev/null @@ -1,83 +0,0 @@ - -# Custom Log Label Examples - -The following are examples illustrating how to add custom labels to logs generated by UserALE. Custom labels are -useful in cases where one would prefer to use a more descriptive label for an element users interact with or when -logging information about a specific feature. - -## Adding Custom Labels to Logs - -#### Important Note -Please be aware that when adding custom logs without disabling raw logging for those specific logs, duplicate log entries will be generated: one for raw logs and another for custom logs. - -### Example 1 - -Consider the following HTML: - -```html - -
- -
-``` - -The following code snippet will add a custom field, `customLabel`, and send a log whenever the new feature button is -clicked: - -```js -window.userale.addCallbacks({ - map(log, e) { - // determine whether we want to add custom labels to the log - if (e && e.target.innerHTML !== 'New Feature') { - return log; // normal logging - } - // if the event occurred on the New Feature, add custom labeling - return { - ...log, - customLabel: 'New Feature', - logType: 'custom', - } - } -}); -``` - -### Example 2 - -Let's say you want to generate logs on custom events, or events not currently supported by UserALE. In this case, you -can add an event listener and use the `customPackageLog` function as shown below: - -```js - document.addEventListener('customEvent', function (e) { - window.userale.packageCustomLog({ - type: 'customEvent', - customLabel: 'custom label', - customField1: 'custom field', - }, () => ({customDetails: Date.now()}), true); - } -); -``` - -This event listener will now be invoked on the `customEvent` and send a custom log to the backend. Note that the -`packageCustomLog` function also adds the typical metadata used in the UserALE logs. - -Note that we only advise adding custom event listeners in the following scenarios: - -1. For events not captured natively by UserALE (as seen above) -2. For sending custom logs *only* diff --git a/products/userale/packages/flagon-userale/example/log-label-example/index.html b/products/userale/packages/flagon-userale/example/log-label-example/index.html deleted file mode 100644 index ca3f7fb..0000000 --- a/products/userale/packages/flagon-userale/example/log-label-example/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - -
- -
-
- -
- - - \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/log.schema.json b/products/userale/packages/flagon-userale/example/log.schema.json deleted file mode 100644 index 83434b5..0000000 --- a/products/userale/packages/flagon-userale/example/log.schema.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://flagon.incubator.apache.org/log.schema.json", - "title": "Log", - "description": "A raw or custom log produced by userale", - "type": "object", - "properties": { - "target": { - "type": "string" - }, - "path": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "pageUrl": { - "type": "string" - }, - "pageTitle": { - "type": "string" - }, - "browser": { - "type": "object", - "properties": { - "browser": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required" : ["browser", "version"] - }, - "clientTime": { - "type": "integer" - }, - "microTime": { - "type": "number", - "minimum": 0, - "maxmaximumi": 1 - }, - "location": { - "type": "object", - "properties": { - "x": { - "type": ["integer", "null"] - }, - "y": { - "type": ["integer", "null"] - } - }, - "required" : ["x", "y"] - }, - "scrnRes": { - "type": "object", - "properties": { - "height": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required" : ["height", "width"] - }, - "type": { - "type": "string" - }, - "logType": { - "type": "string", - "enum": ["raw", "custom"] - }, - "userAction": { - "type": "boolean" - }, - "details": { - "type": ["object", "null"] - }, - "userId": { - "type": "string" - }, - "toolVersion": { - "type": "string" - }, - "toolName": { - "type": "string" - }, - "useraleVersion": { - "type": "string" - }, - "sessionId": { - "type": "string" - } - }, - "required": [ - "pageUrl", - "pageTitle", - "pageReferrer", - "browser", - "clientTime", - "scrnRes", - "logType", - "userAction", - "details", - "userId", - "toolVersion", - "toolName", - "useraleVersion", - "sessionId" - ], - "if": { - "properties": { "logType": { "const": "raw" } } - }, - "then": { - "required": [ - "target", - "path", - "microTime", - "location", - "type" - ] - } -} \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/no-logging.html b/products/userale/packages/flagon-userale/example/no-logging.html deleted file mode 100644 index 4f5cbb5..0000000 --- a/products/userale/packages/flagon-userale/example/no-logging.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - UserALE - Example Page - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/react-app-example/.gitignore b/products/userale/packages/flagon-userale/example/react-app-example/.gitignore deleted file mode 100644 index b0227df..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/.gitignore +++ /dev/null @@ -1,40 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/products/userale/packages/flagon-userale/example/react-app-example/README.md b/products/userale/packages/flagon-userale/example/react-app-example/README.md deleted file mode 100644 index 059cc9e..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/README.md +++ /dev/null @@ -1,43 +0,0 @@ - -# Apache Flagon UseraALE.js React Example - -This example was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). It demonstrates UserALE `autostart` configurations and `start()`, `stop()` exports. - -## Using this Example - -To use this example, first install dependencies (from this subdir): - -```Javascript -npm install -``` - -Then run the `start` script: - -```Javascript -npm run start -``` - -This will start the React App in "developer mode", which will open in your browser. - -Click the text on the page to execute the UserALE `start()` export and start logging behaviors. - -Or, modify `App.js` in `src` to experiment with `autostart` and `stop()` exports. - -Note that you will not receive logs unless you have a [logging server](https://github.com/apache/incubator-flagon-useralejs/tree/master/example#capturing-logs-using-the-logging-server) running. diff --git a/products/userale/packages/flagon-userale/example/react-app-example/package-lock.json b/products/userale/packages/flagon-userale/example/react-app-example/package-lock.json deleted file mode 100644 index be85921..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/package-lock.json +++ /dev/null @@ -1,19688 +0,0 @@ -{ - "name": "test-react-app", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "test-react-app", - "version": "0.1.0", - "dependencies": { - "@testing-library/jest-dom": "^6.1.5", - "@testing-library/react": "^14.1.2", - "@testing-library/user-event": "^14.5.1", - "flagon-userale": "^2.3.0", - "react": "18.2.0", - "react-dom": "^18.2.0", - "react-scripts": "^5.0.1" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/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==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", - "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "dependencies": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz", - "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", - "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/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==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.5.tgz", - "integrity": "sha512-6IsY8jOeWibsengGlWIezp7cuZEFzNlAghFpzh9wiZwhQ42/hRcPnY/QV9HJoKTlujupinSlnQPiEy/u2C1ZfQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.23.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", - "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", - "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz", - "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.5.tgz", - "integrity": "sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.5.tgz", - "integrity": "sha512-0d/uxVD6tFGWXGDSfyMD1p2otoaKmu6+GD+NfAx0tMaH+dxORnp7T9TaVQ6mKyya7iBtCIVxHjWT7MuzzM9z+A==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", - "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/core/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "optional": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/@jest/core/node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "optional": true, - "peer": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "optional": true, - "peer": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "optional": true, - "peer": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/reporters/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "optional": true, - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz", - "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "optional": true, - "peer": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "optional": true, - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "optional": true, - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@testing-library/dom": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", - "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.5.tgz", - "integrity": "sha512-3y04JLW+EceVPy2Em3VwNr95dOKqA8DhR0RJHhHKDZNYXcVXnEK7WIrpj4eYU8SVt/qYZ2aRWt/WgQ+grNES8g==", - "dependencies": { - "@adobe/css-tools": "^4.3.1", - "@babel/runtime": "^7.9.2", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - }, - "peerDependencies": { - "@jest/globals": ">= 28", - "@types/jest": ">= 28", - "jest": ">= 28", - "vitest": ">= 0.32" - }, - "peerDependenciesMeta": { - "@jest/globals": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "jest": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.1.2.tgz", - "integrity": "sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^9.0.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.5.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", - "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", - "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/node": { - "version": "20.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", - "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "node_modules/@types/q": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" - }, - "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "18.2.41", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.41.tgz", - "integrity": "sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "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==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/bfj": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", - "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", - "dependencies": { - "bluebird": "^3.7.2", - "check-types": "^11.2.3", - "hoopy": "^0.1.4", - "jsonpath": "^1.1.1", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "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.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001565", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", - "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/check-types": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "optional": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/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==" - }, - "node_modules/coa/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "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==" - }, - "node_modules/core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", - "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.3.tgz", - "integrity": "sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/create-jest/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/cssdb": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz", - "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "optional": true, - "peer": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.601", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz", - "integrity": "sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "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==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "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==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/expect/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flagon-userale": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/flagon-userale/-/flagon-userale-2.3.0.tgz", - "integrity": "sha512-1jMxLZyfw1Pv7BruMr+U96SNYCto7iRxZb/zzeo+CQerC22T8zaNKV7p1CwsP2hvpbwaykkIzUHuPz8EnzRcLQ==", - "engines": { - "node": "10.10.0 || 11.10.0 - 12.20.1 || >=13.7.0", - "npm": "6.4.1 || 6.7.0 - 6.12.1 || >=6.13.4" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "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==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "optional": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-changed-files/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/jest-config/node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "optional": true, - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-config/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "optional": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-config/node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "optional": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "optional": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/jest-jasmine2/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/jest-jasmine2/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "optional": true, - "peer": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "optional": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-mock/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "optional": true, - "peer": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runner/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "optional": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-runner/node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runtime/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "optional": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-runtime/node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-snapshot/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "optional": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-watcher/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "optional": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "optional": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpath": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", - "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" - } - }, - "node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "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==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "optional": true, - "peer": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" - }, - "node_modules/react-scripts/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/react-scripts/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/react-scripts/node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/react-scripts/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-scripts/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/react-scripts/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/react-scripts/node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "node_modules/react-scripts/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/react-scripts/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/react-scripts/node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/react-scripts/node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/react-scripts/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-scripts/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-scripts/node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/react-scripts/node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/react-scripts/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-scripts/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" - }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } - } - }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/svgo/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==" - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tailwindcss": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "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/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" - }, - "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", - "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "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 - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "optional": true, - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/products/userale/packages/flagon-userale/example/react-app-example/package.json b/products/userale/packages/flagon-userale/example/react-app-example/package.json deleted file mode 100644 index 535bd01..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "test-react-app", - "version": "0.1.0", - "private": true, - "dependencies": { - "@testing-library/jest-dom": "^6.1.5", - "@testing-library/react": "^14.1.2", - "@testing-library/user-event": "^14.5.1", - "flagon-userale": "^2.3.0", - "react": "18.2.0", - "react-dom": "^18.2.0", - "react-scripts": "^5.0.1" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/products/userale/packages/flagon-userale/example/react-app-example/public/favicon.ico b/products/userale/packages/flagon-userale/example/react-app-example/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/products/userale/packages/flagon-userale/example/react-app-example/public/index.html b/products/userale/packages/flagon-userale/example/react-app-example/public/index.html deleted file mode 100644 index c470b36..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/public/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - React App - - - -
- - - diff --git a/products/userale/packages/flagon-userale/example/react-app-example/public/logo192.png b/products/userale/packages/flagon-userale/example/react-app-example/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/products/userale/packages/flagon-userale/example/react-app-example/src/App.js b/products/userale/packages/flagon-userale/example/react-app-example/src/App.js deleted file mode 100644 index f5979e6..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/src/App.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import logo from "./logo.svg"; -import "./App.css"; -import * as userale from "flagon-userale"; - -function App() { - const handleOnClick = () => { - userale.start(); - }; - - userale.options({ - autostart: false, - logCountThreshold: "1", - transmitInterval: "1000", - toolName: "Apache UserALE React Example", - }); - - userale.filter(function (log) { - var type_array = [ - "mouseup", - "mouseover", - "mousedown", - "keydown", - "dblclick", - "blur", - "focus", - "input", - "wheel", - "scroll", - ]; - var logType_array = ["interval"]; - return ( - !type_array.includes(log.type) && !logType_array.includes(log.logType) - ); - }); - - return ( - - ); -} - -export default App; diff --git a/products/userale/packages/flagon-userale/example/react-app-example/src/logo.svg b/products/userale/packages/flagon-userale/example/react-app-example/src/logo.svg deleted file mode 100644 index 4111957..0000000 --- a/products/userale/packages/flagon-userale/example/react-app-example/src/logo.svg +++ /dev/null @@ -1,19 +0,0 @@ - - \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/test-client.js b/products/userale/packages/flagon-userale/example/test-client.js deleted file mode 100644 index a807a79..0000000 --- a/products/userale/packages/flagon-userale/example/test-client.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -const ws = new WebSocket("ws://localhost:8000"); -const encoder = new TextEncoder(); -ws.onopen = (event) => { - let logs = new Array(); - logs.push('{"target": "#document","path": [ "Window" ], "pageUrl": "https://github.com/apache/flagon/tree/master/docker", "pageTitle": "flagon/docker at master · apache/flagon · GitHub", "pageReferrer": "https://gov.teams.microsoft.us/", "browser": { "browser": "chrome", "version": "116.0.0" }, "clientTime": 1719530111079, "microTime": 0,"location": { "x": null, "y": null }, "scrnRes": { "width": 1349, "height":954 }, "type": "load", "logType": "raw", "userAction": true, "details": {"window": true }, "userId": "nobody", "toolVersion": null, "toolName":"test_app", "useraleVersion": "2.3.0", "sessionId":"session_1719530074303", "httpSessionId": "72798a8ad776417183b1aa14e03c3132", "browserSessionId": "06b0db1ab30e8e92819ba3d4091b83bc"}'); - logs.push('{"target": "#document","path": [ "Window" ], "pageUrl": "https://github.com/apache/flagon/tree/master/docker", "pageTitle": "flagon/docker at master · apache/flagon · GitHub", "pageReferrer": "https://gov.teams.microsoft.us/", "browser": { "browser": "chrome", "version": "116.0.0" }, "clientTime": 1719530111079, "microTime": 0,"location": { "x": null, "y": null }, "scrnRes": { "width": 1349, "height":954 }, "type": "load", "logType": "raw", "userAction": true, "details": {"window": true }, "userId": "nobody", "toolVersion": null, "toolName":"test_app", "useraleVersion": "2.3.0", "sessionId":"session_1719530074303", "httpSessionId": "72798a8ad776417183b1aa14e03c3132", "browserSessionId": "06b0db1ab30e8e92819ba3d4091b83bc"}'); - let data = JSON.stringify(logs); - //let arr = encoder.encode(message); - ws.send(data); -}; -ws.onmessage = (event) => { - console.log(event.data); -}; diff --git a/products/userale/packages/flagon-userale/example/test-client.ts b/products/userale/packages/flagon-userale/example/test-client.ts deleted file mode 100644 index 2108356..0000000 --- a/products/userale/packages/flagon-userale/example/test-client.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -const ws = new WebSocket("ws://localhost:8000"); - -const encoder = new TextEncoder(); - -ws.onopen = (event) => { - let logs = new Array(); - logs.push('{"target": "#document","path": [ "Window" ], "pageUrl": "https://github.com/apache/flagon/tree/master/docker", "pageTitle": "flagon/docker at master · apache/flagon · GitHub", "pageReferrer": "https://gov.teams.microsoft.us/", "browser": { "browser": "chrome", "version": "116.0.0" }, "clientTime": 1719530111079, "microTime": 0,"location": { "x": null, "y": null }, "scrnRes": { "width": 1349, "height":954 }, "type": "load", "logType": "raw", "userAction": true, "details": {"window": true }, "userId": "nobody", "toolVersion": null, "toolName":"test_app", "useraleVersion": "2.3.0", "sessionId":"session_1719530074303", "httpSessionId": "72798a8ad776417183b1aa14e03c3132", "browserSessionId": "06b0db1ab30e8e92819ba3d4091b83bc"}'); - logs.push('{"target": "#document","path": [ "Window" ], "pageUrl": "https://github.com/apache/flagon/tree/master/docker", "pageTitle": "flagon/docker at master · apache/flagon · GitHub", "pageReferrer": "https://gov.teams.microsoft.us/", "browser": { "browser": "chrome", "version": "116.0.0" }, "clientTime": 1719530111079, "microTime": 0,"location": { "x": null, "y": null }, "scrnRes": { "width": 1349, "height":954 }, "type": "load", "logType": "raw", "userAction": true, "details": {"window": true }, "userId": "nobody", "toolVersion": null, "toolName":"test_app", "useraleVersion": "2.3.0", "sessionId":"session_1719530074303", "httpSessionId": "72798a8ad776417183b1aa14e03c3132", "browserSessionId": "06b0db1ab30e8e92819ba3d4091b83bc"}'); - - let data = JSON.stringify(logs); - - //let arr = encoder.encode(message); - ws.send(data); -} - -ws.onmessage = (event) => { - console.log(event.data); -} - - diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/.gitignore b/products/userale/packages/flagon-userale/example/webpackUserAleExample/.gitignore deleted file mode 100644 index 5d5dcf0..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -.idea -/node_modules/* -/logs/* -/.git/* -npm-debug.log -DS_store diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/LICENSE b/products/userale/packages/flagon-userale/example/webpackUserAleExample/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/README.md b/products/userale/packages/flagon-userale/example/webpackUserAleExample/README.md deleted file mode 100644 index 2132f44..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/README.md +++ /dev/null @@ -1,156 +0,0 @@ - -# The UserALE Webpack Example Utility - -This example provides: - * example usage for UserALE imported as a **module** into a simple HTML Webpage and built with a package bundler (Webpack); - * a testing utility for developers to evaluate UserALE modifications to logged events; - * a means of viewing log event structure within a simple UserALE logging server; - * a means of testing UserALE API functions within a simple HTML Webpage. - -If you are interested in examples for a **script tag** deployment methodology, see the README in the [/examples directory](https://github.com/apache/flagon-useralejs/tree/master/example). For details about our web extension, see -our [UserALE WebExtension documentation](https://github.com/apache/flagon-useralejs/tree/master/src/UserALEWebExtension). - -## Prerequisites - -Ensure that you have [node.js](https://nodejs.org/) installed. - -You will need to `npm install` the [flagon-userale](https://www.npmjs.com/package/flagon-userale) npm package. - -From `./example/webpackUserAleExample` directory, `npm install` dependencies to run this Example Utility. Note that the UserALE Webpack Example has it's own package.json file, that is separate from the larger `flagon-userale` package. - -Please follow [Installation directions](https://github.com/apache/flagon-useralejs#installation) if you run into issues. - -## Using the Example Page - -The Example Page is a simple HTML Webpage with UserALE included as a module import. - -The example is pre-built and requires no modification to work. - -Open `index.html` in your browser (you can drag it directly into a tab or double-click it). You will see a very simple HTML Webpage with a few interactive features. - -On this page, all user events will be captured and sent to the logging server. See instructions below. - -## Capturing Logs Using the Logging Server - -The UserALE Example page works with a simple logging server, which receives log from any UserALE instrumented page or application at `localhost:8000`. - -From the `/example` directory or its parent directory (not `example/webpackUserAleExample`) run the following: - -``` -$npm run example:watch -``` - -Once the server starts you will see: - -``` -> flagon-userale@2.1.0 example:watch ... -> nodemon -w ./example example/server.js - -[nodemon] 1.19.1 -[nodemon] to restart at any time, enter `rs` -[nodemon] watching: ... -[nodemon] starting `node example/server.js` -UserAle Local running on port 8000 -``` - -The server allows you to watch as logs are sent from the client to the server, as well as review a flat-file of saved logs, which you can view @ `/logs` in the flagon-userale parent directory. - -This means you can test logs from your own instrumented application, the [UserALE WebExtension](https://github.com/apache/flagon-useralejs/tree/master/src/UserALEWebExtension), or the UserALE Example Page, so long as you have not changed the UserALE `url` configuration option from `localhost:8000` (instructions below). This is the default setting for userale; logs generated from module, script tag, or WebExtension deployments will always ship logs to `localhost:8000` unless modified via the `userale.options` (API) configuration, HTML script tag parameter (data-url), or the WebExtension options page. - -Start using your instrumented application, browser, or the UserALE Example Page, and you will see logs propagating in the terminal: - -``` - -[ { target: 'body', - path: [ 'body', 'html' ], - clientTime: 1504287557492, - location: { x: 0, y: 0 }, - type: 'keydown', - userAction: true, - details: null, - userId: 'example-user', - toolVersion: '2.1.0', - toolName: 'Apache UserALE Example', - useraleVersion: '2.1.0' }, - ... -] -``` - -Kill the logging script with `^C` or as you would any bash script. - -## Modifying the Example Page (Dev Instructions) - -Beyond providing you in situ examples of UserALE in action and API usage examples, the test utility is useful for prototyping code blocks for use in your own applications. - -Below are a few notes that are useful as you begin to modify the UserALE **module** imoort example. - -* the `userale` object imports directly into `index.js` with the following import statement: - -```html -import * as userale from 'flagon-userale'; - -or - -const userale = require('flagon-userale'); -``` - -* `index.js` is bundled with **Webpack**, resulting in a `main.js` file in the /dist directory. `index.html` includes `main.js` through a script tag. - -```html - -``` - -* the UserALE **module** import example is structured like an npm project--it has its own `package.json` file. This means than any npm commands used for install, built, etc., must be done so within this directory, *not* its parent directories. - -* any modifications of `index.js` will require that you rebuild `main.js`, then reload `index.html`. Run the following within the `/example/webpackUserAleExample directory`: - -```html -$npm run build-example -``` - -## Experimenting with UserALE Exports (API) - -* UserALE features a robust set of exported functions to support modification and customization of your logs. They can be called as attributes of the userale object (e.g., userale.[function]) - -* See the top level README for examples and parameters for exports, but a list of exported functions follows: - -| Function | Description | Notes | -|---|---|---| -| userale.options | modify userale's configuration option | see top level README for complete list of options | -| [DEPRECATED] userale.filter | filters out logs from logging queue by keys or values | filters are callbacks with global scope | -| [DEPRECATED] userale.map | modify/add log keys or values | mappings are callbacks with global scope | -| userale.addCallbacks | add one or more callbacks to be executed during log packaging | callbacks have global scope | -| userale.removeCallbacks | remove one or more callbacks by name | Removes callbacks added from userale.addCallbacks | -| userale.log | appends a custom log to the log queue | the custom log object is an object key:value pairs | -| userale.packageLog | transforms the provided event into a log and appends it to the log queue | designed for HTML events | -| userale.packageCustomLog | packages the provided customLog to include standard meta data and appends it to the log queue | designed for non HTML events| -| userale.details | defines the way information is extracted from various events | supports packageLog/packageCustomLog 'details' | -| userale.getSelector | builds a string CSS selector from the provided HTML element id | populates 'target' field in packaged logs | -| userale.buildPath| builds an array of elements from the provided event target, to the root element (DOM path) | populates the 'path' field in packaged logs | -| userale.start | used to start the logging process if | unecessary if 'autostart' is set to true in initial setting (default) | -| userale.stop | halts the logging process. Logs will no longer be sent | will need to invoke userale.start to restart logging | - -* additional, annotated examples for most exports can be found embedded within `index.js` the UserALE **module** import example. - -See the [Flagon website](http://flagon.apache.org/) for additional documentation on the [API](http://flagon.apache.org/docs/useralejs/API/) and [testing for scale](http://flagon.apache.org/docs/stack/scaling/). - -## Contributing - -Contributions are welcome! Simply [submit an issue](https://github.com/apache/flagon-useralejs/issues) for problems you encounter or submit a pull request for your feature or bug fix. The core team will review it and work with you to incorporate it into UserALE. \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/dist/main.js b/products/userale/packages/flagon-userale/example/webpackUserAleExample/dist/main.js deleted file mode 100644 index cce5d8d..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/dist/main.js +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* - * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { - // webpackBootstrap - /******/ var __webpack_modules__ = { - /***/ "./index.js": - /*!******************!*\ - !*** ./index.js ***! - \******************/ - /***/ ( - __unused_webpack_module, - __webpack_exports__, - __webpack_require__ - ) => { - "use strict"; - eval( - "__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var flagon_userale__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flagon-userale */ \"./node_modules/flagon-userale/build/userale-2.3.0.js\");\n/* harmony import */ var flagon_userale__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flagon_userale__WEBPACK_IMPORTED_MODULE_0__);\n// Licensed to the Apache Software Foundation (ASF) under one or more\n// contributor license agreements. See the NOTICE file distributed with\n// this work for additional information regarding copyright ownership.\n// The ASF licenses this file to You under the Apache License, Version 2.0\n// (the \"License\"); you may not use this file except in compliance with\n// the License. You may obtain a copy of the License at\n// http://www.apache.org/licenses/LICENSE-2.0\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n//or use require\n//const userale = require('flagon-userale');\n\n\n/** Options API\n *\n * the 'options' API allows you to dynamically change UserALE.js params and set meta data values\n * pass in variables or properties into the options object, such as from sessionStorage or localStorage\n * NOTE1: if you are using userale in a package bundler, you will need to set options via this API, including\n * \"url\" to tell userale where to send your logs!\n * NOTE2: logDetails is set to true (default:false), this will log key strokes, inputs, and change events\n * (be careful of your form data and auth workflows!)\n */\nconst changeMe = \"me\";\nflagon_userale__WEBPACK_IMPORTED_MODULE_0__.options({\n 'userId': changeMe,\n 'url': 'http://localhost:8000/',\n 'version': '2.3.0',\n 'logDetails': true,\n 'toolName': 'Apache UserALE.js Example (Custom)',\n 'logCountThreshold': '1',\n 'transmitInterval': '1000'\n});\n\n/**Filter API\n\n /**the 'filter' API allows you to eliminate logs you don't want\n * use as a global filter and add classes of events or log types to eliminate\n * or use in block scope to surgically eliminate logs from specific elements from an event handler\n * The filter below reduces logs to capture click, change, select, scroll and submit events on index.html\n * Note that for surgical filters, you may need to clear or reset back to a global filter callback\n * the same is true for the 'map' API. See examples below:\n */\nflagon_userale__WEBPACK_IMPORTED_MODULE_0__.filter(function (log) {\n var type_array = ['mouseup', 'mouseover', 'mousedown', 'keydown', 'dblclick', 'blur', 'focus', 'input', 'wheel', 'scroll'];\n var logType_array = ['interval'];\n return !type_array.includes(log.type) && !logType_array.includes(log.logType);\n});\n\n/**Log Mapping API\n *\n * the 'map' API allows you to add or modify new fields to your logs\n * this example works with the \"Click Me!\" button at the top of index.html\n */\ndocument.addEventListener('click', function(e){\n if (e.target.innerHTML === 'Click Me!') {\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.map(function (log) {\n return Object.assign({}, log, { logType: 'custom', customLabel: 'map & packageLog Example' });\n });\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.packageLog(e, flagon_userale__WEBPACK_IMPORTED_MODULE_0__.details(flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options(),e.type));\n /**you'll want to reset the map callback function, or set a conditional (e.g., return log), else\n * the callback may be applied to other events of the same class (e.g., click) */\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.map();\n } else {\n return false\n }\n});\n\n/** Alternate Log Mapping API Example\n * Build a global mapping function with conditional logic to modify logs for similar events\n * this example works with the \"Click Me!\" button at the top of index.html\n * Also, note that specifying log as a return will keep the scope of this callback limited to only the events you want\n */\n//userale.map(function (log, e) {\n// var targetsForLabels = [\"button#test_button\"];\n// if (targetsForLabels.includes(log.target)) {\n// return Object.assign({}, log, { customLabel: e.target.innerHTML });\n// } else {\n// return log;\n// }\n//});\n\n/**'Log' API and Custom Log Functions\n *\n * the 'log' API generate custom events and add them to the log queue\n * pass in any keys:values for fully customized logs\n * utilize 'options' and other functions to streamline populating custom logs\n * type 'log' into the 'API Test Field' to see this custom log sent to our example server\n */\ndocument.addEventListener('change', function(e) {\n if (e.target.value === 'log') {\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.log({\n target: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.getSelector(e.target),\n path: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.buildPath(e),\n clientTime: Date.now(),\n type: e.type,\n logType: 'custom',\n userAction: false,\n details: {'foo': 'bar', 'bar': 'foo'},\n customField1: 'I can make this log look like anything I want',\n customField2: 'foo',\n userId: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options().userId,\n toolVersion: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options().version,\n toolName: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options().toolName,\n useraleVersion: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options().useraleVersion,\n sessionId: flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options().sessionId,\n customLabel: \"Custom Log Example\"\n });\n }\n});\n\n/**you can also use UserALE.js' own packaging function for HTML events to strive for standardization\n * type 'packageLog into the 'API Test Field' to see this custom log sent to our example server\n */\ndocument.addEventListener('change', function(e){\n if (e.target.value === 'packageLog') {\n /**You can then use the 'Mapping' API function to modify custom logs created with the packageLog function*/\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.map(function (log) {\n var targetsForLabels = ['change'];\n if (targetsForLabels.includes(log.type)) {\n return Object.assign({}, log, { logType: 'custom', customLabel: 'packageLog Example' });\n } else {\n return log;\n }\n });\n /**You can also use the details function to package additional log meta data, or add custom details*/\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.packageLog(e, flagon_userale__WEBPACK_IMPORTED_MODULE_0__.details(flagon_userale__WEBPACK_IMPORTED_MODULE_0__.options(),e.type));\n } else {\n return false\n }\n});\n\n/**you can also just add boilerplate UserALE.js meta data to custom logs with the packageCustomLog function\n * type 'packageCustomLog into the 'API Test Field' to see this custom log sent to our example server\n */\ndocument.addEventListener('change', function(e) {\n if (e.target.value === 'packageCustomLog') {\n flagon_userale__WEBPACK_IMPORTED_MODULE_0__.packageCustomLog({\n customLabel: 'packageCustomLog Example',\n customField1: 'foo',\n customField2: 'bar'},\n function(){return {'foo': 'bar', 'bar': 'foo'}},\n true\n );\n } else {\n return false\n }\n});\n\n//# sourceURL=webpack://flagon-userale-example/./index.js?" - ); - - /***/ - }, - - /***/ "./node_modules/flagon-userale/build/userale-2.3.0.js": - /*!************************************************************!*\ - !*** ./node_modules/flagon-userale/build/userale-2.3.0.js ***! - \************************************************************/ - /***/ function (__unused_webpack_module, exports) { - eval( - "/**\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * @preserved\n */\n\n(function (global, factory) {\n true ? factory(exports) :\n 0;\n})(this, (function (exports) { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n }\n\n var version$1 = \"2.3.0\";\n\n /*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the 'License'); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n var sessionId = null;\n /**\n * Extracts the initial configuration settings from the\n * currently executing script tag.\n * @return {Object} The extracted configuration object\n */\n\n function getInitialSettings() {\n var settings = {};\n\n if (sessionId === null) {\n sessionId = getsessionId('userAlesessionId', 'session_' + String(Date.now()));\n }\n\n var script = document.currentScript || function () {\n var scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n }();\n\n var get = script ? script.getAttribute.bind(script) : function () {\n return null;\n };\n settings.autostart = get('data-autostart') === 'false' ? false : true;\n settings.url = get('data-url') || 'http://localhost:8000';\n settings.transmitInterval = +get('data-interval') || 5000;\n settings.logCountThreshold = +get('data-threshold') || 5;\n settings.userId = get('data-user') || null;\n settings.version = get('data-version') || null;\n settings.logDetails = get('data-log-details') === 'true' ? true : false;\n settings.resolution = +get('data-resolution') || 500;\n settings.toolName = get('data-tool') || null;\n settings.userFromParams = get('data-user-from-params') || null;\n settings.time = timeStampScale(document.createEvent('CustomEvent'));\n settings.sessionId = get('data-session') || sessionId;\n settings.authHeader = get('data-auth') || null;\n settings.custIndex = get('data-index') || null;\n return settings;\n }\n /**\n * defines sessionId, stores it in sessionStorage, checks to see if there is a sessionId in\n * storage when script is started. This prevents events like 'submit', which refresh page data\n * from refreshing the current user session\n *\n */\n\n function getsessionId(sessionKey, value) {\n if (window.sessionStorage.getItem(sessionKey) === null) {\n window.sessionStorage.setItem(sessionKey, JSON.stringify(value));\n return value;\n }\n\n return JSON.parse(window.sessionStorage.getItem(sessionKey));\n }\n /**\n * Creates a function to normalize the timestamp of the provided event.\n * @param {Object} e An event containing a timeStamp property.\n * @return {timeStampScale~tsScaler} The timestamp normalizing function.\n */\n\n function timeStampScale(e) {\n var tsScaler;\n\n if (e.timeStamp && e.timeStamp > 0) {\n var delta = Date.now() - e.timeStamp;\n /**\n * Returns a timestamp depending on various browser quirks.\n * @param {?Number} ts A timestamp to use for normalization.\n * @return {Number} A normalized timestamp.\n */\n\n if (delta < 0) {\n tsScaler = function tsScaler() {\n return e.timeStamp / 1000;\n };\n } else if (delta > e.timeStamp) {\n var navStart = performance.timeOrigin;\n\n tsScaler = function tsScaler(ts) {\n return ts + navStart;\n };\n } else {\n tsScaler = function tsScaler(ts) {\n return ts;\n };\n }\n } else {\n tsScaler = function tsScaler() {\n return Date.now();\n };\n }\n\n return tsScaler;\n }\n\n /*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n /**\n * Shallow merges the first argument with the second.\n * Retrieves/updates the userid if userFromParams is provided.\n * @param {Object} config Current configuration object to be merged into.\n * @param {Object} newConfig Configuration object to merge into the current config.\n */\n function configure(config, newConfig) {\n var configAutostart = config['autostart'];\n var newConfigAutostart = newConfig['autostart'];\n Object.keys(newConfig).forEach(function (option) {\n if (option === 'userFromParams') {\n var userId = getUserIdFromParams(newConfig[option]);\n\n if (userId) {\n config.userId = userId;\n }\n }\n\n config[option] = newConfig[option];\n });\n\n if (configAutostart === false || newConfigAutostart === false) {\n config['autostart'] = false;\n }\n }\n /**\n * Attempts to extract the userid from the query parameters of the URL.\n * @param {string} param The name of the query parameter containing the userid.\n * @return {string|null} The extracted/decoded userid, or null if none is found.\n */\n\n function getUserIdFromParams(param) {\n var userField = param;\n var regex = new RegExp('[?&]' + userField + '(=([^&#]*)|&|#|$)');\n var results = window.location.href.match(regex);\n\n if (results && results[2]) {\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n } else {\n return null;\n }\n }\n\n var __spreadArray = ( false) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n };\n var BrowserInfo = /** @class */ (function () {\n function BrowserInfo(name, version, os) {\n this.name = name;\n this.version = version;\n this.os = os;\n this.type = 'browser';\n }\n return BrowserInfo;\n }());\n var NodeInfo = /** @class */ (function () {\n function NodeInfo(version) {\n this.version = version;\n this.type = 'node';\n this.name = 'node';\n this.os = process.platform;\n }\n return NodeInfo;\n }());\n var SearchBotDeviceInfo = /** @class */ (function () {\n function SearchBotDeviceInfo(name, version, os, bot) {\n this.name = name;\n this.version = version;\n this.os = os;\n this.bot = bot;\n this.type = 'bot-device';\n }\n return SearchBotDeviceInfo;\n }());\n var BotInfo = /** @class */ (function () {\n function BotInfo() {\n this.type = 'bot';\n this.bot = true; // NOTE: deprecated test name instead\n this.name = 'bot';\n this.version = null;\n this.os = null;\n }\n return BotInfo;\n }());\n var ReactNativeInfo = /** @class */ (function () {\n function ReactNativeInfo() {\n this.type = 'react-native';\n this.name = 'react-native';\n this.version = null;\n this.os = null;\n }\n return ReactNativeInfo;\n }());\n // tslint:disable-next-line:max-line-length\n var SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;\n var SEARCHBOT_OS_REGEX = /(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\\ Jeeves\\/Teoma|ia_archiver)/;\n var REQUIRED_VERSION_PARTS = 3;\n var userAgentRules = [\n ['aol', /AOLShield\\/([0-9\\._]+)/],\n ['edge', /Edge\\/([0-9\\._]+)/],\n ['edge-ios', /EdgiOS\\/([0-9\\._]+)/],\n ['yandexbrowser', /YaBrowser\\/([0-9\\._]+)/],\n ['kakaotalk', /KAKAOTALK\\s([0-9\\.]+)/],\n ['samsung', /SamsungBrowser\\/([0-9\\.]+)/],\n ['silk', /\\bSilk\\/([0-9._-]+)\\b/],\n ['miui', /MiuiBrowser\\/([0-9\\.]+)$/],\n ['beaker', /BeakerBrowser\\/([0-9\\.]+)/],\n ['edge-chromium', /EdgA?\\/([0-9\\.]+)/],\n [\n 'chromium-webview',\n /(?!Chrom.*OPR)wv\\).*Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/,\n ],\n ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/],\n ['phantomjs', /PhantomJS\\/([0-9\\.]+)(:?\\s|$)/],\n ['crios', /CriOS\\/([0-9\\.]+)(:?\\s|$)/],\n ['firefox', /Firefox\\/([0-9\\.]+)(?:\\s|$)/],\n ['fxios', /FxiOS\\/([0-9\\.]+)/],\n ['opera-mini', /Opera Mini.*Version\\/([0-9\\.]+)/],\n ['opera', /Opera\\/([0-9\\.]+)(?:\\s|$)/],\n ['opera', /OPR\\/([0-9\\.]+)(:?\\s|$)/],\n ['pie', /^Microsoft Pocket Internet Explorer\\/(\\d+\\.\\d+)$/],\n ['pie', /^Mozilla\\/\\d\\.\\d+\\s\\(compatible;\\s(?:MSP?IE|MSInternet Explorer) (\\d+\\.\\d+);.*Windows CE.*\\)$/],\n ['netfront', /^Mozilla\\/\\d\\.\\d+.*NetFront\\/(\\d.\\d)/],\n ['ie', /Trident\\/7\\.0.*rv\\:([0-9\\.]+).*\\).*Gecko$/],\n ['ie', /MSIE\\s([0-9\\.]+);.*Trident\\/[4-7].0/],\n ['ie', /MSIE\\s(7\\.0)/],\n ['bb10', /BB10;\\sTouch.*Version\\/([0-9\\.]+)/],\n ['android', /Android\\s([0-9\\.]+)/],\n ['ios', /Version\\/([0-9\\._]+).*Mobile.*Safari.*/],\n ['safari', /Version\\/([0-9\\._]+).*Safari/],\n ['facebook', /FB[AS]V\\/([0-9\\.]+)/],\n ['instagram', /Instagram\\s([0-9\\.]+)/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Mobile/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Gecko\\)$/],\n ['curl', /^curl\\/([0-9\\.]+)$/],\n ['searchbot', SEARCHBOX_UA_REGEX],\n ];\n var operatingSystemRules = [\n ['iOS', /iP(hone|od|ad)/],\n ['Android OS', /Android/],\n ['BlackBerry OS', /BlackBerry|BB10/],\n ['Windows Mobile', /IEMobile/],\n ['Amazon OS', /Kindle/],\n ['Windows 3.11', /Win16/],\n ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],\n ['Windows 98', /(Windows 98)|(Win98)/],\n ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],\n ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],\n ['Windows Server 2003', /(Windows NT 5.2)/],\n ['Windows Vista', /(Windows NT 6.0)/],\n ['Windows 7', /(Windows NT 6.1)/],\n ['Windows 8', /(Windows NT 6.2)/],\n ['Windows 8.1', /(Windows NT 6.3)/],\n ['Windows 10', /(Windows NT 10.0)/],\n ['Windows ME', /Windows ME/],\n ['Windows CE', /Windows CE|WinCE|Microsoft Pocket Internet Explorer/],\n ['Open BSD', /OpenBSD/],\n ['Sun OS', /SunOS/],\n ['Chrome OS', /CrOS/],\n ['Linux', /(Linux)|(X11)/],\n ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],\n ['QNX', /QNX/],\n ['BeOS', /BeOS/],\n ['OS/2', /OS\\/2/],\n ];\n function detect(userAgent) {\n if (!!userAgent) {\n return parseUserAgent(userAgent);\n }\n if (typeof document === 'undefined' &&\n typeof navigator !== 'undefined' &&\n navigator.product === 'ReactNative') {\n return new ReactNativeInfo();\n }\n if (typeof navigator !== 'undefined') {\n return parseUserAgent(navigator.userAgent);\n }\n return getNodeVersion();\n }\n function matchUserAgent(ua) {\n // opted for using reduce here rather than Array#first with a regex.test call\n // this is primarily because using the reduce we only perform the regex\n // execution once rather than once for the test and for the exec again below\n // probably something that needs to be benchmarked though\n return (ua !== '' &&\n userAgentRules.reduce(function (matched, _a) {\n var browser = _a[0], regex = _a[1];\n if (matched) {\n return matched;\n }\n var uaMatch = regex.exec(ua);\n return !!uaMatch && [browser, uaMatch];\n }, false));\n }\n function parseUserAgent(ua) {\n var matchedRule = matchUserAgent(ua);\n if (!matchedRule) {\n return null;\n }\n var name = matchedRule[0], match = matchedRule[1];\n if (name === 'searchbot') {\n return new BotInfo();\n }\n // Do not use RegExp for split operation as some browser do not support it (See: http://blog.stevenlevithan.com/archives/cross-browser-split)\n var versionParts = match[1] && match[1].split('.').join('_').split('_').slice(0, 3);\n if (versionParts) {\n if (versionParts.length < REQUIRED_VERSION_PARTS) {\n versionParts = __spreadArray(__spreadArray([], versionParts, true), createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length), true);\n }\n }\n else {\n versionParts = [];\n }\n var version = versionParts.join('.');\n var os = detectOS(ua);\n var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);\n if (searchBotMatch && searchBotMatch[1]) {\n return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);\n }\n return new BrowserInfo(name, version, os);\n }\n function detectOS(ua) {\n for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {\n var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];\n var match = regex.exec(ua);\n if (match) {\n return os;\n }\n }\n return null;\n }\n function getNodeVersion() {\n var isNode = typeof process !== 'undefined' && process.version;\n return isNode ? new NodeInfo(process.version.slice(1)) : null;\n }\n function createVersionParts(count) {\n var output = [];\n for (var ii = 0; ii < count; ii++) {\n output.push('0');\n }\n return output;\n }\n\n /*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n var browser = detect();\n var logs$1;\n var config$1; // Interval Logging Globals\n\n var intervalID;\n var intervalType;\n var intervalPath;\n var intervalTimer;\n var intervalCounter;\n var intervalLog;\n var filterHandler = null;\n var mapHandler = null;\n /**\n * Assigns a handler to filter logs out of the queue.\n * @param {Function} callback The handler to invoke when logging.\n */\n\n function setLogFilter(callback) {\n filterHandler = callback;\n }\n /**\n * Assigns a handler to transform logs from their default structure.\n * @param {Function} callback The handler to invoke when logging.\n */\n\n function setLogMapper(callback) {\n mapHandler = callback;\n }\n /**\n * Assigns the config and log container to be used by the logging functions.\n * @param {Array} newLogs Log container.\n * @param {Object} newConfig Configuration to use while logging.\n */\n\n function initPackager(newLogs, newConfig) {\n logs$1 = newLogs;\n config$1 = newConfig;\n filterHandler = null;\n mapHandler = null;\n intervalID = null;\n intervalType = null;\n intervalPath = null;\n intervalTimer = null;\n intervalCounter = 0;\n intervalLog = null;\n }\n /**\n * Transforms the provided HTML event into a log and appends it to the log queue.\n * @param {Object} e The event to be logged.\n * @param {Function} detailFcn The function to extract additional log parameters from the event.\n * @return {boolean} Whether the event was logged.\n */\n\n function packageLog(e, detailFcn) {\n if (!config$1.on) {\n return false;\n }\n\n var details = null;\n\n if (detailFcn) {\n details = detailFcn(e);\n }\n\n var timeFields = extractTimeFields(e.timeStamp && e.timeStamp > 0 ? config$1.time(e.timeStamp) : Date.now());\n var log = {\n 'target': getSelector(e.target),\n 'path': buildPath(e),\n 'pageUrl': window.location.href,\n 'pageTitle': document.title,\n 'pageReferrer': document.referrer,\n 'browser': detectBrowser(),\n 'clientTime': timeFields.milli,\n 'microTime': timeFields.micro,\n 'location': getLocation(e),\n 'scrnRes': getSreenRes(),\n 'type': e.type,\n 'logType': 'raw',\n 'userAction': true,\n 'details': details,\n 'userId': config$1.userId,\n 'toolVersion': config$1.version,\n 'toolName': config$1.toolName,\n 'useraleVersion': config$1.useraleVersion,\n 'sessionId': config$1.sessionId\n };\n\n if (typeof filterHandler === 'function' && !filterHandler(log)) {\n return false;\n }\n\n if (typeof mapHandler === 'function') {\n log = mapHandler(log, e);\n }\n\n logs$1.push(log);\n return true;\n }\n /**\n * Packages the provided customLog to include standard meta data and appends it to the log queue.\n * @param {Object} customLog The behavior to be logged.\n * @param {Function} detailFcn The function to extract additional log parameters from the event.\n * @param {boolean} userAction Indicates user behavior (true) or system behavior (false)\n * @return {boolean} Whether the event was logged.\n */\n\n function packageCustomLog(customLog, detailFcn, userAction) {\n if (!config$1.on) {\n return false;\n }\n\n var details = null;\n\n if (detailFcn) {\n details = detailFcn();\n }\n\n var metaData = {\n 'pageUrl': window.location.href,\n 'pageTitle': document.title,\n 'pageReferrer': document.referrer,\n 'browser': detectBrowser(),\n 'clientTime': Date.now(),\n 'scrnRes': getSreenRes(),\n 'logType': 'custom',\n 'userAction': userAction,\n 'details': details,\n 'userId': config$1.userId,\n 'toolVersion': config$1.version,\n 'toolName': config$1.toolName,\n 'useraleVersion': config$1.useraleVersion,\n 'sessionId': config$1.sessionId\n };\n var log = Object.assign(metaData, customLog);\n\n if (typeof filterHandler === 'function' && !filterHandler(log)) {\n return false;\n }\n\n if (typeof mapHandler === 'function') {\n log = mapHandler(log);\n }\n\n logs$1.push(log);\n return true;\n }\n /**\n * Extract the millisecond and microsecond portions of a timestamp.\n * @param {Number} timeStamp The timestamp to split into millisecond and microsecond fields.\n * @return {Object} An object containing the millisecond\n * and microsecond portions of the timestamp.\n */\n\n function extractTimeFields(timeStamp) {\n return {\n milli: Math.floor(timeStamp),\n micro: Number((timeStamp % 1).toFixed(3))\n };\n }\n /**\n * Track intervals and gather details about it.\n * @param {Object} e\n * @return boolean\n */\n\n function packageIntervalLog(e) {\n var target = getSelector(e.target);\n var path = buildPath(e);\n var type = e.type;\n var timestamp = Math.floor(e.timeStamp && e.timeStamp > 0 ? config$1.time(e.timeStamp) : Date.now()); // Init - this should only happen once on initialization\n\n if (intervalID == null) {\n intervalID = target;\n intervalType = type;\n intervalPath = path;\n intervalTimer = timestamp;\n intervalCounter = 0;\n }\n\n if (intervalID !== target || intervalType !== type) {\n // When to create log? On transition end\n // @todo Possible for intervalLog to not be pushed in the event the interval never ends...\n intervalLog = {\n 'target': intervalID,\n 'path': intervalPath,\n 'pageUrl': window.location.href,\n 'pageTitle': document.title,\n 'pageReferrer': document.referrer,\n 'browser': detectBrowser(),\n 'count': intervalCounter,\n 'duration': timestamp - intervalTimer,\n // microseconds\n 'startTime': intervalTimer,\n 'endTime': timestamp,\n 'type': intervalType,\n 'logType': 'interval',\n 'targetChange': intervalID !== target,\n 'typeChange': intervalType !== type,\n 'userAction': false,\n 'userId': config$1.userId,\n 'toolVersion': config$1.version,\n 'toolName': config$1.toolName,\n 'useraleVersion': config$1.useraleVersion,\n 'sessionId': config$1.sessionId\n };\n\n if (typeof filterHandler === 'function' && !filterHandler(intervalLog)) {\n return false;\n }\n\n if (typeof mapHandler === 'function') {\n intervalLog = mapHandler(intervalLog, e);\n }\n\n logs$1.push(intervalLog); // Reset\n\n intervalID = target;\n intervalType = type;\n intervalPath = path;\n intervalTimer = timestamp;\n intervalCounter = 0;\n } // Interval is still occuring, just update counter\n\n\n if (intervalID == target && intervalType == type) {\n intervalCounter = intervalCounter + 1;\n }\n\n return true;\n }\n /**\n * Extracts coordinate information from the event\n * depending on a few browser quirks.\n * @param {Object} e The event to extract coordinate information from.\n * @return {Object} An object containing nullable x and y coordinates for the event.\n */\n\n function getLocation(e) {\n if (e.pageX != null) {\n return {\n 'x': e.pageX,\n 'y': e.pageY\n };\n } else if (e.clientX != null) {\n return {\n 'x': document.documentElement.scrollLeft + e.clientX,\n 'y': document.documentElement.scrollTop + e.clientY\n };\n } else {\n return {\n 'x': null,\n 'y': null\n };\n }\n }\n /**\n * Extracts innerWidth and innerHeight to provide estimates of screen resolution\n * @return {Object} An object containing the innerWidth and InnerHeight\n */\n\n function getSreenRes() {\n return {\n 'width': window.innerWidth,\n 'height': window.innerHeight\n };\n }\n /**\n * Builds a string CSS selector from the provided element\n * @param {HTMLElement} ele The element from which the selector is built.\n * @return {string} The CSS selector for the element, or Unknown if it can't be determined.\n */\n\n function getSelector(ele) {\n if (ele.localName) {\n return ele.localName + (ele.id ? '#' + ele.id : '') + (ele.className ? '.' + ele.className : '');\n } else if (ele.nodeName) {\n return ele.nodeName + (ele.id ? '#' + ele.id : '') + (ele.className ? '.' + ele.className : '');\n } else if (ele && ele.document && ele.location && ele.alert && ele.setInterval) {\n return \"Window\";\n } else {\n return \"Unknown\";\n }\n }\n /**\n * Builds an array of elements from the provided event target, to the root element.\n * @param {Object} e Event from which the path should be built.\n * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element.\n */\n\n function buildPath(e) {\n var path = [];\n\n if (e.path) {\n path = e.path;\n } else {\n var ele = e.target;\n\n while (ele) {\n path.push(ele);\n ele = ele.parentElement;\n }\n }\n\n return selectorizePath(path);\n }\n /**\n * Builds a CSS selector path from the provided list of elements.\n * @param {HTMLElement[]} path Array of HTMLElements from which the path should be built.\n * @return {string[]} Array of string CSS selectors.\n */\n\n function selectorizePath(path) {\n var i = 0;\n var pathEle;\n var pathSelectors = [];\n\n while (pathEle = path[i]) {\n pathSelectors.push(getSelector(pathEle));\n ++i;\n }\n\n return pathSelectors;\n }\n function detectBrowser() {\n return {\n 'browser': browser ? browser.name : '',\n 'version': browser ? browser.version : ''\n };\n }\n\n /*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n var events;\n var bufferBools;\n var bufferedEvents; //@todo: Investigate drag events and their behavior\n\n var intervalEvents = ['click', 'focus', 'blur', 'input', 'change', 'mouseover', 'submit'];\n var refreshEvents;\n var windowEvents = ['load', 'blur', 'focus'];\n /**\n * Maps an event to an object containing useful information.\n * @param {Object} e Event to extract data from\n */\n\n function extractMouseEvent(e) {\n return {\n 'clicks': e.detail,\n 'ctrl': e.ctrlKey,\n 'alt': e.altKey,\n 'shift': e.shiftKey,\n 'meta': e.metaKey // 'text' : e.target.innerHTML\n\n };\n }\n /**\n * Defines the way information is extracted from various events.\n * Also defines which events we will listen to.\n * @param {Object} config Configuration object to read from.\n */\n\n function defineDetails(config) {\n // Events list\n // Keys are event types\n // Values are functions that return details object if applicable\n events = {\n 'click': extractMouseEvent,\n 'dblclick': extractMouseEvent,\n 'mousedown': extractMouseEvent,\n 'mouseup': extractMouseEvent,\n 'focus': null,\n 'blur': null,\n 'input': config.logDetails ? function (e) {\n return {\n 'value': e.target.value\n };\n } : null,\n 'change': config.logDetails ? function (e) {\n return {\n 'value': e.target.value\n };\n } : null,\n 'dragstart': null,\n 'dragend': null,\n 'drag': null,\n 'drop': null,\n 'keydown': config.logDetails ? function (e) {\n return {\n 'key': e.keyCode,\n 'ctrl': e.ctrlKey,\n 'alt': e.altKey,\n 'shift': e.shiftKey,\n 'meta': e.metaKey\n };\n } : null,\n 'mouseover': null\n };\n bufferBools = {};\n bufferedEvents = {\n 'wheel': function wheel(e) {\n return {\n 'x': e.deltaX,\n 'y': e.deltaY,\n 'z': e.deltaZ\n };\n },\n 'scroll': function scroll() {\n return {\n 'x': window.scrollX,\n 'y': window.scrollY\n };\n },\n 'resize': function resize() {\n return {\n 'width': window.outerWidth,\n 'height': window.outerHeight\n };\n }\n };\n refreshEvents = {\n 'submit': null\n };\n }\n /**\n * Defines the way information is extracted from various events.\n * Also defines which events we will listen to.\n * @param {Object} options UserALE.js Configuration object to read from.\n * @param {string} type of html event (e.g., 'click', 'mouseover', etc.), such as passed to addEventListener methods.\n */\n\n function defineCustomDetails(options, type) {\n // Events list\n // Keys are event types\n // Values are functions that return details object if applicable\n var eventType = {\n 'click': extractMouseEvent,\n 'dblclick': extractMouseEvent,\n 'mousedown': extractMouseEvent,\n 'mouseup': extractMouseEvent,\n 'focus': null,\n 'blur': null,\n 'input': options.logDetails ? function (e) {\n return {\n 'value': e.target.value\n };\n } : null,\n 'change': options.logDetails ? function (e) {\n return {\n 'value': e.target.value\n };\n } : null,\n 'dragstart': null,\n 'dragend': null,\n 'drag': null,\n 'drop': null,\n 'keydown': options.logDetails ? function (e) {\n return {\n 'key': e.keyCode,\n 'ctrl': e.ctrlKey,\n 'alt': e.altKey,\n 'shift': e.shiftKey,\n 'meta': e.metaKey\n };\n } : null,\n 'mouseover': null,\n 'wheel': function wheel(e) {\n return {\n 'x': e.deltaX,\n 'y': e.deltaY,\n 'z': e.deltaZ\n };\n },\n 'scroll': function scroll() {\n return {\n 'x': window.scrollX,\n 'y': window.scrollY\n };\n },\n 'resize': function resize() {\n return {\n 'width': window.outerWidth,\n 'height': window.outerHeight\n };\n },\n 'submit': null\n };\n return eventType[type];\n }\n /**\n * Hooks the event handlers for each event type of interest.\n * @param {Object} config Configuration object to use.\n * @return {boolean} Whether the operation succeeded\n */\n\n function attachHandlers(config) {\n defineDetails(config);\n Object.keys(events).forEach(function (ev) {\n document.addEventListener(ev, function (e) {\n packageLog(e, events[ev]);\n }, true);\n });\n intervalEvents.forEach(function (ev) {\n document.addEventListener(ev, function (e) {\n packageIntervalLog(e);\n }, true);\n });\n Object.keys(bufferedEvents).forEach(function (ev) {\n bufferBools[ev] = true;\n window.addEventListener(ev, function (e) {\n if (bufferBools[ev]) {\n bufferBools[ev] = false;\n packageLog(e, bufferedEvents[ev]);\n setTimeout(function () {\n bufferBools[ev] = true;\n }, config.resolution);\n }\n }, true);\n });\n Object.keys(refreshEvents).forEach(function (ev) {\n document.addEventListener(ev, function (e) {\n packageLog(e, events[ev]);\n }, true);\n });\n windowEvents.forEach(function (ev) {\n window.addEventListener(ev, function (e) {\n packageLog(e, function () {\n return {\n 'window': true\n };\n });\n }, true);\n });\n return true;\n }\n\n /*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n var sendIntervalId = null;\n /**\n * Initializes the log queue processors.\n * @param {Array} logs Array of logs to append to.\n * @param {Object} config Configuration object to use when logging.\n */\n\n function initSender(logs, config) {\n if (sendIntervalId !== null) {\n clearInterval(sendIntervalId);\n }\n\n sendIntervalId = sendOnInterval(logs, config);\n sendOnClose(logs, config);\n }\n /**\n * Checks the provided log array on an interval, flushing the logs\n * if the queue has reached the threshold specified by the provided config.\n * @param {Array} logs Array of logs to read from.\n * @param {Object} config Configuration object to be read from.\n * @return {Number} The newly created interval id.\n */\n\n function sendOnInterval(logs, config) {\n return setInterval(function () {\n if (!config.on) {\n return;\n }\n\n if (logs.length >= config.logCountThreshold) {\n sendLogs(logs.slice(0), config, 0); // Send a copy\n\n logs.splice(0); // Clear array reference (no reassignment)\n }\n }, config.transmitInterval);\n }\n /**\n * Attempts to flush the remaining logs when the window is closed.\n * @param {Array} logs Array of logs to be flushed.\n * @param {Object} config Configuration object to be read from.\n */\n\n function sendOnClose(logs, config) {\n window.addEventListener('pagehide', function () {\n if (logs.length > 0) {\n navigator.sendBeacon(config.url, JSON.stringify(logs));\n logs.splice(0); // clear log queue\n }\n });\n }\n /**\n * Sends the provided array of logs to the specified url,\n * retrying the request up to the specified number of retries.\n * @param {Array} logs Array of logs to send.\n * @param {string} config configuration parameters (e.g., to extract URL from & send the POST request to).\n * @param {Number} retries Maximum number of attempts to send the logs.\n */\n // @todo expose config object to sendLogs replate url with config.url\n\n function sendLogs(logs, config, retries) {\n var req = new XMLHttpRequest(); // @todo setRequestHeader for Auth\n\n var data = JSON.stringify(logs);\n req.open('POST', config.url);\n\n if (config.authHeader) {\n req.setRequestHeader('Authorization', config.authHeader);\n }\n\n req.setRequestHeader('Content-type', 'application/json;charset=UTF-8');\n\n req.onreadystatechange = function () {\n if (req.readyState === 4 && req.status !== 200) {\n if (retries > 0) {\n sendLogs(logs, config, retries--);\n }\n }\n };\n\n req.send(data);\n }\n\n var config = {};\n var logs = [];\n var startLoadTimestamp = Date.now();\n var endLoadTimestamp;\n\n window.onload = function () {\n endLoadTimestamp = Date.now();\n };\n\n exports.started = false;\n\n config.on = false;\n config.useraleVersion = version$1;\n configure(config, getInitialSettings());\n initPackager(logs, config);\n\n if (config.autostart) {\n setup(config);\n }\n /**\n * Hooks the global event listener, and starts up the\n * logging interval.\n * @param {Object} config Configuration settings for the logger\n */\n\n\n function setup(config) {\n if (!exports.started) {\n setTimeout(function () {\n var state = document.readyState;\n\n if (config.autostart && (state === 'interactive' || state === 'complete')) {\n attachHandlers(config);\n initSender(logs, config);\n exports.started = config.on = true;\n packageCustomLog({\n type: 'load',\n logType: 'raw',\n pageLoadTime: endLoadTimestamp - startLoadTimestamp\n }, function () {}, false);\n } else {\n setup(config);\n }\n }, 100);\n }\n } // Export the Userale API\n\n\n var version = version$1;\n /**\n * Used to start the logging process if the\n * autostart configuration option is set to false.\n */\n\n function start() {\n if (!exports.started || config.autostart === false) {\n exports.started = config.on = true;\n config.autostart = true;\n }\n }\n /**\n * Halts the logging process. Logs will no longer be sent.\n */\n\n function stop() {\n exports.started = config.on = false;\n config.autostart = false;\n }\n /**\n * Updates the current configuration\n * object with the provided values.\n * @param {Object} newConfig The configuration options to use.\n * @return {Object} Returns the updated configuration.\n */\n\n function options(newConfig) {\n if (newConfig !== undefined) {\n configure(config, newConfig);\n }\n\n return config;\n }\n /**\n * Appends a log to the log queue.\n * @param {Object} customLog The log to append.\n * @return {boolean} Whether the operation succeeded.\n */\n\n function log(customLog) {\n if (customLog !== null && _typeof(customLog) === 'object') {\n logs.push(customLog);\n return true;\n } else {\n return false;\n }\n }\n\n exports.buildPath = buildPath;\n exports.details = defineCustomDetails;\n exports.filter = setLogFilter;\n exports.getSelector = getSelector;\n exports.log = log;\n exports.map = setLogMapper;\n exports.options = options;\n exports.packageCustomLog = packageCustomLog;\n exports.packageLog = packageLog;\n exports.start = start;\n exports.stop = stop;\n exports.version = version;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n\n\n//# sourceURL=webpack://flagon-userale-example/./node_modules/flagon-userale/build/userale-2.3.0.js?" - ); - - /***/ - }, - - /******/ - }; - /************************************************************************/ - /******/ // The module cache - /******/ var __webpack_module_cache__ = {}; - /******/ - /******/ // The require function - /******/ function __webpack_require__(moduleId) { - /******/ // Check if module is in cache - /******/ var cachedModule = __webpack_module_cache__[moduleId]; - /******/ if (cachedModule !== undefined) { - /******/ return cachedModule.exports; - /******/ - } - /******/ // Create a new module (and put it into the cache) - /******/ var module = (__webpack_module_cache__[moduleId] = { - /******/ // no module.id needed - /******/ // no module.loaded needed - /******/ exports: {}, - /******/ - }); - /******/ - /******/ // Execute the module function - /******/ __webpack_modules__[moduleId].call( - module.exports, - module, - module.exports, - __webpack_require__ - ); - /******/ - /******/ // Return the exports of the module - /******/ return module.exports; - /******/ - } - /******/ - /************************************************************************/ - /******/ /* webpack/runtime/compat get default export */ - /******/ (() => { - /******/ // getDefaultExport function for compatibility with non-harmony modules - /******/ __webpack_require__.n = (module) => { - /******/ var getter = - module && module.__esModule - ? /******/ () => module["default"] - : /******/ () => module; - /******/ __webpack_require__.d(getter, { a: getter }); - /******/ return getter; - /******/ - }; - /******/ - })(); - /******/ - /******/ /* webpack/runtime/define property getters */ - /******/ (() => { - /******/ // define getter functions for harmony exports - /******/ __webpack_require__.d = (exports, definition) => { - /******/ for (var key in definition) { - /******/ if ( - __webpack_require__.o(definition, key) && - !__webpack_require__.o(exports, key) - ) { - /******/ Object.defineProperty(exports, key, { - enumerable: true, - get: definition[key], - }); - /******/ - } - /******/ - } - /******/ - }; - /******/ - })(); - /******/ - /******/ /* webpack/runtime/hasOwnProperty shorthand */ - /******/ (() => { - /******/ __webpack_require__.o = (obj, prop) => - Object.prototype.hasOwnProperty.call(obj, prop); - /******/ - })(); - /******/ - /******/ /* webpack/runtime/make namespace object */ - /******/ (() => { - /******/ // define __esModule on exports - /******/ __webpack_require__.r = (exports) => { - /******/ if (typeof Symbol !== "undefined" && Symbol.toStringTag) { - /******/ Object.defineProperty(exports, Symbol.toStringTag, { - value: "Module", - }); - /******/ - } - /******/ Object.defineProperty(exports, "__esModule", { value: true }); - /******/ - }; - /******/ - })(); - /******/ - /************************************************************************/ - /******/ - /******/ // startup - /******/ // Load entry module and return exports - /******/ // This entry module can't be inlined because the eval devtool is used. - /******/ var __webpack_exports__ = __webpack_require__("./index.js"); - /******/ - /******/ -})(); diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.html b/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.html deleted file mode 100644 index cb8e47f..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - UserAleJS - Example Page - - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.js b/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.js deleted file mode 100644 index 1a01f69..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/index.js +++ /dev/null @@ -1,181 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import * as userale from "flagon-userale"; - -//or use require -//const userale = require('flagon-userale'); - -/** Options API - * - * the 'options' API allows you to dynamically change UserALE params and set meta data values - * pass in variables or properties into the options object, such as from sessionStorage or localStorage - * NOTE1: if you are using userale in a package bundler, you will need to set options via this API, including - * "url" to tell userale where to send your logs! - * NOTE2: logDetails is set to true (default:false), this will log key strokes, inputs, and change events - * (be careful of your form data and auth workflows!) - */ -const changeMe = "me"; -userale.options({ - userId: changeMe, - url: "http://localhost:8000/", - version: "2.3.0", - logDetails: true, - toolName: "Apache UserALE Example (Custom)", - logCountThreshold: "1", - transmitInterval: "1000", -}); - -/**Filter API - - /**the 'filter' API allows you to eliminate logs you don't want - * use as a global filter and add classes of events or log types to eliminate - * or use in block scope to surgically eliminate logs from specific elements from an event handler - * The filter below reduces logs to capture click, change, select, scroll and submit events on index.html - * Note that for surgical filters, you may need to clear or reset back to a global filter callback - * the same is true for the 'map' API. See examples below: - */ -userale.addCallbacks({ - filter(log) { - var type_array = [ - "mouseup", - "mouseover", - "mousedown", - "keydown", - "dblclick", - "blur", - "focus", - "input", - "wheel", - ]; - var logType_array = ["interval"]; - if (type_array.includes(log.type) || logType_array.includes(log.logType)) { - return false; - } - return log; - }, -}); - -/**Log Mapping API - * - * the 'map' API allows you to add or modify new fields to your logs - * this example works with the "Click Me!" button at the top of index.html - */ -document.addEventListener("click", function (e) { - if (e.target.innerHTML === "Click Me!") { - userale.addCallbacks({ - map(log) { - return Object.assign({}, log, { - logType: "custom", - customLabel: "map & packageLog Example", - }); - }, - }); - userale.packageLog(e, userale.details(userale.options(), e.type)); - /**you'll want to reset the map callback function, or set a conditional (e.g., return log), else - * the callback may be applied to other events of the same class (e.g., click) */ - userale.removeCallbacks(["map"]); - } else { - return false; - } -}); - -/** Alternate Log Mapping API Example - * Build a global mapping function with conditional logic to modify logs for similar events - * this example works with the "Click Me!" button at the top of index.html - * Also, note that specifying log as a return will keep the scope of this callback limited to only the events you want - */ -//userale.map(function (log, e) { -// var targetsForLabels = ["button#test_button"]; -// if (targetsForLabels.includes(log.target)) { -// return Object.assign({}, log, { customLabel: e.target.innerHTML }); -// } else { -// return log; -// } -//}); - -/**'Log' API and Custom Log Functions - * - * the 'log' API generate custom events and add them to the log queue - * pass in any keys:values for fully customized logs - * utilize 'options' and other functions to streamline populating custom logs - * type 'log' into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "log") { - userale.log({ - target: userale.getSelector(e.target), - path: userale.buildPath(e), - clientTime: Date.now(), - type: e.type, - logType: "custom", - userAction: false, - details: { foo: "bar", bar: "foo" }, - customField1: "I can make this log look like anything I want", - customField2: "foo", - userId: userale.options().userId, - toolVersion: userale.options().version, - toolName: userale.options().toolName, - useraleVersion: userale.options().useraleVersion, - sessionId: userale.options().sessionId, - customLabel: "Custom Log Example", - }); - } -}); - -/**you can also use UserALE' own packaging function for HTML events to strive for standardization - * type 'packageLog into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "packageLog") { - /**You can then use the 'Mapping' API function to modify custom logs created with the packageLog function*/ - userale.addCallbacks({ - changeMap(log) { - var targetsForLabels = ["change"]; - if (targetsForLabels.includes(log.type)) { - return Object.assign({}, log, { - logType: "custom", - customLabel: "packageLog Example", - }); - } else { - return log; - } - }, - }); - /**You can also use the details function to package additional log meta data, or add custom details*/ - userale.packageLog(e, userale.details(userale.options(), e.type)); - } else { - return false; - } -}); - -/**you can also just add boilerplate UserALE meta data to custom logs with the packageCustomLog function - * type 'packageCustomLog into the 'API Test Field' to see this custom log sent to our example server - */ -document.addEventListener("change", function (e) { - if (e.target.value === "packageCustomLog") { - userale.packageCustomLog( - { - customLabel: "packageCustomLog Example", - customField1: "foo", - customField2: "bar", - }, - function () { - return { foo: "bar", bar: "foo" }; - }, - true - ); - } else { - return false; - } -}); diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/package-lock.json b/products/userale/packages/flagon-userale/example/webpackUserAleExample/package-lock.json deleted file mode 100644 index 7bb71ed..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/package-lock.json +++ /dev/null @@ -1,2310 +0,0 @@ -{ - "name": "flagon-userale-example", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "flagon-userale-example", - "version": "0.1.0", - "license": "Apache-2.0", - "dependencies": { - "flagon-userale": "^2.3.0" - }, - "devDependencies": { - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0" - }, - "engines": { - "node": "10.10.0 || 11.10.0 - 12.20.1 || >=13.7.0", - "npm": "6.4.1 || 6.7.0 - 6.12.1 || >=6.13.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.218", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.218.tgz", - "integrity": "sha512-INDylKH//YIf2w67D+IjkfVnGVrZ/D94DAU/FPPm6T4jEPbEDQvo9r2wTj0ncFdtJH8+V8BggZTaN8Rzk5wkgw==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flagon-userale": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/flagon-userale/-/flagon-userale-2.3.0.tgz", - "integrity": "sha512-1jMxLZyfw1Pv7BruMr+U96SNYCto7iRxZb/zzeo+CQerC22T8zaNKV7p1CwsP2hvpbwaykkIzUHuPz8EnzRcLQ==", - "engines": { - "node": "10.10.0 || 11.10.0 - 12.20.1 || >=13.7.0", - "npm": "6.4.1 || 6.7.0 - 6.12.1 || >=6.13.4" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.4.tgz", - "integrity": "sha512-SmnkUhBxLDcBfTIeaq+ZqJXLVEyXxSaNcCeSezECdKjfkMrTTnPvapBILylYwyEvHFZAn2cJ8dtiXel5XnfOfQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - } - }, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "electron-to-chromium": { - "version": "1.4.218", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.218.tgz", - "integrity": "sha512-INDylKH//YIf2w67D+IjkfVnGVrZ/D94DAU/FPPm6T4jEPbEDQvo9r2wTj0ncFdtJH8+V8BggZTaN8Rzk5wkgw==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flagon-userale": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/flagon-userale/-/flagon-userale-2.3.0.tgz", - "integrity": "sha512-1jMxLZyfw1Pv7BruMr+U96SNYCto7iRxZb/zzeo+CQerC22T8zaNKV7p1CwsP2hvpbwaykkIzUHuPz8EnzRcLQ==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.4.tgz", - "integrity": "sha512-SmnkUhBxLDcBfTIeaq+ZqJXLVEyXxSaNcCeSezECdKjfkMrTTnPvapBILylYwyEvHFZAn2cJ8dtiXel5XnfOfQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - } - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - } - } -} diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/package.json b/products/userale/packages/flagon-userale/example/webpackUserAleExample/package.json deleted file mode 100644 index 1ac47ea..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "flagon-userale-example", - "version": "0.1.0", - "description": "NODE Example for Apache UserALE: the UserALE client for DOM and JavaScript-based applications. It automatically attaches event handlers to log every user interaction on a web page, including rich JS single-page apps.", - "main": "index.js", - "scripts": { - "test-example": "echo \"Error: no test specified\" && exit 1", - "build-example": "webpack" - }, - "repository": { - "type": "git", - "url": "git://git.apache.org/incubator-flagon-useralejs/example.git" - }, - "keywords": [ - "UserALE", - "Logging", - "Log Analytics", - "Business Analytics", - "Usability", - "User Testing", - "Behavioral Analytics" - ], - "author": "Apache Flagon", - "contributors": [ - "Joshua C. Poore", - "Clay Gimenez", - "Robert Foley", - "Michelle Beard", - "Alex Ford", - "Gedd Johnson" - ], - "license": "Apache-2.0", - "bugs": { - "url": "https://issues.apache.org/jira/browse/FLAGON" - }, - "homepage": "http://flagon.incubator.apache.org", - "engines": { - "node": "10.10.0 || 11.10.0 - 12.20.1 || >=13.7.0", - "npm": "6.4.1 || 6.7.0 - 6.12.1 || >=6.13.4" - }, - "dependencies": { - "flagon-userale": "^2.3.0" - }, - "devDependencies": { - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0" - } -} diff --git a/products/userale/packages/flagon-userale/example/webpackUserAleExample/webpack.config.js b/products/userale/packages/flagon-userale/example/webpackUserAleExample/webpack.config.js deleted file mode 100644 index a5c9df6..0000000 --- a/products/userale/packages/flagon-userale/example/webpackUserAleExample/webpack.config.js +++ /dev/null @@ -1,23 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// webpack.config.js - -module.exports = { - mode: 'development', - entry: './index.js', - output: { - filename: 'main.js', - publicPath: 'dist' - } -}; \ No newline at end of file diff --git a/products/userale/packages/flagon-userale/example/ws-index.html b/products/userale/packages/flagon-userale/example/ws-index.html deleted file mode 100644 index b79ab8d..0000000 --- a/products/userale/packages/flagon-userale/example/ws-index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - UserALE - Example Page - - - - - - - -
-

- This UserALE Example Page lets you explore how UserALE works, deploys with a script tag, and the data it generates.
- By default, you'll see the raw logs UserALE generates. We kept this page simple so that its easy to see how things work. -

-

- To see how our API can be used to shape UserALE logs to your needs, uncomment the 'index.js' script tag in index.html. -

-
-

Click the button below to generate targeted click events.

-
- -
-
-
-

Play around with the form elements below to see a variety of UserALE log types:

-

- Capture changes to fields (and values, when it's safe). -

-

- With index.js injected into the page, you can use the 'Test Field' below to see the behavior of our API dynamically.
- Type in the following UserALE function names to see their behavior. -

    -
  • "log" - ship a fully customized log, built from scratch
  • -
  • "packageLog" - hijack our own pipeline to modify and ship logs packaged exactly like standard UserALE logs
  • -
  • "packageCustomLog" - smash a number of custom fields together with UserALE standard metadata
  • -
- -
- -

- -
-
-

Capture inputs and changes to different types of selections.

- -
-
-
- Business Analytics
- HCI
- Other -
-
-
- -
-
-

Click on the Link to Test Logging with Page Navigation

- - - diff --git a/products/userale/packages/flagon-userale/src/attachHandlers.ts b/products/userale/packages/flagon-userale/src/attachHandlers.ts deleted file mode 100644 index f23b3f1..0000000 --- a/products/userale/packages/flagon-userale/src/attachHandlers.ts +++ /dev/null @@ -1,271 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { packageLog, packageIntervalLog } from "@/packageLogs"; -import { Events, Logging, Settings } from "@/types"; -import { Configuration } from "@/configure"; - -//@todo: Investigate drag events and their behavior -let events: Events.EventDetailsMap; -let bufferBools: Events.EventBoolMap; -let bufferedEvents: Events.EventDetailsMap; -let refreshEvents: Events.EventDetailsMap; -const intervalEvents: Array = [ - "click", - "focus", - "blur", - "input", - "change", - "mouseover", - "submit", -]; -const windowEvents: Array = ["load", "blur", "focus"]; - -/** - * Maps a MouseEvent to an object containing useful information. - * @param {MouseEvent} e Event to extract data from - */ -export function extractMouseDetails(e: MouseEvent) { - return { - clicks: e.detail, - ctrl: e.ctrlKey, - alt: e.altKey, - shift: e.shiftKey, - meta: e.metaKey, - // 'text' : e.target.innerHTML - }; -} - -/** Maps a KeyboardEvent to an object containing useful infromation - * @param {KeyboardEvent} e Event to extract data from - */ -export function extractKeyboardDetails(e: KeyboardEvent) { - return { - key: e.key, - code: e.code, - ctrl: e.ctrlKey, - alt: e.altKey, - shift: e.shiftKey, - meta: e.metaKey, - }; -} - -/** - * Maps an InputEvent to an object containing useful information. - * @param {InputEvent} e Event to extract data from - */ -export function extractInputDetails(e: InputEvent) { - return { - value: (e.target as HTMLInputElement).value, - }; -} - -/** - * Maps a ChangeEvent to an object containing useful information. - * @param {Events.ChangeEvent} e Event to extract data from - */ -export function extractChangeDetails(e: Events.ChangeEvent) { - return { - value: e.target.value, - }; -} - -/** - * Maps a WheelEvent to an object containing useful information. - * @param {WheelEvent} e Event to extract data from - */ -export function extractWheelDetails(e: WheelEvent) { - return { - x: e.deltaX, - y: e.deltaY, - z: e.deltaZ, - }; -} - -/** - * Maps a ScrollEvent to an object containing useful information. - */ -export function extractScrollDetails() { - return { - x: window.scrollX, - y: window.scrollY, - }; -} - -/** - * Maps a ResizeEvent to an object containing useful information. - */ -export function extractResizeDetails() { - return { - width: window.outerWidth, - height: window.outerHeight, - }; -} - -/** - * Defines the way information is extracted from various events. - * Also defines which events we will listen to. - * @param {Settings.Config} config Configuration object to read from. - */ -export function defineDetails(config: Settings.DefaultConfig): void { - // Events list - // Keys are event types - // Values are functions that return details object if applicable - events = { - click: extractMouseDetails, - dblclick: extractMouseDetails, - mousedown: extractMouseDetails, - mouseup: extractMouseDetails, - focus: null, - blur: null, - input: config.logDetails ? extractKeyboardDetails : null, - change: config.logDetails ? extractChangeDetails : null, - dragstart: null, - dragend: null, - drag: null, - drop: null, - keydown: config.logDetails ? extractKeyboardDetails : null, - mouseover: null, - }; - - bufferBools = {}; - bufferedEvents = { - wheel: extractWheelDetails, - scroll: extractScrollDetails, - resize: extractResizeDetails, - }; - - refreshEvents = { - submit: null, - }; -} - -/** - * Defines the way information is extracted from various events. - * Also defines which events we will listen to. - * @param {Settings.Config} options UserALE Configuration object to read from. - * @param {Events.AllowedEvents} type of html event (e.g., 'click', 'mouseover', etc.), such as passed to addEventListener methods. - */ -export function defineCustomDetails( - options: Settings.DefaultConfig, - type: Events.AllowedEvents, -): Logging.DynamicDetailFunction | null | undefined { - // Events list - // Keys are event types - // Values are functions that return details object if applicable - const eventType: Events.EventDetailsMap = { - click: extractMouseDetails, - dblclick: extractMouseDetails, - mousedown: extractMouseDetails, - mouseup: extractMouseDetails, - focus: null, - blur: null, - load: null, - input: options.logDetails ? extractKeyboardDetails : null, - change: options.logDetails ? extractChangeDetails : null, - dragstart: null, - dragend: null, - drag: null, - drop: null, - keydown: options.logDetails ? extractKeyboardDetails : null, - mouseover: null, - wheel: extractWheelDetails, - scroll: extractScrollDetails, - resize: extractResizeDetails, - submit: null, - }; - return eventType[type]; -} - -/** - * Hooks the event handlers for each event type of interest. - * @param {Configuration} config Configuration singleton to use. - * @return {boolean} Whether the operation succeeded - */ -export function attachHandlers(config: Configuration): boolean { - try { - defineDetails(config); - - (Object.keys(events) as Events.AllowedEvents[]).forEach(function (ev) { - document.addEventListener( - ev, - function (e) { - packageLog(e, events[ev]); - }, - true, - ); - }); - - intervalEvents.forEach(function (ev) { - document.addEventListener( - ev, - function (e) { - packageIntervalLog(e); - }, - true, - ); - }); - - (Object.keys(bufferedEvents) as Events.BufferedEvents[]).forEach( - function (ev) { - bufferBools[ev] = true; - - self.addEventListener( - ev, - function (e) { - if (bufferBools[ev]) { - bufferBools[ev] = false; - packageLog(e, bufferedEvents[ev]); - setTimeout(function () { - bufferBools[ev] = true; - }, config.resolution); - } - }, - true, - ); - }, - ); - - (Object.keys(refreshEvents) as Events.RefreshEvents[]).forEach( - function (ev) { - document.addEventListener( - ev, - function (e) { - packageLog(e, events[ev]); - }, - true, - ); - }, - ); - - windowEvents.forEach(function (ev) { - self.addEventListener( - ev, - function (e) { - packageLog(e, function () { - return { window: true }; - }); - }, - true, - ); - }); - - return true; - } catch { - return false; - } -} diff --git a/products/userale/packages/flagon-userale/src/getInitialSettings.ts b/products/userale/packages/flagon-userale/src/getInitialSettings.ts deleted file mode 100644 index 324e977..0000000 --- a/products/userale/packages/flagon-userale/src/getInitialSettings.ts +++ /dev/null @@ -1,171 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the 'License'); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { Settings } from "./types"; - -let sessionId: string | null = null; -let httpSessionId: string | null = null; - -/** - * Extracts the initial configuration settings from the - * currently executing script tag. - * @return {Object} The extracted configuration object - */ -export function getInitialSettings(): Settings.Config { - if ( - typeof WorkerGlobalScope !== "undefined" && - self instanceof WorkerGlobalScope - ) { - const settings: Settings.Config = { - authHeader: null, - autostart: true, - browserSessionId: null, - custIndex: null, - headers: null, - httpSessionId: null, - logCountThreshold: +5, - logDetails: false, - resolution: +500, - sessionId: sessionId, - time: (ts?: number) => (ts !== undefined ? ts : Date.now()), - toolName: null, - toolVersion: null, - transmitInterval: +5000, - url: "http://localhost:8000", - useraleVersion: null, - userFromParams: null, - userId: null, - }; - return settings; - } - - if (sessionId === null) { - sessionId = getsessionId( - "userAlesessionId", - "session_" + String(Date.now()), - ); - } - - if (httpSessionId === null) { - httpSessionId = getsessionId( - "userAleHttpSessionId", - generatehttpSessionId(), - ); - } - - const script = - document.currentScript || - (function () { - const scripts = document.getElementsByTagName("script"); - return scripts[scripts.length - 1]; - })(); - - const get = script - ? script.getAttribute.bind(script) - : function () { - return null; - }; - const headers = get("data-headers"); - const settings: Settings.Config = { - authHeader: get("data-auth") || null, - autostart: get("data-autostart") === "false" ? false : true, - browserSessionId: null, - custIndex: get("data-index") || null, - headers: headers ? JSON.parse(headers) : null, - httpSessionId: httpSessionId, - logCountThreshold: +(get("data-threshold") || 5), - logDetails: get("data-log-details") === "true" ? true : false, - resolution: +(get("data-resolution") || 500), - sessionId: get("data-session") || sessionId, - time: timeStampScale(document.createEvent("CustomEvent")), - toolName: get("data-tool") || null, - toolVersion: get("data-version") || null, - transmitInterval: +(get("data-interval") || 5000), - url: get("data-url") || "http://localhost:8000", - useraleVersion: get("data-userale-version") || null, - userFromParams: get("data-user-from-params") || null, - userId: get("data-user") || null, - }; - return settings; -} - -/** - * defines sessionId, stores it in sessionStorage, checks to see if there is a sessionId in - * storage when script is started. This prevents events like 'submit', which refresh page data - * from refreshing the current user session - * - */ -export function getsessionId(sessionKey: string, value: any) { - if (self.sessionStorage.getItem(sessionKey) === null) { - self.sessionStorage.setItem(sessionKey, JSON.stringify(value)); - return value; - } - - return JSON.parse(self.sessionStorage.getItem(sessionKey) || ""); -} - -/** - * Creates a function to normalize the timestamp of the provided event. - * @param {Event} e An event containing a timeStamp property. - * @return {typeof timeStampScale~tsScaler} The timestamp normalizing function. - */ -export function timeStampScale(e: Event): Settings.TimeFunction { - let tsScaler: Settings.TimeFunction; - if (e.timeStamp && e.timeStamp > 0) { - const delta = Date.now() - e.timeStamp; - /** - * Returns a timestamp depending on various browser quirks. - * @param {?Number} ts A timestamp to use for normalization. - * @return {Number} A normalized timestamp. - */ - - if (delta < 0) { - tsScaler = function () { - return e.timeStamp / 1000; - }; - } else if (delta > e.timeStamp) { - const navStart = performance.timeOrigin; - tsScaler = function (ts) { - return ts + navStart; - }; - } else { - tsScaler = function (ts) { - return ts; - }; - } - } else { - tsScaler = function () { - return Date.now(); - }; - } - - return tsScaler; -} - -/** - * Creates a cryptographiclly random string to represent this http session. - * @return {String} A random 32 digit hex string - */ -function generatehttpSessionId(): string { - // 32 digit hex -> 128 bits of info -> 2^64 ~= 10^19 sessions needed for 50% chance of collison - const len = 32; - const arr = new Uint8Array(len / 2); - window.crypto.getRandomValues(arr); - return Array.from(arr, (dec) => { - return dec.toString(16).padStart(2, "0"); - }).join(""); -} diff --git a/products/userale/packages/flagon-userale/src/main.ts b/products/userale/packages/flagon-userale/src/main.ts deleted file mode 100644 index 52df4cd..0000000 --- a/products/userale/packages/flagon-userale/src/main.ts +++ /dev/null @@ -1,175 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { defineCustomDetails } from "@/attachHandlers"; -import { registerAuthCallback } from "@/utils"; -import { - addCallbacks, - removeCallbacks, - packageLog, - packageCustomLog, - getSelector, - buildPath, - initPackager, -} from "@/packageLogs"; -import { version as userAleVersion } from "../package.json"; -import { Configuration } from "@/configure"; -import { attachHandlers } from "@/attachHandlers"; -import { initSender } from "@/sendLogs"; - -import type { Settings, Logging } from "@/types"; - -const config = Configuration.getInstance(); -const logs: Array = []; - -const startLoadTimestamp = Date.now(); -let endLoadTimestamp: number; -self.onload = function () { - endLoadTimestamp = Date.now(); -}; - -export let started = false; -export { defineCustomDetails as details } from "@/attachHandlers"; -export { registerAuthCallback as registerAuthCallback } from "@/utils"; -export { - addCallbacks as addCallbacks, - removeCallbacks as removeCallbacks, - packageLog as packageLog, - packageCustomLog as packageCustomLog, - getSelector as getSelector, - buildPath as buildPath, -} from "@/packageLogs"; -export type { Logging } from "@/types"; - -config.update({ - useraleVersion: userAleVersion, -}); -initPackager(logs, config); -if (config.autostart) { - setup(config); -} - -/** - * Hooks the global event listener, and starts up the - * logging interval. - * @param {Configuration} config Configuration settings for the logger - */ -function setup(config: Configuration) { - if (!started) { - setTimeout(function () { - let state; - try { - state = document.readyState; - } catch (error) { - // Assume there is no DOM and this is a web worker context - state = "complete"; - } - - if ( - config.autostart && - (state === "interactive" || state === "complete") - ) { - attachHandlers(config); - initSender(logs, config); - started = config.on = true; - if (typeof window !== "undefined" && typeof document !== "undefined") { - packageCustomLog( - { - type: "load", - details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp }, - }, - () => ({}), - false, - ); - } - } else { - setup(config); - } - }, 100); - } -} - -// Export the Userale API -export const version = userAleVersion; - -/** - * Used to start the logging process if the - * autostart configuration option is set to false. - */ -export function start(): void { - if (!started || config.autostart === false) { - started = config.on = true; - config.update({ autostart: true }); - } -} - -/** - * Halts the logging process. Logs will no longer be sent. - */ -export function stop(): void { - started = config.on = false; - config.update({ autostart: false }); -} - -/** - * Updates the current configuration - * object with the provided values. - * @param {Partial} newConfig The configuration options to use. - * @return {Settings.Config} Returns the updated configuration. - */ -export function options( - newConfig: Partial | undefined, -): Settings.Config { - if (newConfig) { - config.update(newConfig); - } - - return config; -} - -/** - * Appends a log to the log queue. - * @param {Logging.CustomLog} customLog The log to append. - * @return {boolean} Whether the operation succeeded. - */ -export function log(customLog: Logging.CustomLog | undefined) { - if (customLog) { - logs.push(customLog); - return true; - } else { - return false; - } -} - -// Only attach to window in IIFE builds -if (typeof window !== "undefined") { - (window as any).userale = { - start, - stop, - options, - log, - version: userAleVersion, - details: defineCustomDetails, - registerAuthCallback, - addCallbacks, - removeCallbacks, - packageLog, - packageCustomLog, - getSelector, - buildPath, - }; -} diff --git a/products/userale/packages/flagon-userale/src/packageLogs.ts b/products/userale/packages/flagon-userale/src/packageLogs.ts deleted file mode 100644 index 98e3ee0..0000000 --- a/products/userale/packages/flagon-userale/src/packageLogs.ts +++ /dev/null @@ -1,462 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Callbacks, Logging } from "@/types"; -import { Configuration } from "@/configure"; - -export let logs: Array; -let config: Configuration; - -// Interval Logging Globals -let intervalId: string | null; -let intervalType: string | null; -let intervalPath: string[] | null; -let intervalTimer: number | null; -let intervalCounter: number | null; -let intervalLog: Logging.Log | null; - -export const filterHandler: CallableFunction | null = null; -export const mapHandler: CallableFunction | null = null; -export let cbHandlers: Callbacks.CallbackMap = {}; - -/** - * Adds named callbacks to be executed when logging. - * @param {Object } newCallbacks An object containing named callback functions. - */ -export function addCallbacks( - ...newCallbacks: Record[] -) { - newCallbacks.forEach((source) => { - let descriptors: { [key in string | symbol]: any } = {}; - - descriptors = Object.keys(source).reduce((descriptors, key) => { - descriptors[key] = Object.getOwnPropertyDescriptor(source, key); - return descriptors; - }, descriptors); - - Object.getOwnPropertySymbols(source).forEach((sym) => { - const descriptor = Object.getOwnPropertyDescriptor(source, sym); - if (descriptor?.enumerable) { - descriptors[sym] = descriptor; - } - }); - Object.defineProperties(cbHandlers, descriptors); - }); - return cbHandlers; -} - -/** - * Removes callbacks by name. - * @param {String[]} targetKeys A list of names of functions to remove. - */ -export function removeCallbacks(targetKeys: string[]) { - targetKeys.forEach((key) => { - if (Object.prototype.hasOwnProperty.call(cbHandlers, key)) { - delete cbHandlers[key]; - } - }); -} - -/** - * Assigns the config and log container to be used by the logging functions. - * @param {Array} newLogs Log container. - * @param {Object} newConfig Configuration to use while logging. - */ -export function initPackager( - newLogs: Array, - newConfig: Configuration, -) { - logs = newLogs; - config = newConfig; - cbHandlers = {}; - intervalId = null; - intervalType = null; - intervalPath = null; - intervalTimer = null; - intervalCounter = 0; - intervalLog = null; -} - -/** - * Transforms the provided HTML event into a log and appends it to the log queue. - * @param {Event} e The event to be logged. - * @param {Function} detailFcn The function to extract additional log parameters from the event. - * @return {boolean} Whether the event was logged. - */ -export function packageLog( - e: Event, - detailFcn?: Logging.DynamicDetailFunction | null, -) { - if (!config.on) { - return false; - } - - let details = null; - if (detailFcn) { - details = detailFcn(e); - } - - const timeFields = extractTimeFields( - e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now(), - ); - - let log: Logging.Log = { - target: e.target ? getSelector(e.target) : null, - path: buildPath(e), - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - clientTime: timeFields.milli, - microTime: timeFields.micro, - location: getLocation(e), - scrnRes: getScreenRes(), - type: e.type, - logType: "raw", - userAction: true, - details: details, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId, - attributes: buildAttrs(e), - style: buildCSS(e), - }; - - if (typeof filterHandler === "function" && !filterHandler(log)) { - return false; - } - - if (typeof mapHandler === "function") { - log = mapHandler(log, e); - } - - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - log = func(log, e); - if (!log) { - return false; - } - } - } - - logs.push(log); - return true; -} - -/** - * Packages the provided customLog to include standard meta data and appends it to the log queue. - * @param {Logging.CustomLog} customLog The behavior to be logged. - * @param {Logging.DynamicDetailFunction} detailFcn The function to extract additional log parameters from the event. - * @param {boolean} userAction Indicates user behavior (true) or system behavior (false) - * @return {boolean} Whether the event was logged. - */ -export function packageCustomLog( - customLog: Logging.CustomLog, - detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction, - userAction: boolean, -): boolean { - if (!config.on) { - return false; - } - - let details = null; - if (detailFcn.length === 0) { - // In the case of a union, the type checker will default to the more stringent - // type, i.e. the DetailFunction that expects an argument for safety purposes. - // To avoid this, we must explicitly check the type by asserting it receives - // no arguments (detailFcn.length === 0) and then cast it to the - // StaticDetailFunction type. - const staticDetailFcn = detailFcn as Logging.StaticDetailFunction; - details = staticDetailFcn(); - } - - const metaData = { - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - clientTime: Date.now(), - scrnRes: getScreenRes(), - logType: "custom", - userAction: userAction, - details: details, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId, - }; - - let log = Object.assign(metaData, customLog); - - if (typeof filterHandler === "function" && !filterHandler(log)) { - return false; - } - - if (typeof mapHandler === "function") { - log = mapHandler(log); - } - - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - log = func(log, null); - if (!log) { - return false; - } - } - } - - logs.push(log); - - return true; -} - -/** - * Extract the millisecond and microsecond portions of a timestamp. - * @param {Number} timeStamp The timestamp to split into millisecond and microsecond fields. - * @return {Object} An object containing the millisecond - * and microsecond portions of the timestamp. - */ -export function extractTimeFields(timeStamp: number) { - return { - milli: Math.floor(timeStamp), - micro: Number((timeStamp % 1).toFixed(3)), - }; -} - -/** - * Track intervals and gather details about it. - * @param {Object} e - * @return boolean - */ -export function packageIntervalLog(e: Event) { - try { - const target = e.target ? getSelector(e.target) : null; - const path = buildPath(e); - const type = e.type; - const timestamp = Math.floor( - e.timeStamp && e.timeStamp > 0 ? config.time(e.timeStamp) : Date.now(), - ); - - // Init - this should only happen once on initialization - if (intervalId == null) { - intervalId = target; - intervalType = type; - intervalPath = path; - intervalTimer = timestamp; - intervalCounter = 0; - } - - if ((intervalId !== target || intervalType !== type) && intervalTimer) { - // When to create log? On transition end - // @todo Possible for intervalLog to not be pushed in the event the interval never ends... - - intervalLog = { - target: intervalId, - path: intervalPath, - pageUrl: self.location.href, - pageTitle: document.title, - pageReferrer: document.referrer, - userAgent: self.navigator.userAgent, - count: intervalCounter, - duration: timestamp - intervalTimer, // microseconds - startTime: intervalTimer, - endTime: timestamp, - type: intervalType, - logType: "interval", - targetChange: intervalId !== target, - typeChange: intervalType !== type, - userAction: false, - userId: config.userId, - toolVersion: config.toolVersion, - toolName: config.toolName, - useraleVersion: config.useraleVersion, - sessionId: config.sessionId, - httpSessionId: config.httpSessionId, - browserSessionId: config.browserSessionId, - }; - - if (typeof filterHandler === "function" && !filterHandler(intervalLog)) { - return false; - } - - if (typeof mapHandler === "function") { - intervalLog = mapHandler(intervalLog, e); - } - - for (const func of Object.values(cbHandlers)) { - if (typeof func === "function") { - intervalLog = func(intervalLog, null); - if (!intervalLog) { - return false; - } - } - } - - if (intervalLog) logs.push(intervalLog); - - // Reset - intervalId = target; - intervalType = type; - intervalPath = path; - intervalTimer = timestamp; - intervalCounter = 0; - } - - // Interval is still occuring, just update counter - if (intervalId == target && intervalType == type && intervalCounter) { - intervalCounter = intervalCounter + 1; - } - - return true; - } catch { - return false; - } -} - -/** - * Extracts coordinate information from the event - * depending on a few browser quirks. - * @param {Event} e The event to extract coordinate information from. - * @return {Object} An object containing nullable x and y coordinates for the event. - */ -export function getLocation(e: Event) { - if (e instanceof MouseEvent) { - if (e.pageX != null) { - return { x: e.pageX, y: e.pageY }; - } else if (e.clientX != null) { - return { - x: document.documentElement.scrollLeft + e.clientX, - y: document.documentElement.scrollTop + e.clientY, - }; - } - } else { - return { x: null, y: null }; - } -} - -/** - * Extracts innerWidth and innerHeight to provide estimates of screen resolution - * @return {Object} An object containing the innerWidth and InnerHeight - */ -export function getScreenRes() { - return { width: self.innerWidth, height: self.innerHeight }; -} - -/** - * Builds a string CSS selector from the provided element - * @param {EventTarget} ele The element from which the selector is built. - * @return {string} The CSS selector for the element, or Unknown if it can't be determined. - */ -export function getSelector(ele: EventTarget) { - if (ele instanceof HTMLElement || ele instanceof Element) { - if (ele.localName) { - return ( - ele.localName + - (ele.id ? "#" + ele.id : "") + - (ele.className ? "." + ele.className : "") - ); - } else if (ele.nodeName) { - return ( - ele.nodeName + - (ele.id ? "#" + ele.id : "") + - (ele.className ? "." + ele.className : "") - ); - } - } else if (ele instanceof Document) { - return "#document"; - } else if (ele === globalThis) { - return "Window"; - } - return "Unknown"; -} - -/** - * Builds an array of elements from the provided event target, to the root element. - * @param {Event} e Event from which the path should be built. - * @return {HTMLElement[]} Array of elements, starting at the event target, ending at the root element. - */ -export function buildPath(e: Event) { - const path = e.composedPath(); - return selectorizePath(path); -} - -/** - * Builds a CSS selector path from the provided list of elements. - * @param {EventTarget[]} path Array of HTML Elements from which the path should be built. - * @return {string[]} Array of string CSS selectors. - */ -export function selectorizePath(path: EventTarget[]) { - let i = 0; - let pathEle; - const pathSelectors: string[] = []; - while ((pathEle = path[i])) { - pathSelectors.push(getSelector(pathEle)); - ++i; - pathEle = path[i]; - } - return pathSelectors; -} - -/** - * Builds an object containing attributes of an element. - * Attempts to parse all attribute values as JSON text. - * @param {Event} e Event from which the target element's attributes should be extracted. - * @return {Record} Object with element attributes as key-value pairs. - */ -export function buildAttrs(e: Event): Record { - const attributes: Record = {}; - const attributeBlackList = ["style"]; - - if (e.target && e.target instanceof Element) { - for (const attr of e.target.attributes) { - if (attributeBlackList.includes(attr.name)) continue; - let val: any = attr.value; - try { - val = JSON.parse(val); - } catch { - // Ignore parsing errors, fallback to raw string value - } - attributes[attr.name] = val; - } - } - - return attributes; -} - -/** - * Builds an object containing all CSS properties of an element. - * @param {Event} e Event from which the target element's properties should be extracted. - * @return {Record} Object with all CSS properties as key-value pairs. - */ -export function buildCSS(e: Event): Record { - const properties: Record = {}; - if (e.target && e.target instanceof HTMLElement) { - const styleObj = e.target.style; - for (let i = 0; i < styleObj.length; i++) { - const prop = styleObj[i]; - properties[prop] = styleObj.getPropertyValue(prop); - } - } - return properties; -} diff --git a/products/userale/packages/flagon-userale/src/sendLogs.ts b/products/userale/packages/flagon-userale/src/sendLogs.ts deleted file mode 100644 index 89ed67f..0000000 --- a/products/userale/packages/flagon-userale/src/sendLogs.ts +++ /dev/null @@ -1,176 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Configuration } from "@/configure"; -import { Logging } from "@/types"; -import { updateAuthHeader, updateCustomHeaders } from "@/utils"; - -let sendIntervalId: string | number | NodeJS.Timeout | undefined; -let wsock: WebSocket; - -/** - * Initializes the log queue processors. - * @param {Array} logs Array of logs to append to. - * @param {Configuration} config Configuration object to use when logging. - */ -export function initSender(logs: Array, config: Configuration) { - if (sendIntervalId) { - clearInterval(sendIntervalId); - } - - const url = new URL(config.url); - if (url.protocol === "ws:" || url.protocol === "wss:") { - wsock = new WebSocket(config.url); - } - - sendIntervalId = sendOnInterval(logs, config); - sendOnClose(logs, config); -} - -/** - * Checks the provided log array on an interval, flushing the logs - * if the queue has reached the threshold specified by the provided config. - * @param {Array} logs Array of logs to read from. - * @param {Configuration} config Configuration singleton to be read from. - * @return {Number} The newly created interval id. - */ -export function sendOnInterval( - logs: Array, - config: Configuration, -): NodeJS.Timeout { - return setInterval(function () { - if (!config.on) { - return; - } - - if (logs.length >= config.logCountThreshold) { - sendLogs(logs.slice(0), config, 0); // Send a copy - logs.splice(0); // Clear array reference (no reassignment) - } - }, config.transmitInterval); -} - -// /** -// * Attempts to flush the remaining logs when the window is closed. -// * @param {Array} logs Array of logs to be flushed. -// * @param {Configuration} config Configuration singleton to be read from. -// */ -export function sendOnClose( - logs: Array, - config: Configuration, -): void { - self.addEventListener("pagehide", function () { - if (!config.on) { - return; - } - - if (logs.length > 0) { - const url = new URL(config.url); - - if (url.protocol === "ws:" || url.protocol === "wss:") { - const data = JSON.stringify(logs); - wsock.send(data); - } else { - const headers: HeadersInit = new Headers(); - headers.set("Content-Type", "application/json;charset=UTF-8"); - - if (config.authHeader) { - headers.set("Authorization", config.authHeader.toString()); - } - - fetch(config.url, { - keepalive: true, - method: "POST", - headers: headers, - body: JSON.stringify(logs), - }).catch((error) => { - console.error(error); - }); - } - logs.splice(0); // clear log queue - } - }); -} - -/** - * Sends the provided array of logs to the specified url, - * retrying the request up to the specified number of retries. - * @param {Array} logs Array of logs to send. - * @param {Configuration} config configuration singleton. - * @param {Number} retries Maximum number of attempts to send the logs. - */ -export async function sendLogs( - logs: Array, - config: Configuration, - retries: number, -): Promise { - const data = JSON.stringify(logs); - const url = new URL(config.url); - - if (url.protocol === "ws:" || url.protocol === "wss:") { - wsock.send(data); - return; - } - - // Build headers - const headers = new Headers({ - "Content-Type": "application/json;charset=UTF-8", - }); - - updateAuthHeader(config); - if (config.authHeader) { - const authHeaderValue = - typeof config.authHeader === "function" - ? config.authHeader() - : config.authHeader; - headers.set("Authorization", authHeaderValue); - } - - // Update custom headers last to allow them to over-write the defaults. This assumes - // the user knows what they are doing and may want to over-write the defaults. - updateCustomHeaders(config); - if (config.headers) { - for (const [header, value] of Object.entries(config.headers)) { - headers.set(header, value); - } - } - - async function attemptSend(remainingRetries: number): Promise { - try { - const response = await fetch(config.url, { - method: "POST", - headers, - body: data, - }); - - if (!response.ok) { - if (remainingRetries > 0) { - return attemptSend(remainingRetries - 1); - } else { - throw new Error(`Failed to send logs: ${response.statusText}`); - } - } - } catch (error) { - if (remainingRetries > 0) { - return attemptSend(remainingRetries - 1); - } - throw error; - } - } - - return attemptSend(retries); -} diff --git a/products/userale/packages/flagon-userale/src/types.d.ts b/products/userale/packages/flagon-userale/src/types.d.ts deleted file mode 100644 index ec277ab..0000000 --- a/products/userale/packages/flagon-userale/src/types.d.ts +++ /dev/null @@ -1,161 +0,0 @@ -/*! - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export declare namespace Settings { - type Version = string | null; - type UserId = string | null; - type SessionId = string | null; - type UserFromParams = string | null; - type ToolName = string | null; - type AuthHeader = CallableFunction | string | null; - type CustomIndex = string | null; - type HeaderObject = { [key: string]: string }; - type Headers = HeaderObject | null; - type ConfigValueTypes = - | string - | number - | boolean - | null - | Version - | UserId - | SessionId - | UserFromParams - | ToolName - | AuthHeader - | CustomIndex - | Headers; - - type TimeFunction = (() => number) | ((ts: number) => number); - - export interface DefaultConfig { - [key: string]: ConfigValueTypes; - } - - export interface Config extends DefaultConfig { - autostart: boolean; - authHeader: AuthHeader; - browserSessionId: SessionId; - custIndex: CustomIndex; - headers: Headers; - httpSessionId: SessionId; - logCountThreshold: number; - logDetails: boolean; - on?: boolean; - resolution: number; - sessionId: SessionId; - time: TimeFunction; - toolName: ToolName; - toolVersion?: Version; - transmitInterval: number; - url: string; - userFromParams: UserFromParams; - useraleVersion: Version; - userId: UserId; - version?: Version; - websocketsEnabled?: boolean; - } - - export interface IConfiguration extends Config { - getInstance(): Configuration; - configure(newConfig: Config): void; - } -} - -// TODO: Switch to protobuf for managing log types -export declare namespace Logging { - type JSONObject = { - [key: string]: - | string - | number - | boolean - | null - | undefined - | JSONObject - | Array; - }; - export type Log = JSONObject; // TODO: Intersect this with the default log objects (raw & interval) - export type CustomLog = JSONObject; - - export type DynamicDetailFunction = ( - e: E, - ) => JSONObject; - export type StaticDetailFunction = () => JSONObject; -} - -export declare namespace Events { - type FormElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement; - type ChangeEvent = Event; - export type RawEvents = - | "dblclick" - | "mouseup" - | "mousedown" - | "dragstart" - | "dragend" - | "drag" - | "drop" - | "keydown"; - export type IntervalEvents = - | "click" - | "focus" - | "blur" - | "input" - | "change" - | "mouseover" - | "submit"; - export type WindowEvents = "load" | "blur" | "focus"; - export type BufferedEvents = "wheel" | "scroll" | "resize"; - export type RefreshEvents = "submit"; - export type AllowedEvents = - | RawEvents - | IntervalEvents - | WindowEvents - | BufferedEvents - | RefreshEvents; - - export type EventDetailsMap = Partial<{ - [key in T]: - | Logging.DynamicDetailFunction< - | MouseEvent - | KeyboardEvent - | InputEvent - | Events.ChangeEvent - | WheelEvent - > - | Logging.StaticDetailFunction - | null; - }>; - - export type EventBoolMap = Partial<{ - [key in T]: boolean; - }>; -} - -export declare namespace Callbacks { - export type AuthCallback = () => string; - export type HeadersCallback = () => Settings.HeaderObject; - - export type CallbackMap = { - [key in string]: CallableFunction; - }; -} - -export declare namespace Extension { - export type PluginConfig = { urlWhitelist: string }; - export type ConfigPayload = { - useraleConfig: Partial; - pluginConfig: PluginConfig; - }; -} diff --git a/products/userale/packages/flagon-userale/test/spec/main.spec.ts b/products/userale/packages/flagon-userale/test/spec/main.spec.ts deleted file mode 100644 index 5bfd59a..0000000 --- a/products/userale/packages/flagon-userale/test/spec/main.spec.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { createEnvFromFile } from "./testUtils"; - -describe("Userale API", () => { - const htmlFileName = "main.html"; - it("provides configs", async () => { - const dom = await createEnvFromFile(htmlFileName); - const config = dom.window.userale.options(); - expect(Object.keys(config)).toEqual( - expect.arrayContaining([ - "autostart", - "authHeader", - "browserSessionId", - "custIndex", - "headers", - "httpSessionId", - "logCountThreshold", - "logDetails", - "on", - "resolution", - "sessionId", - "time", - "toolName", - "toolVersion", - "transmitInterval", - "url", - "userFromParams", - "useraleVersion", - "userId", - "version", - "websocketsEnabled", - ]), - ); - dom.window.close(); - }); - - it("edits configs", async () => { - const dom = await createEnvFromFile(htmlFileName); - const config = dom.window.userale.options(); - const interval = config.transmitInterval; - dom.window.userale.options({ - transmitInterval: interval + 10, - }); - const newConfig = dom.window.userale.options(); - - expect(newConfig.transmitInterval).toBe(interval + 10); - dom.window.close(); - }); - - it("disables autostart", async () => { - const dom = await createEnvFromFile(htmlFileName); - dom.window.userale.options({ - autostart: false, - }); - const newConfig = dom.window.userale.options(); - - expect(newConfig.autostart).toBe(false); - dom.window.close(); - }); - - it("starts + stops", async () => { - const dom = await createEnvFromFile(htmlFileName); - setTimeout(() => { - const { userale } = dom.window; - expect(userale.options().on).toBe(true); - - userale.stop(); - expect(userale.options().on).toBe(false); - - userale.start(); - expect(userale.options().on).toBe(true); - - dom.window.close(); - }, 200); - }); - - it("sends custom logs", async () => { - const dom = await createEnvFromFile(htmlFileName); - const { userale } = dom.window; - - expect(userale.log({})).toBe(true); - expect(userale.log()).toBe(false); - expect(userale.log(null)).toBe(false); - - dom.window.close(); - }); -}); diff --git a/products/userale/packages/iife/README.md b/products/userale/packages/iife/README.md new file mode 100644 index 0000000..5b5c284 --- /dev/null +++ b/products/userale/packages/iife/README.md @@ -0,0 +1,92 @@ + + +# flagon-userale-iife + +Script-tag drop-in build of [Apache Flagon UserALE](../core-sdk/). Instruments a web page with zero JavaScript — configure entirely through `data-*` attributes on the ` +``` + +UserALE starts capturing DOM events immediately and sends logs as OTLP/HTTP JSON to `data-url`. + +## Configuration attributes + +| Attribute | Type | Default | Description | +|---|---|---|---| +| `data-url` | string | `http://localhost:4318` | OTLP/HTTP collector endpoint | +| `data-user` | string | `null` | User identifier attached to every log | +| `data-tool` | string | `null` | Application/tool name | +| `data-version` | string | `null` | Application version | +| `data-threshold` | number | `5` | Send after this many logs are queued | +| `data-interval` | number | `5000` | Also send every N milliseconds | +| `data-log-details` | boolean | `false` | Include extended DOM details in logs | +| `data-resolution` | number | `500` | Minimum ms between high-frequency events (mouseover, etc.) | +| `data-user-from-params` | string | `null` | URL query-param name to extract the user ID from | +| `data-autostart` | boolean | `true` | Start capturing immediately on load | + +## OTLP collector + +Logs are sent as OTLP/HTTP JSON to the configured endpoint. For local development, start the shared Jaeger collector from the flagon project root: + +```sh +pnpm collector:up # OTLP on :4318, Jaeger UI on :16686 +pnpm collector:down +``` + +## Development + +```sh +pnpm install +pnpm build # → build/main.global.js +``` + +## License + +Apache License 2.0. See [LICENSE](https://github.com/apache/flagon/blob/master/LICENSE) and [NOTICE](https://github.com/apache/flagon/blob/master/NOTICE). diff --git a/products/userale/packages/iife/build/main.global.js b/products/userale/packages/iife/build/main.global.js new file mode 100644 index 0000000..27dddd1 --- /dev/null +++ b/products/userale/packages/iife/build/main.global.js @@ -0,0 +1,1014 @@ +"use strict"; +/* Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.*/ +var userale = (() => { + // ../core-sdk/build/main.mjs + var version = "2.4.0"; + var Packager = class { + constructor(logs, config) { + this.intervalId = null; + this.intervalType = null; + this.intervalPath = null; + this.intervalTimer = null; + this.intervalCounter = 0; + this.logs = logs; + this.config = config; + this.cbHandlers = {}; + } + addCallbacks(...newCallbacks) { + for (const source of newCallbacks) { + const descriptors = {}; + for (const key of Object.keys(source)) { + const d = Object.getOwnPropertyDescriptor(source, key); + if (d) + descriptors[key] = d; + } + for (const sym of Object.getOwnPropertySymbols(source)) { + const d = Object.getOwnPropertyDescriptor(source, sym); + if (d?.enumerable) + descriptors[sym] = d; + } + Object.defineProperties(this.cbHandlers, descriptors); + } + return this.cbHandlers; + } + removeCallbacks(targetKeys) { + for (const key of targetKeys) { + if (Object.prototype.hasOwnProperty.call(this.cbHandlers, key)) { + delete this.cbHandlers[key]; + } + } + } + applyPipeline(log, e) { + for (const func of Object.values(this.cbHandlers)) { + if (typeof func === "function") { + log = func(log, e); + if (!log) + return null; + } + } + return log; + } + packageLog(e, detailFcn) { + if (!this.config.on) + return false; + const timeFields = extractTimeFields( + e.timeStamp && e.timeStamp > 0 ? this.config.time(e.timeStamp) : Date.now() + ); + const raw = { + target: e.target ? getSelector(e.target) : null, + path: buildPath(e), + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: timeFields.milli, + microTime: timeFields.micro, + location: getLocation(e), + scrnRes: getScreenRes(), + type: e.type, + logType: "raw", + userAction: true, + details: detailFcn ? detailFcn(e) : null, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId, + attributes: buildAttrs(e), + style: buildCSS(e) + }; + const result = this.applyPipeline(raw, e); + if (!result) + return false; + this.logs.push(result); + return true; + } + packageCustomLog(userLog, detailFcn, userAction) { + if (!this.config.on) + return false; + const details = detailFcn.length === 0 ? detailFcn() : null; + const log = Object.assign( + { + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: Date.now(), + scrnRes: getScreenRes(), + logType: "custom", + userAction, + details, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId + }, + userLog + ); + const result = this.applyPipeline(log, null); + if (!result) + return false; + this.logs.push(result); + return true; + } + packageIntervalLog(e) { + const target = e.target ? getSelector(e.target) : null; + const path = buildPath(e); + const type = e.type; + const timestamp = Math.floor( + e.timeStamp && e.timeStamp > 0 ? this.config.time(e.timeStamp) : Date.now() + ); + if (this.intervalId == null) { + this.intervalId = target; + this.intervalType = type; + this.intervalPath = path; + this.intervalTimer = timestamp; + this.intervalCounter = 0; + return true; + } + if ((this.intervalId !== target || this.intervalType !== type) && this.intervalTimer !== null) { + const interval = { + target: this.intervalId, + path: this.intervalPath, + pageUrl: self.location.href, + pageTitle: document.title, + pageReferrer: document.referrer, + userAgent: self.navigator.userAgent, + clientTime: this.intervalTimer, + scrnRes: getScreenRes(), + count: this.intervalCounter, + duration: timestamp - this.intervalTimer, + startTime: this.intervalTimer, + endTime: timestamp, + type: this.intervalType, + logType: "interval", + targetChange: this.intervalId !== target, + typeChange: this.intervalType !== type, + userAction: false, + details: null, + userId: this.config.userId, + toolVersion: this.config.toolVersion, + toolName: this.config.toolName, + useraleVersion: this.config.useraleVersion, + sessionId: this.config.sessionId, + httpSessionId: this.config.httpSessionId, + browserSessionId: this.config.browserSessionId + }; + const result = this.applyPipeline(interval, e); + if (result) + this.logs.push(result); + this.intervalId = target; + this.intervalType = type; + this.intervalPath = path; + this.intervalTimer = timestamp; + this.intervalCounter = 0; + } else if (this.intervalId === target && this.intervalType === type) { + this.intervalCounter += 1; + } + return true; + } + }; + function extractTimeFields(timeStamp) { + return { + milli: Math.floor(timeStamp), + micro: Number((timeStamp % 1).toFixed(3)) + }; + } + function getLocation(e) { + if (e instanceof MouseEvent) { + if (e.pageX != null) { + return { x: e.pageX, y: e.pageY }; + } + return { + x: document.documentElement.scrollLeft + e.clientX, + y: document.documentElement.scrollTop + e.clientY + }; + } + return { x: null, y: null }; + } + function getScreenRes() { + return { width: self.innerWidth, height: self.innerHeight }; + } + function getSelector(ele) { + if (ele instanceof HTMLElement || ele instanceof Element) { + const base = ele.localName || ele.nodeName; + if (base) { + return base + (ele.id ? "#" + ele.id : "") + (ele.className ? "." + ele.className : ""); + } + } else if (ele instanceof Document) { + return "#document"; + } else if (ele === globalThis) { + return "Window"; + } + return "Unknown"; + } + function buildPath(e) { + return selectorizePath(e.composedPath()); + } + function selectorizePath(path) { + return path.map(getSelector); + } + function buildAttrs(e) { + const attributes = {}; + const attributeBlockList = ["style"]; + if (e.target instanceof Element) { + for (const attr2 of e.target.attributes) { + if (attributeBlockList.includes(attr2.name)) + continue; + try { + attributes[attr2.name] = JSON.parse(attr2.value); + } catch { + attributes[attr2.name] = attr2.value; + } + } + } + return attributes; + } + function buildCSS(e) { + const properties = {}; + if (e.target instanceof HTMLElement) { + const styleObj = e.target.style; + for (let i = 0; i < styleObj.length; i++) { + const prop = styleObj[i]; + properties[prop] = styleObj.getPropertyValue(prop); + } + } + return properties; + } + var authCallback = null; + function updateAuthHeader(config) { + if (authCallback) { + try { + config.authHeader = authCallback(); + } catch (e) { + console.error(`Error encountered while setting the auth header: ${e}`); + } + } + } + var headersCallback = null; + function updateCustomHeaders(config) { + if (headersCallback) { + try { + config.headers = headersCallback(); + } catch (e) { + console.error(`Error encountered while setting the headers: ${e}`); + } + } + } + function generateTraceId() { + const bytes = new Uint8Array(16); + crypto.getRandomValues(bytes); + return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); + } + function generateSpanId() { + const bytes = new Uint8Array(8); + crypto.getRandomValues(bytes); + return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(""); + } + function encodeValue(v) { + if (v === null || v === void 0) + return { stringValue: "" }; + if (typeof v === "boolean") + return { boolValue: v }; + if (typeof v === "number") { + return Number.isInteger(v) ? { intValue: String(v) } : { doubleValue: v }; + } + if (typeof v === "string") + return { stringValue: v }; + if (Array.isArray(v)) { + return { arrayValue: { values: v.map(encodeValue) } }; + } + if (typeof v === "object") { + return { + kvlistValue: { + values: Object.entries(v).map( + ([k, val]) => ({ key: k, value: encodeValue(val) }) + ) + } + }; + } + return { stringValue: String(v) }; + } + function attr(key, v) { + return { key, value: encodeValue(v) }; + } + function toNanoString(clientTimeMs, microTime = 0) { + return String( + BigInt(Math.floor(clientTimeMs)) * 1000000n + BigInt(Math.round(microTime * 1e6)) + ); + } + function buildResource(config) { + const attributes = [ + attr("service.name", config.toolName ?? "userale"), + attr("service.version", config.toolVersion ?? ""), + attr("userale.version", config.useraleVersion ?? ""), + attr("userale.sessionId", config.sessionId ?? "") + ]; + if (config.userId) + attributes.push(attr("userale.userId", config.userId)); + return { attributes }; + } + var SCOPE = { + name: "flagon-userale", + version: "" + }; + var KNOWN_LOG_KEYS = /* @__PURE__ */ new Set([ + "logType", + "type", + "userAction", + "pageUrl", + "pageTitle", + "pageReferrer", + "userAgent", + "sessionId", + "browserSessionId", + "httpSessionId", + "clientTime", + "microTime", + "target", + "path", + "location", + "scrnRes", + "details", + "attributes", + "style", + "userId", + "toolVersion", + "toolName", + "useraleVersion" + ]); + function buildLogRecord(log, spanId, traceId) { + const clientTime = log.clientTime ?? Date.now(); + const microTime = log.logType === "raw" ? log.microTime ?? 0 : 0; + const attributes = [ + attr("userale.logType", log.logType), + attr("userale.type", log.type), + attr("userale.userAction", log.userAction), + attr("browser.url", log.pageUrl), + attr("browser.title", log.pageTitle), + attr("browser.referrer", log.pageReferrer), + attr("user_agent.original", log.userAgent), + attr("userale.sessionId", log.sessionId), + attr("userale.browserSessionId", log.browserSessionId), + attr("userale.httpSessionId", log.httpSessionId), + attr("userale.scrnRes", log.scrnRes) + ]; + if (log.details !== null && log.details !== void 0) { + attributes.push(attr("userale.details", log.details)); + } + if (log.logType === "raw") { + if (log.target !== void 0) + attributes.push(attr("userale.target", log.target)); + if (log.path !== void 0) + attributes.push(attr("userale.path", log.path)); + if (log.location !== void 0) + attributes.push(attr("userale.location", log.location)); + if (Object.keys(log.attributes).length > 0) + attributes.push(attr("userale.attributes", log.attributes)); + if (Object.keys(log.style).length > 0) + attributes.push(attr("userale.style", log.style)); + } + for (const key of Object.keys(log)) { + if (!KNOWN_LOG_KEYS.has(key)) { + const val = log[key]; + if (val !== void 0) + attributes.push(attr(key, val)); + } + } + return { + timeUnixNano: toNanoString(clientTime, microTime), + observedTimeUnixNano: toNanoString(Date.now()), + severityNumber: log.userAction ? 9 : 5, + severityText: log.userAction ? "INFO" : "DEBUG", + eventName: log.type ?? "", + body: { stringValue: log.type ?? "" }, + attributes, + traceId, + spanId + }; + } + function buildSpan(log) { + const attributes = [ + attr("userale.logType", "interval"), + attr("userale.type", log.type), + attr("userale.count", log.count), + attr("userale.targetChange", log.targetChange), + attr("userale.typeChange", log.typeChange), + attr("userale.sessionId", log.sessionId), + attr("userale.browserSessionId", log.browserSessionId), + attr("userale.httpSessionId", log.httpSessionId), + attr("browser.url", log.pageUrl), + attr("browser.title", log.pageTitle), + attr("user_agent.original", log.userAgent) + ]; + if (log.target !== void 0) + attributes.push(attr("userale.target", log.target)); + if (log.path !== void 0) + attributes.push(attr("userale.path", log.path)); + return { + traceId: generateTraceId(), + spanId: generateSpanId(), + name: `userale.${log.type ?? "interval"}`, + kind: 1, + startTimeUnixNano: toNanoString(log.startTime ?? 0), + endTimeUnixNano: toNanoString(log.endTime ?? 0), + attributes, + status: { code: 0 } + }; + } + function buildPayloads(logs, traceId, spanId, config) { + const logRecords = []; + const spans = []; + for (const log of logs) { + if (log.logType === "interval") { + spans.push(buildSpan(log)); + } else { + logRecords.push(buildLogRecord(log, spanId, traceId)); + } + } + const resource = buildResource(config); + const scope = { + ...SCOPE, + version: config.useraleVersion ?? "" + }; + const logsPayload = logRecords.length > 0 ? { + resourceLogs: [ + { + resource, + scopeLogs: [{ scope, logRecords, schemaUrl: "" }], + schemaUrl: "" + } + ] + } : void 0; + const tracesPayload = spans.length > 0 ? { + resourceSpans: [ + { + resource, + scopeSpans: [{ scope, spans, schemaUrl: "" }], + schemaUrl: "" + } + ] + } : void 0; + return { logs: logsPayload, traces: tracesPayload }; + } + function buildHeaders(config) { + updateAuthHeader(config); + updateCustomHeaders(config); + const headers = new Headers({ "Content-Type": "application/json" }); + if (config.authHeader) { + const value = typeof config.authHeader === "function" ? config.authHeader() : config.authHeader; + headers.set("Authorization", value); + } + if (config.headers) { + for (const [key, value] of Object.entries(config.headers)) { + headers.set(key, value); + } + } + return headers; + } + async function exportBatch(logs, traceId, spanId, config) { + const { logs: logsPayload, traces: tracesPayload } = buildPayloads( + logs, + traceId, + spanId, + config + ); + const baseUrl = config.url.replace(/\/$/, ""); + const headers = buildHeaders(config); + const sends = []; + if (logsPayload) { + sends.push( + fetch(`${baseUrl}/v1/logs`, { + method: "POST", + headers, + body: JSON.stringify(logsPayload) + }) + ); + } + if (tracesPayload) { + sends.push( + fetch(`${baseUrl}/v1/traces`, { + method: "POST", + headers, + body: JSON.stringify(tracesPayload) + }) + ); + } + await Promise.all(sends); + } + var Sender = class { + constructor() { + this.activeTraceId = ""; + this.activeSpanId = ""; + } + start(logs, config) { + if (this.sendIntervalId) { + clearInterval(this.sendIntervalId); + } + this.activeTraceId = generateTraceId(); + this.activeSpanId = generateSpanId(); + this.sendIntervalId = this.onInterval(logs, config); + this.onClose(logs, config); + } + stop() { + if (this.sendIntervalId) { + clearInterval(this.sendIntervalId); + this.sendIntervalId = void 0; + } + } + onInterval(logs, config) { + return setInterval(() => { + if (!config.on) + return; + if (logs.length >= config.logCountThreshold) { + exportBatch( + logs.slice(0), + this.activeTraceId, + this.activeSpanId, + config + ); + logs.splice(0); + } + }, config.transmitInterval); + } + onClose(logs, config) { + self.addEventListener("pagehide", () => { + if (!config.on || logs.length === 0) + return; + const { logs: logsPayload, traces: tracesPayload } = buildPayloads( + logs, + this.activeTraceId, + this.activeSpanId, + config + ); + const baseUrl = config.url.replace(/\/$/, ""); + const headers = buildHeaders(config); + if (logsPayload) { + fetch(`${baseUrl}/v1/logs`, { + keepalive: true, + method: "POST", + headers, + body: JSON.stringify(logsPayload) + }).catch((error) => { + console.error(error); + }); + } + if (tracesPayload) { + fetch(`${baseUrl}/v1/traces`, { + keepalive: true, + method: "POST", + headers, + body: JSON.stringify(tracesPayload) + }).catch((error) => { + console.error(error); + }); + } + logs.splice(0); + }); + } + flush(logs, config) { + return exportBatch(logs, this.activeTraceId, this.activeSpanId, config); + } + }; + function extractMouseDetails(e) { + return { + clicks: e.detail, + ctrl: e.ctrlKey, + alt: e.altKey, + shift: e.shiftKey, + meta: e.metaKey + }; + } + function extractKeyboardDetails(e) { + return { + key: e.key, + code: e.code, + ctrl: e.ctrlKey, + alt: e.altKey, + shift: e.shiftKey, + meta: e.metaKey + }; + } + function extractChangeDetails(e) { + return { + value: e.target.value + }; + } + function extractWheelDetails(e) { + return { + x: e.deltaX, + y: e.deltaY, + z: e.deltaZ + }; + } + function extractScrollDetails() { + return { + x: window.scrollX, + y: window.scrollY + }; + } + function extractResizeDetails() { + return { + width: window.outerWidth, + height: window.outerHeight + }; + } + function defineDetails(config) { + return { + click: extractMouseDetails, + dblclick: extractMouseDetails, + mousedown: extractMouseDetails, + mouseup: extractMouseDetails, + focus: null, + blur: null, + input: config.logDetails ? extractKeyboardDetails : null, + change: config.logDetails ? extractChangeDetails : null, + dragstart: null, + dragend: null, + drag: null, + drop: null, + keydown: config.logDetails ? extractKeyboardDetails : null, + mouseover: null + }; + } + var intervalEvents = [ + "click", + "focus", + "blur", + "input", + "change", + "mouseover", + "submit" + ]; + var windowEvents = ["load", "blur", "focus"]; + var bufferedEvents = { + wheel: extractWheelDetails, + scroll: extractScrollDetails, + resize: extractResizeDetails + }; + var refreshEvents = { + submit: null + }; + function attachHandlers(config, packager) { + try { + const events = defineDetails(config); + const bufferBools = {}; + Object.keys(events).forEach(function(ev) { + document.addEventListener( + ev, + function(e) { + packager.packageLog(e, events[ev]); + }, + true + ); + }); + intervalEvents.forEach(function(ev) { + document.addEventListener( + ev, + function(e) { + packager.packageIntervalLog(e); + }, + true + ); + }); + Object.keys(bufferedEvents).forEach( + function(ev) { + bufferBools[ev] = true; + self.addEventListener( + ev, + function(e) { + if (bufferBools[ev]) { + bufferBools[ev] = false; + packager.packageLog(e, bufferedEvents[ev]); + setTimeout(function() { + bufferBools[ev] = true; + }, config.resolution); + } + }, + true + ); + } + ); + Object.keys(refreshEvents).forEach( + function(ev) { + document.addEventListener( + ev, + function(e) { + packager.packageLog(e, events[ev]); + }, + true + ); + } + ); + windowEvents.forEach(function(ev) { + self.addEventListener( + ev, + function(e) { + packager.packageLog(e, function() { + return { window: true }; + }); + }, + true + ); + }); + return true; + } catch { + return false; + } + } + var startLoadTimestamp = Date.now(); + var endLoadTimestamp = startLoadTimestamp; + self.addEventListener("load", () => { + endLoadTimestamp = Date.now(); + }); + var UserALE = class { + constructor(config) { + this.started = false; + this.config = config; + this.config.update({ useraleVersion: version }); + this.logs = []; + this.packager = new Packager(this.logs, this.config); + this.sender = new Sender(); + } + start() { + this.whenReady(() => { + this.attach(); + this.sender.start(this.logs, this.config); + }); + } + capture() { + this.whenReady(() => this.attach()); + } + stop() { + this.started = this.config.on = false; + this.sender.stop(); + } + whenReady(fn) { + if (typeof document === "undefined") { + fn(); + return; + } + if (document.readyState === "interactive" || document.readyState === "complete") { + fn(); + } else { + document.addEventListener("DOMContentLoaded", fn, { once: true }); + } + } + attach() { + if (!this.started) { + attachHandlers(this.config, this.packager); + this.started = this.config.on = true; + if (typeof window !== "undefined" && typeof document !== "undefined") { + this.packager.packageCustomLog( + { + type: "load", + details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp } + }, + () => ({}), + false + ); + } + } else { + this.config.on = true; + } + } + options(newConfig) { + if (newConfig) + this.config.update(newConfig); + return this.config; + } + log(customLog) { + if (customLog) { + this.logs.push(customLog); + return true; + } + return false; + } + flush() { + return this.sender.flush(this.logs, this.config); + } + addCallbacks(...newCallbacks) { + this.packager.addCallbacks(...newCallbacks); + } + removeCallbacks(targetKeys) { + this.packager.removeCallbacks(targetKeys); + } + packageCustomLog(userLog, detailFcn, userAction) { + return this.packager.packageCustomLog(userLog, detailFcn, userAction); + } + }; + var sessionId = null; + var httpSessionId = null; + function getInitialSettings() { + if (typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope) { + return { + authHeader: null, + autostart: true, + browserSessionId: null, + custIndex: null, + headers: null, + httpSessionId: null, + logCountThreshold: 5, + logDetails: false, + resolution: 500, + sessionId, + time: (ts) => ts !== void 0 ? ts : Date.now(), + toolName: null, + toolVersion: null, + transmitInterval: 5e3, + url: "http://localhost:4318", + useraleVersion: null, + userFromParams: null, + userId: null + }; + } + if (sessionId === null) { + sessionId = getOrCreateSessionId( + "userAlesessionId", + "session_" + String(Date.now()) + ); + } + if (httpSessionId === null) { + httpSessionId = getOrCreateSessionId( + "userAleHttpSessionId", + generateSpanId() + ); + } + const script = document.currentScript ?? (() => { + const scripts = document.getElementsByTagName("script"); + return scripts[scripts.length - 1] ?? null; + })(); + const get = (attr2) => script ? script.getAttribute(attr2) : null; + const headers = get("data-headers"); + return { + authHeader: get("data-auth"), + autostart: get("data-autostart") !== "false", + browserSessionId: null, + custIndex: get("data-index"), + headers: headers ? JSON.parse(headers) : null, + httpSessionId, + logCountThreshold: +(get("data-threshold") ?? 5), + logDetails: get("data-log-details") === "true", + resolution: +(get("data-resolution") ?? 500), + sessionId: get("data-session") ?? sessionId, + time: timeStampScale(document.createEvent("CustomEvent")), + toolName: get("data-tool"), + toolVersion: get("data-version"), + transmitInterval: +(get("data-interval") ?? 5e3), + url: get("data-url") ?? "http://localhost:4318", + useraleVersion: get("data-userale-version"), + userFromParams: get("data-user-from-params"), + userId: get("data-user") + }; + } + function getOrCreateSessionId(key, defaultValue) { + const stored = self.sessionStorage.getItem(key); + if (stored === null) { + self.sessionStorage.setItem(key, JSON.stringify(defaultValue)); + return defaultValue; + } + return JSON.parse(stored); + } + function timeStampScale(e) { + if (e.timeStamp && e.timeStamp > 0) { + const delta = Date.now() - e.timeStamp; + if (delta < 0) { + return () => e.timeStamp / 1e3; + } else if (delta > e.timeStamp) { + const navStart = performance.timeOrigin; + return (ts) => ts + navStart; + } else { + return (ts) => ts; + } + } + return () => Date.now(); + } + var _Configuration = class { + constructor() { + this.autostart = false; + this.authHeader = null; + this.browserSessionId = null; + this.custIndex = null; + this.headers = null; + this.httpSessionId = null; + this.logCountThreshold = 0; + this.logDetails = false; + this.on = false; + this.resolution = 0; + this.sessionId = null; + this.time = () => Date.now(); + this.toolName = null; + this.toolVersion = null; + this.transmitInterval = 0; + this.url = ""; + this.userFromParams = null; + this.useraleVersion = null; + this.userId = null; + this.version = null; + if (_Configuration.instance === null) { + this.initialize(); + } + } + static getInstance() { + if (_Configuration.instance === null) { + _Configuration.instance = new _Configuration(); + } + return _Configuration.instance; + } + initialize() { + const settings = getInitialSettings(); + this.update(settings); + } + reset() { + this.initialize(); + } + update(newConfig) { + Object.keys(newConfig).forEach((option) => { + if (option === "userFromParams") { + const userParamString = newConfig[option]; + const userId = userParamString ? _Configuration.getUserIdFromParams(userParamString) : null; + if (userId) { + this["userId"] = userId; + } + } + const hasNewUserFromParams = newConfig["userFromParams"]; + const willNullifyUserId = option === "userId" && newConfig[option] === null; + if (willNullifyUserId && hasNewUserFromParams) { + return; + } + const newOption = newConfig[option]; + if (newOption !== void 0) { + this[option] = newOption; + } + }); + } + static getUserIdFromParams(param) { + const userField = param; + const regex = new RegExp("[?&]" + userField + "(=([^&#]*)|&|#|$)"); + const results = window.location.href.match(regex); + if (results && results[2]) { + return decodeURIComponent(results[2].replace(/\+/g, " ")); + } + return null; + } + }; + var Configuration = _Configuration; + Configuration.instance = null; + + // src/main.ts + var instance = new UserALE(Configuration.getInstance()); + if (instance.config.autostart) { + instance.start(); + } +})(); +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*! + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the 'License'); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//# sourceMappingURL=main.global.js.map \ No newline at end of file diff --git a/products/userale/packages/iife/build/main.global.js.map b/products/userale/packages/iife/build/main.global.js.map new file mode 100644 index 0000000..17b8e6e --- /dev/null +++ b/products/userale/packages/iife/build/main.global.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../core-sdk/src/Packager.ts","../../core-sdk/src/utils/auth.ts","../../core-sdk/src/utils/headers.ts","../../core-sdk/src/utils/ids.ts","../../core-sdk/src/Sender.ts","../../core-sdk/src/handlers/eventDetails.ts","../../core-sdk/src/handlers/attach.ts","../../core-sdk/src/UserALE.ts","../../core-sdk/src/utils/getInitialSettings.ts","../../core-sdk/src/Configuration.ts","../src/main.ts"],"sourcesContent":["/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Callbacks, Logging } from \"@/types\";\nimport type { Configuration } from \"@/Configuration\";\n\n// ---------------------------------------------------------------------------\n// Packager — owns log queue, config reference, callback map, and interval state\n// ---------------------------------------------------------------------------\n\nexport class Packager {\n logs: Array;\n config: Configuration;\n cbHandlers: Callbacks.CallbackMap;\n\n // Interval logging state\n private intervalId: string | null = null;\n private intervalType: string | null = null;\n private intervalPath: string[] | null = null;\n private intervalTimer: number | null = null;\n private intervalCounter: number = 0;\n\n constructor(logs: Array, config: Configuration) {\n this.logs = logs;\n this.config = config;\n this.cbHandlers = {};\n }\n\n addCallbacks(\n ...newCallbacks: Record[]\n ): Callbacks.CallbackMap {\n for (const source of newCallbacks) {\n const descriptors: PropertyDescriptorMap = {};\n\n for (const key of Object.keys(source)) {\n const d = Object.getOwnPropertyDescriptor(source, key);\n if (d) descriptors[key] = d;\n }\n\n for (const sym of Object.getOwnPropertySymbols(source)) {\n const d = Object.getOwnPropertyDescriptor(source, sym);\n if (d?.enumerable) descriptors[sym as unknown as string] = d;\n }\n\n Object.defineProperties(this.cbHandlers, descriptors);\n }\n return this.cbHandlers;\n }\n\n removeCallbacks(targetKeys: string[]): void {\n for (const key of targetKeys) {\n if (Object.prototype.hasOwnProperty.call(this.cbHandlers, key)) {\n delete this.cbHandlers[key];\n }\n }\n }\n\n private applyPipeline(log: Logging.Log, e: Event | null): Logging.Log | null {\n for (const func of Object.values(this.cbHandlers)) {\n if (typeof func === \"function\") {\n log = func(log, e);\n if (!log) return null;\n }\n }\n return log;\n }\n\n packageLog(\n e: Event,\n detailFcn?: Logging.DynamicDetailFunction | null,\n ): boolean {\n if (!this.config.on) return false;\n\n const timeFields = extractTimeFields(\n e.timeStamp && e.timeStamp > 0\n ? this.config.time(e.timeStamp)\n : Date.now(),\n );\n\n const raw: Logging.RawLog = {\n target: e.target ? getSelector(e.target) : null,\n path: buildPath(e),\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: timeFields.milli,\n microTime: timeFields.micro,\n location: getLocation(e),\n scrnRes: getScreenRes(),\n type: e.type,\n logType: \"raw\",\n userAction: true,\n details: detailFcn ? detailFcn(e) : null,\n userId: this.config.userId,\n toolVersion: this.config.toolVersion,\n toolName: this.config.toolName,\n useraleVersion: this.config.useraleVersion,\n sessionId: this.config.sessionId,\n httpSessionId: this.config.httpSessionId,\n browserSessionId: this.config.browserSessionId,\n attributes: buildAttrs(e),\n style: buildCSS(e),\n };\n\n const result = this.applyPipeline(raw, e);\n if (!result) return false;\n this.logs.push(result);\n return true;\n }\n\n packageCustomLog(\n userLog: Logging.UserLog,\n detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction,\n userAction: boolean,\n ): boolean {\n if (!this.config.on) return false;\n\n const details =\n detailFcn.length === 0\n ? (detailFcn as Logging.StaticDetailFunction)()\n : null;\n\n const log = Object.assign(\n {\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: Date.now(),\n scrnRes: getScreenRes(),\n logType: \"custom\" as const,\n userAction,\n details,\n userId: this.config.userId,\n toolVersion: this.config.toolVersion,\n toolName: this.config.toolName,\n useraleVersion: this.config.useraleVersion,\n sessionId: this.config.sessionId,\n httpSessionId: this.config.httpSessionId,\n browserSessionId: this.config.browserSessionId,\n },\n userLog,\n ) as Logging.Log;\n\n const result = this.applyPipeline(log, null);\n if (!result) return false;\n this.logs.push(result);\n return true;\n }\n\n packageIntervalLog(e: Event): boolean {\n const target = e.target ? getSelector(e.target) : null;\n const path = buildPath(e);\n const type = e.type;\n const timestamp = Math.floor(\n e.timeStamp && e.timeStamp > 0\n ? this.config.time(e.timeStamp)\n : Date.now(),\n );\n\n if (this.intervalId == null) {\n this.intervalId = target;\n this.intervalType = type;\n this.intervalPath = path;\n this.intervalTimer = timestamp;\n this.intervalCounter = 0;\n return true;\n }\n\n if (\n (this.intervalId !== target || this.intervalType !== type) &&\n this.intervalTimer !== null\n ) {\n const interval: Logging.IntervalLog = {\n target: this.intervalId,\n path: this.intervalPath,\n pageUrl: self.location.href,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n userAgent: self.navigator.userAgent,\n clientTime: this.intervalTimer,\n scrnRes: getScreenRes(),\n count: this.intervalCounter,\n duration: timestamp - this.intervalTimer,\n startTime: this.intervalTimer,\n endTime: timestamp,\n type: this.intervalType,\n logType: \"interval\",\n targetChange: this.intervalId !== target,\n typeChange: this.intervalType !== type,\n userAction: false,\n details: null,\n userId: this.config.userId,\n toolVersion: this.config.toolVersion,\n toolName: this.config.toolName,\n useraleVersion: this.config.useraleVersion,\n sessionId: this.config.sessionId,\n httpSessionId: this.config.httpSessionId,\n browserSessionId: this.config.browserSessionId,\n };\n\n const result = this.applyPipeline(interval, e);\n if (result) this.logs.push(result);\n\n this.intervalId = target;\n this.intervalType = type;\n this.intervalPath = path;\n this.intervalTimer = timestamp;\n this.intervalCounter = 0;\n } else if (this.intervalId === target && this.intervalType === type) {\n this.intervalCounter += 1;\n }\n\n return true;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure utility functions — no state, safe to call from anywhere\n// ---------------------------------------------------------------------------\n\n/**\n * Extracts the millisecond and microsecond portions of a timestamp.\n */\nexport function extractTimeFields(timeStamp: number): {\n milli: number;\n micro: number;\n} {\n return {\n milli: Math.floor(timeStamp),\n micro: Number((timeStamp % 1).toFixed(3)),\n };\n}\n\n/**\n * Extracts coordinate information from the event.\n */\nexport function getLocation(e: Event): { x: number | null; y: number | null } {\n if (e instanceof MouseEvent) {\n if (e.pageX != null) {\n return { x: e.pageX, y: e.pageY };\n }\n return {\n x: document.documentElement.scrollLeft + e.clientX,\n y: document.documentElement.scrollTop + e.clientY,\n };\n }\n return { x: null, y: null };\n}\n\n/**\n * Returns the viewport dimensions as a screen resolution estimate.\n */\nexport function getScreenRes(): { width: number; height: number } {\n return { width: self.innerWidth, height: self.innerHeight };\n}\n\n/**\n * Builds a CSS selector string from an event target element.\n */\nexport function getSelector(ele: EventTarget): string {\n if (ele instanceof HTMLElement || ele instanceof Element) {\n const base = ele.localName || ele.nodeName;\n if (base) {\n return (\n base +\n (ele.id ? \"#\" + ele.id : \"\") +\n (ele.className ? \".\" + ele.className : \"\")\n );\n }\n } else if (ele instanceof Document) {\n return \"#document\";\n } else if (ele === globalThis) {\n return \"Window\";\n }\n return \"Unknown\";\n}\n\n/**\n * Builds a CSS selector path from the event's composed path.\n */\nexport function buildPath(e: Event): string[] {\n return selectorizePath(e.composedPath());\n}\n\n/**\n * Maps an array of event targets to CSS selector strings.\n */\nexport function selectorizePath(path: EventTarget[]): string[] {\n return path.map(getSelector);\n}\n\n/**\n * Builds an object of element attributes, attempting JSON parsing on values.\n */\nexport function buildAttrs(e: Event): Logging.JSONObject {\n const attributes: Logging.JSONObject = {};\n const attributeBlockList = [\"style\"];\n\n if (e.target instanceof Element) {\n for (const attr of e.target.attributes) {\n if (attributeBlockList.includes(attr.name)) continue;\n try {\n attributes[attr.name] = JSON.parse(attr.value);\n } catch {\n attributes[attr.name] = attr.value;\n }\n }\n }\n\n return attributes;\n}\n\n/**\n * Builds an object of inline CSS properties from the event target.\n */\nexport function buildCSS(e: Event): Logging.JSONObject {\n const properties: Logging.JSONObject = {};\n if (e.target instanceof HTMLElement) {\n const styleObj = e.target.style;\n for (let i = 0; i < styleObj.length; i++) {\n const prop = styleObj[i];\n properties[prop] = styleObj.getPropertyValue(prop);\n }\n }\n return properties;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/Configuration\";\nimport { Callbacks } from \"@/types\";\n\nexport let authCallback: Callbacks.AuthCallback | null = null;\n\n/**\n * Fetches the most up-to-date auth header string from the auth callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Function} authCallback Callback used to fetch the newest header.\n * @returns {void}\n */\nexport function updateAuthHeader(config: Configuration) {\n if (authCallback) {\n try {\n config.authHeader = authCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the authCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the auth header: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.AuthCallback} callback Callback used to fetch the newest header. Should return a string.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerAuthCallback(callback: Callbacks.AuthCallback) {\n try {\n verifyCallback(callback);\n authCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Function} callback Callback used to fetch the newest header. Should return a string.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.AuthCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale auth callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"string\") {\n throw new Error(\"Userale auth callback must return a string\");\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetAuthCallback() {\n authCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/Configuration\";\nimport { Callbacks } from \"@/types\";\n\nexport let headersCallback: Callbacks.HeadersCallback | null = null;\n\n/**\n * Fetches the most up-to-date custom headers object from the headers callback\n * and updates the config object with the new value.\n * @param {Configuration} config Configuration object to be updated.\n * @param {Callbacks.HeadersCallback} headersCallback Callback used to fetch the newest headers.\n * @returns {void}\n */\nexport function updateCustomHeaders(config: Configuration) {\n if (headersCallback) {\n try {\n config.headers = headersCallback();\n } catch (e) {\n // We should emit the error, but otherwise continue as this could be a temporary issue\n // due to network connectivity or some logic inside the headersCallback which is the user's\n // responsibility.\n console.error(`Error encountered while setting the headers: ${e}`);\n }\n }\n}\n\n/**\n * Registers the provided callback to be used when updating the auth header.\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest headers. Should return an object.\n * @returns {boolean} Whether the operation succeeded.\n */\nexport function registerHeadersCallback(callback: Callbacks.HeadersCallback) {\n try {\n verifyCallback(callback);\n headersCallback = callback;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify that the provided callback is a function which returns a string\n * @param {Callbacks.HeadersCallback} callback Callback used to fetch the newest header. Should return an object.\n * @throws {Error} If the callback is not a function or does not return a string.\n * @returns {void}\n */\nexport function verifyCallback(callback: Callbacks.HeadersCallback) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Userale headers callback must be a function\");\n }\n const result = callback();\n if (typeof result !== \"object\") {\n throw new Error(\"Userale headers callback must return an object\");\n }\n for (const [key, value] of Object.entries(result)) {\n if (typeof key !== \"string\" || typeof value !== \"string\") {\n throw new Error(\n \"Userale header callback must return an object with string keys and values\",\n );\n }\n }\n}\n\n/**\n * Resets the authCallback to null. Used for primarily for testing, but could be used\n * to remove the callback in production.\n * @returns {void}\n */\nexport function resetHeadersCallback() {\n headersCallback = null;\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Implements the OTel IdGenerator interface using the Web Crypto API.\n * Method names match opentelemetry-js IdGenerator: generateTraceId / generateSpanId.\n */\n\n/** Generates a random 16-byte (32 hex char) trace ID. */\nexport function generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Generates a random 8-byte (16 hex char) span ID. */\nexport function generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Configuration } from \"@/Configuration\";\nimport { Logging, OTLP } from \"@/types\";\nimport { updateAuthHeader } from \"@/utils/auth\";\nimport { updateCustomHeaders } from \"@/utils/headers\";\nimport { generateSpanId, generateTraceId } from \"@/utils/ids\";\n\n// ---------------------------------------------------------------------------\n// OTLP serialization (pure functions — no state)\n// ---------------------------------------------------------------------------\n\nfunction encodeValue(v: unknown): OTLP.AnyValue {\n if (v === null || v === undefined) return { stringValue: \"\" };\n if (typeof v === \"boolean\") return { boolValue: v };\n if (typeof v === \"number\") {\n return Number.isInteger(v) ? { intValue: String(v) } : { doubleValue: v };\n }\n if (typeof v === \"string\") return { stringValue: v };\n if (Array.isArray(v)) {\n return { arrayValue: { values: v.map(encodeValue) } };\n }\n if (typeof v === \"object\") {\n return {\n kvlistValue: {\n values: Object.entries(v as Record).map(\n ([k, val]) => ({ key: k, value: encodeValue(val) }),\n ),\n },\n };\n }\n return { stringValue: String(v) };\n}\n\nfunction attr(key: string, v: unknown): OTLP.KeyValue {\n return { key, value: encodeValue(v) };\n}\n\n/**\n * Converts a clientTime (ms) and optional microTime (fractional ms) to a\n * nanosecond decimal string as required by OTLP 1.10.0.\n */\nfunction toNanoString(clientTimeMs: number, microTime: number = 0): string {\n return String(\n BigInt(Math.floor(clientTimeMs)) * 1_000_000n +\n BigInt(Math.round(microTime * 1_000_000)),\n );\n}\n\nfunction buildResource(config: Configuration): OTLP.Resource {\n const attributes: OTLP.KeyValue[] = [\n attr(\"service.name\", config.toolName ?? \"userale\"),\n attr(\"service.version\", config.toolVersion ?? \"\"),\n attr(\"userale.version\", config.useraleVersion ?? \"\"),\n attr(\"userale.sessionId\", config.sessionId ?? \"\"),\n ];\n if (config.userId) attributes.push(attr(\"userale.userId\", config.userId));\n return { attributes };\n}\n\nconst SCOPE: OTLP.InstrumentationScope = {\n name: \"flagon-userale\",\n version: \"\",\n};\n\nconst KNOWN_LOG_KEYS = new Set([\n \"logType\",\n \"type\",\n \"userAction\",\n \"pageUrl\",\n \"pageTitle\",\n \"pageReferrer\",\n \"userAgent\",\n \"sessionId\",\n \"browserSessionId\",\n \"httpSessionId\",\n \"clientTime\",\n \"microTime\",\n \"target\",\n \"path\",\n \"location\",\n \"scrnRes\",\n \"details\",\n \"attributes\",\n \"style\",\n \"userId\",\n \"toolVersion\",\n \"toolName\",\n \"useraleVersion\",\n]);\n\nfunction buildLogRecord(\n log: Logging.RawLog | Logging.CustomLog,\n spanId: string,\n traceId: string,\n): OTLP.LogRecord {\n const clientTime = log.clientTime ?? Date.now();\n const microTime = log.logType === \"raw\" ? (log.microTime ?? 0) : 0;\n\n const attributes: OTLP.KeyValue[] = [\n attr(\"userale.logType\", log.logType),\n attr(\"userale.type\", log.type),\n attr(\"userale.userAction\", log.userAction),\n attr(\"browser.url\", log.pageUrl),\n attr(\"browser.title\", log.pageTitle),\n attr(\"browser.referrer\", log.pageReferrer),\n attr(\"user_agent.original\", log.userAgent),\n attr(\"userale.sessionId\", log.sessionId),\n attr(\"userale.browserSessionId\", log.browserSessionId),\n attr(\"userale.httpSessionId\", log.httpSessionId),\n attr(\"userale.scrnRes\", log.scrnRes),\n ];\n\n if (log.details !== null && log.details !== undefined) {\n attributes.push(attr(\"userale.details\", log.details));\n }\n\n if (log.logType === \"raw\") {\n if (log.target !== undefined)\n attributes.push(attr(\"userale.target\", log.target));\n if (log.path !== undefined) attributes.push(attr(\"userale.path\", log.path));\n if (log.location !== undefined)\n attributes.push(attr(\"userale.location\", log.location));\n if (Object.keys(log.attributes).length > 0)\n attributes.push(attr(\"userale.attributes\", log.attributes));\n if (Object.keys(log.style).length > 0)\n attributes.push(attr(\"userale.style\", log.style));\n }\n\n // Catch-all: extra fields added by callbacks are encoded as-is\n for (const key of Object.keys(log)) {\n if (!KNOWN_LOG_KEYS.has(key)) {\n const val = (log as Logging.JSONObject)[key];\n if (val !== undefined) attributes.push(attr(key, val));\n }\n }\n\n return {\n timeUnixNano: toNanoString(clientTime, microTime),\n observedTimeUnixNano: toNanoString(Date.now()),\n severityNumber: log.userAction ? 9 : 5,\n severityText: log.userAction ? \"INFO\" : \"DEBUG\",\n eventName: log.type ?? \"\",\n body: { stringValue: log.type ?? \"\" },\n attributes,\n traceId,\n spanId,\n };\n}\n\nfunction buildSpan(log: Logging.IntervalLog): OTLP.Span {\n const attributes: OTLP.KeyValue[] = [\n attr(\"userale.logType\", \"interval\"),\n attr(\"userale.type\", log.type),\n attr(\"userale.count\", log.count),\n attr(\"userale.targetChange\", log.targetChange),\n attr(\"userale.typeChange\", log.typeChange),\n attr(\"userale.sessionId\", log.sessionId),\n attr(\"userale.browserSessionId\", log.browserSessionId),\n attr(\"userale.httpSessionId\", log.httpSessionId),\n attr(\"browser.url\", log.pageUrl),\n attr(\"browser.title\", log.pageTitle),\n attr(\"user_agent.original\", log.userAgent),\n ];\n if (log.target !== undefined)\n attributes.push(attr(\"userale.target\", log.target));\n if (log.path !== undefined) attributes.push(attr(\"userale.path\", log.path));\n\n return {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n name: `userale.${log.type ?? \"interval\"}`,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: toNanoString(log.startTime ?? 0),\n endTimeUnixNano: toNanoString(log.endTime ?? 0),\n attributes,\n status: { code: 0 }, // STATUS_CODE_UNSET\n };\n}\n\nfunction buildPayloads(\n logs: Logging.Log[],\n traceId: string,\n spanId: string,\n config: Configuration,\n): OTLP.Payloads {\n const logRecords: OTLP.LogRecord[] = [];\n const spans: OTLP.Span[] = [];\n\n for (const log of logs) {\n if (log.logType === \"interval\") {\n spans.push(buildSpan(log));\n } else {\n logRecords.push(buildLogRecord(log, spanId, traceId));\n }\n }\n\n const resource = buildResource(config);\n const scope: OTLP.InstrumentationScope = {\n ...SCOPE,\n version: config.useraleVersion ?? \"\",\n };\n\n const logsPayload: OTLP.ExportLogsServiceRequest | undefined =\n logRecords.length > 0\n ? {\n resourceLogs: [\n {\n resource,\n scopeLogs: [{ scope, logRecords, schemaUrl: \"\" }],\n schemaUrl: \"\",\n },\n ],\n }\n : undefined;\n\n const tracesPayload: OTLP.ExportTraceServiceRequest | undefined =\n spans.length > 0\n ? {\n resourceSpans: [\n {\n resource,\n scopeSpans: [{ scope, spans, schemaUrl: \"\" }],\n schemaUrl: \"\",\n },\n ],\n }\n : undefined;\n\n return { logs: logsPayload, traces: tracesPayload };\n}\n\n// ---------------------------------------------------------------------------\n// HTTP transport (pure — no state)\n// ---------------------------------------------------------------------------\n\nfunction buildHeaders(config: Configuration): Headers {\n updateAuthHeader(config);\n updateCustomHeaders(config);\n\n const headers = new Headers({ \"Content-Type\": \"application/json\" });\n\n if (config.authHeader) {\n const value =\n typeof config.authHeader === \"function\"\n ? config.authHeader()\n : config.authHeader;\n headers.set(\"Authorization\", value as string);\n }\n\n if (config.headers) {\n for (const [key, value] of Object.entries(config.headers)) {\n headers.set(key, value);\n }\n }\n\n return headers;\n}\n\nasync function exportBatch(\n logs: Logging.Log[],\n traceId: string,\n spanId: string,\n config: Configuration,\n): Promise {\n const { logs: logsPayload, traces: tracesPayload } = buildPayloads(\n logs,\n traceId,\n spanId,\n config,\n );\n\n const baseUrl = config.url.replace(/\\/$/, \"\");\n const headers = buildHeaders(config);\n const sends: Promise[] = [];\n\n if (logsPayload) {\n sends.push(\n fetch(`${baseUrl}/v1/logs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(logsPayload),\n }),\n );\n }\n\n if (tracesPayload) {\n sends.push(\n fetch(`${baseUrl}/v1/traces`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(tracesPayload),\n }),\n );\n }\n\n await Promise.all(sends);\n}\n\n// ---------------------------------------------------------------------------\n// Sender — owns interval ID and active trace/span context\n// ---------------------------------------------------------------------------\n\nexport class Sender {\n private sendIntervalId: ReturnType | undefined;\n private activeTraceId: string = \"\";\n private activeSpanId: string = \"\";\n\n start(logs: Array, config: Configuration): void {\n if (this.sendIntervalId) {\n clearInterval(this.sendIntervalId);\n }\n this.activeTraceId = generateTraceId();\n this.activeSpanId = generateSpanId();\n this.sendIntervalId = this.onInterval(logs, config);\n this.onClose(logs, config);\n }\n\n stop(): void {\n if (this.sendIntervalId) {\n clearInterval(this.sendIntervalId);\n this.sendIntervalId = undefined;\n }\n }\n\n onInterval(\n logs: Array,\n config: Configuration,\n ): ReturnType {\n return setInterval(() => {\n if (!config.on) return;\n if (logs.length >= config.logCountThreshold) {\n exportBatch(\n logs.slice(0),\n this.activeTraceId,\n this.activeSpanId,\n config,\n );\n logs.splice(0);\n }\n }, config.transmitInterval);\n }\n\n onClose(logs: Array, config: Configuration): void {\n self.addEventListener(\"pagehide\", () => {\n if (!config.on || logs.length === 0) return;\n\n const { logs: logsPayload, traces: tracesPayload } = buildPayloads(\n logs,\n this.activeTraceId,\n this.activeSpanId,\n config,\n );\n\n const baseUrl = config.url.replace(/\\/$/, \"\");\n const headers = buildHeaders(config);\n\n if (logsPayload) {\n fetch(`${baseUrl}/v1/logs`, {\n keepalive: true,\n method: \"POST\",\n headers,\n body: JSON.stringify(logsPayload),\n }).catch((error) => {\n console.error(error);\n });\n }\n\n if (tracesPayload) {\n fetch(`${baseUrl}/v1/traces`, {\n keepalive: true,\n method: \"POST\",\n headers,\n body: JSON.stringify(tracesPayload),\n }).catch((error) => {\n console.error(error);\n });\n }\n\n logs.splice(0);\n });\n }\n\n flush(logs: Array, config: Configuration): Promise {\n return exportBatch(logs, this.activeTraceId, this.activeSpanId, config);\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Events, Logging, Settings } from \"@/types\";\n\n/**\n * Maps a MouseEvent to an object containing useful information.\n */\nexport function extractMouseDetails(e: MouseEvent) {\n return {\n clicks: e.detail,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\n/**\n * Maps a KeyboardEvent to an object containing useful information.\n */\nexport function extractKeyboardDetails(e: KeyboardEvent) {\n return {\n key: e.key,\n code: e.code,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n };\n}\n\n/**\n * Maps an InputEvent to an object containing useful information.\n */\nexport function extractInputDetails(e: InputEvent) {\n return {\n value: (e.target as HTMLInputElement).value,\n };\n}\n\n/**\n * Maps a ChangeEvent to an object containing useful information.\n */\nexport function extractChangeDetails(e: Events.ChangeEvent) {\n return {\n value: e.target.value,\n };\n}\n\n/**\n * Maps a WheelEvent to an object containing useful information.\n */\nexport function extractWheelDetails(e: WheelEvent) {\n return {\n x: e.deltaX,\n y: e.deltaY,\n z: e.deltaZ,\n };\n}\n\n/**\n * Maps a ScrollEvent to an object containing useful information.\n */\nexport function extractScrollDetails() {\n return {\n x: window.scrollX,\n y: window.scrollY,\n };\n}\n\n/**\n * Maps a ResizeEvent to an object containing useful information.\n */\nexport function extractResizeDetails() {\n return {\n width: window.outerWidth,\n height: window.outerHeight,\n };\n}\n\n/**\n * Defines the event detail extractors and the events to listen for.\n */\nexport function defineDetails(\n config: Settings.DefaultConfig,\n): Events.EventDetailsMap {\n return {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n input: config.logDetails ? extractKeyboardDetails : null,\n change: config.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: config.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n };\n}\n\n/**\n * Returns the detail extractor for a given event type, respecting the config.\n */\nexport function defineCustomDetails(\n options: Settings.DefaultConfig,\n type: Events.AllowedEvents,\n): Logging.DynamicDetailFunction | null | undefined {\n const eventType: Events.EventDetailsMap = {\n click: extractMouseDetails,\n dblclick: extractMouseDetails,\n mousedown: extractMouseDetails,\n mouseup: extractMouseDetails,\n focus: null,\n blur: null,\n load: null,\n input: options.logDetails ? extractKeyboardDetails : null,\n change: options.logDetails ? extractChangeDetails : null,\n dragstart: null,\n dragend: null,\n drag: null,\n drop: null,\n keydown: options.logDetails ? extractKeyboardDetails : null,\n mouseover: null,\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n submit: null,\n };\n return eventType[type];\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Packager } from \"@/Packager\";\nimport { Events } from \"@/types\";\nimport { Configuration } from \"@/Configuration\";\nimport {\n defineDetails,\n extractWheelDetails,\n extractScrollDetails,\n extractResizeDetails,\n} from \"@/handlers/eventDetails\";\n\n//@todo: Investigate drag events and their behavior\nconst intervalEvents: Array = [\n \"click\",\n \"focus\",\n \"blur\",\n \"input\",\n \"change\",\n \"mouseover\",\n \"submit\",\n];\nconst windowEvents: Array = [\"load\", \"blur\", \"focus\"];\n\nconst bufferedEvents: Events.EventDetailsMap = {\n wheel: extractWheelDetails,\n scroll: extractScrollDetails,\n resize: extractResizeDetails,\n};\n\nconst refreshEvents: Events.EventDetailsMap = {\n submit: null,\n};\n\n/**\n * Hooks the event handlers for each event type of interest.\n * @param {Configuration} config Configuration singleton to use.\n * @param {Packager} packager Packager instance to route events through.\n * @return {boolean} Whether the operation succeeded.\n */\nexport function attachHandlers(\n config: Configuration,\n packager: Packager,\n): boolean {\n try {\n const events = defineDetails(config);\n\n const bufferBools: Events.EventBoolMap =\n {} as Events.EventBoolMap;\n\n (Object.keys(events) as Events.AllowedEvents[]).forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packager.packageLog(e, events[ev]);\n },\n true,\n );\n });\n\n intervalEvents.forEach(function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packager.packageIntervalLog(e);\n },\n true,\n );\n });\n\n (Object.keys(bufferedEvents) as Events.BufferedEvents[]).forEach(\n function (ev) {\n bufferBools[ev] = true;\n\n self.addEventListener(\n ev,\n function (e) {\n if (bufferBools[ev]) {\n bufferBools[ev] = false;\n packager.packageLog(e, bufferedEvents[ev]);\n setTimeout(function () {\n bufferBools[ev] = true;\n }, config.resolution);\n }\n },\n true,\n );\n },\n );\n\n (Object.keys(refreshEvents) as Events.RefreshEvents[]).forEach(\n function (ev) {\n document.addEventListener(\n ev,\n function (e) {\n packager.packageLog(e, events[ev]);\n },\n true,\n );\n },\n );\n\n windowEvents.forEach(function (ev) {\n self.addEventListener(\n ev,\n function (e) {\n packager.packageLog(e, function () {\n return { window: true };\n });\n },\n true,\n );\n });\n\n return true;\n } catch {\n return false;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { version as userAleVersion } from \"../package.json\";\nimport { Configuration } from \"@/Configuration\";\nimport { Packager } from \"@/Packager\";\nimport { Sender } from \"@/Sender\";\nimport { attachHandlers } from \"@/handlers/attach\";\n\nimport type { Settings, Logging } from \"@/types\";\n\n// ---------------------------------------------------------------------------\n// Page-load timing — captured at module evaluation time\n// ---------------------------------------------------------------------------\n\nconst startLoadTimestamp = Date.now();\nlet endLoadTimestamp: number = startLoadTimestamp;\n\nself.addEventListener(\"load\", () => {\n endLoadTimestamp = Date.now();\n});\n\n// ---------------------------------------------------------------------------\n// UserALE — composes Configuration, Packager, and Sender into one object\n// whose lifetime matches the instrumentation session.\n// ---------------------------------------------------------------------------\n\nexport class UserALE {\n readonly config: Configuration;\n private readonly packager: Packager;\n private readonly sender: Sender;\n private readonly logs: Array;\n private started: boolean = false;\n\n constructor(config: Configuration) {\n this.config = config;\n this.config.update({ useraleVersion: userAleVersion });\n this.logs = [];\n this.packager = new Packager(this.logs, this.config);\n this.sender = new Sender();\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n /**\n * Starts capturing events and sending logs.\n * In browser contexts waits for the DOM to be ready.\n * In worker/service-worker contexts starts immediately.\n * Safe to call again after options() — the sender restarts with the new config.\n */\n start(): void {\n this.whenReady(() => {\n this.attach();\n this.sender.start(this.logs, this.config);\n });\n }\n\n /**\n * Captures events and routes them through callbacks, but does not start the\n * sender. Use this in content-script contexts where a separate background\n * instance owns transport — the rerouteLog callback intercepts every log\n * before it can be queued, so no fetch calls are ever made from the page.\n */\n capture(): void {\n this.whenReady(() => this.attach());\n }\n\n /**\n * Stops sending logs and clears the sender interval.\n */\n stop(): void {\n this.started = this.config.on = false;\n this.sender.stop();\n }\n\n private whenReady(fn: () => void): void {\n if (typeof document === \"undefined\") {\n fn();\n return;\n }\n if (\n document.readyState === \"interactive\" ||\n document.readyState === \"complete\"\n ) {\n fn();\n } else {\n document.addEventListener(\"DOMContentLoaded\", fn, { once: true });\n }\n }\n\n private attach(): void {\n if (!this.started) {\n attachHandlers(this.config, this.packager);\n this.started = this.config.on = true;\n\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n this.packager.packageCustomLog(\n {\n type: \"load\",\n details: { pageLoadTime: endLoadTimestamp - startLoadTimestamp },\n },\n () => ({}),\n false,\n );\n }\n } else {\n this.config.on = true;\n }\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n options(newConfig?: Partial): Settings.Config {\n if (newConfig) this.config.update(newConfig);\n return this.config;\n }\n\n log(customLog: Logging.UserLog | undefined): boolean {\n if (customLog) {\n this.logs.push(customLog as Logging.Log);\n return true;\n }\n return false;\n }\n\n flush(): Promise {\n return this.sender.flush(this.logs, this.config);\n }\n\n addCallbacks(\n ...newCallbacks: Record[]\n ): void {\n this.packager.addCallbacks(...newCallbacks);\n }\n\n removeCallbacks(targetKeys: string[]): void {\n this.packager.removeCallbacks(targetKeys);\n }\n\n packageCustomLog(\n userLog: Logging.UserLog,\n detailFcn: Logging.DynamicDetailFunction | Logging.StaticDetailFunction,\n userAction: boolean,\n ): boolean {\n return this.packager.packageCustomLog(userLog, detailFcn, userAction);\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the 'License'); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Settings } from \"@/types\";\nimport { generateSpanId } from \"@/utils/ids\";\n\nlet sessionId: string | null = null;\nlet httpSessionId: string | null = null;\n\n/**\n * Extracts the initial configuration settings from the\n * currently executing script tag.\n */\nexport function getInitialSettings(): Settings.Config {\n if (\n typeof WorkerGlobalScope !== \"undefined\" &&\n self instanceof WorkerGlobalScope\n ) {\n return {\n authHeader: null,\n autostart: true,\n browserSessionId: null,\n custIndex: null,\n headers: null,\n httpSessionId: null,\n logCountThreshold: 5,\n logDetails: false,\n resolution: 500,\n sessionId,\n time: (ts?: number) => (ts !== undefined ? ts : Date.now()),\n toolName: null,\n toolVersion: null,\n transmitInterval: 5000,\n url: \"http://localhost:4318\",\n useraleVersion: null,\n userFromParams: null,\n userId: null,\n };\n }\n\n if (sessionId === null) {\n sessionId = getOrCreateSessionId(\n \"userAlesessionId\",\n \"session_\" + String(Date.now()),\n );\n }\n\n if (httpSessionId === null) {\n httpSessionId = getOrCreateSessionId(\n \"userAleHttpSessionId\",\n generateSpanId(),\n );\n }\n\n const script =\n document.currentScript ??\n ((): Element | null => {\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1] ?? null;\n })();\n\n const get = (attr: string): string | null =>\n script ? script.getAttribute(attr) : null;\n\n const headers = get(\"data-headers\");\n\n return {\n authHeader: get(\"data-auth\"),\n autostart: get(\"data-autostart\") !== \"false\",\n browserSessionId: null,\n custIndex: get(\"data-index\"),\n headers: headers ? JSON.parse(headers) : null,\n httpSessionId,\n logCountThreshold: +(get(\"data-threshold\") ?? 5),\n logDetails: get(\"data-log-details\") === \"true\",\n resolution: +(get(\"data-resolution\") ?? 500),\n sessionId: get(\"data-session\") ?? sessionId,\n time: timeStampScale(document.createEvent(\"CustomEvent\")),\n toolName: get(\"data-tool\"),\n toolVersion: get(\"data-version\"),\n transmitInterval: +(get(\"data-interval\") ?? 5000),\n url: get(\"data-url\") ?? \"http://localhost:4318\",\n useraleVersion: get(\"data-userale-version\"),\n userFromParams: get(\"data-user-from-params\"),\n userId: get(\"data-user\"),\n };\n}\n\n/**\n * Retrieves a session ID from sessionStorage, creating and storing it if absent.\n * Preserves the session across page refreshes (e.g. after form submit).\n */\nexport function getOrCreateSessionId(\n key: string,\n defaultValue: string,\n): string {\n const stored = self.sessionStorage.getItem(key);\n if (stored === null) {\n self.sessionStorage.setItem(key, JSON.stringify(defaultValue));\n return defaultValue;\n }\n return JSON.parse(stored) as string;\n}\n\n/**\n * Returns a function that normalises a browser event timestamp to Unix ms,\n * accounting for cross-browser quirks in how timeStamp is reported.\n */\nexport function timeStampScale(e: Event): Settings.TimeFunction {\n if (e.timeStamp && e.timeStamp > 0) {\n const delta = Date.now() - e.timeStamp;\n if (delta < 0) {\n return () => e.timeStamp / 1000;\n } else if (delta > e.timeStamp) {\n const navStart = performance.timeOrigin;\n return (ts: number) => ts + navStart;\n } else {\n return (ts: number) => ts;\n }\n }\n return () => Date.now();\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInitialSettings } from \"@/utils/getInitialSettings\";\nimport type { Settings } from \"@/types\";\n\n// Singleton Configuration class\nexport class Configuration {\n [key: string]: Settings.ConfigValueTypes;\n // Private static property to hold the singleton instance\n private static instance: Configuration | null = null;\n\n // Public properties corresponding to fields in the Config interface\n public autostart: boolean = false;\n public authHeader: Settings.AuthHeader = null;\n public browserSessionId: Settings.SessionId = null;\n public custIndex: Settings.CustomIndex = null;\n public headers: Settings.Headers = null;\n public httpSessionId: Settings.SessionId = null;\n public logCountThreshold: number = 0;\n public logDetails: boolean = false;\n public on: boolean = false;\n public resolution: number = 0;\n public sessionId: Settings.SessionId = null;\n public time: Settings.TimeFunction = () => Date.now();\n public toolName: Settings.ToolName = null;\n public toolVersion: Settings.Version = null;\n public transmitInterval: number = 0;\n public url: string = \"\";\n public userFromParams: Settings.UserFromParams = null;\n public useraleVersion: Settings.Version = null;\n public userId: Settings.UserId = null;\n public version: Settings.Version = null;\n\n // Private constructor to prevent external instantiation\n private constructor() {\n // Call the initialization method only if it's the first time instantiating\n if (Configuration.instance === null) {\n this.initialize();\n }\n }\n\n // Static method to get the singleton instance\n public static getInstance(): Configuration {\n if (Configuration.instance === null) {\n Configuration.instance = new Configuration();\n }\n return Configuration.instance;\n }\n\n private initialize(): void {\n const settings = getInitialSettings();\n this.update(settings);\n }\n\n /**\n * Resets the configuration to its initial state.\n */\n public reset(): void {\n this.initialize();\n }\n\n /**\n * Shallow merges a newConfig with the configuration class, updating it.\n * Retrieves/updates the userid if userFromParams is provided.\n * @param {Partial} newConfig Configuration object to merge into the current config.\n */\n public update(newConfig: Partial): void {\n Object.keys(newConfig).forEach((option) => {\n if (option === \"userFromParams\") {\n const userParamString = newConfig[option] as Settings.UserFromParams;\n const userId = userParamString\n ? Configuration.getUserIdFromParams(userParamString)\n : null;\n if (userId) {\n this[\"userId\"] = userId;\n }\n }\n const hasNewUserFromParams = newConfig[\"userFromParams\"];\n const willNullifyUserId =\n option === \"userId\" && newConfig[option] === null;\n if (willNullifyUserId && hasNewUserFromParams) {\n return;\n }\n\n const newOption = newConfig[option];\n if (newOption !== undefined) {\n this[option] = newOption;\n }\n });\n }\n\n /**\n * Attempts to extract the userid from the query parameters of the URL.\n * @param {string} param The name of the query parameter containing the userid.\n * @return {string | null} The extracted/decoded userid, or null if none is found.\n */\n public static getUserIdFromParams(param: string) {\n const userField = param;\n const regex = new RegExp(\"[?&]\" + userField + \"(=([^&#]*)|&|#|$)\");\n const results = window.location.href.match(regex);\n\n if (results && results[2]) {\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n }\n return null;\n }\n}\n","/*!\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UserALE, Configuration } from \"flagon-userale\";\n\nconst instance = new UserALE(Configuration.getInstance());\n\nif (instance.config.autostart) {\n instance.start();\n}\n"],"mappings":"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","names":["attr","attr"]} \ No newline at end of file diff --git a/products/userale/packages/iife/package.json b/products/userale/packages/iife/package.json new file mode 100644 index 0000000..7c3fa0c --- /dev/null +++ b/products/userale/packages/iife/package.json @@ -0,0 +1,17 @@ +{ + "name": "flagon-userale-iife", + "version": "2.4.0", + "description": "Script-tag (IIFE) build of UserALE. Loads via