@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
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -6,23 +39,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.registerNew = registerNew;
7
40
  const shared_1 = require("./shared");
8
41
  const FileUtils_1 = __importDefault(require("../../utils/FileUtils"));
42
+ const ConsoleUtils_1 = __importDefault(require("../../utils/ConsoleUtils"));
43
+ const ManifestUtils_1 = __importStar(require("../../utils/ManifestUtils"));
44
+ const ProjectTemplates_1 = __importStar(require("../../utils/ProjectTemplates"));
45
+ const ProjectGeneratorUtils_1 = __importDefault(require("../../utils/ProjectGeneratorUtils"));
46
+ const ShellUtils_1 = __importDefault(require("../../utils/ShellUtils"));
9
47
  const fs_extra_1 = require("fs-extra");
10
48
  const path_1 = require("path");
11
- const ManifestUtils_1 = __importDefault(require("../../utils/ManifestUtils"));
12
- const BuildUtils_1 = __importDefault(require("../../utils/BuildUtils"));
13
49
  const chalk_1 = __importDefault(require("chalk"));
14
50
  function registerNew(project) {
15
51
  (0, shared_1.withProjectPathOption)(project
16
52
  .command('new')
17
- .description('Create a new project'))
53
+ .description('Create a new project')
54
+ .option('-t, --template <name>', `template to start from: ${ProjectTemplates_1.default.TEMPLATES.map(t => t.name).join(', ')} (asked when omitted)`)
55
+ .option('--list-templates', 'list the available templates and exit')
56
+ .option('--no-install', 'do not run npm install in the new project'))
18
57
  .action(async (options) => {
58
+ if (options.listTemplates) {
59
+ for (const template of ProjectTemplates_1.default.TEMPLATES) {
60
+ console.log(`${chalk_1.default.cyan(template.name.padEnd(12))} ${template.description}`);
61
+ }
62
+ return;
63
+ }
64
+ const templateName = await pickTemplate(options.template);
65
+ if (templateName === undefined) {
66
+ process.exitCode = 1;
67
+ return;
68
+ }
19
69
  if (options.projectPath === process.cwd()) {
20
70
  options.projectPath = '';
21
71
  }
22
72
  // Create project folder
23
73
  let finalFolder = '';
24
74
  if (options.projectPath && options.projectPath.trim() !== '') {
25
- options.projectPath = (0, path_1.resolve)(FileUtils_1.default.isAbsolutePath(options.projectPath) ? options.projectPath : (0, path_1.join)(process.cwd(), options.projectPath));
75
+ // resolve() already turns a relative path into an absolute one, based on the current directory
76
+ options.projectPath = (0, path_1.resolve)(options.projectPath);
26
77
  if (await FileUtils_1.default.exists(options.projectPath)) {
27
78
  console.error(`Path '${options.projectPath}' already exists.`);
28
79
  process.exitCode = 1;
@@ -41,107 +92,68 @@ function registerNew(project) {
41
92
  (0, fs_extra_1.ensureDirSync)(finalFolder);
42
93
  const projectName = FileUtils_1.default.getNameFromPath(finalFolder);
43
94
  const serviceName = ManifestUtils_1.default.toServiceName(projectName);
44
- const folders = [
45
- (0, path_1.join)(finalFolder, 'processes'),
46
- (0, path_1.join)(finalFolder, 'apps'),
47
- (0, path_1.join)(finalFolder, 'documents'),
48
- (0, path_1.join)(finalFolder, 'typings'),
49
- (0, path_1.join)(finalFolder, 'tables'),
50
- ];
51
- const files = [
52
- { path: (0, path_1.join)(finalFolder, 'manifest.json'), content: ManifestUtils_1.default.serialize(ManifestUtils_1.default.createManifest(projectName, { serviceName })) },
53
- { path: (0, path_1.join)(finalFolder, 'readme.md'), content: getReadmeMd(projectName, serviceName) },
54
- { path: (0, path_1.join)(finalFolder, '.gitignore'), content: ['manifest.cache.json', 'package-lock.json', '/.codenotch', '/node_modules', '/typings'].join('\n') },
55
- { path: (0, path_1.join)(finalFolder, 'package.json'), content: JSON.stringify(getDefaultPkgJson(serviceName), null, 4) },
56
- { path: (0, path_1.join)(finalFolder, 'apps/index.manifest.json'), content: JSON.stringify(getDefaultAppManifest(), null, 4) },
57
- { path: (0, path_1.join)(finalFolder, 'apps/index.tsx'), content: getDefaultApp() },
58
- ];
59
- // TODO: one sample process, table, document, i18n, etc then generate db-schema, and others things
60
- for (const folder of folders) {
61
- (0, fs_extra_1.ensureDirSync)(folder);
95
+ const scaffold = ProjectTemplates_1.default.build(templateName, { projectName, serviceName, languages: [...ManifestUtils_1.DEFAULT_LANGUAGES] });
96
+ for (const folder of scaffold.folders) {
97
+ (0, fs_extra_1.ensureDirSync)((0, path_1.join)(finalFolder, folder));
98
+ }
99
+ for (const file of scaffold.files) {
100
+ if (!FileUtils_1.default.writeFileSync((0, path_1.join)(finalFolder, file.path), file.content)) {
101
+ process.exitCode = 1;
102
+ return;
103
+ }
62
104
  }
63
- for (const file of files) {
64
- FileUtils_1.default.writeFileSync(file.path, file.content);
105
+ ConsoleUtils_1.default.check(`${scaffold.files.length} file(s) written from the '${templateName}' template`);
106
+ // The schema, the translation classes and the api document come from the files just written
107
+ const generated = await ProjectGeneratorUtils_1.default.generateAll(finalFolder);
108
+ for (const warning of generated.warnings) {
109
+ ConsoleUtils_1.default.checkWarning(warning);
65
110
  }
111
+ if (generated.error !== undefined) {
112
+ console.error(chalk_1.default.red(generated.error));
113
+ process.exitCode = 1;
114
+ return;
115
+ }
116
+ if (generated.written.length > 0) {
117
+ ConsoleUtils_1.default.check(`${generated.written.length} file(s) generated: ${generated.written.map(f => FileUtils_1.default.getNameFromPath(f)).join(', ')}`);
118
+ }
119
+ // The project is complete at this point: a failed install leaves it usable, with the step to redo by hand
120
+ let nextSteps = scaffold.nextSteps;
121
+ if (options.install) {
122
+ console.log(``);
123
+ console.log(`Installing dependencies...`);
124
+ const exitCode = await ShellUtils_1.default.run(finalFolder, 'npm install --no-audit --no-fund');
125
+ if (exitCode === 0) {
126
+ ConsoleUtils_1.default.check(`Dependencies installed`);
127
+ nextSteps = nextSteps.filter(step => step !== ProjectTemplates_1.NPM_INSTALL_STEP);
128
+ }
129
+ else {
130
+ ConsoleUtils_1.default.checkWarning(`npm install failed (exit code ${exitCode}), run it again once the cause is fixed.`);
131
+ }
132
+ }
133
+ console.log(``);
66
134
  console.log(`Your new Codenotch project is ready at:`);
67
135
  console.log(chalk_1.default.green(finalFolder));
68
136
  console.log(``);
69
137
  console.log(`You can now execute:`);
70
138
  console.log(chalk_1.default.green(`cd '${finalFolder}'`));
71
- });
72
- }
73
- function getDefaultAppManifest() {
74
- const m = {
75
- app: {
76
- name: "index"
77
- },
78
- html: {
79
- title: "index"
80
- },
81
- pwa: {
82
- name: "index",
83
- display: "standalone",
84
- display_override: [
85
- "window-controls-overlay"
86
- ],
87
- start_url: "./",
88
- icons: [
89
- {
90
- src: "logo512.png",
91
- sizes: "512x512",
92
- type: "image/png"
93
- },
94
- {
95
- src: "logo192.png",
96
- sizes: "192x192",
97
- type: "image/png"
98
- }
99
- ]
139
+ for (const step of nextSteps) {
140
+ console.log(chalk_1.default.green(step));
100
141
  }
101
- };
102
- return m;
103
- }
104
- function getDefaultApp() {
105
- return `import React from 'react';
106
- import { useCodenotch } from '@codenotch/codenotch.react';
107
-
108
- const index: React.FC<{}> = () => {
109
- const cn = useCodenotch();
110
-
111
- return <div>
112
- <h1>My new Codenotch App</h1>
113
- <pre>{JSON.stringify(cn.env, null, 4)}</pre>
114
- </div>
115
- };
116
-
117
- export default index;`;
118
- }
119
- function getReadmeMd(projectName, serviceName) {
120
- // TODO : md that explain how codenotch works
121
- return `
122
- todo`.trim() + '\n';
142
+ });
123
143
  }
124
- function getDefaultPkgJson(serviceName) {
125
- return {
126
- name: serviceName,
127
- version: "0.0.0",
128
- description: "New Codenotch Project",
129
- main: "index.js",
130
- scripts: {},
131
- keywords: [],
132
- author: "",
133
- license: "MIT",
134
- dependencies: {
135
- "react": "^19.2.8",
136
- "react-dom": "^19.2.8",
137
- "@codenotch/codenotch.react": BuildUtils_1.default.CN_REACT_VERSION
138
- },
139
- devDependencies: {
140
- "@types/react": "^19.2.18",
141
- "@types/react-dom": "^19.2.4",
142
- "@vitejs/plugin-react": "^6.0.5",
143
- "typescript": "^5.9.3"
144
+ /**
145
+ * The template to use: the one given on the command line when valid, otherwise the one picked
146
+ * on the terminal ('default' when nobody can answer). Undefined when the given name is unknown.
147
+ */
148
+ async function pickTemplate(requested) {
149
+ if (requested !== undefined) {
150
+ if (ProjectTemplates_1.default.isTemplateName(requested)) {
151
+ return requested;
144
152
  }
145
- };
153
+ console.error(chalk_1.default.yellow(`Unknown template '${requested}', expected one of: ${ProjectTemplates_1.default.TEMPLATES.map(t => t.name).join(', ')}.`));
154
+ return undefined;
155
+ }
156
+ const index = await ConsoleUtils_1.default.select('Which template do you want to start from?', ProjectTemplates_1.default.TEMPLATES, 0);
157
+ return ProjectTemplates_1.default.TEMPLATES[index].name;
146
158
  }
147
159
  //# sourceMappingURL=new.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/commands/project/new.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/commands/project/new.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.registerBuild = registerBuild;
7
7
  const BuildUtils_1 = __importDefault(require("../../utils/BuildUtils"));
8
+ const shared_1 = require("./shared");
8
9
  function registerBuild(react) {
9
10
  react
10
- .command('build [file]')
11
- .description('Build a React application inside Codenotch project')
12
- .option('-c, --cluster <url>', 'Cluster URL to make the .env file.')
13
- .action(async (filePath, options) => {
14
- await BuildUtils_1.default.buildApp(filePath, options.cluster);
11
+ .command('build [app]')
12
+ .description('Build a React app of the project into a ready-to-serve bundle. By its name, or the path of its component; the only app when omitted.')
13
+ .option('-c, --cluster <url>', 'cluster the app will talk to, written into the .env of the bundle')
14
+ .action(async (target, options) => {
15
+ const app = await (0, shared_1.resolveAppTarget)(target);
16
+ if (app === null) {
17
+ process.exitCode = 1;
18
+ return;
19
+ }
20
+ await BuildUtils_1.default.buildReactApp(app.scriptPath, options.cluster);
15
21
  });
16
22
  }
17
23
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/react/build.ts"],"names":[],"mappings":";;;;;AAGA,sCAQC;AAVD,wEAAmE;AAEnE,SAAgB,aAAa,CAAC,KAAc;IACxC,KAAK;SACA,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAsB,EAAE,EAAE;QACvD,MAAM,oBAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/react/build.ts"],"names":[],"mappings":";;;;;AAIA,sCAeC;AAlBD,wEAAmE;AACnE,qCAA4C;AAE5C,SAAgB,aAAa,CAAC,KAAc;IACxC,KAAK;SACA,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,sIAAsI,CAAC;SACnJ,MAAM,CAAC,qBAAqB,EAAE,mEAAmE,CAAC;SAClG,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAAsB,EAAE,EAAE;QAEjE,MAAM,GAAG,GAAG,MAAM,IAAA,yBAAgB,EAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QAED,MAAM,oBAAU,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerClean(react: Command): void;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerClean = registerClean;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const ConsoleUtils_1 = __importDefault(require("../../utils/ConsoleUtils"));
11
+ const FileUtils_1 = __importDefault(require("../../utils/FileUtils"));
12
+ const shared_1 = require("./shared");
13
+ /** The folders 'cn react build' and 'cn react dev' stage under .codenotch */
14
+ const STAGING_SUFFIXES = ['-source', '-dist', '-dev'];
15
+ function registerClean(react) {
16
+ react
17
+ .command('clean [app]')
18
+ .description('Delete the staging and bundle folders a build or a dev server left under .codenotch, for one app or for all')
19
+ .action(async (target) => {
20
+ const workspacePath = (0, shared_1.findWorkspace)();
21
+ if (workspacePath === undefined) {
22
+ console.error(chalk_1.default.yellow(`Aborted: no Codenotch project found from '${process.cwd()}' (no manifest.json in the parent folders).`));
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ const codenotchPath = (0, path_1.join)(workspacePath, '.codenotch');
27
+ if (!(0, fs_1.existsSync)(codenotchPath)) {
28
+ ConsoleUtils_1.default.check(`Nothing to clean, '${codenotchPath}' does not exist.`);
29
+ return;
30
+ }
31
+ const folders = (0, fs_1.readdirSync)(codenotchPath, { withFileTypes: true })
32
+ .filter(entry => entry.isDirectory())
33
+ .map(entry => entry.name)
34
+ .filter(name => STAGING_SUFFIXES.some(suffix => name.toLowerCase().endsWith(suffix)))
35
+ .filter(name => target === undefined || STAGING_SUFFIXES.some(suffix => name.toLowerCase() === `${target.toLowerCase()}${suffix}`));
36
+ if (folders.length === 0) {
37
+ ConsoleUtils_1.default.check(`Nothing to clean${target === undefined ? '' : ` for '${target}'`} in '${codenotchPath}'.`);
38
+ return;
39
+ }
40
+ for (const folder of folders) {
41
+ FileUtils_1.default.deleteRecursively((0, path_1.join)(codenotchPath, folder));
42
+ }
43
+ ConsoleUtils_1.default.check(`${folders.length} folder(s) deleted: ${folders.join(', ')}`);
44
+ });
45
+ }
46
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../../src/commands/react/clean.ts"],"names":[],"mappings":";;;;;AAWA,sCAoCC;AA9CD,kDAA0B;AAC1B,2BAA6C;AAC7C,+BAA4B;AAC5B,4EAAoD;AACpD,sEAA8C;AAC9C,qCAAyC;AAEzC,6EAA6E;AAC7E,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEtD,SAAgB,aAAa,CAAC,KAAc;IACxC,KAAK;SACA,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,6GAA6G,CAAC;SAC1H,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,EAAE;QAEzC,MAAM,aAAa,GAAG,IAAA,sBAAa,GAAE,CAAC;QACtC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,6CAA6C,OAAO,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAC,CAAC;YACrI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QAED,MAAM,aAAa,GAAG,IAAA,WAAI,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,IAAA,eAAU,EAAC,aAAa,CAAC,EAAE,CAAC;YAC7B,sBAAY,CAAC,KAAK,CAAC,sBAAsB,aAAa,mBAAmB,CAAC,CAAC;YAC3E,OAAO;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,gBAAW,EAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC9D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;aACpC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;aACpF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAExI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,sBAAY,CAAC,KAAK,CAAC,mBAAmB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,QAAQ,aAAa,IAAI,CAAC,CAAC;YAC/G,OAAO;QACX,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,mBAAS,CAAC,iBAAiB,CAAC,IAAA,WAAI,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,sBAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDev(react: Command): void;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerDev = registerDev;
7
+ const BuildUtils_1 = __importDefault(require("../../utils/BuildUtils"));
8
+ const shared_1 = require("./shared");
9
+ function registerDev(react) {
10
+ react
11
+ .command('dev [app]')
12
+ .description('Start the Vite dev server of an app, with hot reload on the project sources. By name; the only app when omitted.')
13
+ .option('-p, --port <port>', 'port of the dev server (default 5173)', (value) => parseInt(value, 10), 5173)
14
+ .option('-c, --cluster <url>', 'cluster the app will talk to, exposed to the page through /api/env')
15
+ .option('--no-open', 'do not open the browser once the server is up')
16
+ .action(async (target, options) => {
17
+ const app = await (0, shared_1.resolveAppTarget)(target);
18
+ if (app === null) {
19
+ process.exitCode = 1;
20
+ return;
21
+ }
22
+ const exitCode = await BuildUtils_1.default.devReactApp(app.scriptPath, { port: options.port, clusterUrl: options.cluster, open: options.open });
23
+ if (exitCode !== 0) {
24
+ process.exitCode = exitCode;
25
+ }
26
+ });
27
+ }
28
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/commands/react/dev.ts"],"names":[],"mappings":";;;;;AAIA,kCAoBC;AAvBD,wEAAgD;AAChD,qCAA4C;AAE5C,SAAgB,WAAW,CAAC,KAAc;IACtC,KAAK;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,kHAAkH,CAAC;SAC/H,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;SAClH,MAAM,CAAC,qBAAqB,EAAE,oEAAoE,CAAC;SACnG,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAA0D,EAAE,EAAE;QAErG,MAAM,GAAG,GAAG,MAAM,IAAA,yBAAgB,EAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,oBAAU,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACvI,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAChC,CAAC;IACL,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -3,11 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerReactCommands = registerReactCommands;
4
4
  const serve_1 = require("./serve");
5
5
  const build_1 = require("./build");
6
+ const dev_1 = require("./dev");
7
+ const clean_1 = require("./clean");
6
8
  function registerReactCommands(program) {
7
9
  const react = program
8
10
  .command('react')
9
11
  .description('React application management commands');
10
- (0, serve_1.registerServe)(react);
12
+ (0, dev_1.registerDev)(react);
11
13
  (0, build_1.registerBuild)(react);
14
+ (0, serve_1.registerServe)(react);
15
+ (0, clean_1.registerClean)(react);
12
16
  }
13
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/react/index.ts"],"names":[],"mappings":";;AAIA,sDAOC;AAVD,mCAAwC;AACxC,mCAAwC;AAExC,SAAgB,qBAAqB,CAAC,OAAgB;IAClD,MAAM,KAAK,GAAG,OAAO;SAChB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAE1D,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;IACrB,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/react/index.ts"],"names":[],"mappings":";;AAMA,sDASC;AAdD,mCAAwC;AACxC,mCAAwC;AACxC,+BAAoC;AACpC,mCAAwC;AAExC,SAAgB,qBAAqB,CAAC,OAAgB;IAClD,MAAM,KAAK,GAAG,OAAO;SAChB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAE1D,IAAA,iBAAW,EAAC,KAAK,CAAC,CAAC;IACnB,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;IACrB,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;IACrB,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}
@@ -4,15 +4,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.registerServe = registerServe;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
7
10
  const ServeUtils_1 = __importDefault(require("../../utils/ServeUtils"));
11
+ const shared_1 = require("./shared");
8
12
  function registerServe(react) {
9
13
  react
10
- .command('serve [directory]')
11
- .description('Serve a built React application using a simple HTTP server')
14
+ .command('serve [target]')
15
+ .alias('preview')
16
+ .description('Serve the built bundle of an app (by name, the only app when omitted), or any folder holding an index.html')
12
17
  .option('-p, --port <port>', 'port to serve the application on (default 5000)', (value) => parseInt(value, 10), 5000)
13
18
  .option('-i, --index <name>', 'index file name (default index.html)', 'index.html')
14
- .action(async (directory, options) => {
15
- await ServeUtils_1.default.serveApp(directory, options);
19
+ .action(async (target, options) => {
20
+ // An explicit folder is served as it is, whatever it holds
21
+ if (target !== undefined) {
22
+ const asPath = (0, path_1.resolve)(target);
23
+ if ((0, fs_1.existsSync)(asPath) && (0, fs_1.lstatSync)(asPath).isDirectory()) {
24
+ await ServeUtils_1.default.serveApp(asPath, options);
25
+ return;
26
+ }
27
+ }
28
+ // Outside a project and without target, keep serving the current folder as before
29
+ if (target === undefined && (0, shared_1.findWorkspace)() === undefined) {
30
+ await ServeUtils_1.default.serveApp(process.cwd(), options);
31
+ return;
32
+ }
33
+ const app = await (0, shared_1.resolveAppTarget)(target);
34
+ if (app === null) {
35
+ process.exitCode = 1;
36
+ return;
37
+ }
38
+ const distPath = (0, path_1.join)(app.workspacePath, '.codenotch', `${app.name}-dist`);
39
+ if (!(0, fs_1.existsSync)(distPath)) {
40
+ console.error(chalk_1.default.yellow(`Aborted: no build found for '${app.name}' (${distPath}). Build it first with 'cn react build ${app.name}'.`));
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ await ServeUtils_1.default.serveApp(distPath, options);
16
45
  });
17
46
  }
18
47
  //# sourceMappingURL=serve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/react/serve.ts"],"names":[],"mappings":";;;;;AAGA,sCASC;AAXD,wEAAmE;AAEnE,SAAgB,aAAa,CAAC,KAAc;IACxC,KAAK;SACA,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;SAC5H,MAAM,CAAC,oBAAoB,EAAE,sCAAsC,EAAE,YAAY,CAAC;SAClF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAsB,EAAE,EAAE;QACxD,MAAM,oBAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/react/serve.ts"],"names":[],"mappings":";;;;;AAOA,sCAuCC;AA7CD,kDAA0B;AAC1B,2BAA2C;AAC3C,+BAAqC;AACrC,wEAAmE;AACnE,qCAA2D;AAE3D,SAAgB,aAAa,CAAC,KAAc;IACxC,KAAK;SACA,OAAO,CAAC,gBAAgB,CAAC;SACzB,KAAK,CAAC,SAAS,CAAC;SAChB,WAAW,CAAC,4GAA4G,CAAC;SACzH,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;SAC5H,MAAM,CAAC,oBAAoB,EAAE,sCAAsC,EAAE,YAAY,CAAC;SAClF,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAAsB,EAAE,EAAE;QAEjE,2DAA2D;QAC3D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,IAAA,eAAU,EAAC,MAAM,CAAC,IAAI,IAAA,cAAS,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxD,MAAM,oBAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC3C,OAAO;YACX,CAAC;QACL,CAAC;QAED,kFAAkF;QAClF,IAAI,MAAM,KAAK,SAAS,IAAI,IAAA,sBAAa,GAAE,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,oBAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO;QACX,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAA,yBAAgB,EAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,gCAAgC,GAAG,CAAC,IAAI,MAAM,QAAQ,0CAA0C,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAC1I,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACX,CAAC;QAED,MAAM,oBAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** An app a 'cn react ...' command will work on */
2
+ export interface IResolvedApp {
3
+ /** Name of the app as the build knows it: 'app.name' of its manifest, that names the .codenotch folders */
4
+ name: string;
5
+ /** Absolute path of the *.tsx/*.jsx component */
6
+ scriptPath: string;
7
+ /** Absolute path of the project root */
8
+ workspacePath: string;
9
+ }
10
+ /** Root of the Codenotch project a folder belongs to, walking up to the closest manifest.json */
11
+ export declare function findWorkspace(fromDir?: string): string | undefined;
12
+ /**
13
+ * The app targeted by a 'cn react ...' command.
14
+ *
15
+ * `target` may be the name of an app of the surrounding project, or directly the path of its
16
+ * component. Without a target, the only app of the project is taken, and when there are several
17
+ * the choice is asked on the terminal (first one when nobody can answer).
18
+ *
19
+ * Returns null after printing the reason when no app can be resolved.
20
+ */
21
+ export declare function resolveAppTarget(target?: string): Promise<IResolvedApp | null>;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.findWorkspace = findWorkspace;
7
+ exports.resolveAppTarget = resolveAppTarget;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const BuildUtils_1 = __importDefault(require("../../utils/BuildUtils"));
12
+ const ConsoleUtils_1 = __importDefault(require("../../utils/ConsoleUtils"));
13
+ const FileUtils_1 = __importDefault(require("../../utils/FileUtils"));
14
+ const ProjectUtils_1 = __importDefault(require("../../utils/ProjectUtils"));
15
+ /** Root of the Codenotch project a folder belongs to, walking up to the closest manifest.json */
16
+ function findWorkspace(fromDir = process.cwd()) {
17
+ // findWorkspaceFromFile strips the last segment, hand it a dummy file
18
+ return BuildUtils_1.default.findWorkspaceFromFile((0, path_1.join)(fromDir, '_'));
19
+ }
20
+ /**
21
+ * The app targeted by a 'cn react ...' command.
22
+ *
23
+ * `target` may be the name of an app of the surrounding project, or directly the path of its
24
+ * component. Without a target, the only app of the project is taken, and when there are several
25
+ * the choice is asked on the terminal (first one when nobody can answer).
26
+ *
27
+ * Returns null after printing the reason when no app can be resolved.
28
+ */
29
+ async function resolveAppTarget(target) {
30
+ // A path to an existing component wins over a name
31
+ if (target !== undefined) {
32
+ const asPath = (0, path_1.resolve)(target);
33
+ if (/\.(tsx|jsx)$/i.test(asPath) && (0, fs_1.existsSync)(asPath) && !(0, fs_1.lstatSync)(asPath).isDirectory()) {
34
+ const workspacePath = BuildUtils_1.default.findWorkspaceFromFile(asPath);
35
+ if (workspacePath === undefined) {
36
+ console.error(chalk_1.default.yellow(`Aborted: '${asPath}' is outside a Codenotch project (no manifest.json in its parent folders).`));
37
+ return null;
38
+ }
39
+ const apps = await ProjectUtils_1.default.discoverAppsFiles(workspacePath);
40
+ const app = apps.find(candidate => candidate.scriptPath.toLowerCase() === asPath.toLowerCase());
41
+ return app !== undefined
42
+ ? toResolvedApp(app, workspacePath)
43
+ : { name: FileUtils_1.default.getNameFromPath(asPath, true), scriptPath: asPath, workspacePath };
44
+ }
45
+ }
46
+ const workspacePath = findWorkspace();
47
+ if (workspacePath === undefined) {
48
+ console.error(chalk_1.default.yellow(`Aborted: no Codenotch project found from '${process.cwd()}' (no manifest.json in the parent folders).`));
49
+ return null;
50
+ }
51
+ const apps = await ProjectUtils_1.default.discoverAppsFiles(workspacePath);
52
+ if (apps.length === 0) {
53
+ console.error(chalk_1.default.yellow(`Aborted: the project '${workspacePath}' has no app (a *.tsx with its sibling *.manifest.json). Create one with 'cn generate app -n <Name>'.`));
54
+ return null;
55
+ }
56
+ if (target !== undefined) {
57
+ const app = apps.find(candidate => appNameOf(candidate).toLowerCase() === target.toLowerCase());
58
+ if (app === undefined) {
59
+ console.error(chalk_1.default.yellow(`Aborted: no app named '${target}' in '${workspacePath}'. Available: ${apps.map(a => appNameOf(a)).join(', ')}.`));
60
+ return null;
61
+ }
62
+ return toResolvedApp(app, workspacePath);
63
+ }
64
+ if (apps.length === 1) {
65
+ return toResolvedApp(apps[0], workspacePath);
66
+ }
67
+ const index = await ConsoleUtils_1.default.select('Which app?', apps.map(app => ({
68
+ name: appNameOf(app),
69
+ description: FileUtils_1.default.getNameFromPath(app.scriptPath)
70
+ })), 0);
71
+ return toResolvedApp(apps[index], workspacePath);
72
+ }
73
+ /** The name the build folders are named after: the manifest one, the file name as a fallback */
74
+ function appNameOf(app) {
75
+ return `${app.manifest.app?.name ?? ''}`.trim() || app.name;
76
+ }
77
+ function toResolvedApp(app, workspacePath) {
78
+ return { name: appNameOf(app), scriptPath: app.scriptPath, workspacePath };
79
+ }
80
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/react/shared.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import ts from 'typescript';
2
2
  import { ICodenotchProjectManifest, ICompilationMessage } from '@codenotch/codenotch.core';
3
- export type KnownFiles = 'manifest' | 'script' | 'json' | 'app-manifest';
3
+ export type KnownFiles = 'manifest' | 'script' | 'json' | 'app-manifest' | 'i18n';
4
4
  /** Everything a file validator may need: the file itself and the surrounding Codenotch project when one was found. */
5
5
  export interface ValidationContext {
6
6
  filePath: string;
@@ -17,6 +17,9 @@ class ValidationUtils {
17
17
  else if (name.endsWith('.manifest.json')) {
18
18
  return 'app-manifest';
19
19
  }
20
+ else if (name.endsWith('.i18n.csv')) {
21
+ return 'i18n';
22
+ }
20
23
  else if (['ts', 'tsx', 'js', 'jsx', 'cjs', 'mjs', 'cts', 'mts'].includes(ext)) {
21
24
  // Table, process, documents, etc
22
25
  return 'script';