@intlayer/chokidar 9.0.0-canary.2 → 9.0.0-canary.4

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 (97) hide show
  1. package/dist/cjs/init/frameworkSetup/index.cjs +27 -0
  2. package/dist/cjs/init/frameworkSetup/index.cjs.map +1 -0
  3. package/dist/cjs/init/frameworkSetup/nextAppRouter/detect.cjs +56 -0
  4. package/dist/cjs/init/frameworkSetup/nextAppRouter/detect.cjs.map +1 -0
  5. package/dist/cjs/init/frameworkSetup/nextAppRouter/index.cjs +103 -0
  6. package/dist/cjs/init/frameworkSetup/nextAppRouter/index.cjs.map +1 -0
  7. package/dist/cjs/init/frameworkSetup/nextAppRouter/restructure.cjs +147 -0
  8. package/dist/cjs/init/frameworkSetup/nextAppRouter/restructure.cjs.map +1 -0
  9. package/dist/cjs/init/frameworkSetup/nextAppRouter/templates.cjs +122 -0
  10. package/dist/cjs/init/frameworkSetup/nextAppRouter/templates.cjs.map +1 -0
  11. package/dist/cjs/init/frameworkSetup/nextAppRouter/transforms.cjs +211 -0
  12. package/dist/cjs/init/frameworkSetup/nextAppRouter/transforms.cjs.map +1 -0
  13. package/dist/cjs/init/frameworkSetup/tanstackStart/detect.cjs +31 -0
  14. package/dist/cjs/init/frameworkSetup/tanstackStart/detect.cjs.map +1 -0
  15. package/dist/cjs/init/frameworkSetup/tanstackStart/index.cjs +74 -0
  16. package/dist/cjs/init/frameworkSetup/tanstackStart/index.cjs.map +1 -0
  17. package/dist/cjs/init/frameworkSetup/tanstackStart/restructure.cjs +79 -0
  18. package/dist/cjs/init/frameworkSetup/tanstackStart/restructure.cjs.map +1 -0
  19. package/dist/cjs/init/frameworkSetup/tanstackStart/templates.cjs +104 -0
  20. package/dist/cjs/init/frameworkSetup/tanstackStart/templates.cjs.map +1 -0
  21. package/dist/cjs/init/frameworkSetup/tanstackStart/transforms.cjs +128 -0
  22. package/dist/cjs/init/frameworkSetup/tanstackStart/transforms.cjs.map +1 -0
  23. package/dist/cjs/init/frameworkSetup/types.cjs +0 -0
  24. package/dist/cjs/init/index.cjs +51 -21
  25. package/dist/cjs/init/index.cjs.map +1 -1
  26. package/dist/cjs/init/utils/configManipulation.cjs +2 -1
  27. package/dist/cjs/init/utils/configManipulation.cjs.map +1 -1
  28. package/dist/cjs/init/utils/fileSystem.cjs +45 -0
  29. package/dist/cjs/init/utils/fileSystem.cjs.map +1 -1
  30. package/dist/cjs/init/utils/index.cjs +7 -1
  31. package/dist/cjs/init/utils/packageManager.cjs +84 -1
  32. package/dist/cjs/init/utils/packageManager.cjs.map +1 -1
  33. package/dist/esm/init/frameworkSetup/index.mjs +26 -0
  34. package/dist/esm/init/frameworkSetup/index.mjs.map +1 -0
  35. package/dist/esm/init/frameworkSetup/nextAppRouter/detect.mjs +52 -0
  36. package/dist/esm/init/frameworkSetup/nextAppRouter/detect.mjs.map +1 -0
  37. package/dist/esm/init/frameworkSetup/nextAppRouter/index.mjs +100 -0
  38. package/dist/esm/init/frameworkSetup/nextAppRouter/index.mjs.map +1 -0
  39. package/dist/esm/init/frameworkSetup/nextAppRouter/restructure.mjs +142 -0
  40. package/dist/esm/init/frameworkSetup/nextAppRouter/restructure.mjs.map +1 -0
  41. package/dist/esm/init/frameworkSetup/nextAppRouter/templates.mjs +113 -0
  42. package/dist/esm/init/frameworkSetup/nextAppRouter/templates.mjs.map +1 -0
  43. package/dist/esm/init/frameworkSetup/nextAppRouter/transforms.mjs +208 -0
  44. package/dist/esm/init/frameworkSetup/nextAppRouter/transforms.mjs.map +1 -0
  45. package/dist/esm/init/frameworkSetup/tanstackStart/detect.mjs +28 -0
  46. package/dist/esm/init/frameworkSetup/tanstackStart/detect.mjs.map +1 -0
  47. package/dist/esm/init/frameworkSetup/tanstackStart/index.mjs +71 -0
  48. package/dist/esm/init/frameworkSetup/tanstackStart/index.mjs.map +1 -0
  49. package/dist/esm/init/frameworkSetup/tanstackStart/restructure.mjs +74 -0
  50. package/dist/esm/init/frameworkSetup/tanstackStart/restructure.mjs.map +1 -0
  51. package/dist/esm/init/frameworkSetup/tanstackStart/templates.mjs +100 -0
  52. package/dist/esm/init/frameworkSetup/tanstackStart/templates.mjs.map +1 -0
  53. package/dist/esm/init/frameworkSetup/tanstackStart/transforms.mjs +126 -0
  54. package/dist/esm/init/frameworkSetup/tanstackStart/transforms.mjs.map +1 -0
  55. package/dist/esm/init/frameworkSetup/types.mjs +0 -0
  56. package/dist/esm/init/index.mjs +52 -22
  57. package/dist/esm/init/index.mjs.map +1 -1
  58. package/dist/esm/init/utils/configManipulation.mjs +2 -1
  59. package/dist/esm/init/utils/configManipulation.mjs.map +1 -1
  60. package/dist/esm/init/utils/fileSystem.mjs +46 -2
  61. package/dist/esm/init/utils/fileSystem.mjs.map +1 -1
  62. package/dist/esm/init/utils/index.mjs +3 -3
  63. package/dist/esm/init/utils/packageManager.mjs +81 -3
  64. package/dist/esm/init/utils/packageManager.mjs.map +1 -1
  65. package/dist/types/init/frameworkSetup/index.d.ts +13 -0
  66. package/dist/types/init/frameworkSetup/index.d.ts.map +1 -0
  67. package/dist/types/init/frameworkSetup/nextAppRouter/detect.d.ts +25 -0
  68. package/dist/types/init/frameworkSetup/nextAppRouter/detect.d.ts.map +1 -0
  69. package/dist/types/init/frameworkSetup/nextAppRouter/index.d.ts +12 -0
  70. package/dist/types/init/frameworkSetup/nextAppRouter/index.d.ts.map +1 -0
  71. package/dist/types/init/frameworkSetup/nextAppRouter/restructure.d.ts +44 -0
  72. package/dist/types/init/frameworkSetup/nextAppRouter/restructure.d.ts.map +1 -0
  73. package/dist/types/init/frameworkSetup/nextAppRouter/templates.d.ts +26 -0
  74. package/dist/types/init/frameworkSetup/nextAppRouter/templates.d.ts.map +1 -0
  75. package/dist/types/init/frameworkSetup/nextAppRouter/transforms.d.ts +23 -0
  76. package/dist/types/init/frameworkSetup/nextAppRouter/transforms.d.ts.map +1 -0
  77. package/dist/types/init/frameworkSetup/tanstackStart/detect.d.ts +19 -0
  78. package/dist/types/init/frameworkSetup/tanstackStart/detect.d.ts.map +1 -0
  79. package/dist/types/init/frameworkSetup/tanstackStart/index.d.ts +13 -0
  80. package/dist/types/init/frameworkSetup/tanstackStart/index.d.ts.map +1 -0
  81. package/dist/types/init/frameworkSetup/tanstackStart/restructure.d.ts +35 -0
  82. package/dist/types/init/frameworkSetup/tanstackStart/restructure.d.ts.map +1 -0
  83. package/dist/types/init/frameworkSetup/tanstackStart/templates.d.ts +20 -0
  84. package/dist/types/init/frameworkSetup/tanstackStart/templates.d.ts.map +1 -0
  85. package/dist/types/init/frameworkSetup/tanstackStart/transforms.d.ts +17 -0
  86. package/dist/types/init/frameworkSetup/tanstackStart/transforms.d.ts.map +1 -0
  87. package/dist/types/init/frameworkSetup/types.d.ts +35 -0
  88. package/dist/types/init/frameworkSetup/types.d.ts.map +1 -0
  89. package/dist/types/init/index.d.ts +17 -0
  90. package/dist/types/init/index.d.ts.map +1 -1
  91. package/dist/types/init/utils/configManipulation.d.ts.map +1 -1
  92. package/dist/types/init/utils/fileSystem.d.ts +30 -1
  93. package/dist/types/init/utils/fileSystem.d.ts.map +1 -1
  94. package/dist/types/init/utils/index.d.ts +3 -3
  95. package/dist/types/init/utils/packageManager.d.ts +52 -1
  96. package/dist/types/init/utils/packageManager.d.ts.map +1 -1
  97. package/package.json +9 -9
@@ -0,0 +1,128 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
3
+ let recast = require("recast");
4
+ recast = require_runtime.__toESM(recast);
5
+
6
+ //#region src/init/frameworkSetup/tanstackStart/transforms.ts
7
+ const { builders: b, namedTypes: n } = recast.types;
8
+ /** babel-ts parser handles TypeScript *and* JSX. */
9
+ const parseTsx = (code) => recast.parse(code, { parser: require("recast/parsers/babel-ts") });
10
+ /** Index just past the leading directives + import declarations. */
11
+ const firstInsertIndex = (ast) => {
12
+ const body = ast.program.body;
13
+ let index = 0;
14
+ while (index < body.length && (body[index].type === "ExpressionStatement" && body[index].expression?.type === "StringLiteral" || body[index].type === "ImportDeclaration")) index++;
15
+ return index;
16
+ };
17
+ /** Ensures `import { importName } from source`, merging into an existing import from the same source. */
18
+ const ensureNamedImport = (ast, importName, source) => {
19
+ for (const stmt of ast.program.body) if (stmt.type === "ImportDeclaration" && stmt.source.value === source) {
20
+ if (!stmt.specifiers.some((spec) => spec.type === "ImportSpecifier" && spec.imported?.name === importName)) stmt.specifiers.push(b.importSpecifier(b.identifier(importName)));
21
+ return;
22
+ }
23
+ ast.program.body.splice(firstInsertIndex(ast), 0, b.importDeclaration([b.importSpecifier(b.identifier(importName))], b.stringLiteral(source)));
24
+ };
25
+ /**
26
+ * Finds the single function that returns the `<html>` document element. Returns
27
+ * `null` when there is no such function, or more than one (ambiguous).
28
+ */
29
+ const findHtmlDocumentFunction = (ast) => {
30
+ const found = /* @__PURE__ */ new Set();
31
+ recast.visit(ast, { visitJSXOpeningElement(path) {
32
+ const node = path.node;
33
+ if (node.name?.type === "JSXIdentifier" && node.name.name === "html") {
34
+ let current = path.parentPath;
35
+ while (current) {
36
+ const value = current.value;
37
+ if (value && (n.FunctionDeclaration.check(value) || n.FunctionExpression.check(value) || n.ArrowFunctionExpression.check(value))) {
38
+ found.add(value);
39
+ break;
40
+ }
41
+ current = current.parentPath;
42
+ }
43
+ }
44
+ this.traverse(path);
45
+ } });
46
+ return found.size === 1 ? [...found][0] : null;
47
+ };
48
+ /**
49
+ * Inserts `const locale = …` once, at the top of the function body. A single
50
+ * self-contained statement is used (rather than an intermediate `params` const)
51
+ * so it can never collide with a `params` variable the document already
52
+ * declares. Expression-bodied arrow functions are first converted to a block so
53
+ * the declaration has somewhere to live.
54
+ */
55
+ const ensureLocaleFromParams = (funcNode) => {
56
+ if (funcNode.body?.type !== "BlockStatement") funcNode.body = b.blockStatement([b.returnStatement(funcNode.body)]);
57
+ if (funcNode.body.body.some((stmt) => stmt.type === "VariableDeclaration" && stmt.declarations.some((d) => d.id?.type === "Identifier" && d.id.name === "locale"))) return;
58
+ const statement = parseTsx("const locale = useParams({ strict: false }).locale ?? defaultLocale;").program.body[0];
59
+ funcNode.body.body.unshift(statement);
60
+ };
61
+ /** Sets `lang={locale}` and `dir={getHTMLTextDir(locale)}` on the first `<html>` element. */
62
+ const setHtmlLangAndDir = (ast) => {
63
+ recast.visit(ast, { visitJSXOpeningElement(path) {
64
+ const node = path.node;
65
+ if (node.name?.type !== "JSXIdentifier" || node.name.name !== "html") {
66
+ this.traverse(path);
67
+ return;
68
+ }
69
+ const upsertAttribute = (name, value) => {
70
+ const existing = node.attributes?.find((attr) => attr.type === "JSXAttribute" && attr.name?.name === name);
71
+ if (existing) existing.value = value;
72
+ else node.attributes.push(b.jsxAttribute(b.jsxIdentifier(name), value));
73
+ };
74
+ upsertAttribute("lang", b.jsxExpressionContainer(b.identifier("locale")));
75
+ upsertAttribute("dir", b.jsxExpressionContainer(b.callExpression(b.identifier("getHTMLTextDir"), [b.identifier("locale")])));
76
+ return false;
77
+ } });
78
+ };
79
+ /**
80
+ * Wraps the `{children}` of a TanStack Start root document with
81
+ * `IntlayerProvider`, deriving the locale from the `{-$locale}` route param.
82
+ * Safe and idempotent: bails (returns the original code) when the provider is
83
+ * already present, when no `<html>` document function is found, or when there is
84
+ * no `{children}` placeholder to wrap.
85
+ */
86
+ const wrapRootWithProvider = (code) => {
87
+ const ast = parseTsx(code);
88
+ if (code.includes("IntlayerProvider")) return {
89
+ code,
90
+ status: "already"
91
+ };
92
+ const funcNode = findHtmlDocumentFunction(ast);
93
+ if (!funcNode) return {
94
+ code,
95
+ status: "skipped"
96
+ };
97
+ let wrapped = false;
98
+ recast.visit(funcNode, { visitJSXExpressionContainer(path) {
99
+ if (wrapped) return false;
100
+ const expression = path.node.expression;
101
+ if (expression?.type === "Identifier" && expression.name === "children") {
102
+ const providerElement = parseTsx("const __wrap = <IntlayerProvider locale={locale}>{__child__}</IntlayerProvider>;").program.body[0].declarations[0].init;
103
+ providerElement.children = [path.node];
104
+ path.replace(providerElement);
105
+ wrapped = true;
106
+ return false;
107
+ }
108
+ this.traverse(path);
109
+ } });
110
+ if (!wrapped) return {
111
+ code,
112
+ status: "skipped"
113
+ };
114
+ ensureNamedImport(ast, "IntlayerProvider", "react-intlayer");
115
+ ensureNamedImport(ast, "useParams", "@tanstack/react-router");
116
+ ensureNamedImport(ast, "defaultLocale", "intlayer");
117
+ ensureNamedImport(ast, "getHTMLTextDir", "intlayer");
118
+ ensureLocaleFromParams(funcNode);
119
+ setHtmlLangAndDir(ast);
120
+ return {
121
+ code: recast.print(ast).code,
122
+ status: "wrapped"
123
+ };
124
+ };
125
+
126
+ //#endregion
127
+ exports.wrapRootWithProvider = wrapRootWithProvider;
128
+ //# sourceMappingURL=transforms.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.cjs","names":[],"sources":["../../../../../src/init/frameworkSetup/tanstackStart/transforms.ts"],"sourcesContent":["import * as recast from 'recast';\n\nconst { builders: b, namedTypes: n } = recast.types;\n\n/** babel-ts parser handles TypeScript *and* JSX. */\nconst parseTsx = (code: string): any =>\n recast.parse(code, { parser: require('recast/parsers/babel-ts') });\n\n/** Result of a source transform. `code` is unchanged for any non-`wrapped` status. */\nexport type TransformResult = {\n code: string;\n status: 'wrapped' | 'already' | 'skipped';\n};\n\n/** Index just past the leading directives + import declarations. */\nconst firstInsertIndex = (ast: any): number => {\n const body = ast.program.body;\n let index = 0;\n while (\n index < body.length &&\n ((body[index].type === 'ExpressionStatement' &&\n body[index].expression?.type === 'StringLiteral') ||\n body[index].type === 'ImportDeclaration')\n ) {\n index++;\n }\n return index;\n};\n\n/** Ensures `import { importName } from source`, merging into an existing import from the same source. */\nconst ensureNamedImport = (\n ast: any,\n importName: string,\n source: string\n): void => {\n for (const stmt of ast.program.body) {\n if (stmt.type === 'ImportDeclaration' && stmt.source.value === source) {\n const hasSpecifier = stmt.specifiers.some(\n (spec: any) =>\n spec.type === 'ImportSpecifier' && spec.imported?.name === importName\n );\n if (!hasSpecifier) {\n stmt.specifiers.push(b.importSpecifier(b.identifier(importName)));\n }\n return;\n }\n }\n\n ast.program.body.splice(\n firstInsertIndex(ast),\n 0,\n b.importDeclaration(\n [b.importSpecifier(b.identifier(importName))],\n b.stringLiteral(source)\n )\n );\n};\n\n/**\n * Finds the single function that returns the `<html>` document element. Returns\n * `null` when there is no such function, or more than one (ambiguous).\n */\nconst findHtmlDocumentFunction = (ast: any): any => {\n const found = new Set<any>();\n\n recast.visit(ast, {\n visitJSXOpeningElement(path) {\n const node = path.node;\n if (node.name?.type === 'JSXIdentifier' && node.name.name === 'html') {\n // Walk up to the nearest enclosing function node.\n let current = path.parentPath;\n while (current) {\n const value = current.value;\n if (\n value &&\n (n.FunctionDeclaration.check(value) ||\n n.FunctionExpression.check(value) ||\n n.ArrowFunctionExpression.check(value))\n ) {\n found.add(value);\n break;\n }\n current = current.parentPath;\n }\n }\n this.traverse(path);\n },\n });\n\n return found.size === 1 ? [...found][0] : null;\n};\n\n/**\n * Inserts `const locale = …` once, at the top of the function body. A single\n * self-contained statement is used (rather than an intermediate `params` const)\n * so it can never collide with a `params` variable the document already\n * declares. Expression-bodied arrow functions are first converted to a block so\n * the declaration has somewhere to live.\n */\nconst ensureLocaleFromParams = (funcNode: any): void => {\n if (funcNode.body?.type !== 'BlockStatement') {\n funcNode.body = b.blockStatement([b.returnStatement(funcNode.body)]);\n }\n\n const hasLocale = funcNode.body.body.some(\n (stmt: any) =>\n stmt.type === 'VariableDeclaration' &&\n stmt.declarations.some(\n (d: any) => d.id?.type === 'Identifier' && d.id.name === 'locale'\n )\n );\n if (hasLocale) return;\n\n const statement = parseTsx(\n 'const locale = useParams({ strict: false }).locale ?? defaultLocale;'\n ).program.body[0];\n funcNode.body.body.unshift(statement);\n};\n\n/** Sets `lang={locale}` and `dir={getHTMLTextDir(locale)}` on the first `<html>` element. */\nconst setHtmlLangAndDir = (ast: any): void => {\n recast.visit(ast, {\n visitJSXOpeningElement(path) {\n const node = path.node;\n if (node.name?.type !== 'JSXIdentifier' || node.name.name !== 'html') {\n this.traverse(path);\n return;\n }\n\n const upsertAttribute = (name: string, value: any): void => {\n const existing = node.attributes?.find(\n (attr: any) =>\n attr.type === 'JSXAttribute' && attr.name?.name === name\n ) as any;\n if (existing) {\n existing.value = value;\n } else {\n node.attributes.push(b.jsxAttribute(b.jsxIdentifier(name), value));\n }\n };\n\n upsertAttribute('lang', b.jsxExpressionContainer(b.identifier('locale')));\n upsertAttribute(\n 'dir',\n b.jsxExpressionContainer(\n b.callExpression(b.identifier('getHTMLTextDir'), [\n b.identifier('locale'),\n ])\n )\n );\n return false;\n },\n });\n};\n\n/**\n * Wraps the `{children}` of a TanStack Start root document with\n * `IntlayerProvider`, deriving the locale from the `{-$locale}` route param.\n * Safe and idempotent: bails (returns the original code) when the provider is\n * already present, when no `<html>` document function is found, or when there is\n * no `{children}` placeholder to wrap.\n */\nexport const wrapRootWithProvider = (code: string): TransformResult => {\n const ast = parseTsx(code);\n\n if (code.includes('IntlayerProvider')) return { code, status: 'already' };\n\n const funcNode = findHtmlDocumentFunction(ast);\n if (!funcNode) return { code, status: 'skipped' };\n\n let wrapped = false;\n recast.visit(funcNode, {\n visitJSXExpressionContainer(path) {\n if (wrapped) return false;\n const expression = path.node.expression;\n if (expression?.type === 'Identifier' && expression.name === 'children') {\n const template = parseTsx(\n 'const __wrap = <IntlayerProvider locale={locale}>{__child__}</IntlayerProvider>;'\n );\n const providerElement = template.program.body[0].declarations[0].init;\n providerElement.children = [path.node];\n path.replace(providerElement);\n wrapped = true;\n return false;\n }\n this.traverse(path);\n },\n });\n\n if (!wrapped) return { code, status: 'skipped' };\n\n ensureNamedImport(ast, 'IntlayerProvider', 'react-intlayer');\n ensureNamedImport(ast, 'useParams', '@tanstack/react-router');\n ensureNamedImport(ast, 'defaultLocale', 'intlayer');\n ensureNamedImport(ast, 'getHTMLTextDir', 'intlayer');\n ensureLocaleFromParams(funcNode);\n setHtmlLangAndDir(ast);\n\n return { code: recast.print(ast).code, status: 'wrapped' };\n};\n"],"mappings":"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"}
File without changes
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
3
  const require_initConfig_index = require('../initConfig/index.cjs');
4
- const require_init_utils_configManipulation = require('./utils/configManipulation.cjs');
5
4
  const require_init_utils_fileSystem = require('./utils/fileSystem.cjs');
5
+ const require_init_frameworkSetup_index = require('./frameworkSetup/index.cjs');
6
+ const require_init_utils_configManipulation = require('./utils/configManipulation.cjs');
6
7
  const require_init_utils_githubActions = require('./utils/githubActions.cjs');
7
8
  const require_init_utils_jsonParser = require('./utils/jsonParser.cjs');
8
9
  const require_init_utils_packageManager = require('./utils/packageManager.cjs');
@@ -125,22 +126,39 @@ const initIntlayer = async (rootDir, options) => {
125
126
  };
126
127
  const packageManager = require_init_utils_packageManager.detectPackageManager(rootDir);
127
128
  const { packagesToInstall, devPackagesToInstall, compatSyncConfig, compatVitePluginConfig } = require_init_utils_packageManager.detectMissingIntlayerPackages(allDeps);
128
- if (packagesToInstall.length > 0) {
129
- (0, _intlayer_config_logger.logger)((0, _intlayer_config_logger.colorize)("Installing missing Intlayer dependencies...", _intlayer_config_colors.CYAN));
130
- try {
131
- require_init_utils_packageManager.installPackages(rootDir, packagesToInstall, packageManager);
132
- (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Installed: ${packagesToInstall.map((pkg) => (0, _intlayer_config_logger.colorize)(pkg, _intlayer_config_colors.MAGENTA)).join(", ")}`);
133
- } catch {
134
- (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Failed to install packages. Please install manually: ${packagesToInstall.join(" ")}`, { level: "warn" });
129
+ if (!options?.noInstallPackages) {
130
+ if (packagesToInstall.length > 0) {
131
+ (0, _intlayer_config_logger.logger)((0, _intlayer_config_logger.colorize)("Installing missing Intlayer dependencies...", _intlayer_config_colors.CYAN));
132
+ try {
133
+ require_init_utils_packageManager.installPackages(rootDir, packagesToInstall, packageManager);
134
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Installed: ${packagesToInstall.map((pkg) => (0, _intlayer_config_logger.colorize)(pkg, _intlayer_config_colors.MAGENTA)).join(", ")}`);
135
+ } catch {
136
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Failed to install packages. Please install manually: ${packagesToInstall.join(" ")}`, { level: "warn" });
137
+ }
135
138
  }
136
- }
137
- if (devPackagesToInstall.length > 0) {
138
- (0, _intlayer_config_logger.logger)((0, _intlayer_config_logger.colorize)("Installing missing Intlayer dev dependencies...", _intlayer_config_colors.CYAN));
139
- try {
140
- require_init_utils_packageManager.installPackages(rootDir, devPackagesToInstall, packageManager, true);
141
- (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Installed: ${devPackagesToInstall.map((pkg) => (0, _intlayer_config_logger.colorize)(pkg, _intlayer_config_colors.MAGENTA)).join(", ")}`);
142
- } catch {
143
- (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Failed to install dev packages. Please install manually: ${devPackagesToInstall.join(" ")}`, { level: "warn" });
139
+ if (devPackagesToInstall.length > 0) {
140
+ (0, _intlayer_config_logger.logger)((0, _intlayer_config_logger.colorize)("Installing missing Intlayer dev dependencies...", _intlayer_config_colors.CYAN));
141
+ try {
142
+ require_init_utils_packageManager.installPackages(rootDir, devPackagesToInstall, packageManager, true);
143
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Installed: ${devPackagesToInstall.map((pkg) => (0, _intlayer_config_logger.colorize)(pkg, _intlayer_config_colors.MAGENTA)).join(", ")}`);
144
+ } catch {
145
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Failed to install dev packages. Please install manually: ${devPackagesToInstall.join(" ")}`, { level: "warn" });
146
+ }
147
+ }
148
+ if (options?.upgradeToVersion) {
149
+ const outdatedDependencies = require_init_utils_packageManager.detectOutdatedIntlayerPackages(rootDir, packageJson.dependencies ?? {}, options.upgradeToVersion);
150
+ const outdatedDevDependencies = require_init_utils_packageManager.detectOutdatedIntlayerPackages(rootDir, packageJson.devDependencies ?? {}, options.upgradeToVersion);
151
+ const allOutdated = [...outdatedDependencies, ...outdatedDevDependencies];
152
+ if (allOutdated.length > 0) {
153
+ (0, _intlayer_config_logger.logger)((0, _intlayer_config_logger.colorize)(`Upgrading outdated Intlayer dependencies to ${options.upgradeToVersion}...`, _intlayer_config_colors.CYAN));
154
+ try {
155
+ require_init_utils_packageManager.upgradePackages(rootDir, outdatedDependencies, packageManager, options.upgradeToVersion);
156
+ require_init_utils_packageManager.upgradePackages(rootDir, outdatedDevDependencies, packageManager, options.upgradeToVersion, true);
157
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Upgraded: ${allOutdated.map((pkg) => (0, _intlayer_config_logger.colorize)(pkg, _intlayer_config_colors.MAGENTA)).join(", ")}`);
158
+ } catch {
159
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Failed to upgrade packages. Please upgrade manually: ${allOutdated.join(" ")}`, { level: "warn" });
160
+ }
161
+ } else (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} Intlayer dependencies are up to date`);
144
162
  }
145
163
  }
146
164
  const gitignorePath = ".gitignore";
@@ -170,7 +188,7 @@ const initIntlayer = async (rootDir, options) => {
170
188
  const vscodeDir = ".vscode";
171
189
  const extensionsJsonPath = (0, node_path.join)(vscodeDir, "extensions.json");
172
190
  const extensionId = "intlayer.intlayer-vs-code-extension";
173
- try {
191
+ if (!options?.noVscodeExtension) try {
174
192
  let extensionsConfig = { recommendations: [] };
175
193
  if (await require_init_utils_fileSystem.exists(rootDir, extensionsJsonPath)) extensionsConfig = require_init_utils_jsonParser.parseJSONWithComments(await require_init_utils_fileSystem.readFileFromRoot(rootDir, extensionsJsonPath));
176
194
  else await require_init_utils_fileSystem.ensureDirectory(rootDir, vscodeDir);
@@ -184,7 +202,7 @@ const initIntlayer = async (rootDir, options) => {
184
202
  (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Could not update ${(0, _intlayer_config_logger.colorizePath)(extensionsJsonPath)}. You may need to add ${(0, _intlayer_config_logger.colorize)(extensionId, _intlayer_config_colors.MAGENTA)} manually.`, { level: "warn" });
185
203
  }
186
204
  const settingsJsonPath = (0, node_path.join)(vscodeDir, "settings.json");
187
- try {
205
+ if (!options?.noLsp) try {
188
206
  let settingsConfig = {};
189
207
  if (await require_init_utils_fileSystem.exists(rootDir, settingsJsonPath)) settingsConfig = require_init_utils_jsonParser.parseJSONWithComments(await require_init_utils_fileSystem.readFileFromRoot(rootDir, settingsJsonPath));
190
208
  else await require_init_utils_fileSystem.ensureDirectory(rootDir, vscodeDir);
@@ -228,10 +246,12 @@ const initIntlayer = async (rootDir, options) => {
228
246
  const detectedPattern = await require_init_utils_fileSystem.detectJsonLocalePattern(rootDir);
229
247
  await require_initConfig_index.initConfig(format, rootDir, detectedPattern?.locales);
230
248
  if (compatSyncConfig) {
231
- const resolvedSyncConfig = detectedPattern ? {
249
+ const sourceTemplate = (allDeps["next-intl"] || allDeps["@intlayer/next-intl"] || allDeps["use-intl"] || allDeps["@intlayer/use-intl"] ? await require_init_utils_fileSystem.detectNextIntlMessagesPattern(rootDir) : null)?.template ?? detectedPattern?.template;
250
+ const resolvedSyncConfig = {
232
251
  ...compatSyncConfig,
233
- sourceTemplate: detectedPattern.template
234
- } : compatSyncConfig;
252
+ ...sourceTemplate ? { sourceTemplate } : {}
253
+ };
254
+ if (resolvedSyncConfig.splitKeys && resolvedSyncConfig.sourceTemplate.includes("${key}")) resolvedSyncConfig.splitKeys = false;
235
255
  for (const configFile of [
236
256
  "intlayer.config.ts",
237
257
  "intlayer.config.mjs",
@@ -415,6 +435,16 @@ const initIntlayer = async (rootDir, options) => {
415
435
  }
416
436
  }
417
437
  }
438
+ if (!options?.noFrameworkSetup) try {
439
+ await require_init_frameworkSetup_index.setupFramework({
440
+ rootDir,
441
+ allDeps,
442
+ packageManager,
443
+ useTypeScript: hasTsConfig
444
+ });
445
+ } catch {
446
+ (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.x} Framework-specific scaffolding failed. Your existing files were left untouched; follow the documentation to finish the setup.`, { level: "warn" });
447
+ }
418
448
  (0, _intlayer_config_logger.logger)(`${_intlayer_config_logger.v} ${(0, _intlayer_config_logger.colorize)("Intlayer init setup complete.", _intlayer_config_colors.GREEN)}`);
419
449
  (0, _intlayer_config_logger.logger)([
420
450
  (0, _intlayer_config_logger.colorize)("Next →", _intlayer_config_colors.MAGENTA),
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ANSIColors","exists","x","readFileFromRoot","detectPackageManager","detectMissingIntlayerPackages","v","writeFileToRoot","getGithubWorkflows","ensureDirectory","parseJSONWithComments","findTsConfigFiles","detectJsonLocalePattern","initConfig","updateIntlayerConfigWithSyncPlugin","updateViteConfigForCompatPlugin","updateViteConfig","updateNextConfigForNextI18next","updateNextConfigForNextIntl","updateNextConfigForNextTranslate","updateNextConfig","updateAstroConfig","updateNuxtConfigForNuxtjsI18n","updateNuxtConfig"],"sources":["../../../src/init/index.ts"],"sourcesContent":["import { join } from 'node:path';\nimport * as ANSIColors from '@intlayer/config/colors';\nimport { colorize, colorizePath, logger, v, x } from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\n\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport {\n detectJsonLocalePattern,\n detectMissingIntlayerPackages,\n detectPackageManager,\n ensureDirectory,\n exists,\n findTsConfigFiles,\n getGithubWorkflows,\n installPackages,\n parseJSONWithComments,\n readFileFromRoot,\n updateAstroConfig,\n updateIntlayerConfigWithSyncPlugin,\n updateNextConfig,\n updateNextConfigForNextI18next,\n updateNextConfigForNextIntl,\n updateNextConfigForNextTranslate,\n updateNuxtConfig,\n updateNuxtConfigForNuxtjsI18n,\n updateViteConfig,\n updateViteConfigForCompatPlugin,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Intlayer Language Server (Go-to-Definition from getter keys to .content files)\n LSP: 'https://intlayer.org/doc/lsp.md',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * OPTIONS\n */\nexport type InitOptions = {\n noGitignore?: boolean;\n /** Skip scaffolding the `fill` and `test` GitHub Actions workflows. */\n noGithubActions?: boolean;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string, options?: InitOptions) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n const allDeps: Record<string, string> = {\n ...(packageJson.dependencies ?? {}),\n ...(packageJson.devDependencies ?? {}),\n };\n\n // INSTALL MISSING INTLAYER DEPENDENCIES\n const packageManager = detectPackageManager(rootDir);\n const {\n packagesToInstall,\n devPackagesToInstall,\n compatSyncConfig,\n compatVitePluginConfig,\n } = detectMissingIntlayerPackages(allDeps);\n\n if (packagesToInstall.length > 0) {\n logger(\n colorize('Installing missing Intlayer dependencies...', ANSIColors.CYAN)\n );\n try {\n installPackages(rootDir, packagesToInstall, packageManager);\n logger(\n `${v} Installed: ${packagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install packages. Please install manually: ${packagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n if (devPackagesToInstall.length > 0) {\n logger(\n colorize(\n 'Installing missing Intlayer dev dependencies...',\n ANSIColors.CYAN\n )\n );\n try {\n installPackages(rootDir, devPackagesToInstall, packageManager, true);\n logger(\n `${v} Installed: ${devPackagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install dev packages. Please install manually: ${devPackagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (!options?.noGitignore && (await exists(rootDir, gitignorePath))) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // SCAFFOLD GITHUB ACTIONS WORKFLOWS (fill + test)\n // Generate two workflows whose commands match the detected package manager:\n // - intlayer-fill.yml: auto-fills missing translations on pull requests\n // - intlayer-test.yml: fails the PR when required locales are missing\n if (!options?.noGithubActions) {\n const workflows = getGithubWorkflows(packageManager);\n\n for (const workflow of workflows) {\n if (await exists(rootDir, workflow.filePath)) {\n logger(`${v} ${colorizePath(workflow.filePath)} already exists`);\n continue;\n }\n\n try {\n await ensureDirectory(rootDir, join('.github', 'workflows'));\n await writeFileToRoot(rootDir, workflow.filePath, workflow.content);\n logger(\n `${v} Added GitHub Actions workflow ${colorizePath(workflow.filePath)}`\n );\n } catch {\n logger(\n `${x} Could not create ${colorizePath(workflow.filePath)}. You may need to add it manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // CHECK VS CODE EXTENSION RECOMMENDATIONS\n const vscodeDir = '.vscode';\n const extensionsJsonPath = join(vscodeDir, 'extensions.json');\n const extensionId = 'intlayer.intlayer-vs-code-extension';\n\n try {\n let extensionsConfig: { recommendations: string[] } = {\n recommendations: [],\n };\n\n if (await exists(rootDir, extensionsJsonPath)) {\n const content = await readFileFromRoot(rootDir, extensionsJsonPath);\n extensionsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n if (!extensionsConfig.recommendations) {\n extensionsConfig.recommendations = [];\n }\n\n if (!extensionsConfig.recommendations.includes(extensionId)) {\n extensionsConfig.recommendations.push(extensionId);\n await writeFileToRoot(\n rootDir,\n extensionsJsonPath,\n JSON.stringify(extensionsConfig, null, 2)\n );\n logger(\n `${v} Added ${colorize(extensionId, ANSIColors.MAGENTA)} to ${colorizePath(extensionsJsonPath)}`\n );\n } else {\n logger(\n `${v} ${colorizePath(extensionsJsonPath)} already includes ${colorize(extensionId, ANSIColors.MAGENTA)}`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(extensionsJsonPath)}. You may need to add ${colorize(extensionId, ANSIColors.MAGENTA)} manually.`,\n { level: 'warn' }\n );\n }\n\n // CHECK VS CODE LSP SETTINGS\n const settingsJsonPath = join(vscodeDir, 'settings.json');\n\n try {\n let settingsConfig: Record<string, unknown> = {};\n\n if (await exists(rootDir, settingsJsonPath)) {\n const content = await readFileFromRoot(rootDir, settingsJsonPath);\n settingsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n let settingsUpdated = false;\n\n if (!settingsConfig['intlayer.languageServer.command']) {\n settingsConfig['intlayer.languageServer.command'] = 'npx';\n settingsUpdated = true;\n }\n\n if (!settingsConfig['intlayer.languageServer.args']) {\n settingsConfig['intlayer.languageServer.args'] = ['@intlayer/lsp'];\n settingsUpdated = true;\n }\n\n if (settingsUpdated) {\n await writeFileToRoot(\n rootDir,\n settingsJsonPath,\n JSON.stringify(settingsConfig, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(settingsJsonPath)} with LSP configuration`\n );\n } else {\n logger(\n `${v} ${colorizePath(settingsJsonPath)} already includes LSP configuration`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(settingsJsonPath)}. You may need to add the LSP settings manually.`,\n { level: 'warn' }\n );\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = '.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n\n // Detect the locale JSON file pattern already in the project so we can\n // insert the matching locales into the config and produce the most\n // accurate source template for compat libraries.\n const detectedPattern = await detectJsonLocalePattern(rootDir);\n\n await initConfig(format, rootDir, detectedPattern?.locales);\n\n // INJECT SYNC-JSON PLUGIN FOR COMPAT LIBRARIES\n if (compatSyncConfig) {\n const resolvedSyncConfig = detectedPattern\n ? { ...compatSyncConfig, sourceTemplate: detectedPattern.template }\n : compatSyncConfig;\n\n const intlayerConfigCandidates = [\n 'intlayer.config.ts',\n 'intlayer.config.mjs',\n 'intlayer.config.js',\n 'intlayer.config.cjs',\n ];\n\n for (const configFile of intlayerConfigCandidates) {\n if (await exists(rootDir, configFile)) {\n const configContent = await readFileFromRoot(rootDir, configFile);\n\n if (!configContent.includes('@intlayer/sync-json-plugin')) {\n const extension = configFile.split('.').pop()!;\n const updatedConfigContent = updateIntlayerConfigWithSyncPlugin(\n configContent,\n extension,\n resolvedSyncConfig\n );\n await writeFileToRoot(rootDir, configFile, updatedConfigContent);\n logger(\n `${v} Updated ${colorizePath(configFile)} with syncJSON compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(configFile)} already includes syncJSON plugin`\n );\n }\n break;\n }\n }\n }\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (compatVitePluginConfig) {\n if (!content.includes(compatVitePluginConfig.pluginPackageSource)) {\n const updatedContent = updateViteConfigForCompatPlugin(\n content,\n extension,\n compatVitePluginConfig\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include ${compatVitePluginConfig.pluginFunctionName} compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes ${compatVitePluginConfig.pluginPackageSource}`\n );\n }\n } else if (!content.includes('vite-intlayer')) {\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n let isNextJsProject = false;\n\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n isNextJsProject = true;\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (allDeps['next-i18next']) {\n if (!content.includes('@intlayer/next-i18next')) {\n const updatedContent = updateNextConfigForNextI18next(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-i18next compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-i18next`\n );\n }\n } else if (allDeps['next-intl']) {\n if (!content.includes('@intlayer/next-intl/plugin')) {\n const updatedContent = updateNextConfigForNextIntl(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-intl compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-intl/plugin`\n );\n }\n } else if (allDeps['next-translate']) {\n if (!content.includes('@intlayer/next-translate')) {\n const updatedContent = updateNextConfigForNextTranslate(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-translate compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-translate`\n );\n }\n } else if (!content.includes('next-intlayer')) {\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK OTHER FRAMEWORKS CONFIG\n const astroConfigs = [\n 'astro.config.mjs',\n 'astro.config.js',\n 'astro.config.ts',\n 'astro.config.cjs',\n ];\n\n for (const file of astroConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n if (file.startsWith('astro.config.')) {\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('astro-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateAstroConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer integration`\n );\n }\n }\n break;\n }\n }\n\n const nuxtConfigs = ['nuxt.config.js', 'nuxt.config.ts'];\n for (const file of nuxtConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n const content = await readFileFromRoot(rootDir, file);\n\n if (allDeps['@nuxtjs/i18n']) {\n if (!content.includes('@intlayer/nuxtjs-i18n')) {\n const updatedContent = updateNuxtConfigForNuxtjsI18n(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include @intlayer/nuxtjs-i18n module`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/nuxtjs-i18n`\n );\n }\n } else if (!content.includes('nuxt-intlayer')) {\n const updatedContent = updateNuxtConfig(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer module`);\n }\n break;\n }\n }\n\n // UPDATE PACKAGE.JSON DEV SCRIPT\n // Next.js >= 16 uses a bun-specific wrapper; backend frameworks wrap whatever\n // the existing dev script is. Both use `intlayer watch --with`.\n const isVersionGreaterOrEqual = (\n versionString: string,\n major: number\n ): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const match = versionString.match(/^[^\\d]*(\\d+)/);\n\n if (!match?.[1]) return false;\n\n return parseInt(match[1], 10) >= major;\n };\n\n const backendIntlayerPackages = [\n 'express-intlayer',\n 'fastify-intlayer',\n 'adonis-intlayer',\n 'hono-intlayer',\n ];\n\n const devScript = packageJson.scripts?.dev;\n\n let newDevScript: string | undefined;\n\n if (\n ((isNextJsProject &&\n allDeps.next &&\n isVersionGreaterOrEqual(allDeps.next, 16)) ||\n backendIntlayerPackages.some((pkg) => allDeps[pkg])) &&\n !devScript.includes('intlayer watch')\n ) {\n newDevScript = `intlayer watch --with '${devScript}'`;\n }\n\n if (newDevScript) {\n packageJson.scripts.dev = newDevScript;\n\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath('package.json')} dev script to run intlayer watch`\n );\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n const backendConfigPackages = [\n 'express',\n 'fastify',\n '@adonisjs/core',\n 'hono',\n ...backendIntlayerPackages,\n ];\n\n if (backendConfigPackages.some((pkg) => allDeps[pkg])) {\n hasAliasConfiguration = true;\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((file) => file === 'tsconfig.json') ||\n tsConfigFiles[0];\n\n if (tsConfigPath) {\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n\n // INTLAYER LSP — instruction for the AI agent running `intlayer init`.\n // The Intlayer Language Server (`@intlayer/lsp`) provides Go-to-Definition\n // from `useIntlayer` / `getIntlayer` keys to their `.content` files, for both\n // IDEs and AI agents. Setup is editor-specific (VS Code, Cursor, Windsurf,\n // Zed, Neovim, Claude Code, …), so we don't scaffold anything here — instead\n // we point to the doc and ask the agent to confirm the target platform.\n logger([\n colorize('Intlayer LSP →', ANSIColors.MAGENTA),\n colorize(\n 'The Intlayer Language Server is available via the `@intlayer/lsp` package. It lets IDEs and AI agents jump from `useIntlayer`/`getIntlayer` keys to their `.content` files.',\n ANSIColors.GREY_LIGHT\n ),\n colorize(\n 'Ask the user which platform/editor they want to enable it on (VS Code, Cursor, Windsurf, Zed, Neovim, Claude Code, …), then follow the matching setup instructions:',\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(DocumentationRouter.LSP),\n ]);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["ANSIColors","exists","x","readFileFromRoot","detectPackageManager","detectMissingIntlayerPackages","v","detectOutdatedIntlayerPackages","writeFileToRoot","getGithubWorkflows","ensureDirectory","parseJSONWithComments","findTsConfigFiles","detectJsonLocalePattern","initConfig","detectNextIntlMessagesPattern","updateIntlayerConfigWithSyncPlugin","updateViteConfigForCompatPlugin","updateViteConfig","updateNextConfigForNextI18next","updateNextConfigForNextIntl","updateNextConfigForNextTranslate","updateNextConfig","updateAstroConfig","updateNuxtConfigForNuxtjsI18n","updateNuxtConfig","setupFramework"],"sources":["../../../src/init/index.ts"],"sourcesContent":["import { join } from 'node:path';\nimport * as ANSIColors from '@intlayer/config/colors';\nimport { colorize, colorizePath, logger, v, x } from '@intlayer/config/logger';\nimport { getConfiguration } from '@intlayer/config/node';\n\nimport { getAlias } from '@intlayer/config/utils';\nimport { initConfig } from '../initConfig';\nimport { setupFramework } from './frameworkSetup';\nimport {\n detectJsonLocalePattern,\n detectMissingIntlayerPackages,\n detectNextIntlMessagesPattern,\n detectOutdatedIntlayerPackages,\n detectPackageManager,\n ensureDirectory,\n exists,\n findTsConfigFiles,\n getGithubWorkflows,\n installPackages,\n parseJSONWithComments,\n readFileFromRoot,\n updateAstroConfig,\n updateIntlayerConfigWithSyncPlugin,\n updateNextConfig,\n updateNextConfigForNextI18next,\n updateNextConfigForNextIntl,\n updateNextConfigForNextTranslate,\n updateNuxtConfig,\n updateNuxtConfigForNuxtjsI18n,\n updateViteConfig,\n updateViteConfigForCompatPlugin,\n upgradePackages,\n writeFileToRoot,\n} from './utils';\n\n/**\n * Documentation URL Constants\n */\nconst DocumentationRouter = {\n NextJS: 'https://intlayer.org/doc/environment/nextjs.md',\n NextJS_15: 'https://intlayer.org/doc/environment/nextjs/15.md',\n NextJS_14: 'https://intlayer.org/doc/environment/nextjs/14.md',\n CRA: 'https://intlayer.org/doc/environment/create-react-app.md',\n Astro: 'https://intlayer.org/doc/environment/astro.md',\n ViteAndReact: 'https://intlayer.org/doc/environment/vite-and-react.md',\n ViteAndReact_ReactRouterV7:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7.md',\n ViteAndReact_ReactRouterV7_FSRoutes:\n 'https://intlayer.org/doc/environment/vite-and-react/react-router-v7-fs-routes.md',\n ViteAndVue: 'https://intlayer.org/doc/environment/vite-and-vue.md',\n ViteAndSolid: 'https://intlayer.org/doc/environment/vite-and-solid.md',\n ViteAndSvelte: 'https://intlayer.org/doc/environment/vite-and-svelte.md',\n ViteAndPreact: 'https://intlayer.org/doc/environment/vite-and-preact.md',\n TanStackRouter: 'https://intlayer.org/doc/environment/tanstack.md',\n NuxtAndVue: 'https://intlayer.org/doc/environment/nuxt-and-vue.md',\n Angular: 'https://intlayer.org/doc/environment/angular.md',\n SvelteKit: 'https://intlayer.org/doc/environment/sveltekit.md',\n ReactNativeAndExpo:\n 'https://intlayer.org/doc/environment/react-native-and-expo.md',\n Lynx: 'https://intlayer.org/doc/environment/lynx-and-react.md',\n Express: 'https://intlayer.org/doc/environment/express.md',\n NestJS: 'https://intlayer.org/doc/environment/nestjs.md',\n Fastify: 'https://intlayer.org/doc/environment/fastify.md',\n Default: 'https://intlayer.org/doc/get-started',\n\n // Intlayer Language Server (Go-to-Definition from getter keys to .content files)\n LSP: 'https://intlayer.org/doc/lsp.md',\n\n // Check for competitors libs\n NextIntl: 'https://intlayer.org/blog/intlayer-with-next-intl.md',\n ReactI18Next: 'https://intlayer.org/blog/intlayer-with-react-i18next.md',\n ReactIntl: 'https://intlayer.org/blog/intlayer-with-react-intl.md',\n NextI18Next: 'https://intlayer.org/blog/intlayer-with-next-i18next.md',\n VueI18n: 'https://intlayer.org/blog/intlayer-with-vue-i18n.md',\n};\n\n/**\n * Helper: Detects the environment and returns the doc URL\n */\nconst getDocumentationUrl = (packageJson: any): string => {\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n /**\n * Helper to check if a version string matches a specific major version\n * Matches: \"15\", \"^15.0.0\", \"~15.2\", \"15.0.0-beta\"\n */\n const isVersion = (versionString: string, major: number): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const regex = new RegExp(`^[\\\\^~]?${major}(?:\\\\.|$)`);\n return regex.test(versionString);\n };\n\n // Mobile / Cross-platform\n if (deps['@lynx-js/react'] || deps['@lynx-js/core']) {\n return DocumentationRouter.Lynx;\n }\n if (deps['react-native'] || deps.expo) {\n return DocumentationRouter.ReactNativeAndExpo;\n }\n\n // Meta-frameworks (Next, Nuxt, Astro, SvelteKit)\n if (deps.next) {\n const version = deps.next;\n\n if (isVersion(version, 14)) {\n return DocumentationRouter.NextJS_14;\n }\n\n if (isVersion(version, 15)) {\n return DocumentationRouter.NextJS_15;\n }\n\n return DocumentationRouter.NextJS;\n }\n\n if (deps.nuxt) return DocumentationRouter.NuxtAndVue;\n if (deps.astro) return DocumentationRouter.Astro;\n if (deps['@sveltejs/kit']) return DocumentationRouter.SvelteKit;\n\n // Routers (TanStack & React Router v7)\n if (deps['@tanstack/react-router']) {\n return DocumentationRouter.TanStackRouter;\n }\n\n // Check for React Router v7\n const reactRouterVersion = deps['react-router'];\n if (reactRouterVersion && typeof reactRouterVersion === 'string') {\n // Distinguish between standard v7 and v7 with FS routes\n if (deps['@react-router/fs-routes']) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7_FSRoutes;\n }\n\n // Use Regex to ensure it is v7\n if (isVersion(reactRouterVersion, 7)) {\n return DocumentationRouter.ViteAndReact_ReactRouterV7;\n }\n }\n\n // Vite Ecosystem (General)\n if (deps.vite) {\n if (deps.vue) return DocumentationRouter.ViteAndVue;\n if (deps['solid-js']) return DocumentationRouter.ViteAndSolid;\n if (deps.svelte) return DocumentationRouter.ViteAndSvelte;\n if (deps.preact) return DocumentationRouter.ViteAndPreact;\n\n // Default to React if Vite is present but specific other frameworks aren't found\n return DocumentationRouter.ViteAndReact;\n }\n\n // Other Web Frameworks\n if (deps['react-scripts']) return DocumentationRouter.CRA;\n if (deps['@angular/core']) return DocumentationRouter.Angular;\n\n // Backend\n if (deps['@nestjs/core']) return DocumentationRouter.NestJS;\n if (deps.express) return DocumentationRouter.Express;\n if (deps.fastify) return DocumentationRouter.Fastify;\n\n // Competitor Libs (Migration Guides)\n // We check these last as specific environment setup is usually higher priority,\n // but if no specific framework logic matched (or as a fallback), we guide to migration.\n if (deps['next-intl']) return DocumentationRouter.NextIntl;\n if (deps['react-i18next'] || deps.i18next)\n return DocumentationRouter.ReactI18Next;\n if (deps['react-intl']) return DocumentationRouter.ReactIntl;\n if (deps['next-i18next']) return DocumentationRouter.NextI18Next;\n if (deps['vue-i18n']) return DocumentationRouter.VueI18n;\n\n return DocumentationRouter.Default;\n};\n\n/**\n * OPTIONS\n */\nexport type InitOptions = {\n noGitignore?: boolean;\n /** Skip scaffolding the `fill` and `test` GitHub Actions workflows. */\n noGithubActions?: boolean;\n /**\n * Skip installing missing Intlayer dependencies and upgrading outdated ones.\n */\n noInstallPackages?: boolean;\n /** Skip adding the Intlayer extension to `.vscode/extensions.json`. */\n noVscodeExtension?: boolean;\n /** Skip writing the Intlayer LSP configuration to `.vscode/settings.json`. */\n noLsp?: boolean;\n /**\n * Skip framework-specific scaffolding (middleware/proxy, providers in\n * layout/page, example content). Defaults to enabled.\n */\n noFrameworkSetup?: boolean;\n /**\n * Version that outdated Intlayer packages should be upgraded to (typically the\n * running CLI version). When omitted, installed packages are left untouched and\n * only missing ones are installed.\n */\n upgradeToVersion?: string;\n};\n\n/**\n * MAIN LOGIC\n */\nexport const initIntlayer = async (rootDir: string, options?: InitOptions) => {\n logger(colorize('Checking Intlayer configuration...', ANSIColors.CYAN));\n\n // READ PACKAGE.JSON\n const packageJsonPath = 'package.json';\n if (!(await exists(rootDir, packageJsonPath))) {\n logger(\n `${x} No ${colorizePath('package.json')} found. Please run this script from the project root.`,\n { level: 'error' }\n );\n process.exit(1);\n }\n\n const packageJsonContent = await readFileFromRoot(rootDir, packageJsonPath);\n let packageJson: Record<string, any>;\n try {\n packageJson = JSON.parse(packageJsonContent);\n } catch {\n logger(`${x} Could not parse ${colorizePath('package.json')}.`, {\n level: 'error',\n });\n process.exit(1);\n }\n\n // Determine the correct documentation URL based on dependencies\n const guideUrl = getDocumentationUrl(packageJson);\n\n const allDeps: Record<string, string> = {\n ...(packageJson.dependencies ?? {}),\n ...(packageJson.devDependencies ?? {}),\n };\n\n // INSTALL MISSING INTLAYER DEPENDENCIES\n const packageManager = detectPackageManager(rootDir);\n const {\n packagesToInstall,\n devPackagesToInstall,\n compatSyncConfig,\n compatVitePluginConfig,\n } = detectMissingIntlayerPackages(allDeps);\n\n if (!options?.noInstallPackages) {\n if (packagesToInstall.length > 0) {\n logger(\n colorize('Installing missing Intlayer dependencies...', ANSIColors.CYAN)\n );\n try {\n installPackages(rootDir, packagesToInstall, packageManager);\n logger(\n `${v} Installed: ${packagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install packages. Please install manually: ${packagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n if (devPackagesToInstall.length > 0) {\n logger(\n colorize(\n 'Installing missing Intlayer dev dependencies...',\n ANSIColors.CYAN\n )\n );\n try {\n installPackages(rootDir, devPackagesToInstall, packageManager, true);\n logger(\n `${v} Installed: ${devPackagesToInstall.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to install dev packages. Please install manually: ${devPackagesToInstall.join(' ')}`,\n { level: 'warn' }\n );\n }\n }\n\n // UPGRADE OUTDATED INTLAYER DEPENDENCIES\n // Only runs when a target version is provided (typically the running CLI\n // version). Already up-to-date packages are skipped. Prod and dev\n // dependencies are upgraded separately so their dependency type is kept.\n if (options?.upgradeToVersion) {\n const outdatedDependencies = detectOutdatedIntlayerPackages(\n rootDir,\n packageJson.dependencies ?? {},\n options.upgradeToVersion\n );\n const outdatedDevDependencies = detectOutdatedIntlayerPackages(\n rootDir,\n packageJson.devDependencies ?? {},\n options.upgradeToVersion\n );\n\n const allOutdated = [...outdatedDependencies, ...outdatedDevDependencies];\n\n if (allOutdated.length > 0) {\n logger(\n colorize(\n `Upgrading outdated Intlayer dependencies to ${options.upgradeToVersion}...`,\n ANSIColors.CYAN\n )\n );\n try {\n upgradePackages(\n rootDir,\n outdatedDependencies,\n packageManager,\n options.upgradeToVersion\n );\n upgradePackages(\n rootDir,\n outdatedDevDependencies,\n packageManager,\n options.upgradeToVersion,\n true\n );\n logger(\n `${v} Upgraded: ${allOutdated.map((pkg) => colorize(pkg, ANSIColors.MAGENTA)).join(', ')}`\n );\n } catch {\n logger(\n `${x} Failed to upgrade packages. Please upgrade manually: ${allOutdated.join(' ')}`,\n { level: 'warn' }\n );\n }\n } else {\n logger(`${v} Intlayer dependencies are up to date`);\n }\n }\n }\n\n // CHECK .GITIGNORE\n const gitignorePath = '.gitignore';\n if (!options?.noGitignore && (await exists(rootDir, gitignorePath))) {\n const gitignoreContent = await readFileFromRoot(rootDir, gitignorePath);\n\n if (!gitignoreContent.includes('intlayer')) {\n const newContent = `${gitignoreContent}\\n# Intlayer\\n.intlayer\\n`;\n await writeFileToRoot(rootDir, gitignorePath, newContent);\n logger(\n `${v} Added ${colorizePath('.intlayer')} to ${colorizePath(gitignorePath)}`\n );\n } else {\n logger(`${v} ${colorizePath(gitignorePath)} already includes .intlayer`);\n }\n }\n\n // SCAFFOLD GITHUB ACTIONS WORKFLOWS (fill + test)\n // Generate two workflows whose commands match the detected package manager:\n // - intlayer-fill.yml: auto-fills missing translations on pull requests\n // - intlayer-test.yml: fails the PR when required locales are missing\n if (!options?.noGithubActions) {\n const workflows = getGithubWorkflows(packageManager);\n\n for (const workflow of workflows) {\n if (await exists(rootDir, workflow.filePath)) {\n logger(`${v} ${colorizePath(workflow.filePath)} already exists`);\n continue;\n }\n\n try {\n await ensureDirectory(rootDir, join('.github', 'workflows'));\n await writeFileToRoot(rootDir, workflow.filePath, workflow.content);\n logger(\n `${v} Added GitHub Actions workflow ${colorizePath(workflow.filePath)}`\n );\n } catch {\n logger(\n `${x} Could not create ${colorizePath(workflow.filePath)}. You may need to add it manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // CHECK VS CODE EXTENSION RECOMMENDATIONS\n const vscodeDir = '.vscode';\n const extensionsJsonPath = join(vscodeDir, 'extensions.json');\n const extensionId = 'intlayer.intlayer-vs-code-extension';\n\n if (!options?.noVscodeExtension) {\n try {\n let extensionsConfig: { recommendations: string[] } = {\n recommendations: [],\n };\n\n if (await exists(rootDir, extensionsJsonPath)) {\n const content = await readFileFromRoot(rootDir, extensionsJsonPath);\n extensionsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n if (!extensionsConfig.recommendations) {\n extensionsConfig.recommendations = [];\n }\n\n if (!extensionsConfig.recommendations.includes(extensionId)) {\n extensionsConfig.recommendations.push(extensionId);\n await writeFileToRoot(\n rootDir,\n extensionsJsonPath,\n JSON.stringify(extensionsConfig, null, 2)\n );\n logger(\n `${v} Added ${colorize(extensionId, ANSIColors.MAGENTA)} to ${colorizePath(extensionsJsonPath)}`\n );\n } else {\n logger(\n `${v} ${colorizePath(extensionsJsonPath)} already includes ${colorize(extensionId, ANSIColors.MAGENTA)}`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(extensionsJsonPath)}. You may need to add ${colorize(extensionId, ANSIColors.MAGENTA)} manually.`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK VS CODE LSP SETTINGS\n const settingsJsonPath = join(vscodeDir, 'settings.json');\n\n if (!options?.noLsp) {\n try {\n let settingsConfig: Record<string, unknown> = {};\n\n if (await exists(rootDir, settingsJsonPath)) {\n const content = await readFileFromRoot(rootDir, settingsJsonPath);\n settingsConfig = parseJSONWithComments(content);\n } else {\n await ensureDirectory(rootDir, vscodeDir);\n }\n\n let settingsUpdated = false;\n\n if (!settingsConfig['intlayer.languageServer.command']) {\n settingsConfig['intlayer.languageServer.command'] = 'npx';\n settingsUpdated = true;\n }\n\n if (!settingsConfig['intlayer.languageServer.args']) {\n settingsConfig['intlayer.languageServer.args'] = ['@intlayer/lsp'];\n settingsUpdated = true;\n }\n\n if (settingsUpdated) {\n await writeFileToRoot(\n rootDir,\n settingsJsonPath,\n JSON.stringify(settingsConfig, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(settingsJsonPath)} with LSP configuration`\n );\n } else {\n logger(\n `${v} ${colorizePath(settingsJsonPath)} already includes LSP configuration`\n );\n }\n } catch {\n logger(\n `${x} Could not update ${colorizePath(settingsJsonPath)}. You may need to add the LSP settings manually.`,\n { level: 'warn' }\n );\n }\n }\n\n // CHECK TSCONFIGS\n const tsConfigFiles = await findTsConfigFiles(rootDir);\n let hasTsConfig = false;\n\n for (const fileName of tsConfigFiles) {\n if (await exists(rootDir, fileName)) {\n hasTsConfig = true;\n try {\n const fileContent = await readFileFromRoot(rootDir, fileName);\n const config = parseJSONWithComments(fileContent);\n const typeDefinition = '.intlayer/**/*.ts';\n\n let updated = false;\n\n if (!config.include) {\n // Skip if no include array (solution-style)\n } else if (\n Array.isArray(config.include) &&\n !(config.include as string[]).some((pattern: string) =>\n pattern.includes('.intlayer')\n )\n ) {\n config.include.push(typeDefinition);\n updated = true;\n } else if (config.include.includes(typeDefinition)) {\n logger(\n `${v} ${colorizePath(fileName)} already includes intlayer types`\n );\n }\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n fileName,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(fileName)} to include intlayer types`\n );\n }\n } catch {\n logger(\n `${x} Could not parse or update ${colorizePath(fileName)}. You may need to add ${colorizePath('.intlayer/types/**/*.ts')} manually.`,\n { level: 'warn' }\n );\n }\n }\n }\n\n // INITIALIZE CONFIG FILE\n const format = hasTsConfig ? 'intlayer.config.ts' : 'intlayer.config.mjs';\n\n // Detect the locale JSON file pattern already in the project so we can\n // insert the matching locales into the config and produce the most\n // accurate source template for compat libraries.\n const detectedPattern = await detectJsonLocalePattern(rootDir);\n\n await initConfig(format, rootDir, detectedPattern?.locales);\n\n // INJECT SYNC-JSON PLUGIN FOR COMPAT LIBRARIES\n if (compatSyncConfig) {\n // For next-intl / use-intl, the messages path is authoritatively declared\n // in `i18n/request.ts` (e.g. `import(`../messages/${locale}.json`)`), so we\n // read it directly. It usually resolves to a single file per locale (no\n // `${key}` segment), whose first-level keys are namespaces — so the compat\n // config carries `splitKeys: true` to emit one dictionary per namespace.\n // Falls back to file-system globbing otherwise.\n const nextIntlMessagesPattern =\n allDeps['next-intl'] ||\n allDeps['@intlayer/next-intl'] ||\n allDeps['use-intl'] ||\n allDeps['@intlayer/use-intl']\n ? await detectNextIntlMessagesPattern(rootDir)\n : null;\n\n const sourceTemplate =\n nextIntlMessagesPattern?.template ?? detectedPattern?.template;\n\n const resolvedSyncConfig = {\n ...compatSyncConfig,\n ...(sourceTemplate ? { sourceTemplate } : {}),\n };\n\n // `splitKeys` only makes sense for a single file holding several namespaces.\n // If the resolved template addresses one namespace per file (`${key}`\n // segment), each file is already a single namespace — drop the flag so\n // syncJSON keeps one dictionary per file.\n if (\n resolvedSyncConfig.splitKeys &&\n resolvedSyncConfig.sourceTemplate.includes('${key}')\n ) {\n resolvedSyncConfig.splitKeys = false;\n }\n\n const intlayerConfigCandidates = [\n 'intlayer.config.ts',\n 'intlayer.config.mjs',\n 'intlayer.config.js',\n 'intlayer.config.cjs',\n ];\n\n for (const configFile of intlayerConfigCandidates) {\n if (await exists(rootDir, configFile)) {\n const configContent = await readFileFromRoot(rootDir, configFile);\n\n if (!configContent.includes('@intlayer/sync-json-plugin')) {\n const extension = configFile.split('.').pop()!;\n const updatedConfigContent = updateIntlayerConfigWithSyncPlugin(\n configContent,\n extension,\n resolvedSyncConfig\n );\n await writeFileToRoot(rootDir, configFile, updatedConfigContent);\n logger(\n `${v} Updated ${colorizePath(configFile)} with syncJSON compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(configFile)} already includes syncJSON plugin`\n );\n }\n break;\n }\n }\n }\n\n let hasAliasConfiguration = false;\n\n // CHECK VITE CONFIG\n const viteConfigs = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n\n for (const file of viteConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (compatVitePluginConfig) {\n if (!content.includes(compatVitePluginConfig.pluginPackageSource)) {\n const updatedContent = updateViteConfigForCompatPlugin(\n content,\n extension,\n compatVitePluginConfig\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include ${compatVitePluginConfig.pluginFunctionName} compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes ${compatVitePluginConfig.pluginPackageSource}`\n );\n }\n } else if (!content.includes('vite-intlayer')) {\n const updatedContent = updateViteConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK NEXT CONFIG\n const nextConfigs = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n let isNextJsProject = false;\n\n for (const file of nextConfigs) {\n if (await exists(rootDir, file)) {\n isNextJsProject = true;\n hasAliasConfiguration = true;\n const content = await readFileFromRoot(rootDir, file);\n const extension = file.split('.').pop()!;\n\n if (allDeps['next-i18next']) {\n if (!content.includes('@intlayer/next-i18next')) {\n const updatedContent = updateNextConfigForNextI18next(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-i18next compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-i18next`\n );\n }\n } else if (allDeps['next-intl']) {\n if (!content.includes('@intlayer/next-intl/plugin')) {\n const updatedContent = updateNextConfigForNextIntl(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-intl compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-intl/plugin`\n );\n }\n } else if (allDeps['next-translate']) {\n if (!content.includes('@intlayer/next-translate')) {\n const updatedContent = updateNextConfigForNextTranslate(\n content,\n extension\n );\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer next-translate compat plugin`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/next-translate`\n );\n }\n } else if (!content.includes('next-intlayer')) {\n const updatedContent = updateNextConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer plugin`);\n }\n break;\n }\n }\n\n // CHECK OTHER FRAMEWORKS CONFIG\n const astroConfigs = [\n 'astro.config.mjs',\n 'astro.config.js',\n 'astro.config.ts',\n 'astro.config.cjs',\n ];\n\n for (const file of astroConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n if (file.startsWith('astro.config.')) {\n const content = await readFileFromRoot(rootDir, file);\n\n if (!content.includes('astro-intlayer')) {\n const extension = file.split('.').pop()!;\n const updatedContent = updateAstroConfig(content, extension);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include Intlayer integration`\n );\n }\n }\n break;\n }\n }\n\n const nuxtConfigs = ['nuxt.config.js', 'nuxt.config.ts'];\n for (const file of nuxtConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n\n const content = await readFileFromRoot(rootDir, file);\n\n if (allDeps['@nuxtjs/i18n']) {\n if (!content.includes('@intlayer/nuxtjs-i18n')) {\n const updatedContent = updateNuxtConfigForNuxtjsI18n(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(\n `${v} Updated ${colorizePath(file)} to include @intlayer/nuxtjs-i18n module`\n );\n } else {\n logger(\n `${v} ${colorizePath(file)} already includes @intlayer/nuxtjs-i18n`\n );\n }\n } else if (!content.includes('nuxt-intlayer')) {\n const updatedContent = updateNuxtConfig(content);\n await writeFileToRoot(rootDir, file, updatedContent);\n logger(`${v} Updated ${colorizePath(file)} to include Intlayer module`);\n }\n break;\n }\n }\n\n // UPDATE PACKAGE.JSON DEV SCRIPT\n // Next.js >= 16 uses a bun-specific wrapper; backend frameworks wrap whatever\n // the existing dev script is. Both use `intlayer watch --with`.\n const isVersionGreaterOrEqual = (\n versionString: string,\n major: number\n ): boolean => {\n if (!versionString || typeof versionString !== 'string') return false;\n const match = versionString.match(/^[^\\d]*(\\d+)/);\n\n if (!match?.[1]) return false;\n\n return parseInt(match[1], 10) >= major;\n };\n\n const backendIntlayerPackages = [\n 'express-intlayer',\n 'fastify-intlayer',\n 'adonis-intlayer',\n 'hono-intlayer',\n ];\n\n const devScript = packageJson.scripts?.dev;\n\n let newDevScript: string | undefined;\n\n if (\n ((isNextJsProject &&\n allDeps.next &&\n isVersionGreaterOrEqual(allDeps.next, 16)) ||\n backendIntlayerPackages.some((pkg) => allDeps[pkg])) &&\n !devScript.includes('intlayer watch')\n ) {\n newDevScript = `intlayer watch --with '${devScript}'`;\n }\n\n if (newDevScript) {\n packageJson.scripts.dev = newDevScript;\n\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath('package.json')} dev script to run intlayer watch`\n );\n }\n\n // CHECK WEBPACK CONFIG\n const webpackConfigs = [\n 'webpack.config.js',\n 'webpack.config.ts',\n 'webpack.config.mjs',\n 'webpack.config.cjs',\n ];\n\n for (const file of webpackConfigs) {\n if (await exists(rootDir, file)) {\n hasAliasConfiguration = true;\n logger(\n `${v} Found ${colorizePath(\n file\n )}. Make sure to configure aliases manually or use the Intlayer Webpack plugin.`\n );\n break;\n }\n }\n\n const backendConfigPackages = [\n 'express',\n 'fastify',\n '@adonisjs/core',\n 'hono',\n ...backendIntlayerPackages,\n ];\n\n if (backendConfigPackages.some((pkg) => allDeps[pkg])) {\n hasAliasConfiguration = true;\n }\n\n if (!hasAliasConfiguration) {\n const configuration = getConfiguration({ baseDir: rootDir });\n const aliases = getAlias({ configuration });\n\n if (hasTsConfig && tsConfigFiles.length > 0) {\n const tsConfigPath =\n tsConfigFiles.find((file) => file === 'tsconfig.json') ||\n tsConfigFiles[0];\n\n if (tsConfigPath) {\n const tsConfigContent = await readFileFromRoot(rootDir, tsConfigPath);\n const config = parseJSONWithComments(tsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n tsConfigPath,\n JSON.stringify(config, null, 2)\n );\n\n logger(\n `${v} Updated ${colorizePath(\n tsConfigPath\n )} to include Intlayer aliases`\n );\n }\n }\n } else {\n const jsConfigPath = 'jsconfig.json';\n\n if (await exists(rootDir, jsConfigPath)) {\n const jsConfigContent = await readFileFromRoot(rootDir, jsConfigPath);\n const config = parseJSONWithComments(jsConfigContent);\n\n config.compilerOptions ??= {};\n config.compilerOptions.paths ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n if (!config.compilerOptions.paths[alias]) {\n config.compilerOptions.paths[alias] = [path];\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n jsConfigPath,\n JSON.stringify(config, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n jsConfigPath\n )} to include Intlayer aliases`\n );\n }\n } else {\n packageJson.imports ??= {};\n\n let updated = false;\n\n Object.entries(aliases).forEach(([alias, path]) => {\n const importAlias = alias.replace('@', '#');\n const importPath = path.startsWith('.') ? path : `./${path}`;\n\n if (!packageJson.imports[importAlias]) {\n packageJson.imports[importAlias] = importPath;\n updated = true;\n }\n });\n\n if (updated) {\n await writeFileToRoot(\n rootDir,\n packageJsonPath,\n JSON.stringify(packageJson, null, 2)\n );\n logger(\n `${v} Updated ${colorizePath(\n packageJsonPath\n )} to include Intlayer imports`\n );\n }\n }\n }\n }\n\n // FRAMEWORK-SPECIFIC SCAFFOLDING\n // Sets up middleware/proxy and wraps the layout/page with the Intlayer\n // providers for the detected framework (Next.js App Router today). Idempotent\n // and non-destructive: it never overwrites user code it cannot safely\n // transform, skipping with guidance instead.\n if (!options?.noFrameworkSetup) {\n try {\n await setupFramework({\n rootDir,\n allDeps,\n packageManager,\n useTypeScript: hasTsConfig,\n });\n } catch {\n logger(\n `${x} Framework-specific scaffolding failed. Your existing files were left untouched; follow the documentation to finish the setup.`,\n { level: 'warn' }\n );\n }\n }\n\n // FINAL SUCCESS MESSAGE\n logger(`${v} ${colorize('Intlayer init setup complete.', ANSIColors.GREEN)}`);\n logger([\n colorize('Next →', ANSIColors.MAGENTA),\n colorize(\n `Follow the instructions in the documentation to complete the setup:`,\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(guideUrl),\n ]);\n\n // INTLAYER LSP — instruction for the AI agent running `intlayer init`.\n // The Intlayer Language Server (`@intlayer/lsp`) provides Go-to-Definition\n // from `useIntlayer` / `getIntlayer` keys to their `.content` files, for both\n // IDEs and AI agents. Setup is editor-specific (VS Code, Cursor, Windsurf,\n // Zed, Neovim, Claude Code, …), so we don't scaffold anything here — instead\n // we point to the doc and ask the agent to confirm the target platform.\n logger([\n colorize('Intlayer LSP →', ANSIColors.MAGENTA),\n colorize(\n 'The Intlayer Language Server is available via the `@intlayer/lsp` package. It lets IDEs and AI agents jump from `useIntlayer`/`getIntlayer` keys to their `.content` files.',\n ANSIColors.GREY_LIGHT\n ),\n colorize(\n 'Ask the user which platform/editor they want to enable it on (VS Code, Cursor, Windsurf, Zed, Neovim, Claude Code, …), then follow the matching setup instructions:',\n ANSIColors.GREY_LIGHT\n ),\n colorizePath(DocumentationRouter.LSP),\n ]);\n};\n"],"mappings":"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"}
@@ -247,7 +247,8 @@ const updateNextConfigForNextIntl = (content, extension) => {
247
247
  const buildSyncJSONCallNode = (syncConfig) => {
248
248
  const usesKey = syncConfig.sourceTemplate.includes("${key}");
249
249
  const paramDestructuring = syncConfig.format === "icu" ? usesKey ? "{ key, locale }" : "{ locale }" : usesKey ? "{ locale, key }" : "{ locale }";
250
- const snippet = `syncJSON({ format: '${syncConfig.format}', source: (${paramDestructuring}) => \`${syncConfig.sourceTemplate}\` })`;
250
+ const splitKeysProperty = syncConfig.splitKeys ? ", splitKeys: true" : "";
251
+ const snippet = `syncJSON({ format: '${syncConfig.format}', source: (${paramDestructuring}) => \`${syncConfig.sourceTemplate}\`${splitKeysProperty} })`;
251
252
  return recast.parse(snippet, { parser: require("recast/parsers/typescript") }).program.body[0].expression;
252
253
  };
253
254
  /**