@pie-players/pie-players-shared 0.3.29 → 0.3.31
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/{src → dist}/components/PieItemPlayer.svelte +156 -88
- package/dist/i18n/translations/en/tools.json +1 -1
- package/{src → dist}/i18n/use-i18n-standalone.svelte.ts +1 -0
- package/{src → dist}/i18n/use-i18n.svelte.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/loader-config.d.ts +25 -0
- package/dist/loader-config.d.ts.map +1 -1
- package/dist/loader-config.js +5 -0
- package/dist/loader-config.js.map +1 -1
- package/dist/loaders/ElementLoader.d.ts +6 -34
- package/dist/loaders/ElementLoader.d.ts.map +1 -1
- package/dist/loaders/ElementLoader.js +21 -9
- package/dist/loaders/ElementLoader.js.map +1 -1
- package/dist/loaders/element-loader-types.d.ts +91 -0
- package/dist/loaders/element-loader-types.d.ts.map +1 -0
- package/dist/loaders/element-loader-types.js +26 -0
- package/dist/loaders/element-loader-types.js.map +1 -0
- package/dist/loaders/element-loader.d.ts +92 -0
- package/dist/loaders/element-loader.d.ts.map +1 -0
- package/dist/loaders/element-loader.js +391 -0
- package/dist/loaders/element-loader.js.map +1 -0
- package/dist/loaders/esm-adapter.d.ts +40 -0
- package/dist/loaders/esm-adapter.d.ts.map +1 -0
- package/dist/loaders/esm-adapter.js +274 -0
- package/dist/loaders/esm-adapter.js.map +1 -0
- package/dist/loaders/iife-adapter.d.ts +86 -0
- package/dist/loaders/iife-adapter.d.ts.map +1 -0
- package/dist/loaders/iife-adapter.js +365 -0
- package/dist/loaders/iife-adapter.js.map +1 -0
- package/dist/loaders/index.d.ts +30 -17
- package/dist/loaders/index.d.ts.map +1 -1
- package/dist/loaders/index.js +26 -14
- package/dist/loaders/index.js.map +1 -1
- package/dist/pie/config.d.ts.map +1 -1
- package/dist/pie/config.js +12 -5
- package/dist/pie/config.js.map +1 -1
- package/dist/pie/index.d.ts +6 -4
- package/dist/pie/index.d.ts.map +1 -1
- package/dist/pie/index.js +8 -2
- package/dist/pie/index.js.map +1 -1
- package/dist/pie/initialization.d.ts +26 -1
- package/dist/pie/initialization.d.ts.map +1 -1
- package/dist/pie/initialization.js +72 -15
- package/dist/pie/initialization.js.map +1 -1
- package/dist/pie/instrumentation-event-map.d.ts.map +1 -1
- package/dist/pie/instrumentation-event-map.js +27 -16
- package/dist/pie/instrumentation-event-map.js.map +1 -1
- package/dist/pie/overrides.d.ts +9 -0
- package/dist/pie/overrides.d.ts.map +1 -1
- package/dist/pie/overrides.js +36 -0
- package/dist/pie/overrides.js.map +1 -1
- package/dist/pie/resource-monitor.d.ts +17 -0
- package/dist/pie/resource-monitor.d.ts.map +1 -1
- package/dist/pie/resource-monitor.js +284 -81
- package/dist/pie/resource-monitor.js.map +1 -1
- package/dist/pie/stage-tracker.d.ts +51 -0
- package/dist/pie/stage-tracker.d.ts.map +1 -0
- package/dist/pie/stage-tracker.js +106 -0
- package/dist/pie/stage-tracker.js.map +1 -0
- package/dist/pie/stages.d.ts +75 -0
- package/dist/pie/stages.d.ts.map +1 -0
- package/dist/pie/stages.js +58 -0
- package/dist/pie/stages.js.map +1 -0
- package/dist/pie/updates.d.ts.map +1 -1
- package/dist/pie/updates.js +65 -2
- package/dist/pie/updates.js.map +1 -1
- package/dist/pie/use-resource-monitor.svelte.d.ts.map +1 -1
- package/dist/pie/use-resource-monitor.svelte.js +88 -75
- package/dist/pie/use-resource-monitor.svelte.js.map +1 -1
- package/dist/security/index.d.ts +5 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +5 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/sanitize-item-markup.d.ts +46 -0
- package/dist/security/sanitize-item-markup.d.ts.map +1 -0
- package/dist/security/sanitize-item-markup.js +174 -0
- package/dist/security/sanitize-item-markup.js.map +1 -0
- package/dist/security/sanitize-svg-icon.d.ts +15 -0
- package/dist/security/sanitize-svg-icon.d.ts.map +1 -0
- package/dist/security/sanitize-svg-icon.js +89 -0
- package/dist/security/sanitize-svg-icon.js.map +1 -0
- package/dist/security/validate-style-url.d.ts +28 -0
- package/dist/security/validate-style-url.d.ts.map +1 -0
- package/dist/security/validate-style-url.js +58 -0
- package/dist/security/validate-style-url.js.map +1 -0
- package/dist/security/wrap-overwide-images.d.ts +31 -0
- package/dist/security/wrap-overwide-images.d.ts.map +1 -0
- package/dist/security/wrap-overwide-images.js +92 -0
- package/dist/security/wrap-overwide-images.js.map +1 -0
- package/dist/server/npm-registry.d.ts +8 -0
- package/dist/server/npm-registry.d.ts.map +1 -0
- package/dist/server/npm-registry.js +60 -0
- package/dist/server/npm-registry.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/first-focusable.d.ts +21 -0
- package/dist/ui/first-focusable.d.ts.map +1 -0
- package/dist/ui/first-focusable.js +73 -0
- package/dist/ui/first-focusable.js.map +1 -0
- package/dist/ui/focus-trap.d.ts.map +1 -1
- package/dist/ui/focus-trap.js +2 -13
- package/dist/ui/focus-trap.js.map +1 -1
- package/dist/ui/use-promise.svelte.ts +109 -0
- package/package.json +49 -34
- package/dist/i18n/scripts/check-coverage.d.ts +0 -16
- package/dist/i18n/scripts/check-coverage.d.ts.map +0 -1
- package/dist/i18n/scripts/check-coverage.js +0 -262
- package/dist/i18n/scripts/check-coverage.js.map +0 -1
- package/dist/i18n/scripts/scan-hardcoded.d.ts +0 -16
- package/dist/i18n/scripts/scan-hardcoded.d.ts.map +0 -1
- package/dist/i18n/scripts/scan-hardcoded.js +0 -266
- package/dist/i18n/scripts/scan-hardcoded.js.map +0 -1
- package/dist/i18n/use-i18n-standalone.svelte.d.ts +0 -87
- package/dist/i18n/use-i18n-standalone.svelte.d.ts.map +0 -1
- package/dist/i18n/use-i18n-standalone.svelte.js +0 -151
- package/dist/i18n/use-i18n-standalone.svelte.js.map +0 -1
- package/dist/i18n/use-i18n.svelte.d.ts +0 -67
- package/dist/i18n/use-i18n.svelte.d.ts.map +0 -1
- package/dist/i18n/use-i18n.svelte.js +0 -144
- package/dist/i18n/use-i18n.svelte.js.map +0 -1
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts +0 -170
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts.map +0 -1
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.js +0 -183
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.js.map +0 -1
- package/dist/loaders/EsmElementLoader.d.ts +0 -69
- package/dist/loaders/EsmElementLoader.d.ts.map +0 -1
- package/dist/loaders/EsmElementLoader.js +0 -72
- package/dist/loaders/EsmElementLoader.js.map +0 -1
- package/dist/loaders/IifeElementLoader.d.ts +0 -61
- package/dist/loaders/IifeElementLoader.d.ts.map +0 -1
- package/dist/loaders/IifeElementLoader.js +0 -63
- package/dist/loaders/IifeElementLoader.js.map +0 -1
- package/dist/pie/esm-loader.d.ts +0 -104
- package/dist/pie/esm-loader.d.ts.map +0 -1
- package/dist/pie/esm-loader.js +0 -358
- package/dist/pie/esm-loader.js.map +0 -1
- package/dist/pie/iife-loader.d.ts +0 -81
- package/dist/pie/iife-loader.d.ts.map +0 -1
- package/dist/pie/iife-loader.js +0 -425
- package/dist/pie/iife-loader.js.map +0 -1
- package/dist/theming/css-variables.d.ts +0 -7
- package/dist/theming/css-variables.d.ts.map +0 -1
- package/dist/theming/css-variables.js +0 -43
- package/dist/theming/css-variables.js.map +0 -1
- package/dist/theming/index.d.ts +0 -4
- package/dist/theming/index.d.ts.map +0 -1
- package/dist/theming/index.js +0 -3
- package/dist/theming/index.js.map +0 -1
- package/dist/theming/presets.d.ts +0 -7
- package/dist/theming/presets.d.ts.map +0 -1
- package/dist/theming/presets.js +0 -146
- package/dist/theming/presets.js.map +0 -1
- package/dist/theming/types.d.ts +0 -5
- package/dist/theming/types.d.ts.map +0 -1
- package/dist/theming/types.js +0 -2
- package/dist/theming/types.js.map +0 -1
- package/dist/types/custom-elements.d.ts +0 -158
- package/dist/types/custom-elements.d.ts.map +0 -1
- package/dist/types/custom-elements.js +0 -8
- package/dist/types/custom-elements.js.map +0 -1
- package/dist/types/search.d.ts +0 -105
- package/dist/types/search.d.ts.map +0 -1
- package/dist/types/search.js +0 -12
- package/dist/types/search.js.map +0 -1
- package/dist/types/transform.d.ts +0 -48
- package/dist/types/transform.d.ts.map +0 -1
- package/dist/types/transform.js +0 -21
- package/dist/types/transform.js.map +0 -1
- package/src/i18n/README.md +0 -223
- package/src/i18n/index.ts +0 -26
- package/src/i18n/loader.ts +0 -156
- package/src/i18n/scripts/check-coverage.ts +0 -345
- package/src/i18n/scripts/scan-hardcoded.ts +0 -342
- package/src/i18n/simple-i18n.ts +0 -236
- package/src/i18n/translations/ar/common.json +0 -36
- package/src/i18n/translations/ar/toolkit.json +0 -48
- package/src/i18n/translations/ar/tools.json +0 -103
- package/src/i18n/translations/en/common.json +0 -36
- package/src/i18n/translations/en/toolkit.json +0 -48
- package/src/i18n/translations/en/tools.json +0 -103
- package/src/i18n/translations/es/common.json +0 -36
- package/src/i18n/translations/es/toolkit.json +0 -48
- package/src/i18n/translations/es/tools.json +0 -103
- package/src/i18n/translations/zh/common.json +0 -36
- package/src/i18n/translations/zh/toolkit.json +0 -48
- package/src/i18n/translations/zh/tools.json +0 -103
- package/src/i18n/types.ts +0 -66
- /package/{src → dist}/components/PiePreviewLayout.svelte +0 -0
- /package/{src → dist}/components/PiePreviewToggle.svelte +0 -0
- /package/{src → dist}/components/PieSpinner.svelte +0 -0
- /package/{src → dist}/components/ToolSettingsButton.svelte +0 -0
- /package/{src → dist}/components/ToolSettingsPanel.svelte +0 -0
- /package/{src → dist}/components/index.ts +0 -0
|
@@ -1,262 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check-coverage.js","sourceRoot":"","sources":["../../../src/i18n/scripts/check-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scan-hardcoded.d.ts","sourceRoot":"","sources":["../../../src/i18n/scripts/scan-hardcoded.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
|
@@ -1,266 +0,0 @@
|
|
|
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
|
-
import { readFileSync } from "fs";
|
|
16
|
-
import { glob } from "glob";
|
|
17
|
-
import { dirname, relative, resolve } from "path";
|
|
18
|
-
import { fileURLToPath } from "url";
|
|
19
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
-
const __dirname = dirname(__filename);
|
|
21
|
-
/**
|
|
22
|
-
* Load all English translations
|
|
23
|
-
*/
|
|
24
|
-
function loadEnglishTranslations() {
|
|
25
|
-
const basePath = resolve(__dirname, "../translations/en");
|
|
26
|
-
const translations = {};
|
|
27
|
-
try {
|
|
28
|
-
const common = JSON.parse(readFileSync(resolve(basePath, "common.json"), "utf-8"));
|
|
29
|
-
const toolkit = JSON.parse(readFileSync(resolve(basePath, "toolkit.json"), "utf-8"));
|
|
30
|
-
const tools = JSON.parse(readFileSync(resolve(basePath, "tools.json"), "utf-8"));
|
|
31
|
-
// Flatten all translations
|
|
32
|
-
flattenObject(common, "", translations);
|
|
33
|
-
flattenObject(toolkit, "", translations);
|
|
34
|
-
flattenObject(tools, "", translations);
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
console.error("Error loading English translations:", error);
|
|
38
|
-
throw error;
|
|
39
|
-
}
|
|
40
|
-
return translations;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Flatten nested object to dot notation
|
|
44
|
-
*/
|
|
45
|
-
function flattenObject(obj, prefix, result) {
|
|
46
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
47
|
-
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
48
|
-
if (typeof value === "object" && value !== null) {
|
|
49
|
-
// Check for plural form
|
|
50
|
-
if ("one" in value && "other" in value) {
|
|
51
|
-
result[fullKey] = value.one;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
flattenObject(value, fullKey, result);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
else if (typeof value === "string") {
|
|
58
|
-
result[fullKey] = value;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Find translation key for a given string value
|
|
64
|
-
*/
|
|
65
|
-
function findTranslationKey(translations, searchValue) {
|
|
66
|
-
// Exact match first
|
|
67
|
-
for (const [key, value] of Object.entries(translations)) {
|
|
68
|
-
if (value === searchValue) {
|
|
69
|
-
return key;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// Fuzzy match (case-insensitive)
|
|
73
|
-
const lowerSearch = searchValue.toLowerCase();
|
|
74
|
-
for (const [key, value] of Object.entries(translations)) {
|
|
75
|
-
if (value.toLowerCase() === lowerSearch) {
|
|
76
|
-
return key;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Scan a file for hardcoded strings
|
|
83
|
-
*/
|
|
84
|
-
function scanFile(filePath, translations) {
|
|
85
|
-
const content = readFileSync(filePath, "utf-8");
|
|
86
|
-
const lines = content.split("\n");
|
|
87
|
-
const matches = [];
|
|
88
|
-
// Patterns to match quoted English strings
|
|
89
|
-
// Matches: "Text", 'Text', but ignores: i18n.t(...), class="...", etc.
|
|
90
|
-
const stringPattern = /["']([A-Z][A-Za-z\s,.:;!?'\-()]+)["']/g;
|
|
91
|
-
// Patterns to exclude (already using i18n, CSS classes, imports, etc.)
|
|
92
|
-
const excludePatterns = [
|
|
93
|
-
/i18n\./,
|
|
94
|
-
/import\s+/,
|
|
95
|
-
/from\s+['"]/,
|
|
96
|
-
/class[:=]/,
|
|
97
|
-
/className[:=]/,
|
|
98
|
-
/aria-\w+[:=]/,
|
|
99
|
-
/data-\w+[:=]/,
|
|
100
|
-
/id[:=]/,
|
|
101
|
-
/key[:=]/,
|
|
102
|
-
/name[:=]/,
|
|
103
|
-
/type[:=]/,
|
|
104
|
-
/href[:=]/,
|
|
105
|
-
/src[:=]/,
|
|
106
|
-
/alt[:=]/,
|
|
107
|
-
/title[:=]/,
|
|
108
|
-
/placeholder[:=]/,
|
|
109
|
-
/console\./,
|
|
110
|
-
/\/\//, // Comments
|
|
111
|
-
/\/\*/, // Block comments
|
|
112
|
-
];
|
|
113
|
-
lines.forEach((line, index) => {
|
|
114
|
-
// Skip lines that match exclude patterns
|
|
115
|
-
if (excludePatterns.some((pattern) => pattern.test(line))) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
// Find all string matches in the line
|
|
119
|
-
let match;
|
|
120
|
-
while ((match = stringPattern.exec(line)) !== null) {
|
|
121
|
-
const string = match[1];
|
|
122
|
-
// Skip very short strings (likely not user-facing)
|
|
123
|
-
if (string.length < 3)
|
|
124
|
-
continue;
|
|
125
|
-
// Skip strings that are mostly numbers or special characters
|
|
126
|
-
if (!/[a-zA-Z]{3,}/.test(string))
|
|
127
|
-
continue;
|
|
128
|
-
// Find corresponding translation key
|
|
129
|
-
const suggestedKey = findTranslationKey(translations, string);
|
|
130
|
-
matches.push({
|
|
131
|
-
file: filePath,
|
|
132
|
-
line: index + 1,
|
|
133
|
-
context: line.trim(),
|
|
134
|
-
string,
|
|
135
|
-
suggestedKey,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
return matches;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Format scan results
|
|
143
|
-
*/
|
|
144
|
-
function formatResults(matchesByFile, rootDir) {
|
|
145
|
-
let report = "\n";
|
|
146
|
-
report += "┌─────────────────────────────────────────────────────┐\n";
|
|
147
|
-
report += "│ Hardcoded String Scanner │\n";
|
|
148
|
-
report += "└─────────────────────────────────────────────────────┘\n\n";
|
|
149
|
-
const fileCount = matchesByFile.size;
|
|
150
|
-
const totalMatches = Array.from(matchesByFile.values()).reduce((sum, m) => sum + m.length, 0);
|
|
151
|
-
if (fileCount === 0) {
|
|
152
|
-
report += "✅ No hardcoded strings found!\n\n";
|
|
153
|
-
return report;
|
|
154
|
-
}
|
|
155
|
-
// Sort files by number of matches (descending)
|
|
156
|
-
const sortedFiles = Array.from(matchesByFile.entries()).sort((a, b) => b[1].length - a[1].length);
|
|
157
|
-
for (const [file, matches] of sortedFiles) {
|
|
158
|
-
const relPath = relative(rootDir, file);
|
|
159
|
-
report += `📄 ${relPath} (${matches.length} match${matches.length === 1 ? "" : "es"})\n`;
|
|
160
|
-
report += "────────────────────────────────────────────────────────\n";
|
|
161
|
-
for (const match of matches) {
|
|
162
|
-
report += ` Line ${match.line}: ${match.context}\n`;
|
|
163
|
-
report += ` Found: "${match.string}"\n`;
|
|
164
|
-
if (match.suggestedKey) {
|
|
165
|
-
report += ` Use: i18n?.t('${match.suggestedKey}') ?? '${match.suggestedKey}'\n`;
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
report += ` Note: No matching translation key found. Consider adding to translations.\n`;
|
|
169
|
-
}
|
|
170
|
-
report += "\n";
|
|
171
|
-
}
|
|
172
|
-
report += "\n";
|
|
173
|
-
}
|
|
174
|
-
report += "════════════════════════════════════════════════════════\n";
|
|
175
|
-
report += "📊 Summary:\n";
|
|
176
|
-
report += "────────────────────────────────────────────────────────\n";
|
|
177
|
-
report += ` Total files scanned: ${fileCount}\n`;
|
|
178
|
-
report += ` Files with matches: ${fileCount}\n`;
|
|
179
|
-
report += ` Total hardcoded strings: ${totalMatches}\n\n`;
|
|
180
|
-
report += "⚠️ Recommendation: Replace hardcoded strings with i18n keys\n";
|
|
181
|
-
report += " for proper internationalization support.\n";
|
|
182
|
-
report += "════════════════════════════════════════════════════════\n";
|
|
183
|
-
return report;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Find project root by looking for package.json with workspaces
|
|
187
|
-
*/
|
|
188
|
-
function findProjectRoot() {
|
|
189
|
-
let currentDir = process.cwd();
|
|
190
|
-
while (currentDir !== "/") {
|
|
191
|
-
try {
|
|
192
|
-
const pkgPath = resolve(currentDir, "package.json");
|
|
193
|
-
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
194
|
-
if (pkg.workspaces) {
|
|
195
|
-
return currentDir;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
// Continue searching
|
|
200
|
-
}
|
|
201
|
-
currentDir = dirname(currentDir);
|
|
202
|
-
}
|
|
203
|
-
// Fallback to script location's root
|
|
204
|
-
return resolve(__dirname, "../../../..");
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Main entry point
|
|
208
|
-
*/
|
|
209
|
-
async function main() {
|
|
210
|
-
const args = process.argv.slice(2);
|
|
211
|
-
const pathArg = args.indexOf("--path");
|
|
212
|
-
// Find project root and default to scanning packages/
|
|
213
|
-
const projectRoot = findProjectRoot();
|
|
214
|
-
const defaultPath = resolve(projectRoot, "packages/");
|
|
215
|
-
const scanPath = pathArg !== -1 ? resolve(projectRoot, args[pathArg + 1]) : defaultPath;
|
|
216
|
-
console.log("🔍 Scanning for hardcoded strings...\n");
|
|
217
|
-
console.log(`📂 Scan path: ${scanPath}\n`);
|
|
218
|
-
try {
|
|
219
|
-
// Load English translations for matching
|
|
220
|
-
const translations = loadEnglishTranslations();
|
|
221
|
-
console.log(`📖 Loaded ${Object.keys(translations).length} translation keys\n`);
|
|
222
|
-
// Find all component files
|
|
223
|
-
const allFiles = await glob(`${scanPath}/**/*.{svelte,ts,tsx}`, {
|
|
224
|
-
absolute: true,
|
|
225
|
-
});
|
|
226
|
-
// Filter out unwanted directories manually
|
|
227
|
-
const files = allFiles.filter((file) => {
|
|
228
|
-
return (!file.includes("/node_modules/") &&
|
|
229
|
-
!file.includes("/dist/") &&
|
|
230
|
-
!file.includes("/.svelte-kit/") &&
|
|
231
|
-
!file.includes("/build/") &&
|
|
232
|
-
!file.endsWith(".spec.ts") &&
|
|
233
|
-
!file.endsWith(".test.ts") &&
|
|
234
|
-
!file.includes("/scripts/"));
|
|
235
|
-
});
|
|
236
|
-
console.log(`📁 Found ${files.length} files to scan\n`);
|
|
237
|
-
// Scan all files
|
|
238
|
-
const matchesByFile = new Map();
|
|
239
|
-
for (const file of files) {
|
|
240
|
-
const matches = scanFile(file, translations);
|
|
241
|
-
if (matches.length > 0) {
|
|
242
|
-
matchesByFile.set(file, matches);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
// Print results
|
|
246
|
-
const report = formatResults(matchesByFile, projectRoot);
|
|
247
|
-
console.log(report);
|
|
248
|
-
// Exit with warning if matches found
|
|
249
|
-
if (matchesByFile.size > 0) {
|
|
250
|
-
console.warn("\n⚠️ Found hardcoded strings. Consider using i18n for these strings.\n");
|
|
251
|
-
// Don't exit with error - this is informational only
|
|
252
|
-
process.exit(0);
|
|
253
|
-
}
|
|
254
|
-
console.log("✅ No hardcoded strings found!\n");
|
|
255
|
-
process.exit(0);
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
console.error("\n❌ Fatal error during scan:", error);
|
|
259
|
-
process.exit(1);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
// Run if executed directly
|
|
263
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
264
|
-
main();
|
|
265
|
-
}
|
|
266
|
-
//# sourceMappingURL=scan-hardcoded.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scan-hardcoded.js","sourceRoot":"","sources":["../../../src/i18n/scripts/scan-hardcoded.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Standalone i18n Composable
|
|
3
|
-
*
|
|
4
|
-
* Lightweight i18n for standalone components that don't use the service architecture.
|
|
5
|
-
* Creates its own internal I18nService instance with hybrid loading.
|
|
6
|
-
*
|
|
7
|
-
* Use this when:
|
|
8
|
-
* - Building standalone components (tools, players) without full toolkit integration
|
|
9
|
-
* - You want simple i18n without dependency injection
|
|
10
|
-
*
|
|
11
|
-
* Use `useI18n()` when:
|
|
12
|
-
* - Working within the full assessment toolkit architecture
|
|
13
|
-
* - You need centralized locale management across the application
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```svelte
|
|
17
|
-
* <script lang="ts">
|
|
18
|
-
* import { useI18nStandalone } from '@pie-players/pie-players-shared/i18n';
|
|
19
|
-
*
|
|
20
|
-
* const i18n = useI18nStandalone({ locale: 'en' });
|
|
21
|
-
* </script>
|
|
22
|
-
*
|
|
23
|
-
* <button>{i18n.t('common.save')}</button>
|
|
24
|
-
* <span dir={i18n.direction}>{i18n.tn('assessment.questions', 10)}</span>
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
import { SimpleI18n } from "./simple-i18n.js";
|
|
28
|
-
/**
|
|
29
|
-
* Standalone i18n configuration
|
|
30
|
-
*/
|
|
31
|
-
export interface UseI18nStandaloneConfig {
|
|
32
|
-
/** Initial locale (default: browser language) */
|
|
33
|
-
locale?: string;
|
|
34
|
-
/** Fallback locale (default: 'en') */
|
|
35
|
-
fallbackLocale?: string;
|
|
36
|
-
/** Debug mode */
|
|
37
|
-
debug?: boolean;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Create a standalone i18n instance
|
|
41
|
-
*
|
|
42
|
-
* @param config Configuration options
|
|
43
|
-
* @returns Reactive i18n interface
|
|
44
|
-
*/
|
|
45
|
-
export declare function useI18nStandalone(config?: UseI18nStandaloneConfig): {
|
|
46
|
-
/**
|
|
47
|
-
* Current locale (reactive)
|
|
48
|
-
*/
|
|
49
|
-
readonly locale: string;
|
|
50
|
-
/**
|
|
51
|
-
* Current text direction (reactive)
|
|
52
|
-
*/
|
|
53
|
-
readonly direction: "ltr" | "rtl";
|
|
54
|
-
/**
|
|
55
|
-
* Loading state (reactive)
|
|
56
|
-
*/
|
|
57
|
-
readonly isLoading: boolean;
|
|
58
|
-
/**
|
|
59
|
-
* Translate function
|
|
60
|
-
*/
|
|
61
|
-
t: (key: string, params?: Record<string, any>) => string;
|
|
62
|
-
/**
|
|
63
|
-
* Translate with pluralization
|
|
64
|
-
*/
|
|
65
|
-
tn: (key: string, count: number, params?: Record<string, any>) => string;
|
|
66
|
-
/**
|
|
67
|
-
* Change locale
|
|
68
|
-
*/
|
|
69
|
-
setLocale: (newLocale: string) => Promise<void>;
|
|
70
|
-
/**
|
|
71
|
-
* Get available locales
|
|
72
|
-
*/
|
|
73
|
-
readonly availableLocales: string[];
|
|
74
|
-
/**
|
|
75
|
-
* Check if locale is loaded
|
|
76
|
-
*/
|
|
77
|
-
isLocaleLoaded(loc: string): boolean;
|
|
78
|
-
/**
|
|
79
|
-
* Check if translation key exists
|
|
80
|
-
*/
|
|
81
|
-
hasKey(key: string): boolean;
|
|
82
|
-
/**
|
|
83
|
-
* Access underlying service (for advanced use cases)
|
|
84
|
-
*/
|
|
85
|
-
readonly service: SimpleI18n;
|
|
86
|
-
};
|
|
87
|
-
//# sourceMappingURL=use-i18n-standalone.svelte.d.ts.map
|