@codenotch/codenotch.cli 1.0.36 → 1.0.38

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 (105) hide show
  1. package/README.md +2 -2
  2. package/dist/commands/generate/app.d.ts +2 -0
  3. package/dist/commands/generate/app.js +45 -0
  4. package/dist/commands/generate/app.js.map +1 -0
  5. package/dist/commands/generate/appmanifest.d.ts +2 -0
  6. package/dist/commands/generate/appmanifest.js +34 -0
  7. package/dist/commands/generate/appmanifest.js.map +1 -0
  8. package/dist/commands/generate/dbcontext.d.ts +2 -0
  9. package/dist/commands/generate/dbcontext.js +32 -0
  10. package/dist/commands/generate/dbcontext.js.map +1 -0
  11. package/dist/commands/generate/i18n.d.ts +2 -0
  12. package/dist/commands/generate/i18n.js +29 -0
  13. package/dist/commands/generate/i18n.js.map +1 -0
  14. package/dist/commands/generate/index.d.ts +0 -1
  15. package/dist/commands/generate/index.js +14 -33
  16. package/dist/commands/generate/index.js.map +1 -1
  17. package/dist/commands/generate/manifest.d.ts +2 -0
  18. package/dist/commands/generate/manifest.js +29 -0
  19. package/dist/commands/generate/manifest.js.map +1 -0
  20. package/dist/commands/generate/openapi.d.ts +2 -0
  21. package/dist/commands/generate/openapi.js +32 -0
  22. package/dist/commands/generate/openapi.js.map +1 -0
  23. package/dist/commands/generate/pkg.d.ts +2 -0
  24. package/dist/commands/generate/pkg.js +34 -0
  25. package/dist/commands/generate/pkg.js.map +1 -0
  26. package/dist/commands/generate/shared.d.ts +17 -0
  27. package/dist/commands/generate/shared.js +70 -0
  28. package/dist/commands/generate/shared.js.map +1 -0
  29. package/dist/commands/project/new.js +108 -96
  30. package/dist/commands/project/new.js.map +1 -1
  31. package/dist/commands/react/build.js +11 -5
  32. package/dist/commands/react/build.js.map +1 -1
  33. package/dist/commands/react/clean.d.ts +2 -0
  34. package/dist/commands/react/clean.js +46 -0
  35. package/dist/commands/react/clean.js.map +1 -0
  36. package/dist/commands/react/dev.d.ts +2 -0
  37. package/dist/commands/react/dev.js +28 -0
  38. package/dist/commands/react/dev.js.map +1 -0
  39. package/dist/commands/react/index.js +5 -1
  40. package/dist/commands/react/index.js.map +1 -1
  41. package/dist/commands/react/serve.js +33 -4
  42. package/dist/commands/react/serve.js.map +1 -1
  43. package/dist/commands/react/shared.d.ts +21 -0
  44. package/dist/commands/react/shared.js +80 -0
  45. package/dist/commands/react/shared.js.map +1 -0
  46. package/dist/commands/validation/ValidationUtils.d.ts +1 -1
  47. package/dist/commands/validation/ValidationUtils.js +3 -0
  48. package/dist/commands/validation/ValidationUtils.js.map +1 -1
  49. package/dist/commands/validation/files/I18nValidator.d.ts +29 -0
  50. package/dist/commands/validation/files/I18nValidator.js +198 -0
  51. package/dist/commands/validation/files/I18nValidator.js.map +1 -0
  52. package/dist/commands/validation/files/ProjectManifestValidator.d.ts +5 -0
  53. package/dist/commands/validation/files/ProjectManifestValidator.js +31 -0
  54. package/dist/commands/validation/files/ProjectManifestValidator.js.map +1 -0
  55. package/dist/commands/validation/files/ScriptValidator.js +1 -1
  56. package/dist/commands/validation/files/ScriptValidator.js.map +1 -1
  57. package/dist/commands/validation/validate.js +11 -6
  58. package/dist/commands/validation/validate.js.map +1 -1
  59. package/dist/utils/BuildUtils.d.ts +62 -7
  60. package/dist/utils/BuildUtils.js +310 -222
  61. package/dist/utils/BuildUtils.js.map +1 -1
  62. package/dist/utils/ConsoleUtils.d.ts +8 -0
  63. package/dist/utils/ConsoleUtils.js +25 -0
  64. package/dist/utils/ConsoleUtils.js.map +1 -1
  65. package/dist/utils/DbSchemaUtils.d.ts +49 -0
  66. package/dist/utils/DbSchemaUtils.js +246 -0
  67. package/dist/utils/DbSchemaUtils.js.map +1 -0
  68. package/dist/utils/FileUtils.d.ts +104 -15
  69. package/dist/utils/FileUtils.js +285 -100
  70. package/dist/utils/FileUtils.js.map +1 -1
  71. package/dist/utils/I18nTsUtils.d.ts +66 -0
  72. package/dist/utils/I18nTsUtils.js +221 -0
  73. package/dist/utils/I18nTsUtils.js.map +1 -0
  74. package/dist/utils/OpenApiUtils.d.ts +81 -0
  75. package/dist/utils/OpenApiUtils.js +123 -0
  76. package/dist/utils/OpenApiUtils.js.map +1 -0
  77. package/dist/utils/ProjectCompilationUtils.d.ts +0 -1
  78. package/dist/utils/ProjectCompilationUtils.js +4 -52
  79. package/dist/utils/ProjectCompilationUtils.js.map +1 -1
  80. package/dist/utils/ProjectGeneratorUtils.d.ts +35 -0
  81. package/dist/utils/ProjectGeneratorUtils.js +119 -0
  82. package/dist/utils/ProjectGeneratorUtils.js.map +1 -0
  83. package/dist/utils/ProjectTemplates.d.ts +102 -0
  84. package/dist/utils/ProjectTemplates.js +284 -0
  85. package/dist/utils/ProjectTemplates.js.map +1 -0
  86. package/dist/utils/ProjectUtils.d.ts +216 -3
  87. package/dist/utils/ProjectUtils.js +387 -22
  88. package/dist/utils/ProjectUtils.js.map +1 -1
  89. package/dist/utils/RuntimeUtils.js +14 -8
  90. package/dist/utils/RuntimeUtils.js.map +1 -1
  91. package/dist/utils/ScriptDeclarationUtils.d.ts +169 -0
  92. package/dist/utils/ScriptDeclarationUtils.js +398 -0
  93. package/dist/utils/ScriptDeclarationUtils.js.map +1 -0
  94. package/dist/utils/ServeUtils.js +10 -5
  95. package/dist/utils/ServeUtils.js.map +1 -1
  96. package/dist/utils/ShellUtils.d.ts +6 -0
  97. package/dist/utils/ShellUtils.js +13 -0
  98. package/dist/utils/ShellUtils.js.map +1 -1
  99. package/dist/utils/TemplateUtils.d.ts +62 -0
  100. package/dist/utils/TemplateUtils.js +218 -0
  101. package/dist/utils/TemplateUtils.js.map +1 -0
  102. package/dist/utils/TypeSchemaUtils.d.ts +42 -0
  103. package/dist/utils/TypeSchemaUtils.js +171 -0
  104. package/dist/utils/TypeSchemaUtils.js.map +1 -0
  105. package/package.json +3 -2
@@ -9,8 +9,9 @@ const path_1 = __importDefault(require("path"));
9
9
  const fs_extra_1 = __importDefault(require("fs-extra"));
10
10
  const os_1 = require("os");
11
11
  const adm_zip_1 = __importDefault(require("adm-zip"));
12
+ const ignore_1 = __importDefault(require("ignore"));
12
13
  class FileUtils {
13
- static async zipFolder(targetPath, zipFilePath) {
14
+ static zipFolder(targetPath, zipFilePath) {
14
15
  try {
15
16
  targetPath = FileUtils.normalize(targetPath);
16
17
  zipFilePath = FileUtils.normalize(zipFilePath);
@@ -35,15 +36,20 @@ class FileUtils {
35
36
  return false;
36
37
  }
37
38
  }
39
+ /**
40
+ * Returns the current OS path slash
41
+ * TODO: Use 'path' intead ?
42
+ */
38
43
  static slash() {
39
44
  return (0, os_1.platform)() === 'win32' ? '\\' : '/';
40
45
  }
46
+ /**
47
+ * Fix path slashs depending on the current OS
48
+ * TODO: Use 'path' intead ?
49
+ */
41
50
  static normalize(path) {
42
- if (path === undefined)
51
+ if (!path)
43
52
  return '';
44
- if (path.startsWith("http")) {
45
- return path.replaceAll('\\', '/');
46
- }
47
53
  let os = (0, os_1.platform)();
48
54
  if (os === 'win32') {
49
55
  path = path.replaceAll("/", '\\');
@@ -53,27 +59,52 @@ class FileUtils {
53
59
  }
54
60
  return path;
55
61
  }
62
+ /**
63
+ * Returns true if the specified path exists.
64
+ */
56
65
  static async exists(filePath) {
57
- filePath = FileUtils.normalize(filePath);
58
66
  try {
59
- await fs_1.default.promises.access(filePath, fs_1.default.constants.F_OK);
67
+ await fs_1.default.promises.access(this.normalize(filePath), fs_1.default.constants.F_OK);
60
68
  return true;
61
69
  }
62
70
  catch (e) {
63
71
  return false;
64
72
  }
65
73
  }
74
+ /**
75
+ * Reads a file and returns undefined if not exists (or other errors)
76
+ */
66
77
  static async readFileAsync(filePath) {
67
- filePath = FileUtils.normalize(filePath);
68
- return await fs_1.default.promises.readFile(filePath, { encoding: "utf-8" });
78
+ filePath = this.normalize(filePath);
79
+ try {
80
+ return await fs_1.default.promises.readFile(filePath, { encoding: "utf-8" });
81
+ }
82
+ catch (e) {
83
+ console.log(`Could not read file '${filePath}'.`, e);
84
+ return undefined;
85
+ }
86
+ }
87
+ /**
88
+ * Reads a file that is allowed to be missing, without the error {@link FileUtils.readFileAsync} logs
89
+ */
90
+ static async readFileIfExists(filePath) {
91
+ if (await this.exists(filePath) === false) {
92
+ return undefined;
93
+ }
94
+ return await this.readFileAsync(filePath);
69
95
  }
70
96
  static async readJsonFileAsync(filePath) {
71
- filePath = FileUtils.normalize(filePath);
72
- const content = await fs_1.default.promises.readFile(filePath, { encoding: "utf-8" });
73
- if (!content || content.trim() === '') {
74
- return null;
97
+ filePath = this.normalize(filePath);
98
+ try {
99
+ const content = await fs_1.default.promises.readFile(filePath, { encoding: "utf-8" });
100
+ if (!content || content.trim() === '') {
101
+ return undefined;
102
+ }
103
+ return JSON.parse(content);
104
+ }
105
+ catch {
106
+ return undefined;
75
107
  }
76
- return JSON.parse(content);
77
108
  }
78
109
  static writeFileSync(filePath, content) {
79
110
  try {
@@ -90,35 +121,56 @@ class FileUtils {
90
121
  return false;
91
122
  }
92
123
  }
93
- static async copyFolder(folderPath, copyInto, ignoreFolders = []) {
94
- folderPath = FileUtils.normalize(folderPath);
95
- copyInto = FileUtils.normalize(copyInto);
96
- if (fs_extra_1.default === undefined || path_1.default === undefined) {
97
- return;
98
- }
124
+ /**
125
+ * Copy a folder to an destination path.
126
+ */
127
+ static async copyFolder(folderPath, copyInto, ignoredFolderNames = []) {
128
+ folderPath = this.normalize(folderPath);
129
+ copyInto = this.normalize(copyInto);
99
130
  if (!fs_extra_1.default.existsSync(copyInto)) {
100
131
  // Create destination folder
101
132
  fs_extra_1.default.mkdirSync(copyInto, { recursive: true });
102
133
  }
134
+ // Compared as whole names, so that ignoring 'out' does not also drop 'layout/', 'about.tsx',
135
+ // nor every entry when the source itself lives under a folder named 'out'
136
+ const ignoredNames = new Set(ignoredFolderNames.map(name => this.toComparable(name)));
137
+ const rootPath = path_1.default.resolve(folderPath);
103
138
  let options = {
104
139
  recursive: true,
105
140
  overwrite: true,
106
- filter: (path) => !ignoreFolders.some(folder => path.includes(folder)) // ignore specified folders
141
+ filter: (source) => {
142
+ // The copied root is always kept, even when its own name is one of the ignored ones
143
+ if (path_1.default.resolve(source) === rootPath) {
144
+ return true;
145
+ }
146
+ if (!ignoredNames.has(this.toComparable(path_1.default.basename(source)))) {
147
+ return true;
148
+ }
149
+ try {
150
+ // Only folders are ignored: a file that happens to bear the same name is copied
151
+ return !fs_extra_1.default.lstatSync(source).isDirectory();
152
+ }
153
+ catch {
154
+ return true;
155
+ }
156
+ }
107
157
  };
108
158
  // if destination is a subdirectory of the copies folder we need to handle things differently
109
159
  if (copyInto.includes(folderPath)) {
110
- let destFolderName = path_1.default.basename(copyInto);
160
+ const destFolderName = this.toComparable(path_1.default.basename(copyInto));
111
161
  // We cannot use copy directly on the root folder because it won't work "to" is a subdirectory of the root folder
112
- let files = await fs_extra_1.default.readdir(folderPath);
113
- for (let f of files) {
162
+ const entries = await fs_extra_1.default.readdir(folderPath, { withFileTypes: true });
163
+ for (const entry of entries) {
114
164
  // Ignore destination if it is a subdirectory
115
- if (f === destFolderName)
165
+ if (this.toComparable(entry.name) === destFolderName) {
116
166
  continue;
117
- // Or if it belongs to the ignored files/folders
118
- if (ignoreFolders.some(folder => f === folder)) // ignore specified folders
167
+ }
168
+ // Or if it is one of the ignored folders
169
+ if (entry.isDirectory() && ignoredNames.has(this.toComparable(entry.name))) {
119
170
  continue;
120
- let from = path_1.default.join(folderPath, f);
121
- let to = path_1.default.join(copyInto, f);
171
+ }
172
+ const from = path_1.default.join(folderPath, entry.name);
173
+ const to = path_1.default.join(copyInto, entry.name);
122
174
  await fs_extra_1.default.copy(from, to, options);
123
175
  }
124
176
  }
@@ -126,41 +178,10 @@ class FileUtils {
126
178
  await fs_extra_1.default.copy(folderPath, copyInto, options);
127
179
  }
128
180
  }
129
- static async moveFolder(folderPath, moveInto, ignoreFolders = []) {
130
- folderPath = FileUtils.normalize(folderPath);
131
- moveInto = FileUtils.normalize(moveInto);
132
- if (fs_extra_1.default === undefined || path_1.default === undefined) {
133
- return;
134
- }
135
- if (!fs_extra_1.default.existsSync(moveInto)) {
136
- // Create destination folder
137
- fs_extra_1.default.mkdirSync(moveInto, { recursive: true });
138
- }
139
- let options = {
140
- overwrite: true
141
- };
142
- // if destination is a subdirectory of the copies folder we need to handle things differently
143
- if (moveInto.includes(folderPath)) {
144
- let destFolderName = path_1.default.basename(moveInto);
145
- // We cannot use copy directly on the root folder because it won't work "to" is a subdirectory of the root folder
146
- let files = await fs_extra_1.default.readdir(folderPath);
147
- for (let f of files) {
148
- // Ignore destination if it is a subdirectory
149
- if (f === destFolderName)
150
- continue;
151
- // Or if it belongs to the ignored files/folders
152
- if (ignoreFolders.some(folder => f === folder)) // ignore specified folders
153
- continue;
154
- let from = path_1.default.join(folderPath, f);
155
- let to = path_1.default.join(moveInto, f);
156
- await fs_extra_1.default.move(from, to, options);
157
- }
158
- }
159
- else {
160
- await fs_extra_1.default.move(folderPath, moveInto, options);
161
- }
162
- }
163
- static delete(path) {
181
+ /**
182
+ * Delete a file or a folder recursively
183
+ */
184
+ static deleteRecursively(path) {
164
185
  path = StringUtils_1.default.normalizePath(path);
165
186
  if (fs_1.default.existsSync(path)) {
166
187
  if (fs_1.default.lstatSync(path).isDirectory()) {
@@ -171,54 +192,123 @@ class FileUtils {
171
192
  }
172
193
  }
173
194
  }
174
- static getAllFilesFromPath(path, ignoreFolders = []) {
195
+ /**
196
+ * Lists every file under a path, recursively.
197
+ *
198
+ * The returned paths are absolute and use the separators of the current platform.
199
+ * Symbolic links are not followed, and a folder that cannot be read is skipped
200
+ * instead of aborting the whole walk.
201
+ *
202
+ * @param targetPath file or folder to walk. A file is returned alone, but is still filtered by the options.
203
+ * @param options filters to apply, all of them optional. An option left out filters nothing.
204
+ */
205
+ static listFilesRecursively(targetPath, options) {
206
+ const filters = this.createFileFilters(options);
175
207
  try {
176
- path = StringUtils_1.default.normalizePath(path);
177
- let isDirectory = fs_1.default.lstatSync(path).isDirectory();
178
- if (isDirectory) {
179
- if (ignoreFolders && ignoreFolders.some(c => path.endsWith(`\\${c}`) || path.endsWith(`/${c}`))) {
208
+ // Absolute so that the results can be compared with the absolute paths of the options
209
+ targetPath = this.normalize(path_1.default.resolve(targetPath));
210
+ if (fs_1.default.lstatSync(targetPath).isDirectory()) {
211
+ if (this.isIgnoredFolder(targetPath, filters)) {
180
212
  return [];
181
213
  }
182
- return this.getAllFiles(path, ignoreFolders);
183
- }
184
- else {
185
- return [path];
214
+ const results = [];
215
+ this.collectFiles(targetPath, filters, results);
216
+ return results;
186
217
  }
218
+ return this.isIgnoredFile(targetPath, filters) ? [] : [targetPath];
187
219
  }
188
220
  catch {
221
+ // Missing path, or not enough rights to stat it
189
222
  return [];
190
223
  }
191
224
  }
192
- static getAllFiles(path, ignoreFolders = [], arrayOfFiles, level) {
193
- path = StringUtils_1.default.normalizePath(path);
194
- if (ignoreFolders.some(c => path.endsWith(`\\${c}`) || path.endsWith(`/${c}`))) {
195
- return [];
225
+ /**
226
+ * Walks a folder and appends its files to `results`
227
+ */
228
+ static collectFiles(folderPath, filters, results) {
229
+ let entries;
230
+ try {
231
+ entries = fs_1.default.readdirSync(folderPath, { withFileTypes: true });
196
232
  }
197
- let files = fs_1.default.readdirSync(path, { withFileTypes: true });
198
- arrayOfFiles = arrayOfFiles ? arrayOfFiles : [];
199
- for (let i = 0; i < files.length; i++) {
200
- let file = files[i];
201
- let nextPath = StringUtils_1.default.normalizePath(`${path}\\${file.name}`);
202
- if (file.isDirectory()) {
203
- if (ignoreFolders.some(c => nextPath.endsWith(`\\${c}`) || nextPath.endsWith(`/${c}`))) {
204
- continue;
205
- }
206
- else {
207
- arrayOfFiles = this.getAllFiles(nextPath, ignoreFolders, arrayOfFiles, (level ?? 0) + 1);
233
+ catch {
234
+ // An unreadable folder must not abort the walk of its siblings
235
+ return;
236
+ }
237
+ for (const entry of entries) {
238
+ const entryPath = this.normalize(path_1.default.join(folderPath, entry.name));
239
+ if (entry.isDirectory()) {
240
+ if (!this.isIgnoredFolder(entryPath, filters)) {
241
+ this.collectFiles(entryPath, filters, results);
208
242
  }
209
243
  }
210
- else {
211
- arrayOfFiles.push(nextPath);
244
+ else if (!this.isIgnoredFile(entryPath, filters)) {
245
+ results.push(entryPath);
212
246
  }
213
247
  }
214
- return arrayOfFiles;
215
248
  }
216
- static getNameFromPath(path) {
249
+ /**
250
+ * Prepares the options once, so that the comparisons of the walk are simple lookups
251
+ */
252
+ static createFileFilters(options) {
253
+ return {
254
+ folderNames: new Set((options?.ignoredFolderNames ?? []).map(name => this.toComparable(name))),
255
+ folderPaths: new Set((options?.ignoredFolderPaths ?? []).map(folderPath => this.toComparablePath(folderPath))),
256
+ fileNames: new Set((options?.ignoredFileNames ?? []).map(name => this.toComparable(name))),
257
+ filePaths: new Set((options?.ignoredFilePaths ?? []).map(filePath => this.toComparablePath(filePath))),
258
+ // Kept as suffixes ('.ts', '.i18n.csv'), the dot being optional in the option itself
259
+ extensions: (options?.fileExtensions ?? []).map(extension => {
260
+ const comparable = this.toComparable(extension);
261
+ return comparable.startsWith('.') ? comparable : `.${comparable}`;
262
+ })
263
+ };
264
+ }
265
+ static isIgnoredFolder(folderPath, filters) {
266
+ return filters.folderNames.has(this.toComparable(this.getNameFromPath(folderPath)))
267
+ || filters.folderPaths.has(this.toComparablePath(folderPath));
268
+ }
269
+ static isIgnoredFile(filePath, filters) {
270
+ if (filters.fileNames.has(this.toComparable(this.getNameFromPath(filePath)))) {
271
+ return true;
272
+ }
273
+ if (filters.filePaths.has(this.toComparablePath(filePath))) {
274
+ return true;
275
+ }
276
+ // Compared on the whole name so that composed extensions work too ('.i18n.csv', '.manifest.json').
277
+ // An empty list keeps every file, a file without extension never matches a non empty list.
278
+ if (filters.extensions.length > 0) {
279
+ const fileName = this.toComparable(this.getNameFromPath(filePath));
280
+ if (!filters.extensions.some(extension => fileName.endsWith(extension))) {
281
+ return true;
282
+ }
283
+ }
284
+ return false;
285
+ }
286
+ /**
287
+ * Windows paths are case insensitive, posix ones are not
288
+ */
289
+ static toComparable(value) {
290
+ return (0, os_1.platform)() === 'win32' ? value.toLowerCase() : value;
291
+ }
292
+ /**
293
+ * Comparable form of a path: separators of the platform, no trailing separator
294
+ */
295
+ static toComparablePath(value) {
296
+ return this.toComparable(this.normalize(value).replace(/[\\/]+$/, ''));
297
+ }
298
+ /**
299
+ * Return the folder or file name from a path.
300
+ */
301
+ static getNameFromPath(path, removeExtensions = false) {
217
302
  path = path.replaceAll('\\', '/');
218
- if (path.includes('/')) {
219
- return path.split('/').pop();
303
+ let result = path;
304
+ if (result.includes('/')) {
305
+ result = result.split('/').pop();
220
306
  }
221
- return path;
307
+ if (removeExtensions && result.includes('.')) {
308
+ const dotIndex = result.lastIndexOf('.');
309
+ result = result.substring(0, dotIndex);
310
+ }
311
+ return result;
222
312
  }
223
313
  /**
224
314
  * Returns the extension excluding the dot. Or an empty string if the name doesn't contains dot.
@@ -234,14 +324,109 @@ class FileUtils {
234
324
  return '';
235
325
  }
236
326
  }
237
- static isAbsolutePath(path) {
238
- return path && (path.startsWith('/') || path.match(/^[a-zA-Z]:\\/));
327
+ /** Folders that are never worth walking, whatever the workspace declares */
328
+ static ALWAYS_IGNORED_FOLDER_NAMES = [
329
+ 'node_modules',
330
+ '.codenotch',
331
+ '.git',
332
+ '.vscode',
333
+ '.claude',
334
+ '.github'
335
+ ];
336
+ /**
337
+ * Absolute paths of the folders that should not be walked in a workspace: the usual suspects
338
+ * (node_modules, .git, ...), those ignored by its '.gitignore' and those excluded by its 'tsconfig.json'.
339
+ *
340
+ * Gitignore patterns are recursive, so the folders are looked up at any depth ('src/generated/' is
341
+ * reported), but an ignored folder is never entered.
342
+ *
343
+ * Meant to feed the 'ignoredFolderPaths' option of {@link FileUtils.listFilesRecursively}.
344
+ */
345
+ static async getIgnoredFolderPaths(workspacePath) {
346
+ workspacePath = this.normalize(path_1.default.resolve(workspacePath));
347
+ const results = this.ALWAYS_IGNORED_FOLDER_NAMES
348
+ .map(name => this.normalize(path_1.default.join(workspacePath, name)));
349
+ // .gitignore
350
+ const gitignore = await this.readFileIfExists(path_1.default.join(workspacePath, '.gitignore'));
351
+ if (gitignore) {
352
+ this.collectIgnoredFolders(workspacePath, workspacePath, (0, ignore_1.default)().add(gitignore), results);
353
+ }
354
+ // tsconfig.json
355
+ const tsconfig = await this.readFileIfExists(path_1.default.join(workspacePath, 'tsconfig.json'));
356
+ if (tsconfig) {
357
+ for (const excluded of this.getExcludedFolders(tsconfig)) {
358
+ results.push(this.normalize(path_1.default.join(workspacePath, excluded)));
359
+ }
360
+ }
361
+ return [...new Set(results)];
239
362
  }
240
363
  /**
241
- * SI path est un dossier, checké sur le dossier contient un 'manifest.json', si fichier, regarder dans les dossiers parent
242
- * @param path
364
+ * Walks the folders of a workspace and collects those matching the gitignore patterns.
365
+ * An ignored folder is reported but not entered, so its content costs nothing.
243
366
  */
244
- static locateProjectRootPath(path) {
367
+ static collectIgnoredFolders(workspacePath, folderPath, matcher, results) {
368
+ let entries;
369
+ try {
370
+ entries = fs_1.default.readdirSync(folderPath, { withFileTypes: true });
371
+ }
372
+ catch {
373
+ // An unreadable folder must not abort the walk of its siblings
374
+ return;
375
+ }
376
+ for (const entry of entries) {
377
+ // isDirectory() is false for a symbolic link, which keeps this walk free of cycles
378
+ if (!entry.isDirectory()) {
379
+ continue;
380
+ }
381
+ const childPath = path_1.default.join(folderPath, entry.name);
382
+ if (this.ALWAYS_IGNORED_FOLDER_NAMES.includes(this.toComparable(entry.name))) {
383
+ results.push(this.normalize(childPath));
384
+ continue;
385
+ }
386
+ // 'ignore' expects a path relative to the workspace, with posix separators and a trailing slash for a folder
387
+ const relativePath = path_1.default.relative(workspacePath, childPath).replaceAll('\\', '/');
388
+ if (matcher.ignores(`${relativePath}/`)) {
389
+ results.push(this.normalize(childPath));
390
+ }
391
+ else {
392
+ this.collectIgnoredFolders(workspacePath, childPath, matcher, results);
393
+ }
394
+ }
395
+ }
396
+ /**
397
+ * Folders designated by the "exclude" of a tsconfig, relative to the workspace.
398
+ * 'dist', './dist', 'dist/**' and '**\/dist' all give 'dist', while entries that do not
399
+ * designate a folder ('**\/*.test.ts', '*.tmp', '**') are dropped.
400
+ */
401
+ static getExcludedFolders(tsconfigContent) {
402
+ let exclude;
403
+ try {
404
+ exclude = JSON.parse(tsconfigContent)?.exclude;
405
+ }
406
+ catch {
407
+ // A tsconfig that does not even parse is not this function's problem
408
+ return [];
409
+ }
410
+ if (!Array.isArray(exclude)) {
411
+ return [];
412
+ }
413
+ const folders = [];
414
+ for (const entry of exclude) {
415
+ if (typeof entry !== 'string') {
416
+ continue;
417
+ }
418
+ const folder = entry.trim()
419
+ .replaceAll('\\', '/')
420
+ .replace(/^\.\//, '') // './dist'
421
+ .replace(/^\*\*\//, '') // '**/dist'
422
+ .replace(/\/\*{1,2}$/, '') // 'dist/**'
423
+ .replace(/\/+$/, ''); // 'dist/'
424
+ // What remains must designate a folder of the workspace: no glob and no escape from the workspace
425
+ if (folder !== '' && !/[*?]/.test(folder) && !folder.split('/').includes('..')) {
426
+ folders.push(folder);
427
+ }
428
+ }
429
+ return folders;
245
430
  }
246
431
  }
247
432
  exports.default = FileUtils;
@@ -1 +1 @@
1
- {"version":3,"file":"FileUtils.js","sourceRoot":"","sources":["../../src/utils/FileUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileUtils.js","sourceRoot":"","sources":["../../src/utils/FileUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * One row of a *.i18n.csv: its key, plus one property per language column.
3
+ * Declared here since the core no longer ships an i18n compiler.
4
+ */
5
+ export interface ILocalizationEntry {
6
+ key: string;
7
+ [lang: string]: string;
8
+ }
9
+ export interface I18nTsGenerationResult {
10
+ content: string;
11
+ warnings: string[];
12
+ }
13
+ /**
14
+ * Generate an importable TypeScript class from the entries of a *.i18n.csv file.
15
+ *
16
+ * The generated class exposes one static method per translation key, e.g. for:
17
+ * key,en,de
18
+ * ,,
19
+ * userWelcome,hello,hallo
20
+ * hiMr,hello mister {0},hallo herr {0}
21
+ * we get `hello.userWelcome()` and `hello.hiMr(arg1)`.
22
+ *
23
+ * The file is fully regenerated on each run, it must not be edited by hand.
24
+ */
25
+ export default abstract class I18nTsUtils {
26
+ private static readonly RESERVED_MEMBERS;
27
+ private static readonly PLACEHOLDER_REGEX;
28
+ private static readonly INDENT;
29
+ /**
30
+ * Converts a *.i18n.csv file name (or path) into a valid class name, e.g. 'src/hello.i18n.csv' => 'hello'
31
+ */
32
+ static getClassName(fileNameOrPath: string): string;
33
+ /**
34
+ * Keeps only the real translation entries of a parsed csv: the rows without key are ignored
35
+ * (the csv may still contain a leading empty row, kept for readability).
36
+ */
37
+ static getEntries(lines: ILocalizationEntry[]): ILocalizationEntry[];
38
+ /**
39
+ * Generates the TypeScript class.
40
+ * @param className name of the generated class
41
+ * @param sourceFileName name of the *.i18n.csv the class is generated from (mentioned in the file header)
42
+ * @param entries translation entries (see getEntries)
43
+ */
44
+ static generate(className: string, sourceFileName: string, entries: ILocalizationEntry[]): I18nTsGenerationResult;
45
+ /**
46
+ * Languages in csv column order (every column except 'key', papaparse internals are ignored)
47
+ */
48
+ static getLanguages(entries: ILocalizationEntry[]): string[];
49
+ private static generateValuesBlock;
50
+ private static generateMethodsBlock;
51
+ /**
52
+ * Number of arguments needed by a translation: highest {n} placeholder + 1 over all languages
53
+ */
54
+ private static getArgCount;
55
+ /**
56
+ * Makes a translation value safe inside a JSDoc comment: single line, no comment terminator
57
+ */
58
+ private static toCommentText;
59
+ private static toIdentifier;
60
+ /**
61
+ * Header written at the top of the generated file
62
+ */
63
+ private static generateHeader;
64
+ private static getCliVersion;
65
+ private static generateTemplate;
66
+ }