@intlayer/chokidar 5.5.0-canary.0 → 5.5.1

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 (53) hide show
  1. package/dist/cjs/checkDictionaryChanges.cjs +10 -8
  2. package/dist/cjs/checkDictionaryChanges.cjs.map +1 -1
  3. package/dist/cjs/chokidar/watcher.cjs +23 -24
  4. package/dist/cjs/chokidar/watcher.cjs.map +1 -1
  5. package/dist/cjs/fetchDistantDictionaries.cjs +4 -3
  6. package/dist/cjs/fetchDistantDictionaries.cjs.map +1 -1
  7. package/dist/cjs/listGitFiles.cjs +3 -1
  8. package/dist/cjs/listGitFiles.cjs.map +1 -1
  9. package/dist/cjs/loadDictionaries/loadDictionaries.cjs +3 -2
  10. package/dist/cjs/loadDictionaries/loadDictionaries.cjs.map +1 -1
  11. package/dist/cjs/mergeDictionaries.cjs +2 -1
  12. package/dist/cjs/mergeDictionaries.cjs.map +1 -1
  13. package/dist/cjs/prepareIntlayer.cjs +5 -4
  14. package/dist/cjs/prepareIntlayer.cjs.map +1 -1
  15. package/dist/cjs/transpiler/dictionary_to_main/createDictionaryEntryPoint.cjs +7 -2
  16. package/dist/cjs/transpiler/dictionary_to_main/createDictionaryEntryPoint.cjs.map +1 -1
  17. package/dist/cjs/writeContentDeclaration/formatCode.cjs +14 -2
  18. package/dist/cjs/writeContentDeclaration/formatCode.cjs.map +1 -1
  19. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +17 -15
  20. package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
  21. package/dist/esm/checkDictionaryChanges.mjs +10 -5
  22. package/dist/esm/checkDictionaryChanges.mjs.map +1 -1
  23. package/dist/esm/chokidar/watcher.mjs +13 -14
  24. package/dist/esm/chokidar/watcher.mjs.map +1 -1
  25. package/dist/esm/fetchDistantDictionaries.mjs +3 -2
  26. package/dist/esm/fetchDistantDictionaries.mjs.map +1 -1
  27. package/dist/esm/listGitFiles.mjs +3 -1
  28. package/dist/esm/listGitFiles.mjs.map +1 -1
  29. package/dist/esm/loadDictionaries/loadDictionaries.mjs +6 -1
  30. package/dist/esm/loadDictionaries/loadDictionaries.mjs.map +1 -1
  31. package/dist/esm/mergeDictionaries.mjs +2 -1
  32. package/dist/esm/mergeDictionaries.mjs.map +1 -1
  33. package/dist/esm/prepareIntlayer.mjs +2 -1
  34. package/dist/esm/prepareIntlayer.mjs.map +1 -1
  35. package/dist/esm/transpiler/dictionary_to_main/createDictionaryEntryPoint.mjs +7 -2
  36. package/dist/esm/transpiler/dictionary_to_main/createDictionaryEntryPoint.mjs.map +1 -1
  37. package/dist/esm/writeContentDeclaration/formatCode.mjs +3 -1
  38. package/dist/esm/writeContentDeclaration/formatCode.mjs.map +1 -1
  39. package/dist/esm/writeContentDeclaration/writeJSFile.mjs +3 -1
  40. package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
  41. package/dist/types/checkDictionaryChanges.d.ts.map +1 -1
  42. package/dist/types/chokidar/watcher.d.ts +2 -1
  43. package/dist/types/chokidar/watcher.d.ts.map +1 -1
  44. package/dist/types/fetchDistantDictionaries.d.ts.map +1 -1
  45. package/dist/types/listGitFiles.d.ts.map +1 -1
  46. package/dist/types/loadDictionaries/loadDictionaries.d.ts.map +1 -1
  47. package/dist/types/mergeDictionaries.d.ts.map +1 -1
  48. package/dist/types/prepareIntlayer.d.ts.map +1 -1
  49. package/dist/types/transpiler/dictionary_to_main/createDictionaryEntryPoint.d.ts +1 -1
  50. package/dist/types/transpiler/dictionary_to_main/createDictionaryEntryPoint.d.ts.map +1 -1
  51. package/dist/types/writeContentDeclaration/formatCode.d.ts.map +1 -1
  52. package/dist/types/writeContentDeclaration/writeJSFile.d.ts.map +1 -1
  53. package/package.json +13 -13
@@ -36,6 +36,7 @@ var babelParser = __toESM(require("@babel/parser"));
36
36
  var import_traverse = __toESM(require("@babel/traverse"));
37
37
  var t = __toESM(require("@babel/types"));
38
38
  var import_config = require("@intlayer/config");
39
+ var import_built = __toESM(require("@intlayer/config/built"));
39
40
  var import_core = require("@intlayer/core");
40
41
  var import_fs = require("fs");
41
42
  var import_promises = require("fs/promises");
@@ -43,6 +44,7 @@ var import_path = require("path");
43
44
  var import_getContentDeclarationFileTemplate = require('../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs');
44
45
  var import_formatCode = require('./formatCode.cjs');
45
46
  const writeJSFile = async (filePath, dictionary) => {
47
+ const appLogger = (0, import_config.getAppLogger)(import_built.default);
46
48
  const {
47
49
  key: dictionaryIdentifierKey,
48
50
  content: updatesToApply,
@@ -60,7 +62,7 @@ const writeJSFile = async (filePath, dictionary) => {
60
62
  } else {
61
63
  format = "esm";
62
64
  }
63
- (0, import_config.appLogger)("File does not exist, creating it", {
65
+ appLogger("File does not exist, creating it", {
64
66
  isVerbose: true
65
67
  });
66
68
  const template = await (0, import_getContentDeclarationFileTemplate.getContentDeclarationFileTemplate)(
@@ -75,7 +77,7 @@ const writeJSFile = async (filePath, dictionary) => {
75
77
  sourceCode = await (0, import_promises.readFile)(filePath, "utf-8");
76
78
  } catch (error) {
77
79
  const err = error;
78
- (0, import_config.appLogger)(`Failed to read file: ${filePath}`, {
80
+ appLogger(`Failed to read file: ${filePath}`, {
79
81
  level: "error"
80
82
  });
81
83
  throw new Error(`Failed to read file ${filePath}: ${err.message}`);
@@ -106,7 +108,7 @@ const writeJSFile = async (filePath, dictionary) => {
106
108
  }
107
109
  });
108
110
  if (!dictionaryObjectPath) {
109
- (0, import_config.appLogger)(`Looking for variable declarations`, {
111
+ appLogger(`Looking for variable declarations`, {
110
112
  isVerbose: true
111
113
  });
112
114
  const candidateVars = [];
@@ -125,7 +127,7 @@ const writeJSFile = async (filePath, dictionary) => {
125
127
  }
126
128
  }
127
129
  });
128
- (0, import_config.appLogger)(`Found ${candidateVars.length} candidate variables`, {
130
+ appLogger(`Found ${candidateVars.length} candidate variables`, {
129
131
  isVerbose: true
130
132
  });
131
133
  for (const { id, path } of candidateVars) {
@@ -137,14 +139,14 @@ const writeJSFile = async (filePath, dictionary) => {
137
139
  return keyName === "key" && t.isStringLiteral(prop.value) && prop.value.value === dictionaryIdentifierKey;
138
140
  });
139
141
  if (keyProp) {
140
- (0, import_config.appLogger)(`Found match in variable: ${id}`);
142
+ appLogger(`Found match in variable: ${id}`);
141
143
  dictionaryObjectPath = path;
142
144
  dictionaryIdentifier = id;
143
145
  break;
144
146
  }
145
147
  }
146
148
  if (!dictionaryObjectPath) {
147
- (0, import_config.appLogger)("Could not find dictionary object. Dumping all objects:", {
149
+ appLogger("Could not find dictionary object. Dumping all objects:", {
148
150
  isVerbose: true
149
151
  });
150
152
  (0, import_traverse.default)(ast, {
@@ -160,7 +162,7 @@ const writeJSFile = async (filePath, dictionary) => {
160
162
  }
161
163
  return `${keyName}: ${valueDesc}`;
162
164
  }).join(", ");
163
- (0, import_config.appLogger)(`Object: { ${props} }`);
165
+ appLogger(`Object: { ${props} }`);
164
166
  }
165
167
  });
166
168
  }
@@ -194,7 +196,7 @@ const writeJSFile = async (filePath, dictionary) => {
194
196
  return keyName === entryKeyToUpdate;
195
197
  });
196
198
  if (!targetPropertyPath || !targetPropertyPath.isObjectProperty()) {
197
- (0, import_config.appLogger)(
199
+ appLogger(
198
200
  `Key '${entryKeyToUpdate}' not found in content object of ${filePath}. Adding the missing key.`,
199
201
  {
200
202
  level: "info",
@@ -225,7 +227,7 @@ const writeJSFile = async (filePath, dictionary) => {
225
227
  } else if (typeof newEntryData === "string") {
226
228
  valueNode = t.stringLiteral(newEntryData);
227
229
  } else {
228
- (0, import_config.appLogger)(
230
+ appLogger(
229
231
  `Unsupported data type for new key '${entryKeyToUpdate}'. Using empty string.`,
230
232
  { level: "warn", isVerbose: true }
231
233
  );
@@ -243,7 +245,7 @@ const writeJSFile = async (filePath, dictionary) => {
243
245
  if (newEntryData?.nodeType === "translation" && calleeName === "t") {
244
246
  const args = callExpressionPath.node.arguments;
245
247
  if (args.length === 0 || !t.isObjectExpression(args[0])) {
246
- (0, import_config.appLogger)(
248
+ appLogger(
247
249
  `'t' call for '${entryKeyToUpdate}' in ${filePath} does not have an object literal as its first argument. Skipping.`,
248
250
  {
249
251
  level: "warn",
@@ -257,7 +259,7 @@ const writeJSFile = async (filePath, dictionary) => {
257
259
  if (translations[locale]) {
258
260
  targetPropertyPath.get("value").replaceWith(t.stringLiteral(String(translations[locale])));
259
261
  } else {
260
- (0, import_config.appLogger)(
262
+ appLogger(
261
263
  `Missing translation for locale '${locale}' in '${entryKeyToUpdate}'. Using first available translation.`,
262
264
  { level: "warn", isVerbose: true }
263
265
  );
@@ -298,7 +300,7 @@ const writeJSFile = async (filePath, dictionary) => {
298
300
  }
299
301
  }
300
302
  } else {
301
- (0, import_config.appLogger)(
303
+ appLogger(
302
304
  `Unhandled callee '${calleeName || "unknown"}' for key '${entryKeyToUpdate}' in ${filePath}.`,
303
305
  { level: "warn", isVerbose: true }
304
306
  );
@@ -313,14 +315,14 @@ const writeJSFile = async (filePath, dictionary) => {
313
315
  targetPropertyPath.get("value").replaceWith(t.stringLiteral(String(firstValue)));
314
316
  }
315
317
  } else {
316
- (0, import_config.appLogger)(
318
+ appLogger(
317
319
  `Unhandled data structure for string replacement at '${entryKeyToUpdate}' in ${filePath}.`,
318
320
  { level: "warn", isVerbose: true }
319
321
  );
320
322
  }
321
323
  } else {
322
324
  const valueType = callExpressionPath.node.type;
323
- (0, import_config.appLogger)(
325
+ appLogger(
324
326
  `Updating value of type ${valueType} for '${entryKeyToUpdate}' in ${filePath}`,
325
327
  { level: "info", isVerbose: true }
326
328
  );
@@ -339,7 +341,7 @@ const writeJSFile = async (filePath, dictionary) => {
339
341
  }
340
342
  }
341
343
  } else {
342
- (0, import_config.appLogger)(
344
+ appLogger(
343
345
  `Cannot update value of type ${valueType} for '${entryKeyToUpdate}' in ${filePath}. Unsupported data structure.`,
344
346
  { level: "warn", isVerbose: true }
345
347
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import generator from '@babel/generator';\nimport * as babelParser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { appLogger, logger } from '@intlayer/config';\nimport {\n Dictionary,\n NodeType,\n TranslationContent,\n TypedNode,\n} from '@intlayer/core';\nimport { existsSync } from 'fs';\nimport { readFile, writeFile } from 'fs/promises';\nimport { extname } from 'path';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport { formatCode } from './formatCode';\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const writeJSFile = async (\n filePath: string,\n dictionary: Dictionary\n): Promise<void> => {\n const {\n key: dictionaryIdentifierKey,\n content: updatesToApply,\n locale,\n autoFilled,\n } = dictionary;\n const isPerLocaleDeclarationFile = typeof locale === 'string';\n\n // Check if the file exist\n if (!existsSync(filePath)) {\n const fileExtension = extname(filePath);\n\n let format = 'ts' as 'ts' | 'cjs' | 'esm';\n\n if (fileExtension === '.ts' || fileExtension === '.tsx') {\n format = 'ts';\n } else if (fileExtension === '.cjs' || fileExtension === '.cjsx') {\n format = 'cjs';\n } else {\n format = 'esm';\n }\n\n appLogger('File does not exist, creating it', {\n isVerbose: true,\n });\n const template = await getContentDeclarationFileTemplate(\n dictionaryIdentifierKey,\n format,\n { locale, autoFilled }\n );\n\n await writeFile(filePath, template, 'utf-8');\n }\n\n let sourceCode: string;\n try {\n sourceCode = await readFile(filePath, 'utf-8');\n } catch (error) {\n const err = error as Error;\n appLogger(`Failed to read file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to read file ${filePath}: ${err.message}`);\n }\n\n const ast = babelParser.parse(sourceCode, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n tokens: true,\n });\n\n let dictionaryObjectPath: NodePath<t.ObjectExpression> | null = null;\n let dictionaryIdentifier: string | null = null;\n\n // First look for direct objects with the right key, regardless of variable assignments\n traverse(ast, {\n ObjectExpression(path) {\n if (dictionaryObjectPath) return; // Already found\n\n // Check if this object has a key property with the right value\n const keyProp = path.node.properties.find((prop) => {\n if (!t.isObjectProperty(prop)) return false;\n if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n return false;\n\n const keyName = t.isIdentifier(prop.key)\n ? prop.key.name\n : prop.key.value;\n\n if (keyName !== 'key' || !t.isStringLiteral(prop.value)) return false;\n\n // Unescape the value for comparison\n const propValue = prop.value.value;\n // Compare actual string content, not just raw representation\n return propValue === dictionaryIdentifierKey;\n });\n\n if (keyProp) {\n dictionaryObjectPath = path;\n path.stop();\n }\n },\n });\n\n // If not found directly, look for variable declarations and exports\n if (!dictionaryObjectPath) {\n appLogger(`Looking for variable declarations`, {\n isVerbose: true,\n });\n\n // Collect all variable declarations with objects\n const candidateVars: { id: string; path: NodePath<t.ObjectExpression> }[] =\n [];\n\n traverse(ast, {\n VariableDeclarator(path) {\n const { node } = path;\n if (!t.isIdentifier(node.id)) return;\n\n let objPath: NodePath<t.ObjectExpression> | null = null;\n\n // Direct object assignment\n if (node.init && t.isObjectExpression(node.init)) {\n objPath = path.get('init') as NodePath<t.ObjectExpression>;\n }\n // Object with TS type assertion (satisfies/as)\n else if (\n node.init &&\n (t.isTSAsExpression(node.init) || t.isTSTypeAssertion(node.init)) &&\n t.isObjectExpression(node.init.expression)\n ) {\n objPath = path.get('init.expression') as NodePath<t.ObjectExpression>;\n }\n\n if (objPath) {\n candidateVars.push({ id: node.id.name, path: objPath });\n }\n },\n });\n\n appLogger(`Found ${candidateVars.length} candidate variables`, {\n isVerbose: true,\n });\n\n // Check each candidate for the key property\n for (const { id, path } of candidateVars) {\n const keyProp = path.node.properties.find((prop) => {\n if (!t.isObjectProperty(prop)) return false;\n if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n return false;\n\n const keyName = t.isIdentifier(prop.key)\n ? prop.key.name\n : prop.key.value;\n return (\n keyName === 'key' &&\n t.isStringLiteral(prop.value) &&\n prop.value.value === dictionaryIdentifierKey\n );\n });\n\n if (keyProp) {\n appLogger(`Found match in variable: ${id}`);\n dictionaryObjectPath = path;\n dictionaryIdentifier = id;\n break;\n }\n }\n\n // If still not found, dump all object expressions for debugging\n if (!dictionaryObjectPath) {\n appLogger('Could not find dictionary object. Dumping all objects:', {\n isVerbose: true,\n });\n traverse(ast, {\n ObjectExpression(path) {\n const props = path.node.properties\n .map((prop) => {\n if (!t.isObjectProperty(prop)) return 'non-object-property';\n if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n return 'complex-key';\n\n const keyName = t.isIdentifier(prop.key)\n ? prop.key.name\n : prop.key.value;\n let valueDesc = 'unknown-value';\n\n if (t.isStringLiteral(prop.value)) {\n valueDesc = `\"${prop.value.value}\"`;\n }\n\n return `${keyName}: ${valueDesc}`;\n })\n .join(', ');\n\n appLogger(`Object: { ${props} }`);\n },\n });\n }\n }\n\n if (!dictionaryObjectPath) {\n throw new Error(\n `Could not find dictionary object with key '${dictionaryIdentifierKey}' in ${filePath}`\n );\n }\n\n // Find the 'content' property within the identified dictionary object\n const contentPropertyPath = (\n (dictionaryObjectPath as any).get('properties') as NodePath<\n t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n >[]\n ).find((propPath) => {\n if (!propPath.isObjectProperty()) return false;\n const propNode = propPath.node;\n const keyName = t.isIdentifier(propNode.key)\n ? propNode.key.name\n : t.isStringLiteral(propNode.key)\n ? propNode.key.value\n : null;\n return keyName === 'content';\n });\n\n if (\n !contentPropertyPath ||\n !contentPropertyPath.isObjectProperty() ||\n !(contentPropertyPath.get('value') as NodePath).isObjectExpression()\n ) {\n throw new Error(\n `Could not find 'content' object property, or it's not an object, in dictionary in ${filePath}`\n );\n }\n\n const contentObjectPath = contentPropertyPath.get(\n 'value'\n ) as NodePath<t.ObjectExpression>;\n\n // Apply updates to each entry specified in the JSON\n for (const [entryKeyToUpdate, newEntryData] of Object.entries(\n updatesToApply\n )) {\n const targetPropertyPath = (\n contentObjectPath.get('properties') as NodePath<\n t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n >[]\n ).find((propPath) => {\n if (!propPath.isObjectProperty()) return false;\n const propNode = propPath.node;\n const keyName = t.isIdentifier(propNode.key)\n ? propNode.key.name\n : t.isStringLiteral(propNode.key)\n ? propNode.key.value\n : null;\n return keyName === entryKeyToUpdate;\n });\n\n if (!targetPropertyPath || !targetPropertyPath.isObjectProperty()) {\n appLogger(\n `Key '${entryKeyToUpdate}' not found in content object of ${filePath}. Adding the missing key.`,\n {\n level: 'info',\n isVerbose: true,\n }\n );\n\n // Create a new property for the missing key\n let valueNode: t.Expression;\n\n if ((newEntryData as TypedNode)?.nodeType === NodeType.Translation) {\n // Create a new t() call with the translations\n const translationContent = newEntryData as TranslationContent;\n\n if (\n isPerLocaleDeclarationFile &&\n typeof locale === 'string' &&\n translationContent?.[NodeType.Translation]?.[locale]\n ) {\n // For per-locale files, use the string value directly\n valueNode = t.stringLiteral(\n String(translationContent[NodeType.Translation][locale])\n );\n } else {\n // Otherwise create a t() call with translations object\n const translationsObj = t.objectExpression(\n Object.entries(translationContent?.[NodeType.Translation]).map(\n ([langKey, langValue]) => {\n const keyNode = t.isValidIdentifier(langKey)\n ? t.identifier(langKey)\n : t.stringLiteral(langKey);\n return t.objectProperty(\n keyNode,\n t.stringLiteral(String(langValue))\n );\n }\n )\n );\n valueNode = t.callExpression(t.identifier('t'), [translationsObj]);\n }\n } else if (typeof newEntryData === 'string') {\n // Create a string literal for string values\n valueNode = t.stringLiteral(newEntryData);\n } else {\n // Fallback to empty string if we don't know how to handle this type\n appLogger(\n `Unsupported data type for new key '${entryKeyToUpdate}'. Using empty string.`,\n { level: 'warn', isVerbose: true }\n );\n valueNode = t.stringLiteral('');\n }\n\n // Add the new property to the content object\n const keyNode = t.isValidIdentifier(entryKeyToUpdate)\n ? t.identifier(entryKeyToUpdate)\n : t.stringLiteral(entryKeyToUpdate);\n const newProperty = t.objectProperty(keyNode, valueNode);\n contentObjectPath.node.properties.push(newProperty);\n\n continue;\n }\n\n const callExpressionPath = targetPropertyPath.get('value') as NodePath; // Path to the value, e.g., t(...)\n\n // Handle different types of values\n if (callExpressionPath.isCallExpression()) {\n const calleeNode = (callExpressionPath.node as t.CallExpression).callee;\n const calleeName = t.isIdentifier(calleeNode) ? calleeNode.name : null;\n\n // Handle 't' function calls\n if (\n (newEntryData as TypedNode)?.nodeType === 'translation' &&\n calleeName === 't'\n ) {\n const args = (callExpressionPath.node as t.CallExpression).arguments;\n if (args.length === 0 || !t.isObjectExpression(args[0])) {\n appLogger(\n `'t' call for '${entryKeyToUpdate}' in ${filePath} does not have an object literal as its first argument. Skipping.`,\n {\n level: 'warn',\n isVerbose: true,\n }\n );\n continue;\n }\n\n if (isPerLocaleDeclarationFile && typeof locale === 'string') {\n // For per-locale files, replace t() call with direct string\n const translations = (newEntryData as TranslationContent)?.[\n NodeType.Translation\n ];\n\n if (translations[locale]) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(translations[locale])));\n } else {\n appLogger(\n `Missing translation for locale '${locale}' in '${entryKeyToUpdate}'. Using first available translation.`,\n { level: 'warn', isVerbose: true }\n );\n const firstValue = Object.values(translations)[0];\n if (firstValue) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(firstValue)));\n }\n }\n continue;\n }\n\n const translationsObjectAstNode = args[0] as t.ObjectExpression;\n const processedLangKeysInJsonUpdate = new Set<string>();\n\n // Update existing language properties in the AST node\n translationsObjectAstNode.properties.forEach((prop: any) => {\n if (t.isObjectProperty(prop)) {\n const langKeyNode = prop.key;\n const astLangKeyName = t.isIdentifier(langKeyNode)\n ? langKeyNode.name\n : t.isStringLiteral(langKeyNode)\n ? langKeyNode.value\n : null;\n\n if (\n astLangKeyName &&\n (newEntryData as TranslationContent)?.[\n NodeType.Translation\n ].hasOwnProperty(astLangKeyName)\n ) {\n prop.value = t.stringLiteral(\n String(\n (newEntryData as TranslationContent)?.[\n NodeType.Translation\n ]?.[astLangKeyName]\n )\n );\n processedLangKeysInJsonUpdate.add(astLangKeyName);\n }\n }\n });\n\n // Add new language properties from the JSON update that were not originally in the AST node\n for (const [jsonLangKey, jsonLangValue] of Object.entries(\n (newEntryData as TranslationContent)?.[NodeType.Translation]\n )) {\n if (!processedLangKeysInJsonUpdate.has(jsonLangKey)) {\n const newKeyNode = t.isValidIdentifier(jsonLangKey)\n ? t.identifier(jsonLangKey)\n : t.stringLiteral(jsonLangKey);\n translationsObjectAstNode.properties.push(\n t.objectProperty(\n newKeyNode,\n t.stringLiteral(String(jsonLangValue))\n )\n );\n }\n }\n }\n // Handle other function calls in the future\n else {\n appLogger(\n `Unhandled callee '${calleeName || 'unknown'}' for key '${entryKeyToUpdate}' in ${filePath}.`,\n { level: 'warn', isVerbose: true }\n );\n }\n }\n // Handle direct string literals\n else if (callExpressionPath.isStringLiteral()) {\n // For string literals, directly replace with the new value\n if (typeof newEntryData === 'string') {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(newEntryData));\n } else if ((newEntryData as any)?.[NodeType.Translation]) {\n // Handle translation content (use first available translation)\n const translations = (newEntryData as TranslationContent)[\n NodeType.Translation\n ];\n const firstValue = Object.values(translations)[0];\n if (firstValue) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(firstValue)));\n }\n } else {\n appLogger(\n `Unhandled data structure for string replacement at '${entryKeyToUpdate}' in ${filePath}.`,\n { level: 'warn', isVerbose: true }\n );\n }\n }\n // Handle other value types (objects, arrays, etc.)\n else {\n const valueType = callExpressionPath.node.type;\n appLogger(\n `Updating value of type ${valueType} for '${entryKeyToUpdate}' in ${filePath}`,\n { level: 'info', isVerbose: true }\n );\n\n // For simple values like strings, use direct replacement\n if (typeof newEntryData === 'string') {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(newEntryData));\n }\n // For translation content, use a smart approach\n else if ((newEntryData as any)?.[NodeType.Translation]) {\n // Extract just the value relevant to this file's locale\n const translations = (newEntryData as TranslationContent)[\n NodeType.Translation\n ];\n\n // Try to determine locale from file path (assuming a pattern like .fr.content.ts)\n const localeMatch = filePath.match(/\\.([a-z]{2})\\.content\\.(ts|js)$/i);\n const locale = localeMatch\n ? localeMatch[1]\n : Object.keys(translations)[0];\n\n if (translations[locale]) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(translations[locale])));\n } else {\n // Fallback to first translation\n const firstValue = Object.values(translations)[0];\n if (firstValue) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(firstValue)));\n }\n }\n } else {\n appLogger(\n `Cannot update value of type ${valueType} for '${entryKeyToUpdate}' in ${filePath}. Unsupported data structure.`,\n { level: 'warn', isVerbose: true }\n );\n }\n }\n }\n\n // Generate JavaScript/TypeScript code from the modified AST\n const generatedCode = generator(ast, {\n retainLines: true,\n comments: true,\n jsescOption: {\n minimal: true, // This ensures Unicode characters are not escaped\n },\n }).code;\n\n let finalCode = generatedCode;\n\n finalCode = await formatCode(filePath, finalCode);\n\n // Write the modified code back to the file\n try {\n await writeFile(filePath, finalCode, 'utf-8');\n logger(`Successfully updated ${filePath}`, {\n level: 'info',\n isVerbose: true,\n });\n } catch (error) {\n const err = error as Error;\n logger(`Failed to write updated file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to write updated file ${filePath}: ${err.message}`);\n }\n};\n"],"mappings":"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","names":["traverse","keyNode","locale","generator"]}
1
+ {"version":3,"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import generator from '@babel/generator';\nimport * as babelParser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { getAppLogger, logger } from '@intlayer/config';\nimport configuration from '@intlayer/config/built';\nimport {\n Dictionary,\n NodeType,\n TranslationContent,\n TypedNode,\n} from '@intlayer/core';\nimport { existsSync } from 'fs';\nimport { readFile, writeFile } from 'fs/promises';\nimport { extname } from 'path';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport { formatCode } from './formatCode';\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const writeJSFile = async (\n filePath: string,\n dictionary: Dictionary\n): Promise<void> => {\n const appLogger = getAppLogger(configuration);\n\n const {\n key: dictionaryIdentifierKey,\n content: updatesToApply,\n locale,\n autoFilled,\n } = dictionary;\n const isPerLocaleDeclarationFile = typeof locale === 'string';\n\n // Check if the file exist\n if (!existsSync(filePath)) {\n const fileExtension = extname(filePath);\n\n let format = 'ts' as 'ts' | 'cjs' | 'esm';\n\n if (fileExtension === '.ts' || fileExtension === '.tsx') {\n format = 'ts';\n } else if (fileExtension === '.cjs' || fileExtension === '.cjsx') {\n format = 'cjs';\n } else {\n format = 'esm';\n }\n\n appLogger('File does not exist, creating it', {\n isVerbose: true,\n });\n const template = await getContentDeclarationFileTemplate(\n dictionaryIdentifierKey,\n format,\n { locale, autoFilled }\n );\n\n await writeFile(filePath, template, 'utf-8');\n }\n\n let sourceCode: string;\n try {\n sourceCode = await readFile(filePath, 'utf-8');\n } catch (error) {\n const err = error as Error;\n appLogger(`Failed to read file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to read file ${filePath}: ${err.message}`);\n }\n\n const ast = babelParser.parse(sourceCode, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n tokens: true,\n });\n\n let dictionaryObjectPath: NodePath<t.ObjectExpression> | null = null;\n let dictionaryIdentifier: string | null = null;\n\n // First look for direct objects with the right key, regardless of variable assignments\n traverse(ast, {\n ObjectExpression(path) {\n if (dictionaryObjectPath) return; // Already found\n\n // Check if this object has a key property with the right value\n const keyProp = path.node.properties.find((prop) => {\n if (!t.isObjectProperty(prop)) return false;\n if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n return false;\n\n const keyName = t.isIdentifier(prop.key)\n ? prop.key.name\n : prop.key.value;\n\n if (keyName !== 'key' || !t.isStringLiteral(prop.value)) return false;\n\n // Unescape the value for comparison\n const propValue = prop.value.value;\n // Compare actual string content, not just raw representation\n return propValue === dictionaryIdentifierKey;\n });\n\n if (keyProp) {\n dictionaryObjectPath = path;\n path.stop();\n }\n },\n });\n\n // If not found directly, look for variable declarations and exports\n if (!dictionaryObjectPath) {\n appLogger(`Looking for variable declarations`, {\n isVerbose: true,\n });\n\n // Collect all variable declarations with objects\n const candidateVars: { id: string; path: NodePath<t.ObjectExpression> }[] =\n [];\n\n traverse(ast, {\n VariableDeclarator(path) {\n const { node } = path;\n if (!t.isIdentifier(node.id)) return;\n\n let objPath: NodePath<t.ObjectExpression> | null = null;\n\n // Direct object assignment\n if (node.init && t.isObjectExpression(node.init)) {\n objPath = path.get('init') as NodePath<t.ObjectExpression>;\n }\n // Object with TS type assertion (satisfies/as)\n else if (\n node.init &&\n (t.isTSAsExpression(node.init) || t.isTSTypeAssertion(node.init)) &&\n t.isObjectExpression(node.init.expression)\n ) {\n objPath = path.get('init.expression') as NodePath<t.ObjectExpression>;\n }\n\n if (objPath) {\n candidateVars.push({ id: node.id.name, path: objPath });\n }\n },\n });\n\n appLogger(`Found ${candidateVars.length} candidate variables`, {\n isVerbose: true,\n });\n\n // Check each candidate for the key property\n for (const { id, path } of candidateVars) {\n const keyProp = path.node.properties.find((prop) => {\n if (!t.isObjectProperty(prop)) return false;\n if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n return false;\n\n const keyName = t.isIdentifier(prop.key)\n ? prop.key.name\n : prop.key.value;\n return (\n keyName === 'key' &&\n t.isStringLiteral(prop.value) &&\n prop.value.value === dictionaryIdentifierKey\n );\n });\n\n if (keyProp) {\n appLogger(`Found match in variable: ${id}`);\n dictionaryObjectPath = path;\n dictionaryIdentifier = id;\n break;\n }\n }\n\n // If still not found, dump all object expressions for debugging\n if (!dictionaryObjectPath) {\n appLogger('Could not find dictionary object. Dumping all objects:', {\n isVerbose: true,\n });\n traverse(ast, {\n ObjectExpression(path) {\n const props = path.node.properties\n .map((prop) => {\n if (!t.isObjectProperty(prop)) return 'non-object-property';\n if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n return 'complex-key';\n\n const keyName = t.isIdentifier(prop.key)\n ? prop.key.name\n : prop.key.value;\n let valueDesc = 'unknown-value';\n\n if (t.isStringLiteral(prop.value)) {\n valueDesc = `\"${prop.value.value}\"`;\n }\n\n return `${keyName}: ${valueDesc}`;\n })\n .join(', ');\n\n appLogger(`Object: { ${props} }`);\n },\n });\n }\n }\n\n if (!dictionaryObjectPath) {\n throw new Error(\n `Could not find dictionary object with key '${dictionaryIdentifierKey}' in ${filePath}`\n );\n }\n\n // Find the 'content' property within the identified dictionary object\n const contentPropertyPath = (\n (dictionaryObjectPath as any).get('properties') as NodePath<\n t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n >[]\n ).find((propPath) => {\n if (!propPath.isObjectProperty()) return false;\n const propNode = propPath.node;\n const keyName = t.isIdentifier(propNode.key)\n ? propNode.key.name\n : t.isStringLiteral(propNode.key)\n ? propNode.key.value\n : null;\n return keyName === 'content';\n });\n\n if (\n !contentPropertyPath ||\n !contentPropertyPath.isObjectProperty() ||\n !(contentPropertyPath.get('value') as NodePath).isObjectExpression()\n ) {\n throw new Error(\n `Could not find 'content' object property, or it's not an object, in dictionary in ${filePath}`\n );\n }\n\n const contentObjectPath = contentPropertyPath.get(\n 'value'\n ) as NodePath<t.ObjectExpression>;\n\n // Apply updates to each entry specified in the JSON\n for (const [entryKeyToUpdate, newEntryData] of Object.entries(\n updatesToApply\n )) {\n const targetPropertyPath = (\n contentObjectPath.get('properties') as NodePath<\n t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n >[]\n ).find((propPath) => {\n if (!propPath.isObjectProperty()) return false;\n const propNode = propPath.node;\n const keyName = t.isIdentifier(propNode.key)\n ? propNode.key.name\n : t.isStringLiteral(propNode.key)\n ? propNode.key.value\n : null;\n return keyName === entryKeyToUpdate;\n });\n\n if (!targetPropertyPath || !targetPropertyPath.isObjectProperty()) {\n appLogger(\n `Key '${entryKeyToUpdate}' not found in content object of ${filePath}. Adding the missing key.`,\n {\n level: 'info',\n isVerbose: true,\n }\n );\n\n // Create a new property for the missing key\n let valueNode: t.Expression;\n\n if ((newEntryData as TypedNode)?.nodeType === NodeType.Translation) {\n // Create a new t() call with the translations\n const translationContent = newEntryData as TranslationContent;\n\n if (\n isPerLocaleDeclarationFile &&\n typeof locale === 'string' &&\n translationContent?.[NodeType.Translation]?.[locale]\n ) {\n // For per-locale files, use the string value directly\n valueNode = t.stringLiteral(\n String(translationContent[NodeType.Translation][locale])\n );\n } else {\n // Otherwise create a t() call with translations object\n const translationsObj = t.objectExpression(\n Object.entries(translationContent?.[NodeType.Translation]).map(\n ([langKey, langValue]) => {\n const keyNode = t.isValidIdentifier(langKey)\n ? t.identifier(langKey)\n : t.stringLiteral(langKey);\n return t.objectProperty(\n keyNode,\n t.stringLiteral(String(langValue))\n );\n }\n )\n );\n valueNode = t.callExpression(t.identifier('t'), [translationsObj]);\n }\n } else if (typeof newEntryData === 'string') {\n // Create a string literal for string values\n valueNode = t.stringLiteral(newEntryData);\n } else {\n // Fallback to empty string if we don't know how to handle this type\n appLogger(\n `Unsupported data type for new key '${entryKeyToUpdate}'. Using empty string.`,\n { level: 'warn', isVerbose: true }\n );\n valueNode = t.stringLiteral('');\n }\n\n // Add the new property to the content object\n const keyNode = t.isValidIdentifier(entryKeyToUpdate)\n ? t.identifier(entryKeyToUpdate)\n : t.stringLiteral(entryKeyToUpdate);\n const newProperty = t.objectProperty(keyNode, valueNode);\n contentObjectPath.node.properties.push(newProperty);\n\n continue;\n }\n\n const callExpressionPath = targetPropertyPath.get('value') as NodePath; // Path to the value, e.g., t(...)\n\n // Handle different types of values\n if (callExpressionPath.isCallExpression()) {\n const calleeNode = (callExpressionPath.node as t.CallExpression).callee;\n const calleeName = t.isIdentifier(calleeNode) ? calleeNode.name : null;\n\n // Handle 't' function calls\n if (\n (newEntryData as TypedNode)?.nodeType === 'translation' &&\n calleeName === 't'\n ) {\n const args = (callExpressionPath.node as t.CallExpression).arguments;\n if (args.length === 0 || !t.isObjectExpression(args[0])) {\n appLogger(\n `'t' call for '${entryKeyToUpdate}' in ${filePath} does not have an object literal as its first argument. Skipping.`,\n {\n level: 'warn',\n isVerbose: true,\n }\n );\n continue;\n }\n\n if (isPerLocaleDeclarationFile && typeof locale === 'string') {\n // For per-locale files, replace t() call with direct string\n const translations = (newEntryData as TranslationContent)?.[\n NodeType.Translation\n ];\n\n if (translations[locale]) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(translations[locale])));\n } else {\n appLogger(\n `Missing translation for locale '${locale}' in '${entryKeyToUpdate}'. Using first available translation.`,\n { level: 'warn', isVerbose: true }\n );\n const firstValue = Object.values(translations)[0];\n if (firstValue) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(firstValue)));\n }\n }\n continue;\n }\n\n const translationsObjectAstNode = args[0] as t.ObjectExpression;\n const processedLangKeysInJsonUpdate = new Set<string>();\n\n // Update existing language properties in the AST node\n translationsObjectAstNode.properties.forEach((prop: any) => {\n if (t.isObjectProperty(prop)) {\n const langKeyNode = prop.key;\n const astLangKeyName = t.isIdentifier(langKeyNode)\n ? langKeyNode.name\n : t.isStringLiteral(langKeyNode)\n ? langKeyNode.value\n : null;\n\n if (\n astLangKeyName &&\n (newEntryData as TranslationContent)?.[\n NodeType.Translation\n ].hasOwnProperty(astLangKeyName)\n ) {\n prop.value = t.stringLiteral(\n String(\n (newEntryData as TranslationContent)?.[\n NodeType.Translation\n ]?.[astLangKeyName]\n )\n );\n processedLangKeysInJsonUpdate.add(astLangKeyName);\n }\n }\n });\n\n // Add new language properties from the JSON update that were not originally in the AST node\n for (const [jsonLangKey, jsonLangValue] of Object.entries(\n (newEntryData as TranslationContent)?.[NodeType.Translation]\n )) {\n if (!processedLangKeysInJsonUpdate.has(jsonLangKey)) {\n const newKeyNode = t.isValidIdentifier(jsonLangKey)\n ? t.identifier(jsonLangKey)\n : t.stringLiteral(jsonLangKey);\n translationsObjectAstNode.properties.push(\n t.objectProperty(\n newKeyNode,\n t.stringLiteral(String(jsonLangValue))\n )\n );\n }\n }\n }\n // Handle other function calls in the future\n else {\n appLogger(\n `Unhandled callee '${calleeName || 'unknown'}' for key '${entryKeyToUpdate}' in ${filePath}.`,\n { level: 'warn', isVerbose: true }\n );\n }\n }\n // Handle direct string literals\n else if (callExpressionPath.isStringLiteral()) {\n // For string literals, directly replace with the new value\n if (typeof newEntryData === 'string') {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(newEntryData));\n } else if ((newEntryData as any)?.[NodeType.Translation]) {\n // Handle translation content (use first available translation)\n const translations = (newEntryData as TranslationContent)[\n NodeType.Translation\n ];\n const firstValue = Object.values(translations)[0];\n if (firstValue) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(firstValue)));\n }\n } else {\n appLogger(\n `Unhandled data structure for string replacement at '${entryKeyToUpdate}' in ${filePath}.`,\n { level: 'warn', isVerbose: true }\n );\n }\n }\n // Handle other value types (objects, arrays, etc.)\n else {\n const valueType = callExpressionPath.node.type;\n appLogger(\n `Updating value of type ${valueType} for '${entryKeyToUpdate}' in ${filePath}`,\n { level: 'info', isVerbose: true }\n );\n\n // For simple values like strings, use direct replacement\n if (typeof newEntryData === 'string') {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(newEntryData));\n }\n // For translation content, use a smart approach\n else if ((newEntryData as any)?.[NodeType.Translation]) {\n // Extract just the value relevant to this file's locale\n const translations = (newEntryData as TranslationContent)[\n NodeType.Translation\n ];\n\n // Try to determine locale from file path (assuming a pattern like .fr.content.ts)\n const localeMatch = filePath.match(/\\.([a-z]{2})\\.content\\.(ts|js)$/i);\n const locale = localeMatch\n ? localeMatch[1]\n : Object.keys(translations)[0];\n\n if (translations[locale]) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(translations[locale])));\n } else {\n // Fallback to first translation\n const firstValue = Object.values(translations)[0];\n if (firstValue) {\n targetPropertyPath\n .get('value')\n .replaceWith(t.stringLiteral(String(firstValue)));\n }\n }\n } else {\n appLogger(\n `Cannot update value of type ${valueType} for '${entryKeyToUpdate}' in ${filePath}. Unsupported data structure.`,\n { level: 'warn', isVerbose: true }\n );\n }\n }\n }\n\n // Generate JavaScript/TypeScript code from the modified AST\n const generatedCode = generator(ast, {\n retainLines: true,\n comments: true,\n jsescOption: {\n minimal: true, // This ensures Unicode characters are not escaped\n },\n }).code;\n\n let finalCode = generatedCode;\n\n finalCode = await formatCode(filePath, finalCode);\n\n // Write the modified code back to the file\n try {\n await writeFile(filePath, finalCode, 'utf-8');\n logger(`Successfully updated ${filePath}`, {\n level: 'info',\n isVerbose: true,\n });\n } catch (error) {\n const err = error as Error;\n logger(`Failed to write updated file: ${filePath}`, {\n level: 'error',\n });\n throw new Error(`Failed to write updated file ${filePath}: ${err.message}`);\n }\n};\n"],"mappings":"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","names":["configuration","traverse","keyNode","locale","generator"]}
@@ -1,12 +1,17 @@
1
1
  import { IntlayerEventListener } from "@intlayer/api";
2
+ import {
3
+ getAppLogger,
4
+ getConfiguration
5
+ } from "@intlayer/config";
2
6
  import { buildIntlayerDictionary } from "./transpiler/declaration_file_to_dictionary/intlayer_dictionary/buildIntlayerDictionary.mjs";
3
- import { getConfiguration, appLogger } from "@intlayer/config";
4
- const writeDictionary = async (dictionary) => {
7
+ const writeDictionary = async (dictionary, configuration) => {
8
+ const appLogger = getAppLogger(configuration);
5
9
  appLogger(`Writing dictionary ${dictionary.key}`);
6
10
  await buildIntlayerDictionary([dictionary]);
7
11
  };
8
12
  const checkDictionaryChanges = async () => {
9
13
  const configuration = getConfiguration();
14
+ const appLogger = getAppLogger(configuration);
10
15
  const { editor } = configuration;
11
16
  if (!editor.hotReload) return;
12
17
  if (!editor.clientId) return;
@@ -21,9 +26,9 @@ const checkDictionaryChanges = async () => {
21
26
  level: "error"
22
27
  });
23
28
  }
24
- eventSource.onDictionaryAdded = writeDictionary;
25
- eventSource.onDictionaryChange = writeDictionary;
26
- eventSource.onDictionaryDeleted = writeDictionary;
29
+ eventSource.onDictionaryAdded = (dictionary) => writeDictionary(dictionary, configuration);
30
+ eventSource.onDictionaryChange = (dictionary) => writeDictionary(dictionary, configuration);
31
+ eventSource.onDictionaryDeleted = (dictionary) => writeDictionary(dictionary, configuration);
27
32
  return eventSource;
28
33
  };
29
34
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/checkDictionaryChanges.ts"],"sourcesContent":["import { IntlayerEventListener } from '@intlayer/api';\n// @ts-ignore: @intlayer/backend is not built yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { buildIntlayerDictionary } from './transpiler/declaration_file_to_dictionary/intlayer_dictionary/buildIntlayerDictionary';\nimport { getConfiguration, appLogger } from '@intlayer/config';\n\nconst writeDictionary = async (dictionary: DictionaryAPI) => {\n appLogger(`Writing dictionary ${dictionary.key}`);\n await buildIntlayerDictionary([dictionary]);\n};\n\nexport const checkDictionaryChanges = async () => {\n const configuration = getConfiguration();\n\n const { editor } = configuration;\n\n if (!editor.hotReload) return;\n if (!editor.clientId) return;\n if (!editor.clientSecret) return;\n\n const eventSource = new IntlayerEventListener(configuration);\n\n try {\n await eventSource.initialize().then(() => {\n appLogger('Connected to Intlayer. Hot reload enabled');\n });\n } catch (error) {\n appLogger('Error initializing IntlayerEventListener:', {\n level: 'error',\n });\n }\n\n eventSource.onDictionaryAdded = writeDictionary;\n eventSource.onDictionaryChange = writeDictionary;\n eventSource.onDictionaryDeleted = writeDictionary;\n\n return eventSource;\n};\n"],"mappings":"AAAA,SAAS,6BAA6B;AAGtC,SAAS,+BAA+B;AACxC,SAAS,kBAAkB,iBAAiB;AAE5C,MAAM,kBAAkB,OAAO,eAA8B;AAC3D,YAAU,sBAAsB,WAAW,GAAG,EAAE;AAChD,QAAM,wBAAwB,CAAC,UAAU,CAAC;AAC5C;AAEO,MAAM,yBAAyB,YAAY;AAChD,QAAM,gBAAgB,iBAAiB;AAEvC,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,CAAC,OAAO,UAAW;AACvB,MAAI,CAAC,OAAO,SAAU;AACtB,MAAI,CAAC,OAAO,aAAc;AAE1B,QAAM,cAAc,IAAI,sBAAsB,aAAa;AAE3D,MAAI;AACF,UAAM,YAAY,WAAW,EAAE,KAAK,MAAM;AACxC,gBAAU,2CAA2C;AAAA,IACvD,CAAC;AAAA,EACH,SAAS,OAAO;AACd,cAAU,6CAA6C;AAAA,MACrD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,cAAY,oBAAoB;AAChC,cAAY,qBAAqB;AACjC,cAAY,sBAAsB;AAElC,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/checkDictionaryChanges.ts"],"sourcesContent":["import { IntlayerEventListener } from '@intlayer/api';\n// @ts-ignore: @intlayer/backend is not built yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport {\n getAppLogger,\n getConfiguration,\n IntlayerConfig,\n} from '@intlayer/config';\nimport { buildIntlayerDictionary } from './transpiler/declaration_file_to_dictionary/intlayer_dictionary/buildIntlayerDictionary';\n\nconst writeDictionary = async (\n dictionary: DictionaryAPI,\n configuration: IntlayerConfig\n) => {\n const appLogger = getAppLogger(configuration);\n appLogger(`Writing dictionary ${dictionary.key}`);\n await buildIntlayerDictionary([dictionary]);\n};\n\nexport const checkDictionaryChanges = async () => {\n const configuration = getConfiguration();\n const appLogger = getAppLogger(configuration);\n\n const { editor } = configuration;\n\n if (!editor.hotReload) return;\n if (!editor.clientId) return;\n if (!editor.clientSecret) return;\n\n const eventSource = new IntlayerEventListener(configuration);\n\n try {\n await eventSource.initialize().then(() => {\n appLogger('Connected to Intlayer. Hot reload enabled');\n });\n } catch (error) {\n appLogger('Error initializing IntlayerEventListener:', {\n level: 'error',\n });\n }\n\n eventSource.onDictionaryAdded = (dictionary) =>\n writeDictionary(dictionary, configuration);\n eventSource.onDictionaryChange = (dictionary) =>\n writeDictionary(dictionary, configuration);\n eventSource.onDictionaryDeleted = (dictionary) =>\n writeDictionary(dictionary, configuration);\n\n return eventSource;\n};\n"],"mappings":"AAAA,SAAS,6BAA6B;AAGtC;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,+BAA+B;AAExC,MAAM,kBAAkB,OACtB,YACA,kBACG;AACH,QAAM,YAAY,aAAa,aAAa;AAC5C,YAAU,sBAAsB,WAAW,GAAG,EAAE;AAChD,QAAM,wBAAwB,CAAC,UAAU,CAAC;AAC5C;AAEO,MAAM,yBAAyB,YAAY;AAChD,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,YAAY,aAAa,aAAa;AAE5C,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,CAAC,OAAO,UAAW;AACvB,MAAI,CAAC,OAAO,SAAU;AACtB,MAAI,CAAC,OAAO,aAAc;AAE1B,QAAM,cAAc,IAAI,sBAAsB,aAAa;AAE3D,MAAI;AACF,UAAM,YAAY,WAAW,EAAE,KAAK,MAAM;AACxC,gBAAU,2CAA2C;AAAA,IACvD,CAAC;AAAA,EACH,SAAS,OAAO;AACd,cAAU,6CAA6C;AAAA,MACrD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,cAAY,oBAAoB,CAAC,eAC/B,gBAAgB,YAAY,aAAa;AAC3C,cAAY,qBAAqB,CAAC,eAChC,gBAAgB,YAAY,aAAa;AAC3C,cAAY,sBAAsB,CAAC,eACjC,gBAAgB,YAAY,aAAa;AAE3C,SAAO;AACT;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import {
2
- appLogger,
2
+ getAppLogger,
3
3
  getConfiguration
4
4
  } from "@intlayer/config";
5
5
  import { basename, relative } from "path";
@@ -16,9 +16,9 @@ import {
16
16
  } from "../transpiler/dictionary_to_type/index.mjs";
17
17
  const recentlyAddedFiles = /* @__PURE__ */ new Set();
18
18
  const handleAdditionalContentDeclarationFile = async (filePath, configuration) => {
19
- const { content } = configuration ?? getConfiguration({
20
- verbose: true
21
- });
19
+ const config = configuration ?? getConfiguration();
20
+ const appLogger = getAppLogger(config);
21
+ const { content } = config;
22
22
  appLogger(
23
23
  `Additional file detected: ${relative(content.baseDir, filePath)}`,
24
24
  {
@@ -38,9 +38,9 @@ const handleAdditionalContentDeclarationFile = async (filePath, configuration) =
38
38
  });
39
39
  };
40
40
  const handleUnlikedContentDeclarationFile = async (filePath, configuration) => {
41
- const { content } = configuration ?? getConfiguration({
42
- verbose: true
43
- });
41
+ const config = configuration ?? getConfiguration();
42
+ const appLogger = getAppLogger(config);
43
+ const { content } = config;
44
44
  appLogger(`Unlinked detected: ${relative(content.baseDir, filePath)}`, {
45
45
  isVerbose: true
46
46
  });
@@ -58,9 +58,9 @@ const handleUnlikedContentDeclarationFile = async (filePath, configuration) => {
58
58
  });
59
59
  };
60
60
  const handleContentDeclarationFileChange = async (filePath, configuration) => {
61
- const { content } = configuration ?? getConfiguration({
62
- verbose: true
63
- });
61
+ const config = configuration ?? getConfiguration();
62
+ const appLogger = getAppLogger(config);
63
+ const { content } = config;
64
64
  appLogger(`Change detected: ${relative(content.baseDir, filePath)}`, {
65
65
  isVerbose: true
66
66
  });
@@ -81,9 +81,8 @@ const handleContentDeclarationFileChange = async (filePath, configuration) => {
81
81
  }
82
82
  };
83
83
  const watch = (options) => {
84
- const configuration = options?.configuration ?? getConfiguration({
85
- verbose: true
86
- });
84
+ const configuration = options?.configuration ?? getConfiguration();
85
+ const appLogger = getAppLogger(configuration);
87
86
  const { watch: isWatchMode, watchedFilesPatternWithPath } = configuration.content;
88
87
  return chokidarWatch(watchedFilesPatternWithPath, {
89
88
  persistent: isWatchMode,
@@ -116,7 +115,7 @@ const watch = (options) => {
116
115
  });
117
116
  };
118
117
  const buildAndWatchIntlayer = async (options) => {
119
- const configuration = options?.configuration ?? getConfiguration();
118
+ const configuration = options?.configuration ?? getConfiguration(options?.configOptions);
120
119
  await prepareIntlayer(configuration);
121
120
  if (configuration.content.watch || options.persistent) {
122
121
  watch({ ...options, configuration });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/chokidar/watcher.ts"],"sourcesContent":["import {\n type IntlayerConfig,\n appLogger,\n getConfiguration,\n} from '@intlayer/config';\nimport { basename, relative } from 'path';\n/** @ts-ignore remove error Module '\"chokidar\"' has no exported member 'ChokidarOptions' */\nimport { type ChokidarOptions, watch as chokidarWatch } from 'chokidar';\nimport { getBuiltDictionariesPath } from '../getBuiltDictionariesPath';\nimport { listDictionaries } from '../listDictionariesPath';\nimport { loadLocalDictionaries } from '../loadDictionaries/loadLocalDictionaries';\nimport { prepareIntlayer } from '../prepareIntlayer';\nimport { buildDictionary } from '../transpiler/declaration_file_to_dictionary/index';\nimport { createDictionaryEntryPoint } from '../transpiler/dictionary_to_main/createDictionaryEntryPoint';\nimport {\n createModuleAugmentation,\n createTypes,\n} from '../transpiler/dictionary_to_type/index';\n\nconst recentlyAddedFiles = new Set<string>();\n\nexport const handleAdditionalContentDeclarationFile = async (\n filePath: string,\n configuration?: IntlayerConfig\n) => {\n const { content } =\n configuration ??\n getConfiguration({\n verbose: true,\n });\n\n // Process the file with the functionToRun\n appLogger(\n `Additional file detected: ${relative(content.baseDir, filePath)}`,\n {\n isVerbose: true,\n }\n );\n\n const localeDictionaries = await loadLocalDictionaries(filePath);\n\n const dictionariesPaths = await buildDictionary(localeDictionaries);\n\n createTypes(dictionariesPaths);\n\n createDictionaryEntryPoint();\n\n appLogger('Dictionaries built', {\n isVerbose: true,\n });\n\n createModuleAugmentation();\n\n appLogger('Module augmentation built', {\n isVerbose: true,\n });\n};\n\nexport const handleUnlikedContentDeclarationFile = async (\n filePath: string,\n configuration?: IntlayerConfig\n) => {\n const { content } =\n configuration ??\n getConfiguration({\n verbose: true,\n });\n\n // Process the file with the functionToRun\n appLogger(`Unlinked detected: ${relative(content.baseDir, filePath)}`, {\n isVerbose: true,\n });\n\n const files: string[] = listDictionaries(configuration);\n\n const localeDictionaries = await loadLocalDictionaries(files);\n\n const dictionariesPaths = await buildDictionary(localeDictionaries);\n\n createTypes(dictionariesPaths);\n\n createDictionaryEntryPoint();\n\n appLogger('Dictionaries rebuilt', {\n isVerbose: true,\n });\n\n createModuleAugmentation();\n\n appLogger('Module augmentation built', {\n isVerbose: true,\n });\n};\n\nexport const handleContentDeclarationFileChange = async (\n filePath: string,\n configuration?: IntlayerConfig\n) => {\n const { content } =\n configuration ??\n getConfiguration({\n verbose: true,\n });\n\n // Process the file with the functionToRun\n appLogger(`Change detected: ${relative(content.baseDir, filePath)}`, {\n isVerbose: true,\n });\n\n const localeDictionaries = await loadLocalDictionaries(filePath);\n\n const updatedDictionariesPaths = await buildDictionary(localeDictionaries);\n const allDictionariesPaths: string[] = getBuiltDictionariesPath();\n\n createTypes(updatedDictionariesPaths);\n appLogger('TypeScript types built', {\n isVerbose: true,\n });\n\n if (\n updatedDictionariesPaths.some(\n (updatedDictionaryPath) =>\n !allDictionariesPaths.includes(updatedDictionaryPath)\n )\n ) {\n createDictionaryEntryPoint();\n\n appLogger('Dictionary list built', {\n isVerbose: true,\n });\n }\n};\n\ntype WatchOptions = ChokidarOptions & {\n configuration?: IntlayerConfig;\n};\n\n// Initialize chokidar watcher (non-persistent)\nexport const watch = (options?: WatchOptions) => {\n const configuration =\n options?.configuration ??\n getConfiguration({\n verbose: true,\n });\n\n const { watch: isWatchMode, watchedFilesPatternWithPath } =\n configuration.content;\n\n /** @ts-ignore remove error Expected 0-1 arguments, but got 2. */\n return chokidarWatch(watchedFilesPatternWithPath, {\n persistent: isWatchMode, // Make the watcher persistent\n ignoreInitial: true, // Process existing files\n ...options,\n })\n .on('add', async (filePath) => {\n const fileName = basename(filePath);\n recentlyAddedFiles.add(fileName);\n\n await handleAdditionalContentDeclarationFile(filePath, configuration);\n\n setTimeout(() => recentlyAddedFiles.delete(fileName), 1000); // Allow time for unlink to trigger if it's a move\n })\n .on(\n 'change',\n async (filePath) =>\n await handleContentDeclarationFileChange(filePath, configuration)\n )\n .on('unlink', async (filePath) => {\n setTimeout(async () => {\n const fileName = basename(filePath);\n\n if (recentlyAddedFiles.has(fileName)) {\n // The file was moved, so ignore unlink\n return;\n }\n\n await handleUnlikedContentDeclarationFile(filePath, configuration);\n }, 300); // Allow time for unlink to trigger if it's a move\n })\n .on('error', async (error) => {\n appLogger('Watcher error: ' + error, {\n level: 'error',\n });\n\n appLogger('Restarting watcher');\n\n await prepareIntlayer(configuration);\n });\n};\n\nexport const buildAndWatchIntlayer = async (options?: WatchOptions) => {\n const configuration = options?.configuration ?? getConfiguration();\n\n await prepareIntlayer(configuration);\n\n if (configuration.content.watch || options.persistent) {\n // Start watching (assuming watch is also async)\n watch({ ...options, configuration });\n }\n};\n"],"mappings":"AAAA;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU,gBAAgB;AAEnC,SAA+B,SAAS,qBAAqB;AAC7D,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,kCAAkC;AAC3C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,MAAM,qBAAqB,oBAAI,IAAY;AAEpC,MAAM,yCAAyC,OACpD,UACA,kBACG;AACH,QAAM,EAAE,QAAQ,IACd,iBACA,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AAGH;AAAA,IACE,6BAA6B,SAAS,QAAQ,SAAS,QAAQ,CAAC;AAAA,IAChE;AAAA,MACE,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM,sBAAsB,QAAQ;AAE/D,QAAM,oBAAoB,MAAM,gBAAgB,kBAAkB;AAElE,cAAY,iBAAiB;AAE7B,6BAA2B;AAE3B,YAAU,sBAAsB;AAAA,IAC9B,WAAW;AAAA,EACb,CAAC;AAED,2BAAyB;AAEzB,YAAU,6BAA6B;AAAA,IACrC,WAAW;AAAA,EACb,CAAC;AACH;AAEO,MAAM,sCAAsC,OACjD,UACA,kBACG;AACH,QAAM,EAAE,QAAQ,IACd,iBACA,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AAGH,YAAU,sBAAsB,SAAS,QAAQ,SAAS,QAAQ,CAAC,IAAI;AAAA,IACrE,WAAW;AAAA,EACb,CAAC;AAED,QAAM,QAAkB,iBAAiB,aAAa;AAEtD,QAAM,qBAAqB,MAAM,sBAAsB,KAAK;AAE5D,QAAM,oBAAoB,MAAM,gBAAgB,kBAAkB;AAElE,cAAY,iBAAiB;AAE7B,6BAA2B;AAE3B,YAAU,wBAAwB;AAAA,IAChC,WAAW;AAAA,EACb,CAAC;AAED,2BAAyB;AAEzB,YAAU,6BAA6B;AAAA,IACrC,WAAW;AAAA,EACb,CAAC;AACH;AAEO,MAAM,qCAAqC,OAChD,UACA,kBACG;AACH,QAAM,EAAE,QAAQ,IACd,iBACA,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AAGH,YAAU,oBAAoB,SAAS,QAAQ,SAAS,QAAQ,CAAC,IAAI;AAAA,IACnE,WAAW;AAAA,EACb,CAAC;AAED,QAAM,qBAAqB,MAAM,sBAAsB,QAAQ;AAE/D,QAAM,2BAA2B,MAAM,gBAAgB,kBAAkB;AACzE,QAAM,uBAAiC,yBAAyB;AAEhE,cAAY,wBAAwB;AACpC,YAAU,0BAA0B;AAAA,IAClC,WAAW;AAAA,EACb,CAAC;AAED,MACE,yBAAyB;AAAA,IACvB,CAAC,0BACC,CAAC,qBAAqB,SAAS,qBAAqB;AAAA,EACxD,GACA;AACA,+BAA2B;AAE3B,cAAU,yBAAyB;AAAA,MACjC,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAOO,MAAM,QAAQ,CAAC,YAA2B;AAC/C,QAAM,gBACJ,SAAS,iBACT,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AAEH,QAAM,EAAE,OAAO,aAAa,4BAA4B,IACtD,cAAc;AAGhB,SAAO,cAAc,6BAA6B;AAAA,IAChD,YAAY;AAAA;AAAA,IACZ,eAAe;AAAA;AAAA,IACf,GAAG;AAAA,EACL,CAAC,EACE,GAAG,OAAO,OAAO,aAAa;AAC7B,UAAM,WAAW,SAAS,QAAQ;AAClC,uBAAmB,IAAI,QAAQ;AAE/B,UAAM,uCAAuC,UAAU,aAAa;AAEpE,eAAW,MAAM,mBAAmB,OAAO,QAAQ,GAAG,GAAI;AAAA,EAC5D,CAAC,EACA;AAAA,IACC;AAAA,IACA,OAAO,aACL,MAAM,mCAAmC,UAAU,aAAa;AAAA,EACpE,EACC,GAAG,UAAU,OAAO,aAAa;AAChC,eAAW,YAAY;AACrB,YAAM,WAAW,SAAS,QAAQ;AAElC,UAAI,mBAAmB,IAAI,QAAQ,GAAG;AAEpC;AAAA,MACF;AAEA,YAAM,oCAAoC,UAAU,aAAa;AAAA,IACnE,GAAG,GAAG;AAAA,EACR,CAAC,EACA,GAAG,SAAS,OAAO,UAAU;AAC5B,cAAU,oBAAoB,OAAO;AAAA,MACnC,OAAO;AAAA,IACT,CAAC;AAED,cAAU,oBAAoB;AAE9B,UAAM,gBAAgB,aAAa;AAAA,EACrC,CAAC;AACL;AAEO,MAAM,wBAAwB,OAAO,YAA2B;AACrE,QAAM,gBAAgB,SAAS,iBAAiB,iBAAiB;AAEjE,QAAM,gBAAgB,aAAa;AAEnC,MAAI,cAAc,QAAQ,SAAS,QAAQ,YAAY;AAErD,UAAM,EAAE,GAAG,SAAS,cAAc,CAAC;AAAA,EACrC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/chokidar/watcher.ts"],"sourcesContent":["import {\n GetConfigurationOptions,\n type IntlayerConfig,\n getAppLogger,\n getConfiguration,\n} from '@intlayer/config';\nimport { basename, relative } from 'path';\n/** @ts-ignore remove error Module '\"chokidar\"' has no exported member 'ChokidarOptions' */\nimport { type ChokidarOptions, watch as chokidarWatch } from 'chokidar';\nimport { getBuiltDictionariesPath } from '../getBuiltDictionariesPath';\nimport { listDictionaries } from '../listDictionariesPath';\nimport { loadLocalDictionaries } from '../loadDictionaries/loadLocalDictionaries';\nimport { prepareIntlayer } from '../prepareIntlayer';\nimport { buildDictionary } from '../transpiler/declaration_file_to_dictionary/index';\nimport { createDictionaryEntryPoint } from '../transpiler/dictionary_to_main/createDictionaryEntryPoint';\nimport {\n createModuleAugmentation,\n createTypes,\n} from '../transpiler/dictionary_to_type/index';\n\nconst recentlyAddedFiles = new Set<string>();\n\nexport const handleAdditionalContentDeclarationFile = async (\n filePath: string,\n configuration?: IntlayerConfig\n) => {\n const config = configuration ?? getConfiguration();\n const appLogger = getAppLogger(config);\n const { content } = config;\n\n // Process the file with the functionToRun\n appLogger(\n `Additional file detected: ${relative(content.baseDir, filePath)}`,\n {\n isVerbose: true,\n }\n );\n\n const localeDictionaries = await loadLocalDictionaries(filePath);\n\n const dictionariesPaths = await buildDictionary(localeDictionaries);\n\n createTypes(dictionariesPaths);\n\n createDictionaryEntryPoint();\n\n appLogger('Dictionaries built', {\n isVerbose: true,\n });\n\n createModuleAugmentation();\n\n appLogger('Module augmentation built', {\n isVerbose: true,\n });\n};\n\nexport const handleUnlikedContentDeclarationFile = async (\n filePath: string,\n configuration?: IntlayerConfig\n) => {\n const config = configuration ?? getConfiguration();\n const appLogger = getAppLogger(config);\n const { content } = config;\n\n // Process the file with the functionToRun\n appLogger(`Unlinked detected: ${relative(content.baseDir, filePath)}`, {\n isVerbose: true,\n });\n\n const files: string[] = listDictionaries(configuration);\n\n const localeDictionaries = await loadLocalDictionaries(files);\n\n const dictionariesPaths = await buildDictionary(localeDictionaries);\n\n createTypes(dictionariesPaths);\n\n createDictionaryEntryPoint();\n\n appLogger('Dictionaries rebuilt', {\n isVerbose: true,\n });\n\n createModuleAugmentation();\n\n appLogger('Module augmentation built', {\n isVerbose: true,\n });\n};\n\nexport const handleContentDeclarationFileChange = async (\n filePath: string,\n configuration?: IntlayerConfig\n) => {\n const config = configuration ?? getConfiguration();\n const appLogger = getAppLogger(config);\n const { content } = config;\n\n // Process the file with the functionToRun\n appLogger(`Change detected: ${relative(content.baseDir, filePath)}`, {\n isVerbose: true,\n });\n\n const localeDictionaries = await loadLocalDictionaries(filePath);\n\n const updatedDictionariesPaths = await buildDictionary(localeDictionaries);\n const allDictionariesPaths: string[] = getBuiltDictionariesPath();\n\n createTypes(updatedDictionariesPaths);\n appLogger('TypeScript types built', {\n isVerbose: true,\n });\n\n if (\n updatedDictionariesPaths.some(\n (updatedDictionaryPath) =>\n !allDictionariesPaths.includes(updatedDictionaryPath)\n )\n ) {\n createDictionaryEntryPoint();\n\n appLogger('Dictionary list built', {\n isVerbose: true,\n });\n }\n};\n\ntype WatchOptions = ChokidarOptions & {\n configuration?: IntlayerConfig;\n configOptions?: GetConfigurationOptions;\n};\n\n// Initialize chokidar watcher (non-persistent)\nexport const watch = (options?: WatchOptions) => {\n const configuration = options?.configuration ?? getConfiguration();\n const appLogger = getAppLogger(configuration);\n\n const { watch: isWatchMode, watchedFilesPatternWithPath } =\n configuration.content;\n\n /** @ts-ignore remove error Expected 0-1 arguments, but got 2. */\n return chokidarWatch(watchedFilesPatternWithPath, {\n persistent: isWatchMode, // Make the watcher persistent\n ignoreInitial: true, // Process existing files\n ...options,\n })\n .on('add', async (filePath) => {\n const fileName = basename(filePath);\n recentlyAddedFiles.add(fileName);\n\n await handleAdditionalContentDeclarationFile(filePath, configuration);\n\n setTimeout(() => recentlyAddedFiles.delete(fileName), 1000); // Allow time for unlink to trigger if it's a move\n })\n .on(\n 'change',\n async (filePath) =>\n await handleContentDeclarationFileChange(filePath, configuration)\n )\n .on('unlink', async (filePath) => {\n setTimeout(async () => {\n const fileName = basename(filePath);\n\n if (recentlyAddedFiles.has(fileName)) {\n // The file was moved, so ignore unlink\n return;\n }\n\n await handleUnlikedContentDeclarationFile(filePath, configuration);\n }, 300); // Allow time for unlink to trigger if it's a move\n })\n .on('error', async (error) => {\n appLogger('Watcher error: ' + error, {\n level: 'error',\n });\n\n appLogger('Restarting watcher');\n\n await prepareIntlayer(configuration);\n });\n};\n\nexport const buildAndWatchIntlayer = async (options?: WatchOptions) => {\n const configuration =\n options?.configuration ?? getConfiguration(options?.configOptions);\n\n await prepareIntlayer(configuration);\n\n if (configuration.content.watch || options.persistent) {\n // Start watching (assuming watch is also async)\n watch({ ...options, configuration });\n }\n};\n"],"mappings":"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","names":[]}
@@ -1,10 +1,11 @@
1
1
  import { getAuthAPI, getDictionaryAPI } from "@intlayer/api";
2
- import { appLogger, getConfiguration } from "@intlayer/config";
2
+ import { getAppLogger, getConfiguration } from "@intlayer/config";
3
3
  import pLimit from "p-limit";
4
4
  import { logger } from "./log.mjs";
5
5
  const fetchDistantDictionaries = async (options) => {
6
+ const config = getConfiguration();
7
+ const appLogger = getAppLogger(config);
6
8
  try {
7
- const config = getConfiguration();
8
9
  const { clientId, clientSecret } = config.editor;
9
10
  const authAPI = getAuthAPI(void 0, config);
10
11
  const dictionaryAPI = getDictionaryAPI(void 0, config);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fetchDistantDictionaries.ts"],"sourcesContent":["import { getAuthAPI, getDictionaryAPI } from '@intlayer/api';\n// @ts-ignore @intlayer/backend is not build yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { appLogger, getConfiguration } from '@intlayer/config';\nimport pLimit from 'p-limit';\nimport { logger } from './log';\n\ntype FetchDistantDictionariesOptions = {\n dictionaryKeys: string[];\n newDictionariesPath?: string;\n logPrefix?: string;\n};\n\n/**\n * Fetch distant dictionaries and update the logger with their statuses.\n */\nexport const fetchDistantDictionaries = async (\n options: FetchDistantDictionariesOptions\n): Promise<DictionaryAPI[]> => {\n try {\n const config = getConfiguration();\n const { clientId, clientSecret } = config.editor;\n const authAPI = getAuthAPI(undefined, config);\n const dictionaryAPI = getDictionaryAPI(undefined, config);\n\n if (!clientId || !clientSecret) {\n throw new Error(\n 'Missing OAuth2 client ID or client secret. To get access token go to https://intlayer.org/dashboard/project.'\n );\n }\n\n const oAuth2TokenResult = await authAPI.getOAuth2AccessToken();\n\n const oAuth2AccessToken = oAuth2TokenResult.data?.accessToken;\n\n const distantDictionariesKeys = options.dictionaryKeys;\n\n // Process dictionaries in parallel with a concurrency limit\n const limit = pLimit(5); // Limit the number of concurrent requests\n\n const processDictionary = async (\n dictionaryKey: string\n ): Promise<DictionaryAPI | undefined> => {\n logger.updateStatus([\n {\n dictionaryKey,\n type: 'distant',\n status: { status: 'fetching' },\n },\n ]);\n\n try {\n // Fetch the dictionary\n const getDictionaryResult = await dictionaryAPI.getDictionary(\n dictionaryKey,\n undefined,\n {\n headers: { Authorization: `Bearer ${oAuth2AccessToken}` },\n }\n );\n\n const distantDictionary = getDictionaryResult.data;\n\n if (!distantDictionary) {\n throw new Error(`Dictionary ${dictionaryKey} not found on remote`);\n }\n\n logger.updateStatus([\n { dictionaryKey, type: 'distant', status: { status: 'imported' } },\n ]);\n\n return distantDictionary;\n } catch (error) {\n logger.updateStatus([\n {\n dictionaryKey,\n type: 'distant',\n status: {\n status: 'error',\n error: error as Error,\n errorMessage: `${options?.logPrefix ?? ''}Error fetching dictionary ${dictionaryKey}: ${error}`,\n },\n },\n ]);\n return undefined;\n }\n };\n\n const fetchPromises = distantDictionariesKeys.map((dictionaryKey) =>\n limit(async () => await processDictionary(dictionaryKey))\n );\n\n const result = await Promise.all(fetchPromises);\n\n // Output any error messages\n const statuses = logger.getStatuses();\n for (const statusObj of statuses) {\n const currentState = statusObj.state.find((s) => s.type === 'distant');\n if (currentState && currentState.errorMessage) {\n appLogger(currentState.errorMessage, { level: 'error' });\n }\n }\n\n // Remove undefined values\n const filteredResult = result.filter(\n (dict): dict is DictionaryAPI => dict !== undefined\n );\n\n return filteredResult;\n } catch (error) {\n appLogger(error, { level: 'error' });\n return [];\n }\n};\n"],"mappings":"AAAA,SAAS,YAAY,wBAAwB;AAG7C,SAAS,WAAW,wBAAwB;AAC5C,OAAO,YAAY;AACnB,SAAS,cAAc;AAWhB,MAAM,2BAA2B,OACtC,YAC6B;AAC7B,MAAI;AACF,UAAM,SAAS,iBAAiB;AAChC,UAAM,EAAE,UAAU,aAAa,IAAI,OAAO;AAC1C,UAAM,UAAU,WAAW,QAAW,MAAM;AAC5C,UAAM,gBAAgB,iBAAiB,QAAW,MAAM;AAExD,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM,QAAQ,qBAAqB;AAE7D,UAAM,oBAAoB,kBAAkB,MAAM;AAElD,UAAM,0BAA0B,QAAQ;AAGxC,UAAM,QAAQ,OAAO,CAAC;AAEtB,UAAM,oBAAoB,OACxB,kBACuC;AACvC,aAAO,aAAa;AAAA,QAClB;AAAA,UACE;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,EAAE,QAAQ,WAAW;AAAA,QAC/B;AAAA,MACF,CAAC;AAED,UAAI;AAEF,cAAM,sBAAsB,MAAM,cAAc;AAAA,UAC9C;AAAA,UACA;AAAA,UACA;AAAA,YACE,SAAS,EAAE,eAAe,UAAU,iBAAiB,GAAG;AAAA,UAC1D;AAAA,QACF;AAEA,cAAM,oBAAoB,oBAAoB;AAE9C,YAAI,CAAC,mBAAmB;AACtB,gBAAM,IAAI,MAAM,cAAc,aAAa,sBAAsB;AAAA,QACnE;AAEA,eAAO,aAAa;AAAA,UAClB,EAAE,eAAe,MAAM,WAAW,QAAQ,EAAE,QAAQ,WAAW,EAAE;AAAA,QACnE,CAAC;AAED,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,aAAa;AAAA,UAClB;AAAA,YACE;AAAA,YACA,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,QAAQ;AAAA,cACR;AAAA,cACA,cAAc,GAAG,SAAS,aAAa,EAAE,6BAA6B,aAAa,KAAK,KAAK;AAAA,YAC/F;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,gBAAgB,wBAAwB;AAAA,MAAI,CAAC,kBACjD,MAAM,YAAY,MAAM,kBAAkB,aAAa,CAAC;AAAA,IAC1D;AAEA,UAAM,SAAS,MAAM,QAAQ,IAAI,aAAa;AAG9C,UAAM,WAAW,OAAO,YAAY;AACpC,eAAW,aAAa,UAAU;AAChC,YAAM,eAAe,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACrE,UAAI,gBAAgB,aAAa,cAAc;AAC7C,kBAAU,aAAa,cAAc,EAAE,OAAO,QAAQ,CAAC;AAAA,MACzD;AAAA,IACF;AAGA,UAAM,iBAAiB,OAAO;AAAA,MAC5B,CAAC,SAAgC,SAAS;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,cAAU,OAAO,EAAE,OAAO,QAAQ,CAAC;AACnC,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/fetchDistantDictionaries.ts"],"sourcesContent":["import { getAuthAPI, getDictionaryAPI } from '@intlayer/api';\n// @ts-ignore @intlayer/backend is not build yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { getAppLogger, getConfiguration } from '@intlayer/config';\nimport pLimit from 'p-limit';\nimport { logger } from './log';\n\ntype FetchDistantDictionariesOptions = {\n dictionaryKeys: string[];\n newDictionariesPath?: string;\n logPrefix?: string;\n};\n\n/**\n * Fetch distant dictionaries and update the logger with their statuses.\n */\nexport const fetchDistantDictionaries = async (\n options: FetchDistantDictionariesOptions\n): Promise<DictionaryAPI[]> => {\n const config = getConfiguration();\n const appLogger = getAppLogger(config);\n try {\n const { clientId, clientSecret } = config.editor;\n const authAPI = getAuthAPI(undefined, config);\n const dictionaryAPI = getDictionaryAPI(undefined, config);\n\n if (!clientId || !clientSecret) {\n throw new Error(\n 'Missing OAuth2 client ID or client secret. To get access token go to https://intlayer.org/dashboard/project.'\n );\n }\n\n const oAuth2TokenResult = await authAPI.getOAuth2AccessToken();\n\n const oAuth2AccessToken = oAuth2TokenResult.data?.accessToken;\n\n const distantDictionariesKeys = options.dictionaryKeys;\n\n // Process dictionaries in parallel with a concurrency limit\n const limit = pLimit(5); // Limit the number of concurrent requests\n\n const processDictionary = async (\n dictionaryKey: string\n ): Promise<DictionaryAPI | undefined> => {\n logger.updateStatus([\n {\n dictionaryKey,\n type: 'distant',\n status: { status: 'fetching' },\n },\n ]);\n\n try {\n // Fetch the dictionary\n const getDictionaryResult = await dictionaryAPI.getDictionary(\n dictionaryKey,\n undefined,\n {\n headers: { Authorization: `Bearer ${oAuth2AccessToken}` },\n }\n );\n\n const distantDictionary = getDictionaryResult.data;\n\n if (!distantDictionary) {\n throw new Error(`Dictionary ${dictionaryKey} not found on remote`);\n }\n\n logger.updateStatus([\n { dictionaryKey, type: 'distant', status: { status: 'imported' } },\n ]);\n\n return distantDictionary;\n } catch (error) {\n logger.updateStatus([\n {\n dictionaryKey,\n type: 'distant',\n status: {\n status: 'error',\n error: error as Error,\n errorMessage: `${options?.logPrefix ?? ''}Error fetching dictionary ${dictionaryKey}: ${error}`,\n },\n },\n ]);\n return undefined;\n }\n };\n\n const fetchPromises = distantDictionariesKeys.map((dictionaryKey) =>\n limit(async () => await processDictionary(dictionaryKey))\n );\n\n const result = await Promise.all(fetchPromises);\n\n // Output any error messages\n const statuses = logger.getStatuses();\n for (const statusObj of statuses) {\n const currentState = statusObj.state.find((s) => s.type === 'distant');\n if (currentState && currentState.errorMessage) {\n appLogger(currentState.errorMessage, { level: 'error' });\n }\n }\n\n // Remove undefined values\n const filteredResult = result.filter(\n (dict): dict is DictionaryAPI => dict !== undefined\n );\n\n return filteredResult;\n } catch (error) {\n appLogger(error, { level: 'error' });\n return [];\n }\n};\n"],"mappings":"AAAA,SAAS,YAAY,wBAAwB;AAG7C,SAAS,cAAc,wBAAwB;AAC/C,OAAO,YAAY;AACnB,SAAS,cAAc;AAWhB,MAAM,2BAA2B,OACtC,YAC6B;AAC7B,QAAM,SAAS,iBAAiB;AAChC,QAAM,YAAY,aAAa,MAAM;AACrC,MAAI;AACF,UAAM,EAAE,UAAU,aAAa,IAAI,OAAO;AAC1C,UAAM,UAAU,WAAW,QAAW,MAAM;AAC5C,UAAM,gBAAgB,iBAAiB,QAAW,MAAM;AAExD,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM,QAAQ,qBAAqB;AAE7D,UAAM,oBAAoB,kBAAkB,MAAM;AAElD,UAAM,0BAA0B,QAAQ;AAGxC,UAAM,QAAQ,OAAO,CAAC;AAEtB,UAAM,oBAAoB,OACxB,kBACuC;AACvC,aAAO,aAAa;AAAA,QAClB;AAAA,UACE;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,EAAE,QAAQ,WAAW;AAAA,QAC/B;AAAA,MACF,CAAC;AAED,UAAI;AAEF,cAAM,sBAAsB,MAAM,cAAc;AAAA,UAC9C;AAAA,UACA;AAAA,UACA;AAAA,YACE,SAAS,EAAE,eAAe,UAAU,iBAAiB,GAAG;AAAA,UAC1D;AAAA,QACF;AAEA,cAAM,oBAAoB,oBAAoB;AAE9C,YAAI,CAAC,mBAAmB;AACtB,gBAAM,IAAI,MAAM,cAAc,aAAa,sBAAsB;AAAA,QACnE;AAEA,eAAO,aAAa;AAAA,UAClB,EAAE,eAAe,MAAM,WAAW,QAAQ,EAAE,QAAQ,WAAW,EAAE;AAAA,QACnE,CAAC;AAED,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,aAAa;AAAA,UAClB;AAAA,YACE;AAAA,YACA,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,QAAQ;AAAA,cACR;AAAA,cACA,cAAc,GAAG,SAAS,aAAa,EAAE,6BAA6B,aAAa,KAAK,KAAK;AAAA,YAC/F;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,gBAAgB,wBAAwB;AAAA,MAAI,CAAC,kBACjD,MAAM,YAAY,MAAM,kBAAkB,aAAa,CAAC;AAAA,IAC1D;AAEA,UAAM,SAAS,MAAM,QAAQ,IAAI,aAAa;AAG9C,UAAM,WAAW,OAAO,YAAY;AACpC,eAAW,aAAa,UAAU;AAChC,YAAM,eAAe,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACrE,UAAI,gBAAgB,aAAa,cAAc;AAC7C,kBAAU,aAAa,cAAc,EAAE,OAAO,QAAQ,CAAC;AAAA,MACzD;AAAA,IACF;AAGA,UAAM,iBAAiB,OAAO;AAAA,MAC5B,CAAC,SAAgC,SAAS;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,cAAU,OAAO,EAAE,OAAO,QAAQ,CAAC;AACnC,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
@@ -1,4 +1,5 @@
1
- import { appLogger } from "@intlayer/config";
1
+ import { getAppLogger } from "@intlayer/config";
2
+ import configuration from "@intlayer/config/built";
2
3
  import { join } from "path";
3
4
  import simpleGit from "simple-git";
4
5
  const getGitRootDir = async () => {
@@ -7,6 +8,7 @@ const getGitRootDir = async () => {
7
8
  const rootDir = await git.revparse(["--show-toplevel"]);
8
9
  return rootDir.trim();
9
10
  } catch (error) {
11
+ const appLogger = getAppLogger(configuration);
10
12
  appLogger("Error getting git root directory:" + error, {
11
13
  level: "error"
12
14
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/listGitFiles.ts"],"sourcesContent":["import { appLogger } from '@intlayer/config';\nimport { join } from 'path';\nimport simpleGit from 'simple-git';\n\nexport type DiffMode = 'gitDiff' | 'uncommitted' | 'unpushed' | 'untracked';\n\nconst getGitRootDir = async (): Promise<string | null> => {\n try {\n const git = simpleGit();\n const rootDir = await git.revparse(['--show-toplevel']);\n return rootDir.trim();\n } catch (error) {\n appLogger('Error getting git root directory:' + error, {\n level: 'error',\n });\n return null;\n }\n};\n\nexport type ListGitFilesOptions = {\n mode: DiffMode[];\n baseRef?: string;\n currentRef?: string;\n absolute?: boolean;\n};\n\nexport const listGitFiles = async ({\n mode,\n baseRef = 'origin/main',\n currentRef = 'HEAD', // HEAD points to the current branch's latest commit\n absolute = true,\n}: ListGitFilesOptions) => {\n try {\n const git = simpleGit();\n const diff: Set<string> = new Set();\n\n if (mode.includes('untracked')) {\n const status = await git.status();\n status.not_added.forEach((f) => diff.add(f));\n }\n\n if (mode.includes('uncommitted')) {\n // Get uncommitted changes\n const uncommittedDiff = await git.diff(['--name-only', 'HEAD']);\n\n const uncommittedFiles = uncommittedDiff.split('\\n').filter(Boolean);\n\n uncommittedFiles.forEach((file) => diff.add(file));\n }\n\n if (mode.includes('unpushed')) {\n // Get unpushed commits\n const unpushedDiff = await git.diff(['--name-only', '@{push}...HEAD']);\n\n const unpushedFiles = unpushedDiff.split('\\n').filter(Boolean);\n\n unpushedFiles.forEach((file) => diff.add(file));\n }\n\n if (mode.includes('gitDiff')) {\n // Get the base branch (usually main/master) from CI environment\n\n await git.fetch(baseRef);\n\n const diffBranch = await git.diff([\n '--name-only',\n `${baseRef}...${currentRef}`,\n ]);\n\n const gitDiffFiles = diffBranch.split('\\n').filter(Boolean);\n\n gitDiffFiles.forEach((file) => diff.add(file));\n }\n\n if (absolute) {\n const gitRootDir = await getGitRootDir();\n if (!gitRootDir) {\n return [];\n }\n return Array.from(diff).map((file) => join(gitRootDir, file));\n }\n\n return Array.from(diff);\n } catch (error) {\n console.warn('Failed to get changes list:', error);\n }\n};\n"],"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AACrB,OAAO,eAAe;AAItB,MAAM,gBAAgB,YAAoC;AACxD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,UAAU,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC;AACtD,WAAO,QAAQ,KAAK;AAAA,EACtB,SAAS,OAAO;AACd,cAAU,sCAAsC,OAAO;AAAA,MACrD,OAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,EACT;AACF;AASO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA,UAAU;AAAA,EACV,aAAa;AAAA;AAAA,EACb,WAAW;AACb,MAA2B;AACzB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,OAAoB,oBAAI,IAAI;AAElC,QAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,YAAM,SAAS,MAAM,IAAI,OAAO;AAChC,aAAO,UAAU,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,IAC7C;AAEA,QAAI,KAAK,SAAS,aAAa,GAAG;AAEhC,YAAM,kBAAkB,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC;AAE9D,YAAM,mBAAmB,gBAAgB,MAAM,IAAI,EAAE,OAAO,OAAO;AAEnE,uBAAiB,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,IACnD;AAEA,QAAI,KAAK,SAAS,UAAU,GAAG;AAE7B,YAAM,eAAe,MAAM,IAAI,KAAK,CAAC,eAAe,gBAAgB,CAAC;AAErE,YAAM,gBAAgB,aAAa,MAAM,IAAI,EAAE,OAAO,OAAO;AAE7D,oBAAc,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,IAChD;AAEA,QAAI,KAAK,SAAS,SAAS,GAAG;AAG5B,YAAM,IAAI,MAAM,OAAO;AAEvB,YAAM,aAAa,MAAM,IAAI,KAAK;AAAA,QAChC;AAAA,QACA,GAAG,OAAO,MAAM,UAAU;AAAA,MAC5B,CAAC;AAED,YAAM,eAAe,WAAW,MAAM,IAAI,EAAE,OAAO,OAAO;AAE1D,mBAAa,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,IAC/C;AAEA,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,cAAc;AACvC,UAAI,CAAC,YAAY;AACf,eAAO,CAAC;AAAA,MACV;AACA,aAAO,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,IAC9D;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,KAAK,+BAA+B,KAAK;AAAA,EACnD;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/listGitFiles.ts"],"sourcesContent":["import { getAppLogger } from '@intlayer/config';\nimport configuration from '@intlayer/config/built';\nimport { join } from 'path';\nimport simpleGit from 'simple-git';\n\nexport type DiffMode = 'gitDiff' | 'uncommitted' | 'unpushed' | 'untracked';\n\nconst getGitRootDir = async (): Promise<string | null> => {\n try {\n const git = simpleGit();\n const rootDir = await git.revparse(['--show-toplevel']);\n return rootDir.trim();\n } catch (error) {\n const appLogger = getAppLogger(configuration);\n appLogger('Error getting git root directory:' + error, {\n level: 'error',\n });\n return null;\n }\n};\n\nexport type ListGitFilesOptions = {\n mode: DiffMode[];\n baseRef?: string;\n currentRef?: string;\n absolute?: boolean;\n};\n\nexport const listGitFiles = async ({\n mode,\n baseRef = 'origin/main',\n currentRef = 'HEAD', // HEAD points to the current branch's latest commit\n absolute = true,\n}: ListGitFilesOptions) => {\n try {\n const git = simpleGit();\n const diff: Set<string> = new Set();\n\n if (mode.includes('untracked')) {\n const status = await git.status();\n status.not_added.forEach((f) => diff.add(f));\n }\n\n if (mode.includes('uncommitted')) {\n // Get uncommitted changes\n const uncommittedDiff = await git.diff(['--name-only', 'HEAD']);\n\n const uncommittedFiles = uncommittedDiff.split('\\n').filter(Boolean);\n\n uncommittedFiles.forEach((file) => diff.add(file));\n }\n\n if (mode.includes('unpushed')) {\n // Get unpushed commits\n const unpushedDiff = await git.diff(['--name-only', '@{push}...HEAD']);\n\n const unpushedFiles = unpushedDiff.split('\\n').filter(Boolean);\n\n unpushedFiles.forEach((file) => diff.add(file));\n }\n\n if (mode.includes('gitDiff')) {\n // Get the base branch (usually main/master) from CI environment\n\n await git.fetch(baseRef);\n\n const diffBranch = await git.diff([\n '--name-only',\n `${baseRef}...${currentRef}`,\n ]);\n\n const gitDiffFiles = diffBranch.split('\\n').filter(Boolean);\n\n gitDiffFiles.forEach((file) => diff.add(file));\n }\n\n if (absolute) {\n const gitRootDir = await getGitRootDir();\n if (!gitRootDir) {\n return [];\n }\n return Array.from(diff).map((file) => join(gitRootDir, file));\n }\n\n return Array.from(diff);\n } catch (error) {\n console.warn('Failed to get changes list:', error);\n }\n};\n"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,OAAO,mBAAmB;AAC1B,SAAS,YAAY;AACrB,OAAO,eAAe;AAItB,MAAM,gBAAgB,YAAoC;AACxD,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,UAAU,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC;AACtD,WAAO,QAAQ,KAAK;AAAA,EACtB,SAAS,OAAO;AACd,UAAM,YAAY,aAAa,aAAa;AAC5C,cAAU,sCAAsC,OAAO;AAAA,MACrD,OAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,EACT;AACF;AASO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA,UAAU;AAAA,EACV,aAAa;AAAA;AAAA,EACb,WAAW;AACb,MAA2B;AACzB,MAAI;AACF,UAAM,MAAM,UAAU;AACtB,UAAM,OAAoB,oBAAI,IAAI;AAElC,QAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,YAAM,SAAS,MAAM,IAAI,OAAO;AAChC,aAAO,UAAU,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,IAC7C;AAEA,QAAI,KAAK,SAAS,aAAa,GAAG;AAEhC,YAAM,kBAAkB,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC;AAE9D,YAAM,mBAAmB,gBAAgB,MAAM,IAAI,EAAE,OAAO,OAAO;AAEnE,uBAAiB,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,IACnD;AAEA,QAAI,KAAK,SAAS,UAAU,GAAG;AAE7B,YAAM,eAAe,MAAM,IAAI,KAAK,CAAC,eAAe,gBAAgB,CAAC;AAErE,YAAM,gBAAgB,aAAa,MAAM,IAAI,EAAE,OAAO,OAAO;AAE7D,oBAAc,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,IAChD;AAEA,QAAI,KAAK,SAAS,SAAS,GAAG;AAG5B,YAAM,IAAI,MAAM,OAAO;AAEvB,YAAM,aAAa,MAAM,IAAI,KAAK;AAAA,QAChC;AAAA,QACA,GAAG,OAAO,MAAM,UAAU;AAAA,MAC5B,CAAC;AAED,YAAM,eAAe,WAAW,MAAM,IAAI,EAAE,OAAO,OAAO;AAE1D,mBAAa,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,IAC/C;AAEA,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,cAAc;AACvC,UAAI,CAAC,YAAY;AACf,eAAO,CAAC;AAAA,MACV;AACA,aAAO,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,IAC9D;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,KAAK,+BAA+B,KAAK;AAAA,EACnD;AACF;","names":[]}
@@ -1,4 +1,8 @@
1
- import { appLogger, ESMxCJSRequire, getConfiguration } from "@intlayer/config";
1
+ import {
2
+ ESMxCJSRequire,
3
+ getAppLogger,
4
+ getConfiguration
5
+ } from "@intlayer/config";
2
6
  import { fetchDistantDictionaryKeys } from "../fetchDistantDictionaryKeys.mjs";
3
7
  import { logger } from "../log.mjs";
4
8
  import { sortAlphabetically } from "../utils.mjs";
@@ -6,6 +10,7 @@ import { loadContentDeclarations } from "./loadContentDeclaration.mjs";
6
10
  import { loadDistantDictionaries } from "./loadDistantDictionaries.mjs";
7
11
  const loadDictionaries = async (contentDeclarationsPaths, configuration = getConfiguration(), projectRequire = ESMxCJSRequire) => {
8
12
  try {
13
+ const appLogger = getAppLogger(configuration);
9
14
  const { editor } = configuration;
10
15
  appLogger("Dictionaries:", { isVerbose: true });
11
16
  const files = Array.isArray(contentDeclarationsPaths) ? contentDeclarationsPaths : [contentDeclarationsPaths];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/loadDictionaries/loadDictionaries.ts"],"sourcesContent":["// @ts-ignore @intlayer/backend is not build yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { appLogger, ESMxCJSRequire, getConfiguration } from '@intlayer/config';\nimport type { Dictionary } from '@intlayer/core';\nimport { fetchDistantDictionaryKeys } from '../fetchDistantDictionaryKeys';\nimport { logger } from '../log';\nimport { sortAlphabetically } from '../utils';\nimport { loadContentDeclarations } from './loadContentDeclaration';\nimport { loadDistantDictionaries } from './loadDistantDictionaries';\n\nexport const loadDictionaries = async (\n contentDeclarationsPaths: string[] | string,\n configuration = getConfiguration(),\n projectRequire = ESMxCJSRequire\n): Promise<Dictionary[]> => {\n try {\n const { editor } = configuration;\n\n appLogger('Dictionaries:', { isVerbose: true });\n\n const files = Array.isArray(contentDeclarationsPaths)\n ? contentDeclarationsPaths\n : [contentDeclarationsPaths];\n\n const localDictionaries: Dictionary[] = await loadContentDeclarations(\n files,\n projectRequire\n );\n const localDictionaryKeys = localDictionaries\n .map((dict) => dict.key)\n .filter(Boolean); // Remove empty or undefined keys\n\n // Initialize the logger with both local and distant dictionaries\n logger.init(localDictionaryKeys, []);\n\n // Update logger statuses for local dictionaries\n logger.updateStatus(\n localDictionaries.map((dict) => ({\n dictionaryKey: dict.key,\n type: 'local',\n status: { status: 'built' },\n }))\n );\n\n let distantDictionaries: DictionaryAPI[] = [];\n let distantDictionaryKeys: string[] = [];\n\n if (editor.clientId && editor.clientSecret) {\n try {\n // Fetch distant dictionary keys\n distantDictionaryKeys = await fetchDistantDictionaryKeys();\n\n const orderedDistantDictionaryKeys =\n distantDictionaryKeys.sort(sortAlphabetically);\n\n // Add distant dictionaries to the logger\n logger.addDictionaryKeys('distant', orderedDistantDictionaryKeys);\n\n // Fetch distant dictionaries\n distantDictionaries = await loadDistantDictionaries({\n dictionaryKeys: orderedDistantDictionaryKeys,\n });\n } catch (_error) {\n appLogger('Error during fetching distant dictionaries', {\n level: 'error',\n });\n }\n }\n\n // Ensure the logger is stopped\n logger.stop();\n\n return [...localDictionaries, ...distantDictionaries];\n } catch (error) {\n // Ensure the logger is stopped\n logger.stop();\n\n throw error; // Re-throw the error after logging\n }\n};\n"],"mappings":"AAEA,SAAS,WAAW,gBAAgB,wBAAwB;AAE5D,SAAS,kCAAkC;AAC3C,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AAEjC,MAAM,mBAAmB,OAC9B,0BACA,gBAAgB,iBAAiB,GACjC,iBAAiB,mBACS;AAC1B,MAAI;AACF,UAAM,EAAE,OAAO,IAAI;AAEnB,cAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAE9C,UAAM,QAAQ,MAAM,QAAQ,wBAAwB,IAChD,2BACA,CAAC,wBAAwB;AAE7B,UAAM,oBAAkC,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AACA,UAAM,sBAAsB,kBACzB,IAAI,CAAC,SAAS,KAAK,GAAG,EACtB,OAAO,OAAO;AAGjB,WAAO,KAAK,qBAAqB,CAAC,CAAC;AAGnC,WAAO;AAAA,MACL,kBAAkB,IAAI,CAAC,UAAU;AAAA,QAC/B,eAAe,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,QAAQ,EAAE,QAAQ,QAAQ;AAAA,MAC5B,EAAE;AAAA,IACJ;AAEA,QAAI,sBAAuC,CAAC;AAC5C,QAAI,wBAAkC,CAAC;AAEvC,QAAI,OAAO,YAAY,OAAO,cAAc;AAC1C,UAAI;AAEF,gCAAwB,MAAM,2BAA2B;AAEzD,cAAM,+BACJ,sBAAsB,KAAK,kBAAkB;AAG/C,eAAO,kBAAkB,WAAW,4BAA4B;AAGhE,8BAAsB,MAAM,wBAAwB;AAAA,UAClD,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH,SAAS,QAAQ;AACf,kBAAU,8CAA8C;AAAA,UACtD,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,KAAK;AAEZ,WAAO,CAAC,GAAG,mBAAmB,GAAG,mBAAmB;AAAA,EACtD,SAAS,OAAO;AAEd,WAAO,KAAK;AAEZ,UAAM;AAAA,EACR;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/loadDictionaries/loadDictionaries.ts"],"sourcesContent":["// @ts-ignore @intlayer/backend is not build yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport {\n ESMxCJSRequire,\n getAppLogger,\n getConfiguration,\n} from '@intlayer/config';\nimport type { Dictionary } from '@intlayer/core';\nimport { fetchDistantDictionaryKeys } from '../fetchDistantDictionaryKeys';\nimport { logger } from '../log';\nimport { sortAlphabetically } from '../utils';\nimport { loadContentDeclarations } from './loadContentDeclaration';\nimport { loadDistantDictionaries } from './loadDistantDictionaries';\n\nexport const loadDictionaries = async (\n contentDeclarationsPaths: string[] | string,\n configuration = getConfiguration(),\n projectRequire = ESMxCJSRequire\n): Promise<Dictionary[]> => {\n try {\n const appLogger = getAppLogger(configuration);\n const { editor } = configuration;\n\n appLogger('Dictionaries:', { isVerbose: true });\n\n const files = Array.isArray(contentDeclarationsPaths)\n ? contentDeclarationsPaths\n : [contentDeclarationsPaths];\n\n const localDictionaries: Dictionary[] = await loadContentDeclarations(\n files,\n projectRequire\n );\n const localDictionaryKeys = localDictionaries\n .map((dict) => dict.key)\n .filter(Boolean); // Remove empty or undefined keys\n\n // Initialize the logger with both local and distant dictionaries\n logger.init(localDictionaryKeys, []);\n\n // Update logger statuses for local dictionaries\n logger.updateStatus(\n localDictionaries.map((dict) => ({\n dictionaryKey: dict.key,\n type: 'local',\n status: { status: 'built' },\n }))\n );\n\n let distantDictionaries: DictionaryAPI[] = [];\n let distantDictionaryKeys: string[] = [];\n\n if (editor.clientId && editor.clientSecret) {\n try {\n // Fetch distant dictionary keys\n distantDictionaryKeys = await fetchDistantDictionaryKeys();\n\n const orderedDistantDictionaryKeys =\n distantDictionaryKeys.sort(sortAlphabetically);\n\n // Add distant dictionaries to the logger\n logger.addDictionaryKeys('distant', orderedDistantDictionaryKeys);\n\n // Fetch distant dictionaries\n distantDictionaries = await loadDistantDictionaries({\n dictionaryKeys: orderedDistantDictionaryKeys,\n });\n } catch (_error) {\n appLogger('Error during fetching distant dictionaries', {\n level: 'error',\n });\n }\n }\n\n // Ensure the logger is stopped\n logger.stop();\n\n return [...localDictionaries, ...distantDictionaries];\n } catch (error) {\n // Ensure the logger is stopped\n logger.stop();\n\n throw error; // Re-throw the error after logging\n }\n};\n"],"mappings":"AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,kCAAkC;AAC3C,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AAEjC,MAAM,mBAAmB,OAC9B,0BACA,gBAAgB,iBAAiB,GACjC,iBAAiB,mBACS;AAC1B,MAAI;AACF,UAAM,YAAY,aAAa,aAAa;AAC5C,UAAM,EAAE,OAAO,IAAI;AAEnB,cAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAE9C,UAAM,QAAQ,MAAM,QAAQ,wBAAwB,IAChD,2BACA,CAAC,wBAAwB;AAE7B,UAAM,oBAAkC,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AACA,UAAM,sBAAsB,kBACzB,IAAI,CAAC,SAAS,KAAK,GAAG,EACtB,OAAO,OAAO;AAGjB,WAAO,KAAK,qBAAqB,CAAC,CAAC;AAGnC,WAAO;AAAA,MACL,kBAAkB,IAAI,CAAC,UAAU;AAAA,QAC/B,eAAe,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,QAAQ,EAAE,QAAQ,QAAQ;AAAA,MAC5B,EAAE;AAAA,IACJ;AAEA,QAAI,sBAAuC,CAAC;AAC5C,QAAI,wBAAkC,CAAC;AAEvC,QAAI,OAAO,YAAY,OAAO,cAAc;AAC1C,UAAI;AAEF,gCAAwB,MAAM,2BAA2B;AAEzD,cAAM,+BACJ,sBAAsB,KAAK,kBAAkB;AAG/C,eAAO,kBAAkB,WAAW,4BAA4B;AAGhE,8BAAsB,MAAM,wBAAwB;AAAA,UAClD,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH,SAAS,QAAQ;AACf,kBAAU,8CAA8C;AAAA,UACtD,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,KAAK;AAEZ,WAAO,CAAC,GAAG,mBAAmB,GAAG,mBAAmB;AAAA,EACtD,SAAS,OAAO;AAEd,WAAO,KAAK;AAEZ,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -1,8 +1,9 @@
1
- import { appLogger } from "@intlayer/config";
1
+ import { getAppLogger } from "@intlayer/config";
2
2
  import configuration from "@intlayer/config/built";
3
3
  import { getNodeType } from "@intlayer/core";
4
4
  import merge from "deepmerge";
5
5
  const checkTypesMatch = (obj1, obj2, dictionaryKey, path = []) => {
6
+ const appLogger = getAppLogger(configuration);
6
7
  const type1 = getNodeType(obj1);
7
8
  const type2 = getNodeType(obj2);
8
9
  if (type1 !== type2) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mergeDictionaries.ts"],"sourcesContent":["import { appLogger } from '@intlayer/config';\nimport configuration from '@intlayer/config/built';\nimport type { Dictionary } from '@intlayer/core';\nimport { getNodeType } from '@intlayer/core';\nimport merge from 'deepmerge';\n\nconst checkTypesMatch = (\n obj1: any,\n obj2: any,\n dictionaryKey: string,\n path: string[] = []\n): void => {\n const type1 = getNodeType(obj1);\n const type2 = getNodeType(obj2);\n\n if (type1 !== type2) {\n appLogger(\n `Error: Dictionary ${dictionaryKey} has a multiple content files with type mismatch at path \"${path.join('.')}\": Cannot merge ${type1} with ${type2}`,\n {\n level: 'error',\n }\n );\n }\n\n if (type1 === 'object' && obj1 && obj2) {\n const allKeys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);\n for (const key of allKeys) {\n if (key in obj1 && key in obj2) {\n checkTypesMatch(obj1[key], obj2[key], dictionaryKey, [...path, key]);\n }\n }\n }\n};\n\nexport const mergeDictionaries = (dictionaries: Dictionary[]): Dictionary => {\n const { editor } = configuration;\n\n let mergedDictionaries: Dictionary = dictionaries[0];\n\n for (let i = 1; i < dictionaries.length; i++) {\n const currentDictionary = dictionaries[i];\n\n // Check types before merging\n checkTypesMatch(\n mergedDictionaries,\n currentDictionary,\n currentDictionary.key,\n []\n );\n\n const isDistant = currentDictionary.location === 'distant';\n\n if (editor.dictionaryPriorityStrategy === 'distant_first' && isDistant) {\n mergedDictionaries = merge(mergedDictionaries, currentDictionary);\n } else {\n mergedDictionaries = merge(currentDictionary, mergedDictionaries);\n }\n }\n\n return { ...mergedDictionaries, filePath: undefined };\n};\n"],"mappings":"AAAA,SAAS,iBAAiB;AAC1B,OAAO,mBAAmB;AAE1B,SAAS,mBAAmB;AAC5B,OAAO,WAAW;AAElB,MAAM,kBAAkB,CACtB,MACA,MACA,eACA,OAAiB,CAAC,MACT;AACT,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,QAAQ,YAAY,IAAI;AAE9B,MAAI,UAAU,OAAO;AACnB;AAAA,MACE,qBAAqB,aAAa,6DAA6D,KAAK,KAAK,GAAG,CAAC,mBAAmB,KAAK,SAAS,KAAK;AAAA,MACnJ;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,YAAY,QAAQ,MAAM;AACtC,UAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC;AACpE,eAAW,OAAO,SAAS;AACzB,UAAI,OAAO,QAAQ,OAAO,MAAM;AAC9B,wBAAgB,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,eAAe,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,oBAAoB,CAAC,iBAA2C;AAC3E,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,qBAAiC,aAAa,CAAC;AAEnD,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,oBAAoB,aAAa,CAAC;AAGxC;AAAA,MACE;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,kBAAkB,aAAa;AAEjD,QAAI,OAAO,+BAA+B,mBAAmB,WAAW;AACtE,2BAAqB,MAAM,oBAAoB,iBAAiB;AAAA,IAClE,OAAO;AACL,2BAAqB,MAAM,mBAAmB,kBAAkB;AAAA,IAClE;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,oBAAoB,UAAU,OAAU;AACtD;","names":[]}
1
+ {"version":3,"sources":["../../src/mergeDictionaries.ts"],"sourcesContent":["import { getAppLogger } from '@intlayer/config';\nimport configuration from '@intlayer/config/built';\nimport type { Dictionary } from '@intlayer/core';\nimport { getNodeType } from '@intlayer/core';\nimport merge from 'deepmerge';\n\nconst checkTypesMatch = (\n obj1: any,\n obj2: any,\n dictionaryKey: string,\n path: string[] = []\n): void => {\n const appLogger = getAppLogger(configuration);\n const type1 = getNodeType(obj1);\n const type2 = getNodeType(obj2);\n\n if (type1 !== type2) {\n appLogger(\n `Error: Dictionary ${dictionaryKey} has a multiple content files with type mismatch at path \"${path.join('.')}\": Cannot merge ${type1} with ${type2}`,\n {\n level: 'error',\n }\n );\n }\n\n if (type1 === 'object' && obj1 && obj2) {\n const allKeys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);\n for (const key of allKeys) {\n if (key in obj1 && key in obj2) {\n checkTypesMatch(obj1[key], obj2[key], dictionaryKey, [...path, key]);\n }\n }\n }\n};\n\nexport const mergeDictionaries = (dictionaries: Dictionary[]): Dictionary => {\n const { editor } = configuration;\n\n let mergedDictionaries: Dictionary = dictionaries[0];\n\n for (let i = 1; i < dictionaries.length; i++) {\n const currentDictionary = dictionaries[i];\n\n // Check types before merging\n checkTypesMatch(\n mergedDictionaries,\n currentDictionary,\n currentDictionary.key,\n []\n );\n\n const isDistant = currentDictionary.location === 'distant';\n\n if (editor.dictionaryPriorityStrategy === 'distant_first' && isDistant) {\n mergedDictionaries = merge(mergedDictionaries, currentDictionary);\n } else {\n mergedDictionaries = merge(currentDictionary, mergedDictionaries);\n }\n }\n\n return { ...mergedDictionaries, filePath: undefined };\n};\n"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,OAAO,mBAAmB;AAE1B,SAAS,mBAAmB;AAC5B,OAAO,WAAW;AAElB,MAAM,kBAAkB,CACtB,MACA,MACA,eACA,OAAiB,CAAC,MACT;AACT,QAAM,YAAY,aAAa,aAAa;AAC5C,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,QAAQ,YAAY,IAAI;AAE9B,MAAI,UAAU,OAAO;AACnB;AAAA,MACE,qBAAqB,aAAa,6DAA6D,KAAK,KAAK,GAAG,CAAC,mBAAmB,KAAK,SAAS,KAAK;AAAA,MACnJ;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,YAAY,QAAQ,MAAM;AACtC,UAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC;AACpE,eAAW,OAAO,SAAS;AACzB,UAAI,OAAO,QAAQ,OAAO,MAAM;AAC9B,wBAAgB,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,eAAe,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,oBAAoB,CAAC,iBAA2C;AAC3E,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,qBAAiC,aAAa,CAAC;AAEnD,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,oBAAoB,aAAa,CAAC;AAGxC;AAAA,MACE;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,kBAAkB,aAAa;AAEjD,QAAI,OAAO,+BAA+B,mBAAmB,WAAW;AACtE,2BAAqB,MAAM,oBAAoB,iBAAiB;AAAA,IAClE,OAAO;AACL,2BAAqB,MAAM,mBAAmB,kBAAkB;AAAA,IAClE;AAAA,EACF;AAEA,SAAO,EAAE,GAAG,oBAAoB,UAAU,OAAU;AACtD;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ESMxCJSRequire,
3
- appLogger,
3
+ getAppLogger,
4
4
  getConfiguration
5
5
  } from "@intlayer/config";
6
6
  import { cleanOutputDir } from "./cleanOutputDir.mjs";
@@ -14,6 +14,7 @@ import {
14
14
  } from "./transpiler/dictionary_to_type/index.mjs";
15
15
  import { writeConfiguration } from "./writeConfiguration/index.mjs";
16
16
  const prepareIntlayer = async (configuration = getConfiguration(), projectRequire = ESMxCJSRequire) => {
17
+ const appLogger = getAppLogger(configuration);
17
18
  cleanOutputDir(configuration);
18
19
  appLogger("Output directory cleaned", {
19
20
  isVerbose: true