diff --git a/frontend/index.html b/frontend/index.html
deleted file mode 100644
index 00f7aef..0000000
--- a/frontend/index.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
- Notebrook
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frontend/manifest.webmanifest b/frontend/manifest.webmanifest
deleted file mode 100644
index d19acce..0000000
--- a/frontend/manifest.webmanifest
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "Notebrook",
- "short_name": "Notebrook",
- "description": "Stream of conciousness accessible note taking",
- "start_url": "/",
- "display": "standalone",
- "background_color": "#ffffff",
- "theme_color": "#ffffff",
- "icons": [
- {
- "src": "/icons/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/icons/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- },
- {
- "src": "/icons/apple-touch-icon.png",
- "sizes": "180x180",
- "type": "image/png"
- },
- {
- "src": "/icons/mstile-150x150.png",
- "sizes": "150x150",
- "type": "image/png"
- }
- ]
-}
\ No newline at end of file
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
deleted file mode 100644
index 0b53354..0000000
--- a/frontend/package-lock.json
+++ /dev/null
@@ -1,4949 +0,0 @@
-{
- "name": "notebrook-frontend",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "notebrook-frontend",
- "version": "0.0.0",
- "dependencies": {
- "idb-keyval": "^6.2.1",
- "vite-plugin-pwa": "^0.20.1"
- },
- "devDependencies": {
- "typescript": "^5.5.3",
- "vite": "^5.4.0"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "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/@babel/code-frame": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
- "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
- "dependencies": {
- "@babel/highlight": "^7.24.7",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz",
- "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
- "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.0",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-module-transforms": "^7.25.2",
- "@babel/helpers": "^7.25.0",
- "@babel/parser": "^7.25.0",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.2",
- "@babel/types": "^7.25.2",
- "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/generator": {
- "version": "7.25.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz",
- "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==",
- "dependencies": {
- "@babel/types": "^7.25.4",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
- "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
- "dependencies": {
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
- "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
- "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
- "dependencies": {
- "@babel/compat-data": "^7.25.2",
- "@babel/helper-validator-option": "^7.24.8",
- "browserslist": "^4.23.1",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz",
- "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-member-expression-to-functions": "^7.24.8",
- "@babel/helper-optimise-call-expression": "^7.24.7",
- "@babel/helper-replace-supers": "^7.25.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/traverse": "^7.25.4",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
- "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "regexpu-core": "^5.3.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
- "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
- "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-member-expression-to-functions": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
- "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
- "dependencies": {
- "@babel/traverse": "^7.24.8",
- "@babel/types": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
- "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
- "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-simple-access": "^7.24.7",
- "@babel/helper-validator-identifier": "^7.24.7",
- "@babel/traverse": "^7.25.2"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
- "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
- "dependencies": {
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
- "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
- "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-wrap-function": "^7.25.0",
- "@babel/traverse": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
- "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
- "dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.24.8",
- "@babel/helper-optimise-call-expression": "^7.24.7",
- "@babel/traverse": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
- "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
- "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
- "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
- "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
- "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
- "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
- "dependencies": {
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.0",
- "@babel/types": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz",
- "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==",
- "dependencies": {
- "@babel/template": "^7.25.0",
- "@babel/types": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
- "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.24.7",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz",
- "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==",
- "dependencies": {
- "@babel/types": "^7.25.4"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
- "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
- "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.25.0",
- "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.25.0.tgz",
- "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
- "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
- "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.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-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-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-import-assertions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
- "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
- "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "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-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-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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
- "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz",
- "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-remap-async-to-generator": "^7.25.0",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/traverse": "^7.25.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
- "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-remap-async-to-generator": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
- "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
- "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz",
- "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.4",
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
- "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.25.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz",
- "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-replace-supers": "^7.25.0",
- "@babel/traverse": "^7.25.4",
- "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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
- "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/template": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
- "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
- "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
- "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
- "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
- "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
- "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
- "dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
- "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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-for-of": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
- "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.25.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
- "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
- "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
- "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
- "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
- "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
- "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
- "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-simple-access": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
- "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "@babel/traverse": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
- "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
- "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
- "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
- "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
- "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
- "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
- "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-replace-supers": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
- "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
- "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
- "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz",
- "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.4",
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
- "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
- "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
- "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "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.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
- "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
- "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
- "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
- "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
- "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
- "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
- "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
- "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
- "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz",
- "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.2",
- "@babel/helper-plugin-utils": "^7.24.8"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/preset-env": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz",
- "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==",
- "dependencies": {
- "@babel/compat-data": "^7.25.4",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-validator-option": "^7.24.8",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
- "@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.24.7",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@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.24.7",
- "@babel/plugin-transform-async-generator-functions": "^7.25.4",
- "@babel/plugin-transform-async-to-generator": "^7.24.7",
- "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
- "@babel/plugin-transform-block-scoping": "^7.25.0",
- "@babel/plugin-transform-class-properties": "^7.25.4",
- "@babel/plugin-transform-class-static-block": "^7.24.7",
- "@babel/plugin-transform-classes": "^7.25.4",
- "@babel/plugin-transform-computed-properties": "^7.24.7",
- "@babel/plugin-transform-destructuring": "^7.24.8",
- "@babel/plugin-transform-dotall-regex": "^7.24.7",
- "@babel/plugin-transform-duplicate-keys": "^7.24.7",
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
- "@babel/plugin-transform-dynamic-import": "^7.24.7",
- "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
- "@babel/plugin-transform-export-namespace-from": "^7.24.7",
- "@babel/plugin-transform-for-of": "^7.24.7",
- "@babel/plugin-transform-function-name": "^7.25.1",
- "@babel/plugin-transform-json-strings": "^7.24.7",
- "@babel/plugin-transform-literals": "^7.25.2",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
- "@babel/plugin-transform-member-expression-literals": "^7.24.7",
- "@babel/plugin-transform-modules-amd": "^7.24.7",
- "@babel/plugin-transform-modules-commonjs": "^7.24.8",
- "@babel/plugin-transform-modules-systemjs": "^7.25.0",
- "@babel/plugin-transform-modules-umd": "^7.24.7",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
- "@babel/plugin-transform-new-target": "^7.24.7",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
- "@babel/plugin-transform-numeric-separator": "^7.24.7",
- "@babel/plugin-transform-object-rest-spread": "^7.24.7",
- "@babel/plugin-transform-object-super": "^7.24.7",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.8",
- "@babel/plugin-transform-parameters": "^7.24.7",
- "@babel/plugin-transform-private-methods": "^7.25.4",
- "@babel/plugin-transform-private-property-in-object": "^7.24.7",
- "@babel/plugin-transform-property-literals": "^7.24.7",
- "@babel/plugin-transform-regenerator": "^7.24.7",
- "@babel/plugin-transform-reserved-words": "^7.24.7",
- "@babel/plugin-transform-shorthand-properties": "^7.24.7",
- "@babel/plugin-transform-spread": "^7.24.7",
- "@babel/plugin-transform-sticky-regex": "^7.24.7",
- "@babel/plugin-transform-template-literals": "^7.24.7",
- "@babel/plugin-transform-typeof-symbol": "^7.24.8",
- "@babel/plugin-transform-unicode-escapes": "^7.24.7",
- "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
- "@babel/plugin-transform-unicode-regex": "^7.24.7",
- "@babel/plugin-transform-unicode-sets-regex": "^7.25.4",
- "@babel/preset-modules": "0.1.6-no-external-plugins",
- "babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.6",
- "babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.37.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "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/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.25.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz",
- "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
- "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
- "dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/parser": "^7.25.0",
- "@babel/types": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz",
- "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==",
- "dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.4",
- "@babel/parser": "^7.25.4",
- "@babel/template": "^7.25.0",
- "@babel/types": "^7.25.4",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz",
- "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==",
- "dependencies": {
- "@babel/helper-string-parser": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
- "cpu": [
- "loong64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
- "cpu": [
- "mips64el"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
- "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@rollup/plugin-node-resolve": {
- "version": "15.2.3",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
- "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
- "dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "@types/resolve": "1.20.2",
- "deepmerge": "^4.2.2",
- "is-builtin-module": "^3.2.1",
- "is-module": "^1.0.0",
- "resolve": "^1.22.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.78.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/plugin-terser": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
- "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
- "dependencies": {
- "serialize-javascript": "^6.0.1",
- "smob": "^1.0.0",
- "terser": "^5.17.4"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
- "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/pluginutils/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/@rollup/rollup-android-arm-eabi": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz",
- "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz",
- "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz",
- "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz",
- "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz",
- "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz",
- "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz",
- "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz",
- "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz",
- "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz",
- "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz",
- "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz",
- "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz",
- "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz",
- "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz",
- "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz",
- "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "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/@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/resolve": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
- "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
- },
- "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/acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "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/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="
- },
- "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/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.11",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
- "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
- "dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
- "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "core-js-compat": "^3.38.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
- "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "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/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/browserslist": {
- "version": "4.23.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
- "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
- "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.30001646",
- "electron-to-chromium": "^1.5.4",
- "node-releases": "^2.0.18",
- "update-browserslist-db": "^1.1.0"
- },
- "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=="
- },
- "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/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001653",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz",
- "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==",
- "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/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/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/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/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/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/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "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/core-js-compat": {
- "version": "3.38.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
- "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
- "dependencies": {
- "browserslist": "^4.23.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "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/data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
- "dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
- "dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "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/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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/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.5.13",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz",
- "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q=="
- },
- "node_modules/es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.4",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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/esbuild": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "engines": {
- "node": ">=6"
- }
- },
- "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/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
- },
- "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/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-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-uri": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
- "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw=="
- },
- "node_modules/fdir": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz",
- "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==",
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "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/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/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/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-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "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-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
- "dependencies": {
- "call-bind": "^1.0.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
- },
- "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==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "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/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.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
- "dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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/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": "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/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
- "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.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/idb": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
- "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
- },
- "node_modules/idb-keyval": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz",
- "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg=="
- },
- "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==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "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/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
- },
- "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-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-builtin-module": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
- "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
- "dependencies": {
- "builtin-modules": "^3.3.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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.15.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
- "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
- "dependencies": {
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "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-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.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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-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-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
- "dependencies": {
- "call-bind": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "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.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
- "dependencies": {
- "which-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "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/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
- },
- "node_modules/jake": {
- "version": "10.9.2",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
- "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
- "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/jake/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/jake/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/jake/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/jake/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/jake/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/jake/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/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/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-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": "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/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/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/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/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.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/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/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/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/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/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/node-releases": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
- },
- "node_modules/object-inspect": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
- "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
- "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/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/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-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/picocolors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
- "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
- },
- "node_modules/picomatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.41",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
- "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
- "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.1",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/pretty-bytes": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz",
- "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==",
- "engines": {
- "node": "^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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/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/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.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
- },
- "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/regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
- "dependencies": {
- "call-bind": "^1.0.6",
- "define-properties": "^1.2.1",
- "es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
- },
- "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/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/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/rollup": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz",
- "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==",
- "dependencies": {
- "@types/estree": "1.0.5"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.21.0",
- "@rollup/rollup-android-arm64": "4.21.0",
- "@rollup/rollup-darwin-arm64": "4.21.0",
- "@rollup/rollup-darwin-x64": "4.21.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.21.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.21.0",
- "@rollup/rollup-linux-arm64-gnu": "4.21.0",
- "@rollup/rollup-linux-arm64-musl": "4.21.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.21.0",
- "@rollup/rollup-linux-s390x-gnu": "4.21.0",
- "@rollup/rollup-linux-x64-gnu": "4.21.0",
- "@rollup/rollup-linux-x64-musl": "4.21.0",
- "@rollup/rollup-win32-arm64-msvc": "4.21.0",
- "@rollup/rollup-win32-ia32-msvc": "4.21.0",
- "@rollup/rollup-win32-x64-msvc": "4.21.0",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "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.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
- "dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-function-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
- "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/smob": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz",
- "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="
- },
- "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/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "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==",
- "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/string.prototype.matchall": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
- "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "regexp.prototype.flags": "^1.5.2",
- "set-function-name": "^2.0.2",
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
- "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "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-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/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/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/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/terser": {
- "version": "5.31.6",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz",
- "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==",
- "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/tinyglobby": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.5.tgz",
- "integrity": "sha512-Dlqgt6h0QkoHttG53/WGADNh9QhcjCAIZMTERAVhdpmIBEejSuLI9ZmGKWzB7tweBjlk30+s/ofi4SLmBeTYhw==",
- "dependencies": {
- "fdir": "^6.2.0",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "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/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/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/typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
- "dependencies": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typescript": {
- "version": "5.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
- "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "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/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/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.1.0",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
- "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
- "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.2",
- "picocolors": "^1.0.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/vite": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz",
- "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
- "dependencies": {
- "esbuild": "^0.21.3",
- "postcss": "^8.4.41",
- "rollup": "^4.20.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/vite-plugin-pwa": {
- "version": "0.20.1",
- "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.1.tgz",
- "integrity": "sha512-M6Pk4b18i5ryrhKgiIF8Zud0HGphYiCbEfLsCdlvmwn/CEnS6noVwfIDG/+3V7r6yxpPV/gLiKw+rIlCCiCCoQ==",
- "dependencies": {
- "debug": "^4.3.4",
- "pretty-bytes": "^6.1.1",
- "tinyglobby": "^0.2.0",
- "workbox-build": "^7.1.0",
- "workbox-window": "^7.1.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "@vite-pwa/assets-generator": "^0.2.4",
- "vite": "^3.1.0 || ^4.0.0 || ^5.0.0",
- "workbox-build": "^7.1.0",
- "workbox-window": "^7.1.0"
- },
- "peerDependenciesMeta": {
- "@vite-pwa/assets-generator": {
- "optional": true
- }
- }
- },
- "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/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/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-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/workbox-background-sync": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz",
- "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==",
- "dependencies": {
- "idb": "^7.0.1",
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-broadcast-update": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz",
- "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==",
- "dependencies": {
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-build": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz",
- "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==",
- "dependencies": {
- "@apideck/better-ajv-errors": "^0.3.1",
- "@babel/core": "^7.24.4",
- "@babel/preset-env": "^7.11.0",
- "@babel/runtime": "^7.11.2",
- "@rollup/plugin-babel": "^5.2.0",
- "@rollup/plugin-node-resolve": "^15.2.3",
- "@rollup/plugin-replace": "^2.4.1",
- "@rollup/plugin-terser": "^0.4.3",
- "@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",
- "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": "7.1.0",
- "workbox-broadcast-update": "7.1.0",
- "workbox-cacheable-response": "7.1.0",
- "workbox-core": "7.1.0",
- "workbox-expiration": "7.1.0",
- "workbox-google-analytics": "7.1.0",
- "workbox-navigation-preload": "7.1.0",
- "workbox-precaching": "7.1.0",
- "workbox-range-requests": "7.1.0",
- "workbox-recipes": "7.1.0",
- "workbox-routing": "7.1.0",
- "workbox-strategies": "7.1.0",
- "workbox-streams": "7.1.0",
- "workbox-sw": "7.1.0",
- "workbox-window": "7.1.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/workbox-build/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/workbox-build/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/workbox-build/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/workbox-build/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/workbox-build/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/workbox-build/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/workbox-build/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/workbox-build/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/workbox-cacheable-response": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz",
- "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==",
- "dependencies": {
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-core": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz",
- "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q=="
- },
- "node_modules/workbox-expiration": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz",
- "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==",
- "dependencies": {
- "idb": "^7.0.1",
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-google-analytics": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz",
- "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==",
- "dependencies": {
- "workbox-background-sync": "7.1.0",
- "workbox-core": "7.1.0",
- "workbox-routing": "7.1.0",
- "workbox-strategies": "7.1.0"
- }
- },
- "node_modules/workbox-navigation-preload": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz",
- "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==",
- "dependencies": {
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-precaching": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz",
- "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==",
- "dependencies": {
- "workbox-core": "7.1.0",
- "workbox-routing": "7.1.0",
- "workbox-strategies": "7.1.0"
- }
- },
- "node_modules/workbox-range-requests": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz",
- "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==",
- "dependencies": {
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-recipes": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz",
- "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==",
- "dependencies": {
- "workbox-cacheable-response": "7.1.0",
- "workbox-core": "7.1.0",
- "workbox-expiration": "7.1.0",
- "workbox-precaching": "7.1.0",
- "workbox-routing": "7.1.0",
- "workbox-strategies": "7.1.0"
- }
- },
- "node_modules/workbox-routing": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz",
- "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==",
- "dependencies": {
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-strategies": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz",
- "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==",
- "dependencies": {
- "workbox-core": "7.1.0"
- }
- },
- "node_modules/workbox-streams": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz",
- "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==",
- "dependencies": {
- "workbox-core": "7.1.0",
- "workbox-routing": "7.1.0"
- }
- },
- "node_modules/workbox-sw": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz",
- "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA=="
- },
- "node_modules/workbox-window": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz",
- "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==",
- "dependencies": {
- "@types/trusted-types": "^2.0.2",
- "workbox-core": "7.1.0"
- }
- },
- "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/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- }
- }
-}
diff --git a/frontend/package.json b/frontend/package.json
deleted file mode 100644
index 5f38dd3..0000000
--- a/frontend/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "notebrook-frontend",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "tsc && vite build",
- "preview": "vite preview"
- },
- "devDependencies": {
- "typescript": "^5.5.3",
- "vite": "^5.4.0"
- },
- "dependencies": {
- "idb-keyval": "^6.2.1",
- "vite-plugin-pwa": "^0.20.1"
- }
-}
diff --git a/frontend/public/copy.wav b/frontend/public/copy.wav
deleted file mode 100644
index d052a0e..0000000
Binary files a/frontend/public/copy.wav and /dev/null differ
diff --git a/frontend/public/intro.wav b/frontend/public/intro.wav
deleted file mode 100644
index bf53d70..0000000
Binary files a/frontend/public/intro.wav and /dev/null differ
diff --git a/frontend/public/login.wav b/frontend/public/login.wav
deleted file mode 100644
index d6af49d..0000000
Binary files a/frontend/public/login.wav and /dev/null differ
diff --git a/frontend/public/sent1.wav b/frontend/public/sent1.wav
deleted file mode 100644
index 1b4e164..0000000
Binary files a/frontend/public/sent1.wav and /dev/null differ
diff --git a/frontend/public/sent2.wav b/frontend/public/sent2.wav
deleted file mode 100644
index 00ffed1..0000000
Binary files a/frontend/public/sent2.wav and /dev/null differ
diff --git a/frontend/public/sent3.wav b/frontend/public/sent3.wav
deleted file mode 100644
index 6cfd030..0000000
Binary files a/frontend/public/sent3.wav and /dev/null differ
diff --git a/frontend/public/sent4.wav b/frontend/public/sent4.wav
deleted file mode 100644
index b94156c..0000000
Binary files a/frontend/public/sent4.wav and /dev/null differ
diff --git a/frontend/public/sent5.wav b/frontend/public/sent5.wav
deleted file mode 100644
index 4f67554..0000000
Binary files a/frontend/public/sent5.wav and /dev/null differ
diff --git a/frontend/public/sent6.wav b/frontend/public/sent6.wav
deleted file mode 100644
index e86d5ad..0000000
Binary files a/frontend/public/sent6.wav and /dev/null differ
diff --git a/frontend/public/uploadfail.wav b/frontend/public/uploadfail.wav
deleted file mode 100644
index 98f7828..0000000
Binary files a/frontend/public/uploadfail.wav and /dev/null differ
diff --git a/frontend/public/water1.wav b/frontend/public/water1.wav
deleted file mode 100644
index c00a536..0000000
Binary files a/frontend/public/water1.wav and /dev/null differ
diff --git a/frontend/public/water10.wav b/frontend/public/water10.wav
deleted file mode 100644
index 86f67ff..0000000
Binary files a/frontend/public/water10.wav and /dev/null differ
diff --git a/frontend/public/water2.wav b/frontend/public/water2.wav
deleted file mode 100644
index 3bcee7a..0000000
Binary files a/frontend/public/water2.wav and /dev/null differ
diff --git a/frontend/public/water3.wav b/frontend/public/water3.wav
deleted file mode 100644
index 1c35eb2..0000000
Binary files a/frontend/public/water3.wav and /dev/null differ
diff --git a/frontend/public/water4.wav b/frontend/public/water4.wav
deleted file mode 100644
index 6c769ec..0000000
Binary files a/frontend/public/water4.wav and /dev/null differ
diff --git a/frontend/public/water5.wav b/frontend/public/water5.wav
deleted file mode 100644
index 91bf464..0000000
Binary files a/frontend/public/water5.wav and /dev/null differ
diff --git a/frontend/public/water6.wav b/frontend/public/water6.wav
deleted file mode 100644
index 18bc34a..0000000
Binary files a/frontend/public/water6.wav and /dev/null differ
diff --git a/frontend/public/water7.wav b/frontend/public/water7.wav
deleted file mode 100644
index 42e16d9..0000000
Binary files a/frontend/public/water7.wav and /dev/null differ
diff --git a/frontend/public/water8.wav b/frontend/public/water8.wav
deleted file mode 100644
index 9a4c849..0000000
Binary files a/frontend/public/water8.wav and /dev/null differ
diff --git a/frontend/public/water9.wav b/frontend/public/water9.wav
deleted file mode 100644
index 2068e18..0000000
Binary files a/frontend/public/water9.wav and /dev/null differ
diff --git a/frontend/src/api.ts b/frontend/src/api.ts
deleted file mode 100644
index c405bf4..0000000
--- a/frontend/src/api.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { IChannel } from "./model/channel";
-import { IChannelList } from "./model/channel-list";
-import { IMessage } from "./model/message";
-import { IUnsentMessage } from "./model/unsent-message";
-import { state } from "./state";
-
-
-export const API = {
- token: "",
- path: "http://localhost:3000",
-
- async request(method: string, path: string, body?: any) {
- if (!API.token) {
- throw new Error("API token was not set.");
- }
- return fetch(`${API.path}/${path}`, {
- method,
- headers: {
- "Content-Type": "application/json",
- "Authorization": API.token
- },
- body: JSON.stringify(body),
- });
- },
-
- async checkToken() {
- const response = await API.request("GET", "check-token");
- if (response.status !== 200) {
- throw new Error("Invalid token in request");
- }
- },
-
- async getChannels() {
- const response = await API.request("GET", "channels");
- const json = await response.json();
- return json.channels as IChannel[];
- },
-
- async getChannel(id: string) {
- const response = await API.request("GET", `channels/${id}`);
- const json = await response.json();
- return json.channel as IChannel;
- },
-
- async createChannel(name: string) {
- const response = await API.request("POST", "channels", { name });
- const json = await response.json();
- return json as IChannel;
- },
-
- async deleteChannel(id: string) {
- await API.request("DELETE", `channels/${id}`);
- },
-
- async getMessages(channelId: string) {
- const response = await API.request("GET", `channels/${channelId}/messages`);
- console.log(response)
- const json = await response.json();
- return json.messages as IMessage[];
- },
-
- async createMessage(channelId: string, content: string) {
- const response = await API.request("POST", `channels/${channelId}/messages`, { content });
- const json = await response.json();
- return json as IMessage;
- },
-
- async deleteMessage(channelId: string, messageId: string) {
- await API.request("DELETE", `channels/${channelId}/messages/${messageId}`);
- },
-
- async uploadFile(channelId: string, messageId: string, file: File | Blob) {
- const formData = new FormData();
- formData.append("file", file);
-
- const response = await fetch(`${API.path}/channels/${channelId}/messages/${messageId}/files`, {
- method: "POST",
- headers: {
- "Authorization": API.token
- },
- body: formData,
- });
-
- const json = await response.json();
- return json;
- },
-
- async mergeChannels(channelId: string, targetChannelId: string) {
- await API.request("PUT", `channels/${channelId}/merge`, { targetChannelId });
- },
-
- async search(query: string, channelId?: string) {
- const queryPath = channelId ? `search?query=${encodeURIComponent(query)}&channelId=${channelId}` : `search?query=${encodeURIComponent(query)}`;
- const response = await API.request("GET", queryPath);
- const json = await response.json();
- return json.results as IMessage[];
- },
-
- async getFiles(channelId: string, messageId: string) {
- const response = await API.request("GET", `channels/${channelId}/messages/${messageId}/files`);
- const json = await response.json();
- return json.files as string[];
- }
-}
\ No newline at end of file
diff --git a/frontend/src/chunk-processor.ts b/frontend/src/chunk-processor.ts
deleted file mode 100644
index 5400f4d..0000000
--- a/frontend/src/chunk-processor.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-export class ChunkProcessor {
- private chunkSize: number;
-
- constructor(chunkSize: number = 1000) {
- this.chunkSize = chunkSize;
- }
-
- async processArray(array: T[], callback: (chunk: T[]) => void): Promise {
- const totalChunks = Math.ceil(array.length / this.chunkSize);
-
- for (let i = 0; i < totalChunks; i++) {
- const chunk = array.slice(i * this.chunkSize, (i + 1) * this.chunkSize);
- await this.processChunk(chunk, callback);
- }
- }
-
- private async processChunk(chunk: T[], callback: (chunk: T[]) => void): Promise {
- return new Promise((resolve) => {
- setTimeout(() => {
- callback(chunk);
- resolve();
- }, 0);
- });
- }
-}
diff --git a/frontend/src/dialogs/channel-dialog.ts b/frontend/src/dialogs/channel-dialog.ts
deleted file mode 100644
index 67919ac..0000000
--- a/frontend/src/dialogs/channel-dialog.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { IChannel } from "../model/channel";
-import { showToast } from "../speech";
-import { state } from "../state";
-import { Button, TextInput } from "../ui";
-import { Dialog } from "../ui/dialog";
-import { MergeDialog } from "./merge-dialog";
-import { RemoveDialog } from "./remove-dialog";
-
-export class ChannelDialog extends Dialog {
- private channel: IChannel;
- private nameField: TextInput;
- private idField: TextInput;
- private makeDefault: Button;
- private mergeButton: Button;
- private deleteButton: Button;
-
- public constructor(channel: IChannel) {
- super("Channel info for " + channel.name);
- this.channel = channel;
- this.nameField = new TextInput("Channel name");
- this.nameField.setPosition(25, 10, 50, 10);
- this.nameField.setValue(channel.name);
- this.idField = new TextInput("Channel ID (for use with API)");
- this.idField.setPosition(45, 10, 50, 10);
- this.idField.setReadonly(true);
- this.idField.setValue(channel.id.toString());
-
- this.makeDefault = new Button("Make default");
- this.makeDefault.setPosition(20, 70, 10, 10);
- this.makeDefault.onClick(() => {
- state.defaultChannelId = this.channel.id;
- showToast(`${channel.name} is now the default channel.`);
- });
- this.mergeButton = new Button("Merge");
- this.mergeButton.setPosition(40, 70, 10, 10);
- this.mergeButton.onClick(() => {
- this.mergeChannel();
- });
- if (state.channelList.channels.length === 1) {
- this.mergeButton.setDisabled(true);
- }
- this.deleteButton = new Button("Delete");
- this.deleteButton.setPosition(60, 70, 10, 10);
- this.deleteButton.onClick(() => {
- this.deleteChannel();
- });
- this.add(this.nameField);
- this.add(this.idField);
- this.add(this.makeDefault);
- this.add(this.mergeButton);
- this.add(this.deleteButton);
- this.setOkAction(() => {
- this.channel.name = this.nameField.getValue();
- return this.channel;
- });
- }
-
- private async mergeChannel() {
- const res = await new MergeDialog().open();
- if (res) {
- this.choose(this.channel);
- } else {
- return;
- }
- }
-
- private async deleteChannel() {
- const res = await new RemoveDialog(this.channel.id.toString()).open();
- if (res) {
- this.choose(null);
- } else {
- return;
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/create-channel.ts b/frontend/src/dialogs/create-channel.ts
deleted file mode 100644
index 3e4b3f1..0000000
--- a/frontend/src/dialogs/create-channel.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { API } from "../api";
-import { showToast } from "../speech";
-import { TextInput } from "../ui";
-import { Dialog } from "../ui/dialog";
-
-export class CreateChannelDialog extends Dialog {
- private nameField: TextInput;
-
- public constructor() {
- super("Create new channel");
- this.nameField = new TextInput("Name of new channel");
- this.add(this.nameField);
- this.setOkAction(() => {
- return this.nameField.getValue();
- });
- this.nameField.onKeyDown((key) => {
- if (key === "Enter") {
- this.choose(this.nameField.getValue());
- }
- });
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/merge-dialog.ts b/frontend/src/dialogs/merge-dialog.ts
deleted file mode 100644
index 4fdb13b..0000000
--- a/frontend/src/dialogs/merge-dialog.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Button } from "../ui";
-import { Dialog } from "../ui/dialog";
-import { API } from "../api";
-import { Dropdown } from "../ui/dropdown";
-import { state } from "../state";
-import { showToast } from "../speech";
-
-export class MergeDialog extends Dialog {
- private channelList: Dropdown;
- private mergeButton: Button;
- protected cancelButton: Button;
-
- public constructor() {
- super("Merge channels", false);
- this.channelList = new Dropdown("Target channel", []);
- this.channelList.setPosition(10, 10, 80, 20);
- this.mergeButton = new Button("Merge");
- this.mergeButton.setPosition(30, 30, 40, 30);
- this.mergeButton.onClick(() => this.merge());
- this.cancelButton = new Button("Cancel");
- this.cancelButton.setPosition(30, 70, 40, 30);
- this.cancelButton.onClick(() => this.cancel());
- this.add(this.channelList);
- this.add(this.mergeButton);
- this.add(this.cancelButton);
- this.setupChannelList();
- }
-
- private setupChannelList() {
- this.channelList.clearOptions();
- state.channelList.getChannels().forEach((channel) => {
- if (channel.id !== state.currentChannel!.id) this.channelList.addOption(channel.id.toString(), channel.name);
- })
- }
- private async merge() {
- const currentChannel = state.currentChannel;
- const target = this.channelList.getSelectedValue();
- const targetChannel = state.getChannelById(parseInt(target));
- console.log(currentChannel, targetChannel);
- if (!targetChannel || !currentChannel) this.cancel();
- try {
- const res = await API.mergeChannels(currentChannel!.id.toString(), target);
- currentChannel!.messages = [];
- showToast("Channels were merged.");
- this.choose(true);
- } catch (e) {
- showToast("Failed to merge channels: " + e);
- this.choose(false);
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/message.ts b/frontend/src/dialogs/message.ts
deleted file mode 100644
index c42b862..0000000
--- a/frontend/src/dialogs/message.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { API } from "../api";
-import { IMessage } from "../model/message";
-import { Button, Container, TextInput} from "../ui";
-import { Dialog } from "../ui/dialog";
-import { Text } from "../ui";
-import { MultilineInput } from "../ui/multiline-input";
-import { state } from "../state";
-export class MessageDialog extends Dialog {
- private message: IMessage;
- private messageText: MultilineInput;
- private deleteButton: Button;
- private fileInfoContainer?: Container;
-
- public constructor(message: IMessage) {
- super("Message");
- this.message = message;
- this.messageText = new MultilineInput("Message");
- this.messageText.setValue(message.content);
- this.messageText.setPosition(10, 10, 80, 20);
-
- this.deleteButton = new Button("Delete");
- this.deleteButton.setPosition(10, 90, 80, 10);
- this.deleteButton.onClick(async () => {
- await API.deleteMessage(state.currentChannel!.id.toString(), this.message.id.toString());
- this.choose(null);
- });
- this.add(this.messageText);
- this.add(this.deleteButton);
- if (this.message.fileId !== null) {
- this.fileInfoContainer = new Container("File info");
- this.fileInfoContainer.setPosition(10, 50, 30, 80);
- this.add(this.fileInfoContainer);
- this.handleMessage();
- }
- }
-
- private handleMessage() {
- if (this.message?.fileType?.toLowerCase().includes("audio")) {
- const audio = new Audio(`${API.path}/${this.message.filePath}`);
- audio.autoplay = true;
- }
-
- // display info about files, or the image if it is an image. Also display all metadata.
- this.fileInfoContainer?.add(new Text(`File type: ${this.message.fileType}`));
- this.fileInfoContainer?.add(new Text(`File path: ${this.message.filePath}`));
- this.fileInfoContainer?.add(new Text(`File ID: ${this.message.fileId}`));
- this.fileInfoContainer?.add(new Text(`File size: ${this.message.fileSize}`));
- this.fileInfoContainer?.add(new Text(`Original name: ${this.message.originalName}`));
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/record-audio.ts b/frontend/src/dialogs/record-audio.ts
deleted file mode 100644
index 6086b2e..0000000
--- a/frontend/src/dialogs/record-audio.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-import { Button } from "../ui";
-import { Audio } from "../ui/audio";
-import { AudioRecorder } from "../ui/audio-recorder";
-import { Dialog } from "../ui/dialog";
-
-export class RecordAudioDialog extends Dialog {
- private audioRecorder: AudioRecorder;
- private recordButton: Button;
- private stopButton: Button;
- private playButton: Button;
- private saveButton: Button;
- private discardButton: Button;
- private audioBlob: Blob | undefined;
- private audioPlayer?: Audio;
-
- constructor() {
- super("Record audio", false);
- this.audioRecorder = new AudioRecorder("Record from microphone");
- this.audioRecorder.onRecordingComplete(() => {
- this.audioBlob = this.audioRecorder.getRecording();
- this.saveButton.setDisabled(false);
- });
- this.recordButton = new Button("Record");
- this.recordButton.setPosition(30, 30, 40, 30);
- this.recordButton.onClick(() => this.startRecording());
- this.stopButton = new Button("Stop");
- this.stopButton.setPosition(70, 40, 30, 30);
- this.stopButton.onClick(() => this.stopRecording());
- this.stopButton.setDisabled(true);
- this.saveButton = new Button("Save");
- this.saveButton.setPosition(10, 80, 50, 20);
- this.saveButton.onClick(() => this.saveRecording());
- this.saveButton.setDisabled(true);
- this.playButton = new Button("Play");
- this.playButton.setPosition(0, 40, 30, 30);
- this.playButton.onClick(() => {
- if (this.audioBlob) {
- this.audioPlayer = new Audio("Recorded audio");
- this.audioPlayer.setSource(URL.createObjectURL(this.audioBlob));
- this.audioPlayer.play();
- }
- });
- this.playButton.setDisabled(true);
- this.discardButton = new Button("Discard");
- this.discardButton.setPosition(50, 90, 50, 10);
- this.discardButton.onClick(() => this.cancel());
- this.add(this.recordButton);
- this.add(this.stopButton);
- this.add(this.playButton);
- this.add(this.saveButton);
- this.add(this.discardButton);
- }
-
- private startRecording() {
- this.audioRecorder.startRecording();
- this.stopButton.setDisabled(false);
- this.recordButton.setDisabled(true);
- }
-
- private stopRecording() {
- this.audioRecorder.stopRecording();
- this.recordButton.setDisabled(false);
- this.stopButton.setDisabled(true);
- this.playButton.setDisabled(false);
- }
-
- private saveRecording() {
- if (this.audioBlob) {
- this.choose(this.audioBlob);
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/remove-dialog.ts b/frontend/src/dialogs/remove-dialog.ts
deleted file mode 100644
index 4399957..0000000
--- a/frontend/src/dialogs/remove-dialog.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Button } from "../ui";
-import { Dialog } from "../ui/dialog";
-import { Text } from "../ui";
-import { API } from "../api";
-import { state } from "../state";
-import { showToast } from "../speech";
-
-export class RemoveDialog extends Dialog {
- private content: Text;
- private confirmButton: Button;
- protected cancelButton: Button;
-
- public constructor(channelId: string) {
- super("Remove channel", false);
- this.content = new Text("Are you sure you want to remove this channel?");
- this.confirmButton = new Button("Remove");
- this.confirmButton.setPosition(30, 30, 40, 30);
- this.confirmButton.onClick(() => this.doRemove());
- this.cancelButton = new Button("Cancel");
- this.cancelButton.setPosition(30, 70, 40, 30);
- this.cancelButton.onClick(() => this.cancel());
- this.add(this.content);
- this.add(this.confirmButton);
- this.add(this.cancelButton);
- }
-
- private async doRemove() {
- try {
- const res = await API.deleteChannel(state.currentChannel!.id.toString());
- state.removeChannel(state.currentChannel!);
- showToast("Channel was removed.");
- this.choose(true);
- } catch (e) {
- showToast("Failed to remove channel: " + e);
-
- this.choose(false);
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/search.ts b/frontend/src/dialogs/search.ts
deleted file mode 100644
index 5fa7ad7..0000000
--- a/frontend/src/dialogs/search.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { API } from "../api";
-import { IMessage } from "../model/message";
-import { Button, List, ListItem, TextInput } from "../ui";
-import { Dialog } from "../ui/dialog";
-
-export class SearchDialog extends Dialog<{channelId: number, messageId: number}> {
- private searchField: TextInput;
- private searchButton: Button;
- private resultsList: List;
- private closeButton: Button;
-
- public constructor() {
- super("Search for message", false);
- this.searchField = new TextInput("Search query");
- this.searchField.setPosition(5, 5, 80, 20);
- this.searchField.onKeyDown((key) => {
- if (key === "Enter") {
- this.searchButton.click();
- }
- });
- this.searchButton = new Button("Search");
- this.searchButton.setPosition(85, 5, 10, 20);
- this.searchButton.onClick(async () => {
- const messages = await API.search(this.searchField.getValue());
- console.log(messages);
- this.renderResults(messages);
- })
- this.resultsList = new List("Results");
- this.resultsList.setPosition(5, 20, 90, 70);
- this.closeButton = new Button("Close");
- this.closeButton.setPosition(5, 90, 90, 5);
- this.closeButton.onClick(() => this.cancel());
- this.add(this.searchField);
- this.add(this.searchButton);
- this.add(this.resultsList);
- this.add(this.closeButton);
- }
-
- private renderResults(messages: IMessage[]) {
- this.resultsList.clear();
- messages.forEach((message) => {
- const itm = new ListItem(`${message.content}; ${message.createdAt}`);
- itm.onClick(() => this.choose({ messageId: message.id, channelId: message.channelId! }));
- this.resultsList.add(itm);
- });
- this.resultsList.focus();
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/settings.ts b/frontend/src/dialogs/settings.ts
deleted file mode 100644
index 5095367..0000000
--- a/frontend/src/dialogs/settings.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Button } from "../ui";
-import { Dialog } from "../ui/dialog";
-import { state } from "../state";
-
-export class SettingsDialog extends Dialog {
- private resetButton: Button;
-
- public constructor() {
- super("Settings");
- this.resetButton = new Button("Reset frontend");
- this.resetButton.setPosition(30, 20, 30, 30);
- this.resetButton.onClick(() => {
- this.reset();
- });
- this.add(this.resetButton);
- }
-
- private reset() {
- state.clear().then(() => {
- window.location.reload();
- });
- }
-}
\ No newline at end of file
diff --git a/frontend/src/dialogs/take-photo.ts b/frontend/src/dialogs/take-photo.ts
deleted file mode 100644
index d469ba3..0000000
--- a/frontend/src/dialogs/take-photo.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { API } from "../api";
-import { state } from "../state";
-import { Button } from "../ui";
-import { Camera } from "../ui/camera";
-import { Dialog } from "../ui/dialog";
-
-export class TakePhotoDialog extends Dialog {
- private camera: Camera;
- private takePhotoButton: Button;
- private discardButton: Button;
-
- constructor() {
- super("Take photo", false);
- this.camera = new Camera("Photo camera");
- this.camera.setPosition(10, 15, 80, 75);
- this.camera.startCamera();
- this.takePhotoButton = new Button("Take photo");
- this.takePhotoButton.setPosition(10, 90, 80, 10);
- this.discardButton = new Button("Cancel");
- this.discardButton.setPosition(5, 5, 10, 10);
- this.discardButton.onClick(() => this.cancel());
- this.add(this.camera);
- this.add(this.takePhotoButton);
- this.add(this.discardButton);
- this.takePhotoButton.onClick(async () => {
- const photo = await this.camera.savePhotoToBlob();
- if (photo) this.choose(photo);
- });
- }
-}
\ No newline at end of file
diff --git a/frontend/src/events/message-events.ts b/frontend/src/events/message-events.ts
deleted file mode 100644
index 0b5ffaa..0000000
--- a/frontend/src/events/message-events.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-export type MessageCreated = {
- channelId: string,
- id: string,
- content: string,
-};
-
-export type MessageDeleted = {
- channelId: string,
- messageId: string,
-};
-
-export type MessageUpdated = {
- id: string,
- content: string,
-};
-
-export type ChannelCreated = {
- name: string,
-};
-
-export type ChannelDeleted = {
- channelId: string,
-};
-
-export type ChannelUpdated = {
- channelId: string,
- name: string,
-};
\ No newline at end of file
diff --git a/frontend/src/events/messaging-system.ts b/frontend/src/events/messaging-system.ts
deleted file mode 100644
index 2197443..0000000
--- a/frontend/src/events/messaging-system.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-export type Message = {
- type: string,
- data?: T,
-};
-
-export type MessageHandler = (message: Message) => void;
-
-export class MessagingSystem {
- private handlers: Record[]> = {};
-
- public registerHandler(type: string, handler: MessageHandler): void {
- if (!this.handlers[type]) {
- this.handlers[type] = [];
- }
- if (!this.handlers[type].includes(handler)) {
- this.handlers[type].push(handler);
- }
- }
-
- public unregisterHandler(type: string, handler: MessageHandler): void {
- if (this.handlers[type]) {
- this.handlers[type] = this.handlers[type].filter(h => h !== handler);
- }
- }
-
- public registerHandlerOnce(type: string, handler: MessageHandler): void {
- const wrappedHandler = (message: Message) => {
- handler(message);
- this.unregisterHandler(type, wrappedHandler);
- };
- this.registerHandler(type, wrappedHandler);
- }
-
- public waitForMessage(type: string, timeout?: number): Promise {
- return new Promise((resolve, reject) => {
- const handler = (message: Message) => {
- if (timer) clearTimeout(timer);
- resolve(message.data!);
- this.unregisterHandler(type, handler);
- };
-
- this.registerHandler(type, handler);
-
- let timer: ReturnType | undefined;
- if (timeout) {
- timer = setTimeout(() => {
- this.unregisterHandler(type, handler);
- reject(new Error(`Timeout waiting for message of type '${type}'`));
- }, timeout);
- }
- });
- }
-
- public sendMessage(message: Message): void {
- const handlers = this.handlers[message.type];
- if (handlers) {
- handlers.forEach(handler => handler(message));
- }
- }
-}
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
deleted file mode 100644
index ed3da4d..0000000
--- a/frontend/src/main.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import './style.css'
-import { MainView } from "./views/main";
-import { ViewManager } from './views/view-manager';
-import { AuthorizeView } from './views/authorize';
-import { state } from './state';
-import { API } from './api';
-
-
-document.addEventListener("DOMContentLoaded", async () => {
- await state.load();
- const vm = new ViewManager();
- setInterval(() => {
- state.save();
- }, 10000);
-
- if (state.token === "" || state.apiUrl === "") {
- vm.push(new AuthorizeView(vm));
- } else {
- vm.push(new MainView(vm));
- }
- document.body.appendChild(vm.render() as HTMLElement);
-});
\ No newline at end of file
diff --git a/frontend/src/model/channel-list.ts b/frontend/src/model/channel-list.ts
deleted file mode 100644
index 1fadc49..0000000
--- a/frontend/src/model/channel-list.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Channel, IChannel } from "./channel";
-
-export interface IChannelList {
- channels: IChannel[]
-}
-
-export class ChannelList implements IChannelList {
- channels: Channel[] = [];
-
- constructor(channels?: IChannelList) {
- this.channels = channels?.channels?.map((chan) => new Channel(chan)) || [];
- }
-
- public addChannel(channel: Channel): void {
- this.channels.push(channel);
- }
-
- public removeChannel(channelId: number): void {
- this.channels = this.channels.filter(channel => channel.id !== channelId);
- }
-
- public getChannel(channelId: number): Channel|undefined {
- return this.channels.find(channel => channel.id === channelId);
- }
-
- public getChannelByName(channelName: string): IChannel|undefined {
- return this.channels.find(channel => channel.name === channelName);
- }
-
- public getChannels(): Channel[] {
- return this.channels;
- }
-
- public getChannelIds(): number[] {
- return this.channels.map(channel => channel.id);
- }
-
- public getChannelNames(): string[] {
- return this.channels.map(channel => channel.name);
- }
-
- public getChannelId(channelName: string): number|undefined {
- const channel = this.getChannelByName(channelName);
- return channel ? channel.id : undefined;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/model/channel.ts b/frontend/src/model/channel.ts
deleted file mode 100644
index 0581369..0000000
--- a/frontend/src/model/channel.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { IMessage, Message } from "./message";
-
-export interface IChannel {
- id: number;
- name: string;
- messages: IMessage[];
- createdAt: number;
-}
-
-export class Channel implements IChannel {
- id: number;
- name: string;
- messages: Message[];
- createdAt: number;
- private messageToIdMap: Map;
-
- constructor(channel: IChannel) {
- this.id = channel.id;
- this.name = channel.name;
- this.messages = [];
- this.messageToIdMap = new Map();
- channel.messages?.forEach((msg) => this.addMessage(new Message(msg)));
- this.createdAt = channel.createdAt;
- }
-
- public addMessage(message: Message): void {
- this.messages.push(message);
- this.messageToIdMap.set(message.id, message);
- }
-
- public removeMessage(messageId: number): void {
- this.messages = this.messages.filter(message => message.id !== messageId);
- this.messageToIdMap.delete(messageId);
- }
-
- public getMessage(messageId: number): Message|undefined {
- return this.messageToIdMap.get(messageId);
- }
-
- public getMessageByContent(content: string): Message|undefined {
- return this.messages.find(message => message.content === content);
- }
-
- public getMessages(): Message[] {
- return this.messages;
- }
-
- public getMessageIds(): number[] {
- return this.messages.map(message => message.id);
- }
-
- public getMessageContents(): string[] {
- return this.messages.map(message => message.content);
- }
-
- public getMessageId(content: string): number|undefined {
- const message = this.getMessageByContent(content);
- return message ? message.id : undefined;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/model/message.ts b/frontend/src/model/message.ts
deleted file mode 100644
index 9b96ae5..0000000
--- a/frontend/src/model/message.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-export interface IMessage {
- id: number;
- channelId?: number;
- content: string;
- fileId?: number;
- fileType?: string;
- filePath?: string;
- fileSize?: number;
- originalName?: string;
- createdAt: string;
-}
-
-export class Message implements IMessage {
- id: number;
- content: string;
- fileId?: number;
- fileType?: string;
- filePath?: string;
- fileSize?: number;
- originalName?: string;
- createdAt: string;
-
- constructor(message: IMessage) {
- this.id = message.id;
- this.content = message.content;
- this.fileId = message.fileId;
- this.fileType = message.fileType;
- this.filePath = message.filePath;
- this.fileSize = message.fileSize;
- this.originalName = message.originalName;
- this.createdAt = message.createdAt;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/model/state.ts b/frontend/src/model/state.ts
deleted file mode 100644
index ded2229..0000000
--- a/frontend/src/model/state.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { IChannelList } from "./channel-list";
-import { IUnsentMessage } from "./unsent-message";
-
-export interface IState {
- token: string;
- apiUrl: string;
- defaultChannelId: number;
- channelList: IChannelList;
- unsentMessages: IUnsentMessage[];
-}
\ No newline at end of file
diff --git a/frontend/src/model/unsent-message.ts b/frontend/src/model/unsent-message.ts
deleted file mode 100644
index 7145ca4..0000000
--- a/frontend/src/model/unsent-message.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export interface IUnsentMessage {
- id: number;
- content: string;
- blob?: Blob;
- createdAt: string;
- channelId: number;
-}
-
-export class UnsentMessage implements IUnsentMessage {
- id: number;
- content: string;
- blob?: Blob;
- createdAt: string;
- channelId: number;
-
- constructor(message: IUnsentMessage) {
- this.id = message.id;
- this.content = message.content;
- this.blob = message.blob;
- this.createdAt = message.createdAt;
- this.channelId = message.channelId;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/service-worker.ts b/frontend/src/service-worker.ts
deleted file mode 100644
index 0d6828f..0000000
--- a/frontend/src/service-worker.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-const CACHE_NAME = 'notebrook-cache-v1';
-const urlsToCache = [
- '/',
- '/index.html',
- '/favicon.ico',
- '/intro.wav',
- '/login.wav',
- '/uploadfail.wav',
- '/water1.wav',
- '/water2.wav',
- '/water3.wav',
- '/water4.wav',
- '/water5.wav',
- '/water6.wav',
- '/water7.wav',
- '/water8.wav',
- '/water9.wav',
- '/water10.wav',
- '/sent1.wav',
- '/sent2.wav',
- '/sent3.wav',
- '/sent4.wav',
- '/sent5.wav',
- '/sent6.wav',
- '/vite.svg',
- '/src/main.ts'
-];
-
-self.addEventListener('install', (event: any) => {
- event.waitUntil(
- caches.open(CACHE_NAME)
- .then(cache => {
- return cache.addAll(urlsToCache);
- })
- );
-});
-
-self.addEventListener('fetch', (event: any) => {
- event.respondWith(
- caches.match(event.request)
- .then(response => {
- // Return the cached response if found, otherwise fetch from network
- return response || fetch(event.request);
- })
- );
-});
-
-self.addEventListener('activate', (event: any) => {
- const cacheWhitelist = [CACHE_NAME];
-
- event.waitUntil(
- caches.keys().then(cacheNames => {
- return Promise.all(
- cacheNames.map(cacheName => {
- if (cacheWhitelist.indexOf(cacheName) === -1) {
- return caches.delete(cacheName);
- }
- })
- );
- })
- );
-});
diff --git a/frontend/src/sound.ts b/frontend/src/sound.ts
deleted file mode 100644
index 28eb785..0000000
--- a/frontend/src/sound.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-const audioContext = new AudioContext();
-
-const soundFiles = {
- intro: 'intro.wav',
- login: 'login.wav',
- copy: 'copy.wav',
- uploadFailed: 'uploadfail.wav'
-} as const;
-
-type SoundName = keyof typeof soundFiles;
-
-const sounds: Partial> = {};
-
-const waterSounds: AudioBuffer[] = [];
-const sentSounds: AudioBuffer[] = [];
-
-async function loadSound(url: string): Promise {
- const response = await fetch(url);
- const arrayBuffer = await response.arrayBuffer();
- return await audioContext.decodeAudioData(arrayBuffer);
-}
-
-async function loadAllSounds() {
- for (const key in soundFiles) {
- const soundName = key as SoundName;
- sounds[soundName] = await loadSound(soundFiles[soundName]);
- }
-
- for (let i = 1; i <= 10; i++) {
- const buffer = await loadSound(`water${i}.wav`);
- waterSounds.push(buffer);
- }
-
- for (let i = 1; i <= 6; i++) {
- const buffer = await loadSound(`sent${i}.wav`);
- sentSounds.push(buffer);
- }
-}
-
-function playSoundBuffer(buffer: AudioBuffer) {
- if (audioContext.state === 'suspended') {
- audioContext.resume();
- }
- const source = audioContext.createBufferSource();
- source.buffer = buffer;
- source.connect(audioContext.destination);
- source.start(0);
-}
-
-export function playSound(name: SoundName) {
- const buffer = sounds[name];
- if (buffer) {
- playSoundBuffer(buffer);
- } else {
- console.error(`Sound ${name} not loaded.`);
- }
-}
-
-export function playWater() {
- if (waterSounds.length > 0) {
- const sound = waterSounds[Math.floor(Math.random() * waterSounds.length)];
- playSoundBuffer(sound);
- } else {
- console.error("Water sounds not loaded.");
- }
-}
-
-export function playSent() {
- if (sentSounds.length > 0) {
- const sound = sentSounds[Math.floor(Math.random() * sentSounds.length)];
- playSoundBuffer(sound);
- } else {
- console.error("Sent sounds not loaded.");
- }
-}
-
-loadAllSounds().then(() => {
- console.log('All sounds loaded and ready to play');
-}).catch(error => {
- console.error('Error loading sounds:', error);
-});
diff --git a/frontend/src/speech.ts b/frontend/src/speech.ts
deleted file mode 100644
index 7d42070..0000000
--- a/frontend/src/speech.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Toast } from "./toast";
-
-export function speak(text: string, interrupt: boolean = false) {
- const utterance = new SpeechSynthesisUtterance(text);
- if (interrupt) {
- speechSynthesis.cancel();
- }
- speechSynthesis.speak(utterance);
-}
-
-export function showToast(message: string, timeout: number = 5000) {
- const toast = new Toast(timeout);
- toast.show(message);
-}
\ No newline at end of file
diff --git a/frontend/src/state.ts b/frontend/src/state.ts
deleted file mode 100644
index 8bb5fa6..0000000
--- a/frontend/src/state.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import { MessagingSystem } from "./events/messaging-system";
-import { IChannel, Channel } from "./model/channel";
-import { IChannelList, ChannelList } from "./model/channel-list";
-import { IState } from "./model/state";
-import { IUnsentMessage, UnsentMessage } from "./model/unsent-message";
-import { get, set, clear } from "idb-keyval";
-
-
-export class State implements IState {
- token!: string;
- apiUrl!: string;
- channelList!: ChannelList;
- unsentMessages!: IUnsentMessage[];
- currentChannel!: Channel | null;
- defaultChannelId!: number;
- public events: MessagingSystem;
-
- constructor() {
- this.token = "";
- this.channelList = new ChannelList();
- this.unsentMessages = [];
- this.events = new MessagingSystem();
- }
-
- public getToken(): string {
- return this.token;
- }
-
- public setToken(token: string): void {
- this.token = token;
- }
-
- public getChannelList(): IChannelList {
- return this.channelList;
- }
-
- public setChannelList(channelList: ChannelList): void {
- this.channelList = channelList;
- }
-
- public getUnsentMessages(): IUnsentMessage[] {
- return this.unsentMessages;
- }
-
- public setUnsentMessages(unsentMessages: IUnsentMessage[]): void {
- this.unsentMessages = unsentMessages;
- }
-
- public async save(): Promise {
- // stringify everything here except the currentChannel object.
- const { currentChannel, events, ...state } = this;
- await set("notebrook", state);
- }
-
- public async load(): Promise {
- const saved = await get("notebrook");
- if (saved) {
- this.token = saved.token;
- this.apiUrl = saved.apiUrl;
- this.channelList = new ChannelList( saved.channelList);
- this.unsentMessages = saved.unsentMessages.map((message: IUnsentMessage) => new UnsentMessage(message));
- this.defaultChannelId = saved.defaultChannelId;
- }
- }
-
- public async clear(): Promise {
- this.token = "";
- this.channelList = new ChannelList();
- this.unsentMessages = [];
- this.currentChannel = null;
- this.defaultChannelId = -1;
-
- await clear();
- }
-
- public getChannelById(id: number) {
- return this.channelList.getChannel(id);
- }
-
- public getChannelByName(name: string) {
- return this.channelList.getChannelByName(name);
- }
-
- public findChannelByQuery(query: string) {
- return this.channelList.channels.filter((c) => c.name.toLowerCase().includes(query.toLowerCase()));
- }
-
- public addChannel(channel: Channel) {
- if (!this.channelList.channels.find((c) => c.id === channel.id)) this.channelList.channels.push(channel);
- }
-
- public removeChannel(channel: IChannel) {
- this.channelList.channels = this.channelList.channels.filter((c) => c.id !== channel.id);
- }
-
- public addUnsentMessage(message: UnsentMessage) {
- this.unsentMessages.push(message);
- }
-
- public removeUnsentMessage(message: IUnsentMessage) {
- this.unsentMessages = this.unsentMessages.filter((m) => m !== message);
- }
-
- public getChannels() {
- return this.channelList.channels;
- }
-
- public getCurrentChannel() {
- return this.currentChannel;
- }
-
- public setCurrentChannel(channel: Channel) {
- this.currentChannel = channel;
- }
-
- public getDefaultChannelId() {
- return this.defaultChannelId;
- }
-
- public setDefaultChannelId(id: number) {
- this.defaultChannelId = id;
- }
-
- public getApiUrl() {
- return this.apiUrl;
- }
-
- public setApiUrl(url: string) {
- this.apiUrl = url;
- }
-
- public getMessageById(id: number) {
- return this.currentChannel!.getMessage(id);
- }
-}
-
-export const state = new State();
\ No newline at end of file
diff --git a/frontend/src/style.css b/frontend/src/style.css
deleted file mode 100644
index f9c7350..0000000
--- a/frontend/src/style.css
+++ /dev/null
@@ -1,96 +0,0 @@
-:root {
- font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
- line-height: 1.5;
- font-weight: 400;
-
- color-scheme: light dark;
- color: rgba(255, 255, 255, 0.87);
- background-color: #242424;
-
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-a {
- font-weight: 500;
- color: #646cff;
- text-decoration: inherit;
-}
-a:hover {
- color: #535bf2;
-}
-
-body {
- margin: 0;
- display: flex;
- place-items: center;
- min-width: 320px;
- min-height: 100vh;
-}
-
-h1 {
- font-size: 3.2em;
- line-height: 1.1;
-}
-
-#app {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- text-align: center;
-}
-
-.logo {
- height: 6em;
- padding: 1.5em;
- will-change: filter;
- transition: filter 300ms;
-}
-.logo:hover {
- filter: drop-shadow(0 0 2em #646cffaa);
-}
-.logo.vanilla:hover {
- filter: drop-shadow(0 0 2em #3178c6aa);
-}
-
-.card {
- padding: 2em;
-}
-
-.read-the-docs {
- color: #888;
-}
-
-button {
- border-radius: 8px;
- border: 1px solid transparent;
- padding: 0.6em 1.2em;
- font-size: 1em;
- font-weight: 500;
- font-family: inherit;
- background-color: #1a1a1a;
- cursor: pointer;
- transition: border-color 0.25s;
-}
-button:hover {
- border-color: #646cff;
-}
-button:focus,
-button:focus-visible {
- outline: 4px auto -webkit-focus-ring-color;
-}
-
-@media (prefers-color-scheme: light) {
- :root {
- color: #213547;
- background-color: #ffffff;
- }
- a:hover {
- color: #747bff;
- }
- button {
- background-color: #f9f9f9;
- }
-}
diff --git a/frontend/src/toast.ts b/frontend/src/toast.ts
deleted file mode 100644
index e0c5fc6..0000000
--- a/frontend/src/toast.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-export class Toast {
- private container: HTMLElement;
- private timeout: number;
-
- constructor(timeout: number = 3000) {
- this.container = document.querySelector('.toast-container') as HTMLElement;
- this.timeout = timeout;
- }
-
- public show(message: string): void {
- const toast = document.createElement('div');
- toast.className = 'toast';
- toast.textContent = message;
-
- this.container.appendChild(toast);
-
- requestAnimationFrame(() => {
- toast.classList.add('show');
- });
-
- setTimeout(() => {
- this.hide(toast);
- }, this.timeout);
- }
-
- private hide(toast: HTMLElement): void {
- toast.classList.remove('show');
- toast.addEventListener('transitionend', () => {
- toast.remove();
- });
- }
-}
diff --git a/frontend/src/typescript.svg b/frontend/src/typescript.svg
deleted file mode 100644
index d91c910..0000000
--- a/frontend/src/typescript.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/frontend/src/ui/audio-recorder.ts b/frontend/src/ui/audio-recorder.ts
deleted file mode 100644
index aecd9ce..0000000
--- a/frontend/src/ui/audio-recorder.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { UINode } from "./node";
-
-export class AudioRecorder extends UINode {
- private audioElement: HTMLAudioElement;
- private mediaRecorder: MediaRecorder | null;
- private audioChunks: Blob[];
- private stream: MediaStream | null;
- private recording?: Blob;
-
- public constructor(title: string) {
- super(title);
- this.audioElement = document.createElement("audio");
- this.mediaRecorder = null;
- this.audioChunks = [];
- this.stream = null;
-
- this.audioElement.setAttribute("controls", "true");
- this.audioElement.setAttribute("aria-label", title);
- this.element.appendChild(this.audioElement);
-
- this.setRole("audio-recorder");
- }
-
- public async startRecording() {
- try {
- this.stream = await navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: true, channelCount: 2, echoCancellation: false, noiseSuppression: false } });
- this.mediaRecorder = new MediaRecorder(this.stream);
- this.mediaRecorder.ondataavailable = (event) => {
- this.audioChunks.push(event.data);
- };
- this.mediaRecorder.onstop = () => {
- const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });
- this.recording = audioBlob;
- this.audioChunks = [];
- const audioUrl = URL.createObjectURL(audioBlob);
- this.audioElement.src = audioUrl;
- this.triggerRecordingComplete(audioUrl);
- };
- this.mediaRecorder.start();
- } catch (error) {
- console.error("Error accessing microphone:", error);
- }
- }
-
- public stopRecording() {
- if (this.mediaRecorder && this.mediaRecorder.state !== "inactive") {
- this.mediaRecorder.stop();
- }
- if (this.stream) {
- this.stream.getTracks().forEach(track => track.stop());
- this.stream = null;
- }
- }
-
- public getElement(): HTMLElement {
- return this.element;
- }
-
- public onRecordingComplete(callback: (audioUrl: string) => void) {
- this.element.addEventListener("recording-complete", (event: Event) => {
- const customEvent = event as CustomEvent;
- callback(customEvent.detail.audioUrl);
- });
- return this;
- }
-
- protected triggerRecordingComplete(audioUrl: string) {
- const event = new CustomEvent("recording-complete", { detail: { audioUrl } });
- this.element.dispatchEvent(event);
- return this;
- }
-
- public getRecording() {
- return this.recording;
- }
-}
diff --git a/frontend/src/ui/audio.ts b/frontend/src/ui/audio.ts
deleted file mode 100644
index 3169bd6..0000000
--- a/frontend/src/ui/audio.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { UINode } from "./node";
-
-export class Audio extends UINode {
- private audioElement: HTMLAudioElement;
-
- public constructor(title: string, src: string | MediaStream = "") {
- super(title);
- this.audioElement = document.createElement("audio");
- if (typeof src === "string") {
- this.audioElement.src = src; // Set src if it's a string URL
- } else if (src instanceof MediaStream) {
- this.audioElement.srcObject = src; // Set srcObject if it's a MediaStream
- }
- this.audioElement.setAttribute("aria-label", title);
- this.element.appendChild(this.audioElement);
- this.setRole("audio");
- }
-
- public getElement(): HTMLElement {
- return this.audioElement;
- }
-
- public setSource(src: string | MediaStream) {
- if (typeof src === "string") {
- this.audioElement.src = src;
- } else if (src instanceof MediaStream) {
- this.audioElement.srcObject = src;
- }
- return this;
- }
-
- public play() {
- this.audioElement.play();
- return this;
- }
-
- public pause() {
- this.audioElement.pause();
- return this;
- }
-
- public setControls(show: boolean) {
- this.audioElement.controls = show;
- return this;
- }
-
- public setLoop(loop: boolean) {
- this.audioElement.loop = loop;
- return this;
- }
-
- public setMuted(muted: boolean) {
- this.audioElement.muted = muted;
- return this;
- }
-
- public setAutoplay(autoplay: boolean) {
- this.audioElement.autoplay = autoplay;
- return this;
- }
-
- public setVolume(volume: number) {
- this.audioElement.volume = volume;
- return this;
- }
-}
diff --git a/frontend/src/ui/button.ts b/frontend/src/ui/button.ts
deleted file mode 100644
index d11c509..0000000
--- a/frontend/src/ui/button.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { UINode } from "./node";
-
-export class Button extends UINode {
- private buttonElement: HTMLButtonElement;
- public constructor(title: string, hasPopup: boolean = false) {
- super(title);
- this.buttonElement = document.createElement("button");
- this.buttonElement.innerText = title;
- if (hasPopup) this.buttonElement.setAttribute("aria-haspopup", "true");
- this.element.appendChild(this.buttonElement);
- this.element.setAttribute("aria-label", this.title);
- }
-
- public focus() {
- this.buttonElement.focus();
- return this;
- }
-
- public click() {
- this.buttonElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.buttonElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.buttonElement.innerText = text;
- this.element.setAttribute("aria-label", this.title);
- return this;
- }
-
- public setDisabled(val: boolean) {
- this.buttonElement.disabled = val;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/camera.ts b/frontend/src/ui/camera.ts
deleted file mode 100644
index 8193681..0000000
--- a/frontend/src/ui/camera.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { UINode } from "./node";
-
-export class Camera extends UINode {
- private videoElement: HTMLVideoElement;
- private canvasElement: HTMLCanvasElement;
- private stream: MediaStream | null;
-
- public constructor(title: string) {
- super(title);
- this.videoElement = document.createElement("video");
- this.canvasElement = document.createElement("canvas");
- this.stream = null;
-
- this.videoElement.setAttribute("aria-label", title);
- this.element.appendChild(this.videoElement);
- this.element.appendChild(this.canvasElement);
-
- this.setRole("camera");
- }
-
- public async startCamera() {
- try {
- this.stream = await navigator.mediaDevices.getUserMedia({ video: true });
- this.videoElement.srcObject = this.stream;
- this.videoElement.play();
- } catch (error) {
- console.error("Error accessing camera:", error);
- }
- }
-
- public stopCamera() {
- if (this.stream) {
- this.stream.getTracks().forEach(track => track.stop());
- this.stream = null;
- }
- this.videoElement.pause();
- this.videoElement.srcObject = null;
- }
-
- public takePhoto(): HTMLCanvasElement | null {
- if (this.stream) {
- const context = this.canvasElement.getContext("2d");
- if (context) {
- this.canvasElement.width = this.videoElement.videoWidth;
- this.canvasElement.height = this.videoElement.videoHeight;
- context.drawImage(this.videoElement, 0, 0, this.canvasElement.width, this.canvasElement.height);
- return this.canvasElement;
- }
- }
- return null;
- }
-
- public savePhoto(): string | null {
- const photoCanvas = this.takePhoto();
- if (photoCanvas) {
- return photoCanvas.toDataURL("image/png");
- }
- return null;
- }
-
- public savePhotoToBlob(): Promise {
- return new Promise((resolve) => {
- const photoCanvas = this.takePhoto();
- if (photoCanvas) {
- photoCanvas.toBlob((blob) => {
- resolve(blob);
- });
- } else {
- resolve(null);
- }
- });
- }
-
- public getElement(): HTMLElement {
- return this.element;
- }
-}
diff --git a/frontend/src/ui/canvas.ts b/frontend/src/ui/canvas.ts
deleted file mode 100644
index d8ea3ea..0000000
--- a/frontend/src/ui/canvas.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { UINode } from "./node";
-
-export class Canvas extends UINode {
- private canvasElement: HTMLCanvasElement;
- public constructor(title: string) {
- super(title);
- this.canvasElement = document.createElement("canvas");
-
- this.canvasElement.setAttribute("tabindex", "-1");
- this.element.appendChild(this.canvasElement);
- }
-
- public focus() {
- this.canvasElement.focus();
- return this;
- }
-
- public click() {
- this.canvasElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.canvasElement;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/checkbox.ts b/frontend/src/ui/checkbox.ts
deleted file mode 100644
index b4731fc..0000000
--- a/frontend/src/ui/checkbox.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { UINode } from "./node";
-
-export class Checkbox extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private checkboxElement: HTMLInputElement;
- public constructor(title: string) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.id = `chkbx_title_${this.id}`;
- this.checkboxElement = document.createElement("input");
- this.checkboxElement.id = `chkbx_${this.id}`;
- this.checkboxElement.type = "checkbox";
- this.titleElement.appendChild(this.checkboxElement);
- this.titleElement.appendChild(document.createTextNode(this.title));
- this.element.appendChild(this.titleElement);
- }
-
- public focus() {
- this.checkboxElement.focus();
- return this;
- }
-
- public click() {
- this.checkboxElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.checkboxElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- this.element.setAttribute("aria-label", this.title);
- this.element.setAttribute("aria-roledescription", "checkbox");
- return this;
- }
-
- public isChecked(): boolean {
- return this.checkboxElement.checked;
- }
-
- public setChecked(value: boolean) {
- this.checkboxElement.checked = value;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/collapsable-container.ts b/frontend/src/ui/collapsable-container.ts
deleted file mode 100644
index 77249fd..0000000
--- a/frontend/src/ui/collapsable-container.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Container } from "./container";
-
-export class CollapsableContainer extends Container {
- private detailsElement: HTMLDetailsElement;
- private summaryElement: HTMLElement;
- private wrapperElement: HTMLDivElement;
-
- public constructor(title: string) {
- super(title);
- this.wrapperElement = document.createElement("div");
- this.detailsElement = document.createElement("details");
- this.summaryElement = document.createElement("summary");
-
- this.summaryElement.innerText = title;
- this.detailsElement.appendChild(this.summaryElement);
- this.detailsElement.appendChild(this.containerElement);
- this.wrapperElement.appendChild(this.detailsElement);
- }
-
- public render() {
- return this.wrapperElement;
- }
-
- public setTitle(text: string) {
- this.title = text;
- this.summaryElement.innerText = text;
- return this;
- }
-
- public isCollapsed(): boolean {
- return this.detailsElement.hasAttribute("open");
- }
-
- public expand(val: boolean) {
- if (val) {
- this.detailsElement.setAttribute("open", "true");
- } else {
- this.detailsElement.removeAttribute("open");
- }
- return this;
- }
-}
diff --git a/frontend/src/ui/container.ts b/frontend/src/ui/container.ts
deleted file mode 100644
index c8311cc..0000000
--- a/frontend/src/ui/container.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { UINode } from "./node";
-
-export class Container extends UINode {
- public children: UINode[];
- protected containerElement: HTMLDivElement;
- private focused: number = 0;
-
- public constructor(title: string) {
- super(title);
- this.children = [];
- this.containerElement = document.createElement("div");
- this.containerElement.setAttribute("tabindex", "-1");
- this.focused = 0;
- }
-
- public focus() {
- this.containerElement.focus();
- return this;
- }
-
- public _onFocus() {
- this.children[this.focused].focus();
- }
-
- public add(node: UINode) {
- this.children.push(node);
- node._onConnect();
- this.containerElement.appendChild(node.render());
- return this;
- }
-
- public remove(node: UINode) {
- this.children.splice(this.children.indexOf(node), 1);
- node._onDisconnect();
- this.containerElement.removeChild(node.render());
- return this;
- }
-
- public render() {
- return this.containerElement;
- }
-
- public getChildren(): UINode[] {
- return this.children;
- }
-
- public getElement() {
- return this.containerElement;
- }
-
- public setAriaLabel(text: string) {
- this.containerElement.setAttribute("aria-label", text);
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/date-picker.ts b/frontend/src/ui/date-picker.ts
deleted file mode 100644
index 4b5f6f5..0000000
--- a/frontend/src/ui/date-picker.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { UINode } from "./node";
-
-
-export class DatePicker extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private inputElement: HTMLInputElement;
- public constructor(title: string) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `datepicker_title_${this.id}`;
- this.inputElement = document.createElement("input");
- this.inputElement.id = `datepicker_${this.id}`;
- this.inputElement.type = "date";
- this.titleElement.appendChild(this.inputElement);
- this.element.appendChild(this.titleElement);
- }
-
- public focus() {
- this.inputElement.focus();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.inputElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getValue(): string {
- return this.inputElement.value;
- }
-
- public setValue(value: string) {
- this.inputElement.value = value;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/dialog.ts b/frontend/src/ui/dialog.ts
deleted file mode 100644
index 799d4a4..0000000
--- a/frontend/src/ui/dialog.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { UIWindow } from "./window";
-import { Button } from "./button";
-
-export class Dialog extends UIWindow {
- private resolvePromise!: (value: T | PromiseLike) => void;
- private rejectPromise!: (reason?: any) => void;
- private promise: Promise;
- private dialogElement!: HTMLDialogElement;
- protected okButton?: Button;
- protected cancelButton?: Button;
-
- private previouslyFocusedElement!: HTMLElement;
-
- public constructor(title: string, addButtons: boolean = true) {
- super(title, "dialog", false);
- this.dialogElement = document.createElement("dialog");
- this.promise = new Promise((resolve, reject) => {
- this.resolvePromise = resolve;
- this.rejectPromise = reject;
- });
-
- // Automatically add OK and Cancel buttons
- if (addButtons) {
- this.okButton = new Button("OK");
- this.okButton.setPosition(70, 90, 10, 5);
- this.okButton.onClick(() => this.choose(undefined));
-
- this.cancelButton = new Button("Cancel");
- this.cancelButton.setPosition(20, 90, 10, 5);
- this.cancelButton.onClick(() => this.cancel());
- }
- }
-
- public setOkAction(action: () => T) {
- if (!this.okButton) return;
- this.okButton.onClick(() => {
- const result = action();
- this.choose(result);
- });
- return this;
- }
-
- public setCancelAction(action: () => void) {
- if (!this.cancelButton) return;
- this.cancelButton.onClick(() => {
- action();
- this.cancel();
- });
- return this;
- }
-
- public choose(item: T | undefined) {
- this.resolvePromise(item as T);
- document.body.removeChild(this.dialogElement);
- this.hide();
- this.previouslyFocusedElement.focus();
- }
-
- public cancel(reason?: any) {
- this.rejectPromise(reason);
-
- document.body.removeChild(this.dialogElement);
- this.hide();
- this.previouslyFocusedElement.focus();
- }
-
- public open(): Promise {
- this.previouslyFocusedElement = document.activeElement as HTMLElement;
- this.dialogElement.appendChild(this.show()!);
- if (this.okButton) this.add(this.okButton);
- if (this.cancelButton) this.add(this.cancelButton);
- document.body.appendChild(this.dialogElement);
- this.dialogElement.showModal();
- this.container.focus();
-
- return this.promise;
- }
-}
diff --git a/frontend/src/ui/dropdown.ts b/frontend/src/ui/dropdown.ts
deleted file mode 100644
index 0e7558b..0000000
--- a/frontend/src/ui/dropdown.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { UINode } from "./node";
-
-export class Dropdown extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private selectElement: HTMLSelectElement;
-
- public constructor(title: string, options: { key: string; value: string }[]) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `dd_title_${this.id}`;
- this.selectElement = document.createElement("select");
- this.selectElement.id = `dd_${this.id}`;
- this.titleElement.appendChild(this.selectElement);
- this.element.appendChild(this.titleElement);
-
- this.setOptions(options);
- }
-
- public focus() {
- this.selectElement.focus();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.selectElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getSelectedValue(): string {
- return this.selectElement.value;
- }
-
- public setSelectedValue(value: string) {
- this.selectElement.value = value;
- return this;
- }
-
- public setOptions(options: { key: string; value: string }[]) {
- this.clearOptions();
- options.forEach((option) => {
- this.addOption(option.key, option.value);
- });
- return this;
- }
-
- public addOption(key: string, value: string) {
- const optionElement = document.createElement("option");
- optionElement.value = key;
- optionElement.innerText = value;
- this.selectElement.appendChild(optionElement);
- return this;
- }
-
- public removeOption(key: string) {
- const options = Array.from(this.selectElement.options);
- const optionToRemove = options.find(option => option.value === key);
- if (optionToRemove) {
- this.selectElement.removeChild(optionToRemove);
- }
- return this;
- }
-
- public clearOptions() {
- while (this.selectElement.firstChild) {
- this.selectElement.removeChild(this.selectElement.firstChild);
- }
- return this
- }
-}
diff --git a/frontend/src/ui/file-input.ts b/frontend/src/ui/file-input.ts
deleted file mode 100644
index 0f9754c..0000000
--- a/frontend/src/ui/file-input.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { UINode } from "./node";
-
-export class FileInput extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private inputElement: HTMLInputElement;
- public constructor(title: string, multiple: boolean = false) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `fileinpt_title_${this.id}`;
- this.inputElement = document.createElement("input");
- this.inputElement.id = `fileinpt_${this.id}`;
- this.inputElement.type = "file";
- if (multiple) {
- this.inputElement.multiple = true;
- }
- this.titleElement.appendChild(this.inputElement);
- this.element.appendChild(this.titleElement);
-
- }
-
- public focus() {
- this.inputElement.focus();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.inputElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getFiles(): FileList | null {
- return this.inputElement.files;
- }
-
- public setAccept(accept: string) {
- this.inputElement.accept = accept;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/image.ts b/frontend/src/ui/image.ts
deleted file mode 100644
index b02a374..0000000
--- a/frontend/src/ui/image.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { UINode } from "./node";
-
-export class Image extends UINode {
- private imgElement: HTMLImageElement;
- public constructor(title: string, src: string, altText: string = "") {
- super(title);
- this.imgElement = document.createElement("img");
- this.imgElement.src = src;
- this.imgElement.alt = altText;
- this.element.appendChild(this.imgElement);
- this.element.setAttribute("aria-label", title);
- }
-
- public getElement(): HTMLElement {
- return this.imgElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.element.setAttribute("aria-label", text);
- return this;
- }
-
- public setSource(src: string) {
- this.imgElement.src = src;
- return this;
- }
-
- public setAltText(altText: string) {
- this.imgElement.alt = altText;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/index.ts b/frontend/src/ui/index.ts
deleted file mode 100644
index 1277631..0000000
--- a/frontend/src/ui/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export { UIWindow } from "./window";
-export { Button } from "./button";
-export { Container } from "./container";
-export { UINode } from "./node";
-export { List } from "./list";
-export { Text } from "./text";
-export { ListItem } from "./list-item";
-export { Checkbox } from "./checkbox";
-export { TextInput } from "./text-input";
-export { TabBar } from "./tab-bar";
-export { TabbedView } from "./tabbed-view";
-export { Canvas } from "./canvas";
\ No newline at end of file
diff --git a/frontend/src/ui/list-item.ts b/frontend/src/ui/list-item.ts
deleted file mode 100644
index e4c124e..0000000
--- a/frontend/src/ui/list-item.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { UINode } from "./node";
-
-export class ListItem extends UINode {
- private listElement: HTMLLIElement;
-
- public constructor(title: string) {
- super(title);
- this.listElement = document.createElement("li");
- this.listElement.innerText = this.title;
- this.listElement.setAttribute("tabindex", "-1");
- this.element.appendChild(this.listElement);
- this.listElement.setAttribute("aria-label", this.title);
- this.listElement.setAttribute("role", "option");
- }
-
- public focus() {
- this.listElement.focus();
- return this;
- }
-
- public click() {
- this.listElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.listElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.listElement.innerText = text;
- this.element.setAttribute("aria-label", this.title);
- this.listElement.setAttribute("aria-label", this.title);
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/list.ts b/frontend/src/ui/list.ts
deleted file mode 100644
index ed77051..0000000
--- a/frontend/src/ui/list.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-import { UINode } from "./node";
-
-
-export class List extends UINode {
- public children: UINode[];
- protected listElement: HTMLUListElement;
- private focused: number;
- protected selectCallback?: (id: number) => void;
- public constructor(title: string) {
- super(title);
- this.children = [];
- this.listElement = document.createElement("ul");
- this.listElement.setAttribute("role", "listbox");
- this.listElement.style.listStyle = "none";
- this.element.appendChild(this.listElement);
- this.element.setAttribute("aria-label", this.title);
- this.focused = 0;
- }
-
- public add(node: UINode) {
- this.children.push(node);
- node._onConnect();
- this.listElement.appendChild(node.render());
- if (this.children.length === 1) this.calculateTabIndex();
- node.onFocus(() => this.calculateFocused(node));
- return this;
- }
-
- public addNodeAtIndex(node: UINode, index: number) {
- index = Math.max(0, Math.min(index, this.children.length));
- this.children.splice(index, 0, node);
- node._onConnect();
- this.listElement.insertBefore(node.render(), this.listElement.children[index]);
- if (this.children.length === 1) this.calculateTabIndex();
- node.onFocus(() => this.calculateFocused(node));
- return this;
- }
-
- public remove(node: UINode) {
- const idx = this.children.indexOf(node);
- this.children.splice(idx, 1);
- node._onDisconnect();
- this.listElement.removeChild(node.render());
- if (idx === this.focused) {
- if (this.focused > 0) this.focused--;
- this.calculateTabIndex();
- }
- return this;
- }
-
- public _onFocus() {
- super._onFocus();
- this.focusSelectedMessage();
- return this;
- }
-
- public _onClick() {
- // this.children[this.focused]._onClick();
- }
-
- public _onSelect(id: number) {
- if (this.selectCallback) this.selectCallback(id);
- }
-
- protected calculateStyle(): void {
- super.calculateStyle();
- this.element.style.overflowY = "scroll";
- this.listElement.style.overflowY = "scroll";
- }
-
- public _onKeydown(key: string, alt: boolean = false, shift: boolean = false, ctrl: boolean = false): boolean {
- switch (key) {
- case "ArrowUp":
- this.children[this.focused].setTabbable(false);
- this.focused = Math.max(0, this.focused - 1);
- this.children[this.focused].setTabbable(true);
- this.focusSelectedMessage();
- return true;
- break;
- case "ArrowDown":
- this.children[this.focused].setTabbable(false);
- this.focused = Math.min(this.children.length - 1, this.focused + 1);
- this.children[this.focused].setTabbable(true);
- this.focusSelectedMessage();
- return true;
- break;
- case "Enter":
- this.children[this.focused].click();
- return true;
- break;
- case "Home":
- this.children[this.focused].setTabbable(false);
- this.focused = 0;
- this.children[this.focused].setTabbable(true);
- this.focusSelectedMessage();
- return true;
- break;
- case "End":
- this.children[this.focused].setTabbable(false);
- this.focused = this.children.length - 1;
- this.children[this.focused].setTabbable(true);
- this.focusSelectedMessage();
- return true;
- break;
- default:
- return this.children[this.focused]._onKeydown(key);
- break;
- }
- return false;
- }
-
- protected renderAsListItem(node: UINode) {
- let li = document.createElement("li");
- li.appendChild(node.render());
- return li;
- }
-
- public getElement(): HTMLElement {
- return this.listElement;
- }
-
- public isItemFocused(): boolean {
- const has = this.children.find((child) => child.isFocused);
- if (has) {
- return true;
- }
- return false;
- }
-
- private calculateTabIndex() {
- if (this.children.length < 1) return;
- this.children[this.focused].setTabbable(true);
- }
-
- public clear() {
- this.children.forEach((child) => this.remove(child));
- this.children = [];
- this.listElement.innerHTML = '';
- this.focused = 0;
- return this;
- }
-
- public getFocusedChild() {
- return this.children[this.focused];
- }
-
- public getFocus() {
- return this.focused;
- }
-
- public onSelect(f: (id: number) => void) {
- this.selectCallback = f;
- return this;
- }
-
- protected calculateFocused(node: UINode) {
- const idx = this.children.indexOf(node);
- this._onSelect(idx);
- this.focused = idx;
- }
-
- public scrollToBottom() {
- this.children.forEach((child) => child.setTabbable(false));
- const node = this.children[this.children.length - 1];
- node.getElement().scrollIntoView();
- // set the focused element for tab index without focusing directly.
- this.focused = this.children.length - 1;
- this.children[this.focused].setTabbable(true);
- return this;
- }
-
- public focusSelectedMessage() {
- this.children[this.focused].focus()
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/multiline-input.ts b/frontend/src/ui/multiline-input.ts
deleted file mode 100644
index 8a51fe1..0000000
--- a/frontend/src/ui/multiline-input.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { UINode } from "./node";
-
-export class MultilineInput extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private textareaElement: HTMLTextAreaElement;
- public constructor(title: string) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `txtarea_title_${this.id}`;
- this.textareaElement = document.createElement("textarea");
- this.textareaElement.id = `txtarea_${this.id}`;
- this.textareaElement.style.whiteSpace = 'pre'; // Prevent text wrapping and preserve
- this.textareaElement.style.overflow = 'auto'; // Enable scrolling if content overflows
-
- this.titleElement.appendChild(this.textareaElement);
- this.element.appendChild(this.titleElement);
- }
-
- public focus() {
- this.textareaElement.focus();
- return this;
- }
-
- public click() {
- this.textareaElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.textareaElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getValue(): string {
- return this.textareaElement.value;
- }
-
- public setValue(value: string) {
- this.textareaElement.value = value;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/node.ts b/frontend/src/ui/node.ts
deleted file mode 100644
index deadb89..0000000
--- a/frontend/src/ui/node.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import { UITab } from "./tab";
-
-export class UINode {
- protected title: string;
- protected element: HTMLDivElement;
- protected position!: {x: number, y: number, width: number, height: number};
- protected positionType: string = "fixed";
- protected calculateOwnStyle: boolean = true;
- protected keyDownCallback!: (key: string, alt?: boolean, shift?: boolean, ctrl?: boolean) => void | undefined;
- protected focusCallback?: () => void;
- protected blurCallback?: () => void;
- protected clickCallback?: () => void;
- protected globalKeydown: boolean = false;
- protected visible: boolean;
- public isFocused: boolean;
- private userdata: any;
-
- public constructor(title: string) {
- this.title = title;
- this.element = document.createElement("div");
- this.element.setAttribute("tabindex", "-1");
- this.visible = false;
- this.isFocused = false;
- }
-
- public focus() {
- this.element.focus();
- }
-
- public click() {
- this.element.click();
- }
-
- public _onConnect() {
- this.calculateStyle();
- this.addListeners();
- return;
- }
-
- public _onDisconnect() {
- return;
- }
-
- public _onFocus() {
- if (this.focusCallback) this.focusCallback();
- this.isFocused = true;
- return;
- }
-
- public _onBlur() {
- if (this.blurCallback) this.blurCallback();
- this.isFocused = false;
- return;
- }
-
- public _onClick() {
- if (this.clickCallback) this.clickCallback();
- return;
- }
-
- public _onKeydown(key: string, alt: boolean = false, shift: boolean = false, ctrl: boolean = false): boolean {
- if (this.keyDownCallback) {
- if (this.globalKeydown || (!this.globalKeydown && document.activeElement === this.getElement())) {
- this.keyDownCallback(key, alt, shift, ctrl);
- return true;
- }
- }
- return false;
- }
-
- public render(): HTMLElement {
- this.visible = true;
- return this.element;
- }
-
- protected addListeners() {
- const elem = this.element;
- this.getElement().addEventListener("focus", (e) => this._onFocus());
- elem.addEventListener("blur", (e) => this._onBlur());
- elem.addEventListener("click", (e) => this._onClick());
- elem.addEventListener("keydown", e => this._onKeydown(e.key, e.altKey, e.shiftKey, e.ctrlKey));
- }
-
- protected calculateStyle() {
- if (!this.calculateOwnStyle || !this.position) return;
- this.element.style.position = this.positionType;
- this.element.style.left = `${this.position.x}%`;
- this.element.style.top = `${this.position.y}%`;
- this.element.style.width = `${this.position.width}%`;
- this.element.style.height = `${this.position.height}%`;
- }
-
- public setPosition(x: number, y: number, width: number, height: number, type: string = "fixed") {
- this.position = {
- x: x,
- y: y,
- width: width,
- height: height,
- };
- this.positionType = type;
- this.calculateOwnStyle = true;
- this.calculateStyle();
- return this;
- }
-
- public onClick(f: () => void) {
- this.clickCallback = f;
- return this;
- }
-
- public onFocus(f: () => void) {
- this.focusCallback = f;
- return this;
- }
-
- public onKeyDown(f: (key: string, alt?: boolean, shift?: boolean, ctrl?: boolean) => void, global: boolean = false) {
- this.keyDownCallback = f;
- this.globalKeydown = global;
- return this;
- }
-
- public onBlur(f: () => void) {
- this.blurCallback = f;
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.element;
- }
-
- public setTabbable(val: boolean) {
- this.getElement().setAttribute("tabindex",
- (val === true) ? "0" :
- "-1");
- return this;
- }
-
- public setAriaLabel(text: string) {
- this.element.setAttribute("aria-label", text);
- return this;
- }
-
- public setRole(role: string) {
- this.getElement().setAttribute("role", role);
- return this;
- }
-
- public getUserData(): any {
- return this.userdata;
- }
-
- public setUserData(obj: any) {
- this.userdata = obj;
- return this;
- }
-
- public setAccessKey(key: string) {
- this.getElement().accessKey = key;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/progress-bar.ts b/frontend/src/ui/progress-bar.ts
deleted file mode 100644
index ab8d3e1..0000000
--- a/frontend/src/ui/progress-bar.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { UINode } from "./node";
-
-export class ProgressBar extends UINode {
- private progressElement: HTMLProgressElement;
- public constructor(title: string, max: number) {
- super(title);
- this.progressElement = document.createElement("progress");
- this.progressElement.max = max;
- this.element.appendChild(this.progressElement);
- this.element.setAttribute("aria-label", title);
- }
-
- public getElement(): HTMLElement {
- return this.progressElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.element.setAttribute("aria-label", text);
- return this;
- }
-
- public getValue(): number {
- return this.progressElement.value;
- }
-
- public setValue(value: number) {
- this.progressElement.value = value;
- return this;
- }
-
- public getMax(): number {
- return this.progressElement.max;
- }
-
- public setMax(max: number) {
- this.progressElement.max = max;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/radio-group.ts b/frontend/src/ui/radio-group.ts
deleted file mode 100644
index d415fec..0000000
--- a/frontend/src/ui/radio-group.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { UINode } from "./node";
-
-export class RadioGroup extends UINode {
- private id: string;
- private titleElement: HTMLLegendElement;
- private containerElement: HTMLFieldSetElement;
- private radioElements: Map;
- private radioLabels: Map;
-
- public constructor(title: string, options: { key: string; value: string }[]) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("legend");
- this.titleElement.innerText = title;
- this.titleElement.id = `rdgrp_title_${this.id}`;
- this.containerElement = document.createElement("fieldset");
- this.containerElement.appendChild(this.titleElement);
- this.element.appendChild(this.containerElement);
-
- this.radioElements = new Map();
- this.radioLabels = new Map();
-
- options.forEach((option) => {
- const radioId = `rd_${this.id}_${option.key}`;
- const radioElement = document.createElement("input");
- radioElement.id = radioId;
- radioElement.type = "radio";
- radioElement.name = `rdgrp_${this.id}`;
- radioElement.value = option.key;
- radioElement.setAttribute("aria-labeledby", `${radioId}_label`);
-
- const radioLabel = document.createElement("label");
- radioLabel.innerText = option.value;
- radioLabel.id = `${radioId}_label`;
- radioLabel.setAttribute("for", radioId);
-
- this.radioElements.set(option.key, radioElement);
- this.radioLabels.set(option.key, radioLabel);
-
- this.containerElement.appendChild(radioElement);
- this.containerElement.appendChild(radioLabel);
- });
- }
-
- public focus() {
- const firstRadioElement = this.radioElements.values().next().value;
- if (firstRadioElement) {
- firstRadioElement.focus();
- }
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.containerElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getSelectedValue(): string | null {
- for (const [key, radioElement] of this.radioElements.entries()) {
- if (radioElement.checked) {
- return key;
- }
- }
- return null;
- }
-
- public setSelectedValue(value: string) {
- const radioElement = this.radioElements.get(value);
- if (radioElement) {
- radioElement.checked = true;
- }
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/slider.ts b/frontend/src/ui/slider.ts
deleted file mode 100644
index aab86bd..0000000
--- a/frontend/src/ui/slider.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { UINode } from "./node";
-
-export class Slider extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private sliderElement: HTMLInputElement;
- public constructor(title: string, min: number, max: number, step: number = 1) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `sldr_title_${this.id}`;
- this.sliderElement = document.createElement("input");
- this.sliderElement.id = `sldr_${this.id}`;
- this.sliderElement.type = "range";
- this.sliderElement.min = min.toString();
- this.sliderElement.max = max.toString();
- this.sliderElement.step = step.toString();
- this.titleElement.appendChild(this.sliderElement);
- this.element.appendChild(this.titleElement);
- }
-
- public focus() {
- this.sliderElement.focus();
- return this;
- }
-
- public click() {
- this.sliderElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.sliderElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getValue(): number {
- return parseInt(this.sliderElement.value);
- }
-
- public setValue(value: number) {
- this.sliderElement.value = value.toString();
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/tab-bar.ts b/frontend/src/ui/tab-bar.ts
deleted file mode 100644
index 136a050..0000000
--- a/frontend/src/ui/tab-bar.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { UINode } from "./node";
-import { UITab } from "./tab";
-
-export class TabBar extends UINode {
- private tabs: UITab[];
- private tabBarContainer: HTMLDivElement;
- private onTabChangeCallback?: (index: number) => void;
- private focused: number;
-
- public constructor(title: string = "tab bar") {
- super(title);
- this.tabs = [];
- this.tabBarContainer = document.createElement("div");
- this.tabBarContainer.setAttribute("role", "tablist");
- this.tabBarContainer.style.display = "flex";
- this.tabBarContainer.style.alignItems = "center";
- // this.tabBarContainer.style.justifyContent = "space-between";
- this.tabBarContainer.style.overflow = "hidden";
-
- this.element.appendChild(this.tabBarContainer);
- this.focused = 0;
- }
-
- public _onFocus() {
- this.tabs[this.focused].focus();
- return this;
- }
-
- public focus() {
- this.tabs[this.focused].focus();
- return this;
- }
-
- public add(title: string) {
- const idx = this.tabs.length;
- const elem = new UITab(title);
- elem.onClick(() => {
- this.selectTab(idx);
- });
- this.tabs.push(elem);
- this.tabBarContainer.appendChild(elem.render());
- elem._onConnect();
- if (this.tabs.length === 1) this.calculateTabIndex();
- return this;
- }
-
- public onTabChange(f: (index: number) => void) {
- this.onTabChangeCallback = f;
- return this;
- }
-
- private selectTab(idx: number) {
- if (idx !== this.focused) {
- this.tabs[this.focused].setTabbable(false);
- this.focused = idx;
- }
- if (!this.onTabChangeCallback) return;
- this.onTabChangeCallback(idx);
- this.tabs[idx].setTabbable(true);
- this.tabs[idx].focus();
- this.updateView();
- }
-
- public _onKeydown(key: string): boolean {
- switch (key) {
- case "ArrowLeft":
- this.tabs[this.focused].setTabbable(false);
- this.focused = Math.max(0, this.focused - 1);
- this.tabs[this.focused].setTabbable(true);
- this.selectTab(this.focused);
- return true;
- break;
- case "ArrowRight":
- this.tabs[this.focused].setTabbable(false);
- this.focused = Math.min(this.tabs.length - 1, this.focused + 1);
- this.tabs[this.focused].setTabbable(true);
- this.selectTab(this.focused);
- return true;
- break;
- default:
- return false;
- break;
- }
- return false;
- }
-
- private updateView() {
- for (let i = 0; i < this.tabs.length; i++) {
- this.tabs[i].setSelected(i === this.focused);
- }
- }
-
- public getElement(): HTMLElement {
- return this.element;
- }
-
-
- public calculateTabIndex() {
- this.tabs[this.focused].setTabbable(true);
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/tab.ts b/frontend/src/ui/tab.ts
deleted file mode 100644
index 7059dec..0000000
--- a/frontend/src/ui/tab.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { UINode } from "./node";
-
-export class UITab extends UINode {
- private textElement: HTMLButtonElement;
- private selected: boolean;
-
- public constructor(title: string) {
- super(title);
- this.title = title;
- this.textElement = document.createElement("button");
- this.textElement.innerText = title;
- this.textElement.setAttribute("tabindex", "-1");
- this.textElement.setAttribute("role", "tab");
- this.textElement.setAttribute("aria-selected", "false");
- this.element.appendChild(this.textElement);
- this.selected = false;
- }
-
- public focus() {
- this.textElement.focus();
- return this;
- }
-
- public click() {
- this.textElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.textElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.textElement.innerText = text;
- return this;
- }
-
- public setSelected(val: boolean) {
- this.selected = val;
- this.textElement.setAttribute("aria-selected", this.selected.toString());
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/tabbed-view.ts b/frontend/src/ui/tabbed-view.ts
deleted file mode 100644
index 47d30e7..0000000
--- a/frontend/src/ui/tabbed-view.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { UINode } from "./node";
-import { TabBar } from "./tab-bar";
-import { Container } from "./container";
-
-
-export class TabbedView extends UINode {
- private bar: TabBar;
- private containers: Container[];
- private containerElement: HTMLDivElement;
- private barAtTop: boolean;
- private currentView?: Container;
- public constructor(title: string, barAtTop: boolean = true) {
- super(title);
- this.bar = new TabBar();
- this.bar._onConnect();
- this.bar.onTabChange((index: number) => this.onTabChanged(index));
- this.containers = [];
- this.containerElement = document.createElement("div");
- this.element.appendChild(this.bar.render());
- this.element.appendChild(this.containerElement);
- this.element.setAttribute("tabindex", "-1");
- this.barAtTop = barAtTop;
- }
-
- public add(name: string, container: Container) {
- this.bar.add(name);
- container.setRole("tabpanel");
- this.containers.push(container);
- return this;
- }
-
- private onTabChanged(idx: number) {
- if (this.currentView) {
- this.containerElement.removeChild(this.currentView.render());
- }
- this.currentView = this.containers[idx];
- this.containerElement.appendChild(this.currentView.render());
- }
-
- public getElement(): HTMLElement {
- return this.containerElement;
- }
-
- protected calculateStyle(): void {
- if (this.barAtTop) {
- this.bar.setPosition(0, 0, 100, 5);
- } else {
- this.bar.setPosition(0, 90, 100, 5);
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/text-input.ts b/frontend/src/ui/text-input.ts
deleted file mode 100644
index 735a05d..0000000
--- a/frontend/src/ui/text-input.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { UINode } from "./node";
-
-export class TextInput extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private inputElement: HTMLInputElement;
- public constructor(title: string) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `inpt_title_${this.id}`;
- this.inputElement = document.createElement("input");
- this.inputElement.id = `inpt_${this.id}`;
- this.inputElement.type = "text";
- this.titleElement.appendChild(this.inputElement);
- this.element.appendChild(this.titleElement);
- }
-
- public focus() {
- this.inputElement.focus();
- return this;
- }
-
- public click() {
- this.inputElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.inputElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getValue(): string {
- return this.inputElement.value;
- }
-
- public setValue(value: string) {
- this.inputElement.value = value;
- return this;
- }
-
- public setReadonly(readonly: boolean) {
- this.inputElement.readOnly = readonly;
- return this;
- }
-}
diff --git a/frontend/src/ui/text.ts b/frontend/src/ui/text.ts
deleted file mode 100644
index 35fc384..0000000
--- a/frontend/src/ui/text.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { UINode } from "./node";
-
-export class Text extends UINode {
- private textElement: HTMLSpanElement;
- public constructor(title: string) {
- super(title);
- this.textElement = document.createElement("span");
- this.textElement.innerText = title;
- this.textElement.setAttribute("tabindex", "-1");
- this.element.appendChild(this.textElement);
- }
-
- public focus() {
- this.textElement.focus();
- return this;
- }
-
- public click() {
- this.textElement.click();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.textElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.textElement.innerText = text;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/time-picker.ts b/frontend/src/ui/time-picker.ts
deleted file mode 100644
index 23eb5f2..0000000
--- a/frontend/src/ui/time-picker.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { UINode } from "./node";
-
-export class TimePicker extends UINode {
- private id: string;
- private titleElement: HTMLLabelElement;
- private inputElement: HTMLInputElement;
- public constructor(title: string) {
- super(title);
- this.id = Math.random().toString();
- this.titleElement = document.createElement("label");
- this.titleElement.innerText = title;
- this.titleElement.id = `timepicker_title_${this.id}`;
- this.inputElement = document.createElement("input");
- this.inputElement.id = `timepicker_${this.id}`;
- this.inputElement.type = "time";
- this.titleElement.appendChild(this.inputElement);
- this.element.appendChild(this.titleElement);
- }
-
- public focus() {
- this.inputElement.focus();
- return this;
- }
-
- public getElement(): HTMLElement {
- return this.inputElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.titleElement.innerText = text;
- return this;
- }
-
- public getValue(): string {
- return this.inputElement.value;
- }
-
- public setValue(value: string) {
- this.inputElement.value = value;
- return this;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/treelist-item.ts b/frontend/src/ui/treelist-item.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/frontend/src/ui/treelist.ts b/frontend/src/ui/treelist.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/frontend/src/ui/treeview-item.ts b/frontend/src/ui/treeview-item.ts
deleted file mode 100644
index 87a8c52..0000000
--- a/frontend/src/ui/treeview-item.ts
+++ /dev/null
@@ -1,198 +0,0 @@
-import { UINode } from "./node";
-import { Treeview } from "./treeview";
-
-export class TreeviewItem extends UINode {
- private listElement: HTMLLIElement;
- private childContainer!: HTMLUListElement;
-
- public children: TreeviewItem[];
-
- private expanded!: boolean;
-
- private focused: number;
-
- private parent?: TreeviewItem;
-
- private root!: Treeview;
-
- private previousItem?: TreeviewItem;
- private nextItem?: TreeviewItem;
-
- public constructor(title: string) {
- super(title);
- this.listElement = document.createElement("li");
- this.listElement.innerText = this.title;
- this.listElement.setAttribute("tabindex", "-1");
- this.listElement.setAttribute("role", "treeitem");
- this.element.appendChild(this.listElement);
- this.listElement.setAttribute("aria-label", this.title);
- this.children = [];
- this.focused = 0;
- }
-
- public focus() {
- this.listElement.focus();
- }
-
- public click() {
- this.listElement.click();
- }
-
- public getElement(): HTMLElement {
- return this.listElement;
- }
-
- public setText(text: string) {
- this.title = text;
- this.listElement.innerText = text;
- this.element.setAttribute("aria-label", this.title);
- this.listElement.setAttribute("aria-label", this.title);
- }
-
- public add(node: TreeviewItem) {
- this.children.push(node);
- node.setParent(this);
- this.setExpanded(false);
- if (this.children.length > 0) {
- this.previousItem = this.children[this.children.length - 1];
- this.previousItem.setNextItem(node);
- }
- }
-
- public remove(node: TreeviewItem) {
- const idx = this.children.indexOf(node);
- if (idx > -1) {
- this.children.splice(idx, 1);
- this.updateShownItems();
- }
- }
-
- public expand() {
- if (!this.isExpandable()) return;
- if (this.isExpandable() && this.isExpanded() && this.children[this.focused].isExpandable()) {
- this.children[this.focused].expand();
- return;
- }
- this.setExpanded(true);
- this.updateShownItems();
- this.children[this.focused].focus();
- }
-
- public collapse(ignoreFocus: boolean = false) {
- if (!this.isExpandable()) {
- if (this.getElement() !== document.activeElement && ignoreFocus) return;
- this.parent?.collapse(true);
- return;
- }
- this.setExpanded(false);
- this.updateShownItems();
- setTimeout(() => this.focus(), 0);
- }
-
- public isExpandable(): boolean {
- return this.children.length > 0;
- }
-
- public isExpanded() {
- return this.expanded;
- }
-
- private setExpanded(val: boolean) {
- this.expanded = val;
- if (this.expanded) {
- this.listElement.setAttribute("aria-expanded", "true");
- return;
- }
- this.listElement.setAttribute("aria-expanded", "false");
- }
-
- private updateShownItems() {
- if (this.expanded) {
- if (!this.childContainer) {
- this.childContainer = document.createElement("ul");
- this.childContainer.setAttribute("role", "group");
- this.children.forEach((child) => this.childContainer.appendChild(child.render()));
- this.listElement.appendChild(this.childContainer);
- } else {
- this.childContainer.hidden = false;
- }
- } else {
- this.childContainer.hidden = true;
- // this.listElement.removeChild(this.childContainer);
- }
- }
-
- public focusNext(): boolean {
- if (this.isExpandable() && this.isExpanded() && this.children[this.focused].isExpandable()) {
- return this.children[this.focused].focusNext();
- }
- this.children[this.focused].setTabbable(false);
- this.focused = Math.min(this.children.length - 1, this.focused + 1);
- this.children[this.focused].setTabbable(true);
- this.children[this.focused].focus();
- return true;
- }
-
- public focusPrevious(): boolean {
- if (this.isExpandable() && this.isExpanded() && this.children[this.focused].isExpandable()) {
- return this.children[this.focused].focusPrevious();
- }
- this.children[this.focused].setTabbable(false);
- this.focused = Math.max(0, this.focused - 1);
- this.children[this.focused].setTabbable(true);
- this.children[this.focused].focus();
- return true;
- }
-
- public setParent(item: TreeviewItem) {
- this.parent = this.parent;
- }
-
- public getParent(): TreeviewItem|undefined {
- return this.parent;
- }
-
- public setPrevious(node: TreeviewItem) {
- this.previousItem = node;
- }
-
- public setNextItem(node: TreeviewItem) {
- this.nextItem = node;
- }
-
- public getPrevious(): TreeviewItem|undefined {
- return this.previousItem;
- }
-
- public getNext(): TreeviewItem|undefined {
- return this.nextItem;
- }
-
- public _onKeydown(key: string, alt?: boolean, shift?: boolean, ctrl?: boolean): boolean {
- switch (key) {
- case "ArrowUp":
- this.focusPrevious();
- return true;
- break;
- case "ArrowDown":
- this.focusNext();
- return true;
- case "ArrowLeft":
- this.collapse();
- return true;
- case "ArrowRight":
- if (this.children[this.focused].isExpandable() && !this.children[this.focused].isExpanded()) {
- this.children[this.focused].expand();
- return true;
- }
- break;
- default:
- return false;
- }
- return false;
- }
-
- public focusOnItem() {
- this.children[this.focused].focus();
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/treeview.ts b/frontend/src/ui/treeview.ts
deleted file mode 100644
index 727d716..0000000
--- a/frontend/src/ui/treeview.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import { UINode } from "./node";
-import { TreeviewItem } from "./treeview-item";
-
-export class Treeview extends UINode {
- public children: TreeviewItem[];
- protected listElement: HTMLUListElement;
- private focused: number;
- protected selectCallback?: (id: number) => void;
- public constructor(title: string) {
- super(title);
- this.children = [];
- this.listElement = document.createElement("ul");
- this.listElement.setAttribute("role", "tree");
- this.listElement.style.listStyle = "none";
- this.element.appendChild(this.listElement);
- this.element.setAttribute("aria-label", this.title);
- this.focused = 0;
- }
-
- public add(node: TreeviewItem) {
- this.children.push(node);
- node._onConnect();
- this.listElement.appendChild(node.render());
- if (this.children.length === 1) this.calculateTabIndex();
- node.onFocus(() => this.calculateFocused(node));
- }
-
- public remove(node: TreeviewItem) {
- const idx = this.children.indexOf(node);
- this.children.splice(idx, 1);
- node._onDisconnect();
- this.listElement.removeChild(node.render());
- if (idx === this.focused) {
- if (this.focused > 0) this.focused--;
- this.calculateTabIndex();
- }
- }
-
- public _onFocus() {
- super._onFocus();
- this.children[this.focused].focus();
- }
-
- public _onClick() {
- this.children[this.focused]._onClick();
- }
-
- public _onSelect(id: number) {
- if (this.selectCallback) this.selectCallback(id);
- }
-
- protected calculateStyle(): void {
- super.calculateStyle();
- this.element.style.overflowY = "scroll";
- this.listElement.style.overflowY = "scroll";
- }
-
- public _onKeydown(key: string, alt: boolean = false, shift: boolean = false, ctrl: boolean = false): boolean {
- switch (key) {
- case "ArrowUp":
- return this.focusPrevious();
- break;
- case "ArrowDown":
- return this.focusNext();
- break;
- case "Enter":
- this.children[this.focused].click();
- return true;
- break;
- case "ArrowLeft":
- // this.children[this.focused].collapse();
- return true;
- break;
- case "ArrowRight":
- this.children[this.focused].expand();
- return true;
- break;
- default:
- return this.children[this.focused]._onKeydown(key);
- break;
- }
- return false;
- }
-
- protected renderAsListItem(node: UINode) {
- let li = document.createElement("li");
- li.appendChild(node.render());
- return li;
- }
-
- public getElement(): HTMLElement {
- return this.listElement;
- }
-
- public isItemFocused(): boolean {
- const has = this.children.find((child) => child.isFocused);
- if (has) {
- return true;
- }
- return false;
- }
-
- private calculateTabIndex() {
- this.children[this.focused].setTabbable(true);
- }
-
- public clear() {
- this.children.forEach((child) => this.remove(child));
- this.children = [];
- this.listElement.innerHTML = '';
- this.focused = 0;
- }
-
- public getFocusedChild() {
- return this.children[this.focused];
- }
-
- public getFocus() {
- return this.focused;
- }
-
- public onSelect(f: (id: number) => void) {
- this.selectCallback = f;
- }
-
- protected calculateFocused(node: TreeviewItem) {
- const idx = this.children.indexOf(node);
- this._onSelect(idx);
- }
-
- public focusPrevious() {
- if (this.children[this.focused].isExpanded()) {
- // return this.children[this.focused].focusPrevious();
- } else {
- this.focused = Math.max(0, this.focused - 1);
- this.children[this.focused].focus();
- }
- return true;
- }
-
- public focusNext() {
- if (this.children[this.focused].isExpanded()) {
- // return this.children[this.focused].focusNext();
- } else {
- this.focused = Math.min(this.children.length - 1, this.focused + 1);
- this.children[this.focused].focus();
- }
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/ui/video.ts b/frontend/src/ui/video.ts
deleted file mode 100644
index 42fb547..0000000
--- a/frontend/src/ui/video.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { UINode } from "./node";
-
-export class Video extends UINode {
- private videoElement: HTMLVideoElement;
-
- public constructor(title: string, src: string | MediaStream = "") {
- super(title);
- this.videoElement = document.createElement("video");
- if (typeof src === "string") {
- this.videoElement.src = src; // Set src if it's a string URL
- } else if (src instanceof MediaStream) {
- this.videoElement.srcObject = src; // Set srcObject if it's a MediaStream
- }
- this.videoElement.setAttribute("aria-label", title);
- this.element.appendChild(this.videoElement);
- this.setRole("video");
- }
-
- public getElement(): HTMLElement {
- return this.videoElement;
- }
-
- public setSource(src: string | MediaStream) {
- if (typeof src === "string") {
- this.videoElement.src = src;
- } else if (src instanceof MediaStream) {
- this.videoElement.srcObject = src;
- }
- return this;
- }
-
- public play() {
- this.videoElement.play();
- return this;
- }
-
- public pause() {
- this.videoElement.pause();
- return this;
- }
-
- public setControls(show: boolean) {
- this.videoElement.controls = show;
- return this;
- }
-
- public setLoop(loop: boolean) {
- this.videoElement.loop = loop;
- return this;
- }
-
- public setMuted(muted: boolean) {
- this.videoElement.muted = muted;
- return this;
- }
-
- public setAutoplay(autoplay: boolean) {
- this.videoElement.autoplay = autoplay;
- return this;
- }
-}
diff --git a/frontend/src/ui/window.ts b/frontend/src/ui/window.ts
deleted file mode 100644
index 1ca00bf..0000000
--- a/frontend/src/ui/window.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { Container } from "./container";
-import { UINode } from "./node";
-
-export class UIWindow {
- public title: string;
- public width!: number;
- public height!: number;
- public position!: { x: number; y: number; };
- public container: Container;
- public visible: boolean;
- private element: HTMLDivElement;
- private rendered!: boolean;
- private keyDown: (e: KeyboardEvent) => void;
-
- public constructor(
- title: string,
- classname?: string,
- private setTitle: boolean = true
- ) {
- this.title = title;
- this.container = new Container(this.title);
- this.container._onConnect();
- this.element = document.createElement("div");
- if (classname) {
- this.element.className = classname;
- }
- this.keyDown = this.onKeyDown.bind(this);
- this.visible = false;
- }
-
- public add(node: UINode) {
- this.container.add(node);
- return this;
- }
-
- public remove(node: UINode) {
- if (this.container.children.includes(node)) this.container.remove(node);
- return this;
- }
-
- public show(): HTMLElement|undefined {
- if (this.visible) return;
- if (this.setTitle) document.title = this.title;
- if (this.rendered) return this.element;
- this.element.appendChild(this.container.render());
- this.element.addEventListener("keydown", this.keyDown);
- this.element.focus();
- this.visible = true;
- this.rendered = true;
- return this.element;
- }
-
- public hide() {
- if (!this.visible) return;
- this.visible = false;
- this.rendered = false;
- this.element.replaceChildren();
- this.element.removeEventListener("keydown", this.keyDown);
- }
-
- public onKeyDown(e: KeyboardEvent) {
- if (this.container._onKeydown(e.key, e.altKey, e.shiftKey, e.ctrlKey)) {
- e.preventDefault();
- }
- }
-
- public onConnect() {
- return;
- }
-
- public onDisconnect() {
- return;
- }
-
- public getElement(): HTMLElement {
- return this.element;
- }
-
- public getContainer(): Container {
- return this.container;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/views/authorize.ts b/frontend/src/views/authorize.ts
deleted file mode 100644
index 016a128..0000000
--- a/frontend/src/views/authorize.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { showToast } from "../speech";
-import { Button, Text, TextInput } from "../ui";
-import { View } from "./view";
-import { state } from "../state";
-import { API } from "../api";
-import { MainView } from "./main";
-import { playSound } from "../sound";
-
-export class AuthorizeView extends View {
- private welcomeText!: Text;
- private apiURLInput!: TextInput;
- private tokenInput!: TextInput;
- private loginButton!: Button;
-
- public onActivate(): void {
- playSound("intro");
- }
- public onDeactivate(): void {
- }
- public onCreate(): void {
- this.welcomeText = new Text("Welcome to Notebrook!");
- this.welcomeText.setPosition(25, 10, 75, 20);
- this.apiURLInput = new TextInput("API URL");
- this.apiURLInput.setPosition(40, 40, 20, 20);
- this.tokenInput = new TextInput("Token");
- this.tokenInput.setPosition(40, 60, 20, 10);
- this.loginButton = new Button("Login");
- this.loginButton.setPosition(40, 70, 20, 10);
- this.window.add(this.welcomeText);
- this.window.add(this.apiURLInput);
- this.window.add(this.tokenInput);
- this.window.add(this.loginButton);
-
- this.loginButton.onClick(async () => {
- const token = this.tokenInput.getValue();
- const apiUrl = this.apiURLInput.getValue();
- API.path = apiUrl;
- API.token = token;
- try {
- await API.checkToken();
- state.token = token;
- state.apiUrl = apiUrl;
- state.save();
- showToast(`Welcome!`, 2000);
- playSound("login");
- this.viewManager.push(new MainView(this.viewManager));
- } catch (e) {
- showToast(`Invalid API URL or token provided.`);
- playSound("uploadFailed");
- }
- });
- }
-
- public onDestroy(): void {
- }
-}
\ No newline at end of file
diff --git a/frontend/src/views/main.ts b/frontend/src/views/main.ts
deleted file mode 100644
index 50bae1b..0000000
--- a/frontend/src/views/main.ts
+++ /dev/null
@@ -1,670 +0,0 @@
-import { API } from "../api";
-import { ChunkProcessor } from "../chunk-processor";
-import { ChannelDialog } from "../dialogs/channel-dialog";
-import { CreateChannelDialog } from "../dialogs/create-channel";
-import { MessageDialog } from "../dialogs/message";
-import { RecordAudioDialog } from "../dialogs/record-audio";
-import { SearchDialog } from "../dialogs/search";
-import { SettingsDialog } from "../dialogs/settings";
-import { TakePhotoDialog } from "../dialogs/take-photo";
-import { MessageUpdated } from "../events/message-events";
-import { Channel } from "../model/channel";
-import { IMessage, Message } from "../model/message";
-import { UnsentMessage } from "../model/unsent-message";
-import { playSent, playSound, playWater } from "../sound";
-import { showToast } from "../speech";
-import { state } from "../state";
-import { Button, List, ListItem, TextInput, UINode } from "../ui";
-import { Dropdown } from "../ui/dropdown";
-import { FileInput } from "../ui/file-input";
-import { MultilineInput } from "../ui/multiline-input";
-import { connectToWebsocket } from "../websockets";
-import { AuthorizeView } from "./authorize";
-import { View } from "./view";
-
-export class MainView extends View {
- private settingsButton!: Button;
- private channelSwitcher!: Dropdown;
- private channelInfoButton!: Button;
- private searchButton!: Button;
- private fileInput!: FileInput;
- private messageInput!: MultilineInput;
- private imageInput!: Button;
- private voiceMessageInput!: Button;
- private messageList!: List;
- private updateInterval!: number;
-
- private messageElementMap: Map = new Map();
-
- private hotkeyMap: Map void> = new Map();
-
- public onActivate(): void {
- if (!state.currentChannel) {
- if (state.defaultChannelId) {
- this.switchChannel(state.defaultChannelId.toString());
- } else {
- if (state.channelList.channels.length > 0) this.switchChannel(state.channelList.channels[0].id.toString());
- }
- }
- this.renderInitialMessageList();
- this.checkAuthorization();
- this.syncChannels();
- this.updateChannelList();
- this.syncMessages();
- this.updateInterval = setInterval(() => {
- this.updateVisibleMessageShownTimestamps();
- }, 10000);
- setTimeout(() => this.attemptToSendUnsentMessages(), 2000);
-
- state.events.registerHandler("message-updated", (message) => {
- const { data } = message;
- if (!data) return;
- const channel = state.currentChannel;
- if (!channel) return;
- const existing = channel.getMessage(parseInt(data!.id));
- if (!existing) {
- return;
- } else {
- existing.content = data.content;
- state.save();
- const renderedMessage = this.messageElementMap.get(existing.id);
- if (renderedMessage) {
- (renderedMessage as ListItem).setText(`${existing.content}; ${this.convertIsoTimeStringToFriendly(existing.createdAt)}`);
- }
- }
- });
-
- document.addEventListener("keydown", (e) => this.handleHotkey(e));
- }
-
- public onDeactivate(): void {
- clearInterval(this.updateInterval);
- // unregister hotkey
- document.removeEventListener("keydown", (e) => this.handleHotkey(e));
- }
-
- public onCreate(): void {
- this.settingsButton = new Button("Settings")
- .setPosition(0, 0, 10, 10)
- .onClick(() => this.openSettingsDialog());
- this.channelSwitcher = new Dropdown("Channel", [])
- .setPosition(30, 10, 30, 10);
- this.channelInfoButton = new Button("Channel info")
- .setPosition(60, 10, 30, 10);
- this.searchButton = new Button("Search")
- .setPosition(90, 10, 10, 10)
- .onClick(async () => this.openSearchDialog());
-
- this.fileInput = new FileInput("Upload file")
- .setPosition(0, 90, 15, 10);
- this.imageInput = new Button("Image")
- .setPosition(15, 90, 15, 10);
- this.messageInput = new MultilineInput("New message")
- .setPosition(30, 90, 60, 10);
- this.messageInput.getElement().autofocus = true;
- this.voiceMessageInput = new Button("Voice message")
- .setPosition(70, 90, 30, 10);
-
- this.messageList = new List("Messages")
- .setPosition(30, 30, 60, 50);
- this.window.add(this.settingsButton)
- .add(this.channelSwitcher)
- .add(this.channelInfoButton)
- .add(this.searchButton)
- .add(this.messageList)
- .add(this.messageInput)
- .add(this.fileInput)
- .add(this.imageInput)
- .add(this.voiceMessageInput);
- this.channelSwitcher.getElement().addEventListener("change", (e) => this.handleChannelSwitcher(e));
- this.voiceMessageInput.onClick(async () => this.handleVoiceMessageButton());
-
- this.messageInput.onKeyDown((key: string, alt: boolean | undefined, shift: boolean | undefined, ctrl: boolean | undefined) => {
- if (key === "Enter") {
- if (!shift) {
- console.log(key, alt, shift, ctrl);
- this.sendMessage();
- }
- }
- });
- this.channelInfoButton.onClick(() => this.handleChannelInfoButton());
- this.imageInput.onClick(async () => this.handleImageButton());
- this.setHotkeys();
- }
-
- public onDestroy(): void {
-
- }
-
- private async syncChannels() {
- const channels = await API.getChannels();
- state.channelList.channels.forEach((chan) => {
- if (!channels.find((c) => c.id === chan.id)) {
- state.removeChannel(chan);
- }
- });
- channels.forEach((chan) => state.addChannel(new Channel(chan)));
- this.updateChannelList();
- if (!state.currentChannel) {
- if (state.defaultChannelId) {
- this.switchChannel(state.defaultChannelId.toString());
- } else {
- if (state.channelList.channels.length > 0) {
- this.switchChannel(state.channelList.channels[0].id.toString());
- } else {
- this.createNewChannel();
- }
- }
- }
- state.save();
- }
-
- private updateChannelList() {
- this.channelSwitcher.clearOptions();
- state.getChannels().forEach((chan) => {
- this.channelSwitcher.addOption(chan.id.toString(), chan.name);
- });
- this.channelSwitcher.addOption("__new__", "Add new channel");
- }
-
- private checkAuthorization() {
- if (!state.token || !state.apiUrl) {
- this.viewManager.push(new AuthorizeView(this.viewManager));
- } else {
- API.token = state.token;
- API.path = state.apiUrl;
- connectToWebsocket();
- }
-
- state.save();
- }
-
- private async syncMessages() {
- if (!state.currentChannel) return;
- if (!state.currentChannel.messages) state.currentChannel.messages = [];
- const channelId = state.currentChannel.id;
- if (channelId) {
- const messages = await API.getMessages(channelId.toString());
- // first, delete all local messages that are no longer on the remote using the chunk processor
- const proc = new ChunkProcessor(100);
- proc.processArray(state.currentChannel.messages, (chunk: IMessage[]) => {
- chunk.forEach((message: IMessage) => {
- if (!messages.find((m) => m.id === message.id)) {
- state.currentChannel!.removeMessage(message.id);
- const elem = this.messageElementMap.get(message.id);
- if (elem) {
- this.messageList.remove(elem);
- this.messageElementMap.delete(message.id);
- }
- }
- });
- });
- // only render new list items, or list items that have changed.
- proc.processArray(messages, (chunk: IMessage[]) => {
- chunk.forEach((message: IMessage) => {
- // TODO: this could do with a lot of perf improvements. I'll get to it once this is an issue.
- const existing = state.currentChannel!.getMessage(message.id);
- if (!existing) {
- state.currentChannel!.addMessage(new Message(message));
- this.renderAndAddMessage(message);
- } else {
- // TODO: this is awful and needs to be updated, but it works for now.
- if (existing.content !== message.content || existing.fileId !== message.fileId || existing.filePath !== message.filePath || existing.fileType !== message.fileType || existing.createdAt !== message.createdAt) {
- existing.content = message.content;
- existing.fileId = message.fileId;
- existing.filePath = message.filePath;
- existing.fileType = message.fileType;
- existing.createdAt = message.createdAt;
- existing.fileId = message.fileId;
- existing.filePath = message.filePath;
- existing.fileSize = message.fileSize;
- const renderedMessage = this.messageElementMap.get(message.id);
- if (renderedMessage) {
- (renderedMessage as ListItem).setText(`${message.content}; ${this.convertIsoTimeStringToFriendly(message.createdAt)}`);
- }
- }
- }
- });
- });
- }
- state.save();
- }
-
- public switchChannel(channelId: string) {
- if (this.messageList.children.length > 0) this.messageList.clear();
- const chan = state.getChannelById(parseInt(channelId));
- if (!chan) {
- throw new Error("Could not find channel " + channelId);
- }
- state.currentChannel = chan;
- state.save();
- }
-
- private renderMessage(message: IMessage): UINode {
- const itm = new ListItem(`${message.content}; ${this.convertIsoTimeStringToFriendly(message.createdAt)}`);
- itm.setUserData(message.id);
- itm.onClick(() => {
- this.openMessageDialog(message);
- })
- itm.onKeyDown(async (key: string, alt: boolean | undefined, shift: boolean | undefined, ctrl: boolean | undefined) => {
- if (key === "c") {
- navigator.clipboard.writeText(message.content.trim());
- playSound("copy");
- }
-
- if (key === "Delete") {
- await this.removeMessage(message.id);
- if (this.messageList.children.length === 0) {
- this.messageInput.focus()
- } else {
- this.messageList.focusSelectedMessage()
- }
- }
- });
- return itm;
- }
-
- private renderInitialMessageList(reset: boolean = false) {
- if (!state.currentChannel) return;
- if (!state.currentChannel.messages || state.currentChannel.messages.length < 1) return;
- if (this.messageList.children.length > 0 && !reset) {
- return;
- } else {
- this.messageList.clear();
- this.messageElementMap.clear();
- }
- state.currentChannel.messages.forEach((message) => {
- this.renderAndAddMessage(message);
- });
- this.messageList.scrollToBottom();
- }
-
- private async createNewChannel() {
- const name = await new CreateChannelDialog().open();
- if (name) {
- const chan = await API.createChannel(name);
- state.addChannel(new Channel(chan));
- this.updateChannelList();
- if (state.channelList.channels.length < 2) {
- state.defaultChannelId = chan.id;
- }
- state.save();
- }
- }
-
- private async sendMessage() {
- if (this.fileInput && this.fileInput.getFiles() && this.fileInput.getFiles()!.length > 0) {
- return this.uploadFile();
- }
- if (this.messageInput.getValue().length > 0) {
- const messageContent = this.messageInput.getValue();
- this.messageInput.setValue("");
- playWater();
- try {
- const message: IMessage = await API.createMessage(state.currentChannel!.id.toString(), messageContent);
- this.messageInput.setValue("");
- this.renderAndAddMessage(message);
- this.messageList.scrollToBottom();
- playSent();
- state.save();
- } catch (e) {
- showToast("Could not post message. Will retry later.", 3000);
- playSound("uploadFailed");
- const unsentId = Date.now();
- state.unsentMessages.push(new UnsentMessage({
- channelId: state.currentChannel!.id,
- content: messageContent,
- createdAt: new Date().toISOString(),
- id: unsentId
- }));
- const tmpMessage: IMessage = new Message({
- id: unsentId,
- content: messageContent,
- createdAt: new Date().toISOString(),
- });
- state.currentChannel!.addMessage(tmpMessage);
- this.renderAndAddMessage(tmpMessage);
- state.save();
- }
- }
- }
-
- private async uploadVoiceMessage(blob: Blob) {
- playWater();
- const msgContent = this.messageInput.getValue() !== "" ? this.messageInput.getValue() : "Voice message";
- this.messageInput.setValue("");
- const msg = await API.createMessage(state.currentChannel!.id.toString(), msgContent);
- const id = msg.id;
- try {
- const response: any = await API.uploadFile(state.currentChannel!.id.toString(), id.toString(), blob);
- if (msg) {
- msg.fileId = response.fileId;
- msg.filePath = response.filePath;
- msg.fileType = response.fileType;
- state.currentChannel!.addMessage(new Message(msg));
- this.renderAndAddMessage(msg);
- playSent();
- state.save();
- } else {
- showToast("Something went wrong during message file upload.");
- playSound("uploadFailed");
- // TODO: Handle the case when no message is found
- }
- } catch (e) {
- playSound("uploadFailed");
- showToast("Unable to send message. Will retry later.", 3000);
- state.unsentMessages.push(new UnsentMessage({
- channelId: state.currentChannel!.id,
- content: msgContent,
- createdAt: new Date().toISOString(),
- blob: blob,
- id: Date.now()
- }));
- state.save();
- }
- }
-
- private async uploadFile() {
- if (!this.fileInput.getFiles()) return;
- if (this.fileInput!.getFiles()!.length < 1) return;
- const file = this.fileInput!.getFiles()![0];
- if (file) {
- playWater();
- const msgContent = this.messageInput.getValue() !== "" ? this.messageInput.getValue() : "File upload";
- this.messageInput.setValue("");
- try {
- const msg = await API.createMessage(state.currentChannel!.id.toString(), msgContent);
- const id = msg.id;
- const response: any = await API.uploadFile(state.currentChannel!.id.toString(), id.toString(), file);
- if (msg) {
- msg.fileId = response.fileId;
- msg.filePath = response.filePath;
- msg.fileType = response.fileType;
- state.currentChannel!.addMessage(new Message(msg));
- this.renderAndAddMessage(msg);
- playSent();
- this.messageInput.setValue("");
- // reset the file picker
- (this.fileInput.getElement() as HTMLInputElement).value = "";
- state.save();
- } else {
- showToast("Error while uploading file.");
- playSound("uploadFailed");
- // TODO: Handle the case when no message is found
- }
- } catch (e) {
- showToast("Could not post message. Will retry later.", 3000);
- playSound("uploadFailed");
- state.unsentMessages.push(new UnsentMessage({
- channelId: state.currentChannel!.id,
- content: this.messageInput.getValue(),
- createdAt: new Date().toISOString(),
- blob: file,
- id: Date.now()
- }));
- state.save();
- }
- }
- }
-
- private convertIsoTimeStringToRelative(isoTimeString: string): string {
- const date = new Date(isoTimeString);
- const now = new Date();
- const diff = now.getTime() - date.getTime();
- if (diff < 1000 * 60) {
- return `${Math.floor(diff / 1000)} seconds ago`;
- } else if (diff < 1000 * 60 * 60) {
- // return both minutes and seconds
- return `${Math.floor(diff / (1000 * 60))} minutes ${Math.floor((diff % (1000 * 60)) / 1000)} seconds ago`;
- } else if (diff < 1000 * 60 * 60 * 24) {
- // return hours, minutes, seconds ago
- return `${Math.floor(diff / (1000 * 60 * 60))} hours ${Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))} minutes ${Math.floor((diff % (1000 * 60)) / 1000)} seconds ago`;
- } else {
- return date.toLocaleString();
- }
- }
-
- private convertIsoTimeStringToFriendly(isoTimeString: string): string {
- const date = new Date(isoTimeString);
- const now = new Date();
- if (date.getDate() === now.getDate() && date.getMonth() === now.getMonth() && date.getFullYear() === now.getFullYear()) {
- return date.toLocaleTimeString();
- } else {
- return date.toLocaleString();
- }
- }
- private updateVisibleMessageShownTimestamps() {
- const lowerIndex = Math.max(this.messageList.getFocus() - 10, 0);
- const upperIndex = Math.min(this.messageList.getFocus() + 10, this.messageList.children.length);
- for (let i = lowerIndex; i < upperIndex; i++) {
- const child = this.messageList.children[i];
- if (!child) break;
- const messageId = child.getUserData() as number;
- const message = state.currentChannel?.getMessage(messageId);
- if (message) {
- (child as ListItem).setText(`${message.content}; ${this.convertIsoTimeStringToFriendly(message.createdAt)}`);
- }
- }
- }
-
- private async attemptToSendUnsentMessages() {
- state.unsentMessages.forEach(async (msg) => {
- if (msg.blob) {
- const apiMsg = await API.createMessage(msg.channelId.toString(), msg.content);
- const id = apiMsg.id;
- const response: any = await API.uploadFile(msg.channelId.toString(), id.toString(), msg.blob);
- if (apiMsg) {
- apiMsg.fileId = response.fileId;
- apiMsg.filePath = response.filePath;
- apiMsg.fileType = response.fileType;
- state.currentChannel!.addMessage(new Message(apiMsg));
- this.renderAndAddMessage(apiMsg);
- playSent();
- state.unsentMessages = state.unsentMessages.filter((m) => m !== msg);
- this.removeSpecificMessageFromList(msg.id);
- state.save();
- }
- } else {
- const apiMsg = await API.createMessage(msg.channelId.toString(), msg.content);
- state.currentChannel!.addMessage(new Message(apiMsg));
- this.renderAndAddMessage(apiMsg);
- state.unsentMessages = state.unsentMessages.filter((m) => m !== msg);
- playSent();
- this.removeSpecificMessageFromList(msg.id);
- state.save();
- }
- });
- }
-
- private clearUnsentMessageDisplay() {
- this.messageList.children.forEach((msg) => {
- const data = msg.getUserData() as IMessage;
- if (data.id === -1) {
- this.messageList.remove(msg);
- }
- })
- }
-
- private removeSpecificMessageFromList(id: number) {
- const elem = this.messageElementMap.get(id);
- if (elem) {
- this.messageList.remove(elem);
- this.messageElementMap.delete(id);
- }
- }
-
- private async uploadImage(blob: Blob) {
- playWater();
- try {
- const msg = await API.createMessage(state.currentChannel!.id.toString(), "Image");
- const id = msg.id;
- const response: any = await API.uploadFile(state.currentChannel!.id.toString(), id.toString(), blob);
- if (msg) {
- msg.fileId = response.fileId;
- msg.filePath = response.filePath;
- msg.fileType = response.fileType;
- state.currentChannel!.addMessage(new Message(msg));
- this.renderAndAddMessage(msg);
- playSent();
- state.save();
- } else {
- showToast("Error while uploading file.");
- playSound("uploadFailed");
- // TODO: Handle the case when no message is found
- }
- } catch (e) {
- showToast("Could not post message. Will retry later.", 3000);
- playSound("uploadFailed");
- state.unsentMessages.push(new UnsentMessage({
- channelId: state.currentChannel!.id,
- content: "Image",
- createdAt: new Date().toISOString(),
- blob: blob,
- id: Date.now()
- }));
- state.save();
- }
- }
-
- private renderAndAddMessage(message: IMessage) {
- const elem = this.renderMessage(message);
- this.messageList.add(elem);
- this.messageElementMap.set(message.id, elem);
- }
-
- private async openSettingsDialog() {
- const d = new SettingsDialog();
- d.open();
- }
-
- private async openSearchDialog() {
- const searchDialog = new SearchDialog();
- const res = await searchDialog.open();
- if (res) {
- if (res.channelId && res.messageId) {
- if (state.currentChannel?.id !== res.channelId) {
- this.switchChannel(res.channelId.toString());
- this.renderInitialMessageList();
- }
- const message = state.currentChannel!.getMessage(res.messageId);
- if (message) {
- this.messageElementMap.get(message.id)?.focus();
- }
- }
- }
- }
-
- private handleChannelSwitcher(e: Event) {
- const target = e.target as HTMLSelectElement;
- if (target.value === "__new__") {
- this.createNewChannel();
- } else {
- this.switchChannel(target.value);
- this.renderInitialMessageList();
- this.syncMessages();
- }
- }
-
- private async handleVoiceMessageButton() {
- const blob = await new RecordAudioDialog().open();
- if (blob) {
- this.uploadVoiceMessage(blob);
- }
- }
-
- private async handleChannelInfoButton() {
- if (this.channelSwitcher.getSelectedValue() === "__new__") {
- this.createNewChannel();
- return;
- }
- const d = new ChannelDialog(state.currentChannel!);
- d.open().then((chan) => {
- if (!chan) {
- state.removeChannel(state.currentChannel!);
- state.currentChannel = null;
- this.updateChannelList();
- state.save();
- if (state.channelList.channels.length > 0) {
- return this.switchChannel(state.channelList.channels[0].id.toString());
- } else {
- return this.createNewChannel();
- }
- }
- if (chan.messages.length < 1) {
- this.renderInitialMessageList(true);
- this.syncMessages();
- }
- state.save();
- this.updateChannelList();
- });
- }
-
- private async handleImageButton() {
- const photo = await new TakePhotoDialog().open();
- this.uploadImage(photo);
- }
-
- private setHotkeys() {
- this.hotkeyMap.set("s", () => this.openSettingsDialog());
- this.hotkeyMap.set("c", () => this.channelSwitcher.focus());
- this.hotkeyMap.set("x", () => this.handleChannelInfoButton());
- this.hotkeyMap.set("f", () => this.openSearchDialog());
- this.hotkeyMap.set("v", () => this.handleVoiceMessageButton());
- this.hotkeyMap.set(" ", () => this.messageInput.focus());
- }
-
- private handleHotkey(e: KeyboardEvent) {
- let index = 10;
- if ((e.key.match(/[1-9]/) || e.key === '0') && e.altKey) {
- e.preventDefault();
- if (e.key === '0') index = 10;
- index = parseInt(e.key);
- const messages = state.currentChannel?.messages;
- if (messages && messages.length > 0) {
- const msg = messages[messages.length - index];
- if (msg) {
- showToast(`${msg.content}; ${this.convertIsoTimeStringToFriendly(msg.createdAt)}`, 200);
- } else {
- showToast('No message is available in this position', 200);
- }
- } else {
- showToast('There are no messages in this channel right now', 200)
- }
- }
-
- if (e.ctrlKey && e.shiftKey) {
- const action = this.hotkeyMap.get(e.key.toLowerCase());
- if (action) {
- e.preventDefault();
- action();
- }
- }
- }
-
- private async openMessageDialog(message: IMessage) {
- const d = new MessageDialog(message);
- const msg = await d.open();
- if (!msg || msg === null) {
- state.currentChannel?.removeMessage(message.id);
- const node = this.messageElementMap.get(message.id);
- if (node) {
- this.messageList.remove(node);
- this.messageElementMap.delete(message.id);
- }
- state.save();
- }
- }
-
- private async removeMessage(id: number) {
- if (state.currentChannel) {
- await API.deleteMessage(state.currentChannel.id.toString(), id.toString());
- state.currentChannel.removeMessage(id);
- const node = this.messageElementMap.get(id);
- if (node) {
- this.messageList.remove(node);
- this.messageElementMap.delete(id);
- state.save();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/frontend/src/views/view-manager.ts b/frontend/src/views/view-manager.ts
deleted file mode 100644
index 34e933d..0000000
--- a/frontend/src/views/view-manager.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import { UIWindow } from "../ui/window";
-import { View } from "./view";
-
-export class ViewManager {
- private currentView: View | undefined | null;
- private views: View[];
- private window: UIWindow;
- public constructor() {
- this.views = [];
- this.window = new UIWindow("Notebrook");
- this.currentView = null;
- }
-
- public add(view: View) {
- this.views.push(view);
- view.onCreate();
- }
-
- public remove(view: View) {
- this.views.splice(this.views.indexOf(view), 1);
- view.onDestroy();
- if (view === this.currentView) this.window.remove(this.currentView.show());
- if (this.currentView) this.currentView.setActive(false);
- this.currentView = null;
- }
-
- public switchTo(view: View) {
- if (!this.views.includes(view)) {
- throw new Error("View not initialized");
- }
- if (this.currentView) {
- this.currentView.onDeactivate();
- this.currentView.setActive(false);
- this.window.remove(this.currentView.show());
- }
- this.currentView = view;
- this.currentView.setActive(true);
- this.currentView.onActivate();
- this.window.add(this.currentView.show());
- }
-
- public render(): HTMLElement|undefined {
- return this.window.show();
- }
-
- public push(view: View) {
- if (this.currentView) {
- this.currentView.onDeactivate();
- this.currentView.setActive(false);
- this.window.remove(this.currentView.show());
- }
-
- this.views.unshift(view);
- this.currentView = view;
- this.currentView.onCreate();
- this.currentView.setActive(true);
- this.currentView.onActivate();
- this.window.add(this.currentView.show());
- }
-
- public pop() {
- if (this.currentView) {
- this.currentView.onDeactivate();
- this.currentView.setActive(false);
- this.window.remove(this.currentView.show());
- this.currentView.onDestroy();
- }
- this.views.splice(0, 1);
- this.currentView = this.views[0];
- this.currentView.setActive(true);
- this.currentView.onActivate();
- this.window.add(this.currentView.show());
- }
-}
diff --git a/frontend/src/views/view.ts b/frontend/src/views/view.ts
deleted file mode 100644
index ec507a3..0000000
--- a/frontend/src/views/view.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Container } from "../ui/container";
-import { UIWindow } from "../ui/window";
-import { ViewManager } from "./view-manager";
-
-export abstract class View {
- protected viewManager: ViewManager;
- protected window: Container;
- private active!: boolean;
- public constructor(viewManager: ViewManager) {
- this.viewManager = viewManager;
- this.window = new Container("Base view");
- }
-
- public show() {
- return this.window;
- }
-
- public abstract onActivate(): void;
-
- public abstract onDeactivate(): void;
-
- public abstract onCreate(): void;
-
- public abstract onDestroy(): void;
-
- public isActive() {
- return this.isActive;
- }
-
- public setActive(val: boolean) {
- this.active = val;
- }
-}
\ No newline at end of file
diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts
deleted file mode 100644
index 11f02fe..0000000
--- a/frontend/src/vite-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/frontend/src/websockets.ts b/frontend/src/websockets.ts
deleted file mode 100644
index 3a8cb6f..0000000
--- a/frontend/src/websockets.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { API } from "./api";
-import { state } from "./state";
-
-export const connectToWebsocket = () => {
- const ws = new WebSocket(`ws://localhost:3000`);
- ws.onopen = () => {
- console.log("Connected to websocket server");
- }
- ws.onmessage = (data) => {
- const message = JSON.parse(data.data.toString());
- state.events.sendMessage(message);
- console.log(message);
- }
- ws.onclose= () => {
- console.log("Disconnected from websocket server");
- }
- return ws;
-}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
deleted file mode 100644
index aab648f..0000000
--- a/frontend/tsconfig.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2020",
- "useDefineForClassFields": true,
- "module": "ESNext",
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "isolatedModules": true,
- "moduleDetection": "force",
- "noEmit": true,
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": false,
- "noUnusedParameters": false,
- "noFallthroughCasesInSwitch": true
- },
- "include": ["src"]
-}
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
deleted file mode 100644
index 004c6cd..0000000
--- a/frontend/vite.config.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { defineConfig } from 'vite';
-import { VitePWA } from 'vite-plugin-pwa';
-
-
-
-export default defineConfig({
- plugins: [
- VitePWA({
- registerType: 'autoUpdate',
- includeAssets: ['intro.wav', 'login.wav', 'sent1.wav', 'sent2.wav', 'sent3.wav', 'sent4.wav', 'sent5.wav', 'sent6.wav', 'uploadfail.wav', 'water1.wav', 'water2.wav', 'water3.wav', 'water4.wav', 'water5.wav', 'water6.wav', 'water7.wav', 'water8.wav', 'water9.wav', 'water10.wav', 'index.html'],
- manifest: {
- name: 'Notebrook',
- short_name: 'Notebrook',
- description: 'Notebrook, stream of consciousness accessible note taking',
- theme_color: '#ffffff',
- icons: [
- {
- src: 'icons/192x192.png',
- sizes: '192x192',
- type: 'image/png',
- },
- {
- src: 'icons/512x512.png',
- sizes: '512x512',
- type: 'image/png',
- },
- ],
- },
- workbox: {
-
- // workbox options for the service worker
- },
- }),
- ],
-});
\ No newline at end of file