@pie-players/pie-players-shared 0.3.29 → 0.3.30

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.
Files changed (142) hide show
  1. package/{src → dist}/components/PieItemPlayer.svelte +156 -88
  2. package/dist/i18n/translations/en/tools.json +1 -1
  3. package/{src → dist}/i18n/use-i18n-standalone.svelte.ts +1 -0
  4. package/{src → dist}/i18n/use-i18n.svelte.ts +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/loader-config.d.ts +25 -0
  10. package/dist/loader-config.d.ts.map +1 -1
  11. package/dist/loader-config.js +5 -0
  12. package/dist/loader-config.js.map +1 -1
  13. package/dist/pie/config.d.ts.map +1 -1
  14. package/dist/pie/config.js +12 -5
  15. package/dist/pie/config.js.map +1 -1
  16. package/dist/pie/iife-loader.d.ts +35 -0
  17. package/dist/pie/iife-loader.d.ts.map +1 -1
  18. package/dist/pie/iife-loader.js +138 -2
  19. package/dist/pie/iife-loader.js.map +1 -1
  20. package/dist/pie/index.d.ts +3 -1
  21. package/dist/pie/index.d.ts.map +1 -1
  22. package/dist/pie/index.js +1 -0
  23. package/dist/pie/index.js.map +1 -1
  24. package/dist/pie/overrides.d.ts +9 -0
  25. package/dist/pie/overrides.d.ts.map +1 -1
  26. package/dist/pie/overrides.js +36 -0
  27. package/dist/pie/overrides.js.map +1 -1
  28. package/dist/pie/resource-monitor.d.ts +17 -0
  29. package/dist/pie/resource-monitor.d.ts.map +1 -1
  30. package/dist/pie/resource-monitor.js +284 -81
  31. package/dist/pie/resource-monitor.js.map +1 -1
  32. package/dist/pie/updates.d.ts.map +1 -1
  33. package/dist/pie/updates.js +65 -2
  34. package/dist/pie/updates.js.map +1 -1
  35. package/dist/security/index.d.ts +5 -0
  36. package/dist/security/index.d.ts.map +1 -0
  37. package/dist/security/index.js +5 -0
  38. package/dist/security/index.js.map +1 -0
  39. package/dist/security/sanitize-item-markup.d.ts +46 -0
  40. package/dist/security/sanitize-item-markup.d.ts.map +1 -0
  41. package/dist/security/sanitize-item-markup.js +174 -0
  42. package/dist/security/sanitize-item-markup.js.map +1 -0
  43. package/dist/security/sanitize-svg-icon.d.ts +15 -0
  44. package/dist/security/sanitize-svg-icon.d.ts.map +1 -0
  45. package/dist/security/sanitize-svg-icon.js +89 -0
  46. package/dist/security/sanitize-svg-icon.js.map +1 -0
  47. package/dist/security/validate-style-url.d.ts +28 -0
  48. package/dist/security/validate-style-url.d.ts.map +1 -0
  49. package/dist/security/validate-style-url.js +58 -0
  50. package/dist/security/validate-style-url.js.map +1 -0
  51. package/dist/security/wrap-overwide-images.d.ts +31 -0
  52. package/dist/security/wrap-overwide-images.d.ts.map +1 -0
  53. package/dist/security/wrap-overwide-images.js +92 -0
  54. package/dist/security/wrap-overwide-images.js.map +1 -0
  55. package/dist/server/npm-registry.d.ts +8 -0
  56. package/dist/server/npm-registry.d.ts.map +1 -0
  57. package/dist/server/npm-registry.js +60 -0
  58. package/dist/server/npm-registry.js.map +1 -0
  59. package/dist/types/index.d.ts +10 -0
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/dist/types/index.js.map +1 -1
  62. package/dist/ui/first-focusable.d.ts +21 -0
  63. package/dist/ui/first-focusable.d.ts.map +1 -0
  64. package/dist/ui/first-focusable.js +73 -0
  65. package/dist/ui/first-focusable.js.map +1 -0
  66. package/dist/ui/focus-trap.d.ts.map +1 -1
  67. package/dist/ui/focus-trap.js +2 -13
  68. package/dist/ui/focus-trap.js.map +1 -1
  69. package/package.json +44 -34
  70. package/dist/i18n/scripts/check-coverage.d.ts +0 -16
  71. package/dist/i18n/scripts/check-coverage.d.ts.map +0 -1
  72. package/dist/i18n/scripts/check-coverage.js +0 -262
  73. package/dist/i18n/scripts/check-coverage.js.map +0 -1
  74. package/dist/i18n/scripts/scan-hardcoded.d.ts +0 -16
  75. package/dist/i18n/scripts/scan-hardcoded.d.ts.map +0 -1
  76. package/dist/i18n/scripts/scan-hardcoded.js +0 -266
  77. package/dist/i18n/scripts/scan-hardcoded.js.map +0 -1
  78. package/dist/i18n/use-i18n-standalone.svelte.d.ts +0 -87
  79. package/dist/i18n/use-i18n-standalone.svelte.d.ts.map +0 -1
  80. package/dist/i18n/use-i18n-standalone.svelte.js +0 -151
  81. package/dist/i18n/use-i18n-standalone.svelte.js.map +0 -1
  82. package/dist/i18n/use-i18n.svelte.d.ts +0 -67
  83. package/dist/i18n/use-i18n.svelte.d.ts.map +0 -1
  84. package/dist/i18n/use-i18n.svelte.js +0 -144
  85. package/dist/i18n/use-i18n.svelte.js.map +0 -1
  86. package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts +0 -170
  87. package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts.map +0 -1
  88. package/dist/instrumentation/providers/DataDogInstrumentationProvider.js +0 -183
  89. package/dist/instrumentation/providers/DataDogInstrumentationProvider.js.map +0 -1
  90. package/dist/theming/css-variables.d.ts +0 -7
  91. package/dist/theming/css-variables.d.ts.map +0 -1
  92. package/dist/theming/css-variables.js +0 -43
  93. package/dist/theming/css-variables.js.map +0 -1
  94. package/dist/theming/index.d.ts +0 -4
  95. package/dist/theming/index.d.ts.map +0 -1
  96. package/dist/theming/index.js +0 -3
  97. package/dist/theming/index.js.map +0 -1
  98. package/dist/theming/presets.d.ts +0 -7
  99. package/dist/theming/presets.d.ts.map +0 -1
  100. package/dist/theming/presets.js +0 -146
  101. package/dist/theming/presets.js.map +0 -1
  102. package/dist/theming/types.d.ts +0 -5
  103. package/dist/theming/types.d.ts.map +0 -1
  104. package/dist/theming/types.js +0 -2
  105. package/dist/theming/types.js.map +0 -1
  106. package/dist/types/custom-elements.d.ts +0 -158
  107. package/dist/types/custom-elements.d.ts.map +0 -1
  108. package/dist/types/custom-elements.js +0 -8
  109. package/dist/types/custom-elements.js.map +0 -1
  110. package/dist/types/search.d.ts +0 -105
  111. package/dist/types/search.d.ts.map +0 -1
  112. package/dist/types/search.js +0 -12
  113. package/dist/types/search.js.map +0 -1
  114. package/dist/types/transform.d.ts +0 -48
  115. package/dist/types/transform.d.ts.map +0 -1
  116. package/dist/types/transform.js +0 -21
  117. package/dist/types/transform.js.map +0 -1
  118. package/src/i18n/README.md +0 -223
  119. package/src/i18n/index.ts +0 -26
  120. package/src/i18n/loader.ts +0 -156
  121. package/src/i18n/scripts/check-coverage.ts +0 -345
  122. package/src/i18n/scripts/scan-hardcoded.ts +0 -342
  123. package/src/i18n/simple-i18n.ts +0 -236
  124. package/src/i18n/translations/ar/common.json +0 -36
  125. package/src/i18n/translations/ar/toolkit.json +0 -48
  126. package/src/i18n/translations/ar/tools.json +0 -103
  127. package/src/i18n/translations/en/common.json +0 -36
  128. package/src/i18n/translations/en/toolkit.json +0 -48
  129. package/src/i18n/translations/en/tools.json +0 -103
  130. package/src/i18n/translations/es/common.json +0 -36
  131. package/src/i18n/translations/es/toolkit.json +0 -48
  132. package/src/i18n/translations/es/tools.json +0 -103
  133. package/src/i18n/translations/zh/common.json +0 -36
  134. package/src/i18n/translations/zh/toolkit.json +0 -48
  135. package/src/i18n/translations/zh/tools.json +0 -103
  136. package/src/i18n/types.ts +0 -66
  137. /package/{src → dist}/components/PiePreviewLayout.svelte +0 -0
  138. /package/{src → dist}/components/PiePreviewToggle.svelte +0 -0
  139. /package/{src → dist}/components/PieSpinner.svelte +0 -0
  140. /package/{src → dist}/components/ToolSettingsButton.svelte +0 -0
  141. /package/{src → dist}/components/ToolSettingsPanel.svelte +0 -0
  142. /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