diff --git a/commitlint.config.ts b/commitlint.config.ts index 5f44c75e5..c89743462 100644 --- a/commitlint.config.ts +++ b/commitlint.config.ts @@ -7,7 +7,7 @@ const config: UserConfig = { extends: ['@commitlint/config-conventional'], rules: { 'type-enum': [2, 'always', [...conventional.rules['type-enum'][2], 'api', 'release']], - 'scope-enum': [2, 'always', ['connector', 'console', 'core', 'demo-app', 'test', 'phrases', 'schemas', 'shared', 'experience', 'deps', 'deps-dev', 'cli', 'toolkit', 'cloud', 'app-insights']], + 'scope-enum': [2, 'always', ['connector', 'console', 'core', 'demo-app', 'test', 'phrases', 'schemas', 'shared', 'experience', 'deps', 'deps-dev', 'cli', 'toolkit', 'cloud', 'app-insights', 'elements']], // Slightly increase the tolerance to allow the appending PR number ...(isCi && { 'header-max-length': [2, 'always', 110] }), 'body-max-line-length': [2, 'always', 110], diff --git a/packages/console/src/pages/Profile/index.tsx b/packages/console/src/pages/Profile/index.tsx index 3560bab4c..aa71c15ac 100644 --- a/packages/console/src/pages/Profile/index.tsx +++ b/packages/console/src/pages/Profile/index.tsx @@ -1,4 +1,4 @@ -import { createReactComponents } from '@logto/elements/react'; +import { createReactComponents, initLocalization } from '@logto/elements/react'; import type { ConnectorResponse } from '@logto/schemas'; import React, { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -32,7 +32,11 @@ import Skeleton from './components/Skeleton'; import DeleteAccountModal from './containers/DeleteAccountModal'; import * as styles from './index.module.scss'; -const { LogtoFormCard, LogtoThemeProvider } = createReactComponents(React); +if (isDevFeaturesEnabled) { + initLocalization(); +} + +const { LogtoProfileCard, LogtoThemeProvider } = createReactComponents(React); function Profile() { const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); @@ -75,11 +79,7 @@ function Profile() { {showLoadingSkeleton && } - {isDevFeaturesEnabled && ( - -

🚧 This section is a dev feature that is still working in progress.

-
- )} + {isDevFeaturesEnabled && } {user && !showLoadingSkeleton && (
diff --git a/packages/elements/.gitignore b/packages/elements/.gitignore new file mode 100644 index 000000000..d3db8f9b1 --- /dev/null +++ b/packages/elements/.gitignore @@ -0,0 +1 @@ +src/generated/ diff --git a/packages/elements/lit-localize.json b/packages/elements/lit-localize.json new file mode 100644 index 000000000..6df04a74a --- /dev/null +++ b/packages/elements/lit-localize.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://raw.githubusercontent.com/lit/lit/main/packages/localize-tools/config.schema.json", + "sourceLocale": "en", + "targetLocales": ["de", "es", "fr", "it", "ja", "ko", "pl-PL", "pt-BR", "pt-PT", "ru", "tr-TR", "zh-CN", "zh-HK", "zh-TW"], + "tsConfig": "./tsconfig.json", + "output": { + "mode": "runtime", + "outputDir": "./src/generated/locales", + "localeCodesModule": "./src/generated/locale-codes.ts" + }, + "interchange": { + "format": "xliff", + "xliffDir": "./xliff/" + } +} diff --git a/packages/elements/package.json b/packages/elements/package.json index 3ac8d3e2d..b9640c5ec 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -27,13 +27,15 @@ }, "scripts": { "precommit": "lint-staged", - "build": "tsup", - "dev": "tsup --watch --no-splitting", + "build": "lit-localize build && tsup", + "dev": "lit-localize build && tsup --watch --no-splitting", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", "test": "echo \"No tests yet.\"", "test:ci": "pnpm run test --silent --coverage", - "prepack": "pnpm build" + "prepack": "pnpm check && pnpm build", + "localize": "lit-localize", + "check": "lit-localize extract && git add . -N && git diff --exit-code" }, "engines": { "node": "^20.9.0" @@ -48,6 +50,7 @@ "lit": "^3.1.4" }, "devDependencies": { + "@lit/localize-tools": "^0.7.2", "@silverhand/eslint-config": "6.0.1", "@silverhand/ts-config": "6.0.0", "eslint": "^8.56.0", @@ -57,6 +60,9 @@ }, "eslintConfig": { "extends": "@silverhand", + "ignorePatterns": [ + "src/generated/" + ], "rules": { "no-console": "error", "unicorn/prevent-abbreviations": [ diff --git a/packages/elements/src/components/logto-card-section.ts b/packages/elements/src/components/logto-card-section.ts new file mode 100644 index 000000000..de4e88be5 --- /dev/null +++ b/packages/elements/src/components/logto-card-section.ts @@ -0,0 +1,34 @@ +import { localized, msg } from '@lit/localize'; +import { LitElement, css, html } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; + +import { unit } from '../utils/css.js'; +import { vars } from '../utils/theme.js'; + +const tagName = 'logto-card-section'; + +@customElement(tagName) +@localized() +export class LogtoCardSection extends LitElement { + static tagName = tagName; + static styles = css` + header { + font: ${vars.fontLabel2}; + color: ${vars.colorText}; + margin-bottom: ${unit(1)}; + } + `; + + @property() + heading = msg('Not available', { + id: 'form-card.fallback-title', + desc: 'The fallback title of a form card when the title is not provided.', + }); + + render() { + return html` +
${this.heading}
+ + `; + } +} diff --git a/packages/elements/src/components/logto-form-card.ts b/packages/elements/src/components/logto-form-card.ts index 4b371b980..dc02bbd99 100644 --- a/packages/elements/src/components/logto-form-card.ts +++ b/packages/elements/src/components/logto-form-card.ts @@ -1,14 +1,15 @@ +import { localized, msg } from '@lit/localize'; import { cond } from '@silverhand/essentials'; import { LitElement, css, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { type LocaleKeyOptional, type LocaleKey } from '../locales/index.js'; import { unit } from '../utils/css.js'; import { vars } from '../utils/theme.js'; const tagName = 'logto-form-card'; @customElement(tagName) +@localized() export class LogtoFormCard extends LitElement { static tagName = tagName; static styles = css` @@ -35,16 +36,19 @@ export class LogtoFormCard extends LitElement { `; @property() - title: LocaleKey = 'placeholders.not_available'; + heading = msg('Not available', { + id: 'form-card.fallback-title', + desc: 'The fallback title of a form card when the title is not provided.', + }); @property() - description: LocaleKeyOptional = ''; + description = ''; render() { return html`
-
${this.title}
+
${this.heading}
${cond(this.description && html`

${this.description}

`)}
diff --git a/packages/elements/src/elements/logto-profile-card.ts b/packages/elements/src/elements/logto-profile-card.ts new file mode 100644 index 000000000..faa12273a --- /dev/null +++ b/packages/elements/src/elements/logto-profile-card.ts @@ -0,0 +1,30 @@ +import { localized, msg } from '@lit/localize'; +import { LitElement, css, html } from 'lit'; +import { customElement } from 'lit/decorators.js'; + +import { vars } from '../utils/theme.js'; + +const tagName = 'logto-profile-card'; + +@customElement(tagName) +@localized() +export class LogtoProfileCard extends LitElement { + static tagName = tagName; + static styles = css` + p { + color: ${vars.colorTextSecondary}; + } + `; + + render() { + return html` + + +

🚧 This section is a dev feature that is still working in progress.

+
+
+ `; + } +} diff --git a/packages/elements/src/index.ts b/packages/elements/src/index.ts index d4cb36992..de8f49832 100644 --- a/packages/elements/src/index.ts +++ b/packages/elements/src/index.ts @@ -1,3 +1,6 @@ +export * from './components/logto-card-section.js'; export * from './components/logto-card.js'; export * from './components/logto-form-card.js'; export * from './components/logto-theme-provider.js'; +export * from './elements/logto-profile-card.js'; +export * from './utils/locale.js'; diff --git a/packages/elements/src/locales/en.ts b/packages/elements/src/locales/en.ts deleted file mode 100644 index f8998af8b..000000000 --- a/packages/elements/src/locales/en.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const en = Object.freeze({ - placeholders: { - not_available: 'Not available', - }, - sections: { - profile: 'Profile', - security: 'Security', - }, -}); diff --git a/packages/elements/src/locales/index.ts b/packages/elements/src/locales/index.ts deleted file mode 100644 index bfce23d86..000000000 --- a/packages/elements/src/locales/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { type en } from './en.js'; - -type KeyPath = T extends Record - ? { - [K in keyof T]: K extends string - ? T[K] extends Record - ? `${K}.${KeyPath}` - : `${K}` - : never; - }[keyof T] - : ''; - -/** The type of a full locale data object. */ -export type LocaleData = typeof en; - -/** - * The type of a locale key. It is a string that represents a path to a value in the locale data - * object. - * - * @example - * With the following locale data object: - * - * ```ts - * const en = { - * profile: { - * title: 'Profile', - * description: 'Your profile', - * }, - * }; - * ``` - * - * The locale key for the title would be `'profile.title'`. - */ -export type LocaleKey = KeyPath; - -/** - * The type of a locale key that is optional. Note that it uses an empty string to represent the - * absence of a key since Web Components do not support `undefined` as a property value. - */ -export type LocaleKeyOptional = LocaleKey | ''; diff --git a/packages/elements/src/react.ts b/packages/elements/src/react.ts index 1a3df2b52..cacc64ea1 100644 --- a/packages/elements/src/react.ts +++ b/packages/elements/src/react.ts @@ -1,6 +1,8 @@ import { createComponent } from '@lit/react'; -import { LogtoThemeProvider, LogtoCard, LogtoFormCard } from './index.js'; +import { LogtoThemeProvider, LogtoCard, LogtoFormCard, LogtoProfileCard } from './index.js'; + +export * from './utils/locale.js'; export const createReactComponents = (react: Parameters[0]['react']) => { return { @@ -9,6 +11,11 @@ export const createReactComponents = (react: Parameters[ elementClass: LogtoFormCard, react, }), + LogtoProfileCard: createComponent({ + tagName: LogtoProfileCard.tagName, + elementClass: LogtoProfileCard, + react, + }), LogtoCard: createComponent({ tagName: LogtoCard.tagName, elementClass: LogtoCard, diff --git a/packages/elements/src/utils/locale.ts b/packages/elements/src/utils/locale.ts new file mode 100644 index 000000000..7b41d4213 --- /dev/null +++ b/packages/elements/src/utils/locale.ts @@ -0,0 +1,11 @@ +import { configureLocalization } from '@lit/localize'; + +// Generated via output.localeCodesModule +import { sourceLocale, targetLocales } from '../generated/locale-codes.js'; + +export const initLocalization = () => + configureLocalization({ + sourceLocale, + targetLocales, + loadLocale: async (locale) => import(`/locales/${locale}.js`), + }); diff --git a/packages/elements/xliff/de.xlf b/packages/elements/xliff/de.xlf new file mode 100644 index 000000000..29226b9e3 --- /dev/null +++ b/packages/elements/xliff/de.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Nicht verfügbar + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/es.xlf b/packages/elements/xliff/es.xlf new file mode 100644 index 000000000..27081c5ff --- /dev/null +++ b/packages/elements/xliff/es.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + No disponible + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/fr.xlf b/packages/elements/xliff/fr.xlf new file mode 100644 index 000000000..d15883afb --- /dev/null +++ b/packages/elements/xliff/fr.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Non disponible + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/it.xlf b/packages/elements/xliff/it.xlf new file mode 100644 index 000000000..891dd2a0c --- /dev/null +++ b/packages/elements/xliff/it.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Non disponibile + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/ja.xlf b/packages/elements/xliff/ja.xlf new file mode 100644 index 000000000..cd69abf18 --- /dev/null +++ b/packages/elements/xliff/ja.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + 利用できません + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/ko.xlf b/packages/elements/xliff/ko.xlf new file mode 100644 index 000000000..11d955e80 --- /dev/null +++ b/packages/elements/xliff/ko.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + 사용할 수 없음 + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/pl-PL.xlf b/packages/elements/xliff/pl-PL.xlf new file mode 100644 index 000000000..6773af30b --- /dev/null +++ b/packages/elements/xliff/pl-PL.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Niedostępne + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/pt-BR.xlf b/packages/elements/xliff/pt-BR.xlf new file mode 100644 index 000000000..d13410c2f --- /dev/null +++ b/packages/elements/xliff/pt-BR.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Não disponível + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/pt-PT.xlf b/packages/elements/xliff/pt-PT.xlf new file mode 100644 index 000000000..7c4554c56 --- /dev/null +++ b/packages/elements/xliff/pt-PT.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Não disponível + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/ru.xlf b/packages/elements/xliff/ru.xlf new file mode 100644 index 000000000..04de78375 --- /dev/null +++ b/packages/elements/xliff/ru.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Недоступно + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/tr-TR.xlf b/packages/elements/xliff/tr-TR.xlf new file mode 100644 index 000000000..2a68b7f21 --- /dev/null +++ b/packages/elements/xliff/tr-TR.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + Mevcut değil + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/zh-CN.xlf b/packages/elements/xliff/zh-CN.xlf new file mode 100644 index 000000000..ddd4d3298 --- /dev/null +++ b/packages/elements/xliff/zh-CN.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + 不可用 + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/zh-HK.xlf b/packages/elements/xliff/zh-HK.xlf new file mode 100644 index 000000000..010937564 --- /dev/null +++ b/packages/elements/xliff/zh-HK.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + 不可用 + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/packages/elements/xliff/zh-TW.xlf b/packages/elements/xliff/zh-TW.xlf new file mode 100644 index 000000000..baff9eed8 --- /dev/null +++ b/packages/elements/xliff/zh-TW.xlf @@ -0,0 +1,18 @@ + + + + + + Not available + 不可用 + The fallback title of a form card when the title is not provided. + + + Profile + + + Personal information + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 90e736f82..3cfa8d267 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3144,7 +3144,7 @@ importers: version: 2.2.0(react@18.2.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3) + version: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) tslib: specifier: ^2.4.1 version: 2.4.1 @@ -3567,6 +3567,9 @@ importers: specifier: ^3.1.4 version: 3.1.4 devDependencies: + '@lit/localize-tools': + specifier: ^0.7.2 + version: 0.7.2 '@silverhand/eslint-config': specifier: 6.0.1 version: 6.0.1(eslint@8.57.0)(prettier@3.0.0)(typescript@5.3.3) @@ -5217,6 +5220,10 @@ packages: '@lit-labs/ssr-dom-shim@1.2.0': resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} + '@lit/localize-tools@0.7.2': + resolution: {integrity: sha512-d5tehVao3Hz1DlTq6jy7TUYrCeyFi/E4BkzWr8MuAMjIM8aoKCR9s3cUw6m++8ZIiqGm2z7+6aHaPc/p1FGHyA==} + hasBin: true + '@lit/localize@0.12.1': resolution: {integrity: sha512-uuF6OO6fjqomCf3jXsJ5cTGf1APYuN88S4Gvo/fjt9YkG4OMaMvpEUqd5oWhyzrJfY+HcenAbLJNi2Cq3H7gdg==} @@ -5652,6 +5659,9 @@ packages: peerDependencies: '@parcel/core': ^2.9.3 + '@parse5/tools@0.3.0': + resolution: {integrity: sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==} + '@peculiar/asn1-android@2.3.10': resolution: {integrity: sha512-z9Rx9cFJv7UUablZISe7uksNbFJCq13hO0yEAOoIpAymALTLlvUOSLnGiQS7okPaM5dP42oTLhezH6XDXRXjGw==} @@ -8811,6 +8821,10 @@ packages: resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} engines: {node: '>=0.10.0'} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -9948,10 +9962,16 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -12243,6 +12263,9 @@ packages: source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -12890,6 +12913,10 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -14945,6 +14972,20 @@ snapshots: '@lit-labs/ssr-dom-shim@1.2.0': {} + '@lit/localize-tools@0.7.2': + dependencies: + '@lit/localize': 0.12.1 + '@parse5/tools': 0.3.0 + '@xmldom/xmldom': 0.8.7 + fast-glob: 3.3.2 + fs-extra: 10.1.0 + jsonschema: 1.4.1 + lit: 3.1.4 + minimist: 1.2.8 + parse5: 7.1.1 + source-map-support: 0.5.21 + typescript: 5.3.3 + '@lit/localize@0.12.1': dependencies: lit: 3.1.4 @@ -15721,6 +15762,10 @@ snapshots: '@parcel/utils': 2.9.3 nullthrows: 1.1.1 + '@parse5/tools@0.3.0': + dependencies: + parse5: 7.1.1 + '@peculiar/asn1-android@2.3.10': dependencies: '@peculiar/asn1-schema': 2.3.8 @@ -16062,10 +16107,10 @@ snapshots: eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-config-xo: 0.44.0(eslint@8.57.0) eslint-config-xo-typescript: 4.0.0(@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-consistent-default-export-name: 0.0.15 eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-n: 17.2.1(eslint@8.57.0) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.0.0) @@ -18898,13 +18943,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -18915,14 +18960,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7(supports-color@5.5.0) optionalDependencies: '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -18944,7 +18989,7 @@ snapshots: eslint: 8.57.0 ignore: 5.3.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -18954,7 +18999,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -19457,6 +19502,12 @@ snapshots: fs-exists-sync@0.1.0: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -20528,7 +20579,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.7 - ts-node: 10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -20987,8 +21038,16 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsonparse@1.3.1: {} + jsonschema@1.4.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -22820,7 +22879,7 @@ snapshots: yaml: 2.4.5 optionalDependencies: postcss: 8.4.39 - ts-node: 10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3) postcss-media-query-parser@0.2.3: {} @@ -23883,6 +23942,11 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.6.1: {} source-map@0.7.4: {} @@ -24399,7 +24463,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.3.52)(@types/node@20.12.7)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.3.52(@swc/helpers@0.5.1))(@types/node@20.12.7)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -24609,6 +24673,8 @@ snapshots: universalify@0.2.0: {} + universalify@2.0.1: {} + unpipe@1.0.0: {} update-browserslist-db@1.0.10(browserslist@4.21.4):