diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 60a49fe70..d114f51c7 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -18,8 +18,8 @@ assignees: # Uses numberOfReviewers if unset. numberOfAssignees: 1 # A list of keywords to be skipped the process that add reviewers if pull requests include it -# skipKeywords: -# - wip +skipKeywords: + - dependabot # filterLabels: # # Run diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml deleted file mode 100644 index d42539bd8..000000000 --- a/.github/workflows/action.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: "Auto Assign" -on: - pull_request_target: - types: [opened] - -permissions: - pull-requests: write - contents: write - -jobs: - dependabot: - runs-on: ubuntu-latest - if: ${{ github.actor == 'dependabot[bot]' }} - steps: - - name: Dependabot metadata - id: dependabot-metadata - uses: dependabot/fetch-metadata@v1.6.0 - with: - github-token: "${{ secrets.GITHUB_TOKEN }}" - - name: Assign PR - uses: kentaro-m/auto-assign-action@v2.0.0 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - diff --git a/.github/workflows/deploy_nais.yaml b/.github/workflows/deploy_nais.yaml index 4aebed27d..c2f52c76e 100644 --- a/.github/workflows/deploy_nais.yaml +++ b/.github/workflows/deploy_nais.yaml @@ -49,7 +49,7 @@ jobs: uses: actions/checkout@v4 - name: Give GitHub Actions acces to docker repo - uses: webfactory/ssh-agent@v0.8.0 + uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.DOCKER_REPO_READ_KEY }} - name: Checkout docker @@ -76,7 +76,7 @@ jobs: - id: "auth" name: "Authenticate to Google Cloud" - uses: "google-github-actions/auth@v2.0.1" + uses: "google-github-actions/auth@v2.1.2" with: workload_identity_provider: "projects/906675412832/locations/global/workloadIdentityPools/ssb-identity-pool/providers/github-oidc-provider" service_account: "gh-ssb@nais-management-b3a7.iam.gserviceaccount.com" diff --git a/.github/workflows/manual_deploy_to_prod.yaml b/.github/workflows/manual_deploy_to_prod.yaml index 89efaa824..dd47f9b12 100644 --- a/.github/workflows/manual_deploy_to_prod.yaml +++ b/.github/workflows/manual_deploy_to_prod.yaml @@ -15,7 +15,7 @@ jobs: environment: 'production' steps: - name: Download workflow artifact - uses: dawidd6/action-download-artifact@v3.0.0 + uses: dawidd6/action-download-artifact@v3.1.2 with: workflow: deploy_to_prod.yaml branch: master diff --git a/.github/workflows/manual_deploy_to_qa.yaml b/.github/workflows/manual_deploy_to_qa.yaml index 0fcbadeea..e25b09043 100644 --- a/.github/workflows/manual_deploy_to_qa.yaml +++ b/.github/workflows/manual_deploy_to_qa.yaml @@ -15,7 +15,7 @@ jobs: environment: 'QA' steps: - name: Download workflow artifact - uses: dawidd6/action-download-artifact@v3.0.0 + uses: dawidd6/action-download-artifact@v3.1.2 with: workflow: deploy_to_qa.yaml branch: develop diff --git a/README.md b/README.md index b5061662e..d21546f86 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,9 @@ Run ``` npm run dev ``` -to start multiple webpack watches in parallel that will watch for changes in TypeScript, JavaScript and SCSS files. - -Most changes to files should then be ready after page refresh in a few seconds. +to start multiple watches in parallel that will watch for changes in TypeScript, JavaScript and SCSS files. +A browserSync instace will also be started. If you have a page open (edit or preview mode) it should reload automatically on save. +If not, most changes to files should be ready after page refresh after a few seconds. #### Typescript interfaces Code-Gen We're using the `enonic-ts-codegen` library. This reads through all .xml config files and automatically creates interface files for all parts, layouts, pages, site-config, and content-types. This is a part of the gradle.build pipeline. So they will be regenerated and overwritten on every build. To change the interface you'll have to change the .xml, not the .ts interface files. diff --git a/build.gradle b/build.gradle index 498a7bbc3..a0c226082 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ dependencies { include "com.enonic.xp:lib-cluster:${xpVersion}" include "com.enonic.xp:lib-mail:${xpVersion}" include "com.enonic.xp:lib-scheduler:${xpVersion}" - implementation 'commons-codec:commons-codec:1.16.0' + implementation 'commons-codec:commons-codec:1.16.1' include "no.item:wsutil-server:2.0.0" include "com.gravitondigital:featuretogglelib:0.3.0" include 'org.json:json:20231013' @@ -65,54 +65,21 @@ node { version = '18.12.1' } -task clientJsWebpack( type: NpxTask, dependsOn: npmInstall ) { - command = 'webpack' - environment = [ 'NODE_ENV': nodeEnvironment() ] - args = [ '--config', 'webpack.clientjs.config.js', '--color' ] - description = 'Build client-side js.' - outputs.cacheIf { true } - inputs.dir 'src/main/resources/assets/js' - outputs.file "${buildDir}/resources/main/assets/js/bundle.js" +task compileAssets( type: NpmTask, dependsOn: npmInstall) { + args = [ + 'run', + 'build:asset' // This script must exist in the package.json file + ] + description 'Compile asset resources' } -task clientTsWebpack( type: NpxTask, dependsOn: npmInstall ) { - command = 'webpack' - environment = [ 'NODE_ENV': nodeEnvironment() ] - args = [ '--config', 'webpack.clientts.config.js', '--color' ] - description = 'Build client-side ts.' - outputs.cacheIf { true } - inputs.dir 'src/main/resources/assets/ts' - outputs.file "${buildDir}/resources/main/assets/ts/bundle.js" -} -task stylesWebpack( type: NpxTask, dependsOn: npmInstall ) { - command = 'webpack' - environment = [ 'NODE_ENV': nodeEnvironment() ] - args = [ '--config', 'webpack.styles.config.js', '--color' ] - description = 'Build client-side css.' - outputs.cacheIf { true } - inputs.dir 'src/main/resources/assets/styles' - outputs.file "${buildDir}/resources/main/assets/styles/bundle.css" -} - -task serverWebpack( type: NpxTask, dependsOn: npmInstall ) { - command = 'webpack' - environment = [ 'NODE_ENV': nodeEnvironment() ] - args = [ '--config', 'webpack.server.config.js', '--color'] - description = 'Build server JS.' - outputs.cacheIf { true } - inputs.dir 'src/main/resources/tasks' - inputs.dir 'src/main/resources/lib' - inputs.dir 'src/main/resources/services' - inputs.dir 'src/main/resources/site' - inputs.dir 'src/main/resources/admin' - inputs.file 'src/main/resources/main.es6' - outputs.dir "${buildDir}/resources/main/tasks" - outputs.dir "${buildDir}/resources/main/lib" - outputs.dir "${buildDir}/resources/main/services" - outputs.dir "${buildDir}/resources/main/site" - outputs.dir "${buildDir}/resources/main/admin" - outputs.file "${buildDir}/resources/main/main.js" +task compileServer( type: NpmTask, dependsOn: npmInstall) { + args = [ + 'run', + 'build:server' // This script must exist in the package.json file + ] + description 'Compile server resources' } task react4xp(type: NpmTask, dependsOn: npmInstall) { @@ -142,6 +109,7 @@ processResources { exclude '**/*.es' exclude '**/*.es6' exclude '**/*.ts' + exclude '**/*.test.js' exclude 'assets/js/**/*.js' include 'assets/js/bundle.js' exclude 'assets/styles/**/*.less' @@ -156,17 +124,14 @@ jar { exclude 'assets/styles/**/*.scss' exclude 'assets/styles/**/*.js' - // serverWebpack.dependsOn += 'react4xp_components' // 'webpack_react4xp' - serverWebpack.dependsOn += generateTypeScript { + compileServer.dependsOn += generateTypeScript { singleQuote = true prependText = "/* eslint-disable prettier/prettier */ \n // WARNING: This file was automatically generated by no.item.xp.codegen. You may lose your changes if you edit it." } dependsOn += npmInstall - dependsOn += clientJsWebpack - dependsOn += clientTsWebpack - dependsOn += stylesWebpack - dependsOn += serverWebpack + dependsOn += compileAssets + dependsOn += compileServer } def nodeEnvironment() { diff --git a/docs/BuildPipeline.md b/docs/BuildPipeline.md index 5696e7976..725099dc1 100644 --- a/docs/BuildPipeline.md +++ b/docs/BuildPipeline.md @@ -5,9 +5,7 @@ Caching is enabled on most parts of the build, so it should only run the necessa Steps: 1. npmInstall - installs npm packages 2. generateTypeScriptInterfaces - generates ts interfaces from enonic xml configs -3. clientJsWebpack - generates `/assets/js/bundle.js` from `/assets/js/main.es6` -4. clientTsWebpack - generates `/assets/ts/bundle.js` from `/assets/ts/main.ts` +3. compileAssets - generates compiled assets files from `/src/main/resources/assets` +4. compileServer - generates compiled JS from `.ts` and `.es6` files to be used server-side on XP 5. [react4xp](./React4xp.md) -6. serverWebpack - transforms all .es6 and .ts files **not** in `/assets` to .js, but ignores all config files generated from `generateTypeScriptInterfaces` -7. stylesWebpack - generates `/assets/styles/bundle.css` from `/assets/styles/main.scss` -8. [testWebpack](./Testing.md) +6. [testWebpack](./Testing.md) diff --git a/docs/ErrorHandling.md b/docs/ErrorHandling.md index 5329fd274..cf65e4e6a 100644 --- a/docs/ErrorHandling.md +++ b/docs/ErrorHandling.md @@ -14,9 +14,9 @@ the part content and rendering in the try part, and a error rendering function in the catch part. ```&typescript -const { renderError } = __non_webpack_require__( '/lib/error/error') +import { renderError } from '/lib/error/error' -export function get(req: Request): Response { +export function get(req: XP.Request): XP.Response { try { return renderPart(req) } catch (e) { @@ -24,7 +24,7 @@ export function get(req: Request): Response { } } -function renderPart(req: Request): Response { +function renderPart(req: XP.Request): XP.Response { ... part logic ... } diff --git a/docs/MimirXPRepo.md b/docs/MimirXPRepo.md index d66bb28ad..996e4b7d1 100644 --- a/docs/MimirXPRepo.md +++ b/docs/MimirXPRepo.md @@ -17,12 +17,11 @@ _OBS_ : the examples are self-referential and use other functions from the same Execute `callback: () => T` using SuperUser credentials **Example** -```javascript -const repo: RepoLibrary = __non_webpack_require__('/lib/xp/repo') - +```typescript +import { get } from '/lib/xp/repo' const getRepo = (repoName, branch) => { return withSuperUserContex(repoName, branch, () => { - return repo.get(repoName); + return get(repoName); }); } ``` diff --git a/docs/React4xp.md b/docs/React4xp.md index 7b607d544..2f0c96550 100644 --- a/docs/React4xp.md +++ b/docs/React4xp.md @@ -1,19 +1,25 @@ # React4xp + ## Server-side Rendering (SSR) -We should try to use server-side rendering for all react components because of crawlers or other that run the website without javascript. For now, there are at least one case where we can't use SSR for now, and that is where we need to use `dangerouslySetInnerHTML` for HTML Content. Ref. [issue](https://github.com/enonic/lib-react4xp/issues/33) + +We should try to use server-side rendering for all react components because of crawlers or other that run the website without javascript. For now, there are at least one case where we can't use SSR for now, and that is where we need to use `dangerouslySetInnerHTML` for HTML Content. Remember to always sanitize input before using it in dangerouslySetInnerHTML. Ref. [issue](https://github.com/enonic/lib-react4xp/issues/33) Example for SSR only: [Breadcrumbs.jsx](/src/main/resources/react4xp/_entries/Breadcrumb.jsx) and [default.es6](/src/main/resources/site/pages/default/default.es6) ## Hydrate (Without SSR) + If there are problems where SSR doesn't work at all, `ssr: false` can be used in render functions. We should try to never use it, because then the part will never be visible/rendered for non-js users. ## SSR and Hydrate + Hydration is needed for react components with client side interaction. You need to add pageContributions for this to work (ref. [factBox.ts](/src/main/resources/site/parts/factBox/factBox.ts)). ## LifeCycle and State + If we want to make more complex components/containers for react we can create classes that extends the React.Component class. This will open of for the possibility to use [state](https://reactjs.org/docs/state-and-lifecycle.html#adding-local-state-to-a-class) and [lifecycles](https://reactjs.org/docs/react-component.html#the-component-lifecycle). Ref. [Header.jsx](/src/main/resources/react4xp/_entries/Header.jsx) ## Entries + It is important that any file in `react4xp/_entries` is not imported into any other file. An entry is a bridge between XP and React, not a reusable React component. They should only be used through the various render methods in `lib-react4xp` in our controllers. After you've run `enonic project build` or `enonic project deploy` at least once, you'll have a file in your build folder with a list of all react4xp components available. `/build/resources/main/assets/react4xp/entries.json` diff --git a/docs/i18n.md b/docs/i18n.md index bb0651a16..45a71a613 100644 --- a/docs/i18n.md +++ b/docs/i18n.md @@ -18,12 +18,11 @@ information about how to use i18n functions in the controllers. Use `localize` to get the right phrases. -```(javascript) -const {localize} = __non_webpack_require__('/lib/xp/i18n') -const {getLanguage} = __non_webpack_require__('/lib/language') +```(typescript) +import { localize } from '/lib/xp/i18n' +import { getLanguage } from '/lib/language' -exports.get = (req) => { - +export function get(req: XP.Request) { const currentLanguage = getLanguage(req) const searchPlaceholder = localize({ diff --git a/gradle.properties b/gradle.properties index fc436ffae..be7e46d72 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Gradle Project settings projectName = mimir -version = 2.3.0 +version = 2.4.0 # XP App values appDisplayName = Mimir application diff --git a/jest.config.js b/jest.config.js index 28a8bd091..0af250627 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,5 @@ module.exports = { - testMatch: ['**/src/**/*-test.[tj]s?(x)'], + testMatch: ['**/src/**/*.test.[tj]s?(x)'], moduleNameMapper: { // Example: If relying on relative imports in ts files to make test work one might need to map the module here '^/lib/vendor/(.*)$': '/src/main/resources/lib/vendor/$1', diff --git a/package-lock.json b/package-lock.json index 2437e1455..a6eba0c80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,20 +10,22 @@ "license": "ISC", "dependencies": { "bootstrap": "~5.3.2", - "core-js": "~3.35.1", - "date-fns": "~2.30.0", + "core-js": "~3.36.0", + "date-fns": "~3.3.1", "highcharts-react-official": "~3.2.1", - "react-bootstrap": "~2.9.2", + "react-bootstrap": "~2.10.1", "react-ga": "~3.3.1", "react-select": "~5.8.0", "redux-logger": "~3.0.6", + "schema-dts": "^1.1.2", "striptags": "~3.2.0", "uuid": "~9.0.1", + "xss": "^1.0.14", "zipcelx": "~1.6.2" }, "devDependencies": { "@babel/cli": "~7.23.9", - "@babel/core": "~7.23.7", + "@babel/core": "~7.23.9", "@babel/preset-env": "~7.23.9", "@babel/preset-react": "~7.23.3", "@babel/preset-stage-0": "~7.8.3", @@ -51,6 +53,7 @@ "@enonic-types/lib-websocket": "7.13.5", "@enonic/react-components": "~3.1.2", "@enonic/react4xp": "4.1.0", + "@enonic/tsup-plugin-manifest": "^0.0.1", "@item-enonic-types/global": "~7.13.1", "@item-enonic-types/lib-cache": "~2.2.0", "@item-enonic-types/lib-cristin": "~1.3.1", @@ -60,21 +63,21 @@ "@item-enonic-types/lib-thymeleaf": "~2.1.0", "@item-enonic-types/lib-time": "~1.0.3", "@reduxjs/toolkit": "~1.9.7", - "@statisticsnorway/ssb-component-library": "~2.0.97", + "@statisticsnorway/ssb-component-library": "~2.0.98", "@types/ramda": "~0.29.10", - "@types/react": "~18.2.48", + "@types/react": "~18.2.58", "@types/uuid": "~9.0.8", - "@types/validator": "~13.11.8", + "@types/validator": "~13.11.9", "@types/zipcelx": "~1.5.2", - "@typescript-eslint/eslint-plugin": "~6.18.1", - "@typescript-eslint/parser": "~6.19.0", "autoprefixer": "~10.4.16", "axios": "~1.6.0", "babel-loader": "~9.1.3", "babel-preset-env": "~1.7.0", + "browser-sync": "^3.0.2", "cross-env": "~7.0.3", - "css-loader": "~6.9.1", "cssnano": "~6.0.1", + "esbuild-plugin-replace": "^1.4.0", + "esbuild-sass-plugin": "^2.16.1", "eslint": "~8.56.0", "eslint-config-google": "~0.14.0", "eslint-config-prettier": "~9.1.0", @@ -90,18 +93,17 @@ "jquery": "~3.7.1", "jquery-bridget": "~3.0.1", "jquery-ui-dist": "~1.13.2", - "js-base64": "~3.7.6", + "js-base64": "~3.7.7", "jsonstat-toolkit": "~1.4.2", "lodash": "~4.17.21", "mini-css-extract-plugin": "~2.8.0", "npm-run-all": "~4.1.5", "npm-safe-install": "~1.1.0", "numeral": "~2.0.6", - "popper.js": "~1.16.1", - "postcss": "~8.4.33", + "postcss": "~8.4.35", "postcss-loader": "~8.1.0", "postcss-normalize": "~10.0.1", - "prettier": "~3.2.2", + "prettier": "~3.2.5", "prop-types": "~15.8.1", "q-i": "~2.0.1", "ramda": "~0.29.1", @@ -118,21 +120,18 @@ "redux-injectors": "~1.3.0", "redux-saga": "~1.3.0", "regenerator-runtime": "~0.14.1", - "sass": "~1.70.0", - "sass-loader": "~13.3.3", + "sass": "~1.71.1", "style-loader": "~3.3.4", - "swc-loader": "~0.2.3", + "swc-loader": "~0.2.6", "ts-loader": "~9.5.1", + "tsup": "^8.0.2", "typescript": "~5.2.2", + "typescript-eslint": "^7.0.2", "validator": "~13.11.0", - "webpack": "~5.89.0", + "webpack": "~5.90.3", "webpack-bundle-analyzer": "~4.10.1", "webpack-cli": "~5.1.4", "xlsx": "~0.18.5" - }, - "engines": { - "node": ">= 16.1.0", - "npm": ">= 6.14.8" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -228,9 +227,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -238,11 +237,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -575,14 +574,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", - "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -602,9 +601,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2033,23 +2032,23 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -2058,8 +2057,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2068,9 +2067,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2486,10 +2485,630 @@ "webpack-cli": "^5" } }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@enonic/react4xp/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@enonic/react4xp/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@enonic/react4xp/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@enonic/react4xp/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@enonic/react4xp/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@enonic/react4xp/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@enonic/react4xp/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@enonic/react4xp/node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@enonic/react4xp/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/@enonic/react4xp/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==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@enonic/react4xp/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@enonic/react4xp/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/@enonic/react4xp/node_modules/tsup": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.2.0.tgz", + "integrity": "sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==", + "dev": true, + "dependencies": { + "bundle-require": "^4.0.0", + "cac": "^6.7.12", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.18.2", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^4.0.1", + "resolve-from": "^5.0.0", + "rollup": "^3.2.5", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.20.3", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@enonic/react4xp/node_modules/tsup/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@enonic/react4xp/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==", + "dev": true + }, + "node_modules/@enonic/react4xp/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==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/@enonic/tsup-plugin-manifest": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@enonic/tsup-plugin-manifest/-/tsup-plugin-manifest-0.0.1.tgz", + "integrity": "sha512-AL3X7xm6S8iE6bDbFP4Fnb9pOUembe/YpiAVw5/Dfj494ckiT42eeRb3HEFEFyiWrRjqP5weGb18t+sqL+GZfw==", + "dev": true, + "dependencies": { + "colorette": "^2.0.20" + }, + "peerDependencies": { + "esbuild": "~0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -2503,9 +3122,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -2519,9 +3138,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -2535,9 +3154,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -2551,9 +3170,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -2567,9 +3186,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -2583,9 +3202,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -2599,9 +3218,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -2615,9 +3234,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -2631,9 +3250,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -2647,9 +3266,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -2663,9 +3282,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -2679,9 +3298,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -2695,9 +3314,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -2711,9 +3330,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -2727,9 +3346,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -2743,9 +3362,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -2759,9 +3378,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -2775,9 +3394,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -2791,9 +3410,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -2807,9 +3426,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -2823,9 +3442,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -4188,6 +4807,175 @@ "react": ">=16.14.0" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4212,10 +5000,16 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "node_modules/@statisticsnorway/ssb-component-library": { - "version": "2.0.97", - "resolved": "https://registry.npmjs.org/@statisticsnorway/ssb-component-library/-/ssb-component-library-2.0.97.tgz", - "integrity": "sha512-WR8ghyn14p60YAVsMg+IRJ4b1vj8TgmqYTVydJfpv+/Y/NqUk7TLWppLAiPOcjalbrPangFC99Cye5FqYfG79g==", + "version": "2.0.98", + "resolved": "https://registry.npmjs.org/@statisticsnorway/ssb-component-library/-/ssb-component-library-2.0.98.tgz", + "integrity": "sha512-D3412g2RLyHp5g2Itms8+WQBoFrop7a2TCV6jSIRugPjBUowzB4Sp0qUWUff4OVo2LQejU+wG7yZJ8bM9ItJRA==", "dev": true, "dependencies": { "prismjs": "^1.29.0", @@ -4426,9 +5220,9 @@ } }, "node_modules/@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true }, "node_modules/@swc/helpers": { @@ -4504,6 +5298,21 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "8.44.6", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", @@ -4525,9 +5334,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/graceful-fs": { @@ -4614,9 +5423,9 @@ } }, "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.2.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.58.tgz", + "integrity": "sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4658,9 +5467,9 @@ "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -4676,9 +5485,9 @@ "dev": true }, "node_modules/@types/validator": { - "version": "13.11.8", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.8.tgz", - "integrity": "sha512-c/hzNDBh7eRF+KbCf+OoZxKbnkpaK/cKp9iLQWqB7muXtM+MtL9SUUH8vCFcLn6dH1Qm05jiexK0ofWY7TfOhQ==", + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==", "dev": true }, "node_modules/@types/warning": { @@ -4708,16 +5517,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", - "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", + "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/type-utils": "6.18.1", - "@typescript-eslint/utils": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/type-utils": "7.0.2", + "@typescript-eslint/utils": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -4733,8 +5542,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4755,9 +5564,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4776,15 +5585,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", - "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", + "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", "debug": "^4.3.4" }, "engines": { @@ -4795,7 +5604,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4803,146 +5612,14 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", - "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.19.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", - "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", + "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1" + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4953,13 +5630,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", - "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz", + "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.18.1", - "@typescript-eslint/utils": "6.18.1", + "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/utils": "7.0.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -4971,7 +5648,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4980,9 +5657,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", - "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", + "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4993,13 +5670,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", - "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", + "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5057,9 +5734,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5078,17 +5755,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", - "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", + "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", "semver": "^7.5.4" }, "engines": { @@ -5099,7 +5776,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { @@ -5115,9 +5792,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5136,12 +5813,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", - "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", + "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/types": "7.0.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5360,6 +6037,19 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", @@ -5797,6 +6487,15 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -7023,6 +7722,21 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -7119,6 +7833,264 @@ "node": ">=8" } }, + "node_modules/browser-sync": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-3.0.2.tgz", + "integrity": "sha512-PC9c7aWJFVR4IFySrJxOqLwB9ENn3/TaXCXtAa0SzLwocLN3qMjN+IatbjvtCX92BjNXsY6YWg9Eb7F3Wy255g==", + "dev": true, + "dependencies": { + "browser-sync-client": "^3.0.2", + "browser-sync-ui": "^3.0.2", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-3.0.2.tgz", + "integrity": "sha512-tBWdfn9L0wd2Pjuz/NWHtNEKthVb1Y67vg8/qyGNtCqetNz5lkDkFnrsx5UhPNPYUO8vci50IWC/BhYaQskDiQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-3.0.2.tgz", + "integrity": "sha512-V3FwWAI+abVbFLTyJjXJlCMBwjc3GXf/BPGfwO2fMFACWbIGW9/4SrBOFYEOOtqzCjQE0Di+U3VIb7eES4omNA==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/browser-sync-ui/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync-ui/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==", + "dev": true + }, + "node_modules/browser-sync-ui/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync-ui/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync-ui/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/browser-sync/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/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==", + "dev": true + }, + "node_modules/browser-sync/node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/browser-sync/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/browser-sync/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -7151,6 +8123,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -7229,6 +8207,15 @@ "esbuild": ">=0.17" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -7654,16 +8641,64 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "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==", "dev": true }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-js": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", - "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -7688,6 +8723,19 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -7874,65 +8922,6 @@ "postcss": "^8.0.9" } }, - "node_modules/css-loader": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", - "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/css-mediaquery": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", @@ -7992,6 +8981,11 @@ "node": ">=4" } }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, "node_modules/cssnano": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", @@ -8106,18 +9100,12 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/debounce": { @@ -8347,6 +9335,15 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -8355,6 +9352,12 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8364,6 +9367,18 @@ "node": ">=8" } }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -8473,6 +9488,106 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/eazy-logger/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eazy-logger/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==", + "dev": true + }, + "node_modules/eazy-logger/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eazy-logger/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.614", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", @@ -8506,6 +9621,15 @@ "node": ">= 4" } }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -8515,6 +9639,91 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -8697,9 +9906,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -8709,28 +9918,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/esbuild-plugin-manifest": { @@ -8742,6 +9952,28 @@ "esbuild": "~0" } }, + "node_modules/esbuild-plugin-replace": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-replace/-/esbuild-plugin-replace-1.4.0.tgz", + "integrity": "sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==", + "dev": true, + "dependencies": { + "magic-string": "^0.25.7" + } + }, + "node_modules/esbuild-sass-plugin": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.16.1.tgz", + "integrity": "sha512-mBB2aEF0xk7yo+Q9pSUh8xYED/1O2wbAM6IauGkDrqy6pl9SbJNakLeLGXiNpNujWIudu8TJTZCv2L5AQYRXtA==", + "dev": true, + "dependencies": { + "resolve": "^1.22.6", + "sass": "^1.7.3" + }, + "peerDependencies": { + "esbuild": "^0.19.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -8751,6 +9983,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -9256,12 +10494,27 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/ev-emitter": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz", "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==", "dev": true }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -9491,6 +10744,39 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -9671,6 +10957,15 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -10141,6 +11436,45 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -10156,16 +11490,16 @@ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", "dev": true }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=0.10.0" } }, "node_modules/ieee754": { @@ -10630,6 +11964,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -12973,9 +14316,9 @@ } }, "node_modules/js-base64": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.6.tgz", - "integrity": "sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", "dev": true }, "node_modules/js-tokens": { @@ -13241,6 +14584,12 @@ "node": ">=10" } }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -13371,6 +14720,12 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -13436,6 +14791,15 @@ "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==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -13524,6 +14888,15 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -13607,6 +14980,12 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -13657,6 +15036,15 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -14119,6 +15507,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14170,6 +15570,27 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -14274,6 +15695,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14478,21 +15908,33 @@ "node": ">=4" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "dependencies": { + "lodash": "^4.17.14" } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -14819,65 +16261,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/postcss-normalize": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", @@ -15136,9 +16519,9 @@ } }, "node_modules/prettier": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", - "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -15345,6 +16728,30 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -15357,9 +16764,9 @@ } }, "node_modules/react-bootstrap": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.2.tgz", - "integrity": "sha512-a36B+EHsAI/aH+ZhXNILBFnqscE3zr10dWmjBmfhIb2QR7KSXJiGzYd6Faf/25G8G7/CP9TCL2B0WhUBOD2UBQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.1.tgz", + "integrity": "sha512-J3OpRZIvCTQK+Tg/jOkRUvpYLHMdGeU9KqFUBQrV0d/Qr/3nsINpiOJyZMWnM5SJ3ctZdhPA6eCIKpEJR3Ellg==", "dependencies": { "@babel/runtime": "^7.22.5", "@restart/hooks": "^0.4.9", @@ -15897,6 +17304,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/reselect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", @@ -15963,6 +17376,34 @@ "node": ">=10" } }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -15992,18 +17433,34 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, @@ -16140,6 +17597,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, "node_modules/safe-array-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", @@ -16198,6 +17661,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/sanitize.css": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", @@ -16205,9 +17674,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -16221,43 +17690,6 @@ "node": ">=14.0.0" } }, - "node_modules/sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -16266,6 +17698,14 @@ "loose-envify": "^1.1.0" } }, + "node_modules/schema-dts": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.2.tgz", + "integrity": "sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==", + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, "node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -16328,15 +17768,198 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, "node_modules/set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", @@ -16371,6 +17994,12 @@ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -16517,6 +18146,82 @@ "node": ">=6" } }, + "node_modules/socket.io": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", + "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz", + "integrity": "sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -16553,6 +18258,13 @@ "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", + "dev": true + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -16636,6 +18348,37 @@ "webpack": ">=1.0.0" } }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-throttle/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -17017,10 +18760,13 @@ } }, "node_modules/swc-loader": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", - "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + }, "peerDependencies": { "@swc/core": "^1.2.147", "webpack": ">=2" @@ -17068,9 +18814,9 @@ } }, "node_modules/terser": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.23.0.tgz", - "integrity": "sha512-Iyy83LN0uX9ZZLCX4Qbu5JiHiWjOCTwrmM9InWOzVeM++KNWEsqV4YgN9U9E8AlohQ6Gs42ztczlWOG/lwDAMA==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -17086,16 +18832,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -17254,6 +19000,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -17279,12 +19034,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -17464,22 +19219,22 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsup": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.2.0.tgz", - "integrity": "sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.2.tgz", + "integrity": "sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==", "dev": true, "dependencies": { "bundle-require": "^4.0.0", "cac": "^6.7.12", "chokidar": "^3.5.1", "debug": "^4.3.1", - "esbuild": "^0.18.2", + "esbuild": "^0.19.2", "execa": "^5.0.0", "globby": "^11.0.3", "joycon": "^3.0.1", "postcss-load-config": "^4.0.1", "resolve-from": "^5.0.0", - "rollup": "^3.2.5", + "rollup": "^4.0.2", "source-map": "0.8.0-beta.0", "sucrase": "^3.20.3", "tree-kill": "^1.2.2" @@ -17489,14 +19244,18 @@ "tsup-node": "dist/cli-node.js" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", - "typescript": ">=4.1.0" + "typescript": ">=4.5.0" }, "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, "@swc/core": { "optional": true }, @@ -17508,395 +19267,6 @@ } } }, - "node_modules/tsup/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsup/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "node_modules/tsup/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -18150,7 +19520,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18168,6 +19537,31 @@ "typescript-logic": "^0.0.0" } }, + "node_modules/typescript-eslint": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.0.2.tgz", + "integrity": "sha512-Nsb+Dfi897ErE3CtVJYBECBQWPGEpCXLqLCQarBhFtyJsHnhA7O39GmtAmN3dmZ6bIp8tP5T+AOUrEdE07SBVg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.0.2", + "@typescript-eslint/parser": "7.0.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/typescript-logic": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", @@ -18183,6 +19577,29 @@ "typescript-compare": "^0.0.2" } }, + "node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -18267,6 +19684,15 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -18333,6 +19759,15 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -18384,6 +19819,15 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", "dev": true }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -18421,19 +19865,19 @@ "dev": true }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -18447,7 +19891,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -18971,6 +20415,35 @@ "node": ">=0.8" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/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/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -19186,9 +20659,9 @@ "dev": true }, "@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", @@ -19196,11 +20669,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19439,14 +20912,14 @@ } }, "@babel/helpers": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", - "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" } }, "@babel/highlight": { @@ -19460,9 +20933,9 @@ } }, "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -20413,20 +21886,20 @@ } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" } }, "@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "requires": { "@babel/code-frame": "^7.23.5", @@ -20435,16 +21908,16 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "requires": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -20848,159 +22321,500 @@ "swc-loader": "^0.2.3", "tsup": "^7.0.0", "webpack-stats-plugin": "^1.1.1" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "tsup": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.2.0.tgz", + "integrity": "sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==", + "dev": true, + "requires": { + "bundle-require": "^4.0.0", + "cac": "^6.7.12", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.18.2", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^4.0.1", + "resolve-from": "^5.0.0", + "rollup": "^3.2.5", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.20.3", + "tree-kill": "^1.2.2" + }, + "dependencies": { + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + } + } + }, + "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==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "@enonic/tsup-plugin-manifest": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@enonic/tsup-plugin-manifest/-/tsup-plugin-manifest-0.0.1.tgz", + "integrity": "sha512-AL3X7xm6S8iE6bDbFP4Fnb9pOUembe/YpiAVw5/Dfj494ckiT42eeRb3HEFEFyiWrRjqP5weGb18t+sqL+GZfw==", + "dev": true, + "requires": { + "colorette": "^2.0.20" } }, + "@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "dev": true, + "optional": true + }, "@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "dev": true, "optional": true }, @@ -22037,6 +23851,97 @@ } } }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "dev": true, + "optional": true + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -22061,10 +23966,16 @@ "@sinonjs/commons": "^3.0.0" } }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "@statisticsnorway/ssb-component-library": { - "version": "2.0.97", - "resolved": "https://registry.npmjs.org/@statisticsnorway/ssb-component-library/-/ssb-component-library-2.0.97.tgz", - "integrity": "sha512-WR8ghyn14p60YAVsMg+IRJ4b1vj8TgmqYTVydJfpv+/Y/NqUk7TLWppLAiPOcjalbrPangFC99Cye5FqYfG79g==", + "version": "2.0.98", + "resolved": "https://registry.npmjs.org/@statisticsnorway/ssb-component-library/-/ssb-component-library-2.0.98.tgz", + "integrity": "sha512-D3412g2RLyHp5g2Itms8+WQBoFrop7a2TCV6jSIRugPjBUowzB4Sp0qUWUff4OVo2LQejU+wG7yZJ8bM9ItJRA==", "dev": true, "requires": { "prismjs": "^1.29.0", @@ -22164,9 +24075,9 @@ "optional": true }, "@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true }, "@swc/helpers": { @@ -22239,6 +24150,21 @@ "@babel/types": "^7.20.7" } }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/eslint": { "version": "8.44.6", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", @@ -22260,9 +24186,9 @@ } }, "@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/graceful-fs": { @@ -22349,9 +24275,9 @@ } }, "@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.2.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.58.tgz", + "integrity": "sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -22393,9 +24319,9 @@ "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "@types/stack-utils": { @@ -22411,9 +24337,9 @@ "dev": true }, "@types/validator": { - "version": "13.11.8", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.8.tgz", - "integrity": "sha512-c/hzNDBh7eRF+KbCf+OoZxKbnkpaK/cKp9iLQWqB7muXtM+MtL9SUUH8vCFcLn6dH1Qm05jiexK0ofWY7TfOhQ==", + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==", "dev": true }, "@types/warning": { @@ -22443,16 +24369,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", - "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", + "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/type-utils": "6.18.1", - "@typescript-eslint/utils": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/type-utils": "7.0.2", + "@typescript-eslint/utils": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -22471,9 +24397,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22488,140 +24414,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", - "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", + "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", - "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0" - } - }, - "@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.19.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "@typescript-eslint/scope-manager": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", - "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", + "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", "dev": true, "requires": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1" + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2" } }, "@typescript-eslint/type-utils": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", - "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz", + "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.18.1", - "@typescript-eslint/utils": "6.18.1", + "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/utils": "7.0.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", - "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", + "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", - "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", + "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/visitor-keys": "6.18.1", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -22658,9 +24498,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22675,17 +24515,17 @@ } }, "@typescript-eslint/utils": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", - "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", + "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.18.1", - "@typescript-eslint/types": "6.18.1", - "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", "semver": "^7.5.4" }, "dependencies": { @@ -22699,9 +24539,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22716,12 +24556,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", - "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", + "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/types": "7.0.2", "eslint-visitor-keys": "^3.4.1" } }, @@ -22910,6 +24750,16 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", @@ -23244,6 +25094,12 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true + }, "asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -24286,6 +26142,18 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, "big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -24355,6 +26223,208 @@ "fill-range": "^7.0.1" } }, + "browser-sync": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-3.0.2.tgz", + "integrity": "sha512-PC9c7aWJFVR4IFySrJxOqLwB9ENn3/TaXCXtAa0SzLwocLN3qMjN+IatbjvtCX92BjNXsY6YWg9Eb7F3Wy255g==", + "dev": true, + "requires": { + "browser-sync-client": "^3.0.2", + "browser-sync-ui": "^3.0.2", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "browser-sync-client": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-3.0.2.tgz", + "integrity": "sha512-tBWdfn9L0wd2Pjuz/NWHtNEKthVb1Y67vg8/qyGNtCqetNz5lkDkFnrsx5UhPNPYUO8vci50IWC/BhYaQskDiQ==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + } + }, + "browser-sync-ui": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-3.0.2.tgz", + "integrity": "sha512-V3FwWAI+abVbFLTyJjXJlCMBwjc3GXf/BPGfwO2fMFACWbIGW9/4SrBOFYEOOtqzCjQE0Di+U3VIb7eES4omNA==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -24367,6 +26437,12 @@ "update-browserslist-db": "^1.0.13" } }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -24416,6 +26492,12 @@ "load-tsconfig": "^0.2.3" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, "cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -24733,16 +26815,57 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, "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==", "dev": true }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, "core-js": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", - "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==" + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==" }, "core-js-compat": { "version": "3.35.1", @@ -24758,6 +26881,16 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -24879,48 +27012,6 @@ "dev": true, "requires": {} }, - "css-loader": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", - "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "css-mediaquery": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", @@ -24962,6 +27053,11 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, "cssnano": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", @@ -25049,12 +27145,9 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "requires": { - "@babel/runtime": "^7.21.0" - } + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==" }, "debounce": { "version": "1.2.1", @@ -25213,17 +27306,35 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true + }, "diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -25306,6 +27417,81 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "requires": { + "chalk": "4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.614", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", @@ -25330,6 +27516,12 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -25339,6 +27531,61 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } + }, + "engine.io-client": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true + }, "enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -25488,33 +27735,34 @@ "dev": true }, "esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "esbuild-plugin-manifest": { @@ -25524,12 +27772,37 @@ "dev": true, "requires": {} }, + "esbuild-plugin-replace": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-replace/-/esbuild-plugin-replace-1.4.0.tgz", + "integrity": "sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==", + "dev": true, + "requires": { + "magic-string": "^0.25.7" + } + }, + "esbuild-sass-plugin": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.16.1.tgz", + "integrity": "sha512-mBB2aEF0xk7yo+Q9pSUh8xYED/1O2wbAM6IauGkDrqy6pl9SbJNakLeLGXiNpNujWIudu8TJTZCv2L5AQYRXtA==", + "dev": true, + "requires": { + "resolve": "^1.22.6", + "sass": "^1.7.3" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -25894,12 +28167,24 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, "ev-emitter": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-2.1.2.tgz", "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==", "dev": true }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -26083,6 +28368,38 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -26205,6 +28522,12 @@ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -26548,6 +28871,38 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, "human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -26560,12 +28915,14 @@ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", "dev": true }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": {} + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ieee754": { "version": "1.2.1", @@ -26878,6 +29235,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, "is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -28599,9 +30965,9 @@ } }, "js-base64": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.6.tgz", - "integrity": "sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", "dev": true }, "js-tokens": { @@ -28833,6 +31199,12 @@ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -28941,6 +31313,12 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -29003,6 +31381,15 @@ "yallist": "^3.0.2" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -29078,6 +31465,12 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -29130,6 +31523,12 @@ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -29165,6 +31564,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -29500,6 +31905,15 @@ "es-abstract": "^1.22.1" } }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -29536,6 +31950,23 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + } + } + }, "optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -29607,6 +32038,12 @@ "lines-and-columns": "^1.1.6" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -29752,16 +32189,31 @@ } } }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "dev": true + "portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "requires": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } }, "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "requires": { "nanoid": "^3.3.7", @@ -29945,42 +32397,6 @@ "postcss-selector-parser": "^6.0.5" } }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, "postcss-normalize": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", @@ -30143,9 +32559,9 @@ "dev": true }, "prettier": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", - "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true }, "prettier-linter-helpers": { @@ -30284,6 +32700,24 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -30293,9 +32727,9 @@ } }, "react-bootstrap": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.2.tgz", - "integrity": "sha512-a36B+EHsAI/aH+ZhXNILBFnqscE3zr10dWmjBmfhIb2QR7KSXJiGzYd6Faf/25G8G7/CP9TCL2B0WhUBOD2UBQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.1.tgz", + "integrity": "sha512-J3OpRZIvCTQK+Tg/jOkRUvpYLHMdGeU9KqFUBQrV0d/Qr/3nsINpiOJyZMWnM5SJ3ctZdhPA6eCIKpEJR3Ellg==", "requires": { "@babel/runtime": "^7.22.5", "@restart/hooks": "^0.4.9", @@ -30716,6 +33150,12 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "reselect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", @@ -30766,6 +33206,33 @@ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -30782,11 +33249,25 @@ } }, "rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "requires": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@types/estree": "1.0.5", "fsevents": "~2.3.2" } }, @@ -30875,6 +33356,12 @@ "queue-microtask": "^1.2.2" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, "safe-array-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", @@ -30912,6 +33399,12 @@ "is-regex": "^1.1.4" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sanitize.css": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", @@ -30919,9 +33412,9 @@ "dev": true }, "sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -30929,15 +33422,6 @@ "source-map-js": ">=0.6.2 <2.0.0" } }, - "sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", - "dev": true, - "requires": { - "neo-async": "^2.6.2" - } - }, "scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -30946,6 +33430,12 @@ "loose-envify": "^1.1.0" } }, + "schema-dts": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.2.tgz", + "integrity": "sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==", + "requires": {} + }, "schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -30993,15 +33483,175 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, "set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", @@ -31030,6 +33680,12 @@ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -31139,6 +33795,61 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, + "socket.io": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", + "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } + }, + "socket.io-client": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz", + "integrity": "sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -31168,6 +33879,12 @@ } } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -31241,6 +33958,30 @@ "lodash": "^4.17.4" } }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -31509,11 +34250,13 @@ } }, "swc-loader": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", - "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", "dev": true, - "requires": {} + "requires": { + "@swc/counter": "^0.1.3" + } }, "synckit": { "version": "0.8.6", @@ -31545,9 +34288,9 @@ } }, "terser": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.23.0.tgz", - "integrity": "sha512-Iyy83LN0uX9ZZLCX4Qbu5JiHiWjOCTwrmM9InWOzVeM++KNWEsqV4YgN9U9E8AlohQ6Gs42ztczlWOG/lwDAMA==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -31565,16 +34308,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "dependencies": { "schema-utils": { @@ -31679,6 +34422,12 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -31698,9 +34447,9 @@ "dev": true }, "ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", "dev": true, "requires": {} }, @@ -31839,211 +34588,27 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "tsup": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.2.0.tgz", - "integrity": "sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.2.tgz", + "integrity": "sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==", "dev": true, "requires": { "bundle-require": "^4.0.0", "cac": "^6.7.12", "chokidar": "^3.5.1", "debug": "^4.3.1", - "esbuild": "^0.18.2", + "esbuild": "^0.19.2", "execa": "^5.0.0", "globby": "^11.0.3", "joycon": "^3.0.1", "postcss-load-config": "^4.0.1", "resolve-from": "^5.0.0", - "rollup": "^3.2.5", + "rollup": "^4.0.2", "source-map": "0.8.0-beta.0", "sucrase": "^3.20.3", "tree-kill": "^1.2.2" }, "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -32232,8 +34797,7 @@ "typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==" }, "typescript-compare": { "version": "0.0.2", @@ -32244,6 +34808,16 @@ "typescript-logic": "^0.0.0" } }, + "typescript-eslint": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.0.2.tgz", + "integrity": "sha512-Nsb+Dfi897ErE3CtVJYBECBQWPGEpCXLqLCQarBhFtyJsHnhA7O39GmtAmN3dmZ6bIp8tP5T+AOUrEdE07SBVg==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "7.0.2", + "@typescript-eslint/parser": "7.0.2" + } + }, "typescript-logic": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", @@ -32259,6 +34833,12 @@ "typescript-compare": "^0.0.2" } }, + "ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "dev": true + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -32322,6 +34902,12 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -32358,6 +34944,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, "uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -32396,6 +34988,12 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", "dev": true }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -32430,19 +35028,19 @@ "dev": true }, "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -32456,7 +35054,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -32819,6 +35417,28 @@ "word": "~0.3.0" } }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true + }, + "xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "dependencies": { + "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==" + } + } + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index adeeab43e..49c0631ff 100644 --- a/package.json +++ b/package.json @@ -4,29 +4,23 @@ "description": "New cms for ssb.no", "main": "index.js", "scripts": { - "dev": "run-p dev:styles dev:clientjs dev:clientts dev:server dev:react4xp", - "dev:styles": "webpack --config webpack.styles.config.js --color --watch --mode development", - "dev:clientjs": "webpack --config webpack.clientjs.config.js --color --watch --mode development", - "dev:clientts": "webpack --config webpack.clientts.config.js --color --watch --mode development", - "dev:server": "webpack --config webpack.server.config.js --color --watch --mode development", - "dev:react4xp": "cross-env WATCH=true NODE_ENV=development R4X_APP_NAME=mimir R4X_DIR_PATH_ABSOLUTE_PROJECT=$INIT_CWD npm run components:react4xp", - "components:react4xp": "npm explore @enonic/react4xp -- npm run webpack:components", - "build:clientjs": "webpack --config webpack.clientjs.config.js --color", - "build:clientts": "webpack --config webpack.clientts.config.js --color", - "build:server": "webpack --config webpack.server.config.js --color", - "build:react4xp": "cross-env WATCH=false R4X_APP_NAME=mimir R4X_DIR_PATH_ABSOLUTE_PROJECT=$INIT_CWD npm run compile:react4xp", + "dev": "run-p watch:asset watch:server watch:style watch:browserSync watch:react4xp", "build": "run-p -c build:* --mode:production", - "dist:clientjs": "cross-env NODE_ENV=production webpack --config webpack.clientjs.config.js --color", - "dist:clientts": "cross-env NODE_ENV=production webpack --config webpack.clientts.config.js --color", - "dist:server": "cross-env NODE_ENV=production webpack --config webpack.server.config.js --color", - "dist": "run-p -c dist:*", + "build:asset": "npx tsup -d build/resources/main/assets", + "build:server": "npx tsup -d build/resources/main", + "build:react4xp": "cross-env WATCH=false R4X_APP_NAME=mimir R4X_DIR_PATH_ABSOLUTE_PROJECT=$INIT_CWD npm run compile:react4xp", + "watch:asset": "cross-env NODE_ENV=development npm run build:asset -- --watch", + "watch:style": "cross-env NODE_ENV=development npx sass \"src/main/resources/assets/styles/main.scss\":\"build/resources/main/assets/styles/bundle.css\" \"src/main/resources/assets/styles/main_menu.scss\":\"build/resources/main/assets/styles/bundle_menu.css\" --load-path=node_modules --load-path=node_modules/bootstrap/scss --watch --style=expanded", + "watch:server": "cross-env NODE_ENV=development npm run build:server -- --watch", + "watch:react4xp": "cross-env WATCH=true NODE_ENV=development R4X_APP_NAME=mimir R4X_DIR_PATH_ABSOLUTE_PROJECT=$INIT_CWD npm run components:react4xp", + "watch:browserSync": "npx browser-sync start --files \"src/main/resources/**/*.html\" \"src/main/resources/**/*.xml\" \"src/main/resources/**/*.jsx\" \"src/main/resources/**/*.scss\" \"build/resources/main\" --reload-delay 0 --no-snippet --watch", + "components:react4xp": "npm explore @enonic/react4xp -- npm run webpack:components", "compile:react4xp": "npm explore @enonic/react4xp -- npm run build:react4xp", "start": "enonic project deploy --dev", "install:dev": "nsi", "install:prod": "npm install", "lint": "eslint --fix ./src --ext .es6 --ext .ts --ext .jsx", "lint-dry": "eslint ./src --ext .es6 --ext .ts --ext .jsx", - "gradlew-dev-mode": "cross-env NODE_ENV=development ./gradlew clientJsWebpack stylesWebpack serverWebpack -t", "test": "jest" }, "repository": { @@ -41,7 +35,7 @@ "homepage": "https://github.com/statisticsnorway/mimir#readme", "devDependencies": { "@babel/cli": "~7.23.9", - "@babel/core": "~7.23.7", + "@babel/core": "~7.23.9", "@babel/preset-env": "~7.23.9", "@babel/preset-react": "~7.23.3", "@babel/preset-stage-0": "~7.8.3", @@ -69,6 +63,7 @@ "@enonic-types/lib-websocket": "7.13.5", "@enonic/react-components": "~3.1.2", "@enonic/react4xp": "4.1.0", + "@enonic/tsup-plugin-manifest": "^0.0.1", "@item-enonic-types/global": "~7.13.1", "@item-enonic-types/lib-cache": "~2.2.0", "@item-enonic-types/lib-cristin": "~1.3.1", @@ -78,21 +73,21 @@ "@item-enonic-types/lib-thymeleaf": "~2.1.0", "@item-enonic-types/lib-time": "~1.0.3", "@reduxjs/toolkit": "~1.9.7", - "@statisticsnorway/ssb-component-library": "~2.0.97", + "@statisticsnorway/ssb-component-library": "~2.0.98", "@types/ramda": "~0.29.10", - "@types/react": "~18.2.48", + "@types/react": "~18.2.58", "@types/uuid": "~9.0.8", - "@types/validator": "~13.11.8", + "@types/validator": "~13.11.9", "@types/zipcelx": "~1.5.2", - "@typescript-eslint/eslint-plugin": "~6.18.1", - "@typescript-eslint/parser": "~6.19.0", "autoprefixer": "~10.4.16", "axios": "~1.6.0", "babel-loader": "~9.1.3", "babel-preset-env": "~1.7.0", + "browser-sync": "^3.0.2", "cross-env": "~7.0.3", - "css-loader": "~6.9.1", "cssnano": "~6.0.1", + "esbuild-plugin-replace": "^1.4.0", + "esbuild-sass-plugin": "^2.16.1", "eslint": "~8.56.0", "eslint-config-google": "~0.14.0", "eslint-config-prettier": "~9.1.0", @@ -108,18 +103,17 @@ "jquery": "~3.7.1", "jquery-bridget": "~3.0.1", "jquery-ui-dist": "~1.13.2", - "js-base64": "~3.7.6", + "js-base64": "~3.7.7", "jsonstat-toolkit": "~1.4.2", "lodash": "~4.17.21", "mini-css-extract-plugin": "~2.8.0", "npm-run-all": "~4.1.5", "npm-safe-install": "~1.1.0", "numeral": "~2.0.6", - "popper.js": "~1.16.1", - "postcss": "~8.4.33", + "postcss": "~8.4.35", "postcss-loader": "~8.1.0", "postcss-normalize": "~10.0.1", - "prettier": "~3.2.2", + "prettier": "~3.2.5", "prop-types": "~15.8.1", "q-i": "~2.0.1", "ramda": "~0.29.1", @@ -136,14 +130,15 @@ "redux-injectors": "~1.3.0", "redux-saga": "~1.3.0", "regenerator-runtime": "~0.14.1", - "sass": "~1.70.0", - "sass-loader": "~13.3.3", + "sass": "~1.71.1", "style-loader": "~3.3.4", - "swc-loader": "~0.2.3", + "swc-loader": "~0.2.6", "ts-loader": "~9.5.1", + "tsup": "^8.0.2", "typescript": "~5.2.2", + "typescript-eslint": "^7.0.2", "validator": "~13.11.0", - "webpack": "~5.89.0", + "webpack": "~5.90.3", "webpack-bundle-analyzer": "~4.10.1", "webpack-cli": "~5.1.4", "xlsx": "~0.18.5" @@ -159,21 +154,19 @@ "@babel/preset-typescript" ] }, - "engines": { - "node": ">= 16.1.0", - "npm": ">= 6.14.8" - }, "dependencies": { "bootstrap": "~5.3.2", - "core-js": "~3.35.1", - "date-fns": "~2.30.0", + "core-js": "~3.36.0", + "date-fns": "~3.3.1", "highcharts-react-official": "~3.2.1", - "react-bootstrap": "~2.9.2", + "react-bootstrap": "~2.10.1", "react-ga": "~3.3.1", "react-select": "~5.8.0", "redux-logger": "~3.0.6", + "schema-dts": "^1.1.2", "striptags": "~3.2.0", "uuid": "~9.0.1", + "xss": "^1.0.14", "zipcelx": "~1.6.2" }, "overrides": { @@ -185,4 +178,4 @@ "react-dom": "$react-dom" } } -} \ No newline at end of file +} diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index a30e46f75..000000000 --- a/postcss.config.js +++ /dev/null @@ -1,17 +0,0 @@ -const env = require('./util/env') - -const isProd = env.prod - -const plugins = Object.assign( - { - 'postcss-normalize': {}, - 'autoprefixer': {} - }, - isProd ? { - cssnano: {} - } : {} -) - -module.exports = { - plugins -} diff --git a/src/main/resources/admin/tools/dashboard/dashboard.es6 b/src/main/resources/admin/tools/dashboard/dashboard.es6 index 4e2135309..e006ecb06 100644 --- a/src/main/resources/admin/tools/dashboard/dashboard.es6 +++ b/src/main/resources/admin/tools/dashboard/dashboard.es6 @@ -1,13 +1,12 @@ +import { assetUrl, serviceUrl } from '/lib/xp/portal' +import { getUser, hasRole } from '/lib/xp/auth' +import { getToolUrl } from '/lib/xp/admin' import { parseContributions } from '/lib/ssb/utils/utils' -const { assetUrl, serviceUrl } = __non_webpack_require__('/lib/xp/portal') - -const { render } = __non_webpack_require__('/lib/thymeleaf') -const { renderError } = __non_webpack_require__('/lib/ssb/error/error') -const { React4xp } = __non_webpack_require__('/lib/enonic/react4xp') -const { getUser, hasRole } = __non_webpack_require__('/lib/xp/auth') -const { getToolUrl } = __non_webpack_require__('/lib/xp/admin') -const { isEnabled } = __non_webpack_require__('/lib/featureToggle') +import { render } from '/lib/thymeleaf' +import { renderError } from '/lib/ssb/error/error' +import { React4xp } from '/lib/enonic/react4xp' +import { isEnabled } from '/lib/featureToggle' const view = resolve('./dashboard.html') const DEFAULT_CONTENTSTUDIO_URL = getToolUrl('com.enonic.app.contentstudio', 'main') diff --git a/src/main/resources/assets/js/app/highchart.es6 b/src/main/resources/assets/js/app/highchart.es6 index 8494becea..0afc561fa 100644 --- a/src/main/resources/assets/js/app/highchart.es6 +++ b/src/main/resources/assets/js/app/highchart.es6 @@ -6,6 +6,7 @@ import Highcharts from 'highcharts' import highchartsModuleData from 'highcharts/modules/data' import highchartsModuleAccessibility from 'highcharts/modules/accessibility' import highchartsModuleExporting from 'highcharts/modules/exporting' +import highchartsModuleOfflineExporting from 'highcharts/modules/offline-exporting' import highchartsModuleNoDataToDisplay from 'highcharts/modules/no-data-to-display' import highchartsModuleExportData from 'highcharts/modules/export-data' import zipcelx from 'zipcelx/lib/legacy' @@ -15,8 +16,9 @@ import accessibilityLang from '../highchart-lang.json' // Initialize exporting module. highchartsModuleData(Highcharts) highchartsModuleAccessibility(Highcharts) -highchartsModuleExporting(Highcharts) highchartsModuleNoDataToDisplay(Highcharts) +highchartsModuleExporting(Highcharts) +highchartsModuleOfflineExporting(Highcharts) highchartsModuleExportData(Highcharts) const EMPTY_CONFIG = { @@ -112,6 +114,10 @@ export function init() { } } + if (canvas.data('type') === 'bar' || canvas.data('type') === 'column') { + config.yAxis.reversedStacks = false + } + config.plotOptions.series.events = { legendItemClick: function (e) { // Possible bug: untested browser support for browserEvent (but works in IE8, chrome, FF...) @@ -156,9 +162,7 @@ export function init() { event_label: label, }) - this.exportChart({ - type: 'png', - }) + this.exportChartLocal() //png is default }, }, downloadJPEG: { @@ -169,8 +173,8 @@ export function init() { event_label: label, }) - this.exportChart({ - type: 'jpeg', + this.exportChartLocal({ + type: 'image/jpeg', }) }, }, @@ -182,7 +186,7 @@ export function init() { event_label: label, }) - this.exportChart({ + this.exportChartLocal({ type: 'application/pdf', }) }, @@ -195,8 +199,8 @@ export function init() { event_label: label, }) - this.exportChart({ - type: 'svg', + this.exportChartLocal({ + type: 'image/svg+xml', }) }, }, diff --git a/src/main/resources/assets/js/app/map.es6 b/src/main/resources/assets/js/app/map.es6 index ff63b2b47..9bc1cff3f 100644 --- a/src/main/resources/assets/js/app/map.es6 +++ b/src/main/resources/assets/js/app/map.es6 @@ -48,7 +48,7 @@ function init() { if (!e.seriesOptions) { const chart = this const mapKey = 'no-fylke-' + e.point.drilldown - const fail = setTimeout(function () { + let fail = setTimeout(function () { if (!Highcharts.maps[mapKey]) { chart.showLoading(' Failed loading ' + e.point.name) fail = setTimeout(function () { diff --git a/src/main/resources/assets/js/app/menuDropdown.es6 b/src/main/resources/assets/js/app/menuDropdown.es6 deleted file mode 100644 index 77065af5a..000000000 --- a/src/main/resources/assets/js/app/menuDropdown.es6 +++ /dev/null @@ -1,117 +0,0 @@ -// Only used in menuDropdown part - -import $ from 'jquery' -import 'bootstrap/js/dist/collapse' - -// Markup according to Bootstrap 4 collapse element - see https://getbootstrap.com/docs/4.3/components/collapse/ -// Dependencies: jQuery and Bootstrap -// Belongs to part menu-dropdown -// - adds visibility class for muncipality when on top of page (sticky part of page) -function init() { - $(function () { - let animate - const map = $('#js-show-map') - - $('.show-map').on('click', (e) => { - e.preventDefault() - e.stopPropagation() - - const el = $('.part-menu-dropdown')[0] - - const { top } = el.getBoundingClientRect() - - const onSwingTimeout = () => { - map.collapse('show') - } - - if (top > 1) { - animate = true - - const pos = $(el).offset() - $('html') - .stop() - .animate( - { - scrollTop: pos.top, - }, - 400, - 'swing', - () => { - animate = false - setTimeout(onSwingTimeout, 50) - } - ) - } - }) - - map.on('show.bs.collapse', () => { - map.parent().addClass('map-container') - $('.show-map').attr('aria-expanded', 'true').addClass('active') - - if (window.innerWidth <= 720) { - // Bootstrap md width - $('#search-container').collapse('hide') - $('.show-search').removeClass('active') - } - - $('.show-search') - .parent() - .on('click', () => { - $('.show-map').removeClass('active') - }) - }) - - map.on('hide.bs.collapse', () => { - map.parent().removeClass('map-container') - $('.show-map').attr('aria-expanded', 'false').removeClass('active') - map.css('transition', 'none') - }) - - $('.part-menu-dropdown').each((i, el) => { - $(window).on('scroll', () => { - const { top } = el.getBoundingClientRect() - - top > 0 && $(el).removeClass('border-bottom shadow-sm').find('.opacity-zero').removeClass('opacity-one') - - top === 0 && $(el).addClass('border-bottom shadow-sm').find('.opacity-zero').addClass('opacity-one') - - top > 0 && !animate && map.length - - const stickyMenu = document.getElementById('sticky-menu') - if (stickyMenu) { - const boundingRect = stickyMenu.getBoundingClientRect() - const stickyTop = boundingRect.top - if (stickyTop < 0) { - stickyMenu.style.height = `${boundingRect.height}px` - $(el).addClass('fixed-top') - } else if (stickyTop > 0) { - stickyMenu.style.height = null - $(el).removeClass('fixed-top') - } - } - }) - }) - - $('#search-container').on('show.bs.collapse', () => { - $('#search-container').removeClass('hide-search') - $('.show-search').addClass('active') - $('.show-map').attr('aria-expanded', 'false').removeClass('active') - }) - - $('#search-container').on('hide.bs.collapse', () => { - $('.show-search').removeClass('active') - }) - - $('#input-query-municipality').attr({ - 'data-display': 'static', - 'data-toggle': 'dropdown', - role: 'button', - 'aria-haspopup': 'true', - 'aria-expanded': 'false', - }) - - $('#municipality-list').appendTo('.input-wrapper') - }) -} - -document.addEventListener('DOMContentLoaded', () => init(), false) diff --git a/src/main/resources/assets/js/main.es6 b/src/main/resources/assets/js/bundle.es6 similarity index 100% rename from src/main/resources/assets/js/main.es6 rename to src/main/resources/assets/js/bundle.es6 diff --git a/src/main/resources/assets/styles/_highchart.scss b/src/main/resources/assets/styles/_highchart.scss index 5602f78c5..9cdef2f1d 100644 --- a/src/main/resources/assets/styles/_highchart.scss +++ b/src/main/resources/assets/styles/_highchart.scss @@ -1,4 +1,4 @@ -.part-highchart { +.highchart-wrapper { .highcharts-credits { display: none; } diff --git a/src/main/resources/assets/styles/_layout.scss b/src/main/resources/assets/styles/_layout.scss index 2e3783be7..62c28aee6 100644 --- a/src/main/resources/assets/styles/_layout.scss +++ b/src/main/resources/assets/styles/_layout.scss @@ -58,6 +58,7 @@ @include media-breakpoint-down(md) { visibility: hidden; + display: none; &:after { visibility: hidden; diff --git a/src/main/resources/assets/styles/_map.scss b/src/main/resources/assets/styles/_map.scss index 8afdb75f4..5a8da7d36 100644 --- a/src/main/resources/assets/styles/_map.scss +++ b/src/main/resources/assets/styles/_map.scss @@ -11,6 +11,10 @@ opacity: 1; background-color: white; height: 70vh; + + @include media-breakpoint-down(md) { + height: 80vh; + } } .map-container { top: 92px; @@ -18,7 +22,7 @@ position: fixed; height: 100vh; z-index: 9999; - background-color: rgba(39,66,71,0.7); + background-color: rgba(39, 66, 71, 0.7); .part-map { @include media-breakpoint-down(md) { padding: 0px; diff --git a/src/main/resources/assets/styles/_menuDropdown.scss b/src/main/resources/assets/styles/_menuDropdown.scss index 408832ba1..84128526a 100644 --- a/src/main/resources/assets/styles/_menuDropdown.scss +++ b/src/main/resources/assets/styles/_menuDropdown.scss @@ -1,170 +1,136 @@ .part-menu-dropdown { + @include roboto; background-color: white; + .container { z-index: 3; } - .container >div { + + .menu-content { min-height: 92px; - @include media-breakpoint-down(md) { - flex-direction: column !important; // Override d-flex - } } + .title-container { + opacity: 1; min-height: 92px; - @include media-breakpoint-down(md) { - width: 100%; - justify-content: start; - - .title-choose-municipality { - padding: 0; - } + + .subtitle { + font-size: 14px; } - @include media-breakpoint-down(sm) { - .municipality { - max-width: 70vw; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } + + .municipality { + font-size: 20px; + line-height: normal; } } - .opacity-zero { - opacity: 0; - } - .opacity-one { - opacity: 1; - transition: all .5s; - } - .municipality { - font-size: 20px; - line-height: normal; - } - .subtitle { - font-size: 14px; + + .search-container { + min-height: 92px; + .change-municipality { + margin-right: $spacer * 1.5; + } } - .dropdown { - left: 0; + + .municipality-mode { + .title-container { + opacity: 0; + } } - .dropdown-menu { - left: 0; - overflow-y: auto; - overflow-x: hidden; - max-height: 30vh; - min-width: 100%; + + &.fixed-top { + .municipality-mode { + .title-container { + opacity: 1; + } + } } - .show-map { + + button.show-map { + background: none; + border: none; + padding: 0; + cursor: pointer; + outline: inherit; + margin-left: 30px; text-decoration: none; color: #030303; &:focus { border: $ssb-green-4 1px solid; } - i { + svg { color: $green4; } - i.map { - padding: 3px 5px 5px 5px; - } - i.chevron svg { - transform: rotate(0deg); - transition: all .5s; - } - &[aria-expanded="true"]{ - i.map { - color: white; - background-color: $ssb-green-4; - } - i.chevron svg { - transform: rotate(-180deg); - transition: all .5s; - } - } - @include media-breakpoint-down(md) { - position: absolute; - top: 30px; - right: 55px; - } } + .ssb-dropdown { width: 100%; // Override design system min-width: 100%; // Override design system max-width: 100%; // Override design system } - .show-search { - color: $ssb-green-4; - right: 0px; - i.search { - padding: 3px 5px 5px 5px; - } - &[aria-expanded="true"] { - i.search { - color: white; - background-color: $ssb-green-4; - } - } - @include media-breakpoint-down(md) { - position: absolute; - top: 33px; - right: 65px; - } - } - .btn-drawer-toggler { - background: none; - border: none; - padding: 0; - cursor: pointer; - outline: inherit; - } - - #search-container { - display: flex; - align-items: center; - .change-municipality { - margin-right: $spacer * 1.5; - } - } - .card { - @include media-breakpoint-up(lg) { - display: flex; - flex-direction: row; - } - align-items: center; - border: none; - } @include media-breakpoint-down(md) { - .title-choose-municipality { - padding-left: 20px; - font-size: 28px; - } - .card { - border-radius: 0; - align-items: normal; + .title-container { + width: 100%; + justify-content: start; + padding: 10px 10px 20px; + + .municipality { + padding-left: 0; + font-size: 20px; + } } - #search-container { - border-top: 1px solid $ssb-green-2; + + .search-container { + top: 56px; + border-top: none; width: 100%; - top: 92px; position: absolute; - border-bottom: 1px solid #aaaaaa; background-color: #ffffff; - padding: 20px; + padding: 10px 10px 20px; + + .choose-municipality-search { + width: 100%; + display: block !important; - &.choose-municipality-search { - border: none; + .change-municipality { + padding-bottom: 10px; + } } - - &.hide-search { + .show-map { display: none; } } + + .municipality-mode { + .menu-content, + .title-container { + min-height: 56px; + } + + .search-container { + top: 0; + } + } + + &.fixed-top { + .title-container { + padding: 12px 20px 12px; + } + + .search-container { + display: none !important; + } + } } @include media-breakpoint-down(sm) { .title-container { - margin-left: 40px; - } - #search-container { - padding: 20px; + .municipality { + max-width: 70vw; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } } } } diff --git a/src/main/resources/assets/styles/_popper.scss b/src/main/resources/assets/styles/_popper.scss deleted file mode 100644 index cf5817c13..000000000 --- a/src/main/resources/assets/styles/_popper.scss +++ /dev/null @@ -1,172 +0,0 @@ -.link-anchor { - position: relative; - width: 0; - font-size: .8em; - opacity: 0; - transition: opacity .2s ease-in-out; -} -.anchor-wrapper { - border: none; -} -.anchor-wrapper:hover .link-anchor { - opacity: 1; -} - -section h1[id]:focus, -section h2[id]:focus, -section h3[id]:focus, -section h4[id]:focus, -section h5[id]:focus { - outline: 0; -} - -p.thin { - font-weight: 100; - margin: 0; - line-height: 1.2em; - color: #fff; -} - -p.bold { - font-weight: 900; - margin: 0; - margin-top: -5px; - color: #fff; -} - -.rel { - width: 30%; - margin: 0 auto; - position: relative; - text-align: center; - padding: 20px; - border-style: dotted; - border-color: white; - border-width: medium; -} - -.popper, -.tooltip { - z-index: 1; - position: absolute; - background: $dark5; - color: white; - width: 150px; - border-radius: 3px; - box-shadow: 0 0 2px rgba(0,0,0,0.5); - padding: 20px; - text-align: center; -} -.style5 .tooltip { - background: #1E252B; - color: #FFFFFF; - max-width: 200px; - width: auto; - font-size: .8rem; - padding: .5em 1em; -} -.popper .popper__arrow, -.tooltip .tooltip-arrow { - width: 0; - height: 0; - border-style: solid; - position: absolute; - margin: 5px; -} - -.tooltip .tooltip-arrow, -.popper .popper__arrow { - border-color: $dark5; -} -.style5 .tooltip .tooltip-arrow { - border-color: #1E252B; -} -.popper[x-placement^="top"], -.tooltip[x-placement^="top"] { - margin-bottom: 5px; -} -.popper[x-placement^="top"] .popper__arrow, -.tooltip[x-placement^="top"] .tooltip-arrow { - border-width: 5px 5px 0 5px; - border-left-color: transparent; - border-right-color: transparent; - border-bottom-color: transparent; - bottom: -5px; - left: calc(50% - 5px); - margin-top: 0; - margin-bottom: 0; -} -.popper[x-placement^="bottom"], -.tooltip[x-placement^="bottom"] { - margin-top: 5px; -} -.tooltip[x-placement^="bottom"] .tooltip-arrow, -.popper[x-placement^="bottom"] .popper__arrow { - border-width: 0 5px 5px 5px; - border-left-color: transparent; - border-right-color: transparent; - border-top-color: transparent; - top: -5px; - left: calc(50% - 5px); - margin-top: 0; - margin-bottom: 0; -} -.tooltip[x-placement^="right"], -.popper[x-placement^="right"] { - margin-left: 5px; -} -.popper[x-placement^="right"] .popper__arrow, -.tooltip[x-placement^="right"] .tooltip-arrow { - border-width: 5px 5px 5px 0; - border-left-color: transparent; - border-top-color: transparent; - border-bottom-color: transparent; - left: -5px; - top: calc(50% - 5px); - margin-left: 0; - margin-right: 0; -} -.popper[x-placement^="left"], -.tooltip[x-placement^="left"] { - margin-right: 5px; -} -.popper[x-placement^="left"] .popper__arrow, -.tooltip[x-placement^="left"] .tooltip-arrow { - border-width: 5px 0 5px 5px; - border-top-color: transparent; - border-right-color: transparent; - border-bottom-color: transparent; - right: -5px; - top: calc(50% - 5px); - margin-left: 0; - margin-right: 0; -} -.popper-wide { - text-align: left; - width: 250px; -} -.popper .btn-close { - top: 10px; - right: 10px; - position: absolute; - background-color: white; - border-radius: 50%; - padding: 2px; - padding-top: 0px; - font-size: 14px; - width: 25px; - height: 25px; - line-height: 14px; - &:hover { - background-color: $green1; - } -} -.popper .small p:last-child { - margin-bottom: 0; -} -.popper a { - color: white; -} -.popper a:hover { - color: #CCCCCC; -} diff --git a/src/main/resources/assets/styles/main.scss b/src/main/resources/assets/styles/main.scss index f36bd4ce9..a692d9cbc 100644 --- a/src/main/resources/assets/styles/main.scss +++ b/src/main/resources/assets/styles/main.scss @@ -35,7 +35,6 @@ $container-max-widths: ( @import "./variableCardsList"; @import "./layout"; @import "./banner"; -@import "./popper"; @import "./dropdown"; // TODO: remove when implemented correctly from design system @import "./highchart"; @import "./keyFigures"; @@ -166,4 +165,51 @@ section.part-divider + section.part-divider { display: -webkit-box; -webkit-line-clamp: 2; /* number of lines to show */ -webkit-box-orient: vertical; +} + +.link-anchor { + position: relative; + width: 0; + font-size: .8em; + opacity: 0; + transition: opacity .2s ease-in-out; +} +.anchor-wrapper { + border: none; +} +.anchor-wrapper:hover .link-anchor { + opacity: 1; +} + +section h1[id]:focus, +section h2[id]:focus, +section h3[id]:focus, +section h4[id]:focus, +section h5[id]:focus { + outline: 0; +} + +p.thin { + font-weight: 100; + margin: 0; + line-height: 1.2em; + color: #fff; +} + +p.bold { + font-weight: 900; + margin: 0; + margin-top: -5px; + color: #fff; +} + +.rel { + width: 30%; + margin: 0 auto; + position: relative; + text-align: center; + padding: 20px; + border-style: dotted; + border-color: white; + border-width: medium; } \ No newline at end of file diff --git a/src/main/resources/assets/tsconfig.client.json b/src/main/resources/assets/tsconfig.client.json deleted file mode 100644 index 30994133c..000000000 --- a/src/main/resources/assets/tsconfig.client.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../../../tsconfig", - "compilerOptions": { - "module": "commonjs", - "jsx": "react", - }, - "include": [ - "./**/*" - ] -} diff --git a/src/main/resources/assets/tsconfig.json b/src/main/resources/assets/tsconfig.json new file mode 100644 index 000000000..46a4b0e03 --- /dev/null +++ b/src/main/resources/assets/tsconfig.json @@ -0,0 +1,32 @@ +{ + "extends": "../../../../tsconfig", + "exclude": [ + "../../../../node_modules/typescript/lib/lib.es5.d.ts", + ], + "include": [ + "./**/*.tsx", + "./**/*.ts" + ], + "compilerOptions": { + //────────────────────────────────────────────────────────────────────── + // Modules + //────────────────────────────────────────────────────────────────────── + "baseUrl": ".", + "moduleResolution": "node", + "paths": {}, + "rootDir": ".", + "types": [ + "react" + ], + + //────────────────────────────────────────────────────────────────────── + // Language and Environment + //────────────────────────────────────────────────────────────────────── + "jsx": "react", + "lib": [ + "DOM", + "ES2020", + ], + "target": "ES2020" // Modern browsers + } +} diff --git a/src/main/resources/index.d.ts b/src/main/resources/index.d.ts index f3e31771b..52d454eec 100644 --- a/src/main/resources/index.d.ts +++ b/src/main/resources/index.d.ts @@ -74,6 +74,8 @@ declare global { namespace LayoutComponent { export type Triple = _LayoutComponent<'mimir:triple', XpLayoutMap['mimir:triple']> + export type Topic = _LayoutComponent<'mimir:topic', XpLayoutMap['mimir:topic']> + export type Columns = _LayoutComponent<'mimir:columns', XpLayoutMap['mimir:columns']> } } } diff --git a/src/main/resources/lib/browserSync.ts b/src/main/resources/lib/browserSync.ts new file mode 100644 index 000000000..0c319528b --- /dev/null +++ b/src/main/resources/lib/browserSync.ts @@ -0,0 +1,46 @@ +// source: https://raw.githubusercontent.com/enonic/starter-tsup/2d08bf54ef3d3b4a037e579c0ed3a7c7c1f9272c/src/main/resources/lib/browserSync.ts + +import { newCache } from '/lib/cache' +import { request as httpClientRequest } from '/lib/http-client' + +const isRunningCache = newCache({ + size: 1, + expire: 10, +}) + +export function getBrowserSyncUrl({ request }: { request: XP.Request }): string { + const { host, scheme } = request + return `${scheme}://${host}:${process.env.BROWSER_SYNC_PORT}/browser-sync/browser-sync-client.js` +} + +export function isRunning({ request }: { request: XP.Request }): boolean { + return isRunningCache.get('hardcoded-cache-key', () => { + try { + const requestParameters = { + url: getBrowserSyncUrl({ request }), + method: 'HEAD', + // headers: { + // 'Cache-Control': 'no-cache' + // }, + connectionTimeout: 1000, + readTimeout: 1000, + } + const response = httpClientRequest(requestParameters) + if (response.status !== 200) { + log.info( + 'Response status not 200 when checking for BrowserSync request:%s response:%s', + JSON.stringify(requestParameters, null, 2), + JSON.stringify(response, null, 2) + ) + return false + } + return true + } catch (e) { + return false + } + }) +} + +export function getBrowserSyncScript({ request }: { request: XP.Request }): string { + return `` +} diff --git a/src/main/resources/lib/ssb/cache/cache.ts b/src/main/resources/lib/ssb/cache/cache.ts index aad3394ef..3abfa80be 100644 --- a/src/main/resources/lib/ssb/cache/cache.ts +++ b/src/main/resources/lib/ssb/cache/cache.ts @@ -1,11 +1,11 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { listener, send, EnonicEvent, EnonicEventData } from '/lib/xp/event' import { query, get, Content } from '/lib/xp/content' import { run } from '/lib/xp/context' import { executeFunction, sleep, submitTask } from '/lib/xp/task' import { JSONstat } from '/lib/types/jsonstat-toolkit' import { TbmlDataUniform } from '/lib/types/xmlParser' -import { Socket } from '/lib/types/socket' +import { type Socket } from '/lib/wsUtil' import { newCache, Cache } from '/lib/cache' import { request, HttpResponse } from '/lib/http-client' @@ -587,7 +587,6 @@ export function setupHandlers(socket: Socket): void { } function purgeVarnishCache(): HttpResponse { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const baseUrl: string = app.config && app.config['ssb.internal.baseUrl'] ? app.config['ssb.internal.baseUrl'] : 'https://i.ssb.no' const response: HttpResponse = request({ diff --git a/src/main/resources/lib/ssb/cache/partCache.ts b/src/main/resources/lib/ssb/cache/partCache.ts index 696eb1c1f..f7023178c 100644 --- a/src/main/resources/lib/ssb/cache/partCache.ts +++ b/src/main/resources/lib/ssb/cache/partCache.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { Content } from '/lib/xp/content' import { newCache, Cache } from '/lib/cache' diff --git a/src/main/resources/lib/ssb/cache/subjectCache.ts b/src/main/resources/lib/ssb/cache/subjectCache.ts index efa8f717b..fbee283ee 100644 --- a/src/main/resources/lib/ssb/cache/subjectCache.ts +++ b/src/main/resources/lib/ssb/cache/subjectCache.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { Content } from '/lib/xp/content' import { newCache, Cache } from '/lib/cache' diff --git a/src/main/resources/lib/ssb/cron/rss.ts b/src/main/resources/lib/ssb/cron/rss.ts index 4f0ac9a39..3a865397a 100644 --- a/src/main/resources/lib/ssb/cron/rss.ts +++ b/src/main/resources/lib/ssb/cron/rss.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { Content } from '/lib/xp/content' import { StatisticInListing } from '/lib/ssb/dashboard/statreg/types' import { request, HttpResponse } from '/lib/http-client' diff --git a/src/main/resources/lib/ssb/dashboard/dashboard.ts b/src/main/resources/lib/ssb/dashboard/dashboard.ts index 57667d44d..cfc98a8bd 100644 --- a/src/main/resources/lib/ssb/dashboard/dashboard.ts +++ b/src/main/resources/lib/ssb/dashboard/dashboard.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { get as getContent, query, Content } from '/lib/xp/content' import { Node, NodeQueryResultHit } from '/lib/xp/node' import { run, type ContextParams } from '/lib/xp/context' @@ -8,7 +8,7 @@ import { localize } from '/lib/xp/i18n' import { executeFunction } from '/lib/xp/task' import { Events, QueryInfoNode, logUserDataQuery } from '/lib/ssb/repo/query' import { EVENT_LOG_REPO, EVENT_LOG_BRANCH, LogSummary, getQueryChildNodesStatus } from '/lib/ssb/repo/eventLog' -import { Socket, SocketEmitter } from '/lib/types/socket' +import { type Socket, type SocketEmitter } from '/lib/wsUtil' import { JSONstat } from '/lib/types/jsonstat-toolkit' import { TbmlDataUniform } from '/lib/types/xmlParser' import { DatasetRepoNode, DATASET_BRANCH, UNPUBLISHED_DATASET_BRANCH } from '/lib/ssb/repo/dataset' diff --git a/src/main/resources/lib/ssb/dashboard/statistic.ts b/src/main/resources/lib/ssb/dashboard/statistic.ts index 73f28049a..f1e29f81e 100644 --- a/src/main/resources/lib/ssb/dashboard/statistic.ts +++ b/src/main/resources/lib/ssb/dashboard/statistic.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { query, get as getContent, Content, ContentsResult } from '/lib/xp/content' import { run, type ContextParams } from '/lib/xp/context' @@ -10,7 +10,7 @@ import { executeFunction } from '/lib/xp/task' import { encrypt } from '/lib/cipher/cipher' import * as util from '/lib/util' import { Source, TbmlDataUniform } from '/lib/types/xmlParser' -import { Socket, SocketEmitter } from '/lib/types/socket' +import { type Socket, type SocketEmitter } from '/lib/wsUtil' import { EVENT_LOG_BRANCH, EVENT_LOG_REPO } from '/lib/ssb/repo/eventLog' import { withConnection, ENONIC_CMS_DEFAULT_REPO, getNode, queryNodes } from '/lib/ssb/repo/common' import { getTbprocessor, getTbprocessorKey } from '/lib/ssb/dataset/tbprocessor/tbprocessor' diff --git a/src/main/resources/lib/ssb/dashboard/statreg/index.ts b/src/main/resources/lib/ssb/dashboard/statreg/index.ts index 7123864ef..fde42ed73 100644 --- a/src/main/resources/lib/ssb/dashboard/statreg/index.ts +++ b/src/main/resources/lib/ssb/dashboard/statreg/index.ts @@ -7,7 +7,7 @@ import { refreshStatRegData, getStatRegNode, } from '/lib/ssb/repo/statreg' -import { Socket, SocketEmitter } from '/lib/types/socket' +import { type Socket, type SocketEmitter } from '/lib/wsUtil' import { StatRegLatestFetchInfoNode } from '/lib/ssb/statreg/eventLog' import { LogSummary, EVENT_LOG_BRANCH, EVENT_LOG_REPO, getQueryChildNodesStatus } from '/lib/ssb/repo/eventLog' import { Events, QueryInfo } from '/lib/ssb/repo/query' diff --git a/src/main/resources/lib/ssb/dataset/publish.ts b/src/main/resources/lib/ssb/dataset/publish.ts index 53ce99d02..e74609549 100644 --- a/src/main/resources/lib/ssb/dataset/publish.ts +++ b/src/main/resources/lib/ssb/dataset/publish.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { Content } from '/lib/xp/content' import { listener, EnonicEvent } from '/lib/xp/event' import { TaskInfo } from '/lib/xp/task' diff --git a/src/main/resources/lib/ssb/dataset/publishOld.ts b/src/main/resources/lib/ssb/dataset/publishOld.ts index b4bbc8889..a0cd2e0d6 100644 --- a/src/main/resources/lib/ssb/dataset/publishOld.ts +++ b/src/main/resources/lib/ssb/dataset/publishOld.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { get as getContent, Content } from '/lib/xp/content' import { NodeQueryResultHit } from '/lib/xp/node' import { send } from '/lib/xp/event' diff --git a/src/main/resources/lib/ssb/dataset/tbprocessor/tbmlMock.ts b/src/main/resources/lib/ssb/dataset/tbprocessor/tbmlMock.ts index d923e0d14..d9b29e77d 100644 --- a/src/main/resources/lib/ssb/dataset/tbprocessor/tbmlMock.ts +++ b/src/main/resources/lib/ssb/dataset/tbprocessor/tbmlMock.ts @@ -1,9 +1,8 @@ +import '/lib/ssb/polyfills/nashorn' import { ByteSource } from '/lib/xp/content' import { HttpResponse } from '/lib/http-client' import { format } from '/lib/vendor/dateFns' -__non_webpack_require__('/lib/ssb/polyfills/nashorn') - export function getTbmlMock(url: string): HttpResponse | null { if (app.config && app.config['ssb.mock.enable'] === 'true') { if (url.includes('process/tbmldata/-1')) { diff --git a/src/main/resources/lib/ssb/dataset/tbprocessor/tbprocessor.ts b/src/main/resources/lib/ssb/dataset/tbprocessor/tbprocessor.ts index e6181b52f..cf69d550d 100644 --- a/src/main/resources/lib/ssb/dataset/tbprocessor/tbprocessor.ts +++ b/src/main/resources/lib/ssb/dataset/tbprocessor/tbprocessor.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { Content } from '/lib/xp/content' import { DatasetRepoNode, DataSource as dataSourceType, getDataset, DATASET_BRANCH } from '/lib/ssb/repo/dataset' import { TbmlDataUniform, TbmlSourceListUniform } from '/lib/types/xmlParser' diff --git a/src/main/resources/lib/ssb/parts/highcharts/data/statBank.ts b/src/main/resources/lib/ssb/parts/highcharts/data/statBank.ts index d99281c69..85cd608ae 100644 --- a/src/main/resources/lib/ssb/parts/highcharts/data/statBank.ts +++ b/src/main/resources/lib/ssb/parts/highcharts/data/statBank.ts @@ -1,9 +1,9 @@ /* eslint-disable new-cap */ // @ts-nocheck -const { getMunicipality } = __non_webpack_require__('/lib/ssb/dataset/klass/municipalities') +import { getMunicipality } from '/lib/ssb/dataset/klass/municipalities' -const { DataSource: DataSourceType } = __non_webpack_require__('/lib/ssb/repo/dataset') +import { DataSource as DataSourceType } from '/lib/ssb/repo/dataset' export function seriesAndCategoriesFromJsonStat(req, highchart, dataset, datasetFormat) { const jsonStatConfig = datasetFormat.jsonStat || datasetFormat[DataSourceType.STATBANK_API] diff --git a/src/main/resources/lib/ssb/parts/highcharts/graph/config.ts b/src/main/resources/lib/ssb/parts/highcharts/graph/config.ts index 50b5a8cb7..eb2685d2e 100644 --- a/src/main/resources/lib/ssb/parts/highcharts/graph/config.ts +++ b/src/main/resources/lib/ssb/parts/highcharts/graph/config.ts @@ -46,16 +46,18 @@ export const createDefaultConfig = (highchartData, displayName, language) => ({ chart: { height: highchartData.heightAspectRatio > 0 ? `${highchartData.heightAspectRatio}%` : null, plotBorderColor: '#e6e6e6', - spacingBottom: 18, plotBorderWidth: 0, style: { fontFamily: '"Open Sans Regular", "Arial", "DejaVu Sans", sans-serif', fontSize: '14px', }, type: 'bar', - spacing: [0, 10, 0, 0], zoomType: highchartData.zoomType, - marginTop: 50, + spacingRight: 10, + spacingLeft: 0, + spacingBottom: 18, + spacingTop: highchartData.legendAlign === 'top' ? 18 : 0, + marginTop: highchartData.legendAlign === 'top' ? null : 50, }, // SSB color palette: colors: [ @@ -137,7 +139,7 @@ export const createDefaultConfig = (highchartData, displayName, language) => ({ legend: { enabled: !highchartData.noLegend, align: highchartData.legendAlign === 'right' ? 'right' : 'center', - verticalAlign: highchartData.legendAlign == 'right' ? 'top' : 'bottom', + verticalAlign: highchartData.legendAlign == 'right' || highchartData.legendAlign == 'top' ? 'top' : 'bottom', layout: highchartData.legendAlign == 'right' ? 'vertical' : 'horizontal', x: highchartData.legendAlign == 'right' ? 10 : 0, y: highchartData.legendAlign == 'right' ? 65 : 0, @@ -148,6 +150,7 @@ export const createDefaultConfig = (highchartData, displayName, language) => ({ fontSize: '12px', fontWeight: 'normal', }, + width: highchartData.legendAlign == 'top' ? '75%' : 'auto', useHTML: true, }, plotOptions: { diff --git a/src/main/resources/lib/ssb/parts/informationAlert.es6 b/src/main/resources/lib/ssb/parts/informationAlert.ts similarity index 80% rename from src/main/resources/lib/ssb/parts/informationAlert.es6 rename to src/main/resources/lib/ssb/parts/informationAlert.ts index a0ad82ef1..f0cf71c7f 100644 --- a/src/main/resources/lib/ssb/parts/informationAlert.es6 +++ b/src/main/resources/lib/ssb/parts/informationAlert.ts @@ -1,10 +1,10 @@ -const { query } = __non_webpack_require__('/lib/xp/content') -const { getContent } = __non_webpack_require__('/lib/xp/portal') +import { query } from '/lib/xp/content' +import { getContent } from '/lib/xp/portal' const contentTypeName = `${app.name}:informationAlert` const oldContentTypeName = `${app.name}:statisticAlert` // remove when this content type is not in use anymore -export const get = (key) => { +export const get = (key: { key: string }) => { const content = query({ contentTypes: [contentTypeName, oldContentTypeName], query: `_id = '${key.key}'`, @@ -16,7 +16,7 @@ export const get = (key) => { } } -export const list = (pageType, pageTypeId, statbankWeb) => { +export const list = (pageType: string, pageTypeId: string, statbankWeb: boolean) => { const now = new Date() let queryString = `(data.informationAlertVariations.pages.pageIds IN ('${pageTypeId}') OR data.informationAlertVariations.articles.articleIds IN ('${pageTypeId}'))` @@ -30,7 +30,7 @@ export const list = (pageType, pageTypeId, statbankWeb) => { queryString = `(data.informationAlertVariations.statbank.selectAllStatbankPages = 'true')` } - const language = getContent().language === 'en' ? 'en' : 'nb' // Alerts are the same for bokmål and nynorsk + const language = getContent()?.language === 'en' ? 'en' : 'nb' // Alerts are the same for bokmål and nynorsk const languageQuery = language !== 'en' ? 'AND language != "en"' : 'AND language = "en"' return query({ query: `${queryString} diff --git a/src/main/resources/lib/ssb/parts/keyFigure.ts b/src/main/resources/lib/ssb/parts/keyFigure.ts index 124188135..d8b0b384d 100644 --- a/src/main/resources/lib/ssb/parts/keyFigure.ts +++ b/src/main/resources/lib/ssb/parts/keyFigure.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' /* eslint-disable new-cap */ // @ts-ignore import JSONstat from 'jsonstat-toolkit/import.mjs' diff --git a/src/main/resources/lib/ssb/parts/menuDropdown.es6 b/src/main/resources/lib/ssb/parts/menuDropdown.ts similarity index 61% rename from src/main/resources/lib/ssb/parts/menuDropdown.es6 rename to src/main/resources/lib/ssb/parts/menuDropdown.ts index 476a1f436..4fedc13dd 100644 --- a/src/main/resources/lib/ssb/parts/menuDropdown.es6 +++ b/src/main/resources/lib/ssb/parts/menuDropdown.ts @@ -1,7 +1,8 @@ -const { query } = __non_webpack_require__('/lib/xp/content') +import { query } from '/lib/xp/content' + const contentTypeName = `${app.name}:menuDropdown` -export const getWithPath = (path) => +export const getWithPath = (path: string) => query({ contentTypes: [contentTypeName], count: 1, diff --git a/src/main/resources/lib/ssb/parts/municipalityAlert.es6 b/src/main/resources/lib/ssb/parts/municipalityAlert.ts similarity index 76% rename from src/main/resources/lib/ssb/parts/municipalityAlert.es6 rename to src/main/resources/lib/ssb/parts/municipalityAlert.ts index 559a7ddd0..fbd86748b 100644 --- a/src/main/resources/lib/ssb/parts/municipalityAlert.es6 +++ b/src/main/resources/lib/ssb/parts/municipalityAlert.ts @@ -1,8 +1,8 @@ -const { query } = __non_webpack_require__('/lib/xp/content') +import { query } from '/lib/xp/content' const contentTypeName = `${app.name}:municipalityAlert` -export const get = (key) => { +export const get = (key: { key: string }) => { const content = query({ contentTypes: [contentTypeName], query: `_id = '${key.key}'`, @@ -14,13 +14,13 @@ export const get = (key) => { } } -export const list = (municipalCode, municipalPageType) => { +export const list = (municipalCode: string, municipalPageType: string) => { const now = new Date() return query({ query: `(data.selectAllMunicipals = 'true' OR data.municipalCodes IN ('${municipalCode}')) AND (data.municipalPageType IN ('${municipalPageType}') OR data.municipalPageType = 'showOnAll') AND publish.from LIKE '*' AND (publish.to NOT LIKE '*' OR publish.to > '${now.toISOString()}')`, - contentType: contentTypeName, + contentTypes: [contentTypeName], }) } diff --git a/src/main/resources/lib/ssb/parts/permissions.ts b/src/main/resources/lib/ssb/parts/permissions.ts index 56177e4b3..0bcc761b8 100644 --- a/src/main/resources/lib/ssb/parts/permissions.ts +++ b/src/main/resources/lib/ssb/parts/permissions.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { getPermissions } from '/lib/xp/content' import { get as getContext, PrincipalKey } from '/lib/xp/context' diff --git a/src/main/resources/lib/ssb/parts/table.ts b/src/main/resources/lib/ssb/parts/table.ts index 66b5dbc07..c88cb6094 100644 --- a/src/main/resources/lib/ssb/parts/table.ts +++ b/src/main/resources/lib/ssb/parts/table.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' // @ts-ignore import striptags from 'striptags' import { Content } from '/lib/xp/content' diff --git a/src/main/resources/lib/ssb/polyfills/nashorn.es6 b/src/main/resources/lib/ssb/polyfills/nashorn.js similarity index 75% rename from src/main/resources/lib/ssb/polyfills/nashorn.es6 rename to src/main/resources/lib/ssb/polyfills/nashorn.js index aa35c14ac..5b2306b17 100644 --- a/src/main/resources/lib/ssb/polyfills/nashorn.es6 +++ b/src/main/resources/lib/ssb/polyfills/nashorn.js @@ -17,6 +17,31 @@ if (!String.prototype.includes) { } } +// String::padStart + +if (!String.prototype.padStart) { + // eslint-disable-next-line no-extend-native + String.prototype.padStart = function(targetLength, padString) { + targetLength = Math.floor(targetLength) || 0; + if(targetLength < this.length) return String(this); + + padString = padString ? String(padString) : " "; + + var pad = ""; + var len = targetLength - this.length; + var i = 0; + while(pad.length < len) { + if(!padString[i]) { + i = 0; + } + pad += padString[i]; + i++; + } + + return pad + String(this).slice(0); + }; +} + /** Array ************************************************************/ // Array::find @@ -171,3 +196,41 @@ if (!Array.prototype.findIndex) { writable: true, }) } + +/** Object ************************************************************/ + +// Object::assign + +if (!Object.assign) { + Object.assign = function(target, varArgs) { // .length of function is 2 + if (target == null) { // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } + + var to = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource != null) { // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }; +} + +/** Math **************************************************************/ + +// Math.trunc + +if (!Math.trunc) { + Math.trunc = function trunc(x) { + return x < 0 ? Math.ceil(x) : Math.floor(x); + }; +} \ No newline at end of file diff --git a/src/main/resources/lib/ssb/repo/bestbet.ts b/src/main/resources/lib/ssb/repo/bestbet.ts index b65381f19..f79927b20 100644 --- a/src/main/resources/lib/ssb/repo/bestbet.ts +++ b/src/main/resources/lib/ssb/repo/bestbet.ts @@ -32,7 +32,7 @@ export function setupBestBetRepo(): void { cronJobLog('BestBet Repo setup complete.') } -export function listBestBets(count?: number): ReadonlyArray | Node | null { +export function listBestBets(count?: number) { const nodes = getChildNodes(BESTBET_REPO, BESTBET_BRANCH, '/', count ? count : undefined) const ids: Array = nodes.hits.map((hit) => { return hit.id diff --git a/src/main/resources/lib/ssb/repo/dataset.ts b/src/main/resources/lib/ssb/repo/dataset.ts index d299aa57c..6ec1bce83 100644 --- a/src/main/resources/lib/ssb/repo/dataset.ts +++ b/src/main/resources/lib/ssb/repo/dataset.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { Node } from '/lib/xp/node' import { Repository } from '/lib/xp/repo' diff --git a/src/main/resources/lib/ssb/statreg/statistics.ts b/src/main/resources/lib/ssb/statreg/statistics.ts index 638f7cd25..d37ca3335 100644 --- a/src/main/resources/lib/ssb/statreg/statistics.ts +++ b/src/main/resources/lib/ssb/statreg/statistics.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { StatRegNode } from '/lib/ssb/repo/statreg' import { StatisticInListing, diff --git a/src/main/resources/lib/ssb/utils/articleUtils.ts b/src/main/resources/lib/ssb/utils/articleUtils.ts index a7d1ad1f2..52d1f487f 100644 --- a/src/main/resources/lib/ssb/utils/articleUtils.ts +++ b/src/main/resources/lib/ssb/utils/articleUtils.ts @@ -56,7 +56,10 @@ export function getAllArticles(req: XP.Request, language: string, start: 0, coun const languageQuery: string = language !== 'en' ? 'AND language != "en"' : 'AND language = "en"' const now: string = new Date().toISOString() const publishFromQuery = `(publish.from LIKE '*' AND publish.from < '${now}')` - const pagePaths: Array = mainSubjects.map((mainSubject) => `_parentPath LIKE "/content${mainSubject.path}/*"`) + const pagePaths: Array = mainSubjects.map((mainSubject) => `_parentPath LIKE "/content${mainSubject.path}*"`) + pagePaths.push(`_parentPath LIKE "/content/ssb/innrapportering*"`) + pagePaths.push(`_parentPath LIKE "/content/ssb/omssb*"`) + pagePaths.push(`_parentPath LIKE "/content/ssb/forskning*"`) const subjectQuery = `(${pagePaths.join(' OR ')})` const queryString = `${publishFromQuery} AND ${subjectQuery} ${languageQuery}` diff --git a/src/main/resources/lib/ssb/utils/filterReleasesUtils-test.js b/src/main/resources/lib/ssb/utils/filterReleasesUtils.test.js similarity index 100% rename from src/main/resources/lib/ssb/utils/filterReleasesUtils-test.js rename to src/main/resources/lib/ssb/utils/filterReleasesUtils.test.js diff --git a/src/main/resources/lib/ssb/utils/htmlUtils.ts b/src/main/resources/lib/ssb/utils/htmlUtils.ts new file mode 100644 index 000000000..7d4b615cd --- /dev/null +++ b/src/main/resources/lib/ssb/utils/htmlUtils.ts @@ -0,0 +1,9 @@ +import * as xss from 'xss' +/** + * Cleans the string preventing XSS attacks. + * @param html string that contains html + * @returns string with clean html + */ +export function sanitize(html: string): string { + return new xss.FilterXSS({ allowCommentTag: true, escapeHtml: (text) => text }).process(html) +} diff --git a/src/main/resources/lib/ssb/utils/language.ts b/src/main/resources/lib/ssb/utils/language.ts index 9acbcbfba..ca3537515 100644 --- a/src/main/resources/lib/ssb/utils/language.ts +++ b/src/main/resources/lib/ssb/utils/language.ts @@ -95,7 +95,7 @@ export const getPhrases = (page: Content, isSite?: boolean): Phrases | undefined } if (!isSite) { - return exports.getPhrases(getSite(), true) + return getPhrases(getSite()!, true) } return norwegian diff --git a/src/main/resources/lib/ssb/utils/utils.ts b/src/main/resources/lib/ssb/utils/utils.ts index 7ae1e24bd..fca95b080 100644 --- a/src/main/resources/lib/ssb/utils/utils.ts +++ b/src/main/resources/lib/ssb/utils/utils.ts @@ -160,7 +160,12 @@ export function randomUnsafeString(): string { * @returns HTML script tag ` + const url = assetUrl({ path }) + + return ` + + + ` } // @ts-ignore export const XP_RUN_MODE = ''.concat(Java.type('com.enonic.xp.server.RunMode').get()) diff --git a/src/main/resources/lib/ssb/utils/variantUtils.ts b/src/main/resources/lib/ssb/utils/variantUtils.ts index c4d5d9028..7ca58ff6d 100644 --- a/src/main/resources/lib/ssb/utils/variantUtils.ts +++ b/src/main/resources/lib/ssb/utils/variantUtils.ts @@ -422,7 +422,6 @@ function concatReleaseTimes( // If import from statreg failed use nextRelease instead of previousRelease export function nextReleasedPassed(variant: VariantInListing): boolean { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument const serverOffsetInMs: number = app.config && app.config['serverOffsetInMs'] ? parseInt(app.config['serverOffsetInMs']) : 0 const serverTime: Date = new Date(new Date().getTime() + serverOffsetInMs) diff --git a/src/main/resources/lib/types/socket.ts b/src/main/resources/lib/types/wsUtil.ts similarity index 62% rename from src/main/resources/lib/types/socket.ts rename to src/main/resources/lib/types/wsUtil.ts index fa0b2d061..9e2d25cd5 100644 --- a/src/main/resources/lib/types/socket.ts +++ b/src/main/resources/lib/types/wsUtil.ts @@ -1,9 +1,12 @@ +export declare function openWebsockets(exports: object): void + +export declare class SocketEmitter { + connect(callback: (socket: Socket) => void): void + broadcast: (event: string, data: string | object) => void +} + export interface Socket { id: string on: (event: string, handler: (options: object | undefined | string) => void) => void emit: (event: string, data: string | object | number) => void } - -export interface SocketEmitter { - broadcast: (event: string, data: string | object) => void -} diff --git a/src/main/resources/lib/vendor/dateFns.ts b/src/main/resources/lib/vendor/dateFns.ts index 0e77082e8..4ea2646bc 100644 --- a/src/main/resources/lib/vendor/dateFns.ts +++ b/src/main/resources/lib/vendor/dateFns.ts @@ -1,19 +1,20 @@ +import '/lib/ssb/polyfills/nashorn' import { type Locale } from 'date-fns' export { Locale } -export { default as nb } from 'date-fns/locale/nb' -export { default as nn } from 'date-fns/locale/nn' -export { default as enGB } from 'date-fns/locale/en-GB' -export { default as parseISO } from 'date-fns/parseISO' -export { default as format } from 'date-fns/format' -export { default as isWithinInterval } from 'date-fns/isWithinInterval' -export { default as addDays } from 'date-fns/addDays' -export { default as subDays } from 'date-fns/subDays' -export { default as getMonth } from 'date-fns/getMonth' -export { default as getYear } from 'date-fns/getYear' -export { default as getDate } from 'date-fns/getDate' -export { default as isAfter } from 'date-fns/isAfter' -export { default as isBefore } from 'date-fns/isBefore' -export { default as isSameDay } from 'date-fns/isSameDay' -export { default as isSameSecond } from 'date-fns/isSameSecond' -export { default as formatDistanceToNowStrict } from 'date-fns/formatDistanceToNowStrict' +export { nb } from 'date-fns/locale/nb' +export { nn } from 'date-fns/locale/nn' +export { enGB } from 'date-fns/locale/en-GB' +export { parseISO } from 'date-fns/parseISO' +export { format } from 'date-fns/format' +export { isWithinInterval } from 'date-fns/isWithinInterval' +export { addDays } from 'date-fns/addDays' +export { subDays } from 'date-fns/subDays' +export { getMonth } from 'date-fns/getMonth' +export { getYear } from 'date-fns/getYear' +export { getDate } from 'date-fns/getDate' +export { isAfter } from 'date-fns/isAfter' +export { isBefore } from 'date-fns/isBefore' +export { isSameDay } from 'date-fns/isSameDay' +export { isSameSecond } from 'date-fns/isSameSecond' +export { formatDistanceToNowStrict } from 'date-fns/formatDistanceToNowStrict' diff --git a/src/main/resources/main.es6 b/src/main/resources/main.es6 index bfd877157..2c2bac449 100644 --- a/src/main/resources/main.es6 +++ b/src/main/resources/main.es6 @@ -1,14 +1,14 @@ try { - const { setupEventLog } = __non_webpack_require__('/lib/ssb/repo/eventLog') - const { setupStatRegRepo } = __non_webpack_require__('/lib/ssb/repo/statreg') - const { setupDatasetRepo } = __non_webpack_require__('/lib/ssb/repo/dataset') - const { setupBestBetRepo } = __non_webpack_require__('/lib/ssb/repo/bestbet') - const cache = __non_webpack_require__('/lib/ssb/cache/cache') - const { setupFetchDataOnCreateListener } = __non_webpack_require__('/lib/ssb/dataset/listeners') - const { setupCronJobs } = __non_webpack_require__('/lib/ssb/cron/cron') - const { create } = __non_webpack_require__('/lib/featureToggle') - const { setupTaskListener } = __non_webpack_require__('/lib/ssb/dataset/publish') - const { setupArticleListener } = __non_webpack_require__('/lib/ssb/utils/articleUtils') + const { setupEventLog } = require('/lib/ssb/repo/eventLog') + const { setupStatRegRepo } = require('/lib/ssb/repo/statreg') + const { setupDatasetRepo } = require('/lib/ssb/repo/dataset') + const { setupBestBetRepo } = require('/lib/ssb/repo/bestbet') + const cache = require('/lib/ssb/cache/cache') + const { setupFetchDataOnCreateListener } = require('/lib/ssb/dataset/listeners') + const { setupCronJobs } = require('/lib/ssb/cron/cron') + const { create } = require('/lib/featureToggle') + const { setupTaskListener } = require('/lib/ssb/dataset/publish') + const { setupArticleListener } = require('/lib/ssb/utils/articleUtils') log.info('Application ' + app.name + ' started') // Log application started __.disposer(() => log.info('Application ' + app.name + ' stopped')) // Log application stoppped @@ -59,10 +59,6 @@ try { feature: 'highchart-react', enabled: false, }, - { - feature: 'enable-chat-script', - enabled: false, - }, { feature: 'highcharts-y-axix-title-mobile', enabled: false, @@ -107,6 +103,10 @@ try { feature: 'simple-statbank-part', enabled: false, }, + { + feature: 'structured-data', + enabled: false, + }, ], }, ]) diff --git a/src/main/resources/react4xp/_entries/Alerts.jsx b/src/main/resources/react4xp/_entries/Alerts.jsx index d9ca8f071..03ba275e1 100644 --- a/src/main/resources/react4xp/_entries/Alerts.jsx +++ b/src/main/resources/react4xp/_entries/Alerts.jsx @@ -2,6 +2,7 @@ import React from 'react' import { Dialog } from '@statisticsnorway/ssb-component-library' import { Container } from 'react-bootstrap' import PropTypes from 'prop-types' +import { sanitize } from '../../lib/ssb/utils/htmlUtils'; const Alerts = (props) => { return ( @@ -11,7 +12,7 @@ const Alerts = (props) => {
diff --git a/src/main/resources/react4xp/_entries/ArticleArchive.jsx b/src/main/resources/react4xp/_entries/ArticleArchive.jsx index eb4302d6f..e8ffe2569 100644 --- a/src/main/resources/react4xp/_entries/ArticleArchive.jsx +++ b/src/main/resources/react4xp/_entries/ArticleArchive.jsx @@ -5,6 +5,7 @@ import { ChevronDown } from 'react-feather' import { default as groupBy } from 'ramda/es/groupBy' import PropTypes from 'prop-types' import axios from 'axios' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' function ArticleArchive(props) { const { @@ -142,7 +143,7 @@ function ArticleArchive(props) {
diff --git a/src/main/resources/react4xp/_entries/AttachmentTablesFigures.jsx b/src/main/resources/react4xp/_entries/AttachmentTablesFigures.jsx index af0964452..505709458 100644 --- a/src/main/resources/react4xp/_entries/AttachmentTablesFigures.jsx +++ b/src/main/resources/react4xp/_entries/AttachmentTablesFigures.jsx @@ -5,6 +5,7 @@ import { ChevronDown, ChevronUp } from 'react-feather' import PropTypes from 'prop-types' import Table from '../table/Table' import { addGtagForEvent } from '/react4xp/ReactGA' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' function AttachmentTableFigures(props) { const [isHidden, setIsHidden] = useState(true) @@ -74,7 +75,7 @@ function AttachmentTableFigures(props) { function createMarkup(html) { return { - __html: html, + __html: sanitize(html), } } diff --git a/src/main/resources/react4xp/_entries/EntryLinks.jsx b/src/main/resources/react4xp/_entries/EntryLinks.jsx index 629cc9f51..358f8c7f5 100644 --- a/src/main/resources/react4xp/_entries/EntryLinks.jsx +++ b/src/main/resources/react4xp/_entries/EntryLinks.jsx @@ -1,6 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import { Link, Title } from '@statisticsnorway/ssb-component-library' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' class EntryLinks extends React.Component { renderIcon(icon) { @@ -8,7 +9,7 @@ class EntryLinks extends React.Component { ) diff --git a/src/main/resources/react4xp/_entries/FactBox.jsx b/src/main/resources/react4xp/_entries/FactBox.jsx index 7be01fa18..358d784c0 100644 --- a/src/main/resources/react4xp/_entries/FactBox.jsx +++ b/src/main/resources/react4xp/_entries/FactBox.jsx @@ -1,12 +1,13 @@ import React from 'react' import { FactBox as FactBoxComponent } from '@statisticsnorway/ssb-component-library' import PropTypes from 'prop-types' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' const FactBox = (props) => { const createText = (text) => (
) diff --git a/src/main/resources/react4xp/_entries/Header.jsx b/src/main/resources/react4xp/_entries/Header.jsx index 462573ed6..0f7a3c73b 100644 --- a/src/main/resources/react4xp/_entries/Header.jsx +++ b/src/main/resources/react4xp/_entries/Header.jsx @@ -2,6 +2,7 @@ import React, { useState, useCallback, useEffect } from 'react' import PropTypes from 'prop-types' import { Divider, Input, Link } from '@statisticsnorway/ssb-component-library' import { ChevronDown, ChevronRight, Menu, X } from 'react-feather' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' function Header(props) { const [showSubMenu, setShowSubMenu] = useState(false) @@ -59,7 +60,7 @@ function Header(props) { ) diff --git a/src/main/resources/react4xp/_entries/KpiCalculator.jsx b/src/main/resources/react4xp/_entries/KpiCalculator.jsx index 0d3521ff7..1645659f9 100644 --- a/src/main/resources/react4xp/_entries/KpiCalculator.jsx +++ b/src/main/resources/react4xp/_entries/KpiCalculator.jsx @@ -5,6 +5,7 @@ import { Input, Button, Dropdown, Divider, FormError, Link, Title } from '@stati import axios from 'axios' import { NumericFormat } from 'react-number-format' import { X } from 'react-feather' +import { sanitize } from '../../lib/ssb/utils/htmlUtils'; function KpiCalculator(props) { const validMaxYear = props.lastUpdated.year @@ -508,7 +509,7 @@ function KpiCalculator(props) {
) diff --git a/src/main/resources/react4xp/_entries/ModifiedDate.jsx b/src/main/resources/react4xp/_entries/ModifiedDate.jsx index d9a9cc5c4..5c31101bd 100644 --- a/src/main/resources/react4xp/_entries/ModifiedDate.jsx +++ b/src/main/resources/react4xp/_entries/ModifiedDate.jsx @@ -1,6 +1,7 @@ import React from 'react' import { Glossary } from '@statisticsnorway/ssb-component-library' import PropTypes from 'prop-types' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' const ModifiedDate = (props) => { return ( @@ -8,7 +9,7 @@ const ModifiedDate = (props) => { diff --git a/src/main/resources/react4xp/_entries/StatbankLinkList.jsx b/src/main/resources/react4xp/_entries/StatbankLinkList.jsx index 7f117828a..f80f0d506 100644 --- a/src/main/resources/react4xp/_entries/StatbankLinkList.jsx +++ b/src/main/resources/react4xp/_entries/StatbankLinkList.jsx @@ -2,6 +2,7 @@ import React from 'react' import { Link } from '@statisticsnorway/ssb-component-library' import { ArrowRight } from 'react-feather' import PropTypes from 'prop-types' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' const StatbankLinkList = (props) => { return ( @@ -15,7 +16,7 @@ const StatbankLinkList = (props) => { > diff --git a/src/main/resources/react4xp/accordion/Accordion.jsx b/src/main/resources/react4xp/accordion/Accordion.jsx index 63d969c63..cf80cb708 100644 --- a/src/main/resources/react4xp/accordion/Accordion.jsx +++ b/src/main/resources/react4xp/accordion/Accordion.jsx @@ -2,6 +2,7 @@ import React from 'react' import { Accordion as AccordionComponent, NestedAccordion } from '@statisticsnorway/ssb-component-library' import PropTypes from 'prop-types' +import { sanitize } from '../../lib/ssb/utils/htmlUtils' class Accordion extends React.Component { renderNestedAccordions(items) { @@ -14,7 +15,7 @@ class Accordion extends React.Component { createMarkup(html) { return { - __html: html.replace(/ /g, ' '), + __html: sanitize(html.replace(/ /g, ' ')), } } diff --git a/src/main/resources/react4xp/dashboard/components/ServerTime.jsx b/src/main/resources/react4xp/dashboard/components/ServerTime.jsx index 7a4d10fb8..072dedfaa 100644 --- a/src/main/resources/react4xp/dashboard/components/ServerTime.jsx +++ b/src/main/resources/react4xp/dashboard/components/ServerTime.jsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react' import PropTypes from 'prop-types' -import { default as format } from 'date-fns/format' +import { format } from 'date-fns/format' export function ServerTime(props) { const { serverTime, serverTimeReceived } = props diff --git a/src/main/resources/react4xp/dashboard/containers/Jobs/index.jsx b/src/main/resources/react4xp/dashboard/containers/Jobs/index.jsx index 15ba12da8..64d2e9722 100644 --- a/src/main/resources/react4xp/dashboard/containers/Jobs/index.jsx +++ b/src/main/resources/react4xp/dashboard/containers/Jobs/index.jsx @@ -7,7 +7,7 @@ import { selectJobs, selectLoading } from '/react4xp/dashboard/containers/Jobs/s import { selectContentStudioBaseUrl } from '/react4xp/dashboard/containers/HomePage/selectors' import { Link, Accordion, Divider, Button } from '@statisticsnorway/ssb-component-library' import { DataQueryBadges } from '/react4xp/dashboard/components/DataQueryBadges' -import { default as format } from 'date-fns/format' +import { format } from 'date-fns/format' export function Jobs() { const loading = useSelector(selectLoading) diff --git a/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLog.jsx b/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLog.jsx index 2b705d684..bd892efb7 100644 --- a/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLog.jsx +++ b/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLog.jsx @@ -8,7 +8,7 @@ import { requestStatisticsJobLog } from '/react4xp/dashboard/containers/Statisti import { default as groupBy } from 'ramda/es/groupBy' import { StatisticsLogJob } from '/react4xp/dashboard/containers/Statistics/StatisticsLogJob' import { selectStatisticsLogDataLoaded, selectStatistic } from '/react4xp/dashboard/containers/Statistics/selectors' -import { default as format } from 'date-fns/format' +import { format } from 'date-fns/format' export function StatisticsLog(props) { const { statisticId } = props diff --git a/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLogJob.jsx b/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLogJob.jsx index 53fea880e..99b4efe3f 100644 --- a/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLogJob.jsx +++ b/src/main/resources/react4xp/dashboard/containers/Statistics/StatisticsLogJob.jsx @@ -5,7 +5,7 @@ import { useDispatch, useSelector } from 'react-redux' import { requestJobLogDetails } from '/react4xp/dashboard/containers/Statistics/actions' import { WebSocketContext } from '/react4xp/dashboard/utils/websocket/WebsocketProvider' import { selectJobLog, selectJobLogDetailsLoaded } from '/react4xp/dashboard/containers/Statistics/selectors' -import { default as format } from 'date-fns/format' +import { format } from 'date-fns/format' export function StatisticsLogJob(props) { const io = useContext(WebSocketContext) diff --git a/src/main/resources/react4xp/dashboard/containers/Statistics/index.jsx b/src/main/resources/react4xp/dashboard/containers/Statistics/index.jsx index 7048dd5eb..ee6bc8887 100644 --- a/src/main/resources/react4xp/dashboard/containers/Statistics/index.jsx +++ b/src/main/resources/react4xp/dashboard/containers/Statistics/index.jsx @@ -9,7 +9,7 @@ import { setOpenStatistic, setOpenModal } from '/react4xp/dashboard/containers/S import { StatisticsLog } from '/react4xp/dashboard/containers/Statistics/StatisticsLog' import { RefreshStatisticsModal } from '/react4xp/dashboard/components/RefreshStatisticsModal' import { WebSocketContext } from '/react4xp/dashboard/utils/websocket/WebsocketProvider' -import { default as format } from 'date-fns/format' +import { format } from 'date-fns/format' export function Statistics() { const statistics = useSelector(selectStatistics) diff --git a/src/main/resources/services/bestBetList/bestBetList.es6 b/src/main/resources/services/bestBetList/bestBetList.ts similarity index 78% rename from src/main/resources/services/bestBetList/bestBetList.es6 rename to src/main/resources/services/bestBetList/bestBetList.ts index bc1455a72..0c51d03f6 100644 --- a/src/main/resources/services/bestBetList/bestBetList.es6 +++ b/src/main/resources/services/bestBetList/bestBetList.ts @@ -1,13 +1,13 @@ import { sanitize } from '/lib/xp/common' +import { listBestBets, createBestBet, deleteBestBet, BestBetContent } from '/lib/ssb/repo/bestbet' +import { ensureArray } from '/lib/ssb/utils/arrayUtils' -const { listBestBets, createBestBet, deleteBestBet } = __non_webpack_require__('/lib/ssb/repo/bestbet') -const { ensureArray } = __non_webpack_require__('/lib/ssb/utils/arrayUtils') - -exports.get = () => { +export function get() { const bestbets = ensureArray(listBestBets(1000)) if (bestbets) { return { - body: bestbets.map((bet) => { + body: bestbets.map((_bet) => { + const bet = _bet as unknown as { _id: string; data: BestBetContent } return { id: bet._id, linkedSelectedContentResult: bet.data.linkedSelectedContentResult, @@ -24,7 +24,7 @@ exports.get = () => { } } else return {} } -exports.post = (req) => { +export function post(req: XP.Request) { const body = JSON.parse(req.body) const response = createBestBet({ @@ -41,6 +41,7 @@ exports.post = (req) => { }) return response } -exports.delete = (req) => { +function del(req: XP.Request) { return deleteBestBet(req.params.key) } +export { del as delete } diff --git a/src/main/resources/services/contacts/contacts.es6 b/src/main/resources/services/contacts/contacts.ts similarity index 77% rename from src/main/resources/services/contacts/contacts.es6 rename to src/main/resources/services/contacts/contacts.ts index 4fe57ff22..30596ecdb 100644 --- a/src/main/resources/services/contacts/contacts.es6 +++ b/src/main/resources/services/contacts/contacts.ts @@ -1,6 +1,6 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') -const { handleRepoGet } = __non_webpack_require__('/lib/ssb/dashboard/statreg/repoUtils') -const { getContactsFromRepo } = __non_webpack_require__('/lib/ssb/statreg/contacts') +import '/lib/ssb/polyfills/nashorn' +import { handleRepoGet } from '/lib/ssb/dashboard/statreg/repoUtils' +import { getContactsFromRepo } from '/lib/ssb/statreg/contacts' const toOption = ({ id, name, email, mobile, telephone }) => ({ id, @@ -29,7 +29,7 @@ const filterByIds = (contacts, filters) => { ) } -exports.get = (req) => { +export function get(req: XP.Request): XP.Response { return handleRepoGet( req, 'Contacts', diff --git a/src/main/resources/services/customSelectorMunicipals/customSelectorMunicipals.es6 b/src/main/resources/services/customSelectorMunicipals/customSelectorMunicipals.ts similarity index 82% rename from src/main/resources/services/customSelectorMunicipals/customSelectorMunicipals.es6 rename to src/main/resources/services/customSelectorMunicipals/customSelectorMunicipals.ts index dd6be2558..60d6f1eac 100644 --- a/src/main/resources/services/customSelectorMunicipals/customSelectorMunicipals.es6 +++ b/src/main/resources/services/customSelectorMunicipals/customSelectorMunicipals.ts @@ -1,4 +1,4 @@ -const { list, query } = __non_webpack_require__('/lib/ssb/dataset/klass/municipalities') +import { list, query } from '/lib/ssb/dataset/klass/municipalities' /** * @param {object} req: Enonics request object @@ -11,9 +11,9 @@ const { list, query } = __non_webpack_require__('/lib/ssb/dataset/klass/municipa * count: number} * }} */ -exports.get = (req) => { +export function get(req: XP.Request) { // deepcode ignore Sqli: This is not SQL, simply string regex matching - const municipals = req.params.query ? query(req.params.query) : list(req.params.count) + const municipals = req.params.query ? query(req.params.query) : list() return { body: { diff --git a/src/main/resources/services/municipality/municipality.es6 b/src/main/resources/services/municipality/municipality.ts similarity index 63% rename from src/main/resources/services/municipality/municipality.es6 rename to src/main/resources/services/municipality/municipality.ts index c2d28187e..baf102bac 100644 --- a/src/main/resources/services/municipality/municipality.es6 +++ b/src/main/resources/services/municipality/municipality.ts @@ -1,8 +1,8 @@ -const { getMunicipality } = __non_webpack_require__('/lib/ssb/dataset/klass/municipalities') +import { getMunicipality } from '/lib/ssb/dataset/klass/municipalities' const contentType = 'application/json' -exports.get = function (req) { +export function get(req: XP.Request) { const municipality = getMunicipality({ code: req.params.postalCode, }) diff --git a/src/main/resources/services/ping/ping.es6 b/src/main/resources/services/ping/ping.ts similarity index 80% rename from src/main/resources/services/ping/ping.es6 rename to src/main/resources/services/ping/ping.ts index 2881fadc1..e43709604 100644 --- a/src/main/resources/services/ping/ping.es6 +++ b/src/main/resources/services/ping/ping.ts @@ -1,4 +1,4 @@ -const { getVersion } = __non_webpack_require__('/lib/xp/admin') +import { getVersion } from '/lib/xp/admin' export function get() { const contentType = 'application/xml' diff --git a/src/main/resources/services/relatedFactPage/relatedFactPage.ts b/src/main/resources/services/relatedFactPage/relatedFactPage.ts index 9fd7ce5e3..4e77cf8c5 100644 --- a/src/main/resources/services/relatedFactPage/relatedFactPage.ts +++ b/src/main/resources/services/relatedFactPage/relatedFactPage.ts @@ -5,11 +5,14 @@ import { } from '/site/parts/relatedFactPage/relatedFactPage' export const get = (req: XP.Request): XP.Response => { - const start: number = Number(req.params.start) ? Number(req.params.start) : 0 - const count: number = Number(req.params.count) ? Number(req.params.count) : 10 + const start: number = Number(req.params.start) || 0 + const count: number = Number(req.params.count) || 10 + + const contentIdList = req.params.contentIdList ? JSON.parse(req.params.contentIdList) : [] + const partConfig: RelatedFactPageConfig = { - inputType: req.params['partConfig[inputType]'], - contentIdList: req.params['partConfig[contentIdList]'], + inputType: req.params.inputType, + contentIdList: contentIdList, } const result: RelatedFactPages = parseRelatedFactPageData(partConfig, start, count) diff --git a/src/main/resources/services/statistics/statistics.es6 b/src/main/resources/services/statistics/statistics.ts similarity index 70% rename from src/main/resources/services/statistics/statistics.es6 rename to src/main/resources/services/statistics/statistics.ts index 22fa6cf6b..6f3ce2737 100644 --- a/src/main/resources/services/statistics/statistics.es6 +++ b/src/main/resources/services/statistics/statistics.ts @@ -1,12 +1,9 @@ +import '/lib/ssb/polyfills/nashorn' import { run } from '/lib/xp/context' - -__non_webpack_require__('/lib/ssb/polyfills/nashorn') -const { getAllStatisticsFromRepo } = __non_webpack_require__('/lib/ssb/statreg/statistics') -const { handleRepoGet } = __non_webpack_require__('/lib/ssb/dashboard/statreg/repoUtils') - -const { publishDataset } = __non_webpack_require__('/lib/ssb/dataset/publish') - -const { cronContext } = __non_webpack_require__('/lib/ssb/cron/cron') +import { getAllStatisticsFromRepo } from '/lib/ssb/statreg/statistics' +import { handleRepoGet } from '/lib/ssb/dashboard/statreg/repoUtils' +import { publishDataset } from '/lib/ssb/dataset/publishOld' +import { cronContext } from '/lib/ssb/cron/cron' const toOption = (stat) => ({ ...stat, @@ -33,7 +30,7 @@ const filterByIds = (stats, filters) => { ) } -exports.get = (req) => { +export function get(req: XP.Request) { return handleRepoGet( req, 'Statistics', @@ -43,7 +40,7 @@ exports.get = (req) => { ) } -exports.post = (req) => { +export function post(req: XP.Request) { if (req.params.runPublishDataset === 'OK') { run(cronContext, publishDataset) return { @@ -54,4 +51,9 @@ exports.post = (req) => { status: 200, } } + + return { + contentType: 'application/json', + status: 400, + } } diff --git a/src/main/resources/services/upcomingReleases/upcomingReleases.ts b/src/main/resources/services/upcomingReleases/upcomingReleases.ts index 96023a8e0..51cdf414a 100644 --- a/src/main/resources/services/upcomingReleases/upcomingReleases.ts +++ b/src/main/resources/services/upcomingReleases/upcomingReleases.ts @@ -11,7 +11,7 @@ import { } from '/lib/ssb/utils/variantUtils' import { filterOnComingReleases } from '/lib/ssb/utils/filterReleasesUtils' -import { getAllStatisticsFromRepo } from '../../lib/ssb/statreg/statistics' +import { getAllStatisticsFromRepo } from '/lib/ssb/statreg/statistics' export const get = (req: XP.Request): XP.Response => { // Get statistics diff --git a/src/main/resources/services/websocket/websocket.es6 b/src/main/resources/services/websocket/websocket.es6 deleted file mode 100644 index a107c19a6..000000000 --- a/src/main/resources/services/websocket/websocket.es6 +++ /dev/null @@ -1,24 +0,0 @@ -const ws = __non_webpack_require__('/lib/wsUtil') -const dashboard = __non_webpack_require__('/lib/ssb/dashboard/dashboard') -const statreg = __non_webpack_require__('/lib/ssb/dashboard/statreg') -const cache = __non_webpack_require__('/lib/ssb/cache/cache') -const statistic = __non_webpack_require__('/lib/ssb/dashboard/statistic') - -ws.openWebsockets(exports) // make the server ready for socket connections - -// use SocketEmitter expansion to handle this -const socketEmitter = new ws.SocketEmitter() - -// handle socket connections -socketEmitter.connect(connectionCallback) - -function connectionCallback(socket) { - dashboard.setupHandlers(socket, socketEmitter) - statreg.setupHandlers(socket, socketEmitter) - statistic.setupHandlers(socket, socketEmitter) - cache.setupHandlers(socket) - - socket.on('keep-alive', () => { - socket.emit('keep-alive', 'pong') - }) -} diff --git a/src/main/resources/services/websocket/websocket.ts b/src/main/resources/services/websocket/websocket.ts new file mode 100644 index 000000000..0c8245941 --- /dev/null +++ b/src/main/resources/services/websocket/websocket.ts @@ -0,0 +1,24 @@ +import { openWebsockets, Socket, SocketEmitter } from '/lib/wsUtil' +import { setupHandlers as setupDashboardHandlers } from '/lib/ssb/dashboard/dashboard' +import { setupHandlers as setupStatregHandlers } from '/lib/ssb/dashboard/statreg' +import { setupHandlers as setupCacheHandlers } from '/lib/ssb/cache/cache' +import { setupHandlers as setupStatisticHandlers } from '/lib/ssb/dashboard/statistic' + +openWebsockets(exports) // make the server ready for socket connections + +// use SocketEmitter expansion to handle this +const socketEmitter = new SocketEmitter() + +// handle socket connections +socketEmitter.connect(connectionCallback) + +function connectionCallback(socket: Socket) { + setupDashboardHandlers(socket, socketEmitter) + setupStatregHandlers(socket, socketEmitter) + setupStatisticHandlers(socket, socketEmitter) + setupCacheHandlers(socket) + + socket.on('keep-alive', () => { + socket.emit('keep-alive', 'pong') + }) +} diff --git a/src/main/resources/site/content-types/highchart/highchart.xml b/src/main/resources/site/content-types/highchart/highchart.xml index b51afe093..022703056 100644 --- a/src/main/resources/site/content-types/highchart/highchart.xml +++ b/src/main/resources/site/content-types/highchart/highchart.xml @@ -112,6 +112,7 @@ + center @@ -130,6 +131,7 @@ + @@ -174,6 +176,7 @@ + diff --git a/src/main/resources/site/content-types/highmap/highmap.xml b/src/main/resources/site/content-types/highmap/highmap.xml index 0c801e977..54d247a8a 100644 --- a/src/main/resources/site/content-types/highmap/highmap.xml +++ b/src/main/resources/site/content-types/highmap/highmap.xml @@ -103,6 +103,25 @@ + + + + + + + + + + Statistisk sentralbyrå + + + + https://www.ssb.no + + + + + diff --git a/src/main/resources/site/error/error.es6 b/src/main/resources/site/error/error.ts similarity index 74% rename from src/main/resources/site/error/error.es6 rename to src/main/resources/site/error/error.ts index c0b43badf..25c4ad27e 100644 --- a/src/main/resources/site/error/error.es6 +++ b/src/main/resources/site/error/error.ts @@ -1,21 +1,25 @@ -const { render } = __non_webpack_require__('/lib/thymeleaf') - -const { render: r4xpRender } = __non_webpack_require__('/lib/enonic/react4xp') -const { getSite, assetUrl } = __non_webpack_require__('/lib/xp/portal') -const { getLanguage } = __non_webpack_require__('/lib/ssb/utils/language') - -const i18nLib = __non_webpack_require__('/lib/xp/i18n') +import { getSite, assetUrl } from '/lib/xp/portal' +import { localize } from '/lib/xp/i18n' +import { render } from '/lib/thymeleaf' +import { render as r4xpRender } from '/lib/enonic/react4xp' +import { getLanguage } from '/lib/ssb/utils/language' +import { Language } from '/lib/types/language' const fourOFourView = resolve('./404.html') const mainErrorView = resolve('./error.html') const genericErrorView = resolve('./generic.html') const { randomUnsafeString } = require('../../lib/ssb/utils/utils') -exports.handle404 = function (err) { +type Error = { + request: XP.Request + status: number +} + +export function handle404(err: Error) { // getting language from site because 404 page is not connected to any content. // So unless we stop setting language via menu and start to set it via site, this will always show as 'nb' // TODO: find another way to find and set locale of 404 page - const page = getSite() + const page = getSite()! const language = getLanguage(page) const searchId = 'searchBox-' + randomUnsafeString() @@ -28,22 +32,21 @@ exports.handle404 = function (err) { return r4xpRender( 'Search', { - searchText: i18nLib.localize({ + searchText: localize({ key: 'menuSearch', }), searchResultPageUrl: 'https://www.ssb.no/sok', className: 'show', }, - undefined, + err.request, { id: searchId, body: getMainErrorBody(err.status, fourOFourBody, language), - clientRender: err.request.mode !== 'edit', } ) } -exports.handleError = function (err) { +export function handleError(err: Error) { try { const genericModel = { ...getGenericAssets(), @@ -51,7 +54,7 @@ exports.handleError = function (err) { } const genericViewBody = render(genericErrorView, genericModel) - const page = getSite() + const page = getSite()! const language = getLanguage(page) const body = getMainErrorBody(err.status, genericViewBody, language) return { @@ -68,7 +71,7 @@ exports.handleError = function (err) { } } -function getMainErrorBody(status, contentHtml, language) { +function getMainErrorBody(status: number, contentHtml: string, language: Language | null) { const mainErrorModel = { ...getAssets(), language, @@ -83,47 +86,47 @@ function getMainErrorBody(status, contentHtml, language) { function getFourOFourLocalizations() { return { - title: i18nLib.localize({ + title: localize({ key: '404.title', }), - text: i18nLib.localize({ + text: localize({ key: '404.text', }), - goBack: i18nLib.localize({ + goBack: localize({ key: '404.goBack', }), - frontPage: i18nLib.localize({ + frontPage: localize({ key: '404.frontPage', }), - or: i18nLib.localize({ + or: localize({ key: '404.or', }), - search: i18nLib.localize({ + search: localize({ key: '404.search', }), } } -function getGenericLocalizations(status) { +function getGenericLocalizations(status: number) { return { - title: i18nLib.localize({ + title: localize({ key: 'error.title', }), text: - i18nLib.localize({ + localize({ key: 'error.text1', }) + ` ${status}` + - i18nLib.localize({ + localize({ key: 'error.text2', }), - goBack: i18nLib.localize({ + goBack: localize({ key: 'error.goBack', }), - frontPage: i18nLib.localize({ + frontPage: localize({ key: 'error.frontPage', }), - or: i18nLib.localize({ + or: localize({ key: 'error.or', }), } diff --git a/src/main/resources/site/layouts/columns/columns.es6 b/src/main/resources/site/layouts/columns/columns.ts similarity index 79% rename from src/main/resources/site/layouts/columns/columns.es6 rename to src/main/resources/site/layouts/columns/columns.ts index 9b5cd4f8f..b7c0d2454 100644 --- a/src/main/resources/site/layouts/columns/columns.es6 +++ b/src/main/resources/site/layouts/columns/columns.ts @@ -1,12 +1,12 @@ -const { getComponent } = __non_webpack_require__('/lib/xp/portal') -const { render } = __non_webpack_require__('/lib/thymeleaf') +import { getComponent } from '/lib/xp/portal' +import { render } from '/lib/thymeleaf' +import { React4xp } from '/lib/enonic/react4xp' -const { React4xp } = __non_webpack_require__('/lib/enonic/react4xp') const view = resolve('columns.html') -exports.get = function (req) { - const component = getComponent() - const { size, title, hideTitle, verticalBorder } = component.config +export function get(req: XP.Request): XP.Response { + const component = getComponent()! + const { size, title, hideTitle } = component.config const isGrid = component.config.isGrid && req.mode !== 'edit' const divider = new React4xp('Divider') @@ -52,7 +52,7 @@ exports.get = function (req) { gridComponents.push({ path: left.path, classes: `order-0 ${leftSize}${!prevRight && i !== 0 ? ` ${leftOffset}` : ''}`, - order: left.path.slice(-1), // Get the last char of the path (path i.e. /Rad_H/1/left/1) + order: left.path?.slice(-1), // Get the last char of the path (path i.e. /Rad_H/1/left/1) regionSide: 'left', }) } @@ -60,7 +60,7 @@ exports.get = function (req) { gridComponents.push({ path: right.path, classes: `order-1 order-md-0 ${rightSize}${!left ? ` ${rightOffset}` : ''}`, - order: right.path.slice(-1), + order: right.path?.slice(-1), regionSide: 'right', }) } @@ -77,7 +77,6 @@ exports.get = function (req) { rightSize, isGrid, gridComponents, - verticalBorder, } const body = diff --git a/src/main/resources/site/layouts/topic/topic.es6 b/src/main/resources/site/layouts/topic/topic.ts similarity index 51% rename from src/main/resources/site/layouts/topic/topic.es6 rename to src/main/resources/site/layouts/topic/topic.ts index 6e5bd6a5a..56eb50c27 100644 --- a/src/main/resources/site/layouts/topic/topic.es6 +++ b/src/main/resources/site/layouts/topic/topic.ts @@ -1,14 +1,12 @@ +import { getComponent } from '/lib/xp/portal' import { render } from '/lib/thymeleaf' - -const portal = __non_webpack_require__('/lib/xp/portal') -const { pageMode } = __non_webpack_require__('/lib/ssb/utils/utils') +import { pageMode } from '/lib/ssb/utils/utils' const view = resolve('topic.html') -exports.get = function (req) { - const page = portal.getContent() - const component = portal.getComponent() - const mode = pageMode(req, page) +export function get(req: XP.Request) { + const component = getComponent()! + const mode = pageMode(req) const { title, hideTitle } = component.config const model = { title, diff --git a/src/main/resources/site/layouts/triple/triple.es6 b/src/main/resources/site/layouts/triple/triple.ts similarity index 76% rename from src/main/resources/site/layouts/triple/triple.es6 rename to src/main/resources/site/layouts/triple/triple.ts index d0d8c2bc7..3412f3cdf 100644 --- a/src/main/resources/site/layouts/triple/triple.es6 +++ b/src/main/resources/site/layouts/triple/triple.ts @@ -1,10 +1,10 @@ +import { getComponent } from '/lib/xp/portal' import { render } from '/lib/thymeleaf' -const portal = __non_webpack_require__('/lib/xp/portal') const view = resolve('triple.html') -exports.get = function () { - const component = portal.getComponent() +export function get() { + const component = getComponent()! const { title, hideTitle } = component.config const model = { diff --git a/src/main/resources/site/macros/accordion/accordion.es6 b/src/main/resources/site/macros/accordion/accordion.es6 deleted file mode 100644 index 050646ecd..000000000 --- a/src/main/resources/site/macros/accordion/accordion.es6 +++ /dev/null @@ -1,9 +0,0 @@ -const accordionController = __non_webpack_require__('../../parts/accordion/accordion') -const { - data: { forceArray }, -} = __non_webpack_require__('/lib/util') - -exports.macro = function (context) { - const accordionIds = context.params.accordion ? forceArray(context.params.accordion) : [] - return accordionController.preview(context.request, accordionIds) -} diff --git a/src/main/resources/site/macros/accordion/accordion.ts b/src/main/resources/site/macros/accordion/accordion.ts new file mode 100644 index 000000000..5fa853d92 --- /dev/null +++ b/src/main/resources/site/macros/accordion/accordion.ts @@ -0,0 +1,8 @@ +import { data } from '/lib/util' +import { preview } from '/site/parts/accordion/accordion' +import { Accordion } from '.' + +export function macro(context: XP.MacroContext) { + const accordionIds = context.params.accordion ? data.forceArray(context.params.accordion) : [] + return preview(context.request, accordionIds) +} diff --git a/src/main/resources/site/macros/factBox/factBox.es6 b/src/main/resources/site/macros/factBox/factBox.es6 deleted file mode 100644 index 8fb3be268..000000000 --- a/src/main/resources/site/macros/factBox/factBox.es6 +++ /dev/null @@ -1,15 +0,0 @@ -const factBoxController = __non_webpack_require__(`../../parts/factBox/factBox`) - -const { renderError } = __non_webpack_require__('/lib/ssb/error/error') - -exports.macro = function (context) { - try { - const factBox = factBoxController.preview(context.request, context.params.factBox) - - if (factBox.status && factBox.status !== 200) throw new Error(`factBox with id ${context.params.factBox} missing`) - - return factBox - } catch (e) { - return renderError(context.request, 'Error in macro', e) - } -} diff --git a/src/main/resources/site/macros/factBox/factBox.ts b/src/main/resources/site/macros/factBox/factBox.ts new file mode 100644 index 000000000..81aeca415 --- /dev/null +++ b/src/main/resources/site/macros/factBox/factBox.ts @@ -0,0 +1,15 @@ +import { renderError } from '/lib/ssb/error/error' +import { preview } from '/site/parts/factBox/factBox' +import { type FactBox } from '.' + +export function macro(context: XP.MacroContext) { + try { + const factBox = preview(context.request, context.params.factBox) + + if (factBox.status && factBox.status !== 200) throw new Error(`factBox with id ${context.params.factBox} missing`) + + return factBox + } catch (e) { + return renderError(context.request, 'Error in macro', e) + } +} diff --git a/src/main/resources/site/macros/glossary/glossary.ts b/src/main/resources/site/macros/glossary/glossary.ts index 9c72f68bd..826c8ae7b 100644 --- a/src/main/resources/site/macros/glossary/glossary.ts +++ b/src/main/resources/site/macros/glossary/glossary.ts @@ -1,8 +1,8 @@ import { React4xp } from '/lib/enonic/react4xp' - import { renderError } from '/lib/ssb/error/error' +import { Glossary } from '.' -export function macro(context: XP.MacroContext) { +export function macro(context: XP.MacroContext) { try { return renderMacro(context) } catch (e) { @@ -10,7 +10,7 @@ export function macro(context: XP.MacroContext) { } } -const renderMacro = (context: XP.MacroContext) => { +const renderMacro = (context: XP.MacroContext) => { const { text, explanation } = context.params if (!text) throw new Error('Missing param text') diff --git a/src/main/resources/site/macros/headerLink/headerLink.ts b/src/main/resources/site/macros/headerLink/headerLink.ts index 53d25bb18..f5c04e214 100644 --- a/src/main/resources/site/macros/headerLink/headerLink.ts +++ b/src/main/resources/site/macros/headerLink/headerLink.ts @@ -5,13 +5,13 @@ import { render } from '/lib/enonic/react4xp' import { prepareText } from '/site/parts/links/links' import { type HeaderLink as HeaderLinkConfig } from '/site/macros/headerLink' -export const macro = (context: XP.MacroContext) => { +export const macro = (context: XP.MacroContext) => { return renderPart(context) } -export const preview = (context: XP.MacroContext) => renderPart(context) +export const preview = (context: XP.MacroContext) => renderPart(context) -function renderPart(context: XP.MacroContext) { +function renderPart(context: XP.MacroContext) { const { linkedContent, linkText } = context.params const content: Content | null = get({ diff --git a/src/main/resources/site/macros/highmap/highmap.es6 b/src/main/resources/site/macros/highmap/highmap.es6 deleted file mode 100644 index 77d9d60ad..000000000 --- a/src/main/resources/site/macros/highmap/highmap.es6 +++ /dev/null @@ -1,15 +0,0 @@ -const highmapController = __non_webpack_require__('../../parts/highmap/highmap') - -const { renderError } = __non_webpack_require__('/lib/ssb/error/error') - -exports.macro = function (context) { - try { - const highmap = highmapController.preview(context.request, context.params.highmap) - - if (highmap.status && highmap.status !== 200) throw new Error(`Highmap with id ${context.params.highmap} missing`) - - return highmap - } catch (e) { - return renderError(context.request, 'Error in macro', e) - } -} diff --git a/src/main/resources/site/macros/highmap/highmap.ts b/src/main/resources/site/macros/highmap/highmap.ts new file mode 100644 index 000000000..98e6210d5 --- /dev/null +++ b/src/main/resources/site/macros/highmap/highmap.ts @@ -0,0 +1,22 @@ +import { renderError } from '/lib/ssb/error/error' + +import { preview } from '/site/parts/highmap/highmap' +import { preview as dividerControllerPreview } from '/site/parts/divider/divider' +import { Highmap } from '.' + +export function macro(context: XP.MacroContext) { + try { + const divider: XP.Response = dividerControllerPreview(context.request, { + dark: false, + }) + + const highmap = preview(context.request, context.params.highmap) + + if (highmap.status && highmap.status !== 200) throw new Error(`Highmap with id ${context.params.highmap} missing`) + highmap.body = (divider.body as string) + highmap.body + divider.body + + return highmap + } catch (e) { + return renderError(context.request, 'Error in macro', e) + } +} diff --git a/src/main/resources/site/macros/links/links.ts b/src/main/resources/site/macros/links/links.ts index 135dba9c3..0fe622f9c 100644 --- a/src/main/resources/site/macros/links/links.ts +++ b/src/main/resources/site/macros/links/links.ts @@ -1,14 +1,14 @@ import { get, Content } from '/lib/xp/content' import { attachmentUrl, pageUrl } from '/lib/xp/portal' import { render } from '/lib/enonic/react4xp' -import { type Links as LinksConfig } from '/site/macros/links' import { LinksProps, prepareText } from '/site/parts/links/links' import { type TableLink } from '/site/mixins/tableLink' import { type HeaderLink } from '/site/mixins/headerLink' import { type ProfiledLink } from '/site/mixins/profiledLink' import { GA_TRACKING_ID } from '/site/pages/default/default' +import { type Links as LinksConfig } from '.' -export function macro(context: XP.MacroContext) { +export function macro(context: XP.MacroContext) { const config = context.params as unknown as LinksConfig & TableLink & HeaderLink & ProfiledLink const linkType: string | undefined = config.linkTypes diff --git a/src/main/resources/site/macros/staticVisualization/staticVisualization.ts b/src/main/resources/site/macros/staticVisualization/staticVisualization.ts index f77e4e1d5..53e6b33db 100644 --- a/src/main/resources/site/macros/staticVisualization/staticVisualization.ts +++ b/src/main/resources/site/macros/staticVisualization/staticVisualization.ts @@ -1,9 +1,9 @@ import { renderError } from '/lib/ssb/error/error' import { type StaticVisualization as StaticVisualizationConfig } from '/site/macros/staticVisualization' -import { preview } from '../../parts/staticVisualization/staticVisualization' +import { preview } from '/site/parts/staticVisualization/staticVisualization' -import { preview as dividerControllerPreview } from '../../parts/divider/divider' +import { preview as dividerControllerPreview } from '/site/parts/divider/divider' export const macro = (context: XP.MacroContext): XP.Response => { try { diff --git a/src/main/resources/site/macros/tableLink/tableLink.es6 b/src/main/resources/site/macros/tableLink/tableLink.ts similarity index 78% rename from src/main/resources/site/macros/tableLink/tableLink.es6 rename to src/main/resources/site/macros/tableLink/tableLink.ts index f04e910cf..27f24a758 100644 --- a/src/main/resources/site/macros/tableLink/tableLink.es6 +++ b/src/main/resources/site/macros/tableLink/tableLink.ts @@ -1,11 +1,13 @@ +import { pageUrl } from '/lib/xp/portal' import { render } from '/lib/thymeleaf' -const { pageUrl } = __non_webpack_require__('/lib/xp/portal') -const { React4xp } = __non_webpack_require__('/lib/enonic/react4xp') -const { renderError } = __non_webpack_require__('/lib/ssb/error/error') +import { React4xp } from '/lib/enonic/react4xp' +import { renderError } from '/lib/ssb/error/error' +import { TableLink } from '.' + const view = resolve('./tableLink.html') -exports.macro = function (context) { +export function macro(context: XP.MacroContext) { try { return renderMacro(context) } catch (e) { @@ -13,7 +15,7 @@ exports.macro = function (context) { } } -const renderMacro = (context) => { +const renderMacro = (context: XP.MacroContext) => { const linkSrc = context.params.relatedContent ? pageUrl({ id: context.params.relatedContent, diff --git a/src/main/resources/site/pages/default/default.html b/src/main/resources/site/pages/default/default.html index 0a2b1421d..6a6df7fa7 100644 --- a/src/main/resources/site/pages/default/default.html +++ b/src/main/resources/site/pages/default/default.html @@ -1,51 +1,53 @@ + - + - - - + + + - - + + + @@ -60,8 +62,12 @@
+ + -
+
@@ -93,7 +99,8 @@ @@ -117,7 +124,7 @@

- +
@@ -133,24 +140,22 @@

-
+
-
+
+ data-th-classappend="${region.view == 'full' ? 'container-fluid p-0' : region.view == 'card' ? 'border-top-green container' : 'container'}">
-

-

+

+

@@ -158,15 +163,14 @@

-

-

+

+

-
+
-
+
@@ -174,13 +178,13 @@

-
+

-
+
@@ -188,23 +192,6 @@

- - - - - + + \ No newline at end of file diff --git a/src/main/resources/site/pages/default/default.ts b/src/main/resources/site/pages/default/default.ts index 1a6a2d144..6f34d1052 100644 --- a/src/main/resources/site/pages/default/default.ts +++ b/src/main/resources/site/pages/default/default.ts @@ -1,4 +1,5 @@ /* eslint-disable complexity */ +import { Article } from 'schema-dts' import { type Content, query } from '/lib/xp/content' import { assetUrl, type Component, getContent, getSiteConfig, pageUrl, processHtml } from '/lib/xp/portal' import { localize } from '/lib/xp/i18n' @@ -37,6 +38,7 @@ import { getHeaderContent } from '/lib/ssb/parts/header' import { fromMenuCache } from '/lib/ssb/cache/cache' import { isEnabled } from '/lib/featureToggle' +import { ensureArray } from '/lib/ssb/utils/arrayUtils' import { type Default as DefaultPageConfig } from '/site/pages/default' import { type Page, type Statistics } from '/site/content-types' @@ -92,7 +94,11 @@ export function get(req: XP.Request): XP.Response { // @ts-ignore name = previewOverride[name] } - const controller: Controller = __non_webpack_require__(`../../parts/${name}/${name}`) + + // Our build system can't handle a wildcard require directly. All builders assume you are node or browser, since we are not we need to circumvent this. + // If we use a require directly it gets swapped out with a errounous function. Bybass by proxying through a variable + const _require = require + const controller: Controller = _require(`../../parts/${name}/${name}`) if (controller.preview) { preview = controller.preview(req, page._id) } @@ -210,6 +216,36 @@ export function get(req: XP.Request): XP.Response { const metaInfo: MetaInfoData = parseMetaInfoData(municipality, pageType, page, language, req) + let jsonLd: Article | undefined + if (page.type === 'mimir:article' && isEnabled('structured-data', false, 'ssb')) + jsonLd = { + // @ts-ignore ssssh its ok + '@context': 'https://schema.org', + '@type': 'Article', + articleSection: ensureArray(page.x?.mimir?.subjectTag?.mainSubjects)[0], + additionalType: page.data.articleType, // For eksempel + headline: page.data.title, + datePublished: page.publish?.first, + dateModified: page.data.showModifiedDate?.dateOption?.showModifiedTime + ? page.data.showModifiedDate.dateOption.modifiedDate + : undefined, + author: page.data.authorItemSet?.map((f) => { + return { + '@type': 'Person', + name: f.name, + email: f.email, + } + }), + publisher: { + '@type': 'Organization', + name: 'Statistisk sentralbyrå', + logo: { + '@type': 'ImageObject', + url: 'https://www.ssb.no/_/asset/mimir:0000018b60c47e20/SSB_logo_black.svg', + }, + }, + } + const statbankFane: boolean = req.params.xpframe === 'statbank' const statBankContent: StatbankFrameData = parseStatbankFrameContent(statbankFane, req, page) if (statbankFane) { @@ -223,7 +259,6 @@ export function get(req: XP.Request): XP.Response { ) const breadcrumbId = 'breadcrumbs' const hideBreadcrumb = !!pageConfig?.hide_breadcrumb - const innrapporteringRegexp = /^\/ssb(\/en)?\/innrapportering/ // Skal matche alle sider under /innrapportering på norsk og engelsk const model: DefaultModel = { isFragment, @@ -247,10 +282,10 @@ export function get(req: XP.Request): XP.Response { headerBody: header?.body, footerBody: footer?.body, ...metaInfo, + jsonLd, breadcrumbsReactId: breadcrumbId, hideHeader, hideBreadcrumb, - enabledChatScript: isEnabled('enable-chat-script', true, 'ssb') && innrapporteringRegexp.exec(page._path), tableView: page.type === 'mimir:table', } @@ -318,9 +353,7 @@ function prepareRegions(isFragment: boolean, page: DefaultPage): RegionsContent } } configRegions.forEach((configRegion) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access configRegion.components = regions[configRegion.region] ? util.data.forceArray(regions[configRegion.region].components) : [] @@ -558,6 +591,18 @@ interface DefaultPage extends Content { statistic: string subtopic: Array articleType: string + showModifiedDate: { + dateOption: { + showModifiedTime: boolean + modifiedDate: string + } + } + authorItemSet: [ + { + name: string + email: string + }, + ] } page: ExtendedPage } @@ -632,11 +677,11 @@ interface DefaultModel { GA_TRACKING_ID: string | null GTM_TRACKING_ID: string | null GTM_AUTH: string | null + jsonLd: NewsArticle | undefined headerBody: string | undefined footerBody: string | undefined breadcrumbsReactId: string | undefined hideHeader: boolean hideBreadcrumb: boolean - enabledChatScript: boolean tableView: boolean } diff --git a/src/main/resources/site/parts/article/article.jsx b/src/main/resources/site/parts/article/article.jsx index a54277561..d0876e16f 100644 --- a/src/main/resources/site/parts/article/article.jsx +++ b/src/main/resources/site/parts/article/article.jsx @@ -1,6 +1,7 @@ import React from 'react' import { Title, Link, Divider } from '@statisticsnorway/ssb-component-library' import PropTypes from 'prop-types' +import { sanitize } from '../../../lib/ssb/utils/htmlUtils' function Article(props) { const phrases = props.phrases @@ -65,11 +66,10 @@ function Article(props) { function renderArticleBody() { const { bodyText } = props - if (bodyText) { return (
- {/* + {/* Macros will not be SSR in the part itself (where the output is recorded for mismatch checking), but swapped in after part render by XP pipeline. Since they are present when hydrating it causes hydration mismatch, so we supress the warning. @@ -78,7 +78,7 @@ function Article(props) { className='article-body searchabletext' suppressHydrationWarning={true} dangerouslySetInnerHTML={{ - __html: bodyText, + __html: sanitize(bodyText), }} />
diff --git a/src/main/resources/site/parts/articleArchive/articleArchive.ts b/src/main/resources/site/parts/articleArchive/articleArchive.ts index e7a2cf97b..7eb948499 100644 --- a/src/main/resources/site/parts/articleArchive/articleArchive.ts +++ b/src/main/resources/site/parts/articleArchive/articleArchive.ts @@ -99,11 +99,6 @@ function getSubTitle(articleContent: Content
, articleNamePhrase: string } export function parseArticleData(pageId: string, start: number, count: number, language: string): ParsedArticles { - const articleNamePhrase: string = localize({ - key: 'articleName', - locale: language, - }) - const articles = query>({ start, count, @@ -135,6 +130,13 @@ export function parseArticleData(pageId: string, start: number, count: number, l }) const parsedArticles: Array = articles.hits.map((articleContent) => { + const articleType = articleContent.data.articleType + ? `contentType.search.${articleContent.data.articleType}` + : 'articleName' + const articleNamePhrase: string = localize({ + key: articleType, + locale: language, + }) return { year: // checking against an empty articleContent.publish object to throw a false diff --git a/src/main/resources/site/parts/attachmentTablesFigures/attachmentTablesFigures.ts b/src/main/resources/site/parts/attachmentTablesFigures/attachmentTablesFigures.ts index 78ffe219f..f4a1aebe0 100644 --- a/src/main/resources/site/parts/attachmentTablesFigures/attachmentTablesFigures.ts +++ b/src/main/resources/site/parts/attachmentTablesFigures/attachmentTablesFigures.ts @@ -15,11 +15,8 @@ import { datasetOrUndefined } from '/lib/ssb/cache/cache' import { type AccordionData } from '/site/parts/accordion/accordion' import { GA_TRACKING_ID } from '/site/pages/default/default' import { type Statistics } from '/site/content-types' - -const tableController: { getProps: (req: XP.Request, tableId: string) => object } = - __non_webpack_require__('../table/table') -const highchartController: { preview: (req: XP.Request, id: string) => XP.Response } = - __non_webpack_require__('../highchart/highchart') +import { getProps } from '/site/parts/table/table' +import { preview as highchartPreview } from '/site/parts/highchart/highchart' export function get(req: XP.Request): XP.Response { try { @@ -124,7 +121,7 @@ function getTablesAndFigures( ++tableIndex return getTableReturnObject( attachmentTablesFiguresMap[id], - tableController.getProps(req, id), + getProps(req, id), `${phrases.table} ${tableIndex}`, index ) @@ -132,7 +129,7 @@ function getTablesAndFigures( ++figureIndex return getFigureReturnObject( attachmentTablesFiguresMap[id], - highchartController.preview(req, id), + highchartPreview(req, id), `${phrases.figure} ${figureIndex}`, index ) diff --git a/src/main/resources/site/parts/divider/divider.ts b/src/main/resources/site/parts/divider/divider.ts index 70848c4b0..7843a2447 100644 --- a/src/main/resources/site/parts/divider/divider.ts +++ b/src/main/resources/site/parts/divider/divider.ts @@ -17,12 +17,12 @@ export function get(req: XP.Request): XP.Response { } } -export function preview(req: XP.Request): XP.Response { - return renderPart(req, {}) +export function preview(req: XP.Request, config = {}): XP.Response { + return renderPart(req, config) } function renderPart(req: XP.Request, config: DividerPartConfig): XP.Response { - const dividerColor: string = config.dividerColor || 'light' + const dividerColor: string = config.dividerColor ?? 'light' return fromPartCache(req, `divider${dividerColor}`, () => { const result = render('Divider', setColor(dividerColor), req, { diff --git a/src/main/resources/site/parts/employee/employee.jsx b/src/main/resources/site/parts/employee/employee.jsx index 72d45c54e..29fa0c970 100644 --- a/src/main/resources/site/parts/employee/employee.jsx +++ b/src/main/resources/site/parts/employee/employee.jsx @@ -2,6 +2,7 @@ import React from 'react' import { Button, Title, Link, Paragraph, Accordion } from '@statisticsnorway/ssb-component-library' import PropTypes from 'prop-types' import { Share2, Send, Smartphone, Eye, Home, Download, Image } from 'react-feather' +import { sanitize } from '../../../lib/ssb/utils/htmlUtils' const Employee = (props) => { const { @@ -208,7 +209,7 @@ const Employee = (props) => {

{briefSummaryPhrase}

diff --git a/src/main/resources/site/parts/employeeList/employeeList.jsx b/src/main/resources/site/parts/employeeList/employeeList.jsx index 7e761d4a0..1f8252dd0 100644 --- a/src/main/resources/site/parts/employeeList/employeeList.jsx +++ b/src/main/resources/site/parts/employeeList/employeeList.jsx @@ -1,6 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import { Link, Divider, Text } from '@statisticsnorway/ssb-component-library' +import { sanitize } from '../../../lib/ssb/utils/htmlUtils' function EmployeeList(props) { const { employees, total, pageTitle, pageDescription } = props @@ -103,7 +104,7 @@ function EmployeeList(props) {
) : null} diff --git a/src/main/resources/site/parts/highchart/Highchart.jsx b/src/main/resources/site/parts/highchart/Highchart.jsx index ffc53908d..23d3a327f 100644 --- a/src/main/resources/site/parts/highchart/Highchart.jsx +++ b/src/main/resources/site/parts/highchart/Highchart.jsx @@ -10,6 +10,7 @@ import accessibilityLang from './../../../assets/js/highchart-lang.json' if (typeof Highcharts === 'object') { require('highcharts/modules/exporting')(Highcharts) + require('highcharts/modules/offline-exporting')(Highcharts) require('highcharts/modules/export-data')(Highcharts) require('highcharts/modules/data')(Highcharts) require('highcharts/modules/no-data-to-display')(Highcharts) @@ -160,9 +161,7 @@ function Highchart(props) { addGtagForEvent(props.GA_TRACKING_ID, action, category, label) } - this.exportChart({ - type: 'png', - }) + this.exportChartLocal() // png is default }, }, downloadJPEG: { @@ -173,8 +172,8 @@ function Highchart(props) { addGtagForEvent(props.GA_TRACKING_ID, action, category, label) } - this.exportChart({ - type: 'jpeg', + this.exportChartLocal({ + type: 'image/jpeg', }) }, }, @@ -186,7 +185,7 @@ function Highchart(props) { addGtagForEvent(props.GA_TRACKING_ID, action, category, label) } - this.exportChart({ + this.exportChartLocal({ type: 'application/pdf', }) }, @@ -199,8 +198,8 @@ function Highchart(props) { addGtagForEvent(props.GA_TRACKING_ID, action, category, label) } - this.exportChart({ - type: 'svg', + this.exportChartLocal({ + type: 'image/svg+xml', }) }, }, diff --git a/src/main/resources/site/parts/highchart/highchart.html b/src/main/resources/site/parts/highchart/highchart.html index 9074e5649..65475257e 100644 --- a/src/main/resources/site/parts/highchart/highchart.html +++ b/src/main/resources/site/parts/highchart/highchart.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/main/resources/site/parts/highchart/highchart.ts b/src/main/resources/site/parts/highchart/highchart.ts index 29ac55d61..d7ae0bec9 100644 --- a/src/main/resources/site/parts/highchart/highchart.ts +++ b/src/main/resources/site/parts/highchart/highchart.ts @@ -103,11 +103,12 @@ function renderPart(req: XP.Request, highchartIds: Array): XP.Response { if (isEnabled('highchart-react', true, 'ssb')) { // R4xp disables hydration in edit mode, but highcharts need hydration to show // we sneaky swap mode since we want a render of higchart in edit mode + // Works good for highchart macro, not so much when part const _req = req if (req.mode === 'edit') _req.mode = 'preview' return r4XpRender('site/parts/highchart/Highchart', HighchartProps, _req, { - body: '
', + body: '
', }) } else { return { diff --git a/src/main/resources/site/parts/highchartExpert/HighchartExpert.jsx b/src/main/resources/site/parts/highchartExpert/HighchartExpert.jsx index f8d4946fb..84efd1fad 100644 --- a/src/main/resources/site/parts/highchartExpert/HighchartExpert.jsx +++ b/src/main/resources/site/parts/highchartExpert/HighchartExpert.jsx @@ -8,6 +8,7 @@ import accessibilityLang from './../../../assets/js/highchart-lang.json' if (typeof Highcharts === 'object') { require('highcharts/modules/exporting')(Highcharts) + require('highcharts/modules/offline-exporting')(Highcharts) require('highcharts/modules/export-data')(Highcharts) require('highcharts/modules/data')(Highcharts) require('highcharts/modules/no-data-to-display')(Highcharts) diff --git a/src/main/resources/site/parts/highchartExpert/highchartExpert.ts b/src/main/resources/site/parts/highchartExpert/highchartExpert.ts index dec0730ed..dd150e5cf 100644 --- a/src/main/resources/site/parts/highchartExpert/highchartExpert.ts +++ b/src/main/resources/site/parts/highchartExpert/highchartExpert.ts @@ -45,7 +45,7 @@ function renderPart(req: XP.Request): XP.Response { } return r4XpRender('site/parts/highchartExpert/HighchartExpert', { config: component.config.config }, _req, { - body: '
', + body: '
', }) } @@ -60,7 +60,7 @@ function errorConfig(title = 'Feil i JSON konfigurasjon', message = '') { Det må begynne med { og slutte med }` return { - body: `
+ body: `

Highchart Ekspert - ${title}

${_message} diff --git a/src/main/resources/site/parts/highmap/Highmap.jsx b/src/main/resources/site/parts/highmap/Highmap.jsx index a9370ffd3..629b03486 100644 --- a/src/main/resources/site/parts/highmap/Highmap.jsx +++ b/src/main/resources/site/parts/highmap/Highmap.jsx @@ -2,7 +2,7 @@ import React, { useEffect } from 'react' import Highcharts from 'highcharts' import HighchartsReact from 'highcharts-react-official' import PropTypes from 'prop-types' -import { Text } from '@statisticsnorway/ssb-component-library' +import { Link, Text } from '@statisticsnorway/ssb-component-library' import { Col, Row } from 'react-bootstrap' import { useMediaQuery } from 'react-responsive' @@ -11,25 +11,11 @@ import accessibilityLang from './../../../assets/js/highchart-lang.json' if (typeof Highcharts === 'object') { require('highcharts/modules/accessibility')(Highcharts) require('highcharts/modules/exporting')(Highcharts) + require('highcharts/modules/offline-exporting')(Highcharts) require('highcharts/modules/export-data')(Highcharts) require('highcharts/modules/map')(Highcharts) } -function renderFootnotes(footnotes) { - if (footnotes.length) { - return ( - - {footnotes.map((footnote) => ( - - {footnote && {footnote}} - - ))} - - ) - } - return -} - function Highmap(props) { useEffect(() => { if (props.language !== 'en') { @@ -58,6 +44,12 @@ function Highmap(props) { const mapOptions = { chart: { height: desktop && props.heightAspectRatio && `${props.heightAspectRatio}%`, + style: { + color: '#21383a', + fontSize: '14px', + fontWeight: 'normal', + fontFamily: '"Open Sans Regular", "Arial", "DejaVu Sans", sans-serif', + }, }, accessibility: { enabled: true, @@ -123,6 +115,9 @@ function Highmap(props) { exporting: { buttons: { contextButton: { + symbol: 'menu', + symbolStroke: '#00824D', // ssb-green-4 + text: props.phrases['highcharts.download'], menuItems: [ 'printChart', 'separator', @@ -166,14 +161,34 @@ function Highmap(props) { }, } + function renderHighchartsSource(sourceLink, index) { + return ( +

+ + {props.phrases.source}: {sourceLink.sourceText} + +
+ ) + } + return ( -
+
- - + +
+ {mapOptions.title?.text &&
{mapOptions.title.text}
} + {mapOptions.subtitle?.text &&

{mapOptions.subtitle.text}

} + +
+ {props.footnoteText && + props.footnoteText.map((footnote) => ( + + {footnote && {footnote}} + + ))} + {props.sourceList && props.sourceList.map(renderHighchartsSource)}
- {renderFootnotes(props.footnoteText)}
) } @@ -184,6 +199,7 @@ Highmap.propTypes = { description: PropTypes.string, mapFile: PropTypes.string, tableData: PropTypes.array, + style: PropTypes.object, thresholdValues: PropTypes.array, hideTitle: PropTypes.boolean, colorPalette: PropTypes.string, @@ -192,6 +208,7 @@ Highmap.propTypes = { seriesTitle: PropTypes.string, legendTitle: PropTypes.string, legendAlign: PropTypes.string, + sourceList: PropTypes.array, footnoteText: PropTypes.array, phrases: PropTypes.object, language: PropTypes.string, diff --git a/src/main/resources/site/parts/highmap/highmap.ts b/src/main/resources/site/parts/highmap/highmap.ts index 26f29ddcf..6d79d5a4b 100644 --- a/src/main/resources/site/parts/highmap/highmap.ts +++ b/src/main/resources/site/parts/highmap/highmap.ts @@ -14,54 +14,6 @@ import { type Highmap } from '/site/content-types' const xmlParser: XmlParser = __.newBean('no.ssb.xp.xmlparser.XmlParser') -interface MapFeatures { - properties: { - name?: string - capitalName?: string - } -} - -interface MapResult { - features: Array -} - -interface HighmapTable { - table: { - tbody: { - tr: Array - } - } -} - -interface HighmapFormattedTableData { - capitalName: string - value: number -} - -interface ThresholdValues { - to: number | undefined - from: number | undefined -} - -interface HighmapProps { - title: string - subtitle: Highmap['subtitle'] - description: Highmap['description'] - mapFile: object - tableData: Array - thresholdValues: Array - hideTitle: Highmap['hideTitle'] - colorPalette: Highmap['colorPalette'] - numberDecimals: number | undefined - heightAspectRatio: Highmap['heightAspectRatio'] - seriesTitle: Highmap['seriesTitle'] - legendTitle: Highmap['legendTitle'] - legendAlign: Highmap['legendAlign'] - footnoteText: Highmap['footnoteText'] - phrases: Phrases | undefined - language: string | undefined -} - export function get(req: XP.Request): XP.Response { try { const config = getComponent()?.config @@ -169,11 +121,15 @@ function renderPart(req: XP.Request, highmapId: string | undefined): XP.Response seriesTitle: highmapContent.data.seriesTitle, legendTitle: highmapContent.data.legendTitle, legendAlign: highmapContent.data.legendAlign, + sourceList: highmapContent.data.sourceList ? util.data.forceArray(highmapContent.data.sourceList) : undefined, footnoteText: highmapContent.data.footnoteText ? util.data.forceArray(highmapContent.data.footnoteText) : [], phrases: getPhrases(page), language: page.language, } - + // R4xp disables hydration in edit mode, but highmap need hydration to show + // we sneaky swap mode since we want a render of highmap in edit mode + // Works good for highmap macro, not so much when part + if (req.mode === 'edit') req.mode = 'preview' return render('site/parts/highmap/Highmap', props, req) } return { @@ -252,3 +208,46 @@ function getDataClass(formattedThresholdValues: Array): Array +} +interface HighmapTable { + table: { + tbody: { + tr: Array + } + } +} +interface HighmapFormattedTableData { + capitalName: string + value: number +} +interface ThresholdValues { + to: number | undefined + from: number | undefined +} +interface HighmapProps { + title: string + subtitle: Highmap['subtitle'] + description: Highmap['description'] + mapFile: object + tableData: Array + thresholdValues: Array + hideTitle: Highmap['hideTitle'] + colorPalette: Highmap['colorPalette'] + numberDecimals: number | undefined + heightAspectRatio: Highmap['heightAspectRatio'] + seriesTitle: Highmap['seriesTitle'] + legendTitle: Highmap['legendTitle'] + legendAlign: Highmap['legendAlign'] + sourceList?: Highmap['sourceList'] + footnoteText: Highmap['footnoteText'] + phrases: Phrases | undefined + language: string | undefined +} diff --git a/src/main/resources/site/parts/menuDropdown/DropdownMunicipality.jsx b/src/main/resources/site/parts/menuDropdown/DropdownMunicipality.jsx deleted file mode 100644 index 631678903..000000000 --- a/src/main/resources/site/parts/menuDropdown/DropdownMunicipality.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' -import { Dropdown } from '@statisticsnorway/ssb-component-library' -import PropTypes from 'prop-types' - -const DropdownMunicipality = (props) => { - return ( - { - onSelectMunicipality(e, props.baseUrl) - }} - /> - ) -} - -const onSelectMunicipality = (e, baseUrl) => { - const url = baseUrl + e.id - window.location.href = url -} - -DropdownMunicipality.propTypes = { - ariaLabel: PropTypes.string, - items: PropTypes.arrayOf( - PropTypes.shape({ - title: PropTypes.string, - id: PropTypes.string, - }) - ), - placeholder: PropTypes.string, - baseUrl: PropTypes.string, -} - -export default DropdownMunicipality diff --git a/src/main/resources/site/parts/menuDropdown/menuDropdown.html b/src/main/resources/site/parts/menuDropdown/menuDropdown.html deleted file mode 100644 index e4e09e5f9..000000000 --- a/src/main/resources/site/parts/menuDropdown/menuDropdown.html +++ /dev/null @@ -1,107 +0,0 @@ - diff --git a/src/main/resources/site/parts/menuDropdown/menuDropdown.jsx b/src/main/resources/site/parts/menuDropdown/menuDropdown.jsx new file mode 100644 index 000000000..8b435e100 --- /dev/null +++ b/src/main/resources/site/parts/menuDropdown/menuDropdown.jsx @@ -0,0 +1,162 @@ +import React, { useEffect, useRef, useState } from 'react' +import { Dropdown } from '@statisticsnorway/ssb-component-library' +import PropTypes from 'prop-types' +import { ChevronDown, ChevronUp } from 'react-feather' + +function MenuDropdown(props) { + const { + baseUrl, + dataPathAssetUrl, + dataServiceUrl, + modeMunicipality, + municipality, + municipalityName, + municipalityList, + } = props + const stickyMenuRef = useRef(null) + const [fixedClass, setFixedClass] = useState('') + const [mapOpen, setMapOpen] = useState(false) + + const stickyMenu = () => { + const stickyMenu = stickyMenuRef.current + if (stickyMenu && modeMunicipality) { + const boundingRect = stickyMenu.getBoundingClientRect() + const stickyTop = boundingRect.top + if (stickyTop < 0) { + stickyMenu.style.height = `${boundingRect.height}px` + setFixedClass('fixed-top border-bottom shadow-sm') + } else if (stickyTop > 0) { + stickyMenu.style.height = null + setFixedClass('') + } + } + } + + useEffect(() => { + window.addEventListener('scroll', stickyMenu) + return () => window.removeEventListener('scroll', stickyMenu) + }, []) + + const onSelectMunicipality = (e, baseUrl) => { + const url = baseUrl + e.id + window.location.href = url + } + + const renderMunicipalityLinks = () => { + if (municipalityList) { + return ( + + ) + } + } + + const renderTitleContainer = () => { + return ( +
+ {modeMunicipality && municipality ? ( +
{`${municipalityName} (${municipality.county.name.trim()})`}
+ ) : ( +
Velg kommune i kart
+ )} +
+ ) + } + + const renderSearchContainer = () => { + return ( +
+
+ {modeMunicipality &&
Bytt kommune:
} +
+ { + onSelectMunicipality(e, props.baseUrl) + }} + /> +
+
+ {modeMunicipality && renderShowMapButton()} +
+ ) + } + + const openMap = () => { + setMapOpen(!mapOpen) + if (!mapOpen) { + window.scroll({ + top: stickyMenuRef.current.offsetTop, + behavior: 'smooth', + }) + } + } + + const renderMap = () => { + return ( +
+
+
+
+
+
+
+ ) + } + + const renderShowMapButton = () => { + return ( + + ) + } + + return ( + + ) +} + +MenuDropdown.propTypes = { + modeMunicipality: PropTypes.bool, + ariaLabel: PropTypes.string, + placeholder: PropTypes.string, + items: PropTypes.object, + baseUrl: PropTypes.string, + municipality: PropTypes.object, + municipalityName: PropTypes.string, + municipalityList: PropTypes.object, + dropdownId: PropTypes.string, + dataPathAssetUrl: PropTypes.string, + dataServiceUrl: PropTypes.string, +} + +export default (props) => diff --git a/src/main/resources/site/parts/menuDropdown/menuDropdown.ts b/src/main/resources/site/parts/menuDropdown/menuDropdown.ts index c64e48e69..27c140bd8 100644 --- a/src/main/resources/site/parts/menuDropdown/menuDropdown.ts +++ b/src/main/resources/site/parts/menuDropdown/menuDropdown.ts @@ -1,8 +1,7 @@ import { type Content } from '/lib/xp/content' import { assetUrl, getContent, getComponent, pageUrl, getSiteConfig, serviceUrl } from '/lib/xp/portal' import { localize } from '/lib/xp/i18n' -import { render } from '/lib/thymeleaf' -import { render as r4XpRender } from '/lib/enonic/react4xp' +import { render } from '/lib/enonic/react4xp' import { randomUnsafeString, scriptAsset } from '/lib/ssb/utils/utils' import { type MunicipalityWithCounty, @@ -15,8 +14,6 @@ import { import { renderError } from '/lib/ssb/error/error' import { type MenuDropdown } from '/site/content-types' -const view = resolve('./menuDropdown.html') - export function get(req: RequestWithCode): XP.Response { try { return renderPart(req) @@ -77,10 +74,12 @@ function renderPart(req: RequestWithCode): XP.Response { : undefined const reactUuid: string = randomUnsafeString() - const model: ThymeleafModel = { + const props: MenuDropdownProps = { modeMunicipality: component.config.modeMunicipality, - displayName: page.displayName, - baseUrl, + ariaLabel: searchBarText, + placeholder: searchBarText, + items: municipalityItems, + baseUrl: baseUrl, dataPathAssetUrl, dataServiceUrl, municipality: municipality, @@ -89,26 +88,12 @@ function renderPart(req: RequestWithCode): XP.Response { dropdownId: reactUuid, } - const thymeleafRender: string = render(view, model) - - // Dropdown react object for sticky menu - return r4XpRender( - 'site/parts/menuDropdown/DropdownMunicipality', - { - ariaLabel: searchBarText, - placeholder: searchBarText, - items: municipalityItems, - baseUrl: baseUrl, + return render('site/parts/menuDropdown/menuDropdown', props, req, { + body: '', + pageContributions: { + bodyEnd: [scriptAsset('js/map.js')], }, - req, - { - id: reactUuid, - body: thymeleafRender, - pageContributions: { - bodyEnd: [scriptAsset('js/map.js'), scriptAsset('js/menuDropdown.js')], - }, - } - ) + }) } interface Municipality { @@ -116,9 +101,11 @@ interface Municipality { title: string } -interface ThymeleafModel { +interface MenuDropdownProps { modeMunicipality: boolean - displayName: string + ariaLabel: string + placeholder: string + items: Municipality[] baseUrl: string dataPathAssetUrl: string dataServiceUrl: string diff --git a/src/main/resources/site/parts/nameSearch/nameSearch.jsx b/src/main/resources/site/parts/nameSearch/nameSearch.jsx index 44d75ed73..f05f2cbad 100644 --- a/src/main/resources/site/parts/nameSearch/nameSearch.jsx +++ b/src/main/resources/site/parts/nameSearch/nameSearch.jsx @@ -7,15 +7,18 @@ import { X } from 'react-feather' import Highcharts from 'highcharts' import HighchartsReact from 'highcharts-react-official' import highchartsExporting from 'highcharts/modules/exporting' +import highchartsExportingOffline from 'highcharts/modules/offline-exporting' import highchartsExportData from 'highcharts/modules/export-data' import highchartsAccessibility from 'highcharts/modules/accessibility' import { useMediaQuery } from 'react-responsive' import { addGtagForEvent } from '/react4xp/ReactGA' +import { sanitize } from '../../../lib/ssb/utils/htmlUtils' import accessibilityLang from './../../../assets/js/highchart-lang.json' if (typeof window !== 'undefined' && typeof Highcharts === 'object') { highchartsExporting(Highcharts) + highchartsExportingOffline(Highcharts) highchartsExportData(Highcharts) highchartsAccessibility(Highcharts) } @@ -441,7 +444,7 @@ function NameSearch(props) {
diff --git a/src/main/resources/site/parts/project/project.jsx b/src/main/resources/site/parts/project/project.jsx index 89c005730..09040f9d4 100644 --- a/src/main/resources/site/parts/project/project.jsx +++ b/src/main/resources/site/parts/project/project.jsx @@ -2,6 +2,7 @@ import React from 'react' import { Title, Accordion, Link } from '@statisticsnorway/ssb-component-library' import PropTypes from 'prop-types' import { User, Calendar, Settings } from 'react-feather' +import { sanitize } from '../../../lib/ssb/utils/htmlUtils' const Project = (props) => { const { @@ -85,7 +86,7 @@ const Project = (props) => {
@@ -104,7 +105,7 @@ const Project = (props) => {
@@ -118,7 +119,7 @@ const Project = (props) => {
diff --git a/src/main/resources/site/parts/publicationArchive/publicationArchive.jsx b/src/main/resources/site/parts/publicationArchive/publicationArchive.jsx index 7c3627747..498fedb08 100644 --- a/src/main/resources/site/parts/publicationArchive/publicationArchive.jsx +++ b/src/main/resources/site/parts/publicationArchive/publicationArchive.jsx @@ -4,6 +4,7 @@ import PropTypes from 'prop-types' import { NumericFormat } from 'react-number-format' import { ChevronDown } from 'react-feather' import axios from 'axios' +import { sanitize } from '../../../lib/ssb/utils/htmlUtils' function PublicationArchive(props) { const { @@ -206,7 +207,7 @@ function PublicationArchive(props) {
{renderFilter()} diff --git a/src/main/resources/site/parts/relatedFactPage/relatedFactPage.jsx b/src/main/resources/site/parts/relatedFactPage/relatedFactPage.jsx index 43ac47709..9710a9b94 100644 --- a/src/main/resources/site/parts/relatedFactPage/relatedFactPage.jsx +++ b/src/main/resources/site/parts/relatedFactPage/relatedFactPage.jsx @@ -20,12 +20,12 @@ function RelatedBoxes(props) { ) const [total, setTotal] = useState(firstRelatedContents ? firstRelatedContents.total : 0) const [loading, setLoading] = useState(false) - const [focusElement, setFocusElement] = useState(false) - const currentElement = useRef(null) + const [wasClicked, setWasClicked] = useState(false) + const cards = useRef([]) useEffect(() => { - if (focusElement && currentElement.current) { - currentElement.current.firstChild.focus() + if (cards.current.length > 4 && cards.current[4] && !wasClicked) { + cards.current[4].focus() } }, [relatedFactPages]) @@ -36,7 +36,8 @@ function RelatedBoxes(props) { params: { start: relatedFactPages.length, count: total - relatedFactPages.length, - partConfig, + ...partConfig, + contentIdList: JSON.stringify(partConfig.contentIdList), }, }) .then((res) => { @@ -50,32 +51,20 @@ function RelatedBoxes(props) { }) } - function fetchFirstRelatedFactPages() { + function resetRelatedFactPages() { setLoading(true) - axios - .get(relatedFactPageServiceUrl, { - params: { - start: 0, - count: 4, - partConfig, - }, - }) - .then((res) => { - if (res.data.relatedFactPages.length) { - setRelatedFactPages(res.data.relatedFactPages) - setTotal(res.data.total) - } - }) - .finally(() => { - setLoading(false) - }) + setRelatedFactPages(firstRelatedContents.relatedFactPages) + setTotal(firstRelatedContents.total) + setLoading(false) } - function handleButtonOnClick() { - if (total === relatedFactPages.length) { - fetchFirstRelatedFactPages() - } else { + function handleButtonOnClick(wasClicked) { + setWasClicked(wasClicked) + + if (total > relatedFactPages.length) { fetchAllRelatedFactPages() + } else { + resetRelatedFactPages() } } @@ -101,8 +90,9 @@ function RelatedBoxes(props) { aria-label={`${showingPhrase.replace('{0}', relatedFactPages.length)} ${total} ${factpagePluralName}`} > {relatedFactPages.map((relatedFactPageContent, index) => ( -
  • +
  • (cards.current[index] = element)} className='mb-3' imageSrc={relatedFactPageContent.image} altText={relatedFactPageContent.imageAlt ?? ''} @@ -118,12 +108,11 @@ function RelatedBoxes(props) {
    diff --git a/src/main/resources/site/parts/upcomingReleases/upcomingReleases-test.js b/src/main/resources/site/parts/upcomingReleases/upcomingReleases.test.js similarity index 100% rename from src/main/resources/site/parts/upcomingReleases/upcomingReleases-test.js rename to src/main/resources/site/parts/upcomingReleases/upcomingReleases.test.js diff --git a/src/main/resources/site/processors/browserSync.ts b/src/main/resources/site/processors/browserSync.ts new file mode 100644 index 000000000..1c073b175 --- /dev/null +++ b/src/main/resources/site/processors/browserSync.ts @@ -0,0 +1,32 @@ +import { getBrowserSyncScript, isRunning } from '/lib/browserSync' +import { XP_RUN_MODE } from '/lib/ssb/utils/utils' + +export function responseProcessor(request: XP.Request, res: XP.Response) { + // log.info('req:%s', toStr(req)); + // log.info('res:%s', toStr(res)); + + const { mode } = request + + if (XP_RUN_MODE === 'PROD' || mode === 'inline' || mode === 'live') { + return res + } + + if (!isRunning({ request })) { + log.info('HINT: You are running Enonic XP in development mode, however, BrowserSync is not running.') + return res + } + + const contribution = getBrowserSyncScript({ request }) + + if (!res.pageContributions) res.pageContributions = {} + + if (!res?.pageContributions?.bodyEnd) { + res.pageContributions.bodyEnd = [contribution] + } else if (Array.isArray(res.pageContributions.bodyEnd)) { + res.pageContributions.bodyEnd.push(contribution) + } else { + res.pageContributions.bodyEnd = [res.pageContributions.bodyEnd, contribution] + } + + return res +} diff --git a/src/main/resources/site/processors/react4xpAssetSource.es6 b/src/main/resources/site/processors/react4xpAssetSource.ts similarity index 87% rename from src/main/resources/site/processors/react4xpAssetSource.es6 rename to src/main/resources/site/processors/react4xpAssetSource.ts index d2054996b..96ff676c4 100644 --- a/src/main/resources/site/processors/react4xpAssetSource.es6 +++ b/src/main/resources/site/processors/react4xpAssetSource.ts @@ -1,4 +1,4 @@ -exports.responseProcessor = function (req, res) { +export function responseProcessor(req: XP.Request, res: XP.Response) { if ( res.status === 200 && res.pageContributions && @@ -7,7 +7,7 @@ exports.responseProcessor = function (req, res) { ) { if (req.mode !== 'edit') { const exp = new RegExp('srcs*=s*"(.+?)"') - res.pageContributions.bodyEnd = res.pageContributions.bodyEnd.map((script) => { + res.pageContributions.bodyEnd = res.pageContributions.bodyEnd.map((script: string) => { const match = exp.exec(script) if (match && match.length === 2 && match[1].indexOf('/_/service/mimir/react4xp') >= 1) { let adminPath = '' diff --git a/src/main/resources/site/processors/searchableText.es6 b/src/main/resources/site/processors/searchableText.ts similarity index 76% rename from src/main/resources/site/processors/searchableText.es6 rename to src/main/resources/site/processors/searchableText.ts index 55dcad7ea..7e2264398 100644 --- a/src/main/resources/site/processors/searchableText.es6 +++ b/src/main/resources/site/processors/searchableText.ts @@ -1,4 +1,4 @@ -exports.responseProcessor = function (req, res) { +export function responseProcessor(req: XP.Request, res: XP.Response) { if (res.status === 200 && res.body) { res.body = res.body.replace( /
    /g, diff --git a/src/main/resources/site/site.xml b/src/main/resources/site/site.xml index 5342743e4..8bec992b4 100644 --- a/src/main/resources/site/site.xml +++ b/src/main/resources/site/site.xml @@ -44,7 +44,7 @@ - + @@ -62,14 +62,14 @@ /informasjon/om-statistikkbanken/hvordan-bruke-statistikkbanken - + false - Norsk (Bokmål) + Norsk @@ -147,5 +147,6 @@ + diff --git a/src/main/resources/tasks/cleanupPublishDataset/cleanupPublishDataset.ts b/src/main/resources/tasks/cleanupPublishDataset/cleanupPublishDataset.ts index ad7fc91e6..b7ff15854 100644 --- a/src/main/resources/tasks/cleanupPublishDataset/cleanupPublishDataset.ts +++ b/src/main/resources/tasks/cleanupPublishDataset/cleanupPublishDataset.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { send } from '/lib/xp/event' import { DataSourceStatisticsPublishResult, diff --git a/src/main/resources/tasks/publishDataset/publishDataset.ts b/src/main/resources/tasks/publishDataset/publishDataset.ts index de0a47bd1..288e8fc35 100644 --- a/src/main/resources/tasks/publishDataset/publishDataset.ts +++ b/src/main/resources/tasks/publishDataset/publishDataset.ts @@ -1,4 +1,4 @@ -__non_webpack_require__('/lib/ssb/polyfills/nashorn') +import '/lib/ssb/polyfills/nashorn' import { run as runInContext } from '/lib/xp/context' import { type PublishDataset as PublishDatasetConfig } from '/tasks/publishDataset' import { send } from '/lib/xp/event' diff --git a/src/main/resources/types.ts b/src/main/resources/types.ts index ce09fe7d2..62d453155 100644 --- a/src/main/resources/types.ts +++ b/src/main/resources/types.ts @@ -2,8 +2,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unused-vars */ -declare const __non_webpack_require__: (path: string) => any - declare const resolve: (path: string) => any declare const app: { diff --git a/tsconfig.json b/tsconfig.json index d89322dc7..793eed0b9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,20 @@ { "compilerOptions": { - "target": "es5", + "allowUmdGlobalAccess": true, + "baseUrl": "./", + "moduleResolution": "node", "sourceMap": true, "allowJs": true, "noImplicitAny": true, "noImplicitReturns": true, "noImplicitThis": true, "strictNullChecks": true, - "lib": ["ES5", "ES6"], + "skipLibCheck": true, + "lib": [], "types": [ "node", "@item-enonic-types/global", - "jest" + "global", ], "rootDirs": [ "./src/main/resources", @@ -35,8 +38,13 @@ } }, "include": [ + "node_modules/typescript/lib/lib.es5.d.ts", "./.xp-codegen/**/*", - "./src/main/resources/**/*" + "src/main/resources/**/*.tsx", + "src/main/resources/**/*.ts" ], - "exclude": ["./build/*"] + "exclude": [ + "./build/*", + "src/main/resources/assets/**/*.*", + ] } diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 000000000..6c0d1e7ed --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' +import { type Options } from './tsup' + +import { DIR_DST, DIR_DST_ASSETS } from './tsup/constants' + +export default defineConfig((options: Options) => { + if (options.d === DIR_DST) { + return import('./tsup/server').then((m) => m.default()) + } + if (options.d === DIR_DST_ASSETS) { + return import('./tsup/client-asset').then((m) => m.default()) + } + throw new Error(`Unconfigured directory: ${options.d}!`) +}) diff --git a/tsup/client-asset.ts b/tsup/client-asset.ts new file mode 100644 index 000000000..45d4a60f1 --- /dev/null +++ b/tsup/client-asset.ts @@ -0,0 +1,87 @@ +import { globSync } from 'glob' +import { sassPlugin } from 'esbuild-sass-plugin' +import postcss from 'postcss' +import autoprefixer from 'autoprefixer' +import cssnanoPlugin from 'cssnano' +// import { print } from 'q-i'; +import { DIR_SRC_ASSETS } from './constants' +import { type Options } from '.' + +export default function buildAssetConfig(): Options { + const isDev = process.env.NODE_ENV === 'development' + const SCRIPT_GLOB_EXTENSIONS_ASSETS = '{tsx,ts,jsx,js,es6}' + + // Use object entry to force flat output folder structure, object key is destination path + const SCRIPT_FILES_ASSETS = globSync(`${DIR_SRC_ASSETS}/**/*.${SCRIPT_GLOB_EXTENSIONS_ASSETS}`) + .map((s) => s.replaceAll('\\', '/')) + .reduce((acc, path) => { + const fileName = path.split('/').pop() + if (!fileName) { + acc[path] = path + } else { + acc[`js/${fileName.split('.')[0]}`] = path + } + return acc + }, {}) + + // Not using glob for styles, because we want to bundle them + const STYLE_FILES_ASSETS = { + 'styles/bundle': `${DIR_SRC_ASSETS}/styles/main.scss`, + 'styles/bundle_menu': `${DIR_SRC_ASSETS}/styles/main_menu.scss`, + } + + // print(FILES_ASSETS, { maxItems: Infinity }); + return { + bundle: true, + dts: false, // d.ts files are use useless at runtime + entry: { ...SCRIPT_FILES_ASSETS, ...STYLE_FILES_ASSETS }, + esbuildPlugins: [ + // TSUP/Esbuild plugins don't have a great watching mechanism, so we use sass cli for that + // We keep the sassPlugin for autoprefixer and cssnano used when building for production + sassPlugin({ + // These settings should match build:style in package.json somewhat + style: isDev ? 'expanded' : 'compressed', + loadPaths: ['node_modules', 'node_modules/bootstrap/scss', 'node_modules/@statisticsnorway'], + async transform(source) { + const transformers: postcss.AcceptedPlugin[] = [autoprefixer] + if (!isDev) transformers.push(cssnanoPlugin) + + const { css } = await postcss(transformers).process(source) + return css + }, + }), + ], + loader: { + '.es6': 'js', + }, + outExtension({ format }) { + if (format === 'iife') return { js: '.legacy.js' } + return { + js: '.js', + } + }, + // By default tsup bundles all imported modules, but dependencies + // and peerDependencies in your packages.json are always excluded + external: [ + // Must be loaded into global scope instead + ], + format: [ + 'iife', // For browser + // 'cjs', // Legacy browser support + 'esm', + ], + minify: isDev ? false : true, + + // TIP: Command to check if there are any bad requires left behind + // grep -r 'require("' build/resources/main | grep -v 'require("/'|grep -v chunk + noExternal: ['zipcelx', 'bootstrap/js/dist/collapse'], + + target: 'es2020', + + platform: 'browser', + silent: ['QUIET', 'WARN'].includes(process.env.LOG_LEVEL_FROM_GRADLE || ''), + splitting: true, + sourcemap: isDev ? false : true, + tsconfig: `${DIR_SRC_ASSETS}/tsconfig.json`, + } +} diff --git a/tsup/constants.ts b/tsup/constants.ts new file mode 100644 index 000000000..b05687d03 --- /dev/null +++ b/tsup/constants.ts @@ -0,0 +1,5 @@ +export const DIR_DST = 'build/resources/main' +export const DIR_DST_ASSETS = `${DIR_DST}/assets` + +export const DIR_SRC = 'src/main/resources' +export const DIR_SRC_ASSETS = `${DIR_SRC}/assets` diff --git a/tsup/index.d.ts b/tsup/index.d.ts new file mode 100644 index 000000000..36af02138 --- /dev/null +++ b/tsup/index.d.ts @@ -0,0 +1,5 @@ +import { type Options as TsupOptions } from 'tsup' + +export interface Options extends TsupOptions { + d?: string +} diff --git a/tsup/server.ts b/tsup/server.ts new file mode 100644 index 000000000..087f1544d --- /dev/null +++ b/tsup/server.ts @@ -0,0 +1,74 @@ +import { globSync } from 'glob' +// import { polyfillNode } from 'esbuild-plugin-polyfill-node'; +// import { print } from 'q-i'; +import { DIR_SRC, DIR_SRC_ASSETS } from './constants' +import { type Options } from '.' + +export default function buildServerConfig(): Options { + const GLOB_EXTENSIONS_SERVER = '{ts,js,es6}' + const FILES_SERVER = globSync(`${DIR_SRC}/**/*.${GLOB_EXTENSIONS_SERVER}`, { + absolute: false, + ignore: [...globSync(`${DIR_SRC_ASSETS}/**/*.${GLOB_EXTENSIONS_SERVER}`), ...globSync(`${DIR_SRC}/**/*.test.js`)], + }).map((s) => s.replaceAll('\\', '/')) // Windows OS fix + // print(FILES_SERVER, { maxItems: Infinity }); + + return { + bundle: true, // Needed to bundle @enonic/js-utils + dts: false, // d.ts files are use useless at runtime + entry: FILES_SERVER, + env: { + BROWSER_SYNC_PORT: '3000', + }, + esbuildOptions(options) { + // options.alias = { + // 'alias': './src/main/resources/lib/filename.js' + // }; + + // Some node modules might need globalThis + // options.banner = { + // js: `const globalThis = (1, eval)('this');` // buffer polyfill needs this + // }; + + // If you have libs with chunks, use this to avoid collisions + options.chunkNames = '_chunks/[name]-[hash]' + + options.mainFields = ['module', 'main'] + }, + loader: { + '.es6': 'js', + }, + external: [/^\/lib\//, /^\/react4xp\//, /^\/site\//], + format: 'cjs', + inject: [ + // Injects makes it possible to use some functionality in any file :) + // However it also makes every file larger, unless splitting: true + // If for some reason you cannot use code splitting, it is better + // to import a polyfill only in the entries that needs it. + // Code-js polyfills share code, so together they don't add the sum of all the polyfills. + // For example injecting both number/is-finite and is-integer only adds 60K, not 108K + // Here are some things Nashorn doesn't support, comment them in to inject them: + // 'node_modules/core-js/stable/array/flat.js', // 69K (18K) minified + // 'node_modules/core-js/stable/array/includes.js', // 60K (15K) + // 'node_modules/core-js/stable/math/trunc.js', // 53K (14K) + // 'node_modules/core-js/stable/number/is-finite.js', // 54K (14K) + // 'node_modules/core-js/stable/number/is-integer.js', // 54K (14K) + // 'node_modules/core-js/stable/parse-float.js', // 59K (15K) + // 'node_modules/core-js/stable/reflect/index.js', // 88K (22K) + // 'node_modules/core-js/stable/string/pad-start.js', + // TIP: I used this command to find sizes + // npm --silent run clean && npm --silent run build:server; ls -lh build/resources/main/empty.js; npm --silent run clean && npm --silent run build:server -- --minify; ls -lh build/resources/main/empty.js + ], + minify: false, // Minifying server files makes debugging harder + + // TIP: Command to check if there are any bad requires left behind + // grep -r 'require("' build/resources/main | grep -v 'require("/'|grep -v chunk + noExternal: ['date-fns', 'striptags'], + + platform: 'neutral', + silent: ['QUIET', 'WARN'].includes(process.env.LOG_LEVEL_FROM_GRADLE || ''), + shims: false, // https://tsup.egoist.dev/#inject-cjs-and-esm-shims + splitting: false, // Splitting makes resolve('MyHtml') not work since the splitted files are not in the same location as the original, so the relative path breaks + sourcemap: false, + target: 'es5', + } +} diff --git a/webpack.clientjs.config.js b/webpack.clientjs.config.js deleted file mode 100644 index 009d93ad8..000000000 --- a/webpack.clientjs.config.js +++ /dev/null @@ -1,89 +0,0 @@ -const path = require('path') -const R = require('ramda') -const webpack = require('webpack') -const TerserPlugin = require('terser-webpack-plugin') -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin -const { setEntry, addRule, prependExtensions } = require('./util/compose') -// BABEL -function addBabelSupport(cfg) { - const rule = { - test: /\.js?$/, - exclude: /node_modules/, - loader: 'babel-loader', - options: { - babelrc: false, - plugins: [], - presets: [ - [ - '@babel/preset-env', - '@babel/preset-typescript', - { - // false means polyfill not required runtime - useBuiltIns: false, - }, - ], - ], - }, - } - - return R.pipe( - setEntry('divider', './app/divider.es6'), - setEntry('highchart', './app/highchart.es6'), - setEntry('map', './app/map.es6'), - setEntry('menuDropdown', './app/menuDropdown.es6'), - setEntry('tableExport', './app/tableExport.es6'), - - setEntry('bundle', './main.es6'), - setEntry('ie', './ie.es6'), - addRule(rule), - prependExtensions(['es6', '.js', '.json']) - )(cfg) -} - -// ---------------------------------------------------------------------------- -// Result config -// ---------------------------------------------------------------------------- - -module.exports = (env) => { - const cfg = R.pipe(addBabelSupport)({ - context: path.join(__dirname, '/src/main/resources/assets/js'), - target: ['web', 'es2017'], - entry: {}, - output: { - path: path.join(__dirname, '/build/resources/main/assets/js'), - filename: '[name].js', - }, - resolve: { - extensions: [], - }, - optimization: { - minimizer: [ - new TerserPlugin({ - terserOptions: { - compress: { - drop_console: false, - }, - }, - }), - ], - splitChunks: { - minSize: 30000, - }, - }, - plugins: [ - // new webpack.DefinePlugin({ - // 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), - // 'process.env.TEST': process.env.TEST - // }) - new webpack.EnvironmentPlugin({ - NODE_ENV: 'development', // use 'development' unless process.env.NODE_ENV is defined - // TEST: false - }), - // https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/README.md - new BundleAnalyzerPlugin({ analyzerMode: 'disabled' }), // default is 'server' - ], - mode: env.type, - // devtool: isProd ? false : 'inline-source-map' - }) - return cfg -} diff --git a/webpack.clientts.config.js b/webpack.clientts.config.js deleted file mode 100644 index b58307f4a..000000000 --- a/webpack.clientts.config.js +++ /dev/null @@ -1,74 +0,0 @@ -const path = require('path') -const R = require('ramda') -const TerserPlugin = require('terser-webpack-plugin') -const { - setEntry, - addRule, - prependExtensions -} = require('./util/compose') -const env = require('./util/env') - -const isProd = env.prod - -// ---------------------------------------------------------------------------- -// Base config -// ---------------------------------------------------------------------------- - -const config = { - context: path.join(__dirname, '/src/main/resources/assets/ts'), - entry: {}, - output: { - path: path.join(__dirname, '/build/resources/main/assets/ts'), - filename: '[name].js' - }, - resolve: { - extensions: [] - }, - optimization: { - minimizer: [ - new TerserPlugin({ - terserOptions: { - compress: { - drop_console: false - } - } - }) - ], - splitChunks: { - minSize: 30000 - } - }, - plugins: [], - mode: env.type, - devtool: isProd ? false : 'inline-source-map' -} - -// ---------------------------------------------------------------------------- -// JavaScript loaders -// ---------------------------------------------------------------------------- - -// TYPESCRIPT -function addTypeScriptSupport(cfg) { - const rule = { - test: /\.tsx?$/, - exclude: /node_modules/, - loader: 'ts-loader', - options: { - configFile: 'src/main/resources/assets/tsconfig.client.json' - } - } - - return R.pipe( - setEntry('bundle', './main.ts'), - addRule(rule), - prependExtensions(['.tsx', '.ts', '.json']) - )(cfg) -} - -// ---------------------------------------------------------------------------- -// Result config -// ---------------------------------------------------------------------------- - -module.exports = R.pipe( - addTypeScriptSupport, -)(config) diff --git a/webpack.config.react4xp.js b/webpack.config.react4xp.js index c0fd62c65..1407afa97 100644 --- a/webpack.config.react4xp.js +++ b/webpack.config.react4xp.js @@ -21,6 +21,7 @@ module.exports = function (env, config) { // Take these packages out of vendor.js and put them in their own file. // These are big packages that are not used on every page, thus we let webpack only load them when needed. const vendorSplits = [ + 'xss', 'highcharts', 'react-select', 'react-table', @@ -46,7 +47,7 @@ module.exports = function (env, config) { config.plugins.push(new WatcherTouchPlugin()) config.watch = true } - /* + /* Pro tip, Add: process.env.NODE_ENV = 'development'; to the top of the function in node_modules/@enonic/react4xp/dist/webpack.config.globals.js diff --git a/webpack.server.config.js b/webpack.server.config.js deleted file mode 100644 index 1a0471cfc..000000000 --- a/webpack.server.config.js +++ /dev/null @@ -1,191 +0,0 @@ -// const { print } = require('q-i') -const path = require('path') -const glob = require('glob') -const R = require('ramda') -const TerserPlugin = require('terser-webpack-plugin') -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin -const { setEntriesForPath, addRule, prependExtensions } = require('./util/compose') -const env = require('./util/env') - -const RESOURCES_PATH = 'src/main/resources' - -// ---------------------------------------------------------------------------- -// Base config -// ---------------------------------------------------------------------------- - -const config = { - context: path.join(__dirname, RESOURCES_PATH), - entry: {}, - externals: [ - /^\/admin\//, - /^\/lib\/(.+|\$)$/i, - /^\/react4xp\//, // NOTE: Not certain this will work, has to be tested - /^\/services\//, - /^\/site\//, - /^\/tasks\//, - ], - output: { - path: path.join(__dirname, '/build/resources/main'), - filename: '[name].js', - libraryTarget: 'commonjs', - }, - resolve: { - extensions: [ - '.ts', - '.es6', - '.json', // prependExtensions will handle this - ], - }, - optimization: { - minimize: false, - minimizer: [ - new TerserPlugin({ - terserOptions: { - compress: { - drop_console: false, - }, - keep_classnames: true, - keep_fnames: true, - }, - }), - ], - // usedExports: true, - }, - plugins: [ - // https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/README.md - new BundleAnalyzerPlugin({ analyzerMode: 'disabled' }), // default is 'server' - ], - mode: env.type, - // Source maps are not usable in server scripts - devtool: false, -} - -// ---------------------------------------------------------------------------- -// JavaScript loaders -// ---------------------------------------------------------------------------- - -function listEntries(extensions, ignoreList) { - const CLIENT_FILES = glob.sync(`${RESOURCES_PATH}/assets/**/*.${extensions}`) - const CONTENT_TYPE_CONFIGS = glob.sync(`${RESOURCES_PATH}/site/content-types/**/*.ts`) - const TYPES = glob.sync(`${RESOURCES_PATH}/lib/types/*.ts`) - const PART_CONFIGS = glob.sync(`${RESOURCES_PATH}/site/parts/**/*-part-config.ts`) - const LAYOUT_CONFIGS = glob.sync(`${RESOURCES_PATH}/site/layouts/**/*-config.ts`) - const PAGE_CONFIGS = glob.sync(`${RESOURCES_PATH}/site/pages/**/*-page-config.ts`) - const MACRO_CONFIGS = glob.sync(`${RESOURCES_PATH}/site/macros/**/*-config.ts`) - const IGNORED_FILES = R.pipe( - R.map((entry) => path.join(RESOURCES_PATH, entry)), - R.concat(CLIENT_FILES), - R.concat(CONTENT_TYPE_CONFIGS), - R.concat(TYPES), - R.concat(PART_CONFIGS), - R.concat(LAYOUT_CONFIGS), - R.concat(PAGE_CONFIGS), - R.concat(MACRO_CONFIGS) - )(ignoreList) - const SERVER_FILES = glob.sync(`${RESOURCES_PATH}/**/*.${extensions}`, { - absolute: false, - ignore: IGNORED_FILES, - }) - return SERVER_FILES.map((entry) => path.relative(RESOURCES_PATH, entry)) -} - -// TYPESCRIPT -// function addTypeScriptSupport(cfg) { -// const rule = { -// test: /\.ts$/, -// exclude: /node_modules/, -// loader: 'ts-loader', -// options: { -// configFile: 'src/main/resources/tsconfig.server.json' -// } -// } - -// const entries = listEntries('ts', [ -// // Add additional files to the ignore list. -// // The following path will be transformed to 'src/main/resources/types.ts: -// 'types.ts', -// '*.jsx', -// ]).filter((entry) => entry.indexOf('.d.ts') === -1) -// return R.pipe( -// setEntriesForPath(entries), -// addRule(rule), -// prependExtensions(['.ts', '.json']), -// )(cfg) -// } - -// BABEL -// function addBabelSupport(cfg) { -// const rule = { -// test: /\.(es6?|js|mjs)$/, -// exclude: /node_modules/, -// loader: 'babel-loader', -// options: { -// babelrc: false, -// plugins: [], -// presets: [ -// [ -// '@babel/preset-env', -// { -// // Use custom Browserslist config -// targets: 'node 0.10', -// // Polyfills are not required in runtime -// useBuiltIns: false, -// }, -// ], -// ], -// }, -// } - -// const entries = listEntries('{js,es,es6}', [ -// // Add additional files to the ignore list. -// // The following path will be transformed to 'src/main/resources/lib/observe/observe.es6': -// 'lib/observe/observe.es6', -// ]) - -// return R.pipe( -// setEntriesForPath(entries), -// addRule(rule), -// prependExtensions(['.js', '.es', '.es6', '.json', 'mjs']) -// )(cfg) -// } - -//───────────────────────────────────────────────────────────────────────────── -// SWC (instead of typescript and babel) -//───────────────────────────────────────────────────────────────────────────── -function addSWC(cfg) { - const rule = { - test: /\.([ejt]s6?)?$/, - use: { - loader: 'swc-loader', - options: { - jsc: { - parser: { - syntax: 'typescript', - }, - }, - module: { - type: 'commonjs', - }, - // sync: true, // Run syncronously to get correct error messages - }, - }, - exclude: /node_modules/, - } - const entries = listEntries('{ts,js,es,es6}', []).filter((entry) => entry.indexOf('.d.ts') === -1) - return R.pipe( - setEntriesForPath(entries), - addRule(rule), - prependExtensions(['.ts', '.js', '.es', '.es6', '.json']) - )(cfg) -} - -// ---------------------------------------------------------------------------- -// Result config -// ---------------------------------------------------------------------------- - -module.exports = R.pipe( - // addBabelSupport, - // addTypeScriptSupport, - addSWC -)(config) -// print(module.exports, { maxItems: Infinity }) diff --git a/webpack.styles.config.js b/webpack.styles.config.js deleted file mode 100644 index bbd8e6797..000000000 --- a/webpack.styles.config.js +++ /dev/null @@ -1,116 +0,0 @@ -const path = require('path') -const R = require('ramda') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const { - setEntry, - addRule, - appendExtensions, - addPlugin -} = require('./util/compose') -const env = require('./util/env') -const isProd = env.prod - -// ---------------------------------------------------------------------------- -// Base config -// ---------------------------------------------------------------------------- - -const config = { - context: path.join(__dirname, '/src/main/resources/assets/styles'), - entry: {}, - output: { - path: path.join(__dirname, '/build/resources/main/assets/styles'), - filename: '[name].css' - }, - resolve: { - extensions: [] - }, - plugins: [], - mode: env.type, - devtool: isProd ? false : 'inline-source-map' -} - -// ---------------------------------------------------------------------------- -// CSS loaders -// ---------------------------------------------------------------------------- - -const createDefaultCssLoaders = () => ([ - { - loader: MiniCssExtractPlugin.loader, - options: { - publicPath: '../' - } - }, - { - loader: 'css-loader', - options: { - sourceMap: !isProd, - importLoaders: 1 - } - }, - { - loader: 'postcss-loader', - options: { - sourceMap: !isProd - } - } -]) - -const createCssPlugin = () => ( - new MiniCssExtractPlugin({ - filename: ({ - chunk - }) => `${chunk.name.replace('main', 'bundle')}.css`, - chunkFilename: '[id].css' - }) -) - -// SASS & SCSS -function addSassSupport(cfg) { - const plugin = createCssPlugin() - - const rule = { - test: /\.(sass|scss)$/, - use: [ - ...createDefaultCssLoaders(), - { - loader: 'sass-loader', - options: { - sourceMap: !isProd - } - } - ] - } - - return R.pipe( - setEntry('main', './main.scss'), - setEntry('main_menu', './main_menu.scss'), - addRule(rule), - addPlugin(plugin), - appendExtensions(['.sass', '.scss', '.css']) - )(cfg) -} - -// ---------------------------------------------------------------------------- -// Resource loaders -// ---------------------------------------------------------------------------- - -// FONTS IN CSS -function addFontSupport(cfg) { - const rule = { - test: /\.(eot|woff|woff2|ttf|svg)$/, - use: 'file-loader?name=fonts/[name].[ext]' - } - - return R.pipe( - addRule(rule) - )(cfg) -} - -// ---------------------------------------------------------------------------- -// Result config -// ---------------------------------------------------------------------------- - -module.exports = R.pipe( - addSassSupport, - addFontSupport -)(config)