From b0a57bc079fa00e4a13fa0374c8add3c4947feea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Honza=20Buben=C3=ADk?= Date: Wed, 13 Mar 2024 02:35:03 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 3 + .eslintrc.cjs | 28 + .github/workflows/deploy-docs.yml | 38 + .github/workflows/qa.yml | 109 + .github/workflows/release.yml | 75 + .npmrc | 1 + .nvmrc | 1 + LICENSE | 21 + README.md | 46 + assets/es.svg | 8 + assets/js.svg | 8 + assets/ts.svg | 8 + docs/.gitignore | 2 + docs/.vitepress/config.mts | 126 + .../theme/components/FooterLinks.vue | 251 + docs/.vitepress/theme/components/ZoomImg.vue | 35 + docs/.vitepress/theme/components/test.svg | 3 + docs/.vitepress/theme/index.ts | 27 + docs/.vitepress/theme/style.css | 189 + docs/code-examples/metafile.json | 68 + docs/code-examples/reference/create.js | 5 + docs/code-examples/reference/fetch.js | 10 + .../reference/metafile-base-locale.js | 7 + .../reference/metafile-files-filter.js | 9 + .../reference/metafile-files-find.js | 9 + .../reference/metafile-files-first.js | 7 + .../reference/metafile-files-list.js | 7 + .../reference/metafile-locales.js | 7 + .../reference/metafile-project-url.js | 7 + .../reference/metafile-refresh.js | 7 + .../reference/metafile-switch.js | 7 + docs/code-examples/reference/metafile-url.js | 7 + docs/code-examples/reference/results/fetch.js | 6 + .../reference/results/metafile-base-locale.js | 10 + .../results/metafile-files-filter.js | 38 + .../reference/results/metafile-files-find.js | 36 + .../reference/results/metafile-files-first.js | 36 + .../reference/results/metafile-files-list.js | 38 + .../reference/results/metafile-locales.js | 42 + .../reference/results/metafile-project-url.js | 1 + .../reference/results/metafile-url.js | 1 + .../usage/get-all-files-all-locales.js | 7 + .../get-all-locales-except-base-locale.js | 9 + docs/code-examples/usage/get-all-locales.js | 7 + docs/code-examples/usage/get-base-locale.js | 7 + .../usage/get-multiple-files-all-locales.js | 9 + .../get-multiple-files-multiple-locales.js | 10 + .../usage/get-multiple-files-single-locale.js | 10 + .../usage/get-single-file-all-locales.js | 9 + .../usage/get-single-file-multiple-locales.js | 10 + .../usage/get-single-file-single-locale.js | 10 + .../results/get-all-files-all-locales.js | 34 + .../get-all-locales-except-base-locale.js | 32 + .../usage/results/get-all-locales.js | 42 + .../usage/results/get-base-locale.js | 10 + .../results/get-multiple-files-all-locales.js | 34 + .../get-multiple-files-multiple-locales.js | 16 + .../get-multiple-files-single-locale.js | 10 + .../results/get-single-file-all-locales.js | 32 + .../get-single-file-multiple-locales.js | 14 + .../results/get-single-file-single-locale.js | 6 + docs/examples/i18next.md | 44 + docs/get-started/install.md | 60 + docs/get-started/introduction.md | 18 + docs/get-started/metafile.md | 33 + docs/get-started/working-example.md | 0 docs/index.md | 35 + docs/package-lock.json | 3825 ++++++ docs/package.json | 17 + docs/public/favicon.ico | Bin 0 -> 17089 bytes docs/public/hero.svg | 264 + docs/public/localazy-cdn-client.svg | 40 + docs/public/localazy-logo-white-large.svg | 16 + docs/public/localazy-logo-white.svg | 40 + docs/public/metafile-url-copy.png | Bin 0 -> 33170 bytes docs/public/metafile-url.png | Bin 0 -> 75622 bytes docs/public/ts.svg | 8 + docs/reference/client-api.md | 284 + docs/reference/types.md | 33 + docs/sandbox/live-demo.md | 31 + docs/usage/get-content.md | 103 + docs/usage/get-locales.md | 30 + docs/usage/metafile.md | 27 + package-lock.json | 10110 ++++++++++++++++ package.json | 91 + src/cdn/api/api.ts | 36 + src/cdn/cache/locales-cache.ts | 68 + src/cdn/cache/memory-cache-adapter.ts | 25 + src/cdn/cdn-client.ts | 53 + src/cdn/context/context.ts | 30 + src/cdn/context/metafile-context.ts | 24 + src/cdn/http/axios-http-adapter.ts | 20 + src/cdn/metafile/metafile-data.ts | 94 + src/cdn/metafile/metafile-file.ts | 57 + src/cdn/metafile/metafile-locale.ts | 67 + src/cdn/metafile/metafile-params.ts | 51 + src/cdn/methods/cdn-base.ts | 9 + src/cdn/methods/cdn-cache.ts | 7 + src/cdn/methods/cdn-metafile-files.ts | 63 + src/cdn/methods/cdn-metafile.ts | 53 + src/cdn/request/locales-map.ts | 14 + src/cdn/request/request-builder.ts | 152 + src/cdn/request/request.ts | 54 + src/cdn/response/response-factory.ts | 87 + src/interfaces/i-cache-adapter.ts | 6 + src/interfaces/i-http-adapter.ts | 5 + src/interfaces/i-locales-cache-item.ts | 7 + src/interfaces/i-metafile-file-locale.ts | 10 + src/interfaces/i-metafile-file.ts | 12 + src/interfaces/i-metafile-files.ts | 5 + src/interfaces/i-metafile-params.ts | 6 + src/interfaces/i-metafile.ts | 8 + src/interfaces/i-request-builder.ts | 10 + src/main.ts | 68 + src/shims-axios.d.ts | 12 + src/types/api-locale-request.ts | 3 + src/types/cache-get-locales-request.ts | 3 + src/types/cache-has-locales-request.ts | 3 + src/types/cache-key-metafile-options.ts | 3 + src/types/cache-store-locales-request.ts | 5 + src/types/cdn-client-options.ts | 8 + src/types/cdn-fetch-options.ts | 24 + src/types/cdn-file-locale.ts | 18 + src/types/cdn-file.ts | 45 + src/types/cdn-files-search-options.ts | 15 + src/types/cdn-locale.ts | 43 + src/types/cdn-locales-options.ts | 6 + src/types/cdn-response.ts | 26 + src/types/context-options.ts | 9 + src/types/exclude-base-locale.ts | 3 + src/types/file-response.ts | 5 + src/types/files-map.ts | 5 + src/types/json-response.ts | 3 + src/types/locale-response.ts | 5 + src/types/locales-map-data.ts | 5 + src/types/locales-map-options.ts | 8 + src/types/metafile-file-options.ts | 8 + src/types/metafile-options.ts | 3 + src/types/response-factory-options.ts | 10 + tests/cdn-files-types.spec.ts | 269 + tests/cdn-files.spec.ts | 143 + tests/cdn-metafile-files.spec.ts | 43 + tests/cdn-metafile.spec.ts | 90 + tests/cdn.spec.ts | 32 + tests/errors-http.spec.ts | 23 + tests/errors-responses.spec.ts | 138 + .../complete-metafile-v2/file01/en/file.json | 5 + .../file01/ms-BN/file.json | 5 + tests/fixtures/complete-metafile-v2/index.ts | 67 + .../complete-metafile-v2/metafile.json | 160 + .../complete-metafile/file01/en/file.json | 4 + .../file01/ms-Arab/file.json | 4 + .../complete-metafile/file01/ms-BN/file.json | 4 + .../file01/ms-ID-Latn/file.json | 4 + .../complete-metafile/file02/en/file.json | 3 + .../file02/ms-Arab/file.json | 3 + .../complete-metafile/file02/ms-BN/file.json | 3 + .../file02/ms-ID-Latn/file.json | 3 + .../complete-metafile/file03/en/file.json | 3 + .../file03/ms-Arab/file.json | 3 + .../complete-metafile/file03/ms-BN/file.json | 3 + .../file03/ms-ID-Latn/file.json | 3 + tests/fixtures/complete-metafile/index.ts | 265 + .../fixtures/complete-metafile/metafile.json | 160 + tests/fixtures/empty-metafile/index.ts | 17 + tests/fixtures/empty-metafile/metafile.json | 7 + .../file01-json/en/plain.json | 38 + .../file01-json/es/plain.json | 38 + .../file01-json/fr/plain.json | 38 + .../file02-json5/en/texts.json5 | 52 + .../file02-json5/es/texts.json5 | 52 + .../file02-json5/fr/texts.json5 | 52 + .../file03-neon/en/plain.neon | 5 + .../file03-neon/es/plain.neon | 5 + .../file03-neon/fr/plain.neon | 5 + .../file04-yaml/en/plain.yaml | 35 + .../file04-yaml/es/plain.yaml | 34 + .../file04-yaml/fr/plain.yaml | 34 + .../file05-xml/en/resources.xml | 33 + .../file05-xml/es/resources.xml | 33 + .../file05-xml/fr/resources.xml | 33 + .../file06-srt/en/subtitles.srt | 30 + .../file06-srt/es/subtitles.srt | 30 + .../file06-srt/fr/subtitles.srt | 30 + .../file07-ini/en/plain.ini | 29 + .../file07-ini/es/plain.ini | 29 + .../file07-ini/fr/plain.ini | 29 + .../file08-strings/en/Localizable.strings | 32 + .../file08-strings/es/Localizable.strings | 32 + .../file08-strings/fr/Localizable.strings | 32 + .../file09-toml/en/file.toml | 35 + .../file09-toml/es/file.toml | 35 + .../file09-toml/fr/file.toml | 35 + .../file10-resx/en/resources.resx | 110 + .../file10-resx/es/resources.resx | 110 + .../file10-resx/fr/resources.resx | 110 + .../file11-xliff/en/translate.xliff | 30 + .../file11-xliff/es/translate.xliff | 30 + .../file11-xliff/fr/translate.xliff | 30 + .../file12-properties/en/local.properties | 32 + .../file12-properties/es/local.properties | 32 + .../file12-properties/fr/local.properties | 32 + .../file13-csv/en/export.csv | 29 + .../file13-csv/es/export.csv | 29 + .../file13-csv/fr/export.csv | 29 + .../file14-ts/en/resources.ts | 22 + .../file14-ts/es/resources.ts | 22 + .../file14-ts/fr/resources.ts | 22 + .../file15-js/en/default.js | 52 + .../file15-js/es/default.js | 52 + .../file15-js/fr/default.js | 52 + .../file16-php/en/structured.php | 58 + .../file16-php/es/structured.php | 57 + .../file16-php/fr/structured.php | 57 + .../file17-pot/en/messages.pot | 99 + .../file17-pot/es/messages.pot | 99 + .../file17-pot/fr/messages.pot | 99 + .../file18-po/en/messages.po | 101 + .../file18-po/es/messages.po | 101 + .../file18-po/fr/messages.po | 101 + tests/fixtures/file-types-metafile/index.ts | 314 + .../file-types-metafile/metafile.json | 745 ++ .../files-without-locales-metafile/index.ts | 18 + .../metafile.json | 18 + tests/fixtures/index.ts | 7 + tests/fixtures/server-error-metafile/index.ts | 12 + .../single-file-metafile/file01/en/file.json | 6 + .../single-file-metafile/file01/ms/file.json | 6 + tests/fixtures/single-file-metafile/index.ts | 39 + .../single-file-metafile/metafile.json | 38 + tests/mocks/axios-mock.ts | 6 + tsconfig.json | 34 + tsconfig.node.json | 6 + tsconfig.typedoc.json | 6 + vite.config.ts | 102 + vitest.config.ts | 27 + 236 files changed, 23460 insertions(+) create mode 100644 .eslintignore create mode 100644 .eslintrc.cjs create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 .github/workflows/qa.yml create mode 100644 .github/workflows/release.yml create mode 100644 .npmrc create mode 100644 .nvmrc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/es.svg create mode 100644 assets/js.svg create mode 100644 assets/ts.svg create mode 100644 docs/.gitignore create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/.vitepress/theme/components/FooterLinks.vue create mode 100644 docs/.vitepress/theme/components/ZoomImg.vue create mode 100644 docs/.vitepress/theme/components/test.svg create mode 100644 docs/.vitepress/theme/index.ts create mode 100644 docs/.vitepress/theme/style.css create mode 100644 docs/code-examples/metafile.json create mode 100644 docs/code-examples/reference/create.js create mode 100644 docs/code-examples/reference/fetch.js create mode 100644 docs/code-examples/reference/metafile-base-locale.js create mode 100644 docs/code-examples/reference/metafile-files-filter.js create mode 100644 docs/code-examples/reference/metafile-files-find.js create mode 100644 docs/code-examples/reference/metafile-files-first.js create mode 100644 docs/code-examples/reference/metafile-files-list.js create mode 100644 docs/code-examples/reference/metafile-locales.js create mode 100644 docs/code-examples/reference/metafile-project-url.js create mode 100644 docs/code-examples/reference/metafile-refresh.js create mode 100644 docs/code-examples/reference/metafile-switch.js create mode 100644 docs/code-examples/reference/metafile-url.js create mode 100644 docs/code-examples/reference/results/fetch.js create mode 100644 docs/code-examples/reference/results/metafile-base-locale.js create mode 100644 docs/code-examples/reference/results/metafile-files-filter.js create mode 100644 docs/code-examples/reference/results/metafile-files-find.js create mode 100644 docs/code-examples/reference/results/metafile-files-first.js create mode 100644 docs/code-examples/reference/results/metafile-files-list.js create mode 100644 docs/code-examples/reference/results/metafile-locales.js create mode 100644 docs/code-examples/reference/results/metafile-project-url.js create mode 100644 docs/code-examples/reference/results/metafile-url.js create mode 100644 docs/code-examples/usage/get-all-files-all-locales.js create mode 100644 docs/code-examples/usage/get-all-locales-except-base-locale.js create mode 100644 docs/code-examples/usage/get-all-locales.js create mode 100644 docs/code-examples/usage/get-base-locale.js create mode 100644 docs/code-examples/usage/get-multiple-files-all-locales.js create mode 100644 docs/code-examples/usage/get-multiple-files-multiple-locales.js create mode 100644 docs/code-examples/usage/get-multiple-files-single-locale.js create mode 100644 docs/code-examples/usage/get-single-file-all-locales.js create mode 100644 docs/code-examples/usage/get-single-file-multiple-locales.js create mode 100644 docs/code-examples/usage/get-single-file-single-locale.js create mode 100644 docs/code-examples/usage/results/get-all-files-all-locales.js create mode 100644 docs/code-examples/usage/results/get-all-locales-except-base-locale.js create mode 100644 docs/code-examples/usage/results/get-all-locales.js create mode 100644 docs/code-examples/usage/results/get-base-locale.js create mode 100644 docs/code-examples/usage/results/get-multiple-files-all-locales.js create mode 100644 docs/code-examples/usage/results/get-multiple-files-multiple-locales.js create mode 100644 docs/code-examples/usage/results/get-multiple-files-single-locale.js create mode 100644 docs/code-examples/usage/results/get-single-file-all-locales.js create mode 100644 docs/code-examples/usage/results/get-single-file-multiple-locales.js create mode 100644 docs/code-examples/usage/results/get-single-file-single-locale.js create mode 100644 docs/examples/i18next.md create mode 100644 docs/get-started/install.md create mode 100644 docs/get-started/introduction.md create mode 100644 docs/get-started/metafile.md create mode 100644 docs/get-started/working-example.md create mode 100644 docs/index.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/public/favicon.ico create mode 100644 docs/public/hero.svg create mode 100644 docs/public/localazy-cdn-client.svg create mode 100644 docs/public/localazy-logo-white-large.svg create mode 100644 docs/public/localazy-logo-white.svg create mode 100644 docs/public/metafile-url-copy.png create mode 100644 docs/public/metafile-url.png create mode 100644 docs/public/ts.svg create mode 100644 docs/reference/client-api.md create mode 100644 docs/reference/types.md create mode 100644 docs/sandbox/live-demo.md create mode 100644 docs/usage/get-content.md create mode 100644 docs/usage/get-locales.md create mode 100644 docs/usage/metafile.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/cdn/api/api.ts create mode 100644 src/cdn/cache/locales-cache.ts create mode 100644 src/cdn/cache/memory-cache-adapter.ts create mode 100644 src/cdn/cdn-client.ts create mode 100644 src/cdn/context/context.ts create mode 100644 src/cdn/context/metafile-context.ts create mode 100644 src/cdn/http/axios-http-adapter.ts create mode 100644 src/cdn/metafile/metafile-data.ts create mode 100644 src/cdn/metafile/metafile-file.ts create mode 100644 src/cdn/metafile/metafile-locale.ts create mode 100644 src/cdn/metafile/metafile-params.ts create mode 100644 src/cdn/methods/cdn-base.ts create mode 100644 src/cdn/methods/cdn-cache.ts create mode 100644 src/cdn/methods/cdn-metafile-files.ts create mode 100644 src/cdn/methods/cdn-metafile.ts create mode 100644 src/cdn/request/locales-map.ts create mode 100644 src/cdn/request/request-builder.ts create mode 100644 src/cdn/request/request.ts create mode 100644 src/cdn/response/response-factory.ts create mode 100644 src/interfaces/i-cache-adapter.ts create mode 100644 src/interfaces/i-http-adapter.ts create mode 100644 src/interfaces/i-locales-cache-item.ts create mode 100644 src/interfaces/i-metafile-file-locale.ts create mode 100644 src/interfaces/i-metafile-file.ts create mode 100644 src/interfaces/i-metafile-files.ts create mode 100644 src/interfaces/i-metafile-params.ts create mode 100644 src/interfaces/i-metafile.ts create mode 100644 src/interfaces/i-request-builder.ts create mode 100644 src/main.ts create mode 100644 src/shims-axios.d.ts create mode 100644 src/types/api-locale-request.ts create mode 100644 src/types/cache-get-locales-request.ts create mode 100644 src/types/cache-has-locales-request.ts create mode 100644 src/types/cache-key-metafile-options.ts create mode 100644 src/types/cache-store-locales-request.ts create mode 100644 src/types/cdn-client-options.ts create mode 100644 src/types/cdn-fetch-options.ts create mode 100644 src/types/cdn-file-locale.ts create mode 100644 src/types/cdn-file.ts create mode 100644 src/types/cdn-files-search-options.ts create mode 100644 src/types/cdn-locale.ts create mode 100644 src/types/cdn-locales-options.ts create mode 100644 src/types/cdn-response.ts create mode 100644 src/types/context-options.ts create mode 100644 src/types/exclude-base-locale.ts create mode 100644 src/types/file-response.ts create mode 100644 src/types/files-map.ts create mode 100644 src/types/json-response.ts create mode 100644 src/types/locale-response.ts create mode 100644 src/types/locales-map-data.ts create mode 100644 src/types/locales-map-options.ts create mode 100644 src/types/metafile-file-options.ts create mode 100644 src/types/metafile-options.ts create mode 100644 src/types/response-factory-options.ts create mode 100644 tests/cdn-files-types.spec.ts create mode 100644 tests/cdn-files.spec.ts create mode 100644 tests/cdn-metafile-files.spec.ts create mode 100644 tests/cdn-metafile.spec.ts create mode 100644 tests/cdn.spec.ts create mode 100644 tests/errors-http.spec.ts create mode 100644 tests/errors-responses.spec.ts create mode 100644 tests/fixtures/complete-metafile-v2/file01/en/file.json create mode 100644 tests/fixtures/complete-metafile-v2/file01/ms-BN/file.json create mode 100644 tests/fixtures/complete-metafile-v2/index.ts create mode 100644 tests/fixtures/complete-metafile-v2/metafile.json create mode 100644 tests/fixtures/complete-metafile/file01/en/file.json create mode 100644 tests/fixtures/complete-metafile/file01/ms-Arab/file.json create mode 100644 tests/fixtures/complete-metafile/file01/ms-BN/file.json create mode 100644 tests/fixtures/complete-metafile/file01/ms-ID-Latn/file.json create mode 100644 tests/fixtures/complete-metafile/file02/en/file.json create mode 100644 tests/fixtures/complete-metafile/file02/ms-Arab/file.json create mode 100644 tests/fixtures/complete-metafile/file02/ms-BN/file.json create mode 100644 tests/fixtures/complete-metafile/file02/ms-ID-Latn/file.json create mode 100644 tests/fixtures/complete-metafile/file03/en/file.json create mode 100644 tests/fixtures/complete-metafile/file03/ms-Arab/file.json create mode 100644 tests/fixtures/complete-metafile/file03/ms-BN/file.json create mode 100644 tests/fixtures/complete-metafile/file03/ms-ID-Latn/file.json create mode 100644 tests/fixtures/complete-metafile/index.ts create mode 100644 tests/fixtures/complete-metafile/metafile.json create mode 100644 tests/fixtures/empty-metafile/index.ts create mode 100644 tests/fixtures/empty-metafile/metafile.json create mode 100644 tests/fixtures/file-types-metafile/file01-json/en/plain.json create mode 100644 tests/fixtures/file-types-metafile/file01-json/es/plain.json create mode 100644 tests/fixtures/file-types-metafile/file01-json/fr/plain.json create mode 100644 tests/fixtures/file-types-metafile/file02-json5/en/texts.json5 create mode 100644 tests/fixtures/file-types-metafile/file02-json5/es/texts.json5 create mode 100644 tests/fixtures/file-types-metafile/file02-json5/fr/texts.json5 create mode 100644 tests/fixtures/file-types-metafile/file03-neon/en/plain.neon create mode 100644 tests/fixtures/file-types-metafile/file03-neon/es/plain.neon create mode 100644 tests/fixtures/file-types-metafile/file03-neon/fr/plain.neon create mode 100644 tests/fixtures/file-types-metafile/file04-yaml/en/plain.yaml create mode 100644 tests/fixtures/file-types-metafile/file04-yaml/es/plain.yaml create mode 100644 tests/fixtures/file-types-metafile/file04-yaml/fr/plain.yaml create mode 100644 tests/fixtures/file-types-metafile/file05-xml/en/resources.xml create mode 100644 tests/fixtures/file-types-metafile/file05-xml/es/resources.xml create mode 100644 tests/fixtures/file-types-metafile/file05-xml/fr/resources.xml create mode 100644 tests/fixtures/file-types-metafile/file06-srt/en/subtitles.srt create mode 100644 tests/fixtures/file-types-metafile/file06-srt/es/subtitles.srt create mode 100644 tests/fixtures/file-types-metafile/file06-srt/fr/subtitles.srt create mode 100644 tests/fixtures/file-types-metafile/file07-ini/en/plain.ini create mode 100644 tests/fixtures/file-types-metafile/file07-ini/es/plain.ini create mode 100644 tests/fixtures/file-types-metafile/file07-ini/fr/plain.ini create mode 100644 tests/fixtures/file-types-metafile/file08-strings/en/Localizable.strings create mode 100644 tests/fixtures/file-types-metafile/file08-strings/es/Localizable.strings create mode 100644 tests/fixtures/file-types-metafile/file08-strings/fr/Localizable.strings create mode 100644 tests/fixtures/file-types-metafile/file09-toml/en/file.toml create mode 100644 tests/fixtures/file-types-metafile/file09-toml/es/file.toml create mode 100644 tests/fixtures/file-types-metafile/file09-toml/fr/file.toml create mode 100644 tests/fixtures/file-types-metafile/file10-resx/en/resources.resx create mode 100644 tests/fixtures/file-types-metafile/file10-resx/es/resources.resx create mode 100644 tests/fixtures/file-types-metafile/file10-resx/fr/resources.resx create mode 100644 tests/fixtures/file-types-metafile/file11-xliff/en/translate.xliff create mode 100644 tests/fixtures/file-types-metafile/file11-xliff/es/translate.xliff create mode 100644 tests/fixtures/file-types-metafile/file11-xliff/fr/translate.xliff create mode 100644 tests/fixtures/file-types-metafile/file12-properties/en/local.properties create mode 100644 tests/fixtures/file-types-metafile/file12-properties/es/local.properties create mode 100644 tests/fixtures/file-types-metafile/file12-properties/fr/local.properties create mode 100644 tests/fixtures/file-types-metafile/file13-csv/en/export.csv create mode 100644 tests/fixtures/file-types-metafile/file13-csv/es/export.csv create mode 100644 tests/fixtures/file-types-metafile/file13-csv/fr/export.csv create mode 100644 tests/fixtures/file-types-metafile/file14-ts/en/resources.ts create mode 100644 tests/fixtures/file-types-metafile/file14-ts/es/resources.ts create mode 100644 tests/fixtures/file-types-metafile/file14-ts/fr/resources.ts create mode 100644 tests/fixtures/file-types-metafile/file15-js/en/default.js create mode 100644 tests/fixtures/file-types-metafile/file15-js/es/default.js create mode 100644 tests/fixtures/file-types-metafile/file15-js/fr/default.js create mode 100644 tests/fixtures/file-types-metafile/file16-php/en/structured.php create mode 100644 tests/fixtures/file-types-metafile/file16-php/es/structured.php create mode 100644 tests/fixtures/file-types-metafile/file16-php/fr/structured.php create mode 100644 tests/fixtures/file-types-metafile/file17-pot/en/messages.pot create mode 100644 tests/fixtures/file-types-metafile/file17-pot/es/messages.pot create mode 100644 tests/fixtures/file-types-metafile/file17-pot/fr/messages.pot create mode 100644 tests/fixtures/file-types-metafile/file18-po/en/messages.po create mode 100644 tests/fixtures/file-types-metafile/file18-po/es/messages.po create mode 100644 tests/fixtures/file-types-metafile/file18-po/fr/messages.po create mode 100644 tests/fixtures/file-types-metafile/index.ts create mode 100644 tests/fixtures/file-types-metafile/metafile.json create mode 100644 tests/fixtures/files-without-locales-metafile/index.ts create mode 100644 tests/fixtures/files-without-locales-metafile/metafile.json create mode 100644 tests/fixtures/index.ts create mode 100644 tests/fixtures/server-error-metafile/index.ts create mode 100644 tests/fixtures/single-file-metafile/file01/en/file.json create mode 100644 tests/fixtures/single-file-metafile/file01/ms/file.json create mode 100644 tests/fixtures/single-file-metafile/index.ts create mode 100644 tests/fixtures/single-file-metafile/metafile.json create mode 100644 tests/mocks/axios-mock.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.typedoc.json create mode 100644 vite.config.ts create mode 100644 vitest.config.ts diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..c028be5 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +tests/fixtures/file-types-metafile/file15-js/ +tests/fixtures/file-types-metafile/file14-ts/ +docs/code-examples/ diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..5b022b0 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,28 @@ +module.exports = { + root: true, + env: { + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended-type-checked', + 'airbnb-base', + 'airbnb-typescript/base', + ], + parserOptions: { + project: ['tsconfig.json', 'tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + ], + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'import/extensions': 'off', + 'import/prefer-default-export': 'off', + 'max-len': ['error', { code: 120 }], + 'prefer-destructuring': 'off', + }, +}; diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..d1a5ff1 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,38 @@ +name: Deploy Docs + +on: + push: + branches: + - main + +permissions: + contents: write + +jobs: + deploy-docs: + name: Deploy Docs + runs-on: [ self-hosted, Linux ] + env: + NODE_OPTIONS: --max_old_space_size=8192 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Build Docs + run: | + cd docs + npm ci + npm run build + + - name: Update Docs Branch + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: docs/.vitepress/dist diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml new file mode 100644 index 0000000..f0b3954 --- /dev/null +++ b/.github/workflows/qa.yml @@ -0,0 +1,109 @@ +name: QA checks + +on: + pull_request: + branches: + - main + + push: + branches: + - docs + +jobs: + lint: + name: Lint, Typecheck, Test and Build source files + runs-on: [ self-hosted, Linux ] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm ci + + - name: Lint source files + run: npm run lint + + - name: Check types + run: npm run typecheck + + - name: Run tests + run: npm run test:coverage + + - name: Build package + run: npm run build + + - name: 'Report Coverage' + if: always() + uses: davelosert/vitest-coverage-report-action@v2 + + - name: Gather data + id: data + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + LICENSE=$(node -p "require('./package.json').license") + echo "license=$LICENSE" >> "$GITHUB_OUTPUT" + COVERAGE=50 + echo "coverage=$COVERAGE" >> "$GITHUB_OUTPUT" + BRANCH=${GITHUB_REF#refs/heads/} + echo "branch=$BRANCH" >> "${GITHUB_OUTPUT}" + shell: bash + + - uses: actions/checkout@v4 + with: + ref: gh-badges + + - name: Create badges directory + run: mkdir -p "${{ steps.data.outputs.branch }}" + shell: bash + + - name: Generate version badge + uses: emibcn/badge-action@v2.0.2 + with: + label: npm + status: ${{ steps.data.outputs.version }} + color: 066fef + path: ${{ steps.data.outputs.branch }}/version.svg + + - name: Generate coverage badge + uses: emibcn/badge-action@v2.0.2 + with: + label: coverage + status: ${{ steps.data.outputs.coverage }}% + color: ${{ steps.data.outputs.coverage > 90 && 'green' + || steps.data.outputs.coverage > 80 && 'yellow,green' + || steps.data.outputs.coverage > 70 && 'yellow' + || steps.data.outputs.coverage > 60 && 'orange,yellow' + || steps.data.outputs.coverage > 50 && 'orange' + || steps.data.outputs.coverage > 40 && 'red,orange' + || steps.data.outputs.coverage > 30 && 'red,red,orange' + || steps.data.outputs.coverage > 20 && 'red,red,red,orange' + || 'red' }} + path: ${{ steps.data.outputs.branch }}/coverage.svg + + - name: Generate license badge + uses: emibcn/badge-action@v2.0.2 + with: + label: license + status: ${{ steps.data.outputs.license }} + color: 066fef,ffffff + path: ${{ steps.data.outputs.branch }}/license.svg + + - name: Commit files + run: | + git config --local user.email "${{ github.actor_id }}+github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add . + git status + git commit -m "Update badges" + + - name: Push changes + uses: ad-m/github-push-action@v0.8.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: gh-badges diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d283785 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,75 @@ +name: Release CI + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + ci: + name: CI Init + runs-on: [ self-hosted, Linux ] + outputs: + action: ${{ steps.init.outputs.action }} + steps: + - id: init + uses: localazy/release/init@v2 + + prepare: + name: Prepare Release PR + needs: ci + if: needs.ci.outputs.action == 'prepare' + runs-on: [ self-hosted, Linux ] + steps: + - uses: localazy/release/prepare@v2 + with: + node-version: 20 + app-id: ${{ secrets.AUTH_APP_ID }} + app-key: ${{ secrets.AUTH_APP_KEY }} + + publish: + name: Publish Release + needs: ci + if: needs.ci.outputs.action == 'publish' + runs-on: [ self-hosted, Linux ] + steps: + - uses: localazy/release/publish@v2 + with: + node-version: 20 + app-id: ${{ secrets.AUTH_APP_ID }} + app-key: ${{ secrets.AUTH_APP_KEY }} + npm-publish: public + npm-token: ${{ secrets.NPM_AUTH_TOKEN_PUBLIC }} + + deploy-docs: + name: Deploy Docs + needs: publish + runs-on: [ self-hosted, Linux ] + env: + NODE_OPTIONS: --max_old_space_size=8192 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Build Docs + run: | + cd docs + npm ci + npm run docs:build + + - name: Update Docs Branch + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: docs/.vuepress/dist diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b215581 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +fund=false diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0d1bcb1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Localazy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e637c83 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +
+ +[Localazy](https://localazy.com) + +### 📦 `@localazy/cdn-client` + +Node.js module that allows you to easily interact with the [Localazy CDN](https://localazy.com/docs/cdn/cdn-introduction). + +[**Documentation**](https://localazy.github.io/cdn-client/)  |  +[**Getting Started**](https://localazy.github.io/cdn-client/get-started/introduction.html)  |  +[**API Reference**](https://localazy.github.io/cdn-client/reference/client-api.html)  |  +[**Live Demo**]() + +
+ +## 🔧 Install + +```bash +npm install @localazy/cdn-client +# or use your favorite package manager +``` + +For more information, visit the [installation guide](https://localazy.com/docs/cdn/cdn-introduction). + +## 🛟 Support + +- [Intercom chat](https://localazy.com) +- [GitHub issues](https://github.com/localazy/cdn-client/issues) +- [Discussion forum](https://discuss.localazy.com/) +- [team@localazy.com](mailto:team@localazy.com) + +## 💙 Localazy Ecosystem + +Check out other npm packages from Localazy: + +- [@localazy/cli](https://www.npmjs.com/package/@localazy/cli) +- [@localazy/api-client](https://www.npmjs.com/package/@localazy/api-client) +- [@localazy/cdn-client](https://www.npmjs.com/package/@localazy/cdn-client) +- [@localazy/languages](https://www.npmjs.com/package/@localazy/languages) +- [@localazy/strapi-plugin](https://www.npmjs.com/package/@localazy/strapi-plugin) + +Discover all available [integration options and localization examples](https://github.com/localazy). + +## 📜 License + +Code released under the [MIT license](LICENSE). diff --git a/assets/es.svg b/assets/es.svg new file mode 100644 index 0000000..8056088 --- /dev/null +++ b/assets/es.svg @@ -0,0 +1,8 @@ + + + + + + ES + + diff --git a/assets/js.svg b/assets/js.svg new file mode 100644 index 0000000..de4b085 --- /dev/null +++ b/assets/js.svg @@ -0,0 +1,8 @@ + + + + + + JS + + diff --git a/assets/ts.svg b/assets/ts.svg new file mode 100644 index 0000000..1aac275 --- /dev/null +++ b/assets/ts.svg @@ -0,0 +1,8 @@ + + + + + + TS + + diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..e330f78 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +node_modules +.vitepress/cache diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..81e857f --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,126 @@ +import { defineConfig } from 'vitepress'; +import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs'; +import { npmCommandsMarkdownPlugin } from 'vitepress-plugin-npm-commands'; +import { version } from '../../package.json'; +import container from 'markdown-it-container'; +import { renderSandbox } from 'vitepress-plugin-sandpack'; + +export default defineConfig({ + title: 'CDN Client', + description: 'Localazy CDN Client Documentation', + head: [ + ['link', { rel: 'icon', href: '/cdn-client/favicon.ico' }], + ['link', { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap' }] + ], + base: '/cdn-client/', + + markdown: { + lineNumbers: true, + config(md) { + md.use(tabsMarkdownPlugin); + md.use(npmCommandsMarkdownPlugin); + // rule of 'html tag name' to 'component name' + // 'sanbox' -> 'Sandbox' + // 'my-sandbox' -> MySandbox + // 'sandbox-react-demo' -> SandboxReactDemo + md.use(container, 'sandbox', { + render(tokens, idx) { + return renderSandbox(tokens, idx, 'sandbox'); + } + }); + }, + // https://shiki.style + theme: { + light: 'github-light', + dark: 'github-dark' + } + }, + + themeConfig: { + logo: { src: 'https://localazy.com/directus9/assets/89c7bdc9-387c-4267-9632-64afcddb8e5a', width: 24, height: 24 }, + + nav: nav(), + + sidebar: [ + { + text: 'Get Started', + items: [ + { text: 'Introduction', link: '/get-started/introduction' }, + { text: 'Install', link: '/get-started/install' }, + { text: 'Metafile', link: '/get-started/metafile' } + ] + }, + { + text: 'Usage', + items: [ + { + text: 'Get locales', + link: '/usage/get-locales' + }, + { + text: 'Get content', + link: '/usage/get-content', + items: [ + { text: 'Selecting data', link: '/usage/get-content#selecting-data' }, + { text: 'Single file', link: '/usage/get-content#single-file' }, + { text: 'Multiple files', link: '/usage/get-content#multiple-files' } + ] + }, + ] + }, + // { + // text: 'Sandbox', + // items: [ + // { text: 'Live demo', link: '/sandbox/live-demo' } + // ] + // }, + // { + // text: 'Examples', + // items: [ + // { text: 'i18next', link: '/examples/i18next' } + // ] + // }, + { + text: 'Reference', + items: [ + { text: 'Client API', link: '/reference/client-api' }, + { text: 'Types', link: '/reference/types' } + ] + } + ], + + search: { + provider: 'local' + }, + + socialLinks: [ + { icon: 'npm', link: 'https://www.npmjs.com/package/@localazy/cdn-client' }, + { icon: 'github', link: 'https://github.com/localazy/cdn-client' }, + ], + + externalLinkIcon: true, + } +}); + +function nav() { + return [ + { + text: 'Get Started', + link: '/get-started/introduction', + activeMatch: '/get-started/' + }, + { + text: version, + items: [ + { + text: 'Releases', + link: 'https://github.com/localazy/cdn-client/releases' + }, + { + text: 'Changelog', + link: 'https://github.com/localazy/cdn-client/blob/main/CHANGELOG.md' + } + ] + } + ]; +} diff --git a/docs/.vitepress/theme/components/FooterLinks.vue b/docs/.vitepress/theme/components/FooterLinks.vue new file mode 100644 index 0000000..eb08924 --- /dev/null +++ b/docs/.vitepress/theme/components/FooterLinks.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/docs/.vitepress/theme/components/ZoomImg.vue b/docs/.vitepress/theme/components/ZoomImg.vue new file mode 100644 index 0000000..95c2e2f --- /dev/null +++ b/docs/.vitepress/theme/components/ZoomImg.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/docs/.vitepress/theme/components/test.svg b/docs/.vitepress/theme/components/test.svg new file mode 100644 index 0000000..5c3a395 --- /dev/null +++ b/docs/.vitepress/theme/components/test.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..9a1e542 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,27 @@ +import { h } from 'vue'; +import { EnhanceAppContext, Theme } from 'vitepress'; +import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client'; +import DefaultTheme from 'vitepress/theme'; +import FooterLinks from './components/FooterLinks.vue'; +import ZoomImg from './components/ZoomImg.vue'; +import { Sandbox } from 'vitepress-plugin-sandpack'; +import 'vitepress-plugin-sandpack/dist/style.css'; +import './style.css'; + +export default { + ...DefaultTheme, + + Layout: () => { + return h(DefaultTheme.Layout, null, { + 'layout-bottom': () => h(FooterLinks), + }); + }, + + enhanceApp(ctx: EnhanceAppContext) { + DefaultTheme.enhanceApp(ctx); + + enhanceAppWithTabs(ctx.app); + ctx.app.component('ZoomImg', ZoomImg); + ctx.app.component('Sandbox', Sandbox); + } +} satisfies Theme; diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css new file mode 100644 index 0000000..7c9a7f1 --- /dev/null +++ b/docs/.vitepress/theme/style.css @@ -0,0 +1,189 @@ +/* Localazy Theme colors */ + +:root { + --primary-darken-4: #021c3c; + --primary-darken-3: #032c5e; + --primary-darken-2: #04418b; + --primary-darken-1: #0558bd; + --primary: #066fef; + --primary-lighten-1: #2e8dfa; + --primary-lighten-2: #6aaefb; + --primary-lighten-3: #a1cbfd; + --primary-lighten-4: #d7eafe; + --primary-lighten-5: #f5faff; +} + +/** + * Customize default theme styling by overriding CSS variables: + * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + */ + +/** + * Colors + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * + * - `default`: The color used purely for subtle indication without any + * special meanings attched to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--primary); + --vp-c-brand-2: var(--primary-darken-1); + --vp-c-brand-3: var(--primary-darken-2); + --vp-c-brand-soft: var(--primary-lighten-4); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); +} + +/** + * Component: Link + * -------------------------------------------------------------------------- */ + +.dark { + --vp-code-link-color: var(--primary-lighten-1); + --vp-code-link-hover-color: var(--primary); +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + --vp-button-brand-bg: var(--vp-c-brand-1); + --vp-button-brand-hover-bg: var(--vp-c-brand-2); + --vp-button-brand-active-bg: var(--vp-c-brand-3); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +@media (min-width: 960px) { + .image-src.VPImage { + max-width: 400px; + max-height: 400px; + } +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +} + +/** + * Component: Algolia + * -------------------------------------------------------------------------- */ + +.DocSearch { + --docsearch-primary-color: var(--vp-c-brand-1) !important; +} + +/** + * Component: Code Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-code-block-divider-color: var(--vp-c-gray-1); + --vp-code-block-bg: var(--vp-c-bg); +} + +div[class*='language-'] { + border: 1px solid var(--vp-c-gray-1); +} + +/** + * Typography + * -------------------------------------------------------------------------- */ + +:root { + --vp-font-family-base: Roboto, 'Chinese Quotes', 'Inter var', 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --vp-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; +} + +details > summary { + cursor: pointer; +} + +/** + * External Link Icon + * -------------------------------------------------------------------------- */ + +:root { + --external-link-icon: url('data:image/svg+xml,'); + --external-link-margin-left: 5px; + --external-link-margin-right: 3px; +} + +.VPNavBarMenu .VPLink.link, +.vp-doc a { + display: inline-flex; + align-items: center; +} + +:is(.vp-external-link-icon, .vp-doc a[href*='://'], .vp-doc a[target='_blank']):not(.no-icon)::after { + --icon: var(--external-link-icon); + display: inline-flex; + margin-left: var(--external-link-margin-left); + width: 14px; + height: 14px; +} + +.vp-doc a[target='_blank']::after { + margin-right: var(--external-link-margin-right); +} diff --git a/docs/code-examples/metafile.json b/docs/code-examples/metafile.json new file mode 100644 index 0000000..142f6f1 --- /dev/null +++ b/docs/code-examples/metafile.json @@ -0,0 +1,68 @@ +{ + "projectUrl": "https://localazy.com/p/cdnarticle", + "baseLocale": "en", + "timestamp": -8465065979062673572, + "files": { + "dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea": { + "file": "file.json", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": "-8465065979062673572", + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/en/file.json", + "timestamp": "-9223300000000000000" + }, + { + "language": "de", + "region": "", + "script": "", + "isRtl": false, + "name": "German", + "localizedName": "Deutsch", + "uri": "/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/de/file.json", + "timestamp": "-8549898287605285711" + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/es/file.json", + "timestamp": "-8550050401790927404" + }, + { + "language": "pt", + "region": "PT", + "script": "", + "isRtl": false, + "name": "European Portuguese", + "localizedName": "Português Europeu", + "uri": "/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/pt-PT/file.json", + "timestamp": "-8550051169379505755" + }, + { + "language": "vi", + "region": "", + "script": "", + "isRtl": false, + "name": "Vietnamese", + "localizedName": "Tiếng Việt", + "uri": "/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/vi/file.json", + "timestamp": "-8465065979062673572" + } + ] + } + } +} diff --git a/docs/code-examples/reference/create.js b/docs/code-examples/reference/create.js new file mode 100644 index 0000000..4f1f650 --- /dev/null +++ b/docs/code-examples/reference/create.js @@ -0,0 +1,5 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ // [!code warning] + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/reference/fetch.js b/docs/code-examples/reference/fetch.js new file mode 100644 index 0000000..4c99bcd --- /dev/null +++ b/docs/code-examples/reference/fetch.js @@ -0,0 +1,10 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.first(), // [!code warning] + locales: 'en', // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/reference/metafile-base-locale.js b/docs/code-examples/reference/metafile-base-locale.js new file mode 100644 index 0000000..145e1ce --- /dev/null +++ b/docs/code-examples/reference/metafile-base-locale.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const baseLocale = cdn.metafile.baseLocale; // [!code warning] diff --git a/docs/code-examples/reference/metafile-files-filter.js b/docs/code-examples/reference/metafile-files-filter.js new file mode 100644 index 0000000..6b218d3 --- /dev/null +++ b/docs/code-examples/reference/metafile-files-filter.js @@ -0,0 +1,9 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const files = cdn.metafile.files.filter({ // [!code warning] + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/reference/metafile-files-find.js b/docs/code-examples/reference/metafile-files-find.js new file mode 100644 index 0000000..6b33d46 --- /dev/null +++ b/docs/code-examples/reference/metafile-files-find.js @@ -0,0 +1,9 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const file = cdn.metafile.files.find({ // [!code warning] + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/reference/metafile-files-first.js b/docs/code-examples/reference/metafile-files-first.js new file mode 100644 index 0000000..187aee0 --- /dev/null +++ b/docs/code-examples/reference/metafile-files-first.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const file = cdn.metafile.files.first(); // [!code warning] diff --git a/docs/code-examples/reference/metafile-files-list.js b/docs/code-examples/reference/metafile-files-list.js new file mode 100644 index 0000000..d564721 --- /dev/null +++ b/docs/code-examples/reference/metafile-files-list.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const files = cdn.metafile.files.list(); // [!code warning] diff --git a/docs/code-examples/reference/metafile-locales.js b/docs/code-examples/reference/metafile-locales.js new file mode 100644 index 0000000..7093910 --- /dev/null +++ b/docs/code-examples/reference/metafile-locales.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const locales = cdn.metafile.locales(); // [!code warning] diff --git a/docs/code-examples/reference/metafile-project-url.js b/docs/code-examples/reference/metafile-project-url.js new file mode 100644 index 0000000..5cee679 --- /dev/null +++ b/docs/code-examples/reference/metafile-project-url.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const projectUrl = cdn.metafile.projectUrl; // [!code warning] diff --git a/docs/code-examples/reference/metafile-refresh.js b/docs/code-examples/reference/metafile-refresh.js new file mode 100644 index 0000000..3dc6e66 --- /dev/null +++ b/docs/code-examples/reference/metafile-refresh.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +await cdn.metafile.refresh(); // [!code warning] diff --git a/docs/code-examples/reference/metafile-switch.js b/docs/code-examples/reference/metafile-switch.js new file mode 100644 index 0000000..0b3af07 --- /dev/null +++ b/docs/code-examples/reference/metafile-switch.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +await cdn.metafile.switch({ metafile: 'different-metafile-url' }); // [!code warning] diff --git a/docs/code-examples/reference/metafile-url.js b/docs/code-examples/reference/metafile-url.js new file mode 100644 index 0000000..20f101f --- /dev/null +++ b/docs/code-examples/reference/metafile-url.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const url = cdn.metafile.url; // [!code warning] diff --git a/docs/code-examples/reference/results/fetch.js b/docs/code-examples/reference/results/fetch.js new file mode 100644 index 0000000..b1c1e08 --- /dev/null +++ b/docs/code-examples/reference/results/fetch.js @@ -0,0 +1,6 @@ +const response = { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: "We're testing the CDN", + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', +}; diff --git a/docs/code-examples/reference/results/metafile-base-locale.js b/docs/code-examples/reference/results/metafile-base-locale.js new file mode 100644 index 0000000..66d28f5 --- /dev/null +++ b/docs/code-examples/reference/results/metafile-base-locale.js @@ -0,0 +1,10 @@ +const baseLocale = { + locale: 'en', + isBaseLocale: true, + language: 'en', + region: '', + script: '', + isRtl: false, + name: 'English', + localizedName: 'English', +}; diff --git a/docs/code-examples/reference/results/metafile-files-filter.js b/docs/code-examples/reference/results/metafile-files-filter.js new file mode 100644 index 0000000..4092a89 --- /dev/null +++ b/docs/code-examples/reference/results/metafile-files-filter.js @@ -0,0 +1,38 @@ +const files = [ + { + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', + file: 'file.json', + path: '', + library: '', + module: '', + buildType: '', + productFlavors: [], + locales: [ + { + locale: 'en', + isBaseLocale: true, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/en/file.json', + }, + { + locale: 'de', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/de/file.json', + }, + { + locale: 'es', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/es/file.json', + }, + { + locale: 'pt_PT', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/pt-PT/file.json', + }, + { + locale: 'vi', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/vi/file.json', + }, + ], + }, +]; diff --git a/docs/code-examples/reference/results/metafile-files-find.js b/docs/code-examples/reference/results/metafile-files-find.js new file mode 100644 index 0000000..60f9f7c --- /dev/null +++ b/docs/code-examples/reference/results/metafile-files-find.js @@ -0,0 +1,36 @@ +const file = { + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', + file: 'file.json', + path: '', + library: '', + module: '', + buildType: '', + productFlavors: [], + locales: [ + { + locale: 'en', + isBaseLocale: true, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/en/file.json', + }, + { + locale: 'de', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/de/file.json', + }, + { + locale: 'es', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/es/file.json', + }, + { + locale: 'pt_PT', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/pt-PT/file.json', + }, + { + locale: 'vi', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/vi/file.json', + }, + ], +}; diff --git a/docs/code-examples/reference/results/metafile-files-first.js b/docs/code-examples/reference/results/metafile-files-first.js new file mode 100644 index 0000000..60f9f7c --- /dev/null +++ b/docs/code-examples/reference/results/metafile-files-first.js @@ -0,0 +1,36 @@ +const file = { + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', + file: 'file.json', + path: '', + library: '', + module: '', + buildType: '', + productFlavors: [], + locales: [ + { + locale: 'en', + isBaseLocale: true, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/en/file.json', + }, + { + locale: 'de', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/de/file.json', + }, + { + locale: 'es', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/es/file.json', + }, + { + locale: 'pt_PT', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/pt-PT/file.json', + }, + { + locale: 'vi', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/vi/file.json', + }, + ], +}; diff --git a/docs/code-examples/reference/results/metafile-files-list.js b/docs/code-examples/reference/results/metafile-files-list.js new file mode 100644 index 0000000..4092a89 --- /dev/null +++ b/docs/code-examples/reference/results/metafile-files-list.js @@ -0,0 +1,38 @@ +const files = [ + { + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', + file: 'file.json', + path: '', + library: '', + module: '', + buildType: '', + productFlavors: [], + locales: [ + { + locale: 'en', + isBaseLocale: true, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/en/file.json', + }, + { + locale: 'de', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/de/file.json', + }, + { + locale: 'es', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/es/file.json', + }, + { + locale: 'pt_PT', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/pt-PT/file.json', + }, + { + locale: 'vi', + isBaseLocale: false, + uri: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0/dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea/vi/file.json', + }, + ], + }, +]; diff --git a/docs/code-examples/reference/results/metafile-locales.js b/docs/code-examples/reference/results/metafile-locales.js new file mode 100644 index 0000000..0682de6 --- /dev/null +++ b/docs/code-examples/reference/results/metafile-locales.js @@ -0,0 +1,42 @@ +const locales = [ + { + locale: 'en', + isBaseLocale: true, + language: 'en', + region: '', + script: '', + isRtl: false, + name: 'English', + localizedName: 'English', + }, + { + locale: 'ms_BN', + isBaseLocale: false, + language: 'ms', + region: 'BN', + script: '', + isRtl: false, + name: 'Malay (Brunei)', + localizedName: 'Malay (Brunei)', + }, + { + locale: 'ms#Arab', + isBaseLocale: false, + language: 'ms', + region: '', + script: 'Arab', + isRtl: false, + name: 'Malay (Arabic)', + localizedName: 'Malay (Arabic)', + }, + { + locale: 'ms_ID#Latn', + isBaseLocale: false, + language: 'ms', + region: 'ID', + script: 'Latn', + isRtl: false, + name: 'Malay (Indonesia, Latin)', + localizedName: 'Malay (Indonesia, Latin)', + }, +]; diff --git a/docs/code-examples/reference/results/metafile-project-url.js b/docs/code-examples/reference/results/metafile-project-url.js new file mode 100644 index 0000000..0343a71 --- /dev/null +++ b/docs/code-examples/reference/results/metafile-project-url.js @@ -0,0 +1 @@ +const projectUrl = 'https://localazy.com/p/cdnarticle'; diff --git a/docs/code-examples/reference/results/metafile-url.js b/docs/code-examples/reference/results/metafile-url.js new file mode 100644 index 0000000..f07e75c --- /dev/null +++ b/docs/code-examples/reference/results/metafile-url.js @@ -0,0 +1 @@ +const url = 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json'; diff --git a/docs/code-examples/usage/get-all-files-all-locales.js b/docs/code-examples/usage/get-all-files-all-locales.js new file mode 100644 index 0000000..2a339ad --- /dev/null +++ b/docs/code-examples/usage/get-all-files-all-locales.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch(); // [!code warning] diff --git a/docs/code-examples/usage/get-all-locales-except-base-locale.js b/docs/code-examples/usage/get-all-locales-except-base-locale.js new file mode 100644 index 0000000..64cf4ae --- /dev/null +++ b/docs/code-examples/usage/get-all-locales-except-base-locale.js @@ -0,0 +1,9 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const locales = cdn.metafile.locales({ // [!code warning] + excludeBaseLocale: true, // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/get-all-locales.js b/docs/code-examples/usage/get-all-locales.js new file mode 100644 index 0000000..7093910 --- /dev/null +++ b/docs/code-examples/usage/get-all-locales.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const locales = cdn.metafile.locales(); // [!code warning] diff --git a/docs/code-examples/usage/get-base-locale.js b/docs/code-examples/usage/get-base-locale.js new file mode 100644 index 0000000..145e1ce --- /dev/null +++ b/docs/code-examples/usage/get-base-locale.js @@ -0,0 +1,7 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const baseLocale = cdn.metafile.baseLocale; // [!code warning] diff --git a/docs/code-examples/usage/get-multiple-files-all-locales.js b/docs/code-examples/usage/get-multiple-files-all-locales.js new file mode 100644 index 0000000..99c0c48 --- /dev/null +++ b/docs/code-examples/usage/get-multiple-files-all-locales.js @@ -0,0 +1,9 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.list(), // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/get-multiple-files-multiple-locales.js b/docs/code-examples/usage/get-multiple-files-multiple-locales.js new file mode 100644 index 0000000..e4166a9 --- /dev/null +++ b/docs/code-examples/usage/get-multiple-files-multiple-locales.js @@ -0,0 +1,10 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.list(), // [!code warning] + locales: ['en', 'de'], // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/get-multiple-files-single-locale.js b/docs/code-examples/usage/get-multiple-files-single-locale.js new file mode 100644 index 0000000..867e0a0 --- /dev/null +++ b/docs/code-examples/usage/get-multiple-files-single-locale.js @@ -0,0 +1,10 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.list(), // [!code warning] + locales: 'en', // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/get-single-file-all-locales.js b/docs/code-examples/usage/get-single-file-all-locales.js new file mode 100644 index 0000000..7ce310e --- /dev/null +++ b/docs/code-examples/usage/get-single-file-all-locales.js @@ -0,0 +1,9 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.first(), // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/get-single-file-multiple-locales.js b/docs/code-examples/usage/get-single-file-multiple-locales.js new file mode 100644 index 0000000..560ddee --- /dev/null +++ b/docs/code-examples/usage/get-single-file-multiple-locales.js @@ -0,0 +1,10 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.first(), // [!code warning] + locales: ['en', 'de'], // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/get-single-file-single-locale.js b/docs/code-examples/usage/get-single-file-single-locale.js new file mode 100644 index 0000000..4c99bcd --- /dev/null +++ b/docs/code-examples/usage/get-single-file-single-locale.js @@ -0,0 +1,10 @@ +import { CdnClient } from '@localazy/cdn-client'; + +const cdn = await CdnClient.create({ + metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json', +}); + +const response = await cdn.fetch({ // [!code warning] + files: cdn.metafile.files.first(), // [!code warning] + locales: 'en', // [!code warning] +}); // [!code warning] diff --git a/docs/code-examples/usage/results/get-all-files-all-locales.js b/docs/code-examples/usage/results/get-all-files-all-locales.js new file mode 100644 index 0000000..f2225fe --- /dev/null +++ b/docs/code-examples/usage/results/get-all-files-all-locales.js @@ -0,0 +1,34 @@ +const response = { + dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea: { + en: { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: "We're testing the CDN", + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', + }, + de: { + cdn_info: 'Mit dem CDN können Sie die Übersetzungsdateien sofort liefern', + cdn_testing: 'Wir testen das CDN', + hello_localazy: 'Hallo Localazy!', + using_javascript: 'In diesem Projekt haben wir uns für JavaScript entschieden', + }, + es: { + cdn_info: 'Con la CDN puedes entregar los archivos de traducción al instante', + cdn_testing: 'Estamos probando la CDN', + hello_localazy: 'Hola, Localazy!', + using_javascript: 'En este proyecto hemos decidido utilizar JavaScript', + }, + pt_PT: { + cdn_info: 'Com o CDN pode entregar os ficheiros de tradução instantaneamente', + cdn_testing: 'Estamos a testar o CDN', + hello_localazy: 'Olá Localazy!', + using_javascript: 'Neste projecto, decidimos utilizar JavaScript', + }, + vi: { + cdn_info: 'Với CDN, bạn có thể cung cấp các tệp dịch ngay lập tức', + cdn_testing: 'Chúng tôi đang thử nghiệm CDN', + hello_localazy: 'Chào Localazy!', + using_javascript: 'Trong dự án này, chúng tôi quyết định sử dụng JavaScript', + }, + }, +}; diff --git a/docs/code-examples/usage/results/get-all-locales-except-base-locale.js b/docs/code-examples/usage/results/get-all-locales-except-base-locale.js new file mode 100644 index 0000000..730eb30 --- /dev/null +++ b/docs/code-examples/usage/results/get-all-locales-except-base-locale.js @@ -0,0 +1,32 @@ +const locales = [ + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_BN', + localizedName: 'Malay (Brunei)', + name: 'Malay (Brunei)', + region: 'BN', + script: '', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms#Arab', + localizedName: 'Malay (Arabic)', + name: 'Malay (Arabic)', + region: '', + script: 'Arab', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_ID#Latn', + localizedName: 'Malay (Indonesia, Latin)', + name: 'Malay (Indonesia, Latin)', + region: 'ID', + script: 'Latn', + }, +]; diff --git a/docs/code-examples/usage/results/get-all-locales.js b/docs/code-examples/usage/results/get-all-locales.js new file mode 100644 index 0000000..b92e0e7 --- /dev/null +++ b/docs/code-examples/usage/results/get-all-locales.js @@ -0,0 +1,42 @@ +const locales = [ + { + isBaseLocale: true, + isRtl: false, + language: 'en', + locale: 'en', + localizedName: 'English', + name: 'English', + region: '', + script: '', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_BN', + localizedName: 'Malay (Brunei)', + name: 'Malay (Brunei)', + region: 'BN', + script: '', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms#Arab', + localizedName: 'Malay (Arabic)', + name: 'Malay (Arabic)', + region: '', + script: 'Arab', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_ID#Latn', + localizedName: 'Malay (Indonesia, Latin)', + name: 'Malay (Indonesia, Latin)', + region: 'ID', + script: 'Latn', + }, +]; diff --git a/docs/code-examples/usage/results/get-base-locale.js b/docs/code-examples/usage/results/get-base-locale.js new file mode 100644 index 0000000..0596400 --- /dev/null +++ b/docs/code-examples/usage/results/get-base-locale.js @@ -0,0 +1,10 @@ +const baseLocale = { + isBaseLocale: true, + isRtl: false, + language: 'en', + locale: 'en', + localizedName: 'English', + name: 'English', + region: '', + script: '', +}; diff --git a/docs/code-examples/usage/results/get-multiple-files-all-locales.js b/docs/code-examples/usage/results/get-multiple-files-all-locales.js new file mode 100644 index 0000000..f2225fe --- /dev/null +++ b/docs/code-examples/usage/results/get-multiple-files-all-locales.js @@ -0,0 +1,34 @@ +const response = { + dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea: { + en: { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: "We're testing the CDN", + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', + }, + de: { + cdn_info: 'Mit dem CDN können Sie die Übersetzungsdateien sofort liefern', + cdn_testing: 'Wir testen das CDN', + hello_localazy: 'Hallo Localazy!', + using_javascript: 'In diesem Projekt haben wir uns für JavaScript entschieden', + }, + es: { + cdn_info: 'Con la CDN puedes entregar los archivos de traducción al instante', + cdn_testing: 'Estamos probando la CDN', + hello_localazy: 'Hola, Localazy!', + using_javascript: 'En este proyecto hemos decidido utilizar JavaScript', + }, + pt_PT: { + cdn_info: 'Com o CDN pode entregar os ficheiros de tradução instantaneamente', + cdn_testing: 'Estamos a testar o CDN', + hello_localazy: 'Olá Localazy!', + using_javascript: 'Neste projecto, decidimos utilizar JavaScript', + }, + vi: { + cdn_info: 'Với CDN, bạn có thể cung cấp các tệp dịch ngay lập tức', + cdn_testing: 'Chúng tôi đang thử nghiệm CDN', + hello_localazy: 'Chào Localazy!', + using_javascript: 'Trong dự án này, chúng tôi quyết định sử dụng JavaScript', + }, + }, +}; diff --git a/docs/code-examples/usage/results/get-multiple-files-multiple-locales.js b/docs/code-examples/usage/results/get-multiple-files-multiple-locales.js new file mode 100644 index 0000000..eeec07e --- /dev/null +++ b/docs/code-examples/usage/results/get-multiple-files-multiple-locales.js @@ -0,0 +1,16 @@ +const response = { + dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea: { + en: { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: "We're testing the CDN", + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', + }, + de: { + cdn_info: 'Mit dem CDN können Sie die Übersetzungsdateien sofort liefern', + cdn_testing: 'Wir testen das CDN', + hello_localazy: 'Hallo Localazy!', + using_javascript: 'In diesem Projekt haben wir uns für JavaScript entschieden', + }, + }, +}; diff --git a/docs/code-examples/usage/results/get-multiple-files-single-locale.js b/docs/code-examples/usage/results/get-multiple-files-single-locale.js new file mode 100644 index 0000000..cac00a2 --- /dev/null +++ b/docs/code-examples/usage/results/get-multiple-files-single-locale.js @@ -0,0 +1,10 @@ +const response = { + dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea: { + en: { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: "We're testing the CDN", + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', + }, + }, +}; diff --git a/docs/code-examples/usage/results/get-single-file-all-locales.js b/docs/code-examples/usage/results/get-single-file-all-locales.js new file mode 100644 index 0000000..48674d9 --- /dev/null +++ b/docs/code-examples/usage/results/get-single-file-all-locales.js @@ -0,0 +1,32 @@ +const response = { + en: { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: 'We\'re testing the CDN', + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', + }, + de: { + cdn_info: 'Mit dem CDN können Sie die Übersetzungsdateien sofort liefern', + cdn_testing: 'Wir testen das CDN', + hello_localazy: 'Hallo Localazy!', + using_javascript: 'In diesem Projekt haben wir uns für JavaScript entschieden', + }, + es: { + cdn_info: 'Con la CDN puedes entregar los archivos de traducción al instante', + cdn_testing: 'Estamos probando la CDN', + hello_localazy: 'Hola, Localazy!', + using_javascript: 'En este proyecto hemos decidido utilizar JavaScript', + }, + pt_PT: { + cdn_info: 'Com o CDN pode entregar os ficheiros de tradução instantaneamente', + cdn_testing: 'Estamos a testar o CDN', + hello_localazy: 'Olá Localazy!', + using_javascript: 'Neste projecto, decidimos utilizar JavaScript', + }, + vi: { + cdn_info: 'Với CDN, bạn có thể cung cấp các tệp dịch ngay lập tức', + cdn_testing: 'Chúng tôi đang thử nghiệm CDN', + hello_localazy: 'Chào Localazy!', + using_javascript: 'Trong dự án này, chúng tôi quyết định sử dụng JavaScript', + }, +}; diff --git a/docs/code-examples/usage/results/get-single-file-multiple-locales.js b/docs/code-examples/usage/results/get-single-file-multiple-locales.js new file mode 100644 index 0000000..7f59360 --- /dev/null +++ b/docs/code-examples/usage/results/get-single-file-multiple-locales.js @@ -0,0 +1,14 @@ +const response = { + en: { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: 'We\'re testing the CDN', + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', + }, + de: { + cdn_info: 'Mit dem CDN können Sie die Übersetzungsdateien sofort liefern', + cdn_testing: 'Wir testen das CDN', + hello_localazy: 'Hallo Localazy!', + using_javascript: 'In diesem Projekt haben wir uns für JavaScript entschieden', + }, +}; diff --git a/docs/code-examples/usage/results/get-single-file-single-locale.js b/docs/code-examples/usage/results/get-single-file-single-locale.js new file mode 100644 index 0000000..ec423d3 --- /dev/null +++ b/docs/code-examples/usage/results/get-single-file-single-locale.js @@ -0,0 +1,6 @@ +const response = { + cdn_info: 'With the CDN you can deliver the translation files instantly', + cdn_testing: 'We\'re testing the CDN', + hello_localazy: 'Hello Localazy!', + using_javascript: 'In this project we decided to use JavaScript', +}; diff --git a/docs/examples/i18next.md b/docs/examples/i18next.md new file mode 100644 index 0000000..63c177f --- /dev/null +++ b/docs/examples/i18next.md @@ -0,0 +1,44 @@ +# i18next + +## Install + +```shell +npm install @localazy/cdn-client // [!=npm auto] +``` + +## Usage + +```javascript +import i18next from 'i18next'; +import { CdnClient } from '@localazy/cdn-client'; + +class LocalazyI18next { + constructor(cdn, file) { + this.cdn = cdn; + this.file = file; + this.type = 'backend'; + } + + read(language, namespace, callback) { + this.cdn.fetch({ files: this.file, locales: language }) + .then((value) => callback(null, value)) + .catch((e) => callback(e, null)); + } +} + +const cdn = new CdnClient({ metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json' }); +const file = cdn.metafile.files.first(); +const cdnPlugin = new LocalazyI18next(cdn, file); + +i18next + .use(cdnPlugin) + .init( + { + lng: 'en', + fallbackLng: false + }, + () => { + document.getElementById('output').innerHTML = i18next.t('cdn_info'); + } + ); +``` diff --git a/docs/get-started/install.md b/docs/get-started/install.md new file mode 100644 index 0000000..78f4747 --- /dev/null +++ b/docs/get-started/install.md @@ -0,0 +1,60 @@ +# Install + +You can install the CDN Client as a Node.js module or import it directly in the browser. + +## Node.js module + +Use your favourite package manager to install the CDN Client. + +```shell +npm install @localazy/cdn-client // [!=npm auto] +``` + +CDN Client is written in TypeScript and provides type definitions. You can import it using TypeScript, ESM, or CommonJS syntax. + +:::tabs + +== TS +```typescript +import { CdnClient } from '@localazy/cdn-client'; +``` + +== ESM +```javascript +import { CdnClient } from '@localazy/cdn-client'; +``` + +== CommonJS +```javascript +const { CdnClient } = require('@localazy/cdn-client'); +``` + +::: + + +## Browser + +You can import the CDN Client directly in the browser using a script tag. Choose between ESM or UMD bundle. + +CDN Client depends on [Axios](https://axios-http.com/docs/intro), so you need to include it before the CDN Client. + +:::tabs + +== ESM +``` + +== UMD + + +``` + +::: diff --git a/docs/get-started/introduction.md b/docs/get-started/introduction.md new file mode 100644 index 0000000..d069074 --- /dev/null +++ b/docs/get-started/introduction.md @@ -0,0 +1,18 @@ +# Introduction + +The **Localazy CDN Client** is a Node.js library that offers functionalities to fetch translation strings from JSON files published on +the [Localazy CDN](https://localazy.com/docs/cdn/cdn-introduction). + +Content can be fetched from JSON file as object or as plain text for other file types. + +## How it works + + + +When translators add translations to your project, they are automatically published to the [Localazy CDN](https://localazy.com/docs/cdn/cdn-introduction). + +Every published project has its own [metafile](metafile.md) that contains information about the project files and their translated versions. + +Under the hood, the CDN Client fetches the [metafile](metafile.md) and uses it to get the urls of the files and their translations. + +You simply select files and languages you want to fetch and the CDN Client does the rest. diff --git a/docs/get-started/metafile.md b/docs/get-started/metafile.md new file mode 100644 index 0000000..7a65aa3 --- /dev/null +++ b/docs/get-started/metafile.md @@ -0,0 +1,33 @@ +# Metafile + +Metafile is a JSON file containing information about the project files and their translated versions. + +Metafile is generated automatically when the Localazy project is published. + +You can read more about the metafiles in the [Localazy CDN - Metafiles](https://localazy.com/docs/cdn/cdn-metafiles) documentation. + +To use a CDN Client, you need to provide the [metafile URL](#metafile-url) of your project. + +## Metafile URL + +To get your project metafile URL use the following steps: + +- select the project from your [Dashboard](https://localazy.com/my/dashboard) +- navigate to **Translation Delivery > CDN** +- click on the **Metafile URL** button + + + +The **CDN Meta File** dialog will appear and then: + +- click on the **Copy** button to copy the metafile URL to your clipboard + + + +## Example Metafile + +In this documentation, we will use the following metafile to demonstrate the CDN Client functionalities. + +https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json + +<<< ../code-examples/metafile.json diff --git a/docs/get-started/working-example.md b/docs/get-started/working-example.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c28255b --- /dev/null +++ b/docs/index.md @@ -0,0 +1,35 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + text: Localazy CDN Client + tagline: Node.js module that allows you to easily interact with the Localazy CDN + image: + src: /hero.svg + alt: Localazy CDN Client + actions: + - theme: brand + text: Get Started + link: /get-started/introduction + - theme: alt + text: API Reference + link: /reference/client-api + +features: + - title: Universal package + icon: 📦 + details: Supports TS, ESM, CommonJS and UMD. + - title: Multi-language support + icon: ⚡️ + details: Supports React, Vue, Angular, Svelte, and all other frameworks. + - title: Quick to start + icon: 🚀 + details: Easy to use and well-documented. + - title: Written in TypeScript + details: Provides type definitions. + icon: + src: /ts.svg + width: 48 + height: 48 +--- diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000..f946a25 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,3825 @@ +{ + "name": "docs", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "medium-zoom": "^1.1.0", + "sass": "^1.71.1", + "vitepress": "^1.0.0-rc.45", + "vitepress-plugin-image-viewer": "^1.1.3", + "vitepress-plugin-npm-commands": "^0.6.0", + "vitepress-plugin-sandpack": "^1.1.4", + "vitepress-plugin-tabs": "^0.5.0", + "vue": "^3.4.21" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.14.0.tgz", + "integrity": "sha512-Kx9BCSOLKmqNXEvmViuzsBQJ2VEa/wWwOATNpixOa+suttTV3rDnAUtAIt5ObAUFjXvZakWfFfF/EbxELnGLzQ==", + "dev": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + }, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz", + "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", + "dev": true, + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", + "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", + "dev": true, + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.8.tgz", + "integrity": "sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==", + "dev": true, + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", + "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", + "dev": true, + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.1.tgz", + "integrity": "sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.5.0.tgz", + "integrity": "sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", + "dev": true + }, + "node_modules/@codemirror/view": { + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.25.1.tgz", + "integrity": "sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ==", + "dev": true, + "dependencies": { + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@codesandbox/nodebox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@codesandbox/nodebox/-/nodebox-0.1.8.tgz", + "integrity": "sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==", + "dev": true, + "dependencies": { + "outvariant": "^1.4.0", + "strict-event-emitter": "^0.4.3" + } + }, + "node_modules/@codesandbox/sandpack-client": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-client/-/sandpack-client-2.13.2.tgz", + "integrity": "sha512-uAuxQOF7p8y4m7H0ojedDcWRf62xVK7UIYIJoX5LkhcV0SW1BTXcRkVNuR0/MSCSv+Og1dBeV8+Xpye9PX0quA==", + "dev": true, + "dependencies": { + "@codesandbox/nodebox": "0.1.8", + "buffer": "^6.0.3", + "dequal": "^2.0.2", + "outvariant": "1.4.0", + "static-browser-server": "1.0.3" + } + }, + "node_modules/@codesandbox/sandpack-themes": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-themes/-/sandpack-themes-2.0.21.tgz", + "integrity": "sha512-CMH/MO/dh6foPYb/3eSn2Cu/J3+1+/81Fsaj7VggICkCrmRk0qG5dmgjGAearPTnRkOGORIPHuRqwNXgw0E6YQ==", + "dev": true + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", + "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.5.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", + "dev": true + }, + "node_modules/@lezer/css": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.8.tgz", + "integrity": "sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", + "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.9.tgz", + "integrity": "sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.13.tgz", + "integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.1.7.tgz", + "integrity": "sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.1.7.tgz", + "integrity": "sha512-lXz011ao4+rvweps/9h3CchBfzb1U5OtP5D51Tqc9lQYdLblWMIxQxH6Ybe1GeGINcEVM4goMyPrI0JvlIp4UQ==", + "dev": true, + "dependencies": { + "shiki": "1.1.7" + } + }, + "node_modules/@stitches/core": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", + "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.16.tgz", + "integrity": "sha512-fZG2CG8624qphMf4aj59zNHckMx1G3lxODUuyM9USKuLznXCh66TP+tEbPOCcml16hA0GizJ4D8w6F34hrfbcw==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.0.16" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.16.tgz", + "integrity": "sha512-IA8SSGiZbNgOi4wLT3mRvd71Q9KE0KvMfGk6haa2GZ6bL2K/xMA8Fvvj3o1maspfUXrGcCXutaqbLqbGx/espQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.0.16", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.16.tgz", + "integrity": "sha512-Lew4FrGjDjmanaUWSueNE1Rre83k7jQpttc17MaoVw0eARWU5DgZ1F/g9GNUMZXVjbP9rwE+LL3gd9XfXCfkvA==", + "dev": true, + "dependencies": { + "rfdc": "^1.3.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/anser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", + "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==", + "dev": true + }, + "node_modules/ansi-to-vue3": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ansi-to-vue3/-/ansi-to-vue3-0.1.2.tgz", + "integrity": "sha512-mkfWeVNBKfmpoWLeLqmAeKQalqvOyAhhMnndqu1oJZEzz8tn56mbUqJC7OfvB8cOEg70ooKjmgeIZoI0i9cdxw==", + "dev": true, + "dependencies": { + "anser": "^2.1.1", + "escape-carriage": "^1.3.1" + }, + "engines": { + "node": ">=16", + "npm": ">=7" + }, + "peerDependencies": { + "vue": "^3.2.0" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-set": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-set/-/clean-set-1.1.2.tgz", + "integrity": "sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==", + "dev": true + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "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": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@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/escape-carriage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", + "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==", + "dev": true + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==", + "dev": true + }, + "node_modules/medium-zoom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-to-yarn": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-2.2.1.tgz", + "integrity": "sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" + } + }, + "node_modules/outvariant": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", + "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==", + "dev": true + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.19.6", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", + "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sandpack-vue3": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/sandpack-vue3/-/sandpack-vue3-3.1.11.tgz", + "integrity": "sha512-VuXLTvKJJEZa2TPqhWhN6kZ/LWW7igo/3QzMRiYdJnRpR7FfpCd3sSWtIExmv2MILFkLrIb3hH0M1e2LA0SEoQ==", + "dev": true, + "dependencies": { + "@codemirror/autocomplete": "^6.12.0", + "@codemirror/commands": "^6.3.3", + "@codemirror/lang-css": "^6.2.1", + "@codemirror/lang-html": "^6.4.8", + "@codemirror/lang-javascript": "^6.2.1", + "@codemirror/language": "^6.10.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.23.1", + "@codesandbox/sandpack-client": "^2.11.2", + "@lezer/highlight": "^1.2.0", + "@stitches/core": "^1.2.8", + "ansi-to-vue3": "^0.1.2", + "clean-set": "^1.1.2", + "dequal": "^2.0.3", + "lz-string": "^1.5.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "vue": ">=3.2.0" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/sass": { + "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", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.1.7.tgz", + "integrity": "sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.1.7" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-browser-server": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/static-browser-server/-/static-browser-server-1.0.3.tgz", + "integrity": "sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==", + "dev": true, + "dependencies": { + "@open-draft/deferred-promise": "^2.1.0", + "dotenv": "^16.0.3", + "mime-db": "^1.52.0", + "outvariant": "^1.3.0" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", + "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==", + "dev": true + }, + "node_modules/style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "dev": true + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/viewerjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.6.tgz", + "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==", + "dev": true + }, + "node_modules/vite": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.0-rc.45", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.45.tgz", + "integrity": "sha512-/OiYsu5UKpQKA2c0BAZkfyywjfauDjvXyv6Mo4Ra57m5n4Bxg1HgUGoth1CLH2vwUbR/BHvDA9zOM0RDvgeSVQ==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.5.2", + "@docsearch/js": "^3.5.2", + "@shikijs/core": "^1.1.5", + "@shikijs/transformers": "^1.1.5", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.14", + "@vueuse/core": "^10.7.2", + "@vueuse/integrations": "^10.7.2", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.1.5", + "vite": "^5.1.3", + "vue": "^3.4.19" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4.3.2", + "postcss": "^8.4.35" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress-plugin-image-viewer": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitepress-plugin-image-viewer/-/vitepress-plugin-image-viewer-1.1.3.tgz", + "integrity": "sha512-cKN3W9zWtG4oXRyzMDLq7A7o7BOEL4F+Ez8xBLqmWS+CllBPCgXOMwLJ9V9Tc+zNrKpisEyA8SrLzcFbJhdBqA==", + "dev": true, + "dependencies": { + "viewerjs": "^1.11.3" + } + }, + "node_modules/vitepress-plugin-npm-commands": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/vitepress-plugin-npm-commands/-/vitepress-plugin-npm-commands-0.6.0.tgz", + "integrity": "sha512-eqMR2NqvaBmCeu7kjXmv5Nd9oDXOlw0ooCxGYJFCf/3oK+Fv+q0l5rHnmW8EUOtJEU5ryjdB4Q3dzQxCeSqUIw==", + "dev": true, + "dependencies": { + "klona": "^2.0.6", + "npm-to-yarn": "^2.1.0" + }, + "peerDependencies": { + "vitepress": "^1.0.0-rc.27", + "vitepress-plugin-tabs": "^0.5.0" + } + }, + "node_modules/vitepress-plugin-sandpack": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitepress-plugin-sandpack/-/vitepress-plugin-sandpack-1.1.4.tgz", + "integrity": "sha512-8ZAQLpg9VDY1o8wCjEQeKgfTnmxaV/1thElx5mhA6QbKpzo7Jo8WSYcWYA7yTCvBfTY+Blt8ngwXRnwbNbw5ig==", + "dev": true, + "dependencies": { + "@codesandbox/sandpack-themes": "^2.0.21", + "markdown-it-container": "^3.0.0", + "sandpack-vue3": "^3.1.9" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "vite": ">=4.0.0", + "vitepress": "^1.0.0-beta.1", + "vue": ">=3.2.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + }, + "vitepress": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/vitepress-plugin-tabs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.5.0.tgz", + "integrity": "sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A==", + "dev": true, + "peerDependencies": { + "vitepress": "^1.0.0-rc.27", + "vue": "^3.3.8" + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "requires": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "requires": { + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "requires": {} + }, + "@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.22.1" + } + }, + "@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", + "dev": true + }, + "@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.22.1" + } + }, + "@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "dev": true, + "requires": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "dev": true, + "requires": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "dev": true, + "requires": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "dev": true, + "requires": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", + "dev": true + }, + "@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "dev": true, + "requires": { + "@algolia/logger-common": "4.22.1" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.22.1" + } + }, + "@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", + "dev": true + }, + "@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "dev": true, + "requires": { + "@algolia/requester-common": "4.22.1" + } + }, + "@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "dev": true, + "requires": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true + }, + "@codemirror/autocomplete": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.14.0.tgz", + "integrity": "sha512-Kx9BCSOLKmqNXEvmViuzsBQJ2VEa/wWwOATNpixOa+suttTV3rDnAUtAIt5ObAUFjXvZakWfFfF/EbxELnGLzQ==", + "dev": true, + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "@codemirror/commands": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz", + "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", + "dev": true, + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.1.0" + } + }, + "@codemirror/lang-css": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", + "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", + "dev": true, + "requires": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.0.0" + } + }, + "@codemirror/lang-html": { + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.8.tgz", + "integrity": "sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==", + "dev": true, + "requires": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.0" + } + }, + "@codemirror/lang-javascript": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", + "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", + "dev": true, + "requires": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "@codemirror/language": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.1.tgz", + "integrity": "sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==", + "dev": true, + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "@codemirror/lint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.5.0.tgz", + "integrity": "sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==", + "dev": true, + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/state": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", + "dev": true + }, + "@codemirror/view": { + "version": "6.25.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.25.1.tgz", + "integrity": "sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ==", + "dev": true, + "requires": { + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "@codesandbox/nodebox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@codesandbox/nodebox/-/nodebox-0.1.8.tgz", + "integrity": "sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==", + "dev": true, + "requires": { + "outvariant": "^1.4.0", + "strict-event-emitter": "^0.4.3" + } + }, + "@codesandbox/sandpack-client": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-client/-/sandpack-client-2.13.2.tgz", + "integrity": "sha512-uAuxQOF7p8y4m7H0ojedDcWRf62xVK7UIYIJoX5LkhcV0SW1BTXcRkVNuR0/MSCSv+Og1dBeV8+Xpye9PX0quA==", + "dev": true, + "requires": { + "@codesandbox/nodebox": "0.1.8", + "buffer": "^6.0.3", + "dequal": "^2.0.2", + "outvariant": "1.4.0", + "static-browser-server": "1.0.3" + } + }, + "@codesandbox/sandpack-themes": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@codesandbox/sandpack-themes/-/sandpack-themes-2.0.21.tgz", + "integrity": "sha512-CMH/MO/dh6foPYb/3eSn2Cu/J3+1+/81Fsaj7VggICkCrmRk0qG5dmgjGAearPTnRkOGORIPHuRqwNXgw0E6YQ==", + "dev": true + }, + "@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "dev": true + }, + "@docsearch/js": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", + "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "dev": true, + "requires": { + "@docsearch/react": "3.5.2", + "preact": "^10.0.0" + } + }, + "@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dev": true, + "requires": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + } + }, + "@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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "dev": true, + "optional": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", + "dev": true + }, + "@lezer/css": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.8.tgz", + "integrity": "sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==", + "dev": true, + "requires": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "@lezer/highlight": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", + "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", + "dev": true, + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/html": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.9.tgz", + "integrity": "sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==", + "dev": true, + "requires": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "@lezer/javascript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.13.tgz", + "integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==", + "dev": true, + "requires": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "@lezer/lr": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "dev": true, + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "dev": true, + "optional": true + }, + "@shikijs/core": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.1.7.tgz", + "integrity": "sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==", + "dev": true + }, + "@shikijs/transformers": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.1.7.tgz", + "integrity": "sha512-lXz011ao4+rvweps/9h3CchBfzb1U5OtP5D51Tqc9lQYdLblWMIxQxH6Ybe1GeGINcEVM4goMyPrI0JvlIp4UQ==", + "dev": true, + "requires": { + "shiki": "1.1.7" + } + }, + "@stitches/core": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", + "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==", + "dev": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dev": true, + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "requires": {} + }, + "@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dev": true, + "requires": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "@vue/devtools-api": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.16.tgz", + "integrity": "sha512-fZG2CG8624qphMf4aj59zNHckMx1G3lxODUuyM9USKuLznXCh66TP+tEbPOCcml16hA0GizJ4D8w6F34hrfbcw==", + "dev": true, + "requires": { + "@vue/devtools-kit": "^7.0.16" + } + }, + "@vue/devtools-kit": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.16.tgz", + "integrity": "sha512-IA8SSGiZbNgOi4wLT3mRvd71Q9KE0KvMfGk6haa2GZ6bL2K/xMA8Fvvj3o1maspfUXrGcCXutaqbLqbGx/espQ==", + "dev": true, + "requires": { + "@vue/devtools-shared": "^7.0.16", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + } + }, + "@vue/devtools-shared": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.16.tgz", + "integrity": "sha512-Lew4FrGjDjmanaUWSueNE1Rre83k7jQpttc17MaoVw0eARWU5DgZ1F/g9GNUMZXVjbP9rwE+LL3gd9XfXCfkvA==", + "dev": true, + "requires": { + "rfdc": "^1.3.1" + } + }, + "@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dev": true, + "requires": { + "@vue/shared": "3.4.21" + } + }, + "@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dev": true, + "requires": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dev": true, + "requires": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true + }, + "@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "requires": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "requires": {} + } + } + }, + "@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "requires": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true + }, + "@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "requires": { + "vue-demi": ">=0.14.7" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "requires": {} + } + } + }, + "algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dev": true, + "requires": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "anser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", + "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==", + "dev": true + }, + "ansi-to-vue3": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ansi-to-vue3/-/ansi-to-vue3-0.1.2.tgz", + "integrity": "sha512-mkfWeVNBKfmpoWLeLqmAeKQalqvOyAhhMnndqu1oJZEzz8tn56mbUqJC7OfvB8cOEg70ooKjmgeIZoI0i9cdxw==", + "dev": true, + "requires": { + "anser": "^2.1.1", + "escape-carriage": "^1.3.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "clean-set": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-set/-/clean-set-1.1.2.tgz", + "integrity": "sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==", + "dev": true + }, + "crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "esbuild": { + "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" + } + }, + "escape-carriage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", + "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "requires": { + "tabbable": "^6.2.0" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true + }, + "magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==", + "dev": true + }, + "medium-zoom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-to-yarn": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-2.2.1.tgz", + "integrity": "sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==", + "dev": true + }, + "outvariant": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", + "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==", + "dev": true + }, + "perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "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", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "preact": { + "version": "10.19.6", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", + "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "sandpack-vue3": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/sandpack-vue3/-/sandpack-vue3-3.1.11.tgz", + "integrity": "sha512-VuXLTvKJJEZa2TPqhWhN6kZ/LWW7igo/3QzMRiYdJnRpR7FfpCd3sSWtIExmv2MILFkLrIb3hH0M1e2LA0SEoQ==", + "dev": true, + "requires": { + "@codemirror/autocomplete": "^6.12.0", + "@codemirror/commands": "^6.3.3", + "@codemirror/lang-css": "^6.2.1", + "@codemirror/lang-html": "^6.4.8", + "@codemirror/lang-javascript": "^6.2.1", + "@codemirror/language": "^6.10.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.23.1", + "@codesandbox/sandpack-client": "^2.11.2", + "@lezer/highlight": "^1.2.0", + "@stitches/core": "^1.2.8", + "ansi-to-vue3": "^0.1.2", + "clean-set": "^1.1.2", + "dequal": "^2.0.3", + "lz-string": "^1.5.0" + } + }, + "sass": { + "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", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "dev": true, + "peer": true + }, + "shiki": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.1.7.tgz", + "integrity": "sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==", + "dev": true, + "requires": { + "@shikijs/core": "1.1.7" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true + }, + "static-browser-server": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/static-browser-server/-/static-browser-server-1.0.3.tgz", + "integrity": "sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==", + "dev": true, + "requires": { + "@open-draft/deferred-promise": "^2.1.0", + "dotenv": "^16.0.3", + "mime-db": "^1.52.0", + "outvariant": "^1.3.0" + } + }, + "strict-event-emitter": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", + "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==", + "dev": true + }, + "style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "dev": true + }, + "tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "viewerjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.6.tgz", + "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==", + "dev": true + }, + "vite": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "dev": true, + "requires": { + "esbuild": "^0.19.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + } + }, + "vitepress": { + "version": "1.0.0-rc.45", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.45.tgz", + "integrity": "sha512-/OiYsu5UKpQKA2c0BAZkfyywjfauDjvXyv6Mo4Ra57m5n4Bxg1HgUGoth1CLH2vwUbR/BHvDA9zOM0RDvgeSVQ==", + "dev": true, + "requires": { + "@docsearch/css": "^3.5.2", + "@docsearch/js": "^3.5.2", + "@shikijs/core": "^1.1.5", + "@shikijs/transformers": "^1.1.5", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.14", + "@vueuse/core": "^10.7.2", + "@vueuse/integrations": "^10.7.2", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.1.5", + "vite": "^5.1.3", + "vue": "^3.4.19" + } + }, + "vitepress-plugin-image-viewer": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitepress-plugin-image-viewer/-/vitepress-plugin-image-viewer-1.1.3.tgz", + "integrity": "sha512-cKN3W9zWtG4oXRyzMDLq7A7o7BOEL4F+Ez8xBLqmWS+CllBPCgXOMwLJ9V9Tc+zNrKpisEyA8SrLzcFbJhdBqA==", + "dev": true, + "requires": { + "viewerjs": "^1.11.3" + } + }, + "vitepress-plugin-npm-commands": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/vitepress-plugin-npm-commands/-/vitepress-plugin-npm-commands-0.6.0.tgz", + "integrity": "sha512-eqMR2NqvaBmCeu7kjXmv5Nd9oDXOlw0ooCxGYJFCf/3oK+Fv+q0l5rHnmW8EUOtJEU5ryjdB4Q3dzQxCeSqUIw==", + "dev": true, + "requires": { + "klona": "^2.0.6", + "npm-to-yarn": "^2.1.0" + } + }, + "vitepress-plugin-sandpack": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitepress-plugin-sandpack/-/vitepress-plugin-sandpack-1.1.4.tgz", + "integrity": "sha512-8ZAQLpg9VDY1o8wCjEQeKgfTnmxaV/1thElx5mhA6QbKpzo7Jo8WSYcWYA7yTCvBfTY+Blt8ngwXRnwbNbw5ig==", + "dev": true, + "requires": { + "@codesandbox/sandpack-themes": "^2.0.21", + "markdown-it-container": "^3.0.0", + "sandpack-vue3": "^3.1.9" + } + }, + "vitepress-plugin-tabs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.5.0.tgz", + "integrity": "sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A==", + "dev": true, + "requires": {} + }, + "vue": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..1c73e19 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,17 @@ +{ + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "devDependencies": { + "medium-zoom": "^1.1.0", + "sass": "^1.71.1", + "vitepress": "^1.0.0-rc.45", + "vitepress-plugin-image-viewer": "^1.1.3", + "vitepress-plugin-npm-commands": "^0.6.0", + "vitepress-plugin-sandpack": "^1.1.4", + "vitepress-plugin-tabs": "^0.5.0", + "vue": "^3.4.21" + } +} diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..070537ae342155445e07f959247fa01910db9e31 GIT binary patch literal 17089 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 JZ((5E{{p9eErkF8 literal 0 HcmV?d00001 diff --git a/docs/public/hero.svg b/docs/public/hero.svg new file mode 100644 index 0000000..d7d4572 --- /dev/null +++ b/docs/public/hero.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/localazy-cdn-client.svg b/docs/public/localazy-cdn-client.svg new file mode 100644 index 0000000..e23fe77 --- /dev/null +++ b/docs/public/localazy-cdn-client.svg @@ -0,0 +1,40 @@ + + + + + + + + + +
+ Localazy automatically +
+ publishes content to CDN +
+
+ + + + CDN + + + + +
+ Download translated +
+ files using CDN Client +
+
+ + + +
+ Your +
+ App +
+
+
+
diff --git a/docs/public/localazy-logo-white-large.svg b/docs/public/localazy-logo-white-large.svg new file mode 100644 index 0000000..9042951 --- /dev/null +++ b/docs/public/localazy-logo-white-large.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/public/localazy-logo-white.svg b/docs/public/localazy-logo-white.svg new file mode 100644 index 0000000..8677a2b --- /dev/null +++ b/docs/public/localazy-logo-white.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/public/metafile-url-copy.png b/docs/public/metafile-url-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea8b0c4837968de6428072275b9ace8fe766584 GIT binary patch literal 33170 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 w>N#y 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 KCja!+d;b9nrwj!E literal 0 HcmV?d00001 diff --git a/docs/public/ts.svg b/docs/public/ts.svg new file mode 100644 index 0000000..1aac275 --- /dev/null +++ b/docs/public/ts.svg @@ -0,0 +1,8 @@ + + + + + + TS + + diff --git a/docs/reference/client-api.md b/docs/reference/client-api.md new file mode 100644 index 0000000..ed2111e --- /dev/null +++ b/docs/reference/client-api.md @@ -0,0 +1,284 @@ +--- +outline: [ 2, 3 ] +--- + +# Client API + +## Constructor + +--- + +### create(options, config?) + +Fetch the metafile and create a new CDN client instance. + +<<< ../code-examples/reference/create.js + +#### Parameters + +| Name | Type | Description | +|----------------------------------------------|-----------------------------------------------------------------|:----------------------| +| options | [`CdnClientOptions`](types.md#cdnclientoptions) | CDN client options. | +| config | [`CreateAxiosDefaults`](https://axios-http.com/docs/req_config) | Axios request config. | + +#### Returns + +| Type | Description | +|:-----------------------------------------------------------------------------------------------|:---------------------| +| Promise<[`CdnClient`](https://github.com/localazy/cdn-client/blob/main/src/cdn/cdn-client.ts)> | CDN client instance. | + +> [!NOTE] +> Metafile is fetched only once and then cached. If you want to refresh the metafile, use the [`metafile.refresh()`](#metafile-refresh-config) function. + +## Locales + +--- + +### metafile.locales(options?) + +Get all project locales. + +<<< ../code-examples/reference/metafile-locales.js + +
example result + +<<< ../code-examples/reference/results/metafile-locales.js +
+ +#### Parameters + +| Name | Type | Description | +|-----------------------------------------------|---------------------------------------------------|:-----------------| +| options | [`CdnLocalesOptions`](types.md#cdnlocalesoptions) | Locales options. | + +#### Returns + +| Type | Description | +|-------------------------------------|:-----------------| +| [`CdnLocale[]`](types.md#cdnlocale) | Project locales. | + +--- + +### metafile.baseLocale + +Get the base locale of the project. + +<<< ../code-examples/reference/metafile-base-locale.js + +
example result + +<<< ../code-examples/reference/results/metafile-base-locale.js +
+ +#### Returns + +| Type | Description | +|-----------------------------------|:----------------------------| +| [`CdnLocale`](types.md#cdnlocale) | Base locale of the project. | + +## Files content + +--- + +### fetch(options?) + +Get the content of the project files. + +Optional parameter `options.files` can be a single [`CdnFile`](types.md#cdnfile) object or an array of [`CdnFile`](types.md#cdnfile) objects. [`CdnFile`](types.md#cdnfile) objects +are returned by the metafile functions [`metafile.files.list()`](#metafile-files-list), [`metafile.files.filter()`](#metafile-files-filter-options), +[`metafile.files.find()`](#metafile-files-find-options), [`metafile.files.first()`](#metafile-files-first). +Alternatively, it can be a single file ID or an array of file IDs. If not provided, all files are fetched. + +Optional parameter `options.locales` can be a single locale or an array of locales. If not provided, all locales are fetched. + +<<< ../code-examples/reference/fetch.js + +
example result + +<<< ../code-examples/reference/results/fetch.js +
+ +#### Parameters + +| Name | Type | Description | +|-----------------------------------------------|-----------------------------------------------|:------------------------------------------------------| +| options | [`CdnFetchOptions`](types.md#cdnfetchoptions) | Options object containing selected files and locales. | + +#### Returns + +| Type | Description | +|------------------------------------------------|:-----------------------------------------------------------------| +| Promise<[`CdnResponse`](types.md#cdnresponse)> | Object containing the content of the selected files and locales. | + +## Metafile content + +--- + +### metafile.files.list() + +Get all project files. + +<<< ../code-examples/reference/metafile-files-list.js + +
example result + +<<< ../code-examples/reference/results/metafile-files-list.js +
+ +#### Returns + +| Type | Description | +|---------------------------------|:-------------------| +| [`CdnFile[]`](types.md#cdnfile) | All project files. | + +--- + +### metafile.files.filter(options) + +Filter project files. + +Parameter `options` can be an object with file properties to filter by or a function that returns a boolean value. Check +the [`CdnFilesSearchOptions`](types.md#cdnfilessearchoptions) type for more details. + +<<< ../code-examples/reference/metafile-files-filter.js + +
example result + +<<< ../code-examples/reference/results/metafile-files-filter.js +
+ +#### Parameters + +| Name | Type | Description | +|---------|-----------------------------------------------------------|:----------------------| +| options | [`CdnFilesSearchOptions`](types.md#cdnfilessearchoptions) | Files filter options. | + +#### Returns + +| Type | Description | +|---------------------------------|:---------------| +| [`CdnFile[]`](types.md#cdnfile) | Project files. | + +--- + +### metafile.files.find(options) + +Get a project file. + +Parameter `options` can be an object with file properties to find by or a function that returns a boolean value. Check the +[`CdnFilesSearchOptions`](types.md#cdnfilessearchoptions) type for more details. + +<<< ../code-examples/reference/metafile-files-find.js + +
example result + +<<< ../code-examples/reference/results/metafile-files-find.js +
+ +#### Parameters + +| Name | Type | Description | +|---------|-----------------------------------------------------------|:-------------------| +| options | [`CdnFilesSearchOptions`](types.md#cdnfilessearchoptions) | Find file options. | + +#### Returns + +| Type | Description | +|----------------------------------------------|:-----------------------------| +| [`CdnFile`](types.md#cdnfile) \| `undefined` | Project file or `undefined`. | + +--- + +### metafile.files.first() + +Get first project file. + +<<< ../code-examples/reference/metafile-files-first.js + +
example result + +<<< ../code-examples/reference/results/metafile-files-first.js +
+ +#### Returns + +| Type | Description | +|-------------------------------|:--------------------| +| [`CdnFile`](types.md#cdnfile) | First project file. | + +--- + +### metafile.url + +Get URL of current metafile. + +<<< ../code-examples/reference/metafile-url.js + +
example result + +<<< ../code-examples/reference/results/metafile-url.js +
+ +#### Returns + +| Type | Description | +|----------|:--------------| +| `string` | Metafile URL. | + +--- + +### metafile.projectUrl + +Get URL of the project to which the metafile belongs. + +<<< ../code-examples/reference/metafile-project-url.js + +
example result + +<<< ../code-examples/reference/results/metafile-project-url.js +
+ +#### Returns + +| Type | Description | +|----------|:-------------| +| `string` | Project URL. | + +--- + +### metafile.refresh(config?) + +Refresh the [metafile](../get-started/metafile.md). + +<<< ../code-examples/reference/metafile-refresh.js + +#### Parameters + +| Name | Type | Description | +|----------------------------------------------|-----------------------------------------------------------------|:----------------------| +| config | [`CreateAxiosDefaults`](https://axios-http.com/docs/req_config) | Axios request config. | + +#### Returns + +| Type | +|:----------------| +| Promise<`void`> | + +--- + +### metafile.switch(options, config?) + +Switch to a different [metafile](../get-started/metafile.md). + +<<< ../code-examples/reference/metafile-switch.js + +#### Parameters + +| Name | Type | Description | +|----------------------------------------------|-----------------------------------------------------------------|:----------------------| +| options | [`CdnClientOptions`](types.md#cdnclientoptions) | CDN client options. | +| config | [`CreateAxiosDefaults`](https://axios-http.com/docs/req_config) | Axios request config. | + +| Type | +|:----------------| +| Promise<`void`> | diff --git a/docs/reference/types.md b/docs/reference/types.md new file mode 100644 index 0000000..45b741c --- /dev/null +++ b/docs/reference/types.md @@ -0,0 +1,33 @@ +# TypeScript definitions + +## CdnClientOptions + +<<< ../../src/types/cdn-client-options.ts#typedef + +## CdnLocale + +<<< ../../src/types/cdn-locale.ts#typedef + +## CdnLocalesOptions + +<<< ../../src/types/cdn-locales-options.ts#typedef + +## CdnFetchOptions + +<<< ../../src/types/cdn-fetch-options.ts#typedef + +## CdnResponse + +<<< ../../src/types/cdn-response.ts#typedef + +## CdnFile + +<<< ../../src/types/cdn-file.ts#typedef + +## CdnFileLocale + +<<< ../../src/types/cdn-file-locale.ts#typedef + +## CdnFilesSearchOptions + +<<< ../../src/types/cdn-files-search-options.ts#typedef diff --git a/docs/sandbox/live-demo.md b/docs/sandbox/live-demo.md new file mode 100644 index 0000000..0098157 --- /dev/null +++ b/docs/sandbox/live-demo.md @@ -0,0 +1,31 @@ +# Live demo + +[//]: # (::: sandbox {template=vanilla}) + +[//]: # () +[//]: # (```js index.js) + +[//]: # (import { CdnClient } from '@localazy/cdn-client';) + +[//]: # () +[//]: # (const fetch = async () => {) + +[//]: # ( const cdn = await CdnClient.create({) + +[//]: # ( metafile: 'https://delivery.localazy.com/_a855374211039568660198b39c31/_e0.v2.json') + +[//]: # ( });) + +[//]: # () +[//]: # ( const response = await cdn.files({ only: cdn.metafile.files.first() })) + +[//]: # ( .locales({ only: 'en' })) + +[//]: # ( .fetch(); ) + +[//]: # (}) + +[//]: # (```) + +[//]: # () +[//]: # (:::) diff --git a/docs/usage/get-content.md b/docs/usage/get-content.md new file mode 100644 index 0000000..5766e50 --- /dev/null +++ b/docs/usage/get-content.md @@ -0,0 +1,103 @@ +--- +outline: [ 2, 3 ] +--- + +# Get content + +Once you have initialized the [CdnClient](../reference/client-api.md#constructor), you can get content of one or multiple files that are present in +the [metafile](../get-started/metafile.md). + +## Selecting data + +You can select the data you want by specifying the `files` and the `locales` parameters in the [`fetch()`](../reference/client-api.md#fetch-options) function. + +As the `files` parameter, you can pass single or multiple [`CdnFile`](../reference/types.md#cdnfile) objects, which are returned by the metafile content +functions [`metafile.files.list()`](../reference/client-api.md#metafile-files-list), [`metafile.files.filter()`](../reference/client-api.md#metafile-files-filter-options), [`metafile.files.find()`](../reference/client-api.md#metafile-files-find-options), [`metafile.files.first()`](../reference/client-api.md#metafile-files-first). +Alternatively, you can use the file id or an array of file ids. If none is provided, all files are fetched. + +As the `locales` parameter, you can pass a locale code or an array of locale codes. If none is provided, all locales are fetched. + +## Single file + +In following examples, a single file returned from [`metafile.files.first()`](../reference/client-api.md#metafile-files-first) is used to demonstrate the usage of the [`fetch()`](../reference/client-api.md#fetch-options) function. + +### Get single locale + +Get the locale keys for single file and single locale. + +<<< ../code-examples/usage/get-single-file-single-locale.js + +
example result + +<<< ../code-examples/usage/results/get-single-file-single-locale.js +
+ +### Get multiple locales + +Get the locale keys for single file and multiple locales. + +<<< ../code-examples/usage/get-single-file-multiple-locales.js + +
example result + +<<< ../code-examples/usage/results/get-single-file-multiple-locales.js +
+ +### Get all locales + +Get the locale keys for single file and all locales. + +<<< ../code-examples/usage/get-single-file-all-locales.js + +
example result + +<<< ../code-examples/usage/results/get-single-file-all-locales.js +
+ +## Multiple files + +### Get single locale + +Get the locale keys for multiple files and single locale. + +<<< ../code-examples/usage/get-multiple-files-single-locale.js + +
example result + +<<< ../code-examples/usage/results/get-multiple-files-single-locale.js +
+ +### Get multiple locales + +Get the locale keys for multiple files and multiple locales. + +<<< ../code-examples/usage/get-multiple-files-multiple-locales.js + +
example result + +<<< ../code-examples/usage/results/get-multiple-files-multiple-locales.js +
+ +### Get all locales + +Get the locale keys for multiple files and all locales. + +<<< ../code-examples/usage/get-multiple-files-all-locales.js + +
example result + +<<< ../code-examples/usage/results/get-multiple-files-all-locales.js +
+ +## All files content + +### Get all locales + +Get the locale keys for all files and all locales. + +<<< ../code-examples/usage/get-all-files-all-locales.js + +
example result + +<<< ../code-examples/usage/results/get-all-files-all-locales.js +
diff --git a/docs/usage/get-locales.md b/docs/usage/get-locales.md new file mode 100644 index 0000000..0cc8d50 --- /dev/null +++ b/docs/usage/get-locales.md @@ -0,0 +1,30 @@ +# Get locales + +Once you have initialized the [CdnClient](../reference/client-api.md#constructor), you can get the locales that are available in the [metafile](../get-started/metafile.md). + +## Get all locales + +<<< ../code-examples/usage/get-all-locales.js + +
example result + +<<< ../code-examples/usage/results/get-all-locales.js +
+ +## Get all locales except the base locale + +<<< ../code-examples/usage/get-all-locales-except-base-locale.js + +
example result + +<<< ../code-examples/usage/results/get-all-locales-except-base-locale.js +
+ +## Get base locale + +<<< ../code-examples/usage/get-base-locale.js + +
example result + +<<< ../code-examples/usage/results/get-base-locale.js +
diff --git a/docs/usage/metafile.md b/docs/usage/metafile.md new file mode 100644 index 0000000..b6d71eb --- /dev/null +++ b/docs/usage/metafile.md @@ -0,0 +1,27 @@ +# Usage + +## List all files from the metafile + +```javascript +cdn.metafile.files.list(); +``` + +
example result + +```javascript +[ + { + id: 'dfe5b84c1598c8c56b6f1a11efcd483bb3f417ea', + file: 'file.json', + path: '', + library: '', + module: '', + buildType: '', + productFlavors: [], + baseLocale: 'en', + metafileLocales: [ ... ] + } +] + +``` +
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a0a5c6b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10110 @@ +{ + "name": "@localazy/cdn-client", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@localazy/cdn-client", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "axios": "^1.6.7", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@types/lodash": "^4.17.0", + "@types/node": "^20.11.26", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitest/coverage-v8": "^1.3.1", + "@vitest/ui": "^1.3.1", + "axios-mock-adapter": "^1.22.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "reexport": "^1.4.1", + "rollup-plugin-terser": "^7.0.2", + "typedoc": "^0.25.12", + "typedoc-plugin-markdown": "^3.17.1", + "typedoc-plugin-missing-exports": "^2.2.0", + "vite": "^5.1.6", + "vite-plugin-dts": "^3.7.3", + "vitest": "^1.3.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "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.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "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" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.39.0.tgz", + "integrity": "sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.28.3", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.62.0", + "@rushstack/rig-package": "0.5.1", + "@rushstack/ts-command-line": "4.17.1", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.3.3" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.3.tgz", + "integrity": "sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.62.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "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/@rushstack/node-core-library": { + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.62.0.tgz", + "integrity": "sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==", + "dev": true, + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.1.tgz", + "integrity": "sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", + "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "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" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "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-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "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-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.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/utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "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": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.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/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.3.1.tgz", + "integrity": "sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "node_modules/@vitest/expect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", + "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz", + "integrity": "sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz", + "integrity": "sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", + "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.3.1.tgz", + "integrity": "sha512-2UrFLJ62c/eJGPHcclstMKlAR7E1WB1ITe1isuowEPJJHi3HfqofvsUqQ1cGrEF7kitG1DJuwURUA3HLDtQkXA==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "node_modules/@vitest/utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", + "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", + "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.15", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", + "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.15", + "@vue/shared": "3.4.15" + } + }, + "node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/shared": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", + "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-mock-adapter": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.0.0.tgz", + "integrity": "sha512-yHV74THqMJUyFKkHyN7hyENcEZM3Dj2a2IrdClY+IT4BFQHkIVwlh8s6uZfjsFydMdNHv0F5mWgAA3ajFbsvVQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", + "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "peer": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", + "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.0.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "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/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/magicast": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", + "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "source-map-js": "^1.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reexport": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/reexport/-/reexport-1.4.1.tgz", + "integrity": "sha512-RpL+Q+R0ZX9teEza1ZUoxPhF4WGCFjf4172AMjsKZx9hWbnIi18gOiO+KxMHu3xaJ+xkoH3stnFr5g1SZzv6hw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^10.0.0", + "globby": "^13.1.3" + }, + "bin": { + "reexport": "bin/reexport.js" + } + }, + "node_modules/reexport/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reexport/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", + "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "dev": true, + "dependencies": { + "js-tokens": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", + "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "dev": true + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "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", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", + "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.12.tgz", + "integrity": "sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.3", + "shiki": "^0.14.7" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", + "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", + "dev": true, + "dependencies": { + "handlebars": "^4.7.7" + }, + "peerDependencies": { + "typedoc": ">=0.24.0" + } + }, + "node_modules/typedoc-plugin-missing-exports": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-2.2.0.tgz", + "integrity": "sha512-2+XR1IcyQ5UwXZVJe9NE6HrLmNufT9i5OwoIuuj79VxuA3eYq+Y6itS9rnNV1D7UeQnUSH8kISYD73gHE5zw+w==", + "dev": true, + "peerDependencies": { + "typedoc": "0.24.x || 0.25.x" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", + "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-dts": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.7.3.tgz", + "integrity": "sha512-26eTlBYdpjRLWCsTJebM8vkCieE+p9gP3raf+ecDnzzK5E3FG6VE1wcy55OkRpfWWVlVvKkYFe6uvRHYWx7Nog==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor": "7.39.0", + "@rollup/pluginutils": "^5.1.0", + "@vue/language-core": "^1.8.26", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "vue-tsc": "^1.8.26" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/rollup": { + "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": ">=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" + } + }, + "node_modules/vitest": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz", + "integrity": "sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.3.1", + "@vitest/ui": "1.3.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "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/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "dev": true + }, + "@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@microsoft/api-extractor": { + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.39.0.tgz", + "integrity": "sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.28.3", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.62.0", + "@rushstack/rig-package": "0.5.1", + "@rushstack/ts-command-line": "4.17.1", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.3.3" + } + }, + "@microsoft/api-extractor-model": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.3.tgz", + "integrity": "sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.62.0" + } + }, + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "dependencies": { + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + } + } + }, + "@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 + }, + "@rushstack/node-core-library": { + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.62.0.tgz", + "integrity": "sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==", + "dev": true, + "requires": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + } + }, + "@rushstack/rig-package": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.1.tgz", + "integrity": "sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==", + "dev": true, + "requires": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "@rushstack/ts-command-line": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", + "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "peer": true + }, + "@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "dev": true + }, + "@types/node": { + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.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/utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "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": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@vitest/coverage-v8": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.3.1.tgz", + "integrity": "sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.2.0" + } + }, + "@vitest/expect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", + "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", + "dev": true, + "requires": { + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" + } + }, + "@vitest/runner": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz", + "integrity": "sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==", + "dev": true, + "requires": { + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz", + "integrity": "sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==", + "dev": true, + "requires": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + } + }, + "@vitest/spy": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", + "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", + "dev": true, + "requires": { + "tinyspy": "^2.2.0" + } + }, + "@vitest/ui": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.3.1.tgz", + "integrity": "sha512-2UrFLJ62c/eJGPHcclstMKlAR7E1WB1ITe1isuowEPJJHi3HfqofvsUqQ1cGrEF7kitG1DJuwURUA3HLDtQkXA==", + "dev": true, + "requires": { + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + } + }, + "@vitest/utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", + "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "dev": true, + "requires": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + } + }, + "@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "requires": { + "@volar/source-map": "1.11.1" + } + }, + "@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "requires": { + "muggle-string": "^0.3.1" + } + }, + "@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "requires": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "@vue/compiler-core": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", + "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", + "dev": true, + "requires": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.15", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + } + } + }, + "@vue/compiler-dom": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", + "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.4.15", + "@vue/shared": "3.4.15" + } + }, + "@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "dev": true, + "requires": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + } + }, + "@vue/shared": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", + "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==", + "dev": true + }, + "acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "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" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true + }, + "axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "requires": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "axios-mock-adapter": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + } + }, + "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" + } + }, + "check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "requires": { + "get-func-name": "^2.0.2" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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 + }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "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 + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + } + }, + "es-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.0.0.tgz", + "integrity": "sha512-yHV74THqMJUyFKkHyN7hyENcEZM3Dj2a2IrdClY+IT4BFQHkIVwlh8s6uZfjsFydMdNHv0F5mWgAA3ajFbsvVQ==", + "dev": true + }, + "es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "peer": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "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" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "eslint-config-airbnb-typescript": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", + "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^15.0.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "peer": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "peer": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "peer": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "peer": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true + } + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0" + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", + "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", + "dev": true, + "requires": { + "es-errors": "^1.0.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "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 + }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "requires": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.1" + } + }, + "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" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "magicast": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", + "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", + "dev": true, + "requires": { + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "source-map-js": "^1.0.2" + } + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "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" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "dev": true, + "requires": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "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", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reexport": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/reexport/-/reexport-1.4.1.tgz", + "integrity": "sha512-RpL+Q+R0ZX9teEza1ZUoxPhF4WGCFjf4172AMjsKZx9hWbnIi18gOiO+KxMHu3xaJ+xkoH3stnFr5g1SZzv6hw==", + "dev": true, + "requires": { + "chokidar": "^3.5.3", + "commander": "^10.0.0", + "globby": "^13.1.3" + }, + "dependencies": { + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + } + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "peer": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + } + }, + "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" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shiki": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "dev": true, + "requires": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "peer": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "strip-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", + "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "dev": true, + "requires": { + "js-tokens": "^8.0.2" + }, + "dependencies": { + "js-tokens": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", + "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "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" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terser": { + "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", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "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 + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "tinypool": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", + "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "dev": true + }, + "tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "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==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "peer": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedoc": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.12.tgz", + "integrity": "sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==", + "dev": true, + "requires": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.3", + "shiki": "^0.14.7" + } + }, + "typedoc-plugin-markdown": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", + "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", + "dev": true, + "requires": { + "handlebars": "^4.7.7" + } + }, + "typedoc-plugin-missing-exports": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-2.2.0.tgz", + "integrity": "sha512-2+XR1IcyQ5UwXZVJe9NE6HrLmNufT9i5OwoIuuj79VxuA3eYq+Y6itS9rnNV1D7UeQnUSH8kISYD73gHE5zw+w==", + "dev": true, + "requires": {} + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, + "ufo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "dev": true + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "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 + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + } + }, + "validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "dev": true + }, + "vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "dev": true, + "requires": { + "esbuild": "^0.19.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "dependencies": { + "rollup": { + "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" + } + } + } + }, + "vite-node": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", + "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + } + }, + "vite-plugin-dts": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.7.3.tgz", + "integrity": "sha512-26eTlBYdpjRLWCsTJebM8vkCieE+p9gP3raf+ecDnzzK5E3FG6VE1wcy55OkRpfWWVlVvKkYFe6uvRHYWx7Nog==", + "dev": true, + "requires": { + "@microsoft/api-extractor": "7.39.0", + "@rollup/pluginutils": "^5.1.0", + "@vue/language-core": "^1.8.26", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "vue-tsc": "^1.8.26" + } + }, + "vitest": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz", + "integrity": "sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==", + "dev": true, + "requires": { + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.1", + "why-is-node-running": "^2.2.2" + } + }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "requires": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + } + }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "requires": { + "commander": "^9.4.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..103dcd2 --- /dev/null +++ b/package.json @@ -0,0 +1,91 @@ +{ + "name": "@localazy/cdn-client", + "version": "1.0.0", + "description": "Node.js module that allows you to easily interact with the Localazy CDN.", + "author": "Localazy ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/localazy/cdn-client" + }, + "bugs": { + "url": "https://github.com/localazy/cdn-client/issues" + }, + "homepage": "https://github.com/localazy/cdn-client#readme", + "keywords": [ + "Localazy", + "Localazy CDN", + "CDN", + "TypeScript", + "internationalization", + "translation", + "localization", + "globalization", + "i18n", + "t9n", + "l10n", + "g11n" + ], + "type": "module", + "module": "./dist/localazy-cdn.min.js", + "main": "./dist/cjs/localazy-cdn.min.cjs", + "unpkg": "./dist/umd/localazy-cdn.umd.min.cjs", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": { + "default": "./dist/localazy-cdn.js", + "types": "./dist/index.d.ts" + }, + "require": { + "default": "./dist/cjs/localazy-cdn.cjs", + "types": "./dist/index.d.ts" + } + } + }, + "files": [ + "dist/**/*", + "README.md" + ], + "scripts": { + "dev": "vite & npm run main-ts:watch", + "build": "rimraf dist && npm run main-ts:build && vite build", + "main-ts:build": "reexport src/main.ts", + "main-ts:watch": "reexport --watch src/main.ts", + "check": "npm run typecheck && npm run test:coverage && npm run lint", + "typecheck": "npx tsc --noemit", + "test": "vitest", + "test:coverage": "vitest run --coverage", + "test:ui": "vitest --ui", + "test:debug": "vitest --inspect-brk --no-file-parallelism", + "lint": "bash -c 'eslint --ext .ts,.js,.mjs,.cjs --ignore-path <(cat .gitignore .eslintignore) .'", + "lint:fix": "npm run lint -- --fix", + "typedoc": "npm run docs:html && npm run docs:md", + "typedoc:html": "rimraf typedoc/html/* && typedoc --plugin typedoc-plugin-missing-exports --tsconfig tsconfig.typedoc.json --out typedoc/html src/main.ts", + "typedoc:md": "rimraf typedoc/md/* && typedoc --plugin typedoc-plugin-markdown --plugin typedoc-plugin-missing-exports --tsconfig tsconfig.typedoc.json --out typedoc/md src/main.ts" + }, + "dependencies": { + "axios": "^1.6.7", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@types/lodash": "^4.17.0", + "@types/node": "^20.11.26", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitest/coverage-v8": "^1.3.1", + "@vitest/ui": "^1.3.1", + "axios-mock-adapter": "^1.22.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "reexport": "^1.4.1", + "rollup-plugin-terser": "^7.0.2", + "typedoc": "^0.25.12", + "typedoc-plugin-markdown": "^3.17.1", + "typedoc-plugin-missing-exports": "^2.2.0", + "vite": "^5.1.6", + "vite-plugin-dts": "^3.7.3", + "vitest": "^1.3.1" + } +} diff --git a/src/cdn/api/api.ts b/src/cdn/api/api.ts new file mode 100644 index 0000000..97fb5dc --- /dev/null +++ b/src/cdn/api/api.ts @@ -0,0 +1,36 @@ +import { AxiosRequestConfig, AxiosResponse, ResponseType } from 'axios'; +import { IMetafile } from '@/interfaces/i-metafile'; +import { ApiLocaleRequest } from '@/types/api-locale-request'; +import { Context } from '@/cdn/context/context'; + +export class Api { + protected context: Context; + + constructor(context: Context) { + this.context = context; + } + + public async fetchLocale(options: ApiLocaleRequest): Promise { + const config: AxiosRequestConfig = { reference: options }; + + if (this.context.cache.has(options)) { + return new Promise((resolve): void => { + resolve({ + data: this.context.cache.get(options), + config, + } as AxiosResponse); + }); + } + + const responseType: ResponseType = /\.(json|json5)$/.test(options.metafileFile.file) ? 'json' : 'text'; + + return this.context.client.get(options.metafileLocale.uri, { ...config, responseType }); + } + + public async fetchMetafile(config?: AxiosRequestConfig): Promise> { + return this.context.client.get( + this.context.metafile.params.jsonPath, + config, + ); + } +} diff --git a/src/cdn/cache/locales-cache.ts b/src/cdn/cache/locales-cache.ts new file mode 100644 index 0000000..6fb82f1 --- /dev/null +++ b/src/cdn/cache/locales-cache.ts @@ -0,0 +1,68 @@ +import uniq from 'lodash/uniq'; +import { ICacheAdapter } from '@/interfaces/i-cache-adapter'; +import { CacheKeyMetafileOptions } from '@/types/cache-key-metafile-options'; +import { CacheGetLocalesRequest } from '@/types/cache-get-locales-request'; +import { CacheHasLocalesRequest } from '@/types/cache-has-locales-request'; +import { CacheStoreLocalesRequest } from '@/types/cache-store-locales-request'; +import { MemoryCacheAdapter } from '@/cdn/cache/memory-cache-adapter'; +import { Context } from '@/cdn/context/context'; + +export class LocalesCache { + protected context: Context; + + protected cacheAdapter: ICacheAdapter; + + constructor(context: Context) { + this.context = context; + this.cacheAdapter = new MemoryCacheAdapter(); + } + + public setIfMissed(options: CacheStoreLocalesRequest): void { + const { metafileFile, metafileLocale, data }: CacheStoreLocalesRequest = options; + + const key: string = this.keyFromMetafile({ + metafileFile, + metafileLocale, + }); + + if (!this.cacheAdapter.has(key)) { + this.cacheAdapter.set(key, data); + } + } + + public has(options: CacheHasLocalesRequest): boolean { + const key: string = this.keyFromMetafile(options); + + return this.cacheAdapter.has(key); + } + + public get(options: CacheGetLocalesRequest): object | string | undefined { + const key: string = this.keyFromMetafile(options); + + return this.cacheAdapter.get(key); + } + + public flush(): void { + this.cacheAdapter.flush(); + } + + protected keyFromMetafile(options: CacheKeyMetafileOptions): string { + const { metafileFile, metafileLocale }: CacheKeyMetafileOptions = options; + const productFlavors: string = [...uniq(metafileFile.productFlavors)].sort().join('-'); + + const indices: string[] = [ + this.context.metafile.params.cdnId, + metafileFile.id, + metafileFile.file, + metafileFile.path, + metafileFile.library, + metafileFile.module, + metafileFile.buildType, + productFlavors, + metafileLocale.locale, + metafileLocale.timestamp.toString(), + ]; + + return indices.filter((key: string): boolean => key !== '').join('-'); + } +} diff --git a/src/cdn/cache/memory-cache-adapter.ts b/src/cdn/cache/memory-cache-adapter.ts new file mode 100644 index 0000000..3149e59 --- /dev/null +++ b/src/cdn/cache/memory-cache-adapter.ts @@ -0,0 +1,25 @@ +import { ICacheAdapter } from '@/interfaces/i-cache-adapter'; + +export class MemoryCacheAdapter implements ICacheAdapter { + protected map: Map; + + constructor() { + this.map = new Map(); + } + + public get(key: K): V | undefined { + return this.map.get(key); + } + + public has(key: K): boolean { + return this.map.has(key); + } + + public set(key: K, value: V): void { + this.map.set(key, value); + } + + public flush(): void { + this.map = new Map(); + } +} diff --git a/src/cdn/cdn-client.ts b/src/cdn/cdn-client.ts new file mode 100644 index 0000000..0d1519a --- /dev/null +++ b/src/cdn/cdn-client.ts @@ -0,0 +1,53 @@ +import { AxiosRequestConfig, CreateAxiosDefaults } from 'axios'; +import isString from 'lodash/isString'; +import { CdnFetchOptions } from '@/types/cdn-fetch-options'; +import { CdnResponse } from '@/types/cdn-response'; +import { CdnCache } from '@/cdn/methods/cdn-cache'; +import { MetafileContext } from '@/cdn/context/metafile-context'; +import { Context } from '@/cdn/context/context'; +import { CdnMetafile } from '@/cdn/methods/cdn-metafile'; +import { RequestBuilder } from '@/cdn/request/request-builder'; +import { AxiosHttpAdapter } from '@/cdn/http/axios-http-adapter'; +import { CdnClientOptions } from '@/types/cdn-client-options'; + +export class CdnClient { + public metafile: CdnMetafile; + + public cache: CdnCache; + + protected context: Context; + + protected constructor(options: CdnClientOptions, config?: CreateAxiosDefaults) { + const metafileContext: MetafileContext = new MetafileContext(options); + const client: AxiosHttpAdapter = new AxiosHttpAdapter(metafileContext.params.baseUrl, config); + + this.context = new Context({ metafileContext, cdn: this, client }); + this.metafile = new CdnMetafile(this.context); + this.cache = new CdnCache(this.context); + } + + public fetch = async (options?: CdnFetchOptions): Promise => { + const { files, locales, excludeBaseLocale }: CdnFetchOptions = options || {}; + const requestBuilder: RequestBuilder = new RequestBuilder(this.context) + .addFiles(files) + .addLocales(locales, excludeBaseLocale); + + return requestBuilder.getCdnRequest().execute(); + }; + + public static async create(options: CdnClientOptions, config?: CreateAxiosDefaults): Promise { + if (!options) { + throw new Error('Invalid param: missing required "options" parameter.'); + } + + if (!isString(options.metafile)) { + throw new Error('Invalid param: "options.metafile" must be string.'); + } + + const cdn: CdnClient = new CdnClient(options, config); + + await cdn.metafile.refresh(config as AxiosRequestConfig); + + return cdn; + } +} diff --git a/src/cdn/context/context.ts b/src/cdn/context/context.ts new file mode 100644 index 0000000..30bb533 --- /dev/null +++ b/src/cdn/context/context.ts @@ -0,0 +1,30 @@ +import { Api } from '@/cdn/api/api'; +import { LocalesCache } from '@/cdn/cache/locales-cache'; +import { CdnClient } from '@/cdn/cdn-client'; +import { ResponseFactory } from '@/cdn/response/response-factory'; +import { ContextOptions } from '@/types/context-options'; +import { MetafileContext } from '@/cdn/context/metafile-context'; +import { IHttpAdapter } from '@/interfaces/i-http-adapter'; + +export class Context { + public metafile: MetafileContext; + + public cdn: CdnClient; + + public client: IHttpAdapter; + + public api: Api; + + public cache: LocalesCache; + + public responseFactory: ResponseFactory; + + constructor(options: ContextOptions) { + this.metafile = options.metafileContext; + this.cdn = options.cdn; + this.client = options.client; + this.api = new Api(this); + this.cache = new LocalesCache(this); + this.responseFactory = new ResponseFactory(this); + } +} diff --git a/src/cdn/context/metafile-context.ts b/src/cdn/context/metafile-context.ts new file mode 100644 index 0000000..381c217 --- /dev/null +++ b/src/cdn/context/metafile-context.ts @@ -0,0 +1,24 @@ +import { MetafileData } from '@/cdn/metafile/metafile-data'; +import { IMetafile } from '@/interfaces/i-metafile'; +import { MetafileParams } from '@/cdn/metafile/metafile-params'; +import { CdnClientOptions } from '@/types/cdn-client-options'; + +export class MetafileContext { + public params: MetafileParams; + + public parsedData: IMetafile | null; + + public data: MetafileData; + + constructor(options: CdnClientOptions) { + this.params = new MetafileParams(options.metafile); + this.parsedData = null; + this.data = MetafileData.createEmpty(this.params); + } + + public setMetafile(metafile: IMetafile): void { + this.parsedData = metafile; + + this.data = new MetafileData(metafile, this.params); + } +} diff --git a/src/cdn/http/axios-http-adapter.ts b/src/cdn/http/axios-http-adapter.ts new file mode 100644 index 0000000..a7b46d6 --- /dev/null +++ b/src/cdn/http/axios-http-adapter.ts @@ -0,0 +1,20 @@ +import axios, { AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults } from 'axios'; +import { IHttpAdapter } from '@/interfaces/i-http-adapter'; + +export class AxiosHttpAdapter implements IHttpAdapter { + public client: AxiosInstance; + + constructor(baseUrl: string, config?: CreateAxiosDefaults) { + this.client = AxiosHttpAdapter.clientFactory(baseUrl, config); + } + + protected static clientFactory(baseURL: string, config?: CreateAxiosDefaults): AxiosInstance { + const clientConfig: CreateAxiosDefaults = { baseURL, ...config }; + + return axios.create(clientConfig); + } + + get(url: string, config?: AxiosRequestConfig): Promise { + return this.client.get(url, config); + } +} diff --git a/src/cdn/metafile/metafile-data.ts b/src/cdn/metafile/metafile-data.ts new file mode 100644 index 0000000..21f3b03 --- /dev/null +++ b/src/cdn/metafile/metafile-data.ts @@ -0,0 +1,94 @@ +import uniqBy from 'lodash/uniqBy'; +import { MetafileParams } from '@/cdn/metafile/metafile-params'; +import { CdnLocale } from '@/types/cdn-locale'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; +import { IMetafile } from '@/interfaces/i-metafile'; +import { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale'; +import { IMetafileFiles } from '@/interfaces/i-metafile-files'; +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { MetafileOptions } from '@/types/metafile-options'; +import { FilesMap } from '@/types/files-map'; + +export class MetafileData implements Omit { + public projectUrl: string; + + public baseLocale: CdnLocale; + + public locales: CdnLocale[]; + + public timestamp: number; + + public files: MetafileFile[]; + + public filesMap: FilesMap; + + constructor(options: MetafileOptions, params: MetafileParams) { + this.projectUrl = options.projectUrl; + this.timestamp = options.timestamp; + this.files = MetafileData.filesFactory(options.files, options.baseLocale, params); + this.filesMap = MetafileData.filesMapFactory(this.files); + this.locales = MetafileData.localesFactory(this.files); + this.baseLocale = this.locales.find((locale: CdnLocale) => locale.isBaseLocale) as CdnLocale; + } + + public static createEmpty(params: MetafileParams): MetafileData { + return new MetafileData( + { + projectUrl: '', + baseLocale: '', + timestamp: 0, + files: {}, + }, + params, + ); + } + + protected static filesFactory(files: IMetafileFiles, baseLocale: string, params: MetafileParams): MetafileFile[] { + return Object.keys(files).reduce( + (acc: MetafileFile[], cur: string) => { + const locales: MetafileLocale[] = files[cur].locales.map( + (locale: IMetafileFileLocale) => new MetafileLocale(locale, baseLocale), + ); + + acc.push( + new MetafileFile({ + ...files[cur], + id: cur, + locales, + baseUrl: params.baseUrl, + }), + ); + + return acc; + }, + [], + ); + } + + protected static filesMapFactory(files: MetafileFile[]): FilesMap { + return files.reduce( + (acc: FilesMap, cur: MetafileFile) => { + acc[cur.id] = cur; + + return acc; + }, + {}, + ); + } + + protected static localesFactory(files: MetafileFile[]): CdnLocale[] { + const locales: CdnLocale[] = files.reduce( + (acc: CdnLocale[], cur: MetafileFile) => { + acc.push( + ...cur.locales.map( + (locale: MetafileLocale): CdnLocale => locale.toCdnLocale(), + ), + ); + return acc; + }, + [], + ); + + return uniqBy(locales, (cdnLocale: CdnLocale) => cdnLocale.locale); + } +} diff --git a/src/cdn/metafile/metafile-file.ts b/src/cdn/metafile/metafile-file.ts new file mode 100644 index 0000000..9322890 --- /dev/null +++ b/src/cdn/metafile/metafile-file.ts @@ -0,0 +1,57 @@ +import { CdnFile } from '@/types/cdn-file'; +import { CdnFileLocale } from '@/types/cdn-file-locale'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; +import { IMetafileFile } from '@/interfaces/i-metafile-file'; +import { MetafileFileOptions } from '@/types/metafile-file-options'; + +export class MetafileFile implements Omit { + public id: string; + + public file: string; + + public path: string; + + public library: string; + + public module: string; + + public buildType: string; + + public timestamp: number; + + public productFlavors: string[]; + + public locales: MetafileLocale[]; + + protected baseUrl: string; + + constructor(options: MetafileFileOptions) { + this.id = options.id; + this.file = options.file; + this.path = options.path; + this.library = options.library; + this.module = options.module; + this.buildType = options.buildType; + this.timestamp = options.timestamp; + this.productFlavors = options.productFlavors; + this.locales = options.locales; + this.baseUrl = options.baseUrl; + } + + public toCdnFile(): CdnFile { + return { + id: this.id, + file: this.file, + path: this.path, + library: this.library, + module: this.module, + buildType: this.buildType, + productFlavors: this.productFlavors, + locales: this.locales.map((locale: MetafileLocale): CdnFileLocale => ({ + locale: locale.locale, + isBaseLocale: locale.isBaseLocale, + uri: `${this.baseUrl}${locale.uri}`, + })), + }; + } +} diff --git a/src/cdn/metafile/metafile-locale.ts b/src/cdn/metafile/metafile-locale.ts new file mode 100644 index 0000000..ccf296f --- /dev/null +++ b/src/cdn/metafile/metafile-locale.ts @@ -0,0 +1,67 @@ +import { CdnLocale } from '@/types/cdn-locale'; +import { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale'; + +export class MetafileLocale implements IMetafileFileLocale { + public language: string; + + public region: string; + + public script: string; + + public isRtl: boolean; + + public name: string; + + public localizedName: string; + + public uri: string; + + public timestamp: number; + + protected baseLocale: string; + + constructor(options: IMetafileFileLocale, baseLocale: string) { + this.language = options.language; + this.region = options.region; + this.script = options.script; + this.isRtl = options.isRtl; + this.name = options.name; + this.localizedName = options.localizedName; + this.uri = options.uri; + this.timestamp = options.timestamp; + this.baseLocale = baseLocale; + } + + get locale(): string { + if (this.language && this.region && this.script) { + return `${this.language}_${this.region}#${this.script}`; + } + + if (this.language && this.script) { + return `${this.language}#${this.script}`; + } + + if (this.language && this.region) { + return `${this.language}_${this.region}`; + } + + return this.language; + } + + get isBaseLocale(): boolean { + return this.locale === this.baseLocale; + } + + public toCdnLocale(): CdnLocale { + return { + locale: this.locale, + isBaseLocale: this.isBaseLocale, + language: this.language, + region: this.region, + script: this.script, + isRtl: this.isRtl, + name: this.name, + localizedName: this.localizedName, + }; + } +} diff --git a/src/cdn/metafile/metafile-params.ts b/src/cdn/metafile/metafile-params.ts new file mode 100644 index 0000000..951e5dc --- /dev/null +++ b/src/cdn/metafile/metafile-params.ts @@ -0,0 +1,51 @@ +import { IMetafileParams } from '@/interfaces/i-metafile-params'; + +export class MetafileParams implements IMetafileParams { + protected options: IMetafileParams; + + constructor(metafileUrl: string) { + this.options = MetafileParams.parseMetafileUrl(metafileUrl); + } + + get url(): string { + return this.options.url; + } + + get baseUrl(): string { + return this.options.baseUrl; + } + + get cdnId(): string { + return this.options.cdnId; + } + + get jsonPath(): string { + return this.options.jsonPath; + } + + protected static parseMetafileUrl(metafileUrl: string): IMetafileParams { + let url: URL; + + try { + url = new URL(metafileUrl); + } catch (e) { + throw new Error('Invalid param: "options.metafile" cannot be parsed as url.'); + } + + const matches: string[] | null = url.pathname.match(/^\/(.*?)\/(.*?)\.(v2.json|js|ts)$/); + + if (matches === null || matches.length !== 4) { + throw new Error('Invalid param: "options.metafile" contains invalid metafile url.'); + } + + const cdnId: string = matches[1]; + const tagId: string = matches[2]; + + return { + url: metafileUrl, + baseUrl: url.origin, + cdnId, + jsonPath: `/${cdnId}/${tagId}.v2.json`, + }; + } +} diff --git a/src/cdn/methods/cdn-base.ts b/src/cdn/methods/cdn-base.ts new file mode 100644 index 0000000..203aa9d --- /dev/null +++ b/src/cdn/methods/cdn-base.ts @@ -0,0 +1,9 @@ +import { Context } from '@/cdn/context/context'; + +export abstract class CdnBase { + protected context: Context; + + constructor(context: Context) { + this.context = context; + } +} diff --git a/src/cdn/methods/cdn-cache.ts b/src/cdn/methods/cdn-cache.ts new file mode 100644 index 0000000..31b4b09 --- /dev/null +++ b/src/cdn/methods/cdn-cache.ts @@ -0,0 +1,7 @@ +import { CdnBase } from '@/cdn/methods/cdn-base'; + +export class CdnCache extends CdnBase { + public flush = (): void => { + this.context.cache.flush(); + }; +} diff --git a/src/cdn/methods/cdn-metafile-files.ts b/src/cdn/methods/cdn-metafile-files.ts new file mode 100644 index 0000000..eacfefd --- /dev/null +++ b/src/cdn/methods/cdn-metafile-files.ts @@ -0,0 +1,63 @@ +import filter from 'lodash/filter'; +import find from 'lodash/find'; +import isFunction from 'lodash/isFunction'; +import isPlainObject from 'lodash/isPlainObject'; +import matches from 'lodash/matches'; +import { CdnFile } from '@/types/cdn-file'; +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { CdnBase } from '@/cdn/methods/cdn-base'; +import { CdnFilesSearchOptions } from '@/types/cdn-files-search-options'; + +export class CdnMetafileFiles extends CdnBase { + public list = (): CdnFile[] => CdnMetafileFiles.transformFiles(this.context.metafile.data.files); + + public filter = (options: CdnFilesSearchOptions): CdnFile[] => { + if (!options) { + throw new Error('Invalid param: missing required "options" parameter.'); + } + + if (!isFunction(options) && !(isPlainObject(options))) { + throw new Error('Invalid param: "options" must be function or object.'); + } + + const files: CdnFile[] = CdnMetafileFiles.transformFiles(this.context.metafile.data.files); + + if (isFunction(options)) { + return files.filter(options); + } + + return filter(files, matches(options)); + }; + + public find = (options: CdnFilesSearchOptions): CdnFile | undefined => { + if (!options) { + throw new Error('Invalid param: missing required "options" parameter.'); + } + + if (!isFunction(options) && !isPlainObject(options)) { + throw new Error('Invalid param: "options" must be function or object.'); + } + + const files: CdnFile[] = CdnMetafileFiles.transformFiles(this.context.metafile.data.files); + + if (isFunction(options)) { + return files.find(options); + } + + return find(files, matches(options)); + }; + + public first = (): CdnFile => { + if (this.context.metafile.data.files.length === 0) { + throw new Error('File is missing in downloaded metafile.'); + } + + const files: CdnFile[] = CdnMetafileFiles.transformFiles(this.context.metafile.data.files); + + return files[0]; + }; + + protected static transformFiles = (files: MetafileFile[]): CdnFile[] => files.map( + (file: MetafileFile) => file.toCdnFile(), + ); +} diff --git a/src/cdn/methods/cdn-metafile.ts b/src/cdn/methods/cdn-metafile.ts new file mode 100644 index 0000000..3efb5d6 --- /dev/null +++ b/src/cdn/methods/cdn-metafile.ts @@ -0,0 +1,53 @@ +import { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { MetafileParams } from '@/cdn/metafile/metafile-params'; +import { CdnClientOptions } from '@/types/cdn-client-options'; +import { Context } from '@/cdn/context/context'; +import { MetafileData } from '@/cdn/metafile/metafile-data'; +import { CdnBase } from '@/cdn/methods/cdn-base'; +import { CdnMetafileFiles } from '@/cdn/methods/cdn-metafile-files'; +import { CdnLocalesOptions } from '@/types/cdn-locales-options'; +import { IMetafile } from '@/interfaces/i-metafile'; +import { CdnLocale } from '@/types/cdn-locale'; + +export class CdnMetafile extends CdnBase { + public files: CdnMetafileFiles; + + constructor(context: Context) { + super(context); + + this.files = new CdnMetafileFiles(context); + } + + get projectUrl(): string { + return this.context.metafile.data.projectUrl; + } + + get baseLocale(): CdnLocale { + return this.context.metafile.data.baseLocale; + } + + get url(): string { + return this.context.metafile.params.url; + } + + public locales = (options?: CdnLocalesOptions): CdnLocale[] => { + const { excludeBaseLocale }: CdnLocalesOptions = options || {}; + const { locales }: MetafileData = this.context.metafile.data; + + return excludeBaseLocale + ? locales.filter((cdnLocale: CdnLocale): boolean => !cdnLocale.isBaseLocale) + : locales; + }; + + public refresh = async (config?: AxiosRequestConfig): Promise => { + const response: AxiosResponse = await this.context.api.fetchMetafile(config); + + this.context.metafile.setMetafile(response.data); + }; + + public switch = async (options: CdnClientOptions, config?: AxiosRequestConfig): Promise => { + this.context.metafile.params = new MetafileParams(options.metafile); + + await this.refresh(config); + }; +} diff --git a/src/cdn/request/locales-map.ts b/src/cdn/request/locales-map.ts new file mode 100644 index 0000000..6872ebf --- /dev/null +++ b/src/cdn/request/locales-map.ts @@ -0,0 +1,14 @@ +import { Context } from '@/cdn/context/context'; +import { LocalesMapData } from '@/types/locales-map-data'; +import { LocalesMapOptions } from '@/types/locales-map-options'; + +export class LocalesMap { + public data: LocalesMapData; + + protected context: Context; + + constructor(options: LocalesMapOptions) { + this.context = options.context; + this.data = options.data || {}; + } +} diff --git a/src/cdn/request/request-builder.ts b/src/cdn/request/request-builder.ts new file mode 100644 index 0000000..0014777 --- /dev/null +++ b/src/cdn/request/request-builder.ts @@ -0,0 +1,152 @@ +import isPlainObject from 'lodash/isPlainObject'; +import isUndefined from 'lodash/isUndefined'; +import isString from 'lodash/isString'; +import isArray from 'lodash/isArray'; +import { CdnFile } from '@/types/cdn-file'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; +import { LocalesMap } from '@/cdn/request/locales-map'; +import { Context } from '@/cdn/context/context'; +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { IRequestBuilder } from '@/interfaces/i-request-builder'; +import { Request } from '@/cdn/request/request'; + +export class RequestBuilder implements IRequestBuilder { + protected context: Context; + + protected request: Request; + + constructor(context: Context) { + this.context = context; + this.request = new Request(this.context); + } + + public addFiles(files?: (CdnFile | string)[] | CdnFile | string): RequestBuilder { + if (!(isPlainObject(files) || isString(files) || isUndefined(files) || isArray(files))) { + throw new Error('Invalid param: "request.files" must be object, array, string or undefined.'); + } + + if (isArray(files)) { + files.forEach((i: CdnFile | string): void => { + if (!(isPlainObject(i) || isString(i))) { + throw new Error('Invalid param: array "request.files" must contain objects or strings.'); + } + }); + } + + if (isString(files)) { + this.request.hasSingleFileResponse = true; + + const file: MetafileFile | undefined = this.context.metafile.data.files.find( + (i: MetafileFile): boolean => i.id === files, + ); + + if (!(file instanceof MetafileFile)) { + throw new Error(`File not found: "${files}".`); + } + + this.request.files = [file]; + } else if (isUndefined(files)) { + this.request.files = [...this.context.metafile.data.files]; + } else if (isArray(files)) { + this.request.files = files.map((file: CdnFile | string): MetafileFile => { + let metafileFile: MetafileFile; + + if (isString(file)) { + const foundFile: MetafileFile | undefined = this.context.metafile.data.files.find( + (i: MetafileFile): boolean => i.id === file, + ); + + if (isUndefined(foundFile)) { + throw new Error(`File not found: "${file}".`); + } + + metafileFile = foundFile; + } else { + const foundFile: MetafileFile | undefined = this.context.metafile.data.files.find( + (i: MetafileFile): boolean => i.id === file.id, + ); + + if (isUndefined(foundFile)) { + throw new Error(`File not found: "${file.id}".`); + } + + metafileFile = foundFile; + } + + return metafileFile; + }); + } else if (isPlainObject(files)) { + this.request.hasSingleFileResponse = true; + + const foundFile: MetafileFile | undefined = this.context.metafile.data.files.find( + (i: MetafileFile): boolean => i.id === files.id, + ); + + if (isUndefined(foundFile)) { + throw new Error(`File not found: "${files.id}".`); + } + + this.request.files = [foundFile]; + } + + return this; + } + + public addLocales(locales?: string[] | string, excludeBaseLocale?: boolean): RequestBuilder { + if (!(isString(locales) || isUndefined(locales) || isArray(locales))) { + throw new Error('Invalid param: "request.locales" must be array, string or undefined.'); + } + + if (isArray(locales)) { + locales.forEach((i: MetafileFile | string): void => { + if (!isString(i)) { + throw new Error('Invalid param: array "request.locales" must contain strings.'); + } + }); + } + + if (isString(locales)) { + this.request.hasSingleLocaleResponse = true; + this.request.files.reduce( + (acc: LocalesMap, cur: MetafileFile) => { + acc.data[cur.id] = cur.locales.filter( + (metafileLocale: MetafileLocale): boolean => metafileLocale.locale === locales, + ); + + return acc; + }, + this.request.localesMap, + ); + } else if (isUndefined(locales)) { + this.request.files.reduce( + (acc: LocalesMap, cur: MetafileFile) => { + acc.data[cur.id] = excludeBaseLocale + ? cur.locales.filter((metafileLocale: MetafileLocale): boolean => !metafileLocale.isBaseLocale) + : cur.locales; + + return acc; + }, + this.request.localesMap, + ); + } else if (isArray(locales)) { + this.request.files.reduce( + (acc: LocalesMap, cur: MetafileFile) => { + acc.data[cur.id] = cur.locales.filter( + (metafileLocale: MetafileLocale) => locales.includes(metafileLocale.locale), + ); + + return acc; + }, + this.request.localesMap, + ); + } + + return this; + } + + public getCdnRequest(): Request { + const result: Request = this.request; + this.request = new Request(this.context); + return result; + } +} diff --git a/src/cdn/request/request.ts b/src/cdn/request/request.ts new file mode 100644 index 0000000..59b04d0 --- /dev/null +++ b/src/cdn/request/request.ts @@ -0,0 +1,54 @@ +import { AxiosResponse } from 'axios'; +import { Context } from '@/cdn/context/context'; +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; +import { LocalesMap } from '@/cdn/request/locales-map'; +import { CdnResponse } from '@/types/cdn-response'; + +export class Request { + public files: MetafileFile[]; + + public localesMap: LocalesMap; + + public hasSingleFileResponse: boolean; + + public hasSingleLocaleResponse: boolean; + + protected context: Context; + + constructor(context: Context) { + this.files = []; + this.localesMap = new LocalesMap({ context }); + this.hasSingleFileResponse = false; + this.hasSingleLocaleResponse = false; + this.context = context; + } + + public async execute(): Promise { + return this.context.responseFactory.createCdnResponse({ + responses: await Promise.all(this.getPromises()), + localesMap: this.localesMap, + hasSingleFileResponse: this.hasSingleFileResponse, + hasSingleLocaleResponse: this.hasSingleLocaleResponse, + }); + } + + protected getPromises(): Promise>[] { + return this.files.reduce( + (acc: Promise>[], cur: MetafileFile) => { + if (this.localesMap.data[cur.id]) { + acc.push( + ...this.localesMap.data[cur.id].map( + (metafileLocale: MetafileLocale) => this.context.api.fetchLocale({ + metafileFile: cur, + metafileLocale, + }), + ), + ); + } + return acc; + }, + [], + ); + } +} diff --git a/src/cdn/response/response-factory.ts b/src/cdn/response/response-factory.ts new file mode 100644 index 0000000..6639b4e --- /dev/null +++ b/src/cdn/response/response-factory.ts @@ -0,0 +1,87 @@ +import { AxiosResponse } from 'axios'; +import { Context } from '@/cdn/context/context'; +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; +import { ResponseFactoryOptions } from '@/types/response-factory-options'; +import { CacheStoreLocalesRequest } from '@/types/cache-store-locales-request'; +import { CdnResponse } from '@/types/cdn-response'; + +export class ResponseFactory { + protected context: Context; + + constructor(context: Context) { + this.context = context; + } + + public createCdnResponse(options: ResponseFactoryOptions): CdnResponse { + const { responses, hasSingleFileResponse, hasSingleLocaleResponse }: ResponseFactoryOptions = options; + + if (responses.length === 0) { + return {}; + } + + this.cacheResponses(responses); + + return hasSingleFileResponse && hasSingleLocaleResponse + ? responses[0].data + : ResponseFactory.transformResponsesToOutput(options); + } + + protected cacheResponses(responses: AxiosResponse[]): void { + responses.forEach((response: AxiosResponse): void => { + const { + metafileFile, + metafileLocale, + }: Partial = ResponseFactory.extractReference(response); + + if (metafileFile && metafileLocale) { + this.context.cache.setIfMissed({ metafileFile, metafileLocale, data: response.data }); + } + }); + } + + protected static transformResponsesToOutput(options: ResponseFactoryOptions): CdnResponse { + const { responses, hasSingleFileResponse }: ResponseFactoryOptions = options; + + return responses.reduce( + (acc: CdnResponse, cur: AxiosResponse) => { + const { + metafileFile, + metafileLocale, + }: Partial = ResponseFactory.extractReference(cur); + + if (metafileFile && metafileLocale) { + if (hasSingleFileResponse) { + // @ts-expect-error fix output type + acc[metafileLocale.locale] = cur.data; + } else { + // @ts-expect-error fix output type + if (!acc[metafileFile.id]) { + // @ts-expect-error fix output type + acc[metafileFile.id] = {}; + } + + // @ts-expect-error fix output type + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + acc[metafileFile.id][metafileLocale.locale] = cur.data; + } + } + + return acc; + }, + {}, + ); + } + + protected static extractReference(response: AxiosResponse): Partial { + const metafileFile: MetafileFile | undefined = response.config.reference?.metafileFile; + const metafileLocale: MetafileLocale | undefined = response.config.reference?.metafileLocale; + const { data }: AxiosResponse = response; + + return { + metafileFile, + metafileLocale, + data, + }; + } +} diff --git a/src/interfaces/i-cache-adapter.ts b/src/interfaces/i-cache-adapter.ts new file mode 100644 index 0000000..22c2cca --- /dev/null +++ b/src/interfaces/i-cache-adapter.ts @@ -0,0 +1,6 @@ +export interface ICacheAdapter { + has: (key: K) => boolean, + get: (key: K) => V | undefined, + set: (key: K, value: V) => void, + flush: () => void, +} diff --git a/src/interfaces/i-http-adapter.ts b/src/interfaces/i-http-adapter.ts new file mode 100644 index 0000000..4453034 --- /dev/null +++ b/src/interfaces/i-http-adapter.ts @@ -0,0 +1,5 @@ +import { AxiosRequestConfig } from 'axios'; + +export interface IHttpAdapter { + get(url: string, config?: AxiosRequestConfig): Promise; +} diff --git a/src/interfaces/i-locales-cache-item.ts b/src/interfaces/i-locales-cache-item.ts new file mode 100644 index 0000000..13dd952 --- /dev/null +++ b/src/interfaces/i-locales-cache-item.ts @@ -0,0 +1,7 @@ +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; + +export interface ILocalesCacheItem { + metafileFile: MetafileFile; + metafileLocale: MetafileLocale; +} diff --git a/src/interfaces/i-metafile-file-locale.ts b/src/interfaces/i-metafile-file-locale.ts new file mode 100644 index 0000000..86f9d12 --- /dev/null +++ b/src/interfaces/i-metafile-file-locale.ts @@ -0,0 +1,10 @@ +export interface IMetafileFileLocale { + language: string; + region: string; + script: string; + isRtl: boolean; + name: string; + localizedName: string; + uri: string; + timestamp: number; +} diff --git a/src/interfaces/i-metafile-file.ts b/src/interfaces/i-metafile-file.ts new file mode 100644 index 0000000..d92a00d --- /dev/null +++ b/src/interfaces/i-metafile-file.ts @@ -0,0 +1,12 @@ +import { IMetafileFileLocale } from '@/interfaces/i-metafile-file-locale'; + +export interface IMetafileFile { + file: string; + path: string; + library: string; + module: string; + buildType: string; + timestamp: number; + productFlavors: string[]; + locales: IMetafileFileLocale[]; +} diff --git a/src/interfaces/i-metafile-files.ts b/src/interfaces/i-metafile-files.ts new file mode 100644 index 0000000..175c62f --- /dev/null +++ b/src/interfaces/i-metafile-files.ts @@ -0,0 +1,5 @@ +import { IMetafileFile } from '@/interfaces/i-metafile-file'; + +export interface IMetafileFiles { + [id: string]: IMetafileFile; +} diff --git a/src/interfaces/i-metafile-params.ts b/src/interfaces/i-metafile-params.ts new file mode 100644 index 0000000..b2aba9d --- /dev/null +++ b/src/interfaces/i-metafile-params.ts @@ -0,0 +1,6 @@ +export interface IMetafileParams { + url: string; + baseUrl: string; + cdnId: string; + jsonPath: string; +} diff --git a/src/interfaces/i-metafile.ts b/src/interfaces/i-metafile.ts new file mode 100644 index 0000000..5781b36 --- /dev/null +++ b/src/interfaces/i-metafile.ts @@ -0,0 +1,8 @@ +import { IMetafileFiles } from '@/interfaces/i-metafile-files'; + +export interface IMetafile { + projectUrl: string; + baseLocale: string; + timestamp: number; + files: IMetafileFiles; +} diff --git a/src/interfaces/i-request-builder.ts b/src/interfaces/i-request-builder.ts new file mode 100644 index 0000000..d2af31a --- /dev/null +++ b/src/interfaces/i-request-builder.ts @@ -0,0 +1,10 @@ +import { Request } from '@/cdn/request/request'; +import { CdnFile } from '@/types/cdn-file'; + +export interface IRequestBuilder { + addFiles(request?: (CdnFile | string)[] | CdnFile | string): IRequestBuilder; + + addLocales(request?: string[] | string, excludeBaseLocale?: boolean): IRequestBuilder; + + getCdnRequest(): Request; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..0d22b1f --- /dev/null +++ b/src/main.ts @@ -0,0 +1,68 @@ +/** + * DO NOT EDIT EXPORTS IN THIS FILE. + * EXPORTS ARE AUTO-GENERATED BASED ON INSTRUCTIONS IN `@reexport` COMMENTS. + * + * Use these scripts: + * - npm run main-ts:build + * - npm run main-ts:watch + * + * Please note that `npm run dev` script already contains `run main-ts:watch`. + * + * Available variables for reexport configuration: + * https://github.com/ViliamKopecky/reexport#available-variables + */ + +// @reexport ./**/*[!*.d].ts:export * from '@/$TS_PATH'; +export * from '@/cdn/api/api'; +export * from '@/cdn/cache/locales-cache'; +export * from '@/cdn/cache/memory-cache-adapter'; +export * from '@/cdn/cdn-client'; +export * from '@/cdn/context/context'; +export * from '@/cdn/context/metafile-context'; +export * from '@/cdn/http/axios-http-adapter'; +export * from '@/cdn/metafile/metafile-data'; +export * from '@/cdn/metafile/metafile-file'; +export * from '@/cdn/metafile/metafile-locale'; +export * from '@/cdn/metafile/metafile-params'; +export * from '@/cdn/methods/cdn-base'; +export * from '@/cdn/methods/cdn-cache'; +export * from '@/cdn/methods/cdn-metafile-files'; +export * from '@/cdn/methods/cdn-metafile'; +export * from '@/cdn/request/locales-map'; +export * from '@/cdn/request/request-builder'; +export * from '@/cdn/request/request'; +export * from '@/cdn/response/response-factory'; +export * from '@/interfaces/i-cache-adapter'; +export * from '@/interfaces/i-http-adapter'; +export * from '@/interfaces/i-locales-cache-item'; +export * from '@/interfaces/i-metafile-file-locale'; +export * from '@/interfaces/i-metafile-file'; +export * from '@/interfaces/i-metafile-files'; +export * from '@/interfaces/i-metafile-params'; +export * from '@/interfaces/i-metafile'; +export * from '@/interfaces/i-request-builder'; +export * from '@/types/api-locale-request'; +export * from '@/types/cache-get-locales-request'; +export * from '@/types/cache-has-locales-request'; +export * from '@/types/cache-key-metafile-options'; +export * from '@/types/cache-store-locales-request'; +export * from '@/types/cdn-client-options'; +export * from '@/types/cdn-fetch-options'; +export * from '@/types/cdn-file-locale'; +export * from '@/types/cdn-file'; +export * from '@/types/cdn-files-search-options'; +export * from '@/types/cdn-locale'; +export * from '@/types/cdn-locales-options'; +export * from '@/types/cdn-response'; +export * from '@/types/context-options'; +export * from '@/types/exclude-base-locale'; +export * from '@/types/file-response'; +export * from '@/types/files-map'; +export * from '@/types/json-response'; +export * from '@/types/locale-response'; +export * from '@/types/locales-map-data'; +export * from '@/types/locales-map-options'; +export * from '@/types/metafile-file-options'; +export * from '@/types/metafile-options'; +export * from '@/types/response-factory-options'; +// @end-reexport diff --git a/src/shims-axios.d.ts b/src/shims-axios.d.ts new file mode 100644 index 0000000..ae81a0b --- /dev/null +++ b/src/shims-axios.d.ts @@ -0,0 +1,12 @@ +import 'axios'; +import { MetafileFile } from '@/cdn/metafile/metafile-file'; +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; + +declare module 'axios' { + export interface AxiosRequestConfig { + reference?: { + metafileFile?: MetafileFile, + metafileLocale?: MetafileLocale, + }, + } +} diff --git a/src/types/api-locale-request.ts b/src/types/api-locale-request.ts new file mode 100644 index 0000000..e1a0d25 --- /dev/null +++ b/src/types/api-locale-request.ts @@ -0,0 +1,3 @@ +import { ILocalesCacheItem } from '@/interfaces/i-locales-cache-item'; + +export type ApiLocaleRequest = ILocalesCacheItem; diff --git a/src/types/cache-get-locales-request.ts b/src/types/cache-get-locales-request.ts new file mode 100644 index 0000000..eeff029 --- /dev/null +++ b/src/types/cache-get-locales-request.ts @@ -0,0 +1,3 @@ +import { ILocalesCacheItem } from '@/interfaces/i-locales-cache-item'; + +export type CacheGetLocalesRequest = ILocalesCacheItem; diff --git a/src/types/cache-has-locales-request.ts b/src/types/cache-has-locales-request.ts new file mode 100644 index 0000000..368591c --- /dev/null +++ b/src/types/cache-has-locales-request.ts @@ -0,0 +1,3 @@ +import { ILocalesCacheItem } from '@/interfaces/i-locales-cache-item'; + +export type CacheHasLocalesRequest = ILocalesCacheItem; diff --git a/src/types/cache-key-metafile-options.ts b/src/types/cache-key-metafile-options.ts new file mode 100644 index 0000000..863aad0 --- /dev/null +++ b/src/types/cache-key-metafile-options.ts @@ -0,0 +1,3 @@ +import { ILocalesCacheItem } from '@/interfaces/i-locales-cache-item'; + +export type CacheKeyMetafileOptions = ILocalesCacheItem; diff --git a/src/types/cache-store-locales-request.ts b/src/types/cache-store-locales-request.ts new file mode 100644 index 0000000..e3a7831 --- /dev/null +++ b/src/types/cache-store-locales-request.ts @@ -0,0 +1,5 @@ +import { ILocalesCacheItem } from '@/interfaces/i-locales-cache-item'; + +export type CacheStoreLocalesRequest = ILocalesCacheItem & { + data: object | string +}; diff --git a/src/types/cdn-client-options.ts b/src/types/cdn-client-options.ts new file mode 100644 index 0000000..02b745a --- /dev/null +++ b/src/types/cdn-client-options.ts @@ -0,0 +1,8 @@ +// #region typedef +export type CdnClientOptions = { + /** + * Project metafile URL. + */ + metafile: string; +}; +// #endregion typedef diff --git a/src/types/cdn-fetch-options.ts b/src/types/cdn-fetch-options.ts new file mode 100644 index 0000000..25ce3a0 --- /dev/null +++ b/src/types/cdn-fetch-options.ts @@ -0,0 +1,24 @@ +import { CdnFile } from '@/types/cdn-file'; + +// #region typedef +export type CdnFetchOptions = { + /** + * Select single or multiple files to fetch from the CDN. + * + * Default: all files in the metafile. + */ + files?: (CdnFile | string)[] | CdnFile | string; + + /** + * Select single or multiple locales to fetch from the CDN. + * + * Default: all locales in the metafile. + */ + locales?: string[] | string, + + /** + * Exclude the base locale from the list of locales to fetch. + */ + excludeBaseLocale?: boolean; +}; +// #endregion typedef diff --git a/src/types/cdn-file-locale.ts b/src/types/cdn-file-locale.ts new file mode 100644 index 0000000..4632e88 --- /dev/null +++ b/src/types/cdn-file-locale.ts @@ -0,0 +1,18 @@ +// #region typedef +export type CdnFileLocale = { + /** + * Locale code. + */ + locale: string; + + /** + * Boolean indicating if this is the base locale. + */ + isBaseLocale: boolean; + + /** + * File URI. + */ + uri: string; +}; +// #endregion typedef diff --git a/src/types/cdn-file.ts b/src/types/cdn-file.ts new file mode 100644 index 0000000..1469aac --- /dev/null +++ b/src/types/cdn-file.ts @@ -0,0 +1,45 @@ +import { CdnFileLocale } from '@/types/cdn-file-locale'; + +// #region typedef +export type CdnFile = { + /** + * File ID. + */ + id: string; + + /** + * File name. + */ + file: string; + + /** + * File path. + */ + path: string; + + /** + * File library. + */ + library: string; + + /** + * File module. + */ + module: string; + + /** + * File build type. + */ + buildType: string; + + /** + * File product flavors. + */ + productFlavors: string[]; + + /** + * File locales. + */ + locales: CdnFileLocale[]; +}; +// #endregion typedef diff --git a/src/types/cdn-files-search-options.ts b/src/types/cdn-files-search-options.ts new file mode 100644 index 0000000..02f0bc8 --- /dev/null +++ b/src/types/cdn-files-search-options.ts @@ -0,0 +1,15 @@ +import { CdnFile } from '@/types/cdn-file'; + +// #region typedef +export type CdnFilesSearchOptions = + | ((file: CdnFile, index?: number, array?: CdnFile[]) => boolean) + | { + id?: string; + file?: string; + path?: string; + library?: string; + module?: string; + buildType?: string; + productFlavors?: string[]; + }; +// #endregion typedef diff --git a/src/types/cdn-locale.ts b/src/types/cdn-locale.ts new file mode 100644 index 0000000..f17db09 --- /dev/null +++ b/src/types/cdn-locale.ts @@ -0,0 +1,43 @@ +// #region typedef +export type CdnLocale = { + /** + * Locale code. + */ + locale: string; + + /** + * Boolean indicating if this is the base locale. + */ + isBaseLocale: boolean; + + /** + * Language code. + */ + language: string; + + /** + * Region code. + */ + region?: string; + + /** + * Script code. + */ + script?: string; + + /** + * Boolean indicating if the locale is right-to-left. + */ + isRtl: boolean; + + /** + * Locale name. + */ + name: string; + + /** + * Localized locale name. + */ + localizedName: string; +}; +// #endregion typedef diff --git a/src/types/cdn-locales-options.ts b/src/types/cdn-locales-options.ts new file mode 100644 index 0000000..8140366 --- /dev/null +++ b/src/types/cdn-locales-options.ts @@ -0,0 +1,6 @@ +export type CdnLocalesOptions = { + /** + * Exclude the base locale from the list of locales. + */ + excludeBaseLocale?: boolean; +}; diff --git a/src/types/cdn-response.ts b/src/types/cdn-response.ts new file mode 100644 index 0000000..d554b58 --- /dev/null +++ b/src/types/cdn-response.ts @@ -0,0 +1,26 @@ +export type CdnResponse = + /** + * Map of file IDs with locales map as value. + */ + | { + [fileId: string]: { + /** + * Map of locales with file content as value. + */ + [locale: string]: object | string; + }; + } + /** + * Map of locales with file content as value. + */ + | { + [locale: string]: object | string; + } + /** + * File content. + */ + | object + /** + * File content as string for non-JSON files. + */ + | string; diff --git a/src/types/context-options.ts b/src/types/context-options.ts new file mode 100644 index 0000000..9b327db --- /dev/null +++ b/src/types/context-options.ts @@ -0,0 +1,9 @@ +import { CdnClient } from '@/cdn/cdn-client'; +import { MetafileContext } from '@/cdn/context/metafile-context'; +import { IHttpAdapter } from '@/interfaces/i-http-adapter'; + +export type ContextOptions = { + metafileContext: MetafileContext; + cdn: CdnClient; + client: IHttpAdapter; +}; diff --git a/src/types/exclude-base-locale.ts b/src/types/exclude-base-locale.ts new file mode 100644 index 0000000..051c153 --- /dev/null +++ b/src/types/exclude-base-locale.ts @@ -0,0 +1,3 @@ +export type ExcludeBaseLocale = { + excludeBaseLocale?: boolean; +}; diff --git a/src/types/file-response.ts b/src/types/file-response.ts new file mode 100644 index 0000000..eb8ba20 --- /dev/null +++ b/src/types/file-response.ts @@ -0,0 +1,5 @@ +import { LocaleResponse } from '@/types/locale-response'; + +export type FileResponse = { + [fileId: string]: LocaleResponse +}; diff --git a/src/types/files-map.ts b/src/types/files-map.ts new file mode 100644 index 0000000..3f00cd5 --- /dev/null +++ b/src/types/files-map.ts @@ -0,0 +1,5 @@ +import { MetafileFile } from '@/cdn/metafile/metafile-file'; + +export type FilesMap = { + [id: string]: MetafileFile; +}; diff --git a/src/types/json-response.ts b/src/types/json-response.ts new file mode 100644 index 0000000..1ff7738 --- /dev/null +++ b/src/types/json-response.ts @@ -0,0 +1,3 @@ +export type JsonResponse = { + [key: string]: Record +}; diff --git a/src/types/locale-response.ts b/src/types/locale-response.ts new file mode 100644 index 0000000..139fbe6 --- /dev/null +++ b/src/types/locale-response.ts @@ -0,0 +1,5 @@ +import { JsonResponse } from '@/types/json-response'; + +export type LocaleResponse = { + [locale: string]: JsonResponse +}; diff --git a/src/types/locales-map-data.ts b/src/types/locales-map-data.ts new file mode 100644 index 0000000..4b902d1 --- /dev/null +++ b/src/types/locales-map-data.ts @@ -0,0 +1,5 @@ +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; + +export type LocalesMapData = { + [key: string]: MetafileLocale[] +}; diff --git a/src/types/locales-map-options.ts b/src/types/locales-map-options.ts new file mode 100644 index 0000000..e5dd719 --- /dev/null +++ b/src/types/locales-map-options.ts @@ -0,0 +1,8 @@ +import { Context } from '@/cdn/context/context'; + +import { LocalesMapData } from '@/types/locales-map-data'; + +export type LocalesMapOptions = { + context: Context, + data?: LocalesMapData +}; diff --git a/src/types/metafile-file-options.ts b/src/types/metafile-file-options.ts new file mode 100644 index 0000000..88781ae --- /dev/null +++ b/src/types/metafile-file-options.ts @@ -0,0 +1,8 @@ +import { MetafileLocale } from '@/cdn/metafile/metafile-locale'; +import { IMetafileFile } from '@/interfaces/i-metafile-file'; + +export type MetafileFileOptions = Omit & { + id: string; + locales: MetafileLocale[]; + baseUrl: string; +}; diff --git a/src/types/metafile-options.ts b/src/types/metafile-options.ts new file mode 100644 index 0000000..8d4deb1 --- /dev/null +++ b/src/types/metafile-options.ts @@ -0,0 +1,3 @@ +import { IMetafile } from '@/interfaces/i-metafile'; + +export type MetafileOptions = IMetafile; diff --git a/src/types/response-factory-options.ts b/src/types/response-factory-options.ts new file mode 100644 index 0000000..fa18021 --- /dev/null +++ b/src/types/response-factory-options.ts @@ -0,0 +1,10 @@ +import { AxiosResponse } from 'axios'; +import { LocalesMap } from '@/cdn/request/locales-map'; +import { CdnResponse } from '@/types/cdn-response'; + +export type ResponseFactoryOptions = { + responses: AxiosResponse[]; + localesMap: LocalesMap; + hasSingleFileResponse: boolean; + hasSingleLocaleResponse: boolean; +}; diff --git a/tests/cdn-files-types.spec.ts b/tests/cdn-files-types.spec.ts new file mode 100644 index 0000000..2300123 --- /dev/null +++ b/tests/cdn-files-types.spec.ts @@ -0,0 +1,269 @@ +import { + describe, test, expect, beforeEach, +} from 'vitest'; +import { fileTypesMetafile } from '@tests/fixtures'; +import { CdnClient } from '@/main'; + +let cdn: CdnClient; + +describe('File types', (): void => { + beforeEach(async (): Promise => { + fileTypesMetafile.mockAxios(); + + cdn = await CdnClient.create({ + metafile: fileTypesMetafile.url.metafile, + }); + }); + + test('JSON file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file01-json'], + }), + ).toStrictEqual({ + 'file01-json': { + en: fileTypesMetafile.serverResponses.file01.en, + es: fileTypesMetafile.serverResponses.file01.es, + fr: fileTypesMetafile.serverResponses.file01.fr, + }, + }); + }); + + test('JSON5 file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file02-json5'], + }), + ).toStrictEqual({ + 'file02-json5': { + en: fileTypesMetafile.serverResponses.file02.en, + es: fileTypesMetafile.serverResponses.file02.es, + fr: fileTypesMetafile.serverResponses.file02.fr, + }, + }); + }); + + test('NEON file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file03-neon'], + }), + ).toStrictEqual({ + 'file03-neon': { + en: fileTypesMetafile.serverResponses.file03.en, + es: fileTypesMetafile.serverResponses.file03.es, + fr: fileTypesMetafile.serverResponses.file03.fr, + }, + }); + }); + + test('YAML file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file04-yaml'], + }), + ).toStrictEqual({ + 'file04-yaml': { + en: fileTypesMetafile.serverResponses.file04.en, + es: fileTypesMetafile.serverResponses.file04.es, + fr: fileTypesMetafile.serverResponses.file04.fr, + }, + }); + }); + + test('XML file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file05-xml'], + }), + ).toStrictEqual({ + 'file05-xml': { + en: fileTypesMetafile.serverResponses.file05.en, + es: fileTypesMetafile.serverResponses.file05.es, + fr: fileTypesMetafile.serverResponses.file05.fr, + }, + }); + }); + + test('SRT file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file06-srt'], + }), + ).toStrictEqual({ + 'file06-srt': { + en: fileTypesMetafile.serverResponses.file06.en, + es: fileTypesMetafile.serverResponses.file06.es, + fr: fileTypesMetafile.serverResponses.file06.fr, + }, + }); + }); + + test('INI file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file07-ini'], + }), + ).toStrictEqual({ + 'file07-ini': { + en: fileTypesMetafile.serverResponses.file07.en, + es: fileTypesMetafile.serverResponses.file07.es, + fr: fileTypesMetafile.serverResponses.file07.fr, + }, + }); + }); + + test('strings file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file08-strings'], + }), + ).toStrictEqual({ + 'file08-strings': { + en: fileTypesMetafile.serverResponses.file08.en, + es: fileTypesMetafile.serverResponses.file08.es, + fr: fileTypesMetafile.serverResponses.file08.fr, + }, + }); + }); + + test('TOML file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file09-toml'], + }), + ).toStrictEqual({ + 'file09-toml': { + en: fileTypesMetafile.serverResponses.file09.en, + es: fileTypesMetafile.serverResponses.file09.es, + fr: fileTypesMetafile.serverResponses.file09.fr, + }, + }); + }); + + test('RESX file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file10-resx'], + }), + ).toStrictEqual({ + 'file10-resx': { + en: fileTypesMetafile.serverResponses.file10.en, + es: fileTypesMetafile.serverResponses.file10.es, + fr: fileTypesMetafile.serverResponses.file10.fr, + }, + }); + }); + + test('XLIFF file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file11-xliff'], + }), + ).toStrictEqual({ + 'file11-xliff': { + en: fileTypesMetafile.serverResponses.file11.en, + es: fileTypesMetafile.serverResponses.file11.es, + fr: fileTypesMetafile.serverResponses.file11.fr, + }, + }); + }); + + test('properties file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file12-properties'], + }), + ).toStrictEqual({ + 'file12-properties': { + en: fileTypesMetafile.serverResponses.file12.en, + es: fileTypesMetafile.serverResponses.file12.es, + fr: fileTypesMetafile.serverResponses.file12.fr, + }, + }); + }); + + test('CSV file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file13-csv'], + }), + ).toStrictEqual({ + 'file13-csv': { + en: fileTypesMetafile.serverResponses.file13.en, + es: fileTypesMetafile.serverResponses.file13.es, + fr: fileTypesMetafile.serverResponses.file13.fr, + }, + }); + }); + + test('QT-TS file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file14-ts'], + }), + ).toStrictEqual({ + 'file14-ts': { + en: fileTypesMetafile.serverResponses.file14.en, + es: fileTypesMetafile.serverResponses.file14.es, + fr: fileTypesMetafile.serverResponses.file14.fr, + }, + }); + }); + + test('JS file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file15-js'], + }), + ).toStrictEqual({ + 'file15-js': { + en: fileTypesMetafile.serverResponses.file15.en, + es: fileTypesMetafile.serverResponses.file15.es, + fr: fileTypesMetafile.serverResponses.file15.fr, + }, + }); + }); + + test('PHP file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file16-php'], + }), + ).toStrictEqual({ + 'file16-php': { + en: fileTypesMetafile.serverResponses.file16.en, + es: fileTypesMetafile.serverResponses.file16.es, + fr: fileTypesMetafile.serverResponses.file16.fr, + }, + }); + }); + + test('POT file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file17-pot'], + }), + ).toStrictEqual({ + 'file17-pot': { + en: fileTypesMetafile.serverResponses.file17.en, + es: fileTypesMetafile.serverResponses.file17.es, + fr: fileTypesMetafile.serverResponses.file17.fr, + }, + }); + }); + + test('PO file', async (): Promise => { + expect( + await cdn.fetch({ + files: ['file18-po'], + }), + ).toStrictEqual({ + 'file18-po': { + en: fileTypesMetafile.serverResponses.file18.en, + es: fileTypesMetafile.serverResponses.file18.es, + fr: fileTypesMetafile.serverResponses.file18.fr, + }, + }); + }); +}); diff --git a/tests/cdn-files.spec.ts b/tests/cdn-files.spec.ts new file mode 100644 index 0000000..e36f333 --- /dev/null +++ b/tests/cdn-files.spec.ts @@ -0,0 +1,143 @@ +import { + describe, test, expect, beforeEach, +} from 'vitest'; +import { completeMetafile } from '@tests/fixtures'; +import { CdnResponse, CdnClient, CdnFile } from '@/main'; + +describe('cdn.fetch()', (): void => { + let cdn: CdnClient; + + beforeEach(async (): Promise => { + completeMetafile.mockAxios(); + + cdn = await CdnClient.create({ + metafile: completeMetafile.url.metafile, + }); + }); + + test('Fetch all files with all locales', async (): Promise => { + const result: CdnResponse = await cdn.fetch(); + expect(result).toStrictEqual(completeMetafile.cdnResponses.allFilesAllLocales); + }); + + test('Fetch all files with all locales, exclude base locale', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + excludeBaseLocale: true, + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.allFilesAllLocalesExcludeBase); + }); + + test('Fetch all files with selected locales only', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + locales: ['en', 'ms_ID#Latn'], + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.allFilesSelectedLocales); + }); + + test('Fetch selected files with all locales', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: [cdn.metafile.files.first()], + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.selectedFilesAllLocales); + + const result2: CdnResponse = await cdn.fetch({ + files: ['file01'], + }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.selectedFilesAllLocales); + + const result3: CdnResponse = await cdn.fetch({ + files: [cdn.metafile.files.first()], + }); + expect(result3).toStrictEqual(completeMetafile.cdnResponses.selectedFilesAllLocales); + + const result4: CdnResponse = await cdn.fetch({ + files: ['file01'], + }); + expect(result4).toStrictEqual(completeMetafile.cdnResponses.selectedFilesAllLocales); + }); + + test('Fetch selected files with all locales, exclude base locale', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: [cdn.metafile.files.first()], + excludeBaseLocale: true, + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.selectedFilesAllLocalesExcludeBase); + + const result2: CdnResponse = await cdn.fetch({ + files: ['file01'], + excludeBaseLocale: true, + }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.selectedFilesAllLocalesExcludeBase); + }); + + test('Fetch selected files with selected locales only', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: cdn.metafile.files.filter( + (metafileFile: CdnFile) => ['file01', 'file03'].includes(metafileFile.id), + ), + locales: ['en', 'ms_BN'], + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.selectedFilesSelectedLocales); + + const result2: CdnResponse = await cdn.fetch({ + files: ['file01', 'file03'], + locales: ['en', 'ms_BN'], + }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.selectedFilesSelectedLocales); + }); + + test('Fetch single file with all locales', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: cdn.metafile.files.first(), + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.singleFileAllLocales); + + const result2: CdnResponse = await cdn.fetch({ + files: 'file01', + }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.singleFileAllLocales); + }); + + test('Fetch single file with all locales, exclude base locale', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: cdn.metafile.files.first(), + excludeBaseLocale: true, + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.singleFileAllLocalesExcludeBase); + + const result2: CdnResponse = await cdn.fetch({ + files: 'file01', + excludeBaseLocale: true, + }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.singleFileAllLocalesExcludeBase); + }); + + test('Fetch single file with selected locales only', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: cdn.metafile.files.first(), + locales: ['en', 'ms'], + }); + expect(result).toStrictEqual(completeMetafile.cdnResponses.singleFileSelectedLocales); + + const result2: CdnResponse = await cdn.fetch({ + files: 'file01', + locales: ['en', 'ms'], + }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.singleFileSelectedLocales); + }); + + test('Fetch single file with single locale', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + files: cdn.metafile.files.first(), + locales: 'en', + }); + expect(result).toStrictEqual(completeMetafile.serverResponses.file01.en); + }); + + test('Ignore non-existing locales', async (): Promise => { + const result: CdnResponse = await cdn.fetch({ + locales: ['jp', 'es', 'fi'], + }); + expect(result).toStrictEqual({}); + }); +}); diff --git a/tests/cdn-metafile-files.spec.ts b/tests/cdn-metafile-files.spec.ts new file mode 100644 index 0000000..e30fe20 --- /dev/null +++ b/tests/cdn-metafile-files.spec.ts @@ -0,0 +1,43 @@ +import { + describe, test, expectTypeOf, beforeEach, +} from 'vitest'; +import { completeMetafile } from '@tests/fixtures'; +import { CdnClient, CdnFile } from '@/main'; + +let cdn: CdnClient; + +describe('cdn.metafile.files', (): void => { + beforeEach(async (): Promise => { + completeMetafile.mockAxios(); + + cdn = await CdnClient.create({ + metafile: completeMetafile.url.metafile, + }); + }); + + test('List all metafile files', (): void => { + const result: CdnFile[] = cdn.metafile.files.list(); + + expectTypeOf(result).toMatchTypeOf(); + }); + + test('List first metafile file', (): void => { + const result: CdnFile = cdn.metafile.files.first(); + + expectTypeOf(result).toMatchTypeOf(); + }); + + test('Find metafile file', (): void => { + const result: CdnFile | undefined = cdn.metafile.files.find({ id: 'file01' }); + + expectTypeOf(result).toMatchTypeOf(); + }); + + test('Filter metafile files', (): void => { + const result: CdnFile[] = cdn.metafile.files.filter( + (metafileFile: CdnFile) => ['file01', 'file03'].includes(metafileFile.id), + ); + + expectTypeOf(result).toMatchTypeOf(); + }); +}); diff --git a/tests/cdn-metafile.spec.ts b/tests/cdn-metafile.spec.ts new file mode 100644 index 0000000..5d80ad5 --- /dev/null +++ b/tests/cdn-metafile.spec.ts @@ -0,0 +1,90 @@ +import { + describe, test, expect, beforeEach, +} from 'vitest'; +import { completeMetafile, completeMetafileV2, singleFileMetafile } from '@tests/fixtures'; +import { CdnClient, CdnLocale, CdnResponse } from '@/main'; + +let cdn: CdnClient; + +describe('cdn.metafile', (): void => { + beforeEach(async (): Promise => { + completeMetafile.mockAxios(); + + cdn = await CdnClient.create({ + metafile: completeMetafile.url.metafile, + }); + }); + + test('Get metafile URL', (): void => { + expect(cdn.metafile.url).toBe(completeMetafile.url.metafile); + }); + + test('Get project URL', (): void => { + expect(cdn.metafile.projectUrl).toBe(completeMetafile.serverResponses.metafile.projectUrl); + }); + + test('Refresh metafile, flush cache and fetch all files', async (): Promise => { + const result: CdnResponse = await cdn.fetch(); + expect(result).toStrictEqual(completeMetafile.cdnResponses.allFilesAllLocales); + + completeMetafileV2.mockAxios(); + await cdn.metafile.refresh(); + cdn.cache.flush(); + + const result2: CdnResponse = await cdn.fetch(); + expect(result2).toStrictEqual(completeMetafileV2.cdnResponses.allFilesAllLocales); + }); + + test('Refresh metafile and fetch only files with changed timestamp', async (): Promise => { + const result: CdnResponse = await cdn.fetch(); + expect(result).toStrictEqual(completeMetafile.cdnResponses.allFilesAllLocales); + + completeMetafileV2.mockAxios(); + await cdn.metafile.refresh(); + + const result2: CdnResponse = await cdn.fetch(); + expect(result2).toStrictEqual({ + file01: { + en: completeMetafileV2.serverResponses.file01.en, + ms_BN: completeMetafileV2.serverResponses.file01.msBn, + 'ms#Arab': completeMetafile.serverResponses.file01.msArab, + 'ms_ID#Latn': completeMetafile.serverResponses.file01.msIdLatn, + }, + file02: { + en: completeMetafile.serverResponses.file02.en, + ms_BN: completeMetafile.serverResponses.file02.msBn, + 'ms#Arab': completeMetafile.serverResponses.file02.msArab, + 'ms_ID#Latn': completeMetafile.serverResponses.file02.msIdLatn, + }, + file03: { + en: completeMetafile.serverResponses.file03.en, + ms_BN: completeMetafile.serverResponses.file03.msBn, + 'ms#Arab': completeMetafile.serverResponses.file03.msArab, + 'ms_ID#Latn': completeMetafile.serverResponses.file03.msIdLatn, + }, + }); + }); + + test('Switch metafile', async (): Promise => { + const result: CdnResponse = await cdn.fetch(); + expect(result).toStrictEqual(completeMetafile.cdnResponses.allFilesAllLocales); + + singleFileMetafile.mockAxios(); + await cdn.metafile.switch({ metafile: singleFileMetafile.url.metafile }); + + const result2: CdnResponse = await cdn.fetch(); + expect(result2).toStrictEqual(singleFileMetafile.cdnResponses.allFilesAllLocales); + }); + + test('Get base locale', (): void => { + expect(cdn.metafile.baseLocale).toStrictEqual(completeMetafile.cdnResponses.baseLocale); + }); + + test('Get all locales', (): void => { + const result: CdnLocale[] = cdn.metafile.locales(); + expect(result).toStrictEqual(completeMetafile.cdnResponses.locales); + + const result2: CdnLocale[] = cdn.metafile.locales({ excludeBaseLocale: true }); + expect(result2).toStrictEqual(completeMetafile.cdnResponses.localesExceptBaseLocale); + }); +}); diff --git a/tests/cdn.spec.ts b/tests/cdn.spec.ts new file mode 100644 index 0000000..db7029b --- /dev/null +++ b/tests/cdn.spec.ts @@ -0,0 +1,32 @@ +import { + describe, test, beforeEach, expectTypeOf, +} from 'vitest'; +import { completeMetafile } from '@tests/fixtures'; +import { CdnClient } from '@/main'; + +let cdn: CdnClient; + +describe('cdn', (): void => { + beforeEach(async (): Promise => { + completeMetafile.mockAxios(); + + cdn = await CdnClient.create({ + metafile: completeMetafile.url.metafile, + }); + }); + + test('Verify methods', (): void => { + expectTypeOf(cdn.metafile.url).toBeString(); + expectTypeOf(cdn.metafile.projectUrl).toBeString(); + expectTypeOf(cdn.metafile.refresh).toBeFunction(); + expectTypeOf(cdn.metafile.switch).toBeFunction(); + expectTypeOf(cdn.metafile.baseLocale).toBeObject(); + expectTypeOf(cdn.metafile.locales).toBeFunction(); + expectTypeOf(cdn.metafile.files.list).toBeFunction(); + expectTypeOf(cdn.metafile.files.first).toBeFunction(); + expectTypeOf(cdn.metafile.files.find).toBeFunction(); + expectTypeOf(cdn.metafile.files.filter).toBeFunction(); + expectTypeOf(cdn.fetch).toBeFunction(); + expectTypeOf(cdn.cache.flush).toBeFunction(); + }); +}); diff --git a/tests/errors-http.spec.ts b/tests/errors-http.spec.ts new file mode 100644 index 0000000..22e8087 --- /dev/null +++ b/tests/errors-http.spec.ts @@ -0,0 +1,23 @@ +import { + describe, test, expect, +} from 'vitest'; +import { serverErrorMetafile } from '@tests/fixtures'; +import { CdnClient } from '@/main'; + +describe('Test error responses', (): void => { + test('Server returns 404 when fetching metafile', async (): Promise => { + serverErrorMetafile.mockAxios(404); + + await expect(async (): Promise => { + await CdnClient.create({ metafile: serverErrorMetafile.url.metafile }); + }).rejects.toThrowError('Request failed with status code 404'); + }); + + test('Server returns 500 when fetching metafile', async (): Promise => { + serverErrorMetafile.mockAxios(500); + + await expect(async (): Promise => { + await CdnClient.create({ metafile: serverErrorMetafile.url.metafile }); + }).rejects.toThrowError('Request failed with status code 500'); + }); +}); diff --git a/tests/errors-responses.spec.ts b/tests/errors-responses.spec.ts new file mode 100644 index 0000000..16c8a20 --- /dev/null +++ b/tests/errors-responses.spec.ts @@ -0,0 +1,138 @@ +import { + describe, test, expect, +} from 'vitest'; +import { completeMetafile, emptyMetafile, filesWithoutLocalesMetafile } from '@tests/fixtures'; +import { CdnClient, CdnFile } from '@/main'; + +describe('Test error responses', (): void => { + test('Invalid metafile url', async (): Promise => { + completeMetafile.mockAxios(); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await CdnClient.create(); + }).rejects.toThrowError('Invalid param: missing required "options" parameter.'); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await CdnClient.create({ metafile: false }); + }).rejects.toThrowError('Invalid param: "options.metafile" must be string.'); + + await expect(async (): Promise => { + await CdnClient.create({ metafile: 'random-string' }); + }).rejects.toThrowError('Invalid param: "options.metafile" cannot be parsed as url.'); + + await expect(async (): Promise => { + await CdnClient.create({ metafile: 'https://wrong-link' }); + }).rejects.toThrowError('Invalid param: "options.metafile" contains invalid metafile url.'); + }); + + test('Missing files in metafile.json', async (): Promise => { + emptyMetafile.mockAxios(); + const cdn: CdnClient = await CdnClient.create({ metafile: emptyMetafile.url.metafile }); + + expect((): void => { + cdn.metafile.files.first(); + }).toThrowError('File is missing in downloaded metafile.'); + + expect(cdn.metafile.locales()).toStrictEqual([]); + + expect(cdn.metafile.files.list()).toStrictEqual([]); + + expect(cdn.metafile.files.find({ id: 'file01' })).toBeUndefined(); + + expect(cdn.metafile.files.find((i: CdnFile): boolean => i.id === 'file01')).toBeUndefined(); + + expect(cdn.metafile.files.filter({ id: 'file01' })).toStrictEqual([]); + + expect(cdn.metafile.files.filter((i: CdnFile): boolean => i.id === 'file01')).toStrictEqual([]); + }); + + test('Missing locales in metafile.json', async (): Promise => { + filesWithoutLocalesMetafile.mockAxios(); + const cdn: CdnClient = await CdnClient.create({ metafile: filesWithoutLocalesMetafile.url.metafile }); + + expect(cdn.metafile.locales()).toStrictEqual([]); + }); + + test('Invalid cdn.metafile.files.find() parameters', async (): Promise => { + emptyMetafile.mockAxios(); + const cdn: CdnClient = await CdnClient.create({ metafile: emptyMetafile.url.metafile }); + + expect((): void => { + // @ts-expect-error invalid param + cdn.metafile.files.find(); + }).toThrowError('Invalid param: missing required "options" parameter.'); + + expect((): void => { + // @ts-expect-error invalid param + cdn.metafile.files.find([]); + }).toThrowError('Invalid param: "options" must be function or object.'); + }); + + test('Invalid cdn.metafile.files.filter() parameters', async (): Promise => { + emptyMetafile.mockAxios(); + const cdn: CdnClient = await CdnClient.create({ metafile: emptyMetafile.url.metafile }); + + expect((): void => { + // @ts-expect-error invalid param + cdn.metafile.files.filter(); + }).toThrowError('Invalid param: missing required "options" parameter.'); + + expect((): void => { + // @ts-expect-error invalid param + cdn.metafile.files.filter([]); + }).toThrowError('Invalid param: "options" must be function or object.'); + }); + + test('Invalid cdn.fetch() params', async (): Promise => { + completeMetafile.mockAxios(); + const cdn: CdnClient = await CdnClient.create({ metafile: completeMetafile.url.metafile }); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await cdn.fetch({ files: 123 }); + }).rejects.toThrowError('Invalid param: "request.files" must be object, array, string or undefined.'); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await cdn.fetch({ files: [123] }); + }).rejects.toThrowError('Invalid param: array "request.files" must contain objects or strings.'); + + await expect(async (): Promise => { + await cdn.fetch({ files: 'random-string' }); + }).rejects.toThrowError('File not found: "random-string".'); + + await expect(async (): Promise => { + await cdn.fetch({ files: ['random-string'] }); + }).rejects.toThrowError('File not found: "random-string".'); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await cdn.fetch({ files: { id: 'random-string' } }); + }).rejects.toThrowError('File not found: "random-string".'); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await cdn.fetch({ files: [{ id: 'random-string' }] }); + }).rejects.toThrowError('File not found: "random-string".'); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await cdn.fetch({ locales: 123 }); + }).rejects.toThrowError('Invalid param: "request.locales" must be array, string or undefined.'); + + await expect(async (): Promise => { + // @ts-expect-error invalid param + await cdn.fetch({ locales: [123] }); + }).rejects.toThrowError('Invalid param: array "request.locales" must contain strings.'); + + expect( + await cdn.fetch({ locales: 'random-string' }), + ).toStrictEqual({}); + + expect( + await cdn.fetch({ locales: ['random-string'] }), + ).toStrictEqual({}); + }); +}); diff --git a/tests/fixtures/complete-metafile-v2/file01/en/file.json b/tests/fixtures/complete-metafile-v2/file01/en/file.json new file mode 100644 index 0000000..aeba97c --- /dev/null +++ b/tests/fixtures/complete-metafile-v2/file01/en/file.json @@ -0,0 +1,5 @@ +{ + "cdn_info": "With the CDN you can deliver the translation files instantly", + "cdn_testing": "We're testing the CDN", + "updated_content": "Updated content" +} diff --git a/tests/fixtures/complete-metafile-v2/file01/ms-BN/file.json b/tests/fixtures/complete-metafile-v2/file01/ms-BN/file.json new file mode 100644 index 0000000..cae2c3d --- /dev/null +++ b/tests/fixtures/complete-metafile-v2/file01/ms-BN/file.json @@ -0,0 +1,5 @@ +{ + "cdn_info": "Dengan CDN anda boleh menyampaikan fail terjemahan dengan serta-merta", + "cdn_testing": "Kami sedang menguji CDN", + "updated_content": "Kandungan yang dikemas kini" +} diff --git a/tests/fixtures/complete-metafile-v2/index.ts b/tests/fixtures/complete-metafile-v2/index.ts new file mode 100644 index 0000000..48c24fe --- /dev/null +++ b/tests/fixtures/complete-metafile-v2/index.ts @@ -0,0 +1,67 @@ +import axiosMock from '@tests/mocks/axios-mock'; +import { url } from '@tests/fixtures/complete-metafile'; +import completeMetafileV2 from '@tests/fixtures/complete-metafile-v2/metafile.json'; +import file01En from '@tests/fixtures/complete-metafile-v2/file01/en/file.json'; +import file01MSBn from '@tests/fixtures/complete-metafile-v2/file01/ms-BN/file.json'; + +export const serverResponses = { + metafile: completeMetafileV2, + file01: { + en: file01En, + msBn: file01MSBn, + msArab: {}, + msIdLatn: {}, + }, + file02: { + en: {}, + msBn: {}, + msArab: {}, + msIdLatn: {}, + }, + file03: { + en: {}, + msBn: {}, + msArab: {}, + msIdLatn: {}, + }, +}; + +export const cdnResponses = { + allFilesAllLocales: { + file01: { + en: serverResponses.file01.en, + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + file02: { + en: serverResponses.file02.en, + ms_BN: serverResponses.file02.msBn, + 'ms#Arab': serverResponses.file02.msArab, + 'ms_ID#Latn': serverResponses.file02.msIdLatn, + }, + file03: { + en: serverResponses.file03.en, + ms_BN: serverResponses.file03.msBn, + 'ms#Arab': serverResponses.file03.msArab, + 'ms_ID#Latn': serverResponses.file03.msIdLatn, + }, + }, +}; + +export const mockAxios = (): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(200, serverResponses.metafile); + axiosMock.onGet(url.file01.en).reply(200, serverResponses.file01.en); + axiosMock.onGet(url.file01.msBn).reply(200, serverResponses.file01.msBn); + axiosMock.onGet(url.file01.msArab).reply(200, serverResponses.file01.msArab); + axiosMock.onGet(url.file01.msIdLatn).reply(200, serverResponses.file01.msIdLatn); + axiosMock.onGet(url.file02.en).reply(200, serverResponses.file02.en); + axiosMock.onGet(url.file02.msBn).reply(200, serverResponses.file02.msBn); + axiosMock.onGet(url.file02.msArab).reply(200, serverResponses.file02.msArab); + axiosMock.onGet(url.file02.msIdLatn).reply(200, serverResponses.file02.msIdLatn); + axiosMock.onGet(url.file03.en).reply(200, serverResponses.file03.en); + axiosMock.onGet(url.file03.msBn).reply(200, serverResponses.file03.msBn); + axiosMock.onGet(url.file03.msArab).reply(200, serverResponses.file03.msArab); + axiosMock.onGet(url.file03.msIdLatn).reply(200, serverResponses.file03.msIdLatn); +}; diff --git a/tests/fixtures/complete-metafile-v2/metafile.json b/tests/fixtures/complete-metafile-v2/metafile.json new file mode 100644 index 0000000..c055bb4 --- /dev/null +++ b/tests/fixtures/complete-metafile-v2/metafile.json @@ -0,0 +1,160 @@ +{ + "projectUrl": "https://localazy.com/p/cdnarticle", + "baseLocale": "en", + "timestamp": 1700000000, + "files": { + "file01": { + "file": "file.json", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/complete-metafile/_e0/file01/en/file.json", + "timestamp": 1700000001 + }, + { + "language": "ms", + "region": "BN", + "script": "", + "isRtl": false, + "name": "Malay (Brunei)", + "localizedName": "Malay (Brunei)", + "uri": "/complete-metafile/_e0/file01/ms-BN/file.json", + "timestamp": 1700000001 + }, + { + "language": "ms", + "region": "", + "script": "Arab", + "isRtl": false, + "name": "Malay (Arabic)", + "localizedName": "Malay (Arabic)", + "uri": "/complete-metafile/_e0/file01/ms-Arab/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "ID", + "script": "Latn", + "isRtl": false, + "name": "Malay (Indonesia, Latin)", + "localizedName": "Malay (Indonesia, Latin)", + "uri": "/complete-metafile/_e0/file01/ms-ID-Latn/file.json", + "timestamp": 1700000000 + } + ] + }, + "file02": { + "file": "file.json", + "path": "", + "library": "lib", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/complete-metafile/_e0/file02/en/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "BN", + "script": "", + "isRtl": false, + "name": "Malay (Brunei)", + "localizedName": "Malay (Brunei)", + "uri": "/complete-metafile/_e0/file02/ms-BN/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "", + "script": "Arab", + "isRtl": false, + "name": "Malay (Arabic)", + "localizedName": "Malay (Arabic)", + "uri": "/complete-metafile/_e0/file02/ms-Arab/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "ID", + "script": "Latn", + "isRtl": false, + "name": "Malay (Indonesia, Latin)", + "localizedName": "Malay (Indonesia, Latin)", + "uri": "/complete-metafile/_e0/file02/ms-ID-Latn/file.json", + "timestamp": 1700000000 + } + ] + }, + "file03": { + "file": "file.json", + "path": "", + "library": "lib", + "module": "auth", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/complete-metafile/_e0/file03/en/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "BN", + "script": "", + "isRtl": false, + "name": "Malay (Brunei)", + "localizedName": "Malay (Brunei)", + "uri": "/complete-metafile/_e0/file03/ms-BN/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "", + "script": "Arab", + "isRtl": false, + "name": "Malay (Arabic)", + "localizedName": "Malay (Arabic)", + "uri": "/complete-metafile/_e0/file03/ms-Arab/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "ID", + "script": "Latn", + "isRtl": false, + "name": "Malay (Indonesia, Latin)", + "localizedName": "Malay (Indonesia, Latin)", + "uri": "/complete-metafile/_e0/file03/ms-ID-Latn/file.json", + "timestamp": 1700000000 + } + ] + } + } +} diff --git a/tests/fixtures/complete-metafile/file01/en/file.json b/tests/fixtures/complete-metafile/file01/en/file.json new file mode 100644 index 0000000..ca5596a --- /dev/null +++ b/tests/fixtures/complete-metafile/file01/en/file.json @@ -0,0 +1,4 @@ +{ + "cdn_info": "With the CDN you can deliver the translation files instantly", + "cdn_testing": "We're testing the CDN" +} diff --git a/tests/fixtures/complete-metafile/file01/ms-Arab/file.json b/tests/fixtures/complete-metafile/file01/ms-Arab/file.json new file mode 100644 index 0000000..fc231d7 --- /dev/null +++ b/tests/fixtures/complete-metafile/file01/ms-Arab/file.json @@ -0,0 +1,4 @@ +{ + "cdn_info": "Dengan CDN anda boleh menyampaikan fail terjemahan dengan serta-merta", + "cdn_testing": "Kami sedang menguji CDN" +} diff --git a/tests/fixtures/complete-metafile/file01/ms-BN/file.json b/tests/fixtures/complete-metafile/file01/ms-BN/file.json new file mode 100644 index 0000000..fc231d7 --- /dev/null +++ b/tests/fixtures/complete-metafile/file01/ms-BN/file.json @@ -0,0 +1,4 @@ +{ + "cdn_info": "Dengan CDN anda boleh menyampaikan fail terjemahan dengan serta-merta", + "cdn_testing": "Kami sedang menguji CDN" +} diff --git a/tests/fixtures/complete-metafile/file01/ms-ID-Latn/file.json b/tests/fixtures/complete-metafile/file01/ms-ID-Latn/file.json new file mode 100644 index 0000000..fc231d7 --- /dev/null +++ b/tests/fixtures/complete-metafile/file01/ms-ID-Latn/file.json @@ -0,0 +1,4 @@ +{ + "cdn_info": "Dengan CDN anda boleh menyampaikan fail terjemahan dengan serta-merta", + "cdn_testing": "Kami sedang menguji CDN" +} diff --git a/tests/fixtures/complete-metafile/file02/en/file.json b/tests/fixtures/complete-metafile/file02/en/file.json new file mode 100644 index 0000000..bdc8b65 --- /dev/null +++ b/tests/fixtures/complete-metafile/file02/en/file.json @@ -0,0 +1,3 @@ +{ + "using_javascript": "In this project we decided to use JavaScript" +} diff --git a/tests/fixtures/complete-metafile/file02/ms-Arab/file.json b/tests/fixtures/complete-metafile/file02/ms-Arab/file.json new file mode 100644 index 0000000..6bb976e --- /dev/null +++ b/tests/fixtures/complete-metafile/file02/ms-Arab/file.json @@ -0,0 +1,3 @@ +{ + "using_javascript": "Dalam projek ini kami memutuskan untuk menggunakan JavaScript" +} diff --git a/tests/fixtures/complete-metafile/file02/ms-BN/file.json b/tests/fixtures/complete-metafile/file02/ms-BN/file.json new file mode 100644 index 0000000..6bb976e --- /dev/null +++ b/tests/fixtures/complete-metafile/file02/ms-BN/file.json @@ -0,0 +1,3 @@ +{ + "using_javascript": "Dalam projek ini kami memutuskan untuk menggunakan JavaScript" +} diff --git a/tests/fixtures/complete-metafile/file02/ms-ID-Latn/file.json b/tests/fixtures/complete-metafile/file02/ms-ID-Latn/file.json new file mode 100644 index 0000000..6bb976e --- /dev/null +++ b/tests/fixtures/complete-metafile/file02/ms-ID-Latn/file.json @@ -0,0 +1,3 @@ +{ + "using_javascript": "Dalam projek ini kami memutuskan untuk menggunakan JavaScript" +} diff --git a/tests/fixtures/complete-metafile/file03/en/file.json b/tests/fixtures/complete-metafile/file03/en/file.json new file mode 100644 index 0000000..5cccb29 --- /dev/null +++ b/tests/fixtures/complete-metafile/file03/en/file.json @@ -0,0 +1,3 @@ +{ + "hello_localazy": "Hello Localazy!" +} diff --git a/tests/fixtures/complete-metafile/file03/ms-Arab/file.json b/tests/fixtures/complete-metafile/file03/ms-Arab/file.json new file mode 100644 index 0000000..0fcaccc --- /dev/null +++ b/tests/fixtures/complete-metafile/file03/ms-Arab/file.json @@ -0,0 +1,3 @@ +{ + "hello_localazy": "Helo Localazy!" +} diff --git a/tests/fixtures/complete-metafile/file03/ms-BN/file.json b/tests/fixtures/complete-metafile/file03/ms-BN/file.json new file mode 100644 index 0000000..0fcaccc --- /dev/null +++ b/tests/fixtures/complete-metafile/file03/ms-BN/file.json @@ -0,0 +1,3 @@ +{ + "hello_localazy": "Helo Localazy!" +} diff --git a/tests/fixtures/complete-metafile/file03/ms-ID-Latn/file.json b/tests/fixtures/complete-metafile/file03/ms-ID-Latn/file.json new file mode 100644 index 0000000..0fcaccc --- /dev/null +++ b/tests/fixtures/complete-metafile/file03/ms-ID-Latn/file.json @@ -0,0 +1,3 @@ +{ + "hello_localazy": "Helo Localazy!" +} diff --git a/tests/fixtures/complete-metafile/index.ts b/tests/fixtures/complete-metafile/index.ts new file mode 100644 index 0000000..1a6668c --- /dev/null +++ b/tests/fixtures/complete-metafile/index.ts @@ -0,0 +1,265 @@ +import axiosMock from '@tests/mocks/axios-mock'; +import completeMetafile from '@tests/fixtures/complete-metafile/metafile.json'; +import file01En from '@tests/fixtures/complete-metafile/file01/en/file.json'; +import file01MsBn from '@tests/fixtures/complete-metafile/file01/ms-BN/file.json'; +import file01MsArab from '@tests/fixtures/complete-metafile/file01/ms-Arab/file.json'; +import file01MsIdLatn from '@tests/fixtures/complete-metafile/file01/ms-ID-Latn/file.json'; +import file02En from '@tests/fixtures/complete-metafile/file02/en/file.json'; +import file02MsBn from '@tests/fixtures/complete-metafile/file02/ms-BN/file.json'; +import file02MsArab from '@tests/fixtures/complete-metafile/file02/ms-Arab/file.json'; +import file02MsIdLatn from '@tests/fixtures/complete-metafile/file02/ms-ID-Latn/file.json'; +import file03En from '@tests/fixtures/complete-metafile/file03/en/file.json'; +import file03MsBn from '@tests/fixtures/complete-metafile/file03/ms-BN/file.json'; +import file03MsArab from '@tests/fixtures/complete-metafile/file03/ms-Arab/file.json'; +import file03MsIdLatn from '@tests/fixtures/complete-metafile/file03/ms-ID-Latn/file.json'; + +const baseUrl: string = 'https://delivery.localazy.com'; +const file01Locales = completeMetafile.files.file01.locales; +const file02Locales = completeMetafile.files.file02.locales; +const file03Locales = completeMetafile.files.file03.locales; + +export const url = { + metafile: `${baseUrl}/complete-metafile/_e0.v2.json`, + + file01: { + en: `${baseUrl}${file01Locales[0].uri}`, + msBn: `${baseUrl}${file01Locales[1].uri}`, + msArab: `${baseUrl}${file01Locales[2].uri}`, + msIdLatn: `${baseUrl}${file01Locales[3].uri}`, + }, + file02: { + en: `${baseUrl}${file02Locales[0].uri}`, + msBn: `${baseUrl}${file02Locales[1].uri}`, + msArab: `${baseUrl}${file02Locales[2].uri}`, + msIdLatn: `${baseUrl}${file02Locales[3].uri}`, + }, + file03: { + en: `${baseUrl}${file03Locales[0].uri}`, + msBn: `${baseUrl}${file03Locales[1].uri}`, + msArab: `${baseUrl}${file03Locales[2].uri}`, + msIdLatn: `${baseUrl}${file03Locales[3].uri}`, + }, +}; + +export const serverResponses = { + metafile: completeMetafile, + file01: { + en: file01En, + msBn: file01MsBn, + msArab: file01MsArab, + msIdLatn: file01MsIdLatn, + }, + file02: { + en: file02En, + msBn: file02MsBn, + msArab: file02MsArab, + msIdLatn: file02MsIdLatn, + }, + file03: { + en: file03En, + msBn: file03MsBn, + msArab: file03MsArab, + msIdLatn: file03MsIdLatn, + }, +}; + +export const cdnResponses = { + allFilesAllLocales: { + file01: { + en: serverResponses.file01.en, + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + file02: { + en: serverResponses.file02.en, + ms_BN: serverResponses.file02.msBn, + 'ms#Arab': serverResponses.file02.msArab, + 'ms_ID#Latn': serverResponses.file02.msIdLatn, + }, + file03: { + en: serverResponses.file03.en, + ms_BN: serverResponses.file03.msBn, + 'ms#Arab': serverResponses.file03.msArab, + 'ms_ID#Latn': serverResponses.file03.msIdLatn, + }, + }, + allFilesAllLocalesExcludeBase: { + file01: { + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + file02: { + ms_BN: serverResponses.file02.msBn, + 'ms#Arab': serverResponses.file02.msArab, + 'ms_ID#Latn': serverResponses.file02.msIdLatn, + }, + file03: { + ms_BN: serverResponses.file03.msBn, + 'ms#Arab': serverResponses.file03.msArab, + 'ms_ID#Latn': serverResponses.file03.msIdLatn, + }, + }, + allFilesSelectedLocales: { + file01: { + en: serverResponses.file01.en, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + file02: { + en: serverResponses.file02.en, + 'ms_ID#Latn': serverResponses.file02.msIdLatn, + }, + file03: { + en: serverResponses.file03.en, + 'ms_ID#Latn': serverResponses.file03.msIdLatn, + }, + }, + selectedFilesAllLocales: { + file01: { + en: serverResponses.file01.en, + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + }, + selectedFilesAllLocalesExcludeBase: { + file01: { + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + }, + selectedFilesSelectedLocales: { + file01: { + en: serverResponses.file01.en, + ms_BN: serverResponses.file01.msBn, + }, + file03: { + en: serverResponses.file03.en, + ms_BN: serverResponses.file03.msBn, + }, + }, + singleFileAllLocales: { + en: serverResponses.file01.en, + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + singleFileAllLocalesExcludeBase: { + ms_BN: serverResponses.file01.msBn, + 'ms#Arab': serverResponses.file01.msArab, + 'ms_ID#Latn': serverResponses.file01.msIdLatn, + }, + singleFileSelectedLocales: { + en: serverResponses.file01.en, + }, + firstFileLocales: [ + 'en', + 'ms', + 'ms_BN', + 'ms#Arab', + 'ms_ID#Latn', + ], + locales: [ + { + isBaseLocale: true, + isRtl: false, + language: 'en', + locale: 'en', + localizedName: 'English', + name: 'English', + region: '', + script: '', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_BN', + localizedName: 'Malay (Brunei)', + name: 'Malay (Brunei)', + region: 'BN', + script: '', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms#Arab', + localizedName: 'Malay (Arabic)', + name: 'Malay (Arabic)', + region: '', + script: 'Arab', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_ID#Latn', + localizedName: 'Malay (Indonesia, Latin)', + name: 'Malay (Indonesia, Latin)', + region: 'ID', + script: 'Latn', + }, + ], + localesExceptBaseLocale: [ + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_BN', + localizedName: 'Malay (Brunei)', + name: 'Malay (Brunei)', + region: 'BN', + script: '', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms#Arab', + localizedName: 'Malay (Arabic)', + name: 'Malay (Arabic)', + region: '', + script: 'Arab', + }, + { + isBaseLocale: false, + isRtl: false, + language: 'ms', + locale: 'ms_ID#Latn', + localizedName: 'Malay (Indonesia, Latin)', + name: 'Malay (Indonesia, Latin)', + region: 'ID', + script: 'Latn', + }, + ], + baseLocale: { + isBaseLocale: true, + isRtl: false, + language: 'en', + locale: 'en', + localizedName: 'English', + name: 'English', + region: '', + script: '', + }, +}; + +export const mockAxios = (): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(200, serverResponses.metafile); + axiosMock.onGet(url.file01.en).reply(200, serverResponses.file01.en); + axiosMock.onGet(url.file01.msBn).reply(200, serverResponses.file01.msBn); + axiosMock.onGet(url.file01.msArab).reply(200, serverResponses.file01.msArab); + axiosMock.onGet(url.file01.msIdLatn).reply(200, serverResponses.file01.msIdLatn); + axiosMock.onGet(url.file02.en).reply(200, serverResponses.file02.en); + axiosMock.onGet(url.file02.msBn).reply(200, serverResponses.file02.msBn); + axiosMock.onGet(url.file02.msArab).reply(200, serverResponses.file02.msArab); + axiosMock.onGet(url.file02.msIdLatn).reply(200, serverResponses.file02.msIdLatn); + axiosMock.onGet(url.file03.en).reply(200, serverResponses.file03.en); + axiosMock.onGet(url.file03.msBn).reply(200, serverResponses.file03.msBn); + axiosMock.onGet(url.file03.msArab).reply(200, serverResponses.file03.msArab); + axiosMock.onGet(url.file03.msIdLatn).reply(200, serverResponses.file03.msIdLatn); +}; diff --git a/tests/fixtures/complete-metafile/metafile.json b/tests/fixtures/complete-metafile/metafile.json new file mode 100644 index 0000000..60f3db1 --- /dev/null +++ b/tests/fixtures/complete-metafile/metafile.json @@ -0,0 +1,160 @@ +{ + "projectUrl": "https://localazy.com/p/cdnarticle", + "baseLocale": "en", + "timestamp": 1700000000, + "files": { + "file01": { + "file": "file.json", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/complete-metafile/_e0/file01/en/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "BN", + "script": "", + "isRtl": false, + "name": "Malay (Brunei)", + "localizedName": "Malay (Brunei)", + "uri": "/complete-metafile/_e0/file01/ms-BN/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "", + "script": "Arab", + "isRtl": false, + "name": "Malay (Arabic)", + "localizedName": "Malay (Arabic)", + "uri": "/complete-metafile/_e0/file01/ms-Arab/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "ID", + "script": "Latn", + "isRtl": false, + "name": "Malay (Indonesia, Latin)", + "localizedName": "Malay (Indonesia, Latin)", + "uri": "/complete-metafile/_e0/file01/ms-ID-Latn/file.json", + "timestamp": 1700000000 + } + ] + }, + "file02": { + "file": "file.json", + "path": "", + "library": "lib", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/complete-metafile/_e0/file02/en/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "BN", + "script": "", + "isRtl": false, + "name": "Malay (Brunei)", + "localizedName": "Malay (Brunei)", + "uri": "/complete-metafile/_e0/file02/ms-BN/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "", + "script": "Arab", + "isRtl": false, + "name": "Malay (Arabic)", + "localizedName": "Malay (Arabic)", + "uri": "/complete-metafile/_e0/file02/ms-Arab/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "ID", + "script": "Latn", + "isRtl": false, + "name": "Malay (Indonesia, Latin)", + "localizedName": "Malay (Indonesia, Latin)", + "uri": "/complete-metafile/_e0/file02/ms-ID-Latn/file.json", + "timestamp": 1700000000 + } + ] + }, + "file03": { + "file": "file.json", + "path": "", + "library": "lib", + "module": "auth", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/complete-metafile/_e0/file03/en/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "BN", + "script": "", + "isRtl": false, + "name": "Malay (Brunei)", + "localizedName": "Malay (Brunei)", + "uri": "/complete-metafile/_e0/file03/ms-BN/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "", + "script": "Arab", + "isRtl": false, + "name": "Malay (Arabic)", + "localizedName": "Malay (Arabic)", + "uri": "/complete-metafile/_e0/file03/ms-Arab/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "ID", + "script": "Latn", + "isRtl": false, + "name": "Malay (Indonesia, Latin)", + "localizedName": "Malay (Indonesia, Latin)", + "uri": "/complete-metafile/_e0/file03/ms-ID-Latn/file.json", + "timestamp": 1700000000 + } + ] + } + } +} diff --git a/tests/fixtures/empty-metafile/index.ts b/tests/fixtures/empty-metafile/index.ts new file mode 100644 index 0000000..cdc1b1f --- /dev/null +++ b/tests/fixtures/empty-metafile/index.ts @@ -0,0 +1,17 @@ +import axiosMock from '@tests/mocks/axios-mock'; +import emptyFileMetafile from '@tests/fixtures/empty-metafile/metafile.json'; + +const baseUrl: string = 'https://delivery.localazy.com'; + +export const url = { + metafile: `${baseUrl}/empty-metafile/_e0.v2.json`, +}; + +export const serverResponses = { + metafile: emptyFileMetafile, +}; + +export const mockAxios = (): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(200, serverResponses.metafile); +}; diff --git a/tests/fixtures/empty-metafile/metafile.json b/tests/fixtures/empty-metafile/metafile.json new file mode 100644 index 0000000..c375b6e --- /dev/null +++ b/tests/fixtures/empty-metafile/metafile.json @@ -0,0 +1,7 @@ +{ + "projectUrl": "https://localazy.com/p/cdnarticle", + "baseLocale": "en", + "timestamp": 1700000000, + "files": { + } +} diff --git a/tests/fixtures/file-types-metafile/file01-json/en/plain.json b/tests/fixtures/file-types-metafile/file01-json/en/plain.json new file mode 100644 index 0000000..21a44ca --- /dev/null +++ b/tests/fixtures/file-types-metafile/file01-json/en/plain.json @@ -0,0 +1,38 @@ +{ + "app_title": "My Application", + "back_button": "Back", + "cancel_button": "Cancel", + "change_password_button": "Change Password", + "confirmation_message": "Are you sure you want to proceed?", + "confirmation_title": "Confirmation", + "continue_button": "Continue", + "delete_account_button": "Delete Account", + "error_message": "An error has occurred", + "finish_button": "Finish", + "forgot_password": "Forgot Password?", + "home_tab": "Home", + "language_selection": "Language", + "loading_message": "Loading...", + "login_button": "Log In", + "logout_button": "Log Out", + "messages_tab": "Messages", + "next_button": "Next", + "no_button": "No", + "no_results": "No results found", + "notifications_title": "Notifications", + "password_placeholder": "Enter your password", + "privacy_policy": "Privacy Policy", + "profile_tab": "Profile", + "profile_title": "My Profile", + "remember_me": "Remember Me", + "save_changes_button": "Save Changes", + "search_placeholder": "Search...", + "settings_tab": "Settings", + "settings_title": "Settings", + "signup_button": "Sign Up", + "submit_button": "Submit", + "terms_of_service": "Terms of Service", + "username_placeholder": "Enter your username", + "welcome_message": "Welcome to My Application!", + "yes_button": "Yes" +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file01-json/es/plain.json b/tests/fixtures/file-types-metafile/file01-json/es/plain.json new file mode 100644 index 0000000..2a63840 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file01-json/es/plain.json @@ -0,0 +1,38 @@ +{ + "app_title": "Mi solicitud", + "back_button": "Atrás", + "cancel_button": "Cancelar", + "change_password_button": "Cambiar contraseña", + "confirmation_message": "¿Está seguro de que desea continuar?", + "confirmation_title": "Confirmación", + "continue_button": "Continuar", + "delete_account_button": "Eliminar cuenta", + "error_message": "Se ha producido un error", + "finish_button": "Finalizar", + "forgot_password": "¿Ha olvidado la contraseña?", + "home_tab": "Inicio", + "language_selection": "Idioma", + "loading_message": "Cargando...", + "login_button": "Iniciar sesión", + "logout_button": "Cerrar sesión", + "messages_tab": "Mensajes", + "next_button": "Próxima", + "no_button": "No", + "no_results": "No se han encontrado resultados", + "notifications_title": "Notificaciones", + "password_placeholder": "Introduce tu contraseña", + "privacy_policy": "Política de privacidad", + "profile_tab": "Perfil", + "profile_title": "Mi perfil", + "remember_me": "Recuérdame", + "save_changes_button": "Guardar cambios", + "search_placeholder": "Buscar...", + "settings_tab": "Ajustes", + "settings_title": "Ajustes", + "signup_button": "Inscríbase", + "submit_button": "Enviar", + "terms_of_service": "Términos de servicio", + "username_placeholder": "Introduce tu nombre de usuario", + "welcome_message": "¡Bienvenido a My Application!", + "yes_button": "Sí" +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file01-json/fr/plain.json b/tests/fixtures/file-types-metafile/file01-json/fr/plain.json new file mode 100644 index 0000000..6909aad --- /dev/null +++ b/tests/fixtures/file-types-metafile/file01-json/fr/plain.json @@ -0,0 +1,38 @@ +{ + "app_title": "Ma candidature", + "back_button": "Retour", + "cancel_button": "Annuler", + "change_password_button": "Changer le mot de passe", + "confirmation_message": "Êtes-vous sûr de vouloir continuer ?", + "confirmation_title": "Confirmer", + "continue_button": "Continuer", + "delete_account_button": "Supprimer le compte", + "error_message": "Une erreur s'est produite", + "finish_button": "Terminer", + "forgot_password": "Mot de passe oublié ?", + "home_tab": "Accueil", + "language_selection": "Langue", + "loading_message": "Chargement en cours...", + "login_button": "Connectez-vous", + "logout_button": "Déconnectez-vous", + "messages_tab": "Méssages", + "next_button": "Suivant", + "no_button": "Non", + "no_results": "Aucun résultat n'a été trouvé", + "notifications_title": "Les notifications", + "password_placeholder": "Entrez votre mot de passe", + "privacy_policy": "Politique de confidentialité", + "profile_tab": "Profil", + "profile_title": "Mon profil", + "remember_me": "Souvenez-vous de moi", + "save_changes_button": "Enregistrer les modifications", + "search_placeholder": "Rechercher...", + "settings_tab": "Réglages", + "settings_title": "Réglages", + "signup_button": "INSCRIVEZ-VOUS", + "submit_button": "Soumettre", + "terms_of_service": "Conditions générales d'utilisation", + "username_placeholder": "Entrez votre nom d'utilisateur", + "welcome_message": "Bienvenue sur Ma candidature !", + "yes_button": "Oui" +} diff --git a/tests/fixtures/file-types-metafile/file02-json5/en/texts.json5 b/tests/fixtures/file-types-metafile/file02-json5/en/texts.json5 new file mode 100644 index 0000000..07f7664 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file02-json5/en/texts.json5 @@ -0,0 +1,52 @@ +{ + "app": { + "farewellMessage": "Goodbye and thank you for using our app!", + "loginPrompt": "Please log in to continue.", + "logoutButton": "Log Out", + "title": "My Application", + "welcomeMessage": "Welcome, {user_name}!" + }, + "authentication": { + "alreadyHaveAccount": "Already have an account? Log In", + "emailPlaceholder": "Enter your email", + "passwordPlaceholder": "Enter your password", + "passwordReset": "Reset your password", + "rememberMe": "Remember Me", + "signUp": "Sign Up" + }, + "contact": { + "aboutUs": "About Us", + "us": "Contact Us" + }, + "errors": { + "message": "Something went wrong. Please try again.", + "networkError": "Please check your internet connection and try again." + }, + "feedback": { + "prompt": "Tell us what you think about the app!", + "submitFeedback": "Submit Feedback" + }, + "gender": { + "choice": { + "female": "She is your friend.", + "male": "He is your friend.", + "other": "They are your friend." + } + }, + "messages": { + "pluralMessage": "You have ${count} new messages" + }, + "profile": { + "editProfile": "Edit Profile", + "pageTitle": "Your Profile" + }, + "settings": { + "disableNotifications": "Disable Notifications", + "enableNotifications": "Enable Notifications", + "languageSelectLabel": "Choose your language:", + "notificationsLabel": "Notifications", + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "title": "Settings" + } +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file02-json5/es/texts.json5 b/tests/fixtures/file-types-metafile/file02-json5/es/texts.json5 new file mode 100644 index 0000000..620dee7 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file02-json5/es/texts.json5 @@ -0,0 +1,52 @@ +{ + "app": { + "farewellMessage": "¡Adiós y gracias por usar nuestra aplicación!", + "loginPrompt": "Inicie sesión para continuar.", + "logoutButton": "Cerrar sesión", + "title": "Mi solicitud", + "welcomeMessage": "¡Bienvenido,{user_name}!" + }, + "authentication": { + "alreadyHaveAccount": "¿Ya tienes una cuenta? Iniciar sesión", + "emailPlaceholder": "Introduce tu correo electrónico", + "passwordPlaceholder": "Introduce tu contraseña", + "passwordReset": "Restablecer la contraseña", + "rememberMe": "Recuérdame", + "signUp": "Inscríbase" + }, + "contact": { + "aboutUs": "Acerca de nosotros", + "us": "Póngase en contacto con nosotros" + }, + "errors": { + "message": "Algo salió mal. Por favor, inténtelo de nuevo.", + "networkError": "Comprueba tu conexión a Internet e inténtalo de nuevo." + }, + "feedback": { + "prompt": "¡Cuéntanos lo que piensas de la aplicación!", + "submitFeedback": "Enviar comentarios" + }, + "gender": { + "choice": { + "female": "Es tu amiga.", + "male": "Es tu amigo.", + "other": "Son tus amigos." + } + }, + "messages": { + "pluralMessage": "Tienes mensajes ${count} nuevos" + }, + "profile": { + "editProfile": "Editar perfil", + "pageTitle": "Tu perfil" + }, + "settings": { + "disableNotifications": "Desactivar las notificaciones", + "enableNotifications": "Habilitar notificaciones", + "languageSelectLabel": "Elige tu idioma:", + "notificationsLabel": "Notificaciones", + "privacyPolicy": "Política de privacidad", + "termsOfService": "Términos de servicio", + "title": "Ajustes" + } +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file02-json5/fr/texts.json5 b/tests/fixtures/file-types-metafile/file02-json5/fr/texts.json5 new file mode 100644 index 0000000..6d1e101 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file02-json5/fr/texts.json5 @@ -0,0 +1,52 @@ +{ + "app": { + "farewellMessage": "Au revoir et merci d'avoir utilisé notre application !", + "loginPrompt": "Veuillez vous connecter pour continuer.", + "logoutButton": "Déconnectez-vous", + "title": "Ma candidature", + "welcomeMessage": "Bienvenue, {user_name} !" + }, + "authentication": { + "alreadyHaveAccount": "Vous avez déjà un compte ? Se connecter", + "emailPlaceholder": "Entrez votre e-mail", + "passwordPlaceholder": "Entrez votre mot de passe", + "passwordReset": "Réinitialisez votre mot de passe", + "rememberMe": "Souvenez-vous de moi", + "signUp": "INSCRIVEZ-VOUS" + }, + "contact": { + "aboutUs": "À propos de nous", + "us": "Nous contacter" + }, + "errors": { + "message": "Quelque chose s'est mal passé. Veuillez réessayer.", + "networkError": "Vérifiez votre connexion Internet et réessayez." + }, + "feedback": { + "prompt": "Dites-nous ce que vous pensez de l'application !", + "submitFeedback": "Soumettre des commentaires" + }, + "gender": { + "choice": { + "female": "C'est ton amie.", + "male": "C'est ton ami.", + "other": "Ce sont tes amis." + } + }, + "messages": { + "pluralMessage": "Vous avez de ${count} nouveaux messages" + }, + "profile": { + "editProfile": "Modifier le profil", + "pageTitle": "Votre profil" + }, + "settings": { + "disableNotifications": "Désactiver les notifications", + "enableNotifications": "Activer les notifications", + "languageSelectLabel": "Choisissez votre langue :", + "notificationsLabel": "Les notifications", + "privacyPolicy": "Politique de confidentialité", + "termsOfService": "Conditions générales d'utilisation", + "title": "Réglages" + } +} diff --git a/tests/fixtures/file-types-metafile/file03-neon/en/plain.neon b/tests/fixtures/file-types-metafile/file03-neon/en/plain.neon new file mode 100644 index 0000000..0154ac1 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file03-neon/en/plain.neon @@ -0,0 +1,5 @@ +{ + "datePickerMinuteOne": "1 minute", + "datePickerMinuteOther": "%minute minutes", + "singleString": "This is just a normal string." +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file03-neon/es/plain.neon b/tests/fixtures/file-types-metafile/file03-neon/es/plain.neon new file mode 100644 index 0000000..f22251c --- /dev/null +++ b/tests/fixtures/file-types-metafile/file03-neon/es/plain.neon @@ -0,0 +1,5 @@ +{ + "datePickerMinuteOne": "1 minuto", + "datePickerMinuteOther": "%mminuto 5 minutos", + "singleString": "Esta es solo una cadena normal." +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file03-neon/fr/plain.neon b/tests/fixtures/file-types-metafile/file03-neon/fr/plain.neon new file mode 100644 index 0000000..b5a8207 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file03-neon/fr/plain.neon @@ -0,0 +1,5 @@ +{ + "datePickerMinuteOne": "1 minute", + "datePickerMinuteOther": "%m5 minutes", + "singleString": "Il s'agit simplement d'une chaîne normale." +} \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file04-yaml/en/plain.yaml b/tests/fixtures/file-types-metafile/file04-yaml/en/plain.yaml new file mode 100644 index 0000000..54bfaa0 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file04-yaml/en/plain.yaml @@ -0,0 +1,35 @@ +--- +about_us: "About Us" +already_have_account: "Already have an account? Log In" +app_title: "My Application" +contact_us: "Contact Us" +disable_notifications: "Disable Notifications" +edit_profile: "Edit Profile" +email_placeholder: "Enter your email" +enable_notifications: "Enable Notifications" +error_message: "Something went wrong. Please try again." +farewell_message: "Goodbye and thank you for using our app!" +feedback_prompt: "Tell us what you think about the app!" +gender_choice: + female: "She is your friend." + male: "He is your friend." + other: "They are your friend." +language_select_label: "Choose your language:" +login_prompt: "Please log in to continue." +logout_button: "Log Out" +network_error: "Please check your internet connection and try again." +notifications_label: "Notifications" +password_placeholder: "Enter your password" +password_reset: "Reset your password" +plural_message: + zero: "You have no new messages" + one: "You have one new message" + other: "You have {count} new messages" +privacy_policy: "Privacy Policy" +profile_page_title: "Your Profile" +remember_me: "Remember Me" +settings: "Settings" +sign_up: "Sign Up" +submit_feedback: "Submit Feedback" +terms_of_service: "Terms of Service" +welcome_message: "Welcome, {user_name}!" diff --git a/tests/fixtures/file-types-metafile/file04-yaml/es/plain.yaml b/tests/fixtures/file-types-metafile/file04-yaml/es/plain.yaml new file mode 100644 index 0000000..56b2605 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file04-yaml/es/plain.yaml @@ -0,0 +1,34 @@ +--- +about_us: "Acerca de nosotros" +already_have_account: "¿Ya tienes una cuenta? Iniciar sesión" +app_title: "Mi solicitud" +contact_us: "Póngase en contacto con nosotros" +disable_notifications: "Desactivar las notificaciones" +edit_profile: "Editar perfil" +email_placeholder: "Introduce tu correo electrónico" +enable_notifications: "Habilitar notificaciones" +error_message: "Algo salió mal. Por favor, inténtelo de nuevo." +farewell_message: "¡Adiós y gracias por usar nuestra aplicación!" +feedback_prompt: "¡Cuéntanos lo que piensas de la aplicación!" +gender_choice: + female: "Es tu amiga." + male: "Es tu amigo." + other: "Son tus amigos." +language_select_label: "Elige tu idioma:" +login_prompt: "Inicie sesión para continuar." +logout_button: "Cerrar sesión" +network_error: "Comprueba tu conexión a Internet e inténtalo de nuevo." +notifications_label: "Notificaciones" +password_placeholder: "Introduce tu contraseña" +password_reset: "Restablecer la contraseña" +plural_message: + one: "Tienes un mensaje nuevo" + other: "Tienes mensajes {count} nuevos" +privacy_policy: "Política de privacidad" +profile_page_title: "Tu perfil" +remember_me: "Recuérdame" +settings: "Ajustes" +sign_up: "Inscríbase" +submit_feedback: "Enviar comentarios" +terms_of_service: "Términos de servicio" +welcome_message: "¡Bienvenido,{user_name}!" diff --git a/tests/fixtures/file-types-metafile/file04-yaml/fr/plain.yaml b/tests/fixtures/file-types-metafile/file04-yaml/fr/plain.yaml new file mode 100644 index 0000000..3f420de --- /dev/null +++ b/tests/fixtures/file-types-metafile/file04-yaml/fr/plain.yaml @@ -0,0 +1,34 @@ +--- +about_us: "À propos de nous" +already_have_account: "Vous avez déjà un compte\_? Se connecter" +app_title: "Ma candidature" +contact_us: "Nous contacter" +disable_notifications: "Désactiver les notifications" +edit_profile: "Modifier le profil" +email_placeholder: "Entrez votre e-mail" +enable_notifications: "Activer les notifications" +error_message: "Quelque chose s'est mal passé. Veuillez réessayer." +farewell_message: "Au revoir et merci d'avoir utilisé notre application\_!" +feedback_prompt: "Dites-nous ce que vous pensez de l'application\_!" +gender_choice: + female: "C'est ton amie." + male: "C'est ton ami." + other: "Ce sont tes amis." +language_select_label: "Choisissez votre langue\_:" +login_prompt: "Veuillez vous connecter pour continuer." +logout_button: "Déconnectez-vous" +network_error: "Vérifiez votre connexion Internet et réessayez." +notifications_label: "Les notifications" +password_placeholder: "Entrez votre mot de passe" +password_reset: "Réinitialisez votre mot de passe" +plural_message: + one: "Vous avez un nouveau message" + other: "Vous avez de {count} nouveaux messages" +privacy_policy: "Politique de confidentialité" +profile_page_title: "Votre profil" +remember_me: "Souvenez-vous de moi" +settings: "Réglages" +sign_up: "INSCRIVEZ-VOUS" +submit_feedback: "Soumettre des commentaires" +terms_of_service: "Conditions générales d'utilisation" +welcome_message: "Bienvenue, {user_name}\_!" diff --git a/tests/fixtures/file-types-metafile/file05-xml/en/resources.xml b/tests/fixtures/file-types-metafile/file05-xml/en/resources.xml new file mode 100644 index 0000000..c3d65ba --- /dev/null +++ b/tests/fixtures/file-types-metafile/file05-xml/en/resources.xml @@ -0,0 +1,33 @@ + + + "About Us" + "Already have an account? Log In" + "My Application" + "Contact Us" + "Disable Notifications" + "Edit Profile" + "Enter your email" + "Enable Notifications" + "Something went wrong. Please try again." + "Goodbye and thank you for using our app!" + "Tell us what you think about the app!" + "She is your friend." + "He is your friend." + "They are your friend." + "Choose your language:" + "Please log in to continue." + "Log Out" + "Please check your internet connection and try again." + "Notifications" + "Enter your password" + "Reset your password" + "You have %1$d new messages" + "Privacy Policy" + "Your Profile" + "Remember Me" + "Settings" + "Sign Up" + "Submit Feedback" + "Terms of Service" + "Welcome, %1$s!" + \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file05-xml/es/resources.xml b/tests/fixtures/file-types-metafile/file05-xml/es/resources.xml new file mode 100644 index 0000000..105bb4c --- /dev/null +++ b/tests/fixtures/file-types-metafile/file05-xml/es/resources.xml @@ -0,0 +1,33 @@ + + + "Acerca de nosotros" + "¿Ya tienes una cuenta? Iniciar sesión" + "Mi solicitud" + "Póngase en contacto con nosotros" + "Desactivar las notificaciones" + "Editar perfil" + "Introduce tu correo electrónico" + "Habilitar notificaciones" + "Algo salió mal. Por favor, inténtelo de nuevo." + "¡Adiós y gracias por usar nuestra aplicación!" + "¡Cuéntanos lo que piensas de la aplicación!" + "Es tu amiga." + "Es tu amigo." + "Son tus amigos." + "Elige tu idioma:" + "Inicie sesión para continuar." + "Cerrar sesión" + "Comprueba tu conexión a Internet e inténtalo de nuevo." + "Notificaciones" + "Introduce tu contraseña" + "Restablecer la contraseña" + "Tienes mensajes %1$d nuevos" + "Política de privacidad" + "Tu perfil" + "Recuérdame" + "Ajustes" + "Inscríbase" + "Enviar comentarios" + "Términos de servicio" + "¡Bienvenido,%1$s!" + \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file05-xml/fr/resources.xml b/tests/fixtures/file-types-metafile/file05-xml/fr/resources.xml new file mode 100644 index 0000000..a8ff0b1 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file05-xml/fr/resources.xml @@ -0,0 +1,33 @@ + + + "À propos de nous" + "Vous avez déjà un compte ? Se connecter" + "Ma candidature" + "Nous contacter" + "Désactiver les notifications" + "Modifier le profil" + "Entrez votre e-mail" + "Activer les notifications" + "Quelque chose s\'est mal passé. Veuillez réessayer." + "Au revoir et merci d\'avoir utilisé notre application !" + "Dites-nous ce que vous pensez de l\'application !" + "C\'est ton amie." + "C\'est ton ami." + "Ce sont tes amis." + "Choisissez votre langue :" + "Veuillez vous connecter pour continuer." + "Déconnectez-vous" + "Vérifiez votre connexion Internet et réessayez." + "Les notifications" + "Entrez votre mot de passe" + "Réinitialisez votre mot de passe" + "Vous avez de %1$d nouveaux messages" + "Politique de confidentialité" + "Votre profil" + "Souvenez-vous de moi" + "Réglages" + "INSCRIVEZ-VOUS" + "Soumettre des commentaires" + "Conditions générales d\'utilisation" + "Bienvenue, %1$s !" + \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file06-srt/en/subtitles.srt b/tests/fixtures/file-types-metafile/file06-srt/en/subtitles.srt new file mode 100644 index 0000000..6c135db --- /dev/null +++ b/tests/fixtures/file-types-metafile/file06-srt/en/subtitles.srt @@ -0,0 +1,30 @@ +1 +00:00:01,000 --> 00:00:03,000 +Welcome to our presentation. + +2 +00:00:05,000 --> 00:00:10,000 +Today we will discuss the importance +of localization in software development. + +3 +00:00:15,000 --> 00:00:20,000 +Localization ensures that your application +is accessible to a global audience. + +4 +00:00:22,000 --> 00:00:25,000 +We will cover topics like cultural nuances, + +5 +00:00:25,200 --> 00:00:27,000 +date and time formats, + +6 +00:00:27,200 --> 00:00:29,000 +and text directionality. + +7 +00:00:32,000 --> 00:00:35,000 +Thank you for joining us! + diff --git a/tests/fixtures/file-types-metafile/file06-srt/es/subtitles.srt b/tests/fixtures/file-types-metafile/file06-srt/es/subtitles.srt new file mode 100644 index 0000000..43a3fc3 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file06-srt/es/subtitles.srt @@ -0,0 +1,30 @@ +1 +00:00:01,000 --> 00:00:03,000 +Bienvenido a nuestra presentaci?n. + +2 +00:00:05,000 --> 00:00:10,000 +Hoy vamos a hablar de la importancia +de la localizaci?n en el desarrollo de software. + +3 +00:00:15,000 --> 00:00:20,000 +La localizaci?n garantiza que su aplicaci?n +es accesible para una audiencia global. + +4 +00:00:22,000 --> 00:00:25,000 +Cubriremos temas como los matices culturales, + +5 +00:00:25,200 --> 00:00:27,000 +formatos de fecha y hora, + +6 +00:00:27,200 --> 00:00:29,000 +y direccionalidad del texto. + +7 +00:00:32,000 --> 00:00:35,000 +?Gracias por acompa?arnos! + diff --git a/tests/fixtures/file-types-metafile/file06-srt/fr/subtitles.srt b/tests/fixtures/file-types-metafile/file06-srt/fr/subtitles.srt new file mode 100644 index 0000000..054753a --- /dev/null +++ b/tests/fixtures/file-types-metafile/file06-srt/fr/subtitles.srt @@ -0,0 +1,30 @@ +1 +00:00:01,000 --> 00:00:03,000 +Bienvenue ? notre pr?sentation. + +2 +00:00:05,000 --> 00:00:10,000 +Aujourd'hui, nous discuterons de l'importance +de la localisation dans le d?veloppement de logiciels. + +3 +00:00:15,000 --> 00:00:20,000 +La localisation garantit que votre application +est accessible ? un public mondial. + +4 +00:00:22,000 --> 00:00:25,000 +Nous aborderons des sujets tels que les nuances culturelles, + +5 +00:00:25,200 --> 00:00:27,000 +formats de date et d'heure, + +6 +00:00:27,200 --> 00:00:29,000 +et la directionnalit? du texte. + +7 +00:00:32,000 --> 00:00:35,000 +Merci de vous joindre ? nous?! + diff --git a/tests/fixtures/file-types-metafile/file07-ini/en/plain.ini b/tests/fixtures/file-types-metafile/file07-ini/en/plain.ini new file mode 100644 index 0000000..6260d6d --- /dev/null +++ b/tests/fixtures/file-types-metafile/file07-ini/en/plain.ini @@ -0,0 +1,29 @@ +about_us = About Us +already_have_account = Already have an account? Log In +app_title = My Application +contact_us = Contact Us +disable_notifications = Disable Notifications +edit_profile = Edit Profile +email_placeholder = Enter your email +enable_notifications = Enable Notifications +error_message = Something went wrong. Please try again. +farewell_message = Goodbye and thank you for using our app! +feedback_prompt = Tell us what you think about the app! +gender_choice = They are your friend. +language_select_label = Choose your language\: +login_prompt = Please log in to continue. +logout_button = Log Out +network_error = Please check your internet connection and try again. +notifications_label = Notifications +password_placeholder = Enter your password +password_reset = Reset your password +plural_message = You have {count} new messages +privacy_policy = Privacy Policy +profile_page_title = Your Profile +remember_me = Remember Me +settings = Settings +sign_up = Sign Up +submit_feedback = Submit Feedback +terms_of_service = Terms of Service +welcome_message = Welcome, {user_name}! + diff --git a/tests/fixtures/file-types-metafile/file07-ini/es/plain.ini b/tests/fixtures/file-types-metafile/file07-ini/es/plain.ini new file mode 100644 index 0000000..8a48d5e --- /dev/null +++ b/tests/fixtures/file-types-metafile/file07-ini/es/plain.ini @@ -0,0 +1,29 @@ +about_us = Acerca de nosotros +already_have_account = ¿Ya tienes una cuenta? Iniciar sesión +app_title = Mi solicitud +contact_us = Póngase en contacto con nosotros +disable_notifications = Desactivar las notificaciones +edit_profile = Editar perfil +email_placeholder = Introduce tu correo electrónico +enable_notifications = Habilitar notificaciones +error_message = Algo salió mal. Por favor, inténtelo de nuevo. +farewell_message = ¡Adiós y gracias por usar nuestra aplicación! +feedback_prompt = ¡Cuéntanos lo que piensas de la aplicación! +gender_choice = Son tus amigos. +language_select_label = Elige tu idioma\: +login_prompt = Inicie sesión para continuar. +logout_button = Cerrar sesión +network_error = Comprueba tu conexión a Internet e inténtalo de nuevo. +notifications_label = Notificaciones +password_placeholder = Introduce tu contraseña +password_reset = Restablecer la contraseña +plural_message = Tienes mensajes {count} nuevos +privacy_policy = Política de privacidad +profile_page_title = Tu perfil +remember_me = Recuérdame +settings = Ajustes +sign_up = Inscríbase +submit_feedback = Enviar comentarios +terms_of_service = Términos de servicio +welcome_message = ¡Bienvenido,{user_name}! + diff --git a/tests/fixtures/file-types-metafile/file07-ini/fr/plain.ini b/tests/fixtures/file-types-metafile/file07-ini/fr/plain.ini new file mode 100644 index 0000000..3b7ed57 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file07-ini/fr/plain.ini @@ -0,0 +1,29 @@ +about_us = À propos de nous +already_have_account = Vous avez déjà un compte ? Se connecter +app_title = Ma candidature +contact_us = Nous contacter +disable_notifications = Désactiver les notifications +edit_profile = Modifier le profil +email_placeholder = Entrez votre e-mail +enable_notifications = Activer les notifications +error_message = Quelque chose s\'est mal passé. Veuillez réessayer. +farewell_message = Au revoir et merci d\'avoir utilisé notre application ! +feedback_prompt = Dites-nous ce que vous pensez de l\'application ! +gender_choice = Ce sont tes amis. +language_select_label = Choisissez votre langue \: +login_prompt = Veuillez vous connecter pour continuer. +logout_button = Déconnectez-vous +network_error = Vérifiez votre connexion Internet et réessayez. +notifications_label = Les notifications +password_placeholder = Entrez votre mot de passe +password_reset = Réinitialisez votre mot de passe +plural_message = Vous avez de {count} nouveaux messages +privacy_policy = Politique de confidentialité +profile_page_title = Votre profil +remember_me = Souvenez-vous de moi +settings = Réglages +sign_up = INSCRIVEZ-VOUS +submit_feedback = Soumettre des commentaires +terms_of_service = Conditions générales d\'utilisation +welcome_message = Bienvenue, {user_name} ! + diff --git a/tests/fixtures/file-types-metafile/file08-strings/en/Localizable.strings b/tests/fixtures/file-types-metafile/file08-strings/en/Localizable.strings new file mode 100644 index 0000000..989e4ca --- /dev/null +++ b/tests/fixtures/file-types-metafile/file08-strings/en/Localizable.strings @@ -0,0 +1,32 @@ +"About Us" = "About Us"; +"Already have an account? Log In" = "Already have an account? Log In"; +"Choose your language:" = "Choose your language:"; +"Contact Us" = "Contact Us"; +"Disable Notifications" = "Disable Notifications"; +"Edit Profile" = "Edit Profile"; +"Enable Notifications" = "Enable Notifications"; +"Enter your email" = "Enter your email"; +"Enter your password" = "Enter your password"; +"Goodbye and thank you for using our app!" = "Goodbye and thank you for using our app!"; +"He is your friend." = "He is your friend."; +"Log Out" = "Log Out"; +"My Application" = "My Application"; +"Notifications" = "Notifications"; +"Please check your internet connection and try again." = "Please check your internet connection and try again."; +"Please log in to continue." = "Please log in to continue."; +"Privacy Policy" = "Privacy Policy"; +"Remember Me" = "Remember Me"; +"Reset your password" = "Reset your password"; +"Settings" = "Settings"; +"She is your friend." = "She is your friend."; +"Sign Up" = "Sign Up"; +"Something went wrong. Please try again." = "Something went wrong. Please try again."; +"Submit Feedback" = "Submit Feedback"; +"Tell us what you think about the app!" = "Tell us what you think about the app!"; +"Terms of Service" = "Terms of Service"; +"They are your friend." = "They are your friend."; +"Welcome, %@!" = "Welcome, %@!"; +"You have %d new messages" = "You have %d new messages"; +"You have no new messages" = "You have no new messages"; +"You have one new message" = "You have one new message"; +"Your Profile" = "Your Profile"; diff --git a/tests/fixtures/file-types-metafile/file08-strings/es/Localizable.strings b/tests/fixtures/file-types-metafile/file08-strings/es/Localizable.strings new file mode 100644 index 0000000..b312717 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file08-strings/es/Localizable.strings @@ -0,0 +1,32 @@ +"About Us" = "Acerca de nosotros"; +"Already have an account? Log In" = "¿Ya tienes una cuenta? Iniciar sesión"; +"Choose your language:" = "Elige tu idioma:"; +"Contact Us" = "Póngase en contacto con nosotros"; +"Disable Notifications" = "Desactivar las notificaciones"; +"Edit Profile" = "Editar perfil"; +"Enable Notifications" = "Habilitar notificaciones"; +"Enter your email" = "Introduce tu correo electrónico"; +"Enter your password" = "Introduce tu contraseña"; +"Goodbye and thank you for using our app!" = "¡Adiós y gracias por usar nuestra aplicación!"; +"He is your friend." = "Es tu amigo."; +"Log Out" = "Cerrar sesión"; +"My Application" = "Mi solicitud"; +"Notifications" = "Notificaciones"; +"Please check your internet connection and try again." = "Comprueba tu conexión a Internet e inténtalo de nuevo."; +"Please log in to continue." = "Inicie sesión para continuar."; +"Privacy Policy" = "Política de privacidad"; +"Remember Me" = "Recuérdame"; +"Reset your password" = "Restablecer la contraseña"; +"Settings" = "Ajustes"; +"She is your friend." = "Es tu amiga."; +"Sign Up" = "Inscríbase"; +"Something went wrong. Please try again." = "Algo salió mal. Por favor, inténtelo de nuevo."; +"Submit Feedback" = "Enviar comentarios"; +"Tell us what you think about the app!" = "¡Cuéntanos lo que piensas de la aplicación!"; +"Terms of Service" = "Términos de servicio"; +"They are your friend." = "Son tus amigos."; +"Welcome, %@!" = "¡Bienvenido,%@!"; +"You have %d new messages" = "Tienes mensajes %d nuevos"; +"You have no new messages" = "No tienes mensajes nuevos"; +"You have one new message" = "Tienes un mensaje nuevo"; +"Your Profile" = "Tu perfil"; diff --git a/tests/fixtures/file-types-metafile/file08-strings/fr/Localizable.strings b/tests/fixtures/file-types-metafile/file08-strings/fr/Localizable.strings new file mode 100644 index 0000000..ba6ee1a --- /dev/null +++ b/tests/fixtures/file-types-metafile/file08-strings/fr/Localizable.strings @@ -0,0 +1,32 @@ +"About Us" = "À propos de nous"; +"Already have an account? Log In" = "Vous avez déjà un compte ? Se connecter"; +"Choose your language:" = "Choisissez votre langue :"; +"Contact Us" = "Nous contacter"; +"Disable Notifications" = "Désactiver les notifications"; +"Edit Profile" = "Modifier le profil"; +"Enable Notifications" = "Activer les notifications"; +"Enter your email" = "Entrez votre e-mail"; +"Enter your password" = "Entrez votre mot de passe"; +"Goodbye and thank you for using our app!" = "Au revoir et merci d'avoir utilisé notre application !"; +"He is your friend." = "C'est ton ami."; +"Log Out" = "Déconnectez-vous"; +"My Application" = "Ma candidature"; +"Notifications" = "Les notifications"; +"Please check your internet connection and try again." = "Vérifiez votre connexion Internet et réessayez."; +"Please log in to continue." = "Veuillez vous connecter pour continuer."; +"Privacy Policy" = "Politique de confidentialité"; +"Remember Me" = "Souvenez-vous de moi"; +"Reset your password" = "Réinitialisez votre mot de passe"; +"Settings" = "Réglages"; +"She is your friend." = "C'est ton amie."; +"Sign Up" = "INSCRIVEZ-VOUS"; +"Something went wrong. Please try again." = "Quelque chose s'est mal passé. Veuillez réessayer."; +"Submit Feedback" = "Soumettre des commentaires"; +"Tell us what you think about the app!" = "Dites-nous ce que vous pensez de l'application !"; +"Terms of Service" = "Conditions générales d'utilisation"; +"They are your friend." = "Ce sont tes amis."; +"Welcome, %@!" = "Bienvenue, %@ !"; +"You have %d new messages" = "Vous avez de %d nouveaux messages"; +"You have no new messages" = "Vous n'avez aucun nouveau message"; +"You have one new message" = "Vous avez un nouveau message"; +"Your Profile" = "Votre profil"; diff --git a/tests/fixtures/file-types-metafile/file09-toml/en/file.toml b/tests/fixtures/file-types-metafile/file09-toml/en/file.toml new file mode 100644 index 0000000..eb138d9 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file09-toml/en/file.toml @@ -0,0 +1,35 @@ +[app] +about_us = "About Us" +already_have_account = "Already have an account? Log In!" +contact_us = "Contact Us" +disable_notifications = "Disable Notifications" +edit_profile = "Edit Profile" +email_placeholder = "Enter your email" +enable_notifications = "Enable Notifications" +error_message = "Something went wrong. Please try again." +farewell_message = "Goodbye and thank you for using our app!" +feedback_prompt = "Tell us what you think about the app!" +language_select_label = "Choose your language:" +login_prompt = "Please log in to continue." +logout_button = "Log Out" +network_error = "Please check your internet connection and try again." +notifications_label = "Notifications" +password_placeholder = "Enter your password" +password_reset = "Reset your password" +privacy_policy = "Privacy Policy" +profile_page_title = "Your Profile" +remember_me = "Remember Me" +settings = "Settings" +sign_up = "Sign Up" +submit_feedback = "Submit Feedback" +terms_of_service = "Terms of Service" +title = "My Application" +welcome_message = "Welcome, {user_name}!" +[gender] +choice_female = "She is your friend." +choice_male = "He is your friend." +choice_other = "They are your friend." +[messages] +plural_one = "You have one new message" +plural_other = "You have {count} new messages" +plural_zero = "You have no new messages" diff --git a/tests/fixtures/file-types-metafile/file09-toml/es/file.toml b/tests/fixtures/file-types-metafile/file09-toml/es/file.toml new file mode 100644 index 0000000..d4475a2 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file09-toml/es/file.toml @@ -0,0 +1,35 @@ +[app] +about_us = "Acerca de nosotros" +already_have_account = "¿Ya tienes una cuenta? ¡Inicia sesión!" +contact_us = "Póngase en contacto con nosotros" +disable_notifications = "Desactivar las notificaciones" +edit_profile = "Editar perfil" +email_placeholder = "Introduce tu correo electrónico" +enable_notifications = "Habilitar notificaciones" +error_message = "Algo salió mal. Por favor, inténtelo de nuevo." +farewell_message = "¡Adiós y gracias por usar nuestra aplicación!" +feedback_prompt = "¡Cuéntanos lo que piensas de la aplicación!" +language_select_label = "Elige tu idioma:" +login_prompt = "Inicie sesión para continuar." +logout_button = "Cerrar sesión" +network_error = "Comprueba tu conexión a Internet e inténtalo de nuevo." +notifications_label = "Notificaciones" +password_placeholder = "Introduce tu contraseña" +password_reset = "Restablecer la contraseña" +privacy_policy = "Política de privacidad" +profile_page_title = "Tu perfil" +remember_me = "Recuérdame" +settings = "Ajustes" +sign_up = "Inscríbase" +submit_feedback = "Enviar comentarios" +terms_of_service = "Términos de servicio" +title = "Mi solicitud" +welcome_message = "¡Bienvenido,{user_name}!" +[gender] +choice_female = "Es tu amiga." +choice_male = "Es tu amigo." +choice_other = "Son tus amigos." +[messages] +plural_one = "Tienes un mensaje nuevo" +plural_other = "Tienes mensajes {count} nuevos" +plural_zero = "No tienes mensajes nuevos" diff --git a/tests/fixtures/file-types-metafile/file09-toml/fr/file.toml b/tests/fixtures/file-types-metafile/file09-toml/fr/file.toml new file mode 100644 index 0000000..90ea1bd --- /dev/null +++ b/tests/fixtures/file-types-metafile/file09-toml/fr/file.toml @@ -0,0 +1,35 @@ +[app] +about_us = "À propos de nous" +already_have_account = "Vous avez déjà un compte ? Connectez-vous !" +contact_us = "Nous contacter" +disable_notifications = "Désactiver les notifications" +edit_profile = "Modifier le profil" +email_placeholder = "Entrez votre e-mail" +enable_notifications = "Activer les notifications" +error_message = "Quelque chose s'est mal passé. Veuillez réessayer." +farewell_message = "Au revoir et merci d'avoir utilisé notre application !" +feedback_prompt = "Dites-nous ce que vous pensez de l'application !" +language_select_label = "Choisissez votre langue :" +login_prompt = "Veuillez vous connecter pour continuer." +logout_button = "Déconnectez-vous" +network_error = "Vérifiez votre connexion Internet et réessayez." +notifications_label = "Les notifications" +password_placeholder = "Entrez votre mot de passe" +password_reset = "Réinitialisez votre mot de passe" +privacy_policy = "Politique de confidentialité" +profile_page_title = "Votre profil" +remember_me = "Souvenez-vous de moi" +settings = "Réglages" +sign_up = "INSCRIVEZ-VOUS" +submit_feedback = "Soumettre des commentaires" +terms_of_service = "Conditions générales d'utilisation" +title = "Ma candidature" +welcome_message = "Bienvenue, {user_name} !" +[gender] +choice_female = "C'est ton amie." +choice_male = "C'est ton ami." +choice_other = "Ce sont tes amis." +[messages] +plural_one = "Vous avez un nouveau message" +plural_other = "Vous avez de {count} nouveaux messages" +plural_zero = "Vous n'avez aucun nouveau message" diff --git a/tests/fixtures/file-types-metafile/file10-resx/en/resources.resx b/tests/fixtures/file-types-metafile/file10-resx/en/resources.resx new file mode 100644 index 0000000..c1eade7 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file10-resx/en/resources.resx @@ -0,0 +1,110 @@ + + +text/microsoft-resx + + +2.0 + + +System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + +System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + +About Us + + +Already have an account? Log In + + +My Application + + +Contact Us + + +Disable Notifications + + +Edit Profile + + +Enter your email + + +Enable Notifications + + +Something went wrong. Please try again. + + +Goodbye and thank you for using our app! + + +Tell us what you think about the app! + + +She is your friend. + + +He is your friend. + + +They are your friend. + + +Choose your language: + + +Please log in to continue. + + +Log Out + + +Please check your internet connection and try again. + + +Notifications + + +Enter your password + + +Reset your password + + +You have one new message + + +You have {count} new messages + + +You have no new messages + + +Privacy Policy + + +Your Profile + + +Remember Me + + +Settings + + +Sign Up + + +Submit Feedback + + +Terms of Service + + +Welcome, {user_name}! + + diff --git a/tests/fixtures/file-types-metafile/file10-resx/es/resources.resx b/tests/fixtures/file-types-metafile/file10-resx/es/resources.resx new file mode 100644 index 0000000..85b3983 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file10-resx/es/resources.resx @@ -0,0 +1,110 @@ + + +text/microsoft-resx + + +2.0 + + +System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + +System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + +Acerca de nosotros + + +¿Ya tienes una cuenta? Iniciar sesión + + +Mi solicitud + + +Póngase en contacto con nosotros + + +Desactivar las notificaciones + + +Editar perfil + + +Introduce tu correo electrónico + + +Habilitar notificaciones + + +Algo salió mal. Por favor, inténtelo de nuevo. + + +¡Adiós y gracias por usar nuestra aplicación! + + +¡Cuéntanos lo que piensas de la aplicación! + + +Es tu amiga. + + +Es tu amigo. + + +Son tus amigos. + + +Elige tu idioma: + + +Inicie sesión para continuar. + + +Cerrar sesión + + +Comprueba tu conexión a Internet e inténtalo de nuevo. + + +Notificaciones + + +Introduce tu contraseña + + +Restablecer la contraseña + + +Tienes un mensaje nuevo + + +Tienes mensajes {count} nuevos + + +No tienes mensajes nuevos + + +Política de privacidad + + +Tu perfil + + +Recuérdame + + +Ajustes + + +Inscríbase + + +Enviar comentarios + + +Términos de servicio + + +¡Bienvenido,{user_name}! + + diff --git a/tests/fixtures/file-types-metafile/file10-resx/fr/resources.resx b/tests/fixtures/file-types-metafile/file10-resx/fr/resources.resx new file mode 100644 index 0000000..afb94d8 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file10-resx/fr/resources.resx @@ -0,0 +1,110 @@ + + +text/microsoft-resx + + +2.0 + + +System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + +System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + +À propos de nous + + +Vous avez déjà un compte ? Se connecter + + +Ma candidature + + +Nous contacter + + +Désactiver les notifications + + +Modifier le profil + + +Entrez votre e-mail + + +Activer les notifications + + +Quelque chose s'est mal passé. Veuillez réessayer. + + +Au revoir et merci d'avoir utilisé notre application ! + + +Dites-nous ce que vous pensez de l'application ! + + +C'est ton amie. + + +C'est ton ami. + + +Ce sont tes amis. + + +Choisissez votre langue : + + +Veuillez vous connecter pour continuer. + + +Déconnectez-vous + + +Vérifiez votre connexion Internet et réessayez. + + +Les notifications + + +Entrez votre mot de passe + + +Réinitialisez votre mot de passe + + +Vous avez un nouveau message + + +Vous avez de {count} nouveaux messages + + +Vous n'avez aucun nouveau message + + +Politique de confidentialité + + +Votre profil + + +Souvenez-vous de moi + + +Réglages + + +INSCRIVEZ-VOUS + + +Soumettre des commentaires + + +Conditions générales d'utilisation + + +Bienvenue, {user_name} ! + + diff --git a/tests/fixtures/file-types-metafile/file11-xliff/en/translate.xliff b/tests/fixtures/file-types-metafile/file11-xliff/en/translate.xliff new file mode 100644 index 0000000..eba4d14 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file11-xliff/en/translate.xliff @@ -0,0 +1,30 @@ + + + + +My Application +My Application + + +{GENDER, select, male {He is your friend.} female {She is your friend.} other {They are your friend.}} +{GENDER, select, male {He is your friend.} female {She is your friend.} other {They are your friend.}} + + +Please log in to continue. +Please log in to continue. + + +Log Out +Log Out + + +You have %d new messages +You have %d new messages + + +Welcome, %s! +Welcome, %s! + + + + diff --git a/tests/fixtures/file-types-metafile/file11-xliff/es/translate.xliff b/tests/fixtures/file-types-metafile/file11-xliff/es/translate.xliff new file mode 100644 index 0000000..6bdcc0f --- /dev/null +++ b/tests/fixtures/file-types-metafile/file11-xliff/es/translate.xliff @@ -0,0 +1,30 @@ + + + + +My Application +Mi solicitud + + +{GENDER, select, male {He is your friend.} female {She is your friend.} other {They are your friend.}} +{GÉNERO, selecciona, masculino {Él es tu amigo.} mujer {Ella es tu amiga.} other {Es tu amigo.}} + + +Please log in to continue. +Inicie sesión para continuar. + + +Log Out +Cerrar sesión + + +You have %d new messages +Tienes mensajes %d nuevos + + +Welcome, %s! +¡Bienvenido,%s! + + + + diff --git a/tests/fixtures/file-types-metafile/file11-xliff/fr/translate.xliff b/tests/fixtures/file-types-metafile/file11-xliff/fr/translate.xliff new file mode 100644 index 0000000..f0f4e04 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file11-xliff/fr/translate.xliff @@ -0,0 +1,30 @@ + + + + +My Application +Ma candidature + + +{GENDER, select, male {He is your friend.} female {She is your friend.} other {They are your friend.}} +{GENRE, sélectionné, homme {C'est ton ami.} femme {Elle est ton amie.} autre {Ils sont ton ami.}} + + +Please log in to continue. +Veuillez vous connecter pour continuer. + + +Log Out +Déconnectez-vous + + +You have %d new messages +Vous avez de %d nouveaux messages + + +Welcome, %s! +Bienvenue, %s ! + + + + diff --git a/tests/fixtures/file-types-metafile/file12-properties/en/local.properties b/tests/fixtures/file-types-metafile/file12-properties/en/local.properties new file mode 100644 index 0000000..7081eb2 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file12-properties/en/local.properties @@ -0,0 +1,32 @@ +network_error=Please check your internet connection and try again. +submit_feedback=Submit Feedback +email_placeholder=Enter your email +contact_us=Contact Us +welcome_message=Welcome, {user_name}\! +logout_button=Log Out +language_select_label=Choose your language\: +gender_choice_male=He is your friend. +plural_message_other=You have {count} new messages +about_us=About Us +gender_choice_other=They are your friend. +terms_of_service=Terms of Service +remember_me=Remember Me +farewell_message=Goodbye and thank you for using our app\! +edit_profile=Edit Profile +feedback_prompt=Tell us what you think about the app\! +error_message=Something went wrong. Please try again. +plural_message_one=You have one new message +plural_message_zero=You have no new messages +settings=Settings +password_placeholder=Enter your password +notifications_label=Notifications +password_reset=Reset your password +sign_up=Sign Up +disable_notifications=Disable Notifications +app_title=My Application +already_have_account=Already have an account? Log In +enable_notifications=Enable Notifications +gender_choice_female=She is your friend. +privacy_policy=Privacy Policy +login_prompt=Please log in to continue. +profile_page_title=Your Profile diff --git a/tests/fixtures/file-types-metafile/file12-properties/es/local.properties b/tests/fixtures/file-types-metafile/file12-properties/es/local.properties new file mode 100644 index 0000000..0bf1477 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file12-properties/es/local.properties @@ -0,0 +1,32 @@ +network_error=Comprueba tu conexión a Internet e inténtalo de nuevo. +submit_feedback=Enviar comentarios +email_placeholder=Introduce tu correo electrónico +contact_us=Póngase en contacto con nosotros +welcome_message=¡Bienvenido,{user_name}\! +logout_button=Cerrar sesión +language_select_label=Elige tu idioma\: +gender_choice_male=Es tu amigo. +plural_message_other=Tienes mensajes {count} nuevos +about_us=Acerca de nosotros +gender_choice_other=Son tus amigos. +terms_of_service=Términos de servicio +remember_me=Recuérdame +farewell_message=¡Adiós y gracias por usar nuestra aplicación\! +edit_profile=Editar perfil +feedback_prompt=¡Cuéntanos lo que piensas de la aplicación\! +error_message=Algo salió mal. Por favor, inténtelo de nuevo. +plural_message_one=Tienes un mensaje nuevo +plural_message_zero=No tienes mensajes nuevos +settings=Ajustes +password_placeholder=Introduce tu contraseña +notifications_label=Notificaciones +password_reset=Restablecer la contraseña +sign_up=Inscríbase +disable_notifications=Desactivar las notificaciones +app_title=Mi solicitud +already_have_account=¿Ya tienes una cuenta? Iniciar sesión +enable_notifications=Habilitar notificaciones +gender_choice_female=Es tu amiga. +privacy_policy=Política de privacidad +login_prompt=Inicie sesión para continuar. +profile_page_title=Tu perfil diff --git a/tests/fixtures/file-types-metafile/file12-properties/fr/local.properties b/tests/fixtures/file-types-metafile/file12-properties/fr/local.properties new file mode 100644 index 0000000..fcee2cd --- /dev/null +++ b/tests/fixtures/file-types-metafile/file12-properties/fr/local.properties @@ -0,0 +1,32 @@ +network_error=Vérifiez votre connexion Internet et réessayez. +submit_feedback=Soumettre des commentaires +email_placeholder=Entrez votre e-mail +contact_us=Nous contacter +welcome_message=Bienvenue, {user_name} \! +logout_button=Déconnectez-vous +language_select_label=Choisissez votre langue \: +gender_choice_male=C'est ton ami. +plural_message_other=Vous avez de {count} nouveaux messages +about_us=À propos de nous +gender_choice_other=Ce sont tes amis. +terms_of_service=Conditions générales d'utilisation +remember_me=Souvenez-vous de moi +farewell_message=Au revoir et merci d'avoir utilisé notre application \! +edit_profile=Modifier le profil +feedback_prompt=Dites-nous ce que vous pensez de l'application \! +error_message=Quelque chose s'est mal passé. Veuillez réessayer. +plural_message_one=Vous avez un nouveau message +plural_message_zero=Vous n'avez aucun nouveau message +settings=Réglages +password_placeholder=Entrez votre mot de passe +notifications_label=Les notifications +password_reset=Réinitialisez votre mot de passe +sign_up=INSCRIVEZ-VOUS +disable_notifications=Désactiver les notifications +app_title=Ma candidature +already_have_account=Vous avez déjà un compte ? Se connecter +enable_notifications=Activer les notifications +gender_choice_female=C'est ton amie. +privacy_policy=Politique de confidentialité +login_prompt=Veuillez vous connecter pour continuer. +profile_page_title=Votre profil diff --git a/tests/fixtures/file-types-metafile/file13-csv/en/export.csv b/tests/fixtures/file-types-metafile/file13-csv/en/export.csv new file mode 100644 index 0000000..a7dca1e --- /dev/null +++ b/tests/fixtures/file-types-metafile/file13-csv/en/export.csv @@ -0,0 +1,29 @@ +key,en +about_us,Option to read about the app creators +already_have_account,Prompt for users who already have an account +app_title,The title of the application +contact_us,Option to contact the app creators +disable_notifications,Option to disable notifications +edit_profile,Option to edit user's profile +email_placeholder,Placeholder text for email input field +enable_notifications,Option to enable notifications +error_message,Error message for general errors +farewell_message,Farewell message when the user logs out +feedback_prompt,Prompt message to ask for user's feedback +gender_choice,Generic message for friend without specifying gender +language_select_label,Label for language selection dropdown +login_prompt,Prompt message for the user to log in +logout_button,Label for the logout button +network_error,Error message for network errors +notifications_label,Label for the notifications +password_placeholder,Placeholder text for password input field +password_reset,Option to reset password +plural_message,"Message displaying the number of new messages, with a plural placeholder" +privacy_policy,Link text for privacy policy +profile_page_title,Title for the user's profile page +remember_me,Option for the app to remember the user +settings,Label for the settings option +sign_up,Button text for signing up +submit_feedback,Button text to submit feedback +terms_of_service,Link text for terms of service +welcome_message,Welcome message with placeholder for the user's name diff --git a/tests/fixtures/file-types-metafile/file13-csv/es/export.csv b/tests/fixtures/file-types-metafile/file13-csv/es/export.csv new file mode 100644 index 0000000..8d9c61a --- /dev/null +++ b/tests/fixtures/file-types-metafile/file13-csv/es/export.csv @@ -0,0 +1,29 @@ +key,es +about_us,Opción para leer sobre los creadores de la aplicación +already_have_account,Preguntar a los usuarios que ya tienen una cuenta +app_title,El título de la solicitud +contact_us,Opción de contactar con los creadores de la aplicación +disable_notifications,Opción para deshabilitar las notificaciones +edit_profile,Opción para editar el perfil del usuario +email_placeholder,Texto de marcador de posición para el campo de entrada de correo electrónico +enable_notifications,Opción para habilitar las notificaciones +error_message,Mensaje de error para errores generales +farewell_message,Mensaje de despedida cuando el usuario cierra sesión +feedback_prompt,Mensaje rápido para solicitar la opinión del usuario +gender_choice,Mensaje genérico para un amigo sin especificar el género +language_select_label,Etiqueta para el menú desplegable de selección de idioma +login_prompt,Mensaje para que el usuario inicie sesión +logout_button,Etiqueta para el botón de cierre de sesión +network_error,Mensaje de error para errores de red +notifications_label,Etiqueta para las notificaciones +password_placeholder,Texto de marcador de posición para el campo de entrada de contraseña +password_reset,Opción para restablecer la contraseña +plural_message,"Mensaje que muestra el número de mensajes nuevos, con un marcador de posición plural" +privacy_policy,Texto del enlace a la política de privacidad +profile_page_title,Título de la página de perfil del usuario +remember_me,Opción para que la aplicación recuerde al usuario +settings,Etiqueta para la opción de configuración +sign_up,Texto del botón para registrarse +submit_feedback,Texto del botón para enviar comentarios +terms_of_service,Texto del enlace para ver los términos de servicio +welcome_message,Mensaje de bienvenida con marcador de posición para el nombre del usuario diff --git a/tests/fixtures/file-types-metafile/file13-csv/fr/export.csv b/tests/fixtures/file-types-metafile/file13-csv/fr/export.csv new file mode 100644 index 0000000..50e53f9 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file13-csv/fr/export.csv @@ -0,0 +1,29 @@ +key,fr +about_us,Option pour en savoir plus sur les créateurs de l'application +already_have_account,Invite pour les utilisateurs qui ont déjà un compte +app_title,Le titre de la demande +contact_us,Possibilité de contacter les créateurs de l'application +disable_notifications,Option pour désactiver les notifications +edit_profile,Possibilité de modifier le profil de l'utilisateur +email_placeholder,Texte d'espace réservé pour le champ de saisie de l'e-mail +enable_notifications,Option pour activer les notifications +error_message,Message d'erreur pour les erreurs générales +farewell_message,Message d'adieu lorsque l'utilisateur se déconnecte +feedback_prompt,Message rapide pour demander l'avis de l'utilisateur +gender_choice,Message générique pour un ami sans préciser son sexe +language_select_label,Libellé pour la liste déroulante de sélection de la langue +login_prompt,Message invitant l'utilisateur à se connecter +logout_button,Libellé du bouton de déconnexion +network_error,Message d'erreur en cas d'erreur réseau +notifications_label,Étiquette pour les notifications +password_placeholder,Texte de remplacement pour le champ de saisie du mot de passe +password_reset,Option pour réinitialiser le mot de passe +plural_message,"Message affichant le nombre de nouveaux messages, avec un espace réservé au pluriel" +privacy_policy,Texte du lien pour la politique de confidentialité +profile_page_title,Titre de la page de profil de l'utilisateur +remember_me,Option permettant à l'application de se souvenir de l'utilisateur +settings,Libellé de l'option de configuration +sign_up,Texte du bouton pour s'inscrire +submit_feedback,Texte du bouton pour envoyer des commentaires +terms_of_service,Texte du lien pour les conditions d'utilisation +welcome_message,Message de bienvenue avec espace réservé pour le nom de l'utilisateur diff --git a/tests/fixtures/file-types-metafile/file14-ts/en/resources.ts b/tests/fixtures/file-types-metafile/file14-ts/en/resources.ts new file mode 100644 index 0000000..ef48ee2 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file14-ts/en/resources.ts @@ -0,0 +1,22 @@ + + + +Application + +app_title +My Application + + +gender_choice +%1 is your friend. + + +login_prompt +Please log in to continue. + + +welcome_message +Welcome, %1! + + + diff --git a/tests/fixtures/file-types-metafile/file14-ts/es/resources.ts b/tests/fixtures/file-types-metafile/file14-ts/es/resources.ts new file mode 100644 index 0000000..4560acb --- /dev/null +++ b/tests/fixtures/file-types-metafile/file14-ts/es/resources.ts @@ -0,0 +1,22 @@ + + + +Application + +app_title +Mi solicitud + + +gender_choice +%1 es tu amigo. + + +login_prompt +Inicie sesión para continuar. + + +welcome_message +¡Bienvenido, %1! + + + diff --git a/tests/fixtures/file-types-metafile/file14-ts/fr/resources.ts b/tests/fixtures/file-types-metafile/file14-ts/fr/resources.ts new file mode 100644 index 0000000..7a0d0e0 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file14-ts/fr/resources.ts @@ -0,0 +1,22 @@ + + + +Application + +app_title +Ma candidature + + +gender_choice +%1 est votre ami. + + +login_prompt +Veuillez vous connecter pour continuer. + + +welcome_message +Bienvenue, %1 ! + + + diff --git a/tests/fixtures/file-types-metafile/file15-js/en/default.js b/tests/fixtures/file-types-metafile/file15-js/en/default.js new file mode 100644 index 0000000..ea9f661 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file15-js/en/default.js @@ -0,0 +1,52 @@ +export default { + app: { + appTitle: "My Application", + farewellMessage: "Goodbye and thank you for using our app!", + loginPrompt: "Please log in to continue.", + logoutButton: "Log Out", + welcomeMessage: "Welcome, {user_name}!" + }, + authentication: { + emailPlaceholder: "Enter your email", + passwordPlaceholder: "Enter your password", + passwordReset: "Reset your password", + rememberMe: "Remember Me", + signUp: "Sign Up" + }, + errors: { + errorMessage: "Something went wrong. Please try again.", + networkError: "Please check your internet connection and try again." + }, + feedback: { + feedbackPrompt: "Tell us what you think about the app!", + submitFeedback: "Submit Feedback" + }, + gender: { + genderChoice_female: "She is your friend.", + genderChoice_male: "He is your friend.", + genderChoice_other: "They are your friend." + }, + messages: { + pluralMessage_one: "You have one new message", + pluralMessage_other: "You have {count} new messages", + pluralMessage_zero: "You have no new messages" + }, + misc: { + aboutUs: "About Us", + alreadyHaveAccount: "Already have an account? Log In", + disableNotifications: "Disable Notifications", + enableNotifications: "Enable Notifications" + }, + profile: { + contactUs: "Contact Us", + editProfile: "Edit Profile", + profilePageTitle: "Your Profile" + }, + settings: { + languageSelectLabel: "Choose your language:", + notificationsLabel: "Notifications", + privacyPolicy: "Privacy Policy", + settingsTitle: "Settings", + termsOfService: "Terms of Service" + } +}; diff --git a/tests/fixtures/file-types-metafile/file15-js/es/default.js b/tests/fixtures/file-types-metafile/file15-js/es/default.js new file mode 100644 index 0000000..524c269 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file15-js/es/default.js @@ -0,0 +1,52 @@ +export default { + app: { + appTitle: "Mi solicitud", + farewellMessage: "¡Adiós y gracias por usar nuestra aplicación!", + loginPrompt: "Inicie sesión para continuar.", + logoutButton: "Cerrar sesión", + welcomeMessage: "¡Bienvenido,{user_name}!" + }, + authentication: { + emailPlaceholder: "Introduce tu correo electrónico", + passwordPlaceholder: "Introduce tu contraseña", + passwordReset: "Restablecer la contraseña", + rememberMe: "Recuérdame", + signUp: "Inscríbase" + }, + errors: { + errorMessage: "Algo salió mal. Por favor, inténtelo de nuevo.", + networkError: "Comprueba tu conexión a Internet e inténtalo de nuevo." + }, + feedback: { + feedbackPrompt: "¡Cuéntanos lo que piensas de la aplicación!", + submitFeedback: "Enviar comentarios" + }, + gender: { + genderChoice_female: "Es tu amiga.", + genderChoice_male: "Es tu amigo.", + genderChoice_other: "Son tus amigos." + }, + messages: { + pluralMessage_one: "Tienes un mensaje nuevo", + pluralMessage_other: "Tienes mensajes {count} nuevos", + pluralMessage_zero: "No tienes mensajes nuevos" + }, + misc: { + aboutUs: "Acerca de nosotros", + alreadyHaveAccount: "¿Ya tienes una cuenta? Iniciar sesión", + disableNotifications: "Desactivar las notificaciones", + enableNotifications: "Habilitar notificaciones" + }, + profile: { + contactUs: "Póngase en contacto con nosotros", + editProfile: "Editar perfil", + profilePageTitle: "Tu perfil" + }, + settings: { + languageSelectLabel: "Elige tu idioma:", + notificationsLabel: "Notificaciones", + privacyPolicy: "Política de privacidad", + settingsTitle: "Ajustes", + termsOfService: "Términos de servicio" + } +}; diff --git a/tests/fixtures/file-types-metafile/file15-js/fr/default.js b/tests/fixtures/file-types-metafile/file15-js/fr/default.js new file mode 100644 index 0000000..0a8cc4f --- /dev/null +++ b/tests/fixtures/file-types-metafile/file15-js/fr/default.js @@ -0,0 +1,52 @@ +export default { + app: { + appTitle: "Ma candidature", + farewellMessage: "Au revoir et merci d'avoir utilisé notre application !", + loginPrompt: "Veuillez vous connecter pour continuer.", + logoutButton: "Déconnectez-vous", + welcomeMessage: "Bienvenue, {user_name} !" + }, + authentication: { + emailPlaceholder: "Entrez votre e-mail", + passwordPlaceholder: "Entrez votre mot de passe", + passwordReset: "Réinitialisez votre mot de passe", + rememberMe: "Souvenez-vous de moi", + signUp: "INSCRIVEZ-VOUS" + }, + errors: { + errorMessage: "Quelque chose s'est mal passé. Veuillez réessayer.", + networkError: "Vérifiez votre connexion Internet et réessayez." + }, + feedback: { + feedbackPrompt: "Dites-nous ce que vous pensez de l'application !", + submitFeedback: "Soumettre des commentaires" + }, + gender: { + genderChoice_female: "C'est ton amie.", + genderChoice_male: "C'est ton ami.", + genderChoice_other: "Ce sont tes amis." + }, + messages: { + pluralMessage_one: "Vous avez un nouveau message", + pluralMessage_other: "Vous avez de {count} nouveaux messages", + pluralMessage_zero: "Vous n'avez aucun nouveau message" + }, + misc: { + aboutUs: "À propos de nous", + alreadyHaveAccount: "Vous avez déjà un compte ? Se connecter", + disableNotifications: "Désactiver les notifications", + enableNotifications: "Activer les notifications" + }, + profile: { + contactUs: "Nous contacter", + editProfile: "Modifier le profil", + profilePageTitle: "Votre profil" + }, + settings: { + languageSelectLabel: "Choisissez votre langue :", + notificationsLabel: "Les notifications", + privacyPolicy: "Politique de confidentialité", + settingsTitle: "Réglages", + termsOfService: "Conditions générales d'utilisation" + } +}; diff --git a/tests/fixtures/file-types-metafile/file16-php/en/structured.php b/tests/fixtures/file-types-metafile/file16-php/en/structured.php new file mode 100644 index 0000000..bece500 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file16-php/en/structured.php @@ -0,0 +1,58 @@ + [ + "farewell_message" => "Goodbye and thank you for using our app!", + "login_prompt" => "Please log in to continue.", + "logout_button" => "Log Out", + "title" => "My Application", + "welcome_message" => "Welcome, {user_name}!" + ], + "authentication" => [ + "already_have_account" => "Already have an account? Log In", + "email_placeholder" => "Enter your email", + "password_placeholder" => "Enter your password", + "password_reset" => "Reset your password", + "remember_me" => "Remember Me", + "sign_up" => "Sign Up" + ], + "contact" => [ + "about_us" => "About Us", + "us" => "Contact Us" + ], + "errors" => [ + "message" => "Something went wrong. Please try again.", + "network_error" => "Please check your internet connection and try again." + ], + "feedback" => [ + "prompt" => "Tell us what you think about the app!", + "submit_feedback" => "Submit Feedback" + ], + "gender" => [ + "choice" => [ + "female" => "She is your friend.", + "male" => "He is your friend.", + "other" => "They are your friend." + ] + ], + "messages" => [ + "plural" => [ + "zero" => "You have no new messages", + "one" => "You have one new message", + "other" => "You have {count} new messages" + ] + ], + "profile" => [ + "edit_profile" => "Edit Profile", + "page_title" => "Your Profile" + ], + "settings" => [ + "disable_notifications" => "Disable Notifications", + "enable_notifications" => "Enable Notifications", + "language_select_label" => "Choose your language:", + "notifications_label" => "Notifications", + "privacy_policy" => "Privacy Policy", + "terms_of_service" => "Terms of Service", + "title" => "Settings" + ] +]; +?> \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file16-php/es/structured.php b/tests/fixtures/file-types-metafile/file16-php/es/structured.php new file mode 100644 index 0000000..7a388a4 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file16-php/es/structured.php @@ -0,0 +1,57 @@ + [ + "farewell_message" => "¡Adiós y gracias por usar nuestra aplicación!", + "login_prompt" => "Inicie sesión para continuar.", + "logout_button" => "Cerrar sesión", + "title" => "Mi solicitud", + "welcome_message" => "¡Bienvenido,{user_name}!" + ], + "authentication" => [ + "already_have_account" => "¿Ya tienes una cuenta? Iniciar sesión", + "email_placeholder" => "Introduce tu correo electrónico", + "password_placeholder" => "Introduce tu contraseña", + "password_reset" => "Restablecer la contraseña", + "remember_me" => "Recuérdame", + "sign_up" => "Inscríbase" + ], + "contact" => [ + "about_us" => "Acerca de nosotros", + "us" => "Póngase en contacto con nosotros" + ], + "errors" => [ + "message" => "Algo salió mal. Por favor, inténtelo de nuevo.", + "network_error" => "Comprueba tu conexión a Internet e inténtalo de nuevo." + ], + "feedback" => [ + "prompt" => "¡Cuéntanos lo que piensas de la aplicación!", + "submit_feedback" => "Enviar comentarios" + ], + "gender" => [ + "choice" => [ + "female" => "Es tu amiga.", + "male" => "Es tu amigo.", + "other" => "Son tus amigos." + ] + ], + "messages" => [ + "plural" => [ + "one" => "Tienes un mensaje nuevo", + "other" => "Tienes mensajes {count} nuevos" + ] + ], + "profile" => [ + "edit_profile" => "Editar perfil", + "page_title" => "Tu perfil" + ], + "settings" => [ + "disable_notifications" => "Desactivar las notificaciones", + "enable_notifications" => "Habilitar notificaciones", + "language_select_label" => "Elige tu idioma:", + "notifications_label" => "Notificaciones", + "privacy_policy" => "Política de privacidad", + "terms_of_service" => "Términos de servicio", + "title" => "Ajustes" + ] +]; +?> \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file16-php/fr/structured.php b/tests/fixtures/file-types-metafile/file16-php/fr/structured.php new file mode 100644 index 0000000..20f343d --- /dev/null +++ b/tests/fixtures/file-types-metafile/file16-php/fr/structured.php @@ -0,0 +1,57 @@ + [ + "farewell_message" => "Au revoir et merci d'avoir utilisé notre application !", + "login_prompt" => "Veuillez vous connecter pour continuer.", + "logout_button" => "Déconnectez-vous", + "title" => "Ma candidature", + "welcome_message" => "Bienvenue, {user_name} !" + ], + "authentication" => [ + "already_have_account" => "Vous avez déjà un compte ? Se connecter", + "email_placeholder" => "Entrez votre e-mail", + "password_placeholder" => "Entrez votre mot de passe", + "password_reset" => "Réinitialisez votre mot de passe", + "remember_me" => "Souvenez-vous de moi", + "sign_up" => "INSCRIVEZ-VOUS" + ], + "contact" => [ + "about_us" => "À propos de nous", + "us" => "Nous contacter" + ], + "errors" => [ + "message" => "Quelque chose s'est mal passé. Veuillez réessayer.", + "network_error" => "Vérifiez votre connexion Internet et réessayez." + ], + "feedback" => [ + "prompt" => "Dites-nous ce que vous pensez de l'application !", + "submit_feedback" => "Soumettre des commentaires" + ], + "gender" => [ + "choice" => [ + "female" => "C'est ton amie.", + "male" => "C'est ton ami.", + "other" => "Ce sont tes amis." + ] + ], + "messages" => [ + "plural" => [ + "one" => "Vous avez un nouveau message", + "other" => "Vous avez de {count} nouveaux messages" + ] + ], + "profile" => [ + "edit_profile" => "Modifier le profil", + "page_title" => "Votre profil" + ], + "settings" => [ + "disable_notifications" => "Désactiver les notifications", + "enable_notifications" => "Activer les notifications", + "language_select_label" => "Choisissez votre langue :", + "notifications_label" => "Les notifications", + "privacy_policy" => "Politique de confidentialité", + "terms_of_service" => "Conditions générales d'utilisation", + "title" => "Réglages" + ] +]; +?> \ No newline at end of file diff --git a/tests/fixtures/file-types-metafile/file17-pot/en/messages.pot b/tests/fixtures/file-types-metafile/file17-pot/en/messages.pot new file mode 100644 index 0000000..fbf09b0 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file17-pot/en/messages.pot @@ -0,0 +1,99 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Localazy (https://localazy.com)\n" +"Project-Id-Version: CDN\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" + +msgid "About Us" +msgstr "About Us" + +msgid "Already have an account? Log In" +msgstr "Already have an account? Log In" + +msgid "Choose your language:" +msgstr "Choose your language:" + +msgid "Contact Us" +msgstr "Contact Us" + +msgid "Disable Notifications" +msgstr "Disable Notifications" + +msgid "Edit Profile" +msgstr "Edit Profile" + +msgid "Enable Notifications" +msgstr "Enable Notifications" + +msgid "Enter your email" +msgstr "Enter your email" + +msgid "Enter your password" +msgstr "Enter your password" + +msgid "Goodbye and thank you for using our app!" +msgstr "Goodbye and thank you for using our app!" + +msgctxt "male" +msgid "He is your friend." +msgstr "He is your friend." + +msgid "Log Out" +msgstr "Log Out" + +msgid "My Application" +msgstr "My Application" + +msgid "Notifications" +msgstr "Notifications" + +msgid "Please check your internet connection and try again." +msgstr "Please check your internet connection and try again." + +msgid "Please log in to continue." +msgstr "Please log in to continue." + +msgid "Privacy Policy" +msgstr "Privacy Policy" + +msgid "Remember Me" +msgstr "Remember Me" + +msgid "Reset your password" +msgstr "Reset your password" + +msgid "Settings" +msgstr "Settings" + +msgctxt "female" +msgid "She is your friend." +msgstr "She is your friend." + +msgid "Sign Up" +msgstr "Sign Up" + +msgid "Something went wrong. Please try again." +msgstr "Something went wrong. Please try again." + +msgid "Submit Feedback" +msgstr "Submit Feedback" + +msgid "Tell us what you think about the app!" +msgstr "Tell us what you think about the app!" + +msgid "Terms of Service" +msgstr "Terms of Service" + +msgctxt "other" +msgid "They are your friend." +msgstr "They are your friend." + +msgid "Welcome, {user_name}!" +msgstr "Welcome, {user_name}!" + +msgid "Your Profile" +msgstr "Your Profile" diff --git a/tests/fixtures/file-types-metafile/file17-pot/es/messages.pot b/tests/fixtures/file-types-metafile/file17-pot/es/messages.pot new file mode 100644 index 0000000..f37a101 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file17-pot/es/messages.pot @@ -0,0 +1,99 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Localazy (https://localazy.com)\n" +"Project-Id-Version: CDN\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" + +msgid "About Us" +msgstr "Acerca de nosotros" + +msgid "Already have an account? Log In" +msgstr "¿Ya tienes una cuenta? Iniciar sesión" + +msgid "Choose your language:" +msgstr "Elige tu idioma:" + +msgid "Contact Us" +msgstr "Póngase en contacto con nosotros" + +msgid "Disable Notifications" +msgstr "Desactivar las notificaciones" + +msgid "Edit Profile" +msgstr "Editar perfil" + +msgid "Enable Notifications" +msgstr "Habilitar notificaciones" + +msgid "Enter your email" +msgstr "Introduce tu correo electrónico" + +msgid "Enter your password" +msgstr "Introduce tu contraseña" + +msgid "Goodbye and thank you for using our app!" +msgstr "¡Adiós y gracias por usar nuestra aplicación!" + +msgctxt "male" +msgid "He is your friend." +msgstr "Es tu amigo." + +msgid "Log Out" +msgstr "Cerrar sesión" + +msgid "My Application" +msgstr "Mi solicitud" + +msgid "Notifications" +msgstr "Notificaciones" + +msgid "Please check your internet connection and try again." +msgstr "Comprueba tu conexión a Internet e inténtalo de nuevo." + +msgid "Please log in to continue." +msgstr "Inicie sesión para continuar." + +msgid "Privacy Policy" +msgstr "Política de privacidad" + +msgid "Remember Me" +msgstr "Recuérdame" + +msgid "Reset your password" +msgstr "Restablecer la contraseña" + +msgid "Settings" +msgstr "Ajustes" + +msgctxt "female" +msgid "She is your friend." +msgstr "Es tu amiga." + +msgid "Sign Up" +msgstr "Inscríbase" + +msgid "Something went wrong. Please try again." +msgstr "Algo salió mal. Por favor, inténtelo de nuevo." + +msgid "Submit Feedback" +msgstr "Enviar comentarios" + +msgid "Tell us what you think about the app!" +msgstr "¡Cuéntanos lo que piensas de la aplicación!" + +msgid "Terms of Service" +msgstr "Términos de servicio" + +msgctxt "other" +msgid "They are your friend." +msgstr "Son tus amigos." + +msgid "Welcome, {user_name}!" +msgstr "¡Bienvenido,{user_name}!" + +msgid "Your Profile" +msgstr "Tu perfil" diff --git a/tests/fixtures/file-types-metafile/file17-pot/fr/messages.pot b/tests/fixtures/file-types-metafile/file17-pot/fr/messages.pot new file mode 100644 index 0000000..a4c1ae6 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file17-pot/fr/messages.pot @@ -0,0 +1,99 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Localazy (https://localazy.com)\n" +"Project-Id-Version: CDN\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n==0 || n==1) ? 0 : 1;\n" + +msgid "About Us" +msgstr "À propos de nous" + +msgid "Already have an account? Log In" +msgstr "Vous avez déjà un compte ? Se connecter" + +msgid "Choose your language:" +msgstr "Choisissez votre langue :" + +msgid "Contact Us" +msgstr "Nous contacter" + +msgid "Disable Notifications" +msgstr "Désactiver les notifications" + +msgid "Edit Profile" +msgstr "Modifier le profil" + +msgid "Enable Notifications" +msgstr "Activer les notifications" + +msgid "Enter your email" +msgstr "Entrez votre e-mail" + +msgid "Enter your password" +msgstr "Entrez votre mot de passe" + +msgid "Goodbye and thank you for using our app!" +msgstr "Au revoir et merci d'avoir utilisé notre application !" + +msgctxt "male" +msgid "He is your friend." +msgstr "C'est ton ami." + +msgid "Log Out" +msgstr "Déconnectez-vous" + +msgid "My Application" +msgstr "Ma candidature" + +msgid "Notifications" +msgstr "Les notifications" + +msgid "Please check your internet connection and try again." +msgstr "Vérifiez votre connexion Internet et réessayez." + +msgid "Please log in to continue." +msgstr "Veuillez vous connecter pour continuer." + +msgid "Privacy Policy" +msgstr "Politique de confidentialité" + +msgid "Remember Me" +msgstr "Souvenez-vous de moi" + +msgid "Reset your password" +msgstr "Réinitialisez votre mot de passe" + +msgid "Settings" +msgstr "Réglages" + +msgctxt "female" +msgid "She is your friend." +msgstr "C'est ton amie." + +msgid "Sign Up" +msgstr "INSCRIVEZ-VOUS" + +msgid "Something went wrong. Please try again." +msgstr "Quelque chose s'est mal passé. Veuillez réessayer." + +msgid "Submit Feedback" +msgstr "Soumettre des commentaires" + +msgid "Tell us what you think about the app!" +msgstr "Dites-nous ce que vous pensez de l'application !" + +msgid "Terms of Service" +msgstr "Conditions générales d'utilisation" + +msgctxt "other" +msgid "They are your friend." +msgstr "Ce sont tes amis." + +msgid "Welcome, {user_name}!" +msgstr "Bienvenue, {user_name} !" + +msgid "Your Profile" +msgstr "Votre profil" diff --git a/tests/fixtures/file-types-metafile/file18-po/en/messages.po b/tests/fixtures/file-types-metafile/file18-po/en/messages.po new file mode 100644 index 0000000..c616552 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file18-po/en/messages.po @@ -0,0 +1,101 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Localazy (https://localazy.com)\n" +"Project-Id-Version: CDN\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" + +msgid "aboutUs" +msgstr "aboutUs" + +msgid "alreadyHaveAccount" +msgstr "alreadyHaveAccount" + +msgid "appTitle" +msgstr "appTitle" + +msgid "contactUs" +msgstr "contactUs" + +msgid "disableNotifications" +msgstr "disableNotifications" + +msgid "editProfile" +msgstr "editProfile" + +msgid "emailPlaceholder" +msgstr "emailPlaceholder" + +msgid "enableNotifications" +msgstr "enableNotifications" + +msgid "errorMessage" +msgstr "errorMessage" + +msgid "farewellMessage" +msgstr "farewellMessage" + +msgid "feedbackPrompt" +msgstr "feedbackPrompt" + +msgctxt "female" +msgid "genderChoice" +msgstr "genderChoice" + +msgctxt "male" +msgid "genderChoice" +msgstr "genderChoice" + +msgctxt "other" +msgid "genderChoice" +msgstr "genderChoice" + +msgid "languageSelectLabel" +msgstr "languageSelectLabel" + +msgid "loginPrompt" +msgstr "loginPrompt" + +msgid "logoutButton" +msgstr "logoutButton" + +msgid "networkError" +msgstr "networkError" + +msgid "notificationsLabel" +msgstr "notificationsLabel" + +msgid "pluralMessage" +msgid_plural "pluralMessages" +msgstr[0] "You have no new messages" +msgstr[1] "You have one new message" + +msgid "passwordPlaceholder" +msgstr "passwordPlaceholder" + +msgid "privacyPolicy" +msgstr "privacyPolicy" + +msgid "profilePageTitle" +msgstr "profilePageTitle" + +msgid "rememberMe" +msgstr "rememberMe" + +msgid "settings" +msgstr "settings" + +msgid "signUp" +msgstr "signUp" + +msgid "submitFeedback" +msgstr "submitFeedback" + +msgid "termsOfService" +msgstr "termsOfService" + +msgid "welcomeMessage" +msgstr "welcomeMessage" diff --git a/tests/fixtures/file-types-metafile/file18-po/es/messages.po b/tests/fixtures/file-types-metafile/file18-po/es/messages.po new file mode 100644 index 0000000..1d01448 --- /dev/null +++ b/tests/fixtures/file-types-metafile/file18-po/es/messages.po @@ -0,0 +1,101 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Localazy (https://localazy.com)\n" +"Project-Id-Version: CDN\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" + +msgid "aboutUs" +msgstr "Acerca de nosotros" + +msgid "alreadyHaveAccount" +msgstr "Ya tengo una cuenta" + +msgid "appTitle" +msgstr "Título de la aplicación" + +msgid "contactUs" +msgstr "CONTÁCTANOS" + +msgid "disableNotifications" +msgstr "Desactivar las notificaciones" + +msgid "editProfile" +msgstr "Editar perfil" + +msgid "emailPlaceholder" +msgstr "Marcador de posición de correo electrónico" + +msgid "enableNotifications" +msgstr "Habilitar notificaciones" + +msgid "errorMessage" +msgstr "Mensaje de error" + +msgid "farewellMessage" +msgstr "Mensaje de despedida" + +msgid "feedbackPrompt" +msgstr "Mensaje de comentarios" + +msgctxt "female" +msgid "genderChoice" +msgstr "Elección de género" + +msgctxt "male" +msgid "genderChoice" +msgstr "Elección de género" + +msgctxt "other" +msgid "genderChoice" +msgstr "Elección de género" + +msgid "languageSelectLabel" +msgstr "Etiqueta de selección de idioma" + +msgid "loginPrompt" +msgstr "Mensaje de inicio de sesión" + +msgid "logoutButton" +msgstr "Botón de cierre de sesión" + +msgid "networkError" +msgstr "Error de red" + +msgid "notificationsLabel" +msgstr "Etiqueta de notificaciones" + +msgid "pluralMessage" +msgid_plural "pluralMessages" +msgstr[0] "No tienes mensajes nuevos" +msgstr[1] "Tienes un mensaje nuevo" + +msgid "passwordPlaceholder" +msgstr "Marcador de contraseña" + +msgid "privacyPolicy" +msgstr "Política de privacidad" + +msgid "profilePageTitle" +msgstr "Título de la página de perfil" + +msgid "rememberMe" +msgstr "Recuérdame" + +msgid "settings" +msgstr "Ajustes" + +msgid "signUp" +msgstr "Inscríbase" + +msgid "submitFeedback" +msgstr "Enviar comentarios" + +msgid "termsOfService" +msgstr "Términos de servicio" + +msgid "welcomeMessage" +msgstr "Mensaje de bienvenida" diff --git a/tests/fixtures/file-types-metafile/file18-po/fr/messages.po b/tests/fixtures/file-types-metafile/file18-po/fr/messages.po new file mode 100644 index 0000000..4ebe82e --- /dev/null +++ b/tests/fixtures/file-types-metafile/file18-po/fr/messages.po @@ -0,0 +1,101 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Localazy (https://localazy.com)\n" +"Project-Id-Version: CDN\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n==0 || n==1) ? 0 : 1;\n" + +msgid "aboutUs" +msgstr "À propos de nous" + +msgid "alreadyHaveAccount" +msgstr "Vous avez déjà un compte" + +msgid "appTitle" +msgstr "Titre de l'application" + +msgid "contactUs" +msgstr "Nous contacter" + +msgid "disableNotifications" +msgstr "Désactiver les notifications" + +msgid "editProfile" +msgstr "Modifier le profil" + +msgid "emailPlaceholder" +msgstr "Espace réservé aux e-mails" + +msgid "enableNotifications" +msgstr "Activer les notifications" + +msgid "errorMessage" +msgstr "Message d'erreur" + +msgid "farewellMessage" +msgstr "Message d'adieu" + +msgid "feedbackPrompt" +msgstr "Prompte de commentaires" + +msgctxt "female" +msgid "genderChoice" +msgstr "Choix du sexe" + +msgctxt "male" +msgid "genderChoice" +msgstr "Choix du sexe" + +msgctxt "other" +msgid "genderChoice" +msgstr "Choix du sexe" + +msgid "languageSelectLabel" +msgstr "Libellé de sélection de la langue" + +msgid "loginPrompt" +msgstr "Prompte de connexion" + +msgid "logoutButton" +msgstr "Bouton de déconnexion" + +msgid "networkError" +msgstr "Erreur réseau" + +msgid "notificationsLabel" +msgstr "Étiquette de notifications" + +msgid "pluralMessage" +msgid_plural "pluralMessages" +msgstr[0] "Vous n'avez aucun nouveau message" +msgstr[1] "Vous avez un nouveau message" + +msgid "passwordPlaceholder" +msgstr "Espace réservé au mot de passe" + +msgid "privacyPolicy" +msgstr "Politique de confidentialité" + +msgid "profilePageTitle" +msgstr "Titre de la page de profil" + +msgid "rememberMe" +msgstr "Souvenez-vous de moi" + +msgid "settings" +msgstr "Réglages" + +msgid "signUp" +msgstr "S'inscrire" + +msgid "submitFeedback" +msgstr "Soumettre des commentaires" + +msgid "termsOfService" +msgstr "Conditions générales d'utilisation" + +msgid "welcomeMessage" +msgstr "Message de bienvenue" diff --git a/tests/fixtures/file-types-metafile/index.ts b/tests/fixtures/file-types-metafile/index.ts new file mode 100644 index 0000000..79a95e4 --- /dev/null +++ b/tests/fixtures/file-types-metafile/index.ts @@ -0,0 +1,314 @@ +import axiosMock from '@tests/mocks/axios-mock'; +import fileTypesMetafile from '@tests/fixtures/file-types-metafile/metafile.json'; +import { resolve } from 'node:path'; +import { readFileSync } from 'node:fs'; + +const file01En: object = JSON.parse(readFileSync(resolve(__dirname, 'file01-json/en/plain.json')).toString()) as object; +const file01Es: object = JSON.parse(readFileSync(resolve(__dirname, 'file01-json/es/plain.json')).toString()) as object; +const file01Fr: object = JSON.parse(readFileSync(resolve(__dirname, 'file01-json/fr/plain.json')).toString()) as object; +const file02En: object = JSON.parse( + readFileSync(resolve(__dirname, 'file02-json5/en/texts.json5')).toString(), +) as object; +const file02Es: object = JSON.parse( + readFileSync(resolve(__dirname, 'file02-json5/es/texts.json5')).toString(), +) as object; +const file02Fr: object = JSON.parse( + readFileSync(resolve(__dirname, 'file02-json5/fr/texts.json5')).toString(), +) as object; +const file03En: string = readFileSync(resolve(__dirname, 'file03-neon/en/plain.neon')).toString(); +const file03Es: string = readFileSync(resolve(__dirname, 'file03-neon/es/plain.neon')).toString(); +const file03Fr: string = readFileSync(resolve(__dirname, 'file03-neon/fr/plain.neon')).toString(); +const file04En: string = readFileSync(resolve(__dirname, 'file04-yaml/en/plain.yaml')).toString(); +const file04Es: string = readFileSync(resolve(__dirname, 'file04-yaml/es/plain.yaml')).toString(); +const file04Fr: string = readFileSync(resolve(__dirname, 'file04-yaml/fr/plain.yaml')).toString(); +const file05En: string = readFileSync(resolve(__dirname, 'file05-xml/en/resources.xml')).toString(); +const file05Es: string = readFileSync(resolve(__dirname, 'file05-xml/es/resources.xml')).toString(); +const file05Fr: string = readFileSync(resolve(__dirname, 'file05-xml/fr/resources.xml')).toString(); +const file06En: string = readFileSync(resolve(__dirname, 'file06-srt/en/subtitles.srt')).toString(); +const file06Es: string = readFileSync(resolve(__dirname, 'file06-srt/es/subtitles.srt')).toString(); +const file06Fr: string = readFileSync(resolve(__dirname, 'file06-srt/fr/subtitles.srt')).toString(); +const file07En: string = readFileSync(resolve(__dirname, 'file07-ini/en/plain.ini')).toString(); +const file07Es: string = readFileSync(resolve(__dirname, 'file07-ini/es/plain.ini')).toString(); +const file07Fr: string = readFileSync(resolve(__dirname, 'file07-ini/fr/plain.ini')).toString(); +const file08En: string = readFileSync(resolve(__dirname, 'file08-strings/en/Localizable.strings')).toString(); +const file08Es: string = readFileSync(resolve(__dirname, 'file08-strings/es/Localizable.strings')).toString(); +const file08Fr: string = readFileSync(resolve(__dirname, 'file08-strings/fr/Localizable.strings')).toString(); +const file09En: string = readFileSync(resolve(__dirname, 'file09-toml/en/file.toml')).toString(); +const file09Es: string = readFileSync(resolve(__dirname, 'file09-toml/es/file.toml')).toString(); +const file09Fr: string = readFileSync(resolve(__dirname, 'file09-toml/fr/file.toml')).toString(); +const file10En: string = readFileSync(resolve(__dirname, 'file10-resx/en/resources.resx')).toString(); +const file10Es: string = readFileSync(resolve(__dirname, 'file10-resx/es/resources.resx')).toString(); +const file10Fr: string = readFileSync(resolve(__dirname, 'file10-resx/fr/resources.resx')).toString(); +const file11En: string = readFileSync(resolve(__dirname, 'file11-xliff/en/translate.xliff')).toString(); +const file11Es: string = readFileSync(resolve(__dirname, 'file11-xliff/es/translate.xliff')).toString(); +const file11Fr: string = readFileSync(resolve(__dirname, 'file11-xliff/fr/translate.xliff')).toString(); +const file12En: string = readFileSync(resolve(__dirname, 'file12-properties/en/local.properties')).toString(); +const file12Es: string = readFileSync(resolve(__dirname, 'file12-properties/es/local.properties')).toString(); +const file12Fr: string = readFileSync(resolve(__dirname, 'file12-properties/fr/local.properties')).toString(); +const file13En: string = readFileSync(resolve(__dirname, 'file13-csv/en/export.csv')).toString(); +const file13Es: string = readFileSync(resolve(__dirname, 'file13-csv/es/export.csv')).toString(); +const file13Fr: string = readFileSync(resolve(__dirname, 'file13-csv/fr/export.csv')).toString(); +const file14En: string = readFileSync(resolve(__dirname, 'file14-ts/en/resources.ts')).toString(); +const file14Es: string = readFileSync(resolve(__dirname, 'file14-ts/es/resources.ts')).toString(); +const file14Fr: string = readFileSync(resolve(__dirname, 'file14-ts/fr/resources.ts')).toString(); +const file15En: string = readFileSync(resolve(__dirname, 'file15-js/en/default.js')).toString(); +const file15Es: string = readFileSync(resolve(__dirname, 'file15-js/es/default.js')).toString(); +const file15Fr: string = readFileSync(resolve(__dirname, 'file15-js/fr/default.js')).toString(); +const file16En: string = readFileSync(resolve(__dirname, 'file16-php/en/structured.php')).toString(); +const file16Es: string = readFileSync(resolve(__dirname, 'file16-php/es/structured.php')).toString(); +const file16Fr: string = readFileSync(resolve(__dirname, 'file16-php/fr/structured.php')).toString(); +const file17En: string = readFileSync(resolve(__dirname, 'file17-pot/en/messages.pot')).toString(); +const file17Es: string = readFileSync(resolve(__dirname, 'file17-pot/es/messages.pot')).toString(); +const file17Fr: string = readFileSync(resolve(__dirname, 'file17-pot/fr/messages.pot')).toString(); +const file18En: string = readFileSync(resolve(__dirname, 'file18-po/en/messages.po')).toString(); +const file18Es: string = readFileSync(resolve(__dirname, 'file18-po/es/messages.po')).toString(); +const file18Fr: string = readFileSync(resolve(__dirname, 'file18-po/fr/messages.po')).toString(); + +const baseUrl: string = 'https://delivery.localazy.com'; + +export const url = { + metafile: `${baseUrl}/file-types-metafile/_e0.v2.json`, + file01: { + en: `${baseUrl}/file-types-metafile/_e0/file01-json/en/plain.json`, + es: `${baseUrl}/file-types-metafile/_e0/file01-json/es/plain.json`, + fr: `${baseUrl}/file-types-metafile/_e0/file01-json/fr/plain.json`, + }, + file02: { + en: `${baseUrl}/file-types-metafile/_e0/file02-json5/en/texts.json5`, + es: `${baseUrl}/file-types-metafile/_e0/file02-json5/es/texts.json5`, + fr: `${baseUrl}/file-types-metafile/_e0/file02-json5/fr/texts.json5`, + }, + file03: { + en: `${baseUrl}/file-types-metafile/_e0/file03-neon/en/plain.neon`, + es: `${baseUrl}/file-types-metafile/_e0/file03-neon/es/plain.neon`, + fr: `${baseUrl}/file-types-metafile/_e0/file03-neon/fr/plain.neon`, + }, + file04: { + en: `${baseUrl}/file-types-metafile/_e0/file04-yaml/en/plain.yaml`, + es: `${baseUrl}/file-types-metafile/_e0/file04-yaml/es/plain.yaml`, + fr: `${baseUrl}/file-types-metafile/_e0/file04-yaml/fr/plain.yaml`, + }, + file05: { + en: `${baseUrl}/file-types-metafile/_e0/file05-xml/en/resources.xml`, + es: `${baseUrl}/file-types-metafile/_e0/file05-xml/es/resources.xml`, + fr: `${baseUrl}/file-types-metafile/_e0/file05-xml/fr/resources.xml`, + }, + file06: { + en: `${baseUrl}/file-types-metafile/_e0/file06-srt/en/subtitles.srt`, + es: `${baseUrl}/file-types-metafile/_e0/file06-srt/es/subtitles.srt`, + fr: `${baseUrl}/file-types-metafile/_e0/file06-srt/fr/subtitles.srt`, + }, + file07: { + en: `${baseUrl}/file-types-metafile/_e0/file07-ini/en/plain.ini`, + es: `${baseUrl}/file-types-metafile/_e0/file07-ini/es/plain.ini`, + fr: `${baseUrl}/file-types-metafile/_e0/file07-ini/fr/plain.ini`, + }, + file08: { + en: `${baseUrl}/file-types-metafile/_e0/file08-strings/en/Localizable.strings`, + es: `${baseUrl}/file-types-metafile/_e0/file08-strings/es/Localizable.strings`, + fr: `${baseUrl}/file-types-metafile/_e0/file08-strings/fr/Localizable.strings`, + }, + file09: { + en: `${baseUrl}/file-types-metafile/_e0/file09-toml/en/file.toml`, + es: `${baseUrl}/file-types-metafile/_e0/file09-toml/es/file.toml`, + fr: `${baseUrl}/file-types-metafile/_e0/file09-toml/fr/file.toml`, + }, + file10: { + en: `${baseUrl}/file-types-metafile/_e0/file10-resx/en/resources.resx`, + es: `${baseUrl}/file-types-metafile/_e0/file10-resx/es/resources.resx`, + fr: `${baseUrl}/file-types-metafile/_e0/file10-resx/fr/resources.resx`, + }, + file11: { + en: `${baseUrl}/file-types-metafile/_e0/file11-xliff/en/translate.xliff`, + es: `${baseUrl}/file-types-metafile/_e0/file11-xliff/es/translate.xliff`, + fr: `${baseUrl}/file-types-metafile/_e0/file11-xliff/fr/translate.xliff`, + }, + file12: { + en: `${baseUrl}/file-types-metafile/_e0/file12-properties/en/local.properties`, + es: `${baseUrl}/file-types-metafile/_e0/file12-properties/es/local.properties`, + fr: `${baseUrl}/file-types-metafile/_e0/file12-properties/fr/local.properties`, + }, + file13: { + en: `${baseUrl}/file-types-metafile/_e0/file13-csv/en/export.csv`, + es: `${baseUrl}/file-types-metafile/_e0/file13-csv/es/export.csv`, + fr: `${baseUrl}/file-types-metafile/_e0/file13-csv/fr/export.csv`, + }, + file14: { + en: `${baseUrl}/file-types-metafile/_e0/file14-ts/en/resources.ts`, + es: `${baseUrl}/file-types-metafile/_e0/file14-ts/es/resources.ts`, + fr: `${baseUrl}/file-types-metafile/_e0/file14-ts/fr/resources.ts`, + }, + file15: { + en: `${baseUrl}/file-types-metafile/_e0/file15-js/en/default.js`, + es: `${baseUrl}/file-types-metafile/_e0/file15-js/es/default.js`, + fr: `${baseUrl}/file-types-metafile/_e0/file15-js/fr/default.js`, + }, + file16: { + en: `${baseUrl}/file-types-metafile/_e0/file16-php/en/structured.php`, + es: `${baseUrl}/file-types-metafile/_e0/file16-php/es/structured.php`, + fr: `${baseUrl}/file-types-metafile/_e0/file16-php/fr/structured.php`, + }, + file17: { + en: `${baseUrl}/file-types-metafile/_e0/file17-pot/en/messages.pot`, + es: `${baseUrl}/file-types-metafile/_e0/file17-pot/es/messages.pot`, + fr: `${baseUrl}/file-types-metafile/_e0/file17-pot/fr/messages.pot`, + }, + file18: { + en: `${baseUrl}/file-types-metafile/_e0/file18-po/en/messages.po`, + es: `${baseUrl}/file-types-metafile/_e0/file18-po/es/messages.po`, + fr: `${baseUrl}/file-types-metafile/_e0/file18-po/fr/messages.po`, + }, +}; + +export const serverResponses = { + metafile: fileTypesMetafile, + file01: { + en: file01En, + es: file01Es, + fr: file01Fr, + }, + file02: { + en: file02En, + es: file02Es, + fr: file02Fr, + }, + file03: { + en: file03En, + es: file03Es, + fr: file03Fr, + }, + file04: { + en: file04En, + es: file04Es, + fr: file04Fr, + }, + file05: { + en: file05En, + es: file05Es, + fr: file05Fr, + }, + file06: { + en: file06En, + es: file06Es, + fr: file06Fr, + }, + file07: { + en: file07En, + es: file07Es, + fr: file07Fr, + }, + file08: { + en: file08En, + es: file08Es, + fr: file08Fr, + }, + file09: { + en: file09En, + es: file09Es, + fr: file09Fr, + }, + file10: { + en: file10En, + es: file10Es, + fr: file10Fr, + }, + file11: { + en: file11En, + es: file11Es, + fr: file11Fr, + }, + file12: { + en: file12En, + es: file12Es, + fr: file12Fr, + }, + file13: { + en: file13En, + es: file13Es, + fr: file13Fr, + }, + file14: { + en: file14En, + es: file14Es, + fr: file14Fr, + }, + file15: { + en: file15En, + es: file15Es, + fr: file15Fr, + }, + file16: { + en: file16En, + es: file16Es, + fr: file16Fr, + }, + file17: { + en: file17En, + es: file17Es, + fr: file17Fr, + }, + file18: { + en: file18En, + es: file18Es, + fr: file18Fr, + }, +}; + +export const mockAxios = (): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(200, serverResponses.metafile); + axiosMock.onGet(url.file01.en).reply(200, serverResponses.file01.en); + axiosMock.onGet(url.file01.es).reply(200, serverResponses.file01.es); + axiosMock.onGet(url.file01.fr).reply(200, serverResponses.file01.fr); + axiosMock.onGet(url.file02.en).reply(200, serverResponses.file02.en); + axiosMock.onGet(url.file02.es).reply(200, serverResponses.file02.es); + axiosMock.onGet(url.file02.fr).reply(200, serverResponses.file02.fr); + axiosMock.onGet(url.file03.en).reply(200, serverResponses.file03.en); + axiosMock.onGet(url.file03.es).reply(200, serverResponses.file03.es); + axiosMock.onGet(url.file03.fr).reply(200, serverResponses.file03.fr); + axiosMock.onGet(url.file04.en).reply(200, serverResponses.file04.en); + axiosMock.onGet(url.file04.es).reply(200, serverResponses.file04.es); + axiosMock.onGet(url.file04.fr).reply(200, serverResponses.file04.fr); + axiosMock.onGet(url.file05.en).reply(200, serverResponses.file05.en); + axiosMock.onGet(url.file05.es).reply(200, serverResponses.file05.es); + axiosMock.onGet(url.file05.fr).reply(200, serverResponses.file05.fr); + axiosMock.onGet(url.file06.en).reply(200, serverResponses.file06.en); + axiosMock.onGet(url.file06.es).reply(200, serverResponses.file06.es); + axiosMock.onGet(url.file06.fr).reply(200, serverResponses.file06.fr); + axiosMock.onGet(url.file07.en).reply(200, serverResponses.file07.en); + axiosMock.onGet(url.file07.es).reply(200, serverResponses.file07.es); + axiosMock.onGet(url.file07.fr).reply(200, serverResponses.file07.fr); + axiosMock.onGet(url.file08.en).reply(200, serverResponses.file08.en); + axiosMock.onGet(url.file08.es).reply(200, serverResponses.file08.es); + axiosMock.onGet(url.file08.fr).reply(200, serverResponses.file08.fr); + axiosMock.onGet(url.file09.en).reply(200, serverResponses.file09.en); + axiosMock.onGet(url.file09.es).reply(200, serverResponses.file09.es); + axiosMock.onGet(url.file09.fr).reply(200, serverResponses.file09.fr); + axiosMock.onGet(url.file10.en).reply(200, serverResponses.file10.en); + axiosMock.onGet(url.file10.es).reply(200, serverResponses.file10.es); + axiosMock.onGet(url.file10.fr).reply(200, serverResponses.file10.fr); + axiosMock.onGet(url.file11.en).reply(200, serverResponses.file11.en); + axiosMock.onGet(url.file11.es).reply(200, serverResponses.file11.es); + axiosMock.onGet(url.file11.fr).reply(200, serverResponses.file11.fr); + axiosMock.onGet(url.file12.en).reply(200, serverResponses.file12.en); + axiosMock.onGet(url.file12.es).reply(200, serverResponses.file12.es); + axiosMock.onGet(url.file12.fr).reply(200, serverResponses.file12.fr); + axiosMock.onGet(url.file13.en).reply(200, serverResponses.file13.en); + axiosMock.onGet(url.file13.es).reply(200, serverResponses.file13.es); + axiosMock.onGet(url.file13.fr).reply(200, serverResponses.file13.fr); + axiosMock.onGet(url.file14.en).reply(200, serverResponses.file14.en); + axiosMock.onGet(url.file14.es).reply(200, serverResponses.file14.es); + axiosMock.onGet(url.file14.fr).reply(200, serverResponses.file14.fr); + axiosMock.onGet(url.file15.en).reply(200, serverResponses.file15.en); + axiosMock.onGet(url.file15.es).reply(200, serverResponses.file15.es); + axiosMock.onGet(url.file15.fr).reply(200, serverResponses.file15.fr); + axiosMock.onGet(url.file16.en).reply(200, serverResponses.file16.en); + axiosMock.onGet(url.file16.es).reply(200, serverResponses.file16.es); + axiosMock.onGet(url.file16.fr).reply(200, serverResponses.file16.fr); + axiosMock.onGet(url.file17.en).reply(200, serverResponses.file17.en); + axiosMock.onGet(url.file17.es).reply(200, serverResponses.file17.es); + axiosMock.onGet(url.file17.fr).reply(200, serverResponses.file17.fr); + axiosMock.onGet(url.file18.en).reply(200, serverResponses.file18.en); + axiosMock.onGet(url.file18.es).reply(200, serverResponses.file18.es); + axiosMock.onGet(url.file18.fr).reply(200, serverResponses.file18.fr); +}; diff --git a/tests/fixtures/file-types-metafile/metafile.json b/tests/fixtures/file-types-metafile/metafile.json new file mode 100644 index 0000000..b7aafbd --- /dev/null +++ b/tests/fixtures/file-types-metafile/metafile.json @@ -0,0 +1,745 @@ +{ + "projectUrl": "https://localazy.com/p/cdn", + "baseLocale": "en", + "timestamp": 1700000000, + "files": { + "file01-json": { + "file": "plain.json", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file01-json/en/plain.json", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file01-json/es/plain.json", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file01-json/fr/plain.json", + "timestamp": 1700000000 + } + ] + }, + "file02-json5": { + "file": "texts.json5", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file02-json5/en/texts.json5", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file02-json5/es/texts.json5", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file02-json5/fr/texts.json5", + "timestamp": 1700000000 + } + ] + }, + "file03-neon": { + "file": "plain.neon", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file03-neon/en/plain.neon", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file03-neon/es/plain.neon", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file03-neon/fr/plain.neon", + "timestamp": 1700000000 + } + ] + }, + "file04-yaml": { + "file": "plain.yaml", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file04-yaml/en/plain.yaml", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file04-yaml/es/plain.yaml", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file04-yaml/fr/plain.yaml", + "timestamp": 1700000000 + } + ] + }, + "file05-xml": { + "file": "resources.xml", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file05-xml/en/resources.xml", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file05-xml/es/resources.xml", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file05-xml/fr/resources.xml", + "timestamp": 1700000000 + } + ] + }, + "file06-srt": { + "file": "subtitles.srt", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file06-srt/en/subtitles.srt", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file06-srt/es/subtitles.srt", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file06-srt/fr/subtitles.srt", + "timestamp": 1700000000 + } + ] + }, + "file07-ini": { + "file": "plain.ini", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file07-ini/en/plain.ini", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file07-ini/es/plain.ini", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file07-ini/fr/plain.ini", + "timestamp": 1700000000 + } + ] + }, + "file08-strings": { + "file": "Localizable.strings", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file08-strings/en/Localizable.strings", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file08-strings/es/Localizable.strings", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file08-strings/fr/Localizable.strings", + "timestamp": 1700000000 + } + ] + }, + "file09-toml": { + "file": "file.toml", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file09-toml/en/file.toml", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file09-toml/es/file.toml", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file09-toml/fr/file.toml", + "timestamp": 1700000000 + } + ] + }, + "file10-resx": { + "file": "resources.resx", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file10-resx/en/resources.resx", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file10-resx/es/resources.resx", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file10-resx/fr/resources.resx", + "timestamp": 1700000000 + } + ] + }, + "file11-xliff": { + "file": "translate.xliff", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file11-xliff/en/translate.xliff", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file11-xliff/es/translate.xliff", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file11-xliff/fr/translate.xliff", + "timestamp": 1700000000 + } + ] + }, + "file12-properties": { + "file": "local.properties", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file12-properties/en/local.properties", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file12-properties/es/local.properties", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file12-properties/fr/local.properties", + "timestamp": 1700000000 + } + ] + }, + "file13-csv": { + "file": "export.csv", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file13-csv/en/export.csv", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file13-csv/es/export.csv", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file13-csv/fr/export.csv", + "timestamp": 1700000000 + } + ] + }, + "file14-ts": { + "file": "resources.ts", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file14-ts/en/resources.ts", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file14-ts/es/resources.ts", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file14-ts/fr/resources.ts", + "timestamp": 1700000000 + } + ] + }, + "file15-js": { + "file": "default.js", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file15-js/en/default.js", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file15-js/es/default.js", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file15-js/fr/default.js", + "timestamp": 1700000000 + } + ] + }, + "file16-php": { + "file": "structured.php", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file16-php/en/structured.php", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file16-php/es/structured.php", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file16-php/fr/structured.php", + "timestamp": 1700000000 + } + ] + }, + "file17-pot": { + "file": "messages.pot", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file17-pot/en/messages.pot", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file17-pot/es/messages.pot", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file17-pot/fr/messages.pot", + "timestamp": 1700000000 + } + ] + }, + "file18-po": { + "file": "messages.po", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [ ], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/file-types-metafile/_e0/file18-po/en/messages.po", + "timestamp": 1700000000 + }, + { + "language": "es", + "region": "", + "script": "", + "isRtl": false, + "name": "Spanish", + "localizedName": "Español", + "uri": "/file-types-metafile/_e0/file18-po/es/messages.po", + "timestamp": 1700000000 + }, + { + "language": "fr", + "region": "", + "script": "", + "isRtl": false, + "name": "French", + "localizedName": "Français", + "uri": "/file-types-metafile/_e0/file18-po/fr/messages.po", + "timestamp": 1700000000 + } + ] + } + } +} diff --git a/tests/fixtures/files-without-locales-metafile/index.ts b/tests/fixtures/files-without-locales-metafile/index.ts new file mode 100644 index 0000000..2a290c5 --- /dev/null +++ b/tests/fixtures/files-without-locales-metafile/index.ts @@ -0,0 +1,18 @@ +import axiosMock from '@tests/mocks/axios-mock'; +import filesWithoutLocalesMetafile + from '@tests/fixtures/files-without-locales-metafile/metafile.json'; + +const baseUrl: string = 'https://delivery.localazy.com'; + +export const url = { + metafile: `${baseUrl}/files-without-locales-metafile/_e0.v2.json`, +}; + +export const serverResponses = { + metafile: filesWithoutLocalesMetafile, +}; + +export const mockAxios = (): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(200, serverResponses.metafile); +}; diff --git a/tests/fixtures/files-without-locales-metafile/metafile.json b/tests/fixtures/files-without-locales-metafile/metafile.json new file mode 100644 index 0000000..43b48f5 --- /dev/null +++ b/tests/fixtures/files-without-locales-metafile/metafile.json @@ -0,0 +1,18 @@ +{ + "projectUrl": "https://localazy.com/p/cdnarticle", + "baseLocale": "en", + "timestamp": 1700000000, + "files": { + "file01": { + "file": "file.json", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + ] + } + } +} diff --git a/tests/fixtures/index.ts b/tests/fixtures/index.ts new file mode 100644 index 0000000..ff6d3d1 --- /dev/null +++ b/tests/fixtures/index.ts @@ -0,0 +1,7 @@ +export * as completeMetafile from '@tests/fixtures/complete-metafile'; +export * as completeMetafileV2 from '@tests/fixtures/complete-metafile-v2'; +export * as singleFileMetafile from '@tests/fixtures/single-file-metafile'; +export * as emptyMetafile from '@tests/fixtures/empty-metafile'; +export * as filesWithoutLocalesMetafile from '@tests/fixtures/files-without-locales-metafile'; +export * as fileTypesMetafile from '@tests/fixtures/file-types-metafile'; +export * as serverErrorMetafile from '@tests/fixtures/server-error-metafile'; diff --git a/tests/fixtures/server-error-metafile/index.ts b/tests/fixtures/server-error-metafile/index.ts new file mode 100644 index 0000000..97bd5ad --- /dev/null +++ b/tests/fixtures/server-error-metafile/index.ts @@ -0,0 +1,12 @@ +import axiosMock from '@tests/mocks/axios-mock'; + +const baseUrl: string = 'https://delivery.localazy.com'; + +export const url = { + metafile: `${baseUrl}/single-file-metafile/_e0.v2.json`, +}; + +export const mockAxios = (code: number = 500): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(code); +}; diff --git a/tests/fixtures/single-file-metafile/file01/en/file.json b/tests/fixtures/single-file-metafile/file01/en/file.json new file mode 100644 index 0000000..4435195 --- /dev/null +++ b/tests/fixtures/single-file-metafile/file01/en/file.json @@ -0,0 +1,6 @@ +{ + "cdn_info": "With the CDN you can deliver the translation files instantly", + "cdn_testing": "We're testing the CDN", + "hello_localazy": "Hello Localazy!", + "using_javascript": "In this project we decided to use JavaScript" +} diff --git a/tests/fixtures/single-file-metafile/file01/ms/file.json b/tests/fixtures/single-file-metafile/file01/ms/file.json new file mode 100644 index 0000000..6017d79 --- /dev/null +++ b/tests/fixtures/single-file-metafile/file01/ms/file.json @@ -0,0 +1,6 @@ +{ + "cdn_info": "Dengan CDN anda boleh menyampaikan fail terjemahan dengan serta-merta", + "cdn_testing": "Kami sedang menguji CDN", + "hello_localazy": "Helo Localazy!", + "using_javascript": "Dalam projek ini kami memutuskan untuk menggunakan JavaScript" +} diff --git a/tests/fixtures/single-file-metafile/index.ts b/tests/fixtures/single-file-metafile/index.ts new file mode 100644 index 0000000..4c29c0b --- /dev/null +++ b/tests/fixtures/single-file-metafile/index.ts @@ -0,0 +1,39 @@ +import axiosMock from '@tests/mocks/axios-mock'; +import singleFileMetafile from '@tests/fixtures/single-file-metafile/metafile.json'; +import file01En from '@tests/fixtures/single-file-metafile/file01/en/file.json'; +import file01Ms from '@tests/fixtures/single-file-metafile/file01/ms/file.json'; + +const baseUrl: string = 'https://delivery.localazy.com'; +const file01Locales = singleFileMetafile.files.file01.locales; + +export const url = { + metafile: `${baseUrl}/single-file-metafile/_e0.v2.json`, + file01: { + en: `${baseUrl}${file01Locales[0].uri}`, + ms: `${baseUrl}${file01Locales[1].uri}`, + }, +}; + +export const serverResponses = { + metafile: singleFileMetafile, + file01: { + en: file01En, + ms: file01Ms, + }, +}; + +export const cdnResponses = { + allFilesAllLocales: { + file01: { + en: serverResponses.file01.en, + ms: serverResponses.file01.ms, + }, + }, +}; + +export const mockAxios = (): void => { + axiosMock.reset(); + axiosMock.onGet(url.metafile).reply(200, serverResponses.metafile); + axiosMock.onGet(url.file01.en).reply(200, serverResponses.file01.en); + axiosMock.onGet(url.file01.ms).reply(200, serverResponses.file01.ms); +}; diff --git a/tests/fixtures/single-file-metafile/metafile.json b/tests/fixtures/single-file-metafile/metafile.json new file mode 100644 index 0000000..665be5f --- /dev/null +++ b/tests/fixtures/single-file-metafile/metafile.json @@ -0,0 +1,38 @@ +{ + "projectUrl": "https://localazy.com/p/cdnarticle", + "baseLocale": "en", + "timestamp": 1700000000, + "files": { + "file01": { + "file": "file.json", + "path": "", + "library": "", + "module": "", + "buildType": "", + "timestamp": 1700000000, + "productFlavors": [], + "locales": [ + { + "language": "en", + "region": "", + "script": "", + "isRtl": false, + "name": "English", + "localizedName": "English", + "uri": "/single-file-metafile/_e0/file01/en/file.json", + "timestamp": 1700000000 + }, + { + "language": "ms", + "region": "", + "script": "", + "isRtl": false, + "name": "Malay", + "localizedName": "Malay", + "uri": "/single-file-metafile/_e0/file01/ms/file.json", + "timestamp": 1700000000 + } + ] + } + } +} diff --git a/tests/mocks/axios-mock.ts b/tests/mocks/axios-mock.ts new file mode 100644 index 0000000..a793529 --- /dev/null +++ b/tests/mocks/axios-mock.ts @@ -0,0 +1,6 @@ +import MockAdapter from 'axios-mock-adapter'; +import axios from 'axios'; + +export default new MockAdapter(axios, { + onNoMatch: 'throwException', +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c7e5e1b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "sourceMap": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "declaration": true, + "baseUrl": "src", + "paths": { + "@/*": [ + "./*" + ], + "@tests/*": [ + "./../tests/*" + ] + }, + "types": [ + "@types/node", + "@types/lodash" + ] + }, + "exclude": [ + "node_modules", + "coverage", + "typedoc", + "dist", + "tests/fixtures/file-types-metafile/file14-ts/" + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..d01cf5c --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "**/**.cjs" + ] +} diff --git a/tsconfig.typedoc.json b/tsconfig.typedoc.json new file mode 100644 index 0000000..f6f9dda --- /dev/null +++ b/tsconfig.typedoc.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src" + ] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..94d3e71 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,102 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import { defineConfig } from 'vite'; +import { resolve } from 'node:path'; +import dts from 'vite-plugin-dts'; +import { terser } from 'rollup-plugin-terser'; +import pkg from './package.json'; + +const banner: string = `/* ${pkg.name}@${pkg.version} + * (c) ${new Date().getFullYear()} ${pkg.author} + * @license MIT */\n`; + +export default defineConfig({ + resolve: { + alias: { + '@/': `${resolve(__dirname, '')}/src/`, + }, + }, + + build: { + lib: { + entry: resolve(__dirname, 'src/main.ts'), + }, + + minify: false, + sourcemap: true, + + rollupOptions: { + output: [ + { + format: 'es', + entryFileNames: 'localazy-cdn.js', + banner, + }, + { + format: 'es', + entryFileNames: 'localazy-cdn.min.js', + banner, + plugins: [ + // minify output + // @ts-expect-error plugin is compatible + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + terser(), + ], + }, + { + format: 'cjs', + dir: 'dist/cjs', + entryFileNames: 'localazy-cdn.cjs', + banner, + }, + { + format: 'cjs', + dir: 'dist/cjs', + entryFileNames: 'localazy-cdn.min.cjs', + plugins: [ + // minify output + // @ts-expect-error plugin is compatible + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + terser(), + ], + }, + { + format: 'umd', + dir: 'dist/umd', + entryFileNames: 'localazy-cdn.umd.cjs', + banner, + name: 'LocalazyCDN', + globals: { + axios: 'axios', + }, + }, + { + format: 'umd', + dir: 'dist/umd', + entryFileNames: 'localazy-cdn.umd.min.cjs', + name: 'LocalazyCDN', + globals: { + axios: 'axios', + }, + plugins: [ + // minify output + // @ts-expect-error plugin is compatible + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + terser(), + ], + }, + ], + + external: [ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.devDependencies || {}), + // node internals + // 'https', + ], + }, + }, + + plugins: [ + // Generate index.d.ts file. + dts({ rollupTypes: true }), + ], +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..140c2b7 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,27 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import { resolve } from 'node:path'; +import { configDefaults, defineConfig } from 'vitest/config'; + +export default defineConfig({ + resolve: { + alias: { + '@/': `${resolve(__dirname, '')}/src/`, + '@tests/': `${resolve(__dirname, '')}/tests/`, + }, + }, + + test: { + coverage: { + reporter: [ + ...configDefaults.coverage.reporter || [], + 'json-summary', + ], + reportOnFailure: true, + exclude: [ + ...configDefaults.coverage.exclude || [], + 'typedoc/**', + 'docs/**', + ], + }, + }, +});