@pie-players/pie-players-shared 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/profile.d.ts +15 -0
- package/dist/config/profile.d.ts.map +1 -0
- package/dist/config/profile.js +27 -0
- package/dist/config/profile.js.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +12 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/loader.d.ts +36 -0
- package/dist/i18n/loader.d.ts.map +1 -0
- package/dist/i18n/loader.js +133 -0
- package/dist/i18n/loader.js.map +1 -0
- package/dist/i18n/scripts/check-coverage.d.ts +16 -0
- package/dist/i18n/scripts/check-coverage.d.ts.map +1 -0
- package/dist/i18n/scripts/check-coverage.js +262 -0
- package/dist/i18n/scripts/check-coverage.js.map +1 -0
- package/dist/i18n/scripts/scan-hardcoded.d.ts +16 -0
- package/dist/i18n/scripts/scan-hardcoded.d.ts.map +1 -0
- package/dist/i18n/scripts/scan-hardcoded.js +266 -0
- package/dist/i18n/scripts/scan-hardcoded.js.map +1 -0
- package/dist/i18n/simple-i18n.d.ts +69 -0
- package/dist/i18n/simple-i18n.d.ts.map +1 -0
- package/dist/i18n/simple-i18n.js +199 -0
- package/dist/i18n/simple-i18n.js.map +1 -0
- package/dist/i18n/translations/ar/common.json +36 -0
- package/dist/i18n/translations/ar/toolkit.json +48 -0
- package/dist/i18n/translations/ar/tools.json +109 -0
- package/dist/i18n/translations/en/common.json +36 -0
- package/dist/i18n/translations/en/toolkit.json +48 -0
- package/dist/i18n/translations/en/tools.json +109 -0
- package/dist/i18n/translations/es/common.json +36 -0
- package/dist/i18n/translations/es/toolkit.json +48 -0
- package/dist/i18n/translations/es/tools.json +109 -0
- package/dist/i18n/translations/zh/common.json +36 -0
- package/dist/i18n/translations/zh/toolkit.json +48 -0
- package/dist/i18n/translations/zh/tools.json +109 -0
- package/dist/i18n/types.d.ts +58 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/use-i18n-standalone.svelte.d.ts +87 -0
- package/dist/i18n/use-i18n-standalone.svelte.d.ts.map +1 -0
- package/dist/i18n/use-i18n-standalone.svelte.js +151 -0
- package/dist/i18n/use-i18n-standalone.svelte.js.map +1 -0
- package/dist/i18n/use-i18n.svelte.d.ts +67 -0
- package/dist/i18n/use-i18n.svelte.d.ts.map +1 -0
- package/dist/i18n/use-i18n.svelte.js +144 -0
- package/dist/i18n/use-i18n.svelte.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/index.d.ts +53 -0
- package/dist/instrumentation/index.d.ts.map +1 -0
- package/dist/instrumentation/index.js +53 -0
- package/dist/instrumentation/index.js.map +1 -0
- package/dist/instrumentation/providers/BaseInstrumentationProvider.d.ts +197 -0
- package/dist/instrumentation/providers/BaseInstrumentationProvider.d.ts.map +1 -0
- package/dist/instrumentation/providers/BaseInstrumentationProvider.js +267 -0
- package/dist/instrumentation/providers/BaseInstrumentationProvider.js.map +1 -0
- package/dist/instrumentation/providers/ConsoleInstrumentationProvider.d.ts +106 -0
- package/dist/instrumentation/providers/ConsoleInstrumentationProvider.d.ts.map +1 -0
- package/dist/instrumentation/providers/ConsoleInstrumentationProvider.js +182 -0
- package/dist/instrumentation/providers/ConsoleInstrumentationProvider.js.map +1 -0
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts +170 -0
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts.map +1 -0
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.js +183 -0
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.js.map +1 -0
- package/dist/instrumentation/providers/NewRelicInstrumentationProvider.d.ts +86 -0
- package/dist/instrumentation/providers/NewRelicInstrumentationProvider.d.ts.map +1 -0
- package/dist/instrumentation/providers/NewRelicInstrumentationProvider.js +135 -0
- package/dist/instrumentation/providers/NewRelicInstrumentationProvider.js.map +1 -0
- package/dist/instrumentation/providers/index.d.ts +12 -0
- package/dist/instrumentation/providers/index.d.ts.map +1 -0
- package/dist/instrumentation/providers/index.js +12 -0
- package/dist/instrumentation/providers/index.js.map +1 -0
- package/dist/instrumentation/types.d.ts +348 -0
- package/dist/instrumentation/types.d.ts.map +1 -0
- package/dist/instrumentation/types.js +9 -0
- package/dist/instrumentation/types.js.map +1 -0
- package/dist/loader-config.d.ts +76 -0
- package/dist/loader-config.d.ts.map +1 -0
- package/dist/loader-config.js +12 -0
- package/dist/loader-config.js.map +1 -0
- package/dist/loaders/ElementLoader.d.ts +72 -0
- package/dist/loaders/ElementLoader.d.ts.map +1 -0
- package/dist/loaders/ElementLoader.js +52 -0
- package/dist/loaders/ElementLoader.js.map +1 -0
- package/dist/loaders/EsmElementLoader.d.ts +67 -0
- package/dist/loaders/EsmElementLoader.d.ts.map +1 -0
- package/dist/loaders/EsmElementLoader.js +71 -0
- package/dist/loaders/EsmElementLoader.js.map +1 -0
- package/dist/loaders/IifeElementLoader.d.ts +61 -0
- package/dist/loaders/IifeElementLoader.d.ts.map +1 -0
- package/dist/loaders/IifeElementLoader.js +63 -0
- package/dist/loaders/IifeElementLoader.js.map +1 -0
- package/dist/loaders/index.d.ts +28 -0
- package/dist/loaders/index.d.ts.map +1 -0
- package/dist/loaders/index.js +25 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/object/index.d.ts +12 -0
- package/dist/object/index.d.ts.map +1 -0
- package/dist/object/index.js +40 -0
- package/dist/object/index.js.map +1 -0
- package/dist/pie/asset-handler.d.ts +64 -0
- package/dist/pie/asset-handler.d.ts.map +1 -0
- package/dist/pie/asset-handler.js +238 -0
- package/dist/pie/asset-handler.js.map +1 -0
- package/dist/pie/component-context.d.ts +22 -0
- package/dist/pie/component-context.d.ts.map +1 -0
- package/dist/pie/component-context.js +30 -0
- package/dist/pie/component-context.js.map +1 -0
- package/dist/pie/config.d.ts +39 -0
- package/dist/pie/config.d.ts.map +1 -0
- package/dist/pie/config.js +174 -0
- package/dist/pie/config.js.map +1 -0
- package/dist/pie/configure-initialization.d.ts +35 -0
- package/dist/pie/configure-initialization.d.ts.map +1 -0
- package/dist/pie/configure-initialization.js +141 -0
- package/dist/pie/configure-initialization.js.map +1 -0
- package/dist/pie/esm-loader.d.ts +93 -0
- package/dist/pie/esm-loader.d.ts.map +1 -0
- package/dist/pie/esm-loader.js +308 -0
- package/dist/pie/esm-loader.js.map +1 -0
- package/dist/pie/iife-loader.d.ts +76 -0
- package/dist/pie/iife-loader.d.ts.map +1 -0
- package/dist/pie/iife-loader.js +303 -0
- package/dist/pie/iife-loader.js.map +1 -0
- package/dist/pie/index.d.ts +31 -0
- package/dist/pie/index.d.ts.map +1 -0
- package/dist/pie/index.js +34 -0
- package/dist/pie/index.js.map +1 -0
- package/dist/pie/initialization.d.ts +40 -0
- package/dist/pie/initialization.d.ts.map +1 -0
- package/dist/pie/initialization.js +349 -0
- package/dist/pie/initialization.js.map +1 -0
- package/dist/pie/logger.d.ts +64 -0
- package/dist/pie/logger.d.ts.map +1 -0
- package/dist/pie/logger.js +45 -0
- package/dist/pie/logger.js.map +1 -0
- package/dist/pie/math-rendering.d.ts +69 -0
- package/dist/pie/math-rendering.d.ts.map +1 -0
- package/dist/pie/math-rendering.js +98 -0
- package/dist/pie/math-rendering.js.map +1 -0
- package/dist/pie/overrides.d.ts +43 -0
- package/dist/pie/overrides.d.ts.map +1 -0
- package/dist/pie/overrides.js +146 -0
- package/dist/pie/overrides.js.map +1 -0
- package/dist/pie/player-initializer.d.ts +55 -0
- package/dist/pie/player-initializer.d.ts.map +1 -0
- package/dist/pie/player-initializer.js +123 -0
- package/dist/pie/player-initializer.js.map +1 -0
- package/dist/pie/registry.d.ts +11 -0
- package/dist/pie/registry.d.ts.map +1 -0
- package/dist/pie/registry.js +21 -0
- package/dist/pie/registry.js.map +1 -0
- package/dist/pie/resource-monitor.d.ts +208 -0
- package/dist/pie/resource-monitor.d.ts.map +1 -0
- package/dist/pie/resource-monitor.js +969 -0
- package/dist/pie/resource-monitor.js.map +1 -0
- package/dist/pie/scoring.d.ts +17 -0
- package/dist/pie/scoring.d.ts.map +1 -0
- package/dist/pie/scoring.js +84 -0
- package/dist/pie/scoring.js.map +1 -0
- package/dist/pie/types.d.ts +136 -0
- package/dist/pie/types.d.ts.map +1 -0
- package/dist/pie/types.js +52 -0
- package/dist/pie/types.js.map +1 -0
- package/dist/pie/updates.d.ts +20 -0
- package/dist/pie/updates.d.ts.map +1 -0
- package/dist/pie/updates.js +175 -0
- package/dist/pie/updates.js.map +1 -0
- package/dist/pie/use-resource-monitor.svelte.d.ts +56 -0
- package/dist/pie/use-resource-monitor.svelte.d.ts.map +1 -0
- package/dist/pie/use-resource-monitor.svelte.js +117 -0
- package/dist/pie/use-resource-monitor.svelte.js.map +1 -0
- package/dist/pie/utils.d.ts +44 -0
- package/dist/pie/utils.d.ts.map +1 -0
- package/dist/pie/utils.js +74 -0
- package/dist/pie/utils.js.map +1 -0
- package/dist/types/custom-elements.d.ts +183 -0
- package/dist/types/custom-elements.d.ts.map +1 -0
- package/dist/types/custom-elements.js +8 -0
- package/dist/types/custom-elements.js.map +1 -0
- package/dist/types/index.d.ts +761 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +120 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/search.d.ts +105 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +12 -0
- package/dist/types/search.js.map +1 -0
- package/dist/types/transform.d.ts +48 -0
- package/dist/types/transform.d.ts.map +1 -0
- package/dist/types/transform.js +21 -0
- package/dist/types/transform.js.map +1 -0
- package/dist/ui/focus-trap.d.ts +10 -0
- package/dist/ui/focus-trap.d.ts.map +1 -0
- package/dist/ui/focus-trap.js +30 -0
- package/dist/ui/focus-trap.js.map +1 -0
- package/dist/ui/safe-storage.d.ts +3 -0
- package/dist/ui/safe-storage.d.ts.map +1 -0
- package/dist/ui/safe-storage.js +21 -0
- package/dist/ui/safe-storage.js.map +1 -0
- package/package.json +118 -0
- package/src/components/PieItemPlayer.svelte +604 -0
- package/src/components/PiePreviewLayout.svelte +144 -0
- package/src/components/PiePreviewToggle.svelte +110 -0
- package/src/components/PieSpinner.svelte +85 -0
- package/src/components/ToolSettingsButton.svelte +31 -0
- package/src/components/ToolSettingsPanel.svelte +90 -0
- package/src/components/index.ts +6 -0
- package/src/i18n/README.md +223 -0
- package/src/i18n/index.ts +26 -0
- package/src/i18n/loader.ts +156 -0
- package/src/i18n/scripts/check-coverage.ts +345 -0
- package/src/i18n/scripts/scan-hardcoded.ts +342 -0
- package/src/i18n/simple-i18n.ts +236 -0
- package/src/i18n/translations/ar/common.json +36 -0
- package/src/i18n/translations/ar/toolkit.json +48 -0
- package/src/i18n/translations/ar/tools.json +109 -0
- package/src/i18n/translations/en/common.json +36 -0
- package/src/i18n/translations/en/toolkit.json +48 -0
- package/src/i18n/translations/en/tools.json +109 -0
- package/src/i18n/translations/es/common.json +36 -0
- package/src/i18n/translations/es/toolkit.json +48 -0
- package/src/i18n/translations/es/tools.json +109 -0
- package/src/i18n/translations/zh/common.json +36 -0
- package/src/i18n/translations/zh/toolkit.json +48 -0
- package/src/i18n/translations/zh/tools.json +109 -0
- package/src/i18n/types.ts +66 -0
- package/src/i18n/use-i18n-standalone.svelte.ts +184 -0
- package/src/i18n/use-i18n.svelte.ts +163 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal, frontend-safe defaults for PIE build service URLs.
|
|
3
|
+
*
|
|
4
|
+
* In PIEOneer, these come from `$env/dynamic/public`. In `pie-players` we avoid
|
|
5
|
+
* SvelteKit env dependencies so this can be consumed by any bundler.
|
|
6
|
+
*/
|
|
7
|
+
declare global {
|
|
8
|
+
interface Window {
|
|
9
|
+
PIE_BUILDER_ORIGIN_URL?: string;
|
|
10
|
+
PIE_BUILDER_BUNDLE_URL?: string;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export declare const BUILDER_ORIGIN_URL: string;
|
|
14
|
+
export declare const BUILDER_BUNDLE_URL: string;
|
|
15
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/config/profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;KAChC;CACD;AAWD,eAAO,MAAM,kBAAkB,QAGJ,CAAC;AAE5B,eAAO,MAAM,kBAAkB,QAGJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal, frontend-safe defaults for PIE build service URLs.
|
|
3
|
+
*
|
|
4
|
+
* In PIEOneer, these come from `$env/dynamic/public`. In `pie-players` we avoid
|
|
5
|
+
* SvelteKit env dependencies so this can be consumed by any bundler.
|
|
6
|
+
*/
|
|
7
|
+
// Default public bundle host. Keep this aligned with the IIFE loader default.
|
|
8
|
+
// (We prefer the proxy endpoint, which is stable/cached for browser usage.)
|
|
9
|
+
const DEFAULT_BUILDER_ORIGIN_URL = "https://proxy.pie-api.com";
|
|
10
|
+
const DEFAULT_BUILDER_BUNDLE_URL = `${DEFAULT_BUILDER_ORIGIN_URL}/bundles/`;
|
|
11
|
+
function readPublicEnv(key) {
|
|
12
|
+
try {
|
|
13
|
+
// Vite/SvelteKit-like
|
|
14
|
+
const v = import.meta?.env?.[key];
|
|
15
|
+
if (typeof v === "string" && v.length > 0)
|
|
16
|
+
return v;
|
|
17
|
+
}
|
|
18
|
+
catch { }
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
export const BUILDER_ORIGIN_URL = (typeof window !== "undefined" && window.PIE_BUILDER_ORIGIN_URL) ||
|
|
22
|
+
readPublicEnv("PUBLIC_BUILDER_ORIGIN_URL") ||
|
|
23
|
+
DEFAULT_BUILDER_ORIGIN_URL;
|
|
24
|
+
export const BUILDER_BUNDLE_URL = (typeof window !== "undefined" && window.PIE_BUILDER_BUNDLE_URL) ||
|
|
25
|
+
readPublicEnv("PUBLIC_BUILDER_BUNDLE_URL") ||
|
|
26
|
+
DEFAULT_BUILDER_BUNDLE_URL;
|
|
27
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/config/profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,4EAA4E;AAC5E,MAAM,0BAA0B,GAAG,2BAA2B,CAAC;AAC/D,MAAM,0BAA0B,GAAG,GAAG,0BAA0B,WAAW,CAAC;AAS5E,SAAS,aAAa,CAAC,GAAW;IACjC,IAAI,CAAC;QACJ,sBAAsB;QACtB,MAAM,CAAC,GAAI,MAAM,CAAC,IAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAC9B,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,sBAAsB,CAAC;IAChE,aAAa,CAAC,2BAA2B,CAAC;IAC1C,0BAA0B,CAAC;AAE5B,MAAM,CAAC,MAAM,kBAAkB,GAC9B,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,sBAAsB,CAAC;IAChE,aAAa,CAAC,2BAA2B,CAAC;IAC1C,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* I18n Module
|
|
3
|
+
*
|
|
4
|
+
* Internationalization system for PIE Players.
|
|
5
|
+
*
|
|
6
|
+
* @module @pie-players/pie-players-shared/i18n
|
|
7
|
+
*/
|
|
8
|
+
export { BUNDLED_TRANSLATIONS, getAvailableLocales, isRTLLocale, loadTranslations, } from "./loader";
|
|
9
|
+
export { SimpleI18n } from "./simple-i18n";
|
|
10
|
+
export type { I18nConfig, II18nService, PluralTranslation, TranslationBundle, } from "./types";
|
|
11
|
+
export { useI18n } from "./use-i18n.svelte";
|
|
12
|
+
export { type UseI18nStandaloneConfig, useI18nStandalone, } from "./use-i18n-standalone.svelte";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACX,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACN,KAAK,uBAAuB,EAC5B,iBAAiB,GACjB,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* I18n Module
|
|
3
|
+
*
|
|
4
|
+
* Internationalization system for PIE Players.
|
|
5
|
+
*
|
|
6
|
+
* @module @pie-players/pie-players-shared/i18n
|
|
7
|
+
*/
|
|
8
|
+
export { BUNDLED_TRANSLATIONS, getAvailableLocales, isRTLLocale, loadTranslations, } from "./loader";
|
|
9
|
+
export { SimpleI18n } from "./simple-i18n";
|
|
10
|
+
export { useI18n } from "./use-i18n.svelte";
|
|
11
|
+
export { useI18nStandalone, } from "./use-i18n-standalone.svelte";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAEN,iBAAiB,GACjB,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translation Loader
|
|
3
|
+
*
|
|
4
|
+
* Implements hybrid loading strategy:
|
|
5
|
+
* - English bundled with application
|
|
6
|
+
* - Other languages loaded on demand
|
|
7
|
+
*
|
|
8
|
+
* Part of PIE Players i18n system.
|
|
9
|
+
*/
|
|
10
|
+
import type { TranslationBundle } from "./types";
|
|
11
|
+
/**
|
|
12
|
+
* Bundled English translations
|
|
13
|
+
* Available immediately without network request
|
|
14
|
+
*/
|
|
15
|
+
export declare const BUNDLED_TRANSLATIONS: Record<string, TranslationBundle>;
|
|
16
|
+
/**
|
|
17
|
+
* Load translations for a locale
|
|
18
|
+
*
|
|
19
|
+
* @param locale Locale code (e.g., 'en', 'es', 'zh', 'ar')
|
|
20
|
+
* @returns Translation bundle with flattened keys
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadTranslations(locale: string): Promise<TranslationBundle>;
|
|
23
|
+
/**
|
|
24
|
+
* Get available locales
|
|
25
|
+
*
|
|
26
|
+
* @returns Array of locale codes
|
|
27
|
+
*/
|
|
28
|
+
export declare function getAvailableLocales(): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Check if locale is RTL
|
|
31
|
+
*
|
|
32
|
+
* @param locale Locale code
|
|
33
|
+
* @returns True if locale is right-to-left
|
|
34
|
+
*/
|
|
35
|
+
export declare function isRTLLocale(locale: string): boolean;
|
|
36
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/i18n/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAKjD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAUlE,CAAC;AAuBF;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAgC5B;AA0CD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translation Loader
|
|
3
|
+
*
|
|
4
|
+
* Implements hybrid loading strategy:
|
|
5
|
+
* - English bundled with application
|
|
6
|
+
* - Other languages loaded on demand
|
|
7
|
+
*
|
|
8
|
+
* Part of PIE Players i18n system.
|
|
9
|
+
*/
|
|
10
|
+
// Import English translations (bundled)
|
|
11
|
+
import enCommon from "./translations/en/common.json";
|
|
12
|
+
import enToolkit from "./translations/en/toolkit.json";
|
|
13
|
+
import enTools from "./translations/en/tools.json";
|
|
14
|
+
// RTL locales
|
|
15
|
+
const RTL_LOCALES = ["ar", "he", "fa", "ur"];
|
|
16
|
+
/**
|
|
17
|
+
* Bundled English translations
|
|
18
|
+
* Available immediately without network request
|
|
19
|
+
*/
|
|
20
|
+
export const BUNDLED_TRANSLATIONS = {
|
|
21
|
+
en: {
|
|
22
|
+
locale: "en",
|
|
23
|
+
direction: "ltr",
|
|
24
|
+
translations: {
|
|
25
|
+
...flattenTranslations(enCommon),
|
|
26
|
+
...flattenTranslations(enToolkit),
|
|
27
|
+
...flattenTranslations(enTools),
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const LOCALE_IMPORTS = {
|
|
32
|
+
es: () => Promise.all([
|
|
33
|
+
import("./translations/es/common.json"),
|
|
34
|
+
import("./translations/es/toolkit.json"),
|
|
35
|
+
import("./translations/es/tools.json"),
|
|
36
|
+
]),
|
|
37
|
+
zh: () => Promise.all([
|
|
38
|
+
import("./translations/zh/common.json"),
|
|
39
|
+
import("./translations/zh/toolkit.json"),
|
|
40
|
+
import("./translations/zh/tools.json"),
|
|
41
|
+
]),
|
|
42
|
+
ar: () => Promise.all([
|
|
43
|
+
import("./translations/ar/common.json"),
|
|
44
|
+
import("./translations/ar/toolkit.json"),
|
|
45
|
+
import("./translations/ar/tools.json"),
|
|
46
|
+
]),
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Load translations for a locale
|
|
50
|
+
*
|
|
51
|
+
* @param locale Locale code (e.g., 'en', 'es', 'zh', 'ar')
|
|
52
|
+
* @returns Translation bundle with flattened keys
|
|
53
|
+
*/
|
|
54
|
+
export async function loadTranslations(locale) {
|
|
55
|
+
// Return bundled English immediately
|
|
56
|
+
if (locale === "en") {
|
|
57
|
+
return BUNDLED_TRANSLATIONS.en;
|
|
58
|
+
}
|
|
59
|
+
const importer = LOCALE_IMPORTS[locale];
|
|
60
|
+
if (!importer) {
|
|
61
|
+
throw new Error(`Translation files not found for locale: ${locale}. Ensure translation files exist in packages/players-shared/src/i18n/translations/${locale}/`);
|
|
62
|
+
}
|
|
63
|
+
// Lazy load other locales
|
|
64
|
+
try {
|
|
65
|
+
const [common, toolkit, tools] = await importer();
|
|
66
|
+
return {
|
|
67
|
+
locale,
|
|
68
|
+
direction: RTL_LOCALES.includes(locale) ? "rtl" : "ltr",
|
|
69
|
+
translations: {
|
|
70
|
+
...flattenTranslations(common.default || common),
|
|
71
|
+
...flattenTranslations(toolkit.default || toolkit),
|
|
72
|
+
...flattenTranslations(tools.default || tools),
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error(`Failed to load translations for locale: ${locale}`, error);
|
|
78
|
+
throw new Error(`Translation files not found for locale: ${locale}. Ensure translation files exist in packages/players-shared/src/i18n/translations/${locale}/`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Flatten nested JSON to dot notation
|
|
83
|
+
*
|
|
84
|
+
* Converts:
|
|
85
|
+
* { "common": { "save": "Save" } }
|
|
86
|
+
*
|
|
87
|
+
* To:
|
|
88
|
+
* { "common.save": "Save" }
|
|
89
|
+
*
|
|
90
|
+
* @param obj Nested translation object
|
|
91
|
+
* @param prefix Current key prefix
|
|
92
|
+
* @param result Accumulated result
|
|
93
|
+
* @returns Flattened translation object
|
|
94
|
+
*/
|
|
95
|
+
function flattenTranslations(obj, prefix = "", result = {}) {
|
|
96
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
97
|
+
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
98
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
99
|
+
// Check if it's a plural form (has 'one' or 'other' keys)
|
|
100
|
+
if ("one" in value || "other" in value) {
|
|
101
|
+
// This is a plural translation, keep it as an object
|
|
102
|
+
result[newKey] = value;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// This is a nested object, flatten recursively
|
|
106
|
+
flattenTranslations(value, newKey, result);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// This is a leaf value
|
|
111
|
+
result[newKey] = value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get available locales
|
|
118
|
+
*
|
|
119
|
+
* @returns Array of locale codes
|
|
120
|
+
*/
|
|
121
|
+
export function getAvailableLocales() {
|
|
122
|
+
return ["en", "es", "zh", "ar"];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if locale is RTL
|
|
126
|
+
*
|
|
127
|
+
* @param locale Locale code
|
|
128
|
+
* @returns True if locale is right-to-left
|
|
129
|
+
*/
|
|
130
|
+
export function isRTLLocale(locale) {
|
|
131
|
+
return RTL_LOCALES.includes(locale);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/i18n/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Translation Coverage Checker
|
|
4
|
+
*
|
|
5
|
+
* Validates that all locales have complete translations compared to the reference locale (English).
|
|
6
|
+
* Adapted from pie-qti's translation coverage checker for JSON-based translations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* bun run packages/players-shared/src/i18n/scripts/check-coverage.ts
|
|
10
|
+
*
|
|
11
|
+
* Exit codes:
|
|
12
|
+
* 0 - All translations complete
|
|
13
|
+
* 1 - Missing translations found
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=check-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-coverage.d.ts","sourceRoot":"","sources":["../../../src/i18n/scripts/check-coverage.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Translation Coverage Checker
|
|
4
|
+
*
|
|
5
|
+
* Validates that all locales have complete translations compared to the reference locale (English).
|
|
6
|
+
* Adapted from pie-qti's translation coverage checker for JSON-based translations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* bun run packages/players-shared/src/i18n/scripts/check-coverage.ts
|
|
10
|
+
*
|
|
11
|
+
* Exit codes:
|
|
12
|
+
* 0 - All translations complete
|
|
13
|
+
* 1 - Missing translations found
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync } from "fs";
|
|
16
|
+
import { dirname, join, resolve } from "path";
|
|
17
|
+
import { fileURLToPath } from "url";
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
/**
|
|
21
|
+
* Extract all keys from a translation object recursively
|
|
22
|
+
*/
|
|
23
|
+
function extractKeys(obj, prefix = "") {
|
|
24
|
+
const keys = new Set();
|
|
25
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
26
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
27
|
+
if (typeof value === "object" && value !== null) {
|
|
28
|
+
// Check if it's a plural form (has 'one' and 'other' keys)
|
|
29
|
+
if ("one" in value && "other" in value) {
|
|
30
|
+
keys.add(fullKey);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Recurse for nested objects
|
|
34
|
+
const nested = extractKeys(value, fullKey);
|
|
35
|
+
nested.forEach((k) => keys.add(k));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
keys.add(fullKey);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return keys;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load all translations for a locale
|
|
46
|
+
*/
|
|
47
|
+
function loadLocaleTranslations(locale) {
|
|
48
|
+
const basePath = resolve(__dirname, "../translations", locale);
|
|
49
|
+
try {
|
|
50
|
+
const common = JSON.parse(readFileSync(join(basePath, "common.json"), "utf-8"));
|
|
51
|
+
const toolkit = JSON.parse(readFileSync(join(basePath, "toolkit.json"), "utf-8"));
|
|
52
|
+
const tools = JSON.parse(readFileSync(join(basePath, "tools.json"), "utf-8"));
|
|
53
|
+
return { ...common, ...toolkit, ...tools };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(`Error loading translations for locale ${locale}:`, error);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get value at a dot-notation path
|
|
62
|
+
*/
|
|
63
|
+
function getValueAtPath(obj, path) {
|
|
64
|
+
const keys = path.split(".");
|
|
65
|
+
let current = obj;
|
|
66
|
+
for (const key of keys) {
|
|
67
|
+
if (current && typeof current === "object" && key in current) {
|
|
68
|
+
current = current[key];
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return current;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if a value looks like English (starts with uppercase letter)
|
|
78
|
+
*/
|
|
79
|
+
function looksLikeEnglish(value) {
|
|
80
|
+
if (typeof value !== "string")
|
|
81
|
+
return false;
|
|
82
|
+
return /^[A-Z]/.test(value) && value.length > 1;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check translation coverage for a locale
|
|
86
|
+
*/
|
|
87
|
+
function checkLocale(referenceKeys, referenceTranslations, targetLocale) {
|
|
88
|
+
const targetTranslations = loadLocaleTranslations(targetLocale);
|
|
89
|
+
const targetKeys = extractKeys(targetTranslations);
|
|
90
|
+
// Missing keys (in reference but not in target)
|
|
91
|
+
const missing = Array.from(referenceKeys).filter((key) => !targetKeys.has(key));
|
|
92
|
+
// Extra keys (in target but not in reference)
|
|
93
|
+
const extra = Array.from(targetKeys).filter((key) => !referenceKeys.has(key));
|
|
94
|
+
// Potentially untranslated (same value as reference and looks like English)
|
|
95
|
+
const untranslated = Array.from(targetKeys).filter((key) => {
|
|
96
|
+
const refValue = getValueAtPath(referenceTranslations, key);
|
|
97
|
+
const targetValue = getValueAtPath(targetTranslations, key);
|
|
98
|
+
// For plural forms, check both 'one' and 'other'
|
|
99
|
+
if (typeof refValue === "object" && "one" in refValue) {
|
|
100
|
+
return (refValue.one === targetValue.one &&
|
|
101
|
+
refValue.other === targetValue.other &&
|
|
102
|
+
looksLikeEnglish(targetValue.one));
|
|
103
|
+
}
|
|
104
|
+
if (typeof refValue === "string" && typeof targetValue === "string") {
|
|
105
|
+
return refValue === targetValue && looksLikeEnglish(targetValue);
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
});
|
|
109
|
+
const translatedKeys = referenceKeys.size - missing.length;
|
|
110
|
+
const coverage = referenceKeys.size > 0 ? (translatedKeys / referenceKeys.size) * 100 : 0;
|
|
111
|
+
return {
|
|
112
|
+
locale: targetLocale,
|
|
113
|
+
coverage,
|
|
114
|
+
totalKeys: referenceKeys.size,
|
|
115
|
+
translatedKeys,
|
|
116
|
+
missing,
|
|
117
|
+
extra,
|
|
118
|
+
untranslated,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Format coverage report
|
|
123
|
+
*/
|
|
124
|
+
function formatReport(results) {
|
|
125
|
+
let report = "\n";
|
|
126
|
+
report += "┌─────────────────────────────────────────────────────┐\n";
|
|
127
|
+
report += "│ PIE Players Translation Coverage Report │\n";
|
|
128
|
+
report += `│ Reference Locale: en (${results[0]?.totalKeys || 0} keys) │\n`;
|
|
129
|
+
report += "└─────────────────────────────────────────────────────┘\n\n";
|
|
130
|
+
for (const result of results) {
|
|
131
|
+
report += `📋 Locale: ${result.locale}\n`;
|
|
132
|
+
report += "─────────────────────────────────────────────────────\n";
|
|
133
|
+
const coverageEmoji = result.coverage === 100 ? "✅" : result.coverage >= 95 ? "⚠️ " : "❌";
|
|
134
|
+
report += `${coverageEmoji} Coverage: ${result.coverage.toFixed(1)}% `;
|
|
135
|
+
report += `(${result.translatedKeys}/${result.totalKeys} keys)\n\n`;
|
|
136
|
+
if (result.coverage === 100 &&
|
|
137
|
+
result.extra.length === 0 &&
|
|
138
|
+
result.untranslated.length === 0) {
|
|
139
|
+
report += "✅ All keys present and translated!\n\n";
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (result.missing.length > 0) {
|
|
143
|
+
report += `❌ Missing Keys (${result.missing.length}):\n`;
|
|
144
|
+
const displayCount = Math.min(result.missing.length, 15);
|
|
145
|
+
result.missing.slice(0, displayCount).forEach((key) => {
|
|
146
|
+
report += ` • ${key}\n`;
|
|
147
|
+
});
|
|
148
|
+
if (result.missing.length > displayCount) {
|
|
149
|
+
report += ` ... and ${result.missing.length - displayCount} more\n`;
|
|
150
|
+
}
|
|
151
|
+
report += "\n";
|
|
152
|
+
}
|
|
153
|
+
if (result.extra.length > 0) {
|
|
154
|
+
report += `⚠️ Extra Keys (${result.extra.length}) - Not in reference locale:\n`;
|
|
155
|
+
const displayCount = Math.min(result.extra.length, 10);
|
|
156
|
+
result.extra.slice(0, displayCount).forEach((key) => {
|
|
157
|
+
report += ` • ${key}\n`;
|
|
158
|
+
});
|
|
159
|
+
if (result.extra.length > displayCount) {
|
|
160
|
+
report += ` ... and ${result.extra.length - displayCount} more\n`;
|
|
161
|
+
}
|
|
162
|
+
report += "\n";
|
|
163
|
+
}
|
|
164
|
+
if (result.untranslated.length > 0) {
|
|
165
|
+
report += `⚠️ Potentially Untranslated (${result.untranslated.length}):\n`;
|
|
166
|
+
const displayCount = Math.min(result.untranslated.length, 10);
|
|
167
|
+
result.untranslated.slice(0, displayCount).forEach((key) => {
|
|
168
|
+
const value = getValueAtPath(loadLocaleTranslations(result.locale), key);
|
|
169
|
+
const displayValue = typeof value === "string" ? value : JSON.stringify(value);
|
|
170
|
+
report += ` • ${key} = "${displayValue}"\n`;
|
|
171
|
+
});
|
|
172
|
+
if (result.untranslated.length > displayCount) {
|
|
173
|
+
report += ` ... and ${result.untranslated.length - displayCount} more\n`;
|
|
174
|
+
}
|
|
175
|
+
report += "\n";
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Summary
|
|
180
|
+
report += "════════════════════════════════════════════════════════\n";
|
|
181
|
+
report += "📊 Summary:\n";
|
|
182
|
+
report += "────────────────────────────────────────────────────────\n";
|
|
183
|
+
for (const result of results) {
|
|
184
|
+
const emoji = result.coverage === 100 ? "✅" : result.coverage >= 95 ? "⚠️ " : "❌";
|
|
185
|
+
const status = result.coverage === 100
|
|
186
|
+
? result.extra.length > 0 || result.untranslated.length > 0
|
|
187
|
+
? `Complete (${result.extra.length} extra, ${result.untranslated.length} untranslated)`
|
|
188
|
+
: "Complete"
|
|
189
|
+
: `Missing: ${result.missing.length}`;
|
|
190
|
+
report += ` ${result.locale}: ${result.coverage.toFixed(1)}% `;
|
|
191
|
+
report += `(${result.translatedKeys}/${result.totalKeys}) `;
|
|
192
|
+
report += `${emoji} ${status}\n`;
|
|
193
|
+
}
|
|
194
|
+
const avgCoverage = results.reduce((sum, r) => sum + r.coverage, 0) / results.length;
|
|
195
|
+
report += `\nOverall: ${avgCoverage.toFixed(1)}% average coverage\n`;
|
|
196
|
+
const allComplete = results.every((r) => r.coverage === 100);
|
|
197
|
+
const hasIssues = results.some((r) => r.extra.length > 0 || r.untranslated.length > 0);
|
|
198
|
+
if (allComplete && !hasIssues) {
|
|
199
|
+
report += "✅ All translations complete!\n";
|
|
200
|
+
}
|
|
201
|
+
else if (allComplete) {
|
|
202
|
+
report +=
|
|
203
|
+
"⚠️ All keys present, but some issues found (extra keys or untranslated)\n";
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
report += "❌ Some translations incomplete\n";
|
|
207
|
+
}
|
|
208
|
+
report += "════════════════════════════════════════════════════════\n";
|
|
209
|
+
return report;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Main entry point
|
|
213
|
+
*/
|
|
214
|
+
async function main() {
|
|
215
|
+
console.log("🔍 Checking translation coverage...\n");
|
|
216
|
+
try {
|
|
217
|
+
// Load reference locale (English)
|
|
218
|
+
const referenceTranslations = loadLocaleTranslations("en");
|
|
219
|
+
const referenceKeys = extractKeys(referenceTranslations);
|
|
220
|
+
console.log(`📖 Reference locale loaded: ${referenceKeys.size} keys\n`);
|
|
221
|
+
// Check all other locales
|
|
222
|
+
const targetLocales = ["es", "zh", "ar"];
|
|
223
|
+
const results = [];
|
|
224
|
+
for (const locale of targetLocales) {
|
|
225
|
+
try {
|
|
226
|
+
const result = checkLocale(referenceKeys, referenceTranslations, locale);
|
|
227
|
+
results.push(result);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
console.error(`❌ Error checking locale ${locale}:`, error);
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Print report
|
|
235
|
+
const report = formatReport(results);
|
|
236
|
+
console.log(report);
|
|
237
|
+
// Exit with error if any locale is incomplete
|
|
238
|
+
const allComplete = results.every((r) => r.coverage === 100);
|
|
239
|
+
if (!allComplete) {
|
|
240
|
+
console.error("\n❌ Exiting with error code 1 (translations incomplete)\n");
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
// Warn if there are extra keys or untranslated strings
|
|
244
|
+
const hasIssues = results.some((r) => r.extra.length > 0 || r.untranslated.length > 0);
|
|
245
|
+
if (hasIssues) {
|
|
246
|
+
console.warn("\n⚠️ Warning: Some locales have extra keys or potentially untranslated strings.\n" +
|
|
247
|
+
" Consider reviewing and cleaning up these issues.\n");
|
|
248
|
+
// Don't exit with error for warnings, just inform
|
|
249
|
+
}
|
|
250
|
+
console.log("✅ Translation coverage check passed!\n");
|
|
251
|
+
process.exit(0);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
console.error("\n❌ Fatal error during coverage check:", error);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Run if executed directly
|
|
259
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
260
|
+
main();
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=check-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-coverage.js","sourceRoot":"","sources":["../../../src/i18n/scripts/check-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Hardcoded String Scanner
|
|
4
|
+
*
|
|
5
|
+
* Scans component files for hardcoded English strings that should use i18n.
|
|
6
|
+
* Adapted from pie-qti's hardcoded string scanner.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* bun run packages/players-shared/src/i18n/scripts/scan-hardcoded.ts
|
|
10
|
+
*
|
|
11
|
+
* Options:
|
|
12
|
+
* --path <dir> - Directory to scan (default: packages/)
|
|
13
|
+
* --fix - Attempt to auto-fix issues (not implemented yet)
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=scan-hardcoded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-hardcoded.d.ts","sourceRoot":"","sources":["../../../src/i18n/scripts/scan-hardcoded.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|