i18nsmith 0.1.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.
Files changed (213) hide show
  1. package/dist/commands/audit.d.ts +3 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +180 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/backup.d.ts +6 -0
  6. package/dist/commands/backup.d.ts.map +1 -0
  7. package/dist/commands/backup.js +85 -0
  8. package/dist/commands/backup.js.map +1 -0
  9. package/dist/commands/check.d.ts +3 -0
  10. package/dist/commands/check.d.ts.map +1 -0
  11. package/dist/commands/check.js +151 -0
  12. package/dist/commands/check.js.map +1 -0
  13. package/dist/commands/config.d.ts +3 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +235 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/debug-patterns.d.ts +3 -0
  18. package/dist/commands/debug-patterns.d.ts.map +1 -0
  19. package/dist/commands/debug-patterns.js +192 -0
  20. package/dist/commands/debug-patterns.js.map +1 -0
  21. package/dist/commands/debug-patterns.test.d.ts +2 -0
  22. package/dist/commands/debug-patterns.test.d.ts.map +1 -0
  23. package/dist/commands/debug-patterns.test.js +109 -0
  24. package/dist/commands/debug-patterns.test.js.map +1 -0
  25. package/dist/commands/diagnose.d.ts +3 -0
  26. package/dist/commands/diagnose.d.ts.map +1 -0
  27. package/dist/commands/diagnose.js +117 -0
  28. package/dist/commands/diagnose.js.map +1 -0
  29. package/dist/commands/init.d.ts +8 -0
  30. package/dist/commands/init.d.ts.map +1 -0
  31. package/dist/commands/init.js +450 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/commands/init.test.d.ts +2 -0
  34. package/dist/commands/init.test.d.ts.map +1 -0
  35. package/dist/commands/init.test.js +74 -0
  36. package/dist/commands/init.test.js.map +1 -0
  37. package/dist/commands/install-hooks.d.ts +3 -0
  38. package/dist/commands/install-hooks.d.ts.map +1 -0
  39. package/dist/commands/install-hooks.js +52 -0
  40. package/dist/commands/install-hooks.js.map +1 -0
  41. package/dist/commands/preflight.d.ts +7 -0
  42. package/dist/commands/preflight.d.ts.map +1 -0
  43. package/dist/commands/preflight.js +417 -0
  44. package/dist/commands/preflight.js.map +1 -0
  45. package/dist/commands/preflight.test.d.ts +5 -0
  46. package/dist/commands/preflight.test.d.ts.map +1 -0
  47. package/dist/commands/preflight.test.js +108 -0
  48. package/dist/commands/preflight.test.js.map +1 -0
  49. package/dist/commands/rename.d.ts +6 -0
  50. package/dist/commands/rename.d.ts.map +1 -0
  51. package/dist/commands/rename.js +204 -0
  52. package/dist/commands/rename.js.map +1 -0
  53. package/dist/commands/scaffold-adapter.d.ts +3 -0
  54. package/dist/commands/scaffold-adapter.d.ts.map +1 -0
  55. package/dist/commands/scaffold-adapter.js +204 -0
  56. package/dist/commands/scaffold-adapter.js.map +1 -0
  57. package/dist/commands/scaffold-adapter.test.d.ts +2 -0
  58. package/dist/commands/scaffold-adapter.test.d.ts.map +1 -0
  59. package/dist/commands/scaffold-adapter.test.js +102 -0
  60. package/dist/commands/scaffold-adapter.test.js.map +1 -0
  61. package/dist/commands/scan.d.ts +3 -0
  62. package/dist/commands/scan.d.ts.map +1 -0
  63. package/dist/commands/scan.js +93 -0
  64. package/dist/commands/scan.js.map +1 -0
  65. package/dist/commands/sync-seed.test.d.ts +2 -0
  66. package/dist/commands/sync-seed.test.d.ts.map +1 -0
  67. package/dist/commands/sync-seed.test.js +86 -0
  68. package/dist/commands/sync-seed.test.js.map +1 -0
  69. package/dist/commands/sync.d.ts +3 -0
  70. package/dist/commands/sync.d.ts.map +1 -0
  71. package/dist/commands/sync.js +590 -0
  72. package/dist/commands/sync.js.map +1 -0
  73. package/dist/commands/transform.d.ts +3 -0
  74. package/dist/commands/transform.d.ts.map +1 -0
  75. package/dist/commands/transform.js +114 -0
  76. package/dist/commands/transform.js.map +1 -0
  77. package/dist/commands/translate/csv-handler.d.ts +21 -0
  78. package/dist/commands/translate/csv-handler.d.ts.map +1 -0
  79. package/dist/commands/translate/csv-handler.js +270 -0
  80. package/dist/commands/translate/csv-handler.js.map +1 -0
  81. package/dist/commands/translate/executor.d.ts +31 -0
  82. package/dist/commands/translate/executor.d.ts.map +1 -0
  83. package/dist/commands/translate/executor.js +117 -0
  84. package/dist/commands/translate/executor.js.map +1 -0
  85. package/dist/commands/translate/index.d.ts +10 -0
  86. package/dist/commands/translate/index.d.ts.map +1 -0
  87. package/dist/commands/translate/index.js +170 -0
  88. package/dist/commands/translate/index.js.map +1 -0
  89. package/dist/commands/translate/reporter.d.ts +29 -0
  90. package/dist/commands/translate/reporter.d.ts.map +1 -0
  91. package/dist/commands/translate/reporter.js +103 -0
  92. package/dist/commands/translate/reporter.js.map +1 -0
  93. package/dist/commands/translate/types.d.ts +50 -0
  94. package/dist/commands/translate/types.d.ts.map +1 -0
  95. package/dist/commands/translate/types.js +5 -0
  96. package/dist/commands/translate/types.js.map +1 -0
  97. package/dist/commands/translate.d.ts +7 -0
  98. package/dist/commands/translate.d.ts.map +1 -0
  99. package/dist/commands/translate.js +7 -0
  100. package/dist/commands/translate.js.map +1 -0
  101. package/dist/commands/translate.test.d.ts +2 -0
  102. package/dist/commands/translate.test.d.ts.map +1 -0
  103. package/dist/commands/translate.test.js +118 -0
  104. package/dist/commands/translate.test.js.map +1 -0
  105. package/dist/e2e.test.d.ts +6 -0
  106. package/dist/e2e.test.d.ts.map +1 -0
  107. package/dist/e2e.test.js +376 -0
  108. package/dist/e2e.test.js.map +1 -0
  109. package/dist/index.d.ts +4 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +39 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/integration.test.d.ts +6 -0
  114. package/dist/integration.test.d.ts.map +1 -0
  115. package/dist/integration.test.js +320 -0
  116. package/dist/integration.test.js.map +1 -0
  117. package/dist/utils/diagnostics-exit.d.ts +12 -0
  118. package/dist/utils/diagnostics-exit.d.ts.map +1 -0
  119. package/dist/utils/diagnostics-exit.js +49 -0
  120. package/dist/utils/diagnostics-exit.js.map +1 -0
  121. package/dist/utils/diagnostics-exit.test.d.ts +2 -0
  122. package/dist/utils/diagnostics-exit.test.d.ts.map +1 -0
  123. package/dist/utils/diagnostics-exit.test.js +40 -0
  124. package/dist/utils/diagnostics-exit.test.js.map +1 -0
  125. package/dist/utils/diff-utils.d.ts +4 -0
  126. package/dist/utils/diff-utils.d.ts.map +1 -0
  127. package/dist/utils/diff-utils.js +30 -0
  128. package/dist/utils/diff-utils.js.map +1 -0
  129. package/dist/utils/diff-utils.test.d.ts +2 -0
  130. package/dist/utils/diff-utils.test.d.ts.map +1 -0
  131. package/dist/utils/diff-utils.test.js +30 -0
  132. package/dist/utils/diff-utils.test.js.map +1 -0
  133. package/dist/utils/exit-codes.d.ts +142 -0
  134. package/dist/utils/exit-codes.d.ts.map +1 -0
  135. package/dist/utils/exit-codes.js +168 -0
  136. package/dist/utils/exit-codes.js.map +1 -0
  137. package/dist/utils/package-manager.d.ts +4 -0
  138. package/dist/utils/package-manager.d.ts.map +1 -0
  139. package/dist/utils/package-manager.js +40 -0
  140. package/dist/utils/package-manager.js.map +1 -0
  141. package/dist/utils/pkg.d.ts +3 -0
  142. package/dist/utils/pkg.d.ts.map +1 -0
  143. package/dist/utils/pkg.js +24 -0
  144. package/dist/utils/pkg.js.map +1 -0
  145. package/dist/utils/provider-injector.d.ts +36 -0
  146. package/dist/utils/provider-injector.d.ts.map +1 -0
  147. package/dist/utils/provider-injector.js +223 -0
  148. package/dist/utils/provider-injector.js.map +1 -0
  149. package/dist/utils/provider-injector.test.d.ts +2 -0
  150. package/dist/utils/provider-injector.test.d.ts.map +1 -0
  151. package/dist/utils/provider-injector.test.js +67 -0
  152. package/dist/utils/provider-injector.test.js.map +1 -0
  153. package/dist/utils/scaffold.d.ts +20 -0
  154. package/dist/utils/scaffold.d.ts.map +1 -0
  155. package/dist/utils/scaffold.js +197 -0
  156. package/dist/utils/scaffold.js.map +1 -0
  157. package/package.json +35 -0
  158. package/src/commands/audit.ts +234 -0
  159. package/src/commands/backup.ts +96 -0
  160. package/src/commands/check.ts +191 -0
  161. package/src/commands/config.ts +263 -0
  162. package/src/commands/debug-patterns.test.ts +134 -0
  163. package/src/commands/debug-patterns.ts +257 -0
  164. package/src/commands/diagnose.ts +136 -0
  165. package/src/commands/init.test.ts +82 -0
  166. package/src/commands/init.ts +536 -0
  167. package/src/commands/install-hooks.ts +66 -0
  168. package/src/commands/preflight.test.ts +139 -0
  169. package/src/commands/preflight.ts +488 -0
  170. package/src/commands/rename.ts +264 -0
  171. package/src/commands/scaffold-adapter.test.ts +110 -0
  172. package/src/commands/scaffold-adapter.ts +250 -0
  173. package/src/commands/scan.ts +125 -0
  174. package/src/commands/sync-seed.test.ts +116 -0
  175. package/src/commands/sync.ts +736 -0
  176. package/src/commands/transform.ts +151 -0
  177. package/src/commands/translate/README.md +75 -0
  178. package/src/commands/translate/csv-handler.ts +301 -0
  179. package/src/commands/translate/executor.ts +188 -0
  180. package/src/commands/translate/index.ts +220 -0
  181. package/src/commands/translate/reporter.ts +138 -0
  182. package/src/commands/translate/types.ts +56 -0
  183. package/src/commands/translate.test.ts +173 -0
  184. package/src/commands/translate.ts +6 -0
  185. package/src/e2e.test.ts +479 -0
  186. package/src/fixtures/README.md +61 -0
  187. package/src/fixtures/basic-react/i18n.config.json +15 -0
  188. package/src/fixtures/basic-react/locales/de.json +8 -0
  189. package/src/fixtures/basic-react/locales/en.json +8 -0
  190. package/src/fixtures/basic-react/locales/fr.json +8 -0
  191. package/src/fixtures/basic-react/src/App.tsx +15 -0
  192. package/src/fixtures/basic-react/src/Messages.tsx +12 -0
  193. package/src/fixtures/nested-locales/i18n.config.json +9 -0
  194. package/src/fixtures/nested-locales/locales/en.json +23 -0
  195. package/src/fixtures/nested-locales/locales/fr.json +23 -0
  196. package/src/fixtures/nested-locales/src/HomePage.tsx +13 -0
  197. package/src/fixtures/suspicious-keys/i18n.config.json +9 -0
  198. package/src/fixtures/suspicious-keys/locales/en.json +11 -0
  199. package/src/fixtures/suspicious-keys/locales/fr.json +11 -0
  200. package/src/fixtures/suspicious-keys/src/BadKeys.tsx +19 -0
  201. package/src/index.ts +43 -0
  202. package/src/integration.test.ts +438 -0
  203. package/src/utils/diagnostics-exit.test.ts +47 -0
  204. package/src/utils/diagnostics-exit.ts +63 -0
  205. package/src/utils/diff-utils.test.ts +36 -0
  206. package/src/utils/diff-utils.ts +42 -0
  207. package/src/utils/exit-codes.ts +201 -0
  208. package/src/utils/package-manager.ts +44 -0
  209. package/src/utils/pkg.ts +23 -0
  210. package/src/utils/provider-injector.test.ts +79 -0
  211. package/src/utils/provider-injector.ts +315 -0
  212. package/src/utils/scaffold.ts +240 -0
  213. package/tsconfig.json +17 -0
@@ -0,0 +1,61 @@
1
+ # E2E Test Fixtures
2
+
3
+ This directory contains fixture projects for end-to-end testing of i18nsmith CLI commands.
4
+
5
+ ## Fixture Projects
6
+
7
+ ### `basic-react`
8
+ A minimal React project with react-i18next for basic workflow testing.
9
+ - Tests: scan, sync, transform, check commands
10
+ - Uses: react-i18next adapter
11
+
12
+ ### `nested-locales`
13
+ Tests nested locale file structure (flat vs nested JSON).
14
+ - Tests: --rewrite-shape flat/nested
15
+ - Uses: Nested JSON structure with dot-delimited keys
16
+
17
+ ### `multi-namespace`
18
+ Tests namespace-based organization.
19
+ - Tests: Namespace scanning, multi-file locales
20
+ - Uses: Multiple namespace JSON files
21
+
22
+ ### `suspicious-keys`
23
+ Tests detection and handling of suspicious key patterns.
24
+ - Tests: audit, sync --strict, auto-rename features
25
+ - Uses: Various problematic key patterns
26
+
27
+ ### `backup-restore`
28
+ Tests backup and restore functionality.
29
+ - Tests: backup-list, backup-restore, --no-backup
30
+ - Uses: Pre-created backup directories
31
+
32
+ ## Usage in Tests
33
+
34
+ ```typescript
35
+ import { setupFixture, cleanupFixture } from './helpers';
36
+
37
+ describe('some feature', () => {
38
+ let fixtureDir: string;
39
+
40
+ beforeEach(async () => {
41
+ fixtureDir = await setupFixture('basic-react');
42
+ });
43
+
44
+ afterEach(async () => {
45
+ await cleanupFixture(fixtureDir);
46
+ });
47
+
48
+ it('should work', () => {
49
+ const result = runCli(['scan'], { cwd: fixtureDir });
50
+ expect(result.exitCode).toBe(0);
51
+ });
52
+ });
53
+ ```
54
+
55
+ ## Adding New Fixtures
56
+
57
+ 1. Create a new directory under `fixtures/`
58
+ 2. Add `i18n.config.json` with appropriate settings
59
+ 3. Add source files and locales as needed
60
+ 4. Document the fixture in this README
61
+ 5. Add tests that use the fixture
@@ -0,0 +1,15 @@
1
+ {
2
+ "sourceLanguage": "en",
3
+ "targetLanguages": ["fr", "de"],
4
+ "localesDir": "locales",
5
+ "include": ["src/**/*.tsx", "src/**/*.ts"],
6
+ "exclude": ["**/*.test.tsx", "**/*.test.ts"],
7
+ "translationAdapter": {
8
+ "module": "react-i18next",
9
+ "hookName": "useTranslation",
10
+ "translationIdentifier": "t"
11
+ },
12
+ "sync": {
13
+ "suspiciousKeyPolicy": "warn"
14
+ }
15
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "common.welcome": "Willkommen in unserer App",
3
+ "common.goodbye": "Auf Wiedersehen",
4
+ "buttons.submit": "Absenden",
5
+ "buttons.cancel": "Abbrechen",
6
+ "messages.success": "Operation erfolgreich",
7
+ "messages.error": "Ein Fehler ist aufgetreten"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "common.welcome": "Welcome to our app",
3
+ "common.goodbye": "Goodbye",
4
+ "buttons.submit": "Submit",
5
+ "buttons.cancel": "Cancel",
6
+ "messages.success": "Operation successful",
7
+ "messages.error": "An error occurred"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "common.welcome": "Bienvenue dans notre application",
3
+ "common.goodbye": "Au revoir",
4
+ "buttons.submit": "Soumettre",
5
+ "buttons.cancel": "Annuler",
6
+ "messages.success": "Opération réussie",
7
+ "messages.error": "Une erreur est survenue"
8
+ }
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+
4
+ export function App() {
5
+ const { t } = useTranslation();
6
+
7
+ return (
8
+ <div>
9
+ <h1>{t('common.welcome')}</h1>
10
+ <p>Some untranslated text that should be detected</p>
11
+ <button>{t('buttons.submit')}</button>
12
+ <button>{t('buttons.cancel')}</button>
13
+ </div>
14
+ );
15
+ }
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+
4
+ export function SuccessMessage() {
5
+ const { t } = useTranslation();
6
+ return <div className="success">{t('messages.success')}</div>;
7
+ }
8
+
9
+ export function ErrorMessage() {
10
+ const { t } = useTranslation();
11
+ return <div className="error">{t('messages.error')}</div>;
12
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "sourceLanguage": "en",
3
+ "targetLanguages": ["fr"],
4
+ "localesDir": "locales",
5
+ "include": ["src/**/*.tsx"],
6
+ "locales": {
7
+ "delimiter": "."
8
+ }
9
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "common": {
3
+ "buttons": {
4
+ "submit": "Submit",
5
+ "cancel": "Cancel",
6
+ "save": "Save"
7
+ },
8
+ "labels": {
9
+ "name": "Name",
10
+ "email": "Email"
11
+ }
12
+ },
13
+ "pages": {
14
+ "home": {
15
+ "title": "Home",
16
+ "welcome": "Welcome back!"
17
+ },
18
+ "settings": {
19
+ "title": "Settings",
20
+ "description": "Configure your preferences"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "common": {
3
+ "buttons": {
4
+ "submit": "Soumettre",
5
+ "cancel": "Annuler",
6
+ "save": "Sauvegarder"
7
+ },
8
+ "labels": {
9
+ "name": "Nom",
10
+ "email": "Courriel"
11
+ }
12
+ },
13
+ "pages": {
14
+ "home": {
15
+ "title": "Accueil",
16
+ "welcome": "Bon retour!"
17
+ },
18
+ "settings": {
19
+ "title": "Paramètres",
20
+ "description": "Configurez vos préférences"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,13 @@
1
+ import { useTranslation } from 'react-i18next';
2
+
3
+ export function HomePage() {
4
+ const { t } = useTranslation();
5
+
6
+ return (
7
+ <div>
8
+ <h1>{t('pages.home.title')}</h1>
9
+ <p>{t('pages.home.welcome')}</p>
10
+ <button>{t('common.buttons.submit')}</button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "sourceLanguage": "en",
3
+ "targetLanguages": ["fr"],
4
+ "localesDir": "locales",
5
+ "include": ["src/**/*.tsx"],
6
+ "sync": {
7
+ "suspiciousKeyPolicy": "warn"
8
+ }
9
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "Hello World": "Hello World",
3
+ "Welcome to our app!": "Welcome to our app!",
4
+ "Click Here": "Click Here",
5
+ "Save": "Save",
6
+ "The Quick Brown Fox": "The Quick Brown Fox",
7
+ "When to use this feature:": "When to use this feature:",
8
+ "proper.namespaced.key": "This is a properly namespaced key",
9
+ "buttons.submit": "Submit",
10
+ "common.title": "Application Title"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "Hello World": "Bonjour le monde",
3
+ "Welcome to our app!": "Bienvenue dans notre application!",
4
+ "Click Here": "Cliquez ici",
5
+ "Save": "Sauvegarder",
6
+ "The Quick Brown Fox": "Le Renard Brun Rapide",
7
+ "When to use this feature:": "Quand utiliser cette fonctionnalité:",
8
+ "proper.namespaced.key": "Ceci est une clé correctement nommée",
9
+ "buttons.submit": "Soumettre",
10
+ "common.title": "Titre de l'application"
11
+ }
@@ -0,0 +1,19 @@
1
+ import { useTranslation } from 'react-i18next';
2
+
3
+ export function BadKeys() {
4
+ const { t } = useTranslation();
5
+
6
+ return (
7
+ <div>
8
+ {/* These are bad keys - text as key */}
9
+ <h1>{t('Hello World')}</h1>
10
+ <p>{t('Welcome to our app!')}</p>
11
+ <a href="#">{t('Click Here')}</a>
12
+ <button>{t('Save')}</button>
13
+
14
+ {/* These are good keys */}
15
+ <p>{t('proper.namespaced.key')}</p>
16
+ <button>{t('buttons.submit')}</button>
17
+ </div>
18
+ );
19
+ }
package/src/index.ts ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerInit } from './commands/init.js';
4
+ import { registerScaffoldAdapter } from './commands/scaffold-adapter.js';
5
+ import { registerTranslate } from './commands/translate.js';
6
+ import { registerPreflight } from './commands/preflight.js';
7
+ import { registerDebugPatterns } from './commands/debug-patterns.js';
8
+ import { registerDiagnose } from './commands/diagnose.js';
9
+ import { registerAudit } from './commands/audit.js';
10
+ import { registerCheck } from './commands/check.js';
11
+ import { registerScan } from './commands/scan.js';
12
+ import { registerTransform } from './commands/transform.js';
13
+ import { registerSync } from './commands/sync.js';
14
+ import { registerBackup } from './commands/backup.js';
15
+ import { registerRename } from './commands/rename.js';
16
+ import { registerInstallHooks } from './commands/install-hooks.js';
17
+ import { registerConfig } from './commands/config.js';
18
+
19
+ export const program = new Command();
20
+
21
+ program
22
+ .name('i18nsmith')
23
+ .description('Universal Automated i18n Library')
24
+ .version('0.1.0');
25
+
26
+ registerInit(program);
27
+ registerScaffoldAdapter(program);
28
+ registerTranslate(program);
29
+ registerPreflight(program);
30
+ registerDebugPatterns(program);
31
+ registerDiagnose(program);
32
+ registerAudit(program);
33
+ registerCheck(program);
34
+ registerScan(program);
35
+ registerTransform(program);
36
+ registerSync(program);
37
+ registerBackup(program);
38
+ registerRename(program);
39
+ registerInstallHooks(program);
40
+ registerConfig(program);
41
+
42
+
43
+ program.parse();