@translation-cms/sync 1.2.28 → 1.2.29

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 (197) hide show
  1. package/dist/api.d.ts +105 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +208 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/bin.d.ts +25 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +208 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/commands/init.d.ts +10 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +107 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/pull.d.ts +10 -0
  14. package/dist/commands/pull.d.ts.map +1 -0
  15. package/dist/commands/pull.js +35 -0
  16. package/dist/commands/pull.js.map +1 -0
  17. package/dist/commands/status.d.ts +15 -0
  18. package/dist/commands/status.d.ts.map +1 -0
  19. package/dist/commands/status.js +62 -0
  20. package/dist/commands/status.js.map +1 -0
  21. package/dist/commands/sync.d.ts +24 -0
  22. package/dist/commands/sync.d.ts.map +1 -0
  23. package/dist/commands/sync.js +131 -0
  24. package/dist/commands/sync.js.map +1 -0
  25. package/dist/commands/watch.d.ts +18 -0
  26. package/dist/commands/watch.d.ts.map +1 -0
  27. package/dist/commands/watch.js +71 -0
  28. package/dist/commands/watch.js.map +1 -0
  29. package/dist/config/config-internals/args.d.ts +11 -0
  30. package/dist/config/config-internals/args.d.ts.map +1 -0
  31. package/dist/config/config-internals/args.js +22 -0
  32. package/dist/config/config-internals/args.js.map +1 -0
  33. package/dist/config/config-internals/env.d.ts +10 -0
  34. package/dist/config/config-internals/env.d.ts.map +1 -0
  35. package/dist/config/config-internals/env.js +35 -0
  36. package/dist/config/config-internals/env.js.map +1 -0
  37. package/dist/config/config-internals/file.d.ts +11 -0
  38. package/dist/config/config-internals/file.d.ts.map +1 -0
  39. package/dist/config/config-internals/file.js +28 -0
  40. package/dist/config/config-internals/file.js.map +1 -0
  41. package/dist/config/config-internals/resolve.d.ts +21 -0
  42. package/dist/config/config-internals/resolve.d.ts.map +1 -0
  43. package/dist/config/config-internals/resolve.js +73 -0
  44. package/dist/config/config-internals/resolve.js.map +1 -0
  45. package/dist/config/config-internals/root.d.ts +9 -0
  46. package/dist/config/config-internals/root.d.ts.map +1 -0
  47. package/dist/config/config-internals/root.js +22 -0
  48. package/dist/config/config-internals/root.js.map +1 -0
  49. package/dist/config/config-internals/types.d.ts +91 -0
  50. package/dist/config/config-internals/types.d.ts.map +1 -0
  51. package/dist/config/config-internals/types.js +9 -0
  52. package/dist/config/config-internals/types.js.map +1 -0
  53. package/dist/config/resolve-config.d.ts +11 -0
  54. package/dist/config/resolve-config.d.ts.map +1 -0
  55. package/dist/config/resolve-config.js +10 -0
  56. package/dist/config/resolve-config.js.map +1 -0
  57. package/dist/core/api-internals/helpers.d.ts +9 -0
  58. package/dist/core/api-internals/helpers.d.ts.map +1 -0
  59. package/dist/core/api-internals/helpers.js +14 -0
  60. package/dist/core/api-internals/helpers.js.map +1 -0
  61. package/dist/core/api-internals/pull.d.ts +19 -0
  62. package/dist/core/api-internals/pull.d.ts.map +1 -0
  63. package/dist/core/api-internals/pull.js +269 -0
  64. package/dist/core/api-internals/pull.js.map +1 -0
  65. package/dist/core/api-internals/route-config.d.ts +13 -0
  66. package/dist/core/api-internals/route-config.d.ts.map +1 -0
  67. package/dist/core/api-internals/route-config.js +34 -0
  68. package/dist/core/api-internals/route-config.js.map +1 -0
  69. package/dist/core/api-internals/sync.d.ts +19 -0
  70. package/dist/core/api-internals/sync.d.ts.map +1 -0
  71. package/dist/core/api-internals/sync.js +139 -0
  72. package/dist/core/api-internals/sync.js.map +1 -0
  73. package/dist/core/api-internals/types.d.ts +33 -0
  74. package/dist/core/api-internals/types.d.ts.map +1 -0
  75. package/dist/core/api-internals/types.js +5 -0
  76. package/dist/core/api-internals/types.js.map +1 -0
  77. package/dist/core/api.d.ts +11 -0
  78. package/dist/core/api.d.ts.map +1 -0
  79. package/dist/core/api.js +11 -0
  80. package/dist/core/api.js.map +1 -0
  81. package/dist/core/cache-internals/format.d.ts +20 -0
  82. package/dist/core/cache-internals/format.d.ts.map +1 -0
  83. package/dist/core/cache-internals/format.js +33 -0
  84. package/dist/core/cache-internals/format.js.map +1 -0
  85. package/dist/core/cache-internals/params.d.ts +33 -0
  86. package/dist/core/cache-internals/params.d.ts.map +1 -0
  87. package/dist/core/cache-internals/params.js +155 -0
  88. package/dist/core/cache-internals/params.js.map +1 -0
  89. package/dist/core/cache-internals/pull.d.ts +17 -0
  90. package/dist/core/cache-internals/pull.d.ts.map +1 -0
  91. package/dist/core/cache-internals/pull.js +34 -0
  92. package/dist/core/cache-internals/pull.js.map +1 -0
  93. package/dist/core/cache-internals/sync.d.ts +29 -0
  94. package/dist/core/cache-internals/sync.d.ts.map +1 -0
  95. package/dist/core/cache-internals/sync.js +104 -0
  96. package/dist/core/cache-internals/sync.js.map +1 -0
  97. package/dist/core/cache-internals/types.d.ts +48 -0
  98. package/dist/core/cache-internals/types.d.ts.map +1 -0
  99. package/dist/core/cache-internals/types.js +2 -0
  100. package/dist/core/cache-internals/types.js.map +1 -0
  101. package/dist/core/cache.d.ts +13 -0
  102. package/dist/core/cache.d.ts.map +1 -0
  103. package/dist/core/cache.js +33 -0
  104. package/dist/core/cache.js.map +1 -0
  105. package/dist/core/scanner-internals/ast.d.ts +40 -0
  106. package/dist/core/scanner-internals/ast.d.ts.map +1 -0
  107. package/dist/core/scanner-internals/ast.js +100 -0
  108. package/dist/core/scanner-internals/ast.js.map +1 -0
  109. package/dist/core/scanner-internals/file-walker.d.ts +10 -0
  110. package/dist/core/scanner-internals/file-walker.d.ts.map +1 -0
  111. package/dist/core/scanner-internals/file-walker.js +23 -0
  112. package/dist/core/scanner-internals/file-walker.js.map +1 -0
  113. package/dist/core/scanner-internals/import-resolver.d.ts +21 -0
  114. package/dist/core/scanner-internals/import-resolver.d.ts.map +1 -0
  115. package/dist/core/scanner-internals/import-resolver.js +119 -0
  116. package/dist/core/scanner-internals/import-resolver.js.map +1 -0
  117. package/dist/core/scanner-internals/key-extractor.d.ts +20 -0
  118. package/dist/core/scanner-internals/key-extractor.d.ts.map +1 -0
  119. package/dist/core/scanner-internals/key-extractor.js +274 -0
  120. package/dist/core/scanner-internals/key-extractor.js.map +1 -0
  121. package/dist/core/scanner-internals/nav-config-scanner.d.ts +30 -0
  122. package/dist/core/scanner-internals/nav-config-scanner.d.ts.map +1 -0
  123. package/dist/core/scanner-internals/nav-config-scanner.js +170 -0
  124. package/dist/core/scanner-internals/nav-config-scanner.js.map +1 -0
  125. package/dist/core/scanner-internals/route-detector.d.ts +27 -0
  126. package/dist/core/scanner-internals/route-detector.d.ts.map +1 -0
  127. package/dist/core/scanner-internals/route-detector.js +78 -0
  128. package/dist/core/scanner-internals/route-detector.js.map +1 -0
  129. package/dist/core/scanner-internals/types.d.ts +60 -0
  130. package/dist/core/scanner-internals/types.d.ts.map +1 -0
  131. package/dist/core/scanner-internals/types.js +29 -0
  132. package/dist/core/scanner-internals/types.js.map +1 -0
  133. package/dist/core/scanner.d.ts +21 -0
  134. package/dist/core/scanner.d.ts.map +1 -0
  135. package/dist/core/scanner.js +162 -0
  136. package/dist/core/scanner.js.map +1 -0
  137. package/dist/index.d.ts +3 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +3 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/next.d.ts +33 -0
  142. package/dist/next.d.ts.map +1 -0
  143. package/dist/next.js +110 -0
  144. package/dist/next.js.map +1 -0
  145. package/dist/preview/index.d.ts +39 -0
  146. package/dist/preview/index.d.ts.map +1 -0
  147. package/dist/preview/index.js +123 -0
  148. package/dist/preview/index.js.map +1 -0
  149. package/dist/preview/internals/highlight.d.ts +31 -0
  150. package/dist/preview/internals/highlight.d.ts.map +1 -0
  151. package/dist/preview/internals/highlight.js +184 -0
  152. package/dist/preview/internals/highlight.js.map +1 -0
  153. package/dist/preview/internals/interactions.d.ts +15 -0
  154. package/dist/preview/internals/interactions.d.ts.map +1 -0
  155. package/dist/preview/internals/interactions.js +38 -0
  156. package/dist/preview/internals/interactions.js.map +1 -0
  157. package/dist/preview/internals/interactive.d.ts +14 -0
  158. package/dist/preview/internals/interactive.d.ts.map +1 -0
  159. package/dist/preview/internals/interactive.js +122 -0
  160. package/dist/preview/internals/interactive.js.map +1 -0
  161. package/dist/preview/internals/locales.d.ts +9 -0
  162. package/dist/preview/internals/locales.d.ts.map +1 -0
  163. package/dist/preview/internals/locales.js +24 -0
  164. package/dist/preview/internals/locales.js.map +1 -0
  165. package/dist/preview/internals/state.d.ts +37 -0
  166. package/dist/preview/internals/state.d.ts.map +1 -0
  167. package/dist/preview/internals/state.js +74 -0
  168. package/dist/preview/internals/state.js.map +1 -0
  169. package/dist/preview/internals/styles.d.ts +8 -0
  170. package/dist/preview/internals/styles.d.ts.map +1 -0
  171. package/dist/preview/internals/styles.js +28 -0
  172. package/dist/preview/internals/styles.js.map +1 -0
  173. package/dist/preview/internals/types.d.ts +74 -0
  174. package/dist/preview/internals/types.d.ts.map +1 -0
  175. package/dist/preview/internals/types.js +5 -0
  176. package/dist/preview/internals/types.js.map +1 -0
  177. package/dist/preview/internals/ui-indicators.d.ts +15 -0
  178. package/dist/preview/internals/ui-indicators.d.ts.map +1 -0
  179. package/dist/preview/internals/ui-indicators.js +92 -0
  180. package/dist/preview/internals/ui-indicators.js.map +1 -0
  181. package/dist/scaffold/index.d.ts +3 -0
  182. package/dist/scaffold/index.d.ts.map +1 -0
  183. package/dist/scaffold/index.js +3 -0
  184. package/dist/scaffold/index.js.map +1 -0
  185. package/dist/scaffold/intenrals/scaffold.d.ts +24 -0
  186. package/dist/scaffold/intenrals/scaffold.d.ts.map +1 -0
  187. package/dist/scaffold/intenrals/scaffold.js +53 -0
  188. package/dist/scaffold/intenrals/scaffold.js.map +1 -0
  189. package/dist/scaffold/intenrals/templates.d.ts +10 -0
  190. package/dist/scaffold/intenrals/templates.d.ts.map +1 -0
  191. package/dist/scaffold/intenrals/templates.js +344 -0
  192. package/dist/scaffold/intenrals/templates.js.map +1 -0
  193. package/dist/scaffold/intenrals/types.d.ts +14 -0
  194. package/dist/scaffold/intenrals/types.d.ts.map +1 -0
  195. package/dist/scaffold/intenrals/types.js +5 -0
  196. package/dist/scaffold/intenrals/types.js.map +1 -0
  197. package/package.json +3 -3
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Format a single PreviewRoute for human-readable output.
3
+ *
4
+ * Plain string routes are returned as-is.
5
+ * Object routes (with params) are rendered as `/path (key=value, …)`.
6
+ *
7
+ * @example
8
+ * formatPreviewRoute('/dashboard') // → "/dashboard"
9
+ * formatPreviewRoute({ route: '/blog/[slug]', params: { slug: 'hello' } })
10
+ * // → "/blog/[slug] (slug=hello)"
11
+ */
12
+ export function formatPreviewRoute(route) {
13
+ if (typeof route === 'string')
14
+ return route;
15
+ // Append param list only when params are present
16
+ const params = route.params
17
+ ? ` (${Object.entries(route.params)
18
+ .map(([k, v]) => `${k}=${v}`)
19
+ .join(', ')})`
20
+ : '';
21
+ return `${route.route}${params}`;
22
+ }
23
+ /**
24
+ * Format an array of PreviewRoutes as a comma-separated string.
25
+ * Returns `"no route"` for keys that have no associated preview routes
26
+ * (e.g. keys inside dialogs or overlays).
27
+ */
28
+ export function formatPreviewRoutes(routes) {
29
+ if (routes.length === 0)
30
+ return 'no route';
31
+ return routes.map(formatPreviewRoute).join(', ');
32
+ }
33
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/core/cache-internals/format.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,iDAAiD;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QACvB,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5B,IAAI,CAAC,IAAI,CAAC,GAAG;QACpB,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACtD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { CachedRouteParams } from './types.js';
2
+ /**
3
+ * Generate route params from detected routes.
4
+ * Scans all routes, extracts [param] names, generates defaults.
5
+ *
6
+ * @example
7
+ * generateRouteParams(["/[locale]/blog/[slug]", "/about"])
8
+ * // {
9
+ * // "/[locale]/blog/[slug]": { "locale": "en", "slug": "demo" }
10
+ * // }
11
+ */
12
+ export declare function generateRouteParams(routes: string[]): Record<string, Record<string, string>>;
13
+ /**
14
+ * Load route params from cache (if exists).
15
+ */
16
+ export declare function loadRouteParamsCache(root: string): CachedRouteParams | null;
17
+ /**
18
+ * Save route params to cache.
19
+ */
20
+ export declare function saveRouteParamsCache(root: string, params: Record<string, Record<string, string>>): void;
21
+ /**
22
+ * Write a TypeScript mock-data file exporting all route params as a typed
23
+ * `cmsRouteParams` constant. Import this in context files, generateStaticParams,
24
+ * tests, or Storybook stories to get type-safe mock data.
25
+ *
26
+ * @example
27
+ * // src/lib/cms-mock-params.ts (auto-generated)
28
+ * export const cmsRouteParams = {
29
+ * "/[locale]/blog/[slug]": { locale: "en", slug: "demo" },
30
+ * } as const;
31
+ */
32
+ export declare function writeMockDataFile(root: string, params: Record<string, Record<string, string>>, relativeOutputPath: string): void;
33
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/core/cache-internals/params.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoEpD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,MAAM,EAAE,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAexC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAU3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC/C,IAAI,CAUN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,kBAAkB,EAAE,MAAM,GAC3B,IAAI,CAqCN"}
@@ -0,0 +1,155 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { createHash } from 'crypto';
4
+ /**
5
+ * Extract dynamic parameter names from a route string.
6
+ * E.g. "/[locale]/blog/[slug]" → ["locale", "slug"]
7
+ */
8
+ function extractParamNames(route) {
9
+ const matches = route.match(/\[(\w+)\]/g) ?? [];
10
+ return matches.map(m => m.slice(1, -1));
11
+ }
12
+ /**
13
+ * Generate a deterministic UUID for a param ID.
14
+ * Same param name always produces the same UUID (for consistency).
15
+ * Uses MD5 hash of the param name to create a v4-like UUID.
16
+ */
17
+ function generateDeterministicUUID(paramName) {
18
+ const hash = createHash('md5')
19
+ .update(`cms-param:${paramName}`)
20
+ .digest('hex');
21
+ // Format as UUID v4-like: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
22
+ return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
23
+ }
24
+ /**
25
+ * Generate a sensible default value for any dynamic route param name.
26
+ *
27
+ * Matches by suffix/pattern so it works generically — e.g. `productId`,
28
+ * `orderId`, `articleSlug`, `teamName` — without hardcoding every variant.
29
+ *
30
+ * For IDs: generates a deterministic UUID so the same param always produces
31
+ * the same value (important for caching and consistency).
32
+ *
33
+ * Fallback: converts the param name from camelCase to kebab-case, which is
34
+ * both human-readable and a valid value for slug-style params.
35
+ * e.g. `articleSlug` → `"article-slug"`, `teamName` → `"team-name"`
36
+ */
37
+ function generateDefaultParamValue(paramName) {
38
+ const lower = paramName.toLowerCase();
39
+ // Any param ending in "id" (userId, productId, orderId, …) → deterministic UUID
40
+ if (lower.endsWith('id'))
41
+ return generateDeterministicUUID(paramName);
42
+ // Email addresses
43
+ if (lower.includes('email'))
44
+ return 'demo@example.com';
45
+ // Dates (createdDate, startDate, …)
46
+ if (lower.includes('date'))
47
+ return '2024-01-01';
48
+ // Pagination and numeric indices (page, pageNum, stepIndex, …)
49
+ if (lower === 'page' ||
50
+ lower.endsWith('num') ||
51
+ lower.endsWith('index') ||
52
+ lower.endsWith('page'))
53
+ return '1';
54
+ // Version strings (version, apiVersion, ver, …)
55
+ if (lower.includes('version') || lower === 'ver')
56
+ return 'v1';
57
+ // Fallback: kebab-case the param name so the value is always meaningful
58
+ return paramName
59
+ .replace(/([A-Z])/g, '-$1')
60
+ .toLowerCase()
61
+ .replace(/^-/, '');
62
+ }
63
+ /**
64
+ * Generate route params from detected routes.
65
+ * Scans all routes, extracts [param] names, generates defaults.
66
+ *
67
+ * @example
68
+ * generateRouteParams(["/[locale]/blog/[slug]", "/about"])
69
+ * // {
70
+ * // "/[locale]/blog/[slug]": { "locale": "en", "slug": "demo" }
71
+ * // }
72
+ */
73
+ export function generateRouteParams(routes) {
74
+ const result = {};
75
+ for (const route of routes) {
76
+ const params = extractParamNames(route);
77
+ if (params.length === 0)
78
+ continue;
79
+ const defaults = {};
80
+ for (const param of params) {
81
+ defaults[param] = generateDefaultParamValue(param);
82
+ }
83
+ result[route] = defaults;
84
+ }
85
+ return result;
86
+ }
87
+ /**
88
+ * Load route params from cache (if exists).
89
+ */
90
+ export function loadRouteParamsCache(root) {
91
+ const metaPath = path.join(root, '.cms-sync-cache-meta.json');
92
+ if (!fs.existsSync(metaPath))
93
+ return null;
94
+ try {
95
+ return JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Save route params to cache.
103
+ */
104
+ export function saveRouteParamsCache(root, params) {
105
+ const cached = {
106
+ generated: params,
107
+ timestamp: new Date().toISOString(),
108
+ };
109
+ fs.writeFileSync(path.join(root, '.cms-sync-cache-meta.json'), JSON.stringify(cached, null, 2), 'utf-8');
110
+ }
111
+ /**
112
+ * Write a TypeScript mock-data file exporting all route params as a typed
113
+ * `cmsRouteParams` constant. Import this in context files, generateStaticParams,
114
+ * tests, or Storybook stories to get type-safe mock data.
115
+ *
116
+ * @example
117
+ * // src/lib/cms-mock-params.ts (auto-generated)
118
+ * export const cmsRouteParams = {
119
+ * "/[locale]/blog/[slug]": { locale: "en", slug: "demo" },
120
+ * } as const;
121
+ */
122
+ export function writeMockDataFile(root, params, relativeOutputPath) {
123
+ if (Object.keys(params).length === 0)
124
+ return;
125
+ const entries = Object.entries(params)
126
+ .map(([route, p]) => {
127
+ const inner = Object.entries(p)
128
+ .map(([k, v]) => ` ${JSON.stringify(k)}: ${JSON.stringify(v)}`)
129
+ .join(',\n');
130
+ return ` ${JSON.stringify(route)}: {\n${inner},\n }`;
131
+ })
132
+ .join(',\n');
133
+ const content = [
134
+ '// auto-generated by sync-translations — do not edit manually',
135
+ '// run `sync-translations sync` to update',
136
+ '',
137
+ 'export const cmsRouteParams = {',
138
+ entries + ',',
139
+ '} as const;',
140
+ '',
141
+ 'export type CmsRoute = keyof typeof cmsRouteParams;',
142
+ 'export type CmsRouteParams<R extends CmsRoute> = (typeof cmsRouteParams)[R];',
143
+ '',
144
+ ].join('\n');
145
+ const absPath = path.isAbsolute(relativeOutputPath)
146
+ ? relativeOutputPath
147
+ : path.join(root, relativeOutputPath);
148
+ const dir = path.dirname(absPath);
149
+ if (!fs.existsSync(dir))
150
+ fs.mkdirSync(dir, { recursive: true });
151
+ fs.writeFileSync(absPath, content, 'utf-8');
152
+ // eslint-disable-next-line no-console
153
+ console.log(`[mock-data] Written to ${path.relative(root, absPath)}`);
154
+ }
155
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../../../src/core/cache-internals/params.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Filename of the pull timestamp marker written inside the output directory. */
2
+ export declare const PULL_META_FILE = ".last-pulled";
3
+ /** Default TTL before a pull is considered stale and a re-fetch is triggered. */
4
+ export declare const DEFAULT_PULL_TTL_MS: number;
5
+ /**
6
+ * Read the timestamp of the last successful pull from the marker file.
7
+ * Returns the time as a Unix timestamp (ms), or null when the file is absent
8
+ * or contains an unparseable date.
9
+ */
10
+ export declare function getLastPulledTime(outputDir: string): number | null;
11
+ /**
12
+ * Write the current time as an ISO 8601 string to the marker file.
13
+ * Creates the output directory if it doesn't exist yet.
14
+ * Called after a successful pull to reset the TTL clock.
15
+ */
16
+ export declare function saveLastPulledTime(outputDir: string): void;
17
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/core/cache-internals/pull.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,QAAgB,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAO1D"}
@@ -0,0 +1,34 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ /** Filename of the pull timestamp marker written inside the output directory. */
4
+ export const PULL_META_FILE = '.last-pulled';
5
+ /** Default TTL before a pull is considered stale and a re-fetch is triggered. */
6
+ export const DEFAULT_PULL_TTL_MS = 5 * 60 * 1000; // 5 minutes
7
+ /**
8
+ * Read the timestamp of the last successful pull from the marker file.
9
+ * Returns the time as a Unix timestamp (ms), or null when the file is absent
10
+ * or contains an unparseable date.
11
+ */
12
+ export function getLastPulledTime(outputDir) {
13
+ const p = path.join(outputDir, PULL_META_FILE);
14
+ if (!fs.existsSync(p))
15
+ return null;
16
+ try {
17
+ const ts = new Date(fs.readFileSync(p, 'utf-8').trim()).getTime();
18
+ // isNaN guard handles a corrupted or empty file
19
+ return isNaN(ts) ? null : ts;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * Write the current time as an ISO 8601 string to the marker file.
27
+ * Creates the output directory if it doesn't exist yet.
28
+ * Called after a successful pull to reset the TTL clock.
29
+ */
30
+ export function saveLastPulledTime(outputDir) {
31
+ fs.mkdirSync(outputDir, { recursive: true });
32
+ fs.writeFileSync(path.join(outputDir, PULL_META_FILE), new Date().toISOString(), 'utf-8');
33
+ }
34
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/core/cache-internals/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE9D;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAClE,gDAAgD;QAChD,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAChD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,EAAE,CAAC,aAAa,CACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACpC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,OAAO,CACV,CAAC;AACN,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { SerializedNamespaces, SyncDiff } from './types.js';
2
+ /**
3
+ * Load the serialized namespace map from the last successful sync.
4
+ * Returns null when no cache exists yet or when the file is unreadable.
5
+ */
6
+ export declare function loadSyncCache(root: string): SerializedNamespaces | null;
7
+ /**
8
+ * Persist the serialized namespace map as the new sync baseline.
9
+ * Subsequent runs diff against this to detect changes.
10
+ */
11
+ export declare function saveSyncCache(root: string, data: SerializedNamespaces): void;
12
+ /**
13
+ * Returns true when the current scan differs from the cached baseline,
14
+ * meaning the CMS needs to be updated.
15
+ * Always returns true when there is no cache yet (first run).
16
+ */
17
+ export declare function isSyncNeeded(current: SerializedNamespaces, cached: SerializedNamespaces | null): boolean;
18
+ /**
19
+ * Compute a three-way diff between the current scan and the cached baseline:
20
+ *
21
+ * - `added` keys present in current but not in cache
22
+ * - `removed` keys present in cache but no longer in current
23
+ * - `routesChanged` keys present in both but with different preview routes
24
+ * - `unchanged` count of keys that are identical in both
25
+ *
26
+ * Preview routes are compared order-independently by sorting before joining.
27
+ */
28
+ export declare function computeDiff(current: SerializedNamespaces, cached: SerializedNamespaces | null): SyncDiff;
29
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/core/cache-internals/sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKjE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAQvE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,oBAAoB,GAAG,IAAI,GACpC,OAAO,CAIT;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,oBAAoB,GAAG,IAAI,GACpC,QAAQ,CAgDV"}
@@ -0,0 +1,104 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ /** Filename of the sync baseline cache written at the project root. */
4
+ const CACHE_FILE = '.cms-sync-cache.json';
5
+ /**
6
+ * Load the serialized namespace map from the last successful sync.
7
+ * Returns null when no cache exists yet or when the file is unreadable.
8
+ */
9
+ export function loadSyncCache(root) {
10
+ const p = path.join(root, CACHE_FILE);
11
+ if (!fs.existsSync(p))
12
+ return null;
13
+ try {
14
+ return JSON.parse(fs.readFileSync(p, 'utf-8'));
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ /**
21
+ * Persist the serialized namespace map as the new sync baseline.
22
+ * Subsequent runs diff against this to detect changes.
23
+ */
24
+ export function saveSyncCache(root, data) {
25
+ fs.writeFileSync(path.join(root, CACHE_FILE), JSON.stringify(data, null, 2), 'utf-8');
26
+ }
27
+ /**
28
+ * Returns true when the current scan differs from the cached baseline,
29
+ * meaning the CMS needs to be updated.
30
+ * Always returns true when there is no cache yet (first run).
31
+ */
32
+ export function isSyncNeeded(current, cached) {
33
+ if (!cached)
34
+ return true;
35
+ // Stringify comparison is sufficient — order is stable because serializeNamespaces sorts keys
36
+ return JSON.stringify(current) !== JSON.stringify(cached);
37
+ }
38
+ /**
39
+ * Compute a three-way diff between the current scan and the cached baseline:
40
+ *
41
+ * - `added` keys present in current but not in cache
42
+ * - `removed` keys present in cache but no longer in current
43
+ * - `routesChanged` keys present in both but with different preview routes
44
+ * - `unchanged` count of keys that are identical in both
45
+ *
46
+ * Preview routes are compared order-independently by sorting before joining.
47
+ */
48
+ export function computeDiff(current, cached) {
49
+ const added = [];
50
+ const removed = [];
51
+ const routesChanged = [];
52
+ let unchanged = 0;
53
+ // Forward pass: find added keys and route changes
54
+ for (const [ns, keys] of Object.entries(current)) {
55
+ for (const { key, previewRoutes } of keys) {
56
+ const cachedEntry = cached?.[ns]?.find(k => k.key === key);
57
+ if (!cachedEntry) {
58
+ added.push({ namespace: ns, key, routes: previewRoutes });
59
+ }
60
+ else {
61
+ // Sort both sides so route order doesn't cause false positives
62
+ const before = [...cachedEntry.previewRoutes]
63
+ .map(routeToString)
64
+ .sort()
65
+ .join(',');
66
+ const after = [...previewRoutes]
67
+ .map(routeToString)
68
+ .sort()
69
+ .join(',');
70
+ if (before !== after) {
71
+ routesChanged.push({
72
+ namespace: ns,
73
+ key,
74
+ before: cachedEntry.previewRoutes,
75
+ after: previewRoutes,
76
+ });
77
+ }
78
+ else {
79
+ unchanged++;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ // Reverse pass: find keys that exist in cache but are gone from current
85
+ if (cached) {
86
+ for (const [ns, keys] of Object.entries(cached)) {
87
+ for (const { key } of keys) {
88
+ if (!(current[ns] ?? []).some(k => k.key === key)) {
89
+ removed.push({ namespace: ns, key });
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return { added, removed, routesChanged, unchanged };
95
+ }
96
+ /**
97
+ * Normalise a PreviewRoute to a string for stable comparison.
98
+ * String routes are returned as-is; object routes are JSON-stringified.
99
+ */
100
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ function routeToString(r) {
102
+ return typeof r === 'string' ? r : JSON.stringify(r);
103
+ }
104
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/core/cache-internals/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { PreviewRoute } from '../../core/scanner.js';
2
+ /**
3
+ * The serialized form of a NamespaceMap written to the sync cache and sent to
4
+ * the CMS API. Each namespace maps to an ordered array of key entries so the
5
+ * structure is JSON-serializable without Maps.
6
+ */
7
+ export type SerializedNamespaces = Record<string, Array<{
8
+ key: string;
9
+ previewRoutes: PreviewRoute[];
10
+ }>>;
11
+ /**
12
+ * Result of diffing the current scan against the cached baseline.
13
+ *
14
+ * - `added` keys new since the last sync
15
+ * - `removed` keys that no longer exist in the source
16
+ * - `routesChanged` keys whose set of preview routes has changed
17
+ * - `unchanged` count of keys identical in both snapshots
18
+ */
19
+ export interface SyncDiff {
20
+ added: Array<{
21
+ namespace: string;
22
+ key: string;
23
+ routes: PreviewRoute[];
24
+ }>;
25
+ removed: Array<{
26
+ namespace: string;
27
+ key: string;
28
+ }>;
29
+ routesChanged: Array<{
30
+ namespace: string;
31
+ key: string;
32
+ before: PreviewRoute[];
33
+ after: PreviewRoute[];
34
+ }>;
35
+ unchanged: number;
36
+ }
37
+ /**
38
+ * Shape of the `.cms-sync-cache-meta.json` file that stores auto-generated
39
+ * route params between sync runs.
40
+ *
41
+ * - `generated` route → param map produced by the last sync
42
+ * - `timestamp` ISO 8601 string of when the cache was last written
43
+ */
44
+ export interface CachedRouteParams {
45
+ generated: Record<string, Record<string, string>>;
46
+ timestamp: string;
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/cache-internals/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CACrC,MAAM,EACN,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CACxD,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,aAAa,EAAE,KAAK,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,KAAK,EAAE,YAAY,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/cache-internals/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { NamespaceMap } from './scanner.js';
2
+ export type { SerializedNamespaces, SyncDiff, CachedRouteParams, } from './cache-internals/types.js';
3
+ export { loadSyncCache, saveSyncCache, isSyncNeeded, computeDiff, } from './cache-internals/sync.js';
4
+ export { generateRouteParams, loadRouteParamsCache, saveRouteParamsCache, writeMockDataFile, } from './cache-internals/params.js';
5
+ export { PULL_META_FILE, DEFAULT_PULL_TTL_MS, getLastPulledTime, saveLastPulledTime, } from './cache-internals/pull.js';
6
+ export { formatPreviewRoute, formatPreviewRoutes, } from './cache-internals/format.js';
7
+ import type { SerializedNamespaces } from './cache-internals/types.js';
8
+ export declare function serializeNamespaces(namespaces: NamespaceMap): {
9
+ serialized: SerializedNamespaces;
10
+ totalKeys: number;
11
+ };
12
+ export declare function writeReport(reportPath: string, namespaces: SerializedNamespaces, diff?: any): void;
13
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,YAAY,EACR,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAMvE,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,YAAY,GAAG;IAC3D,UAAU,EAAE,oBAAoB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACrB,CAYA;AAMD,wBAAgB,WAAW,CACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,oBAAoB,EAChC,IAAI,CAAC,EAAE,GAAG,GACX,IAAI,CASN"}
@@ -0,0 +1,33 @@
1
+ import fs from 'fs';
2
+ export { loadSyncCache, saveSyncCache, isSyncNeeded, computeDiff, } from './cache-internals/sync.js';
3
+ export { generateRouteParams, loadRouteParamsCache, saveRouteParamsCache, writeMockDataFile, } from './cache-internals/params.js';
4
+ export { PULL_META_FILE, DEFAULT_PULL_TTL_MS, getLastPulledTime, saveLastPulledTime, } from './cache-internals/pull.js';
5
+ export { formatPreviewRoute, formatPreviewRoutes, } from './cache-internals/format.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Serialization
8
+ // ---------------------------------------------------------------------------
9
+ export function serializeNamespaces(namespaces) {
10
+ const serialized = {};
11
+ let totalKeys = 0;
12
+ for (const [ns, keyMap] of Object.entries(namespaces)) {
13
+ serialized[ns] = [...keyMap.entries()]
14
+ .map(([key, previewRoutes]) => ({ key, previewRoutes }))
15
+ .sort((a, b) => a.key.localeCompare(b.key));
16
+ totalKeys += keyMap.size;
17
+ }
18
+ return { serialized, totalKeys };
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Report
22
+ // ---------------------------------------------------------------------------
23
+ export function writeReport(reportPath, namespaces, diff) {
24
+ const report = {
25
+ generatedAt: new Date().toISOString(),
26
+ namespaces,
27
+ };
28
+ if (diff)
29
+ report['diff'] = diff;
30
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');
31
+ console.log(`[report] Written to ${reportPath}`);
32
+ }
33
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AASpB,OAAO,EACH,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,6BAA6B,CAAC;AAKrC,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,UAAU,mBAAmB,CAAC,UAAwB;IAIxD,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;aACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,UAAU,WAAW,CACvB,UAAkB,EAClB,UAAgC,EAChC,IAAU;IAEV,MAAM,MAAM,GAA4B;QACpC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;KACb,CAAC;IACF,IAAI,IAAI;QAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAEhC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * AST parsing and traversal utilities.
3
+ */
4
+ import type { AstNode } from './types.js';
5
+ /**
6
+ * Walk an AST node depth-first, calling visit() for every node encountered.
7
+ *
8
+ * Handles three cases:
9
+ * - Arrays → recurse into each element
10
+ * - AST nodes → call visit(), then recurse into all object-valued properties
11
+ * - Primitives → stop (nothing to traverse)
12
+ */
13
+ export declare function walk(node: unknown, visit: (node: AstNode) => void): void;
14
+ /**
15
+ * Parse source code into a Babel AST with the appropriate plugins for the
16
+ * file extension.
17
+ *
18
+ * - `.ts` → typescript
19
+ * - `.tsx`, `.jsx`, `.js` → typescript (if .tsx) + jsx
20
+ *
21
+ * `errorRecovery: true` lets the parser continue past syntax errors so a
22
+ * single broken file doesn't abort the entire scan.
23
+ */
24
+ export declare function parseSource(filePath: string, source: string): unknown;
25
+ /**
26
+ * Extract the static string value from a `StringLiteral` or a `TemplateLiteral`
27
+ * that contains no expressions (i.e. `` `plain string` ``).
28
+ * Returns null for dynamic expressions or any other node type.
29
+ */
30
+ export declare function stringValue(node: unknown): string | null;
31
+ /**
32
+ * Extract namespace string(s) from the first argument of a
33
+ * `useTranslation()` / `getTranslation()` call.
34
+ *
35
+ * Handles:
36
+ * - Single string: `useTranslation('sidebar')` → `['sidebar']`
37
+ * - Array of strings: `useTranslation(['common', 'nav'])` → `['common', 'nav']`
38
+ */
39
+ export declare function namespacesFromArg(node: unknown): string[];
40
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../../src/core/scanner-internals/ast.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAYxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUrE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiBxD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAWzD"}