@codenotch/codenotch.cli 1.0.35 → 1.0.37
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.
- package/README.md +2 -2
- package/dist/commands/generate/app.d.ts +2 -0
- package/dist/commands/generate/app.js +45 -0
- package/dist/commands/generate/app.js.map +1 -0
- package/dist/commands/generate/appmanifest.d.ts +2 -0
- package/dist/commands/generate/appmanifest.js +34 -0
- package/dist/commands/generate/appmanifest.js.map +1 -0
- package/dist/commands/generate/dbcontext.d.ts +2 -0
- package/dist/commands/generate/dbcontext.js +32 -0
- package/dist/commands/generate/dbcontext.js.map +1 -0
- package/dist/commands/generate/i18n.d.ts +2 -0
- package/dist/commands/generate/i18n.js +29 -0
- package/dist/commands/generate/i18n.js.map +1 -0
- package/dist/commands/generate/index.d.ts +2 -0
- package/dist/commands/generate/index.js +23 -0
- package/dist/commands/generate/index.js.map +1 -0
- package/dist/commands/generate/manifest.d.ts +2 -0
- package/dist/commands/generate/manifest.js +29 -0
- package/dist/commands/generate/manifest.js.map +1 -0
- package/dist/commands/generate/openapi.d.ts +2 -0
- package/dist/commands/generate/openapi.js +32 -0
- package/dist/commands/generate/openapi.js.map +1 -0
- package/dist/commands/generate/pkg.d.ts +2 -0
- package/dist/commands/generate/pkg.js +34 -0
- package/dist/commands/generate/pkg.js.map +1 -0
- package/dist/commands/generate/shared.d.ts +17 -0
- package/dist/commands/generate/shared.js +70 -0
- package/dist/commands/generate/shared.js.map +1 -0
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/project/new.js +107 -187
- package/dist/commands/project/new.js.map +1 -1
- package/dist/commands/react/build.js +11 -5
- package/dist/commands/react/build.js.map +1 -1
- package/dist/commands/react/clean.d.ts +2 -0
- package/dist/commands/react/clean.js +46 -0
- package/dist/commands/react/clean.js.map +1 -0
- package/dist/commands/react/dev.d.ts +2 -0
- package/dist/commands/react/dev.js +27 -0
- package/dist/commands/react/dev.js.map +1 -0
- package/dist/commands/react/index.js +5 -1
- package/dist/commands/react/index.js.map +1 -1
- package/dist/commands/react/serve.js +33 -4
- package/dist/commands/react/serve.js.map +1 -1
- package/dist/commands/react/shared.d.ts +21 -0
- package/dist/commands/react/shared.js +80 -0
- package/dist/commands/react/shared.js.map +1 -0
- package/dist/commands/system/info.js +0 -7
- package/dist/commands/system/info.js.map +1 -1
- package/dist/commands/validation/ValidationUtils.d.ts +3 -13
- package/dist/commands/validation/ValidationUtils.js +5 -58
- package/dist/commands/validation/ValidationUtils.js.map +1 -1
- package/dist/commands/validation/files/AppManifestValidator.js +5 -20
- package/dist/commands/validation/files/AppManifestValidator.js.map +1 -1
- package/dist/commands/validation/files/I18nValidator.d.ts +24 -0
- package/dist/commands/validation/files/I18nValidator.js +190 -5
- package/dist/commands/validation/files/I18nValidator.js.map +1 -1
- package/dist/commands/validation/files/{BpmnValidator.d.ts → ProjectManifestValidator.d.ts} +1 -1
- package/dist/commands/validation/files/ProjectManifestValidator.js +31 -0
- package/dist/commands/validation/files/ProjectManifestValidator.js.map +1 -0
- package/dist/commands/validation/files/ScriptValidator.d.ts +6 -2
- package/dist/commands/validation/files/ScriptValidator.js +1 -1
- package/dist/commands/validation/files/ScriptValidator.js.map +1 -1
- package/dist/commands/validation/validate.js +15 -46
- package/dist/commands/validation/validate.js.map +1 -1
- package/dist/models/Codenotch.d.ts +0 -205
- package/dist/models/Codenotch.js +0 -211
- package/dist/models/Codenotch.js.map +1 -1
- package/dist/utils/BuildUtils.d.ts +66 -28
- package/dist/utils/BuildUtils.js +292 -330
- package/dist/utils/BuildUtils.js.map +1 -1
- package/dist/utils/ConsoleUtils.d.ts +13 -0
- package/dist/utils/ConsoleUtils.js +50 -0
- package/dist/utils/ConsoleUtils.js.map +1 -1
- package/dist/utils/DbSchemaUtils.d.ts +49 -0
- package/dist/utils/DbSchemaUtils.js +246 -0
- package/dist/utils/DbSchemaUtils.js.map +1 -0
- package/dist/utils/FileUtils.d.ts +104 -15
- package/dist/utils/FileUtils.js +285 -100
- package/dist/utils/FileUtils.js.map +1 -1
- package/dist/utils/GitHubAuthUtils.js.map +1 -1
- package/dist/utils/I18nTsUtils.d.ts +66 -0
- package/dist/utils/I18nTsUtils.js +221 -0
- package/dist/utils/I18nTsUtils.js.map +1 -0
- package/dist/utils/ManifestUtils.d.ts +24 -0
- package/dist/utils/ManifestUtils.js +53 -0
- package/dist/utils/ManifestUtils.js.map +1 -0
- package/dist/utils/OpenApiUtils.d.ts +81 -0
- package/dist/utils/OpenApiUtils.js +123 -0
- package/dist/utils/OpenApiUtils.js.map +1 -0
- package/dist/utils/ProjectCompilationUtils.d.ts +3 -30
- package/dist/utils/ProjectCompilationUtils.js +26 -760
- package/dist/utils/ProjectCompilationUtils.js.map +1 -1
- package/dist/utils/ProjectGeneratorUtils.d.ts +35 -0
- package/dist/utils/ProjectGeneratorUtils.js +119 -0
- package/dist/utils/ProjectGeneratorUtils.js.map +1 -0
- package/dist/utils/ProjectTemplates.d.ts +102 -0
- package/dist/utils/ProjectTemplates.js +284 -0
- package/dist/utils/ProjectTemplates.js.map +1 -0
- package/dist/utils/ProjectUtils.d.ts +217 -4
- package/dist/utils/ProjectUtils.js +386 -50
- package/dist/utils/ProjectUtils.js.map +1 -1
- package/dist/utils/RuntimeUtils.js +14 -8
- package/dist/utils/RuntimeUtils.js.map +1 -1
- package/dist/utils/ScriptDeclarationUtils.d.ts +169 -0
- package/dist/utils/ScriptDeclarationUtils.js +398 -0
- package/dist/utils/ScriptDeclarationUtils.js.map +1 -0
- package/dist/utils/ServeUtils.d.ts +0 -1
- package/dist/utils/ServeUtils.js +11 -29
- package/dist/utils/ServeUtils.js.map +1 -1
- package/dist/utils/ShellUtils.d.ts +6 -0
- package/dist/utils/ShellUtils.js +13 -0
- package/dist/utils/ShellUtils.js.map +1 -1
- package/dist/utils/TemplateUtils.d.ts +62 -0
- package/dist/utils/TemplateUtils.js +218 -0
- package/dist/utils/TemplateUtils.js.map +1 -0
- package/dist/utils/TypeSchemaUtils.d.ts +42 -0
- package/dist/utils/TypeSchemaUtils.js +171 -0
- package/dist/utils/TypeSchemaUtils.js.map +1 -0
- package/package.json +3 -3
- package/dist/commands/validation/files/BpmnValidator.js +0 -32
- package/dist/commands/validation/files/BpmnValidator.js.map +0 -1
- package/dist/commands/validation/files/DbSchemaValidator.d.ts +0 -5
- package/dist/commands/validation/files/DbSchemaValidator.js +0 -16
- package/dist/commands/validation/files/DbSchemaValidator.js.map +0 -1
- package/dist/commands/validation/files/DocumentValidator.d.ts +0 -5
- package/dist/commands/validation/files/DocumentValidator.js +0 -12
- package/dist/commands/validation/files/DocumentValidator.js.map +0 -1
- package/dist/commands/validation/files/ManifestCacheValidator.d.ts +0 -5
- package/dist/commands/validation/files/ManifestCacheValidator.js +0 -121
- package/dist/commands/validation/files/ManifestCacheValidator.js.map +0 -1
- package/dist/commands/validation/files/ManifestValidator.d.ts +0 -5
- package/dist/commands/validation/files/ManifestValidator.js +0 -14
- package/dist/commands/validation/files/ManifestValidator.js.map +0 -1
- package/dist/commands/validation/files/TableValidator.d.ts +0 -5
- package/dist/commands/validation/files/TableValidator.js +0 -19
- package/dist/commands/validation/files/TableValidator.js.map +0 -1
- package/dist/models/DbModels.d.ts +0 -221
- package/dist/models/DbModels.js +0 -130
- package/dist/models/DbModels.js.map +0 -1
- package/dist/models/OpenApiModels.d.ts +0 -115
- package/dist/models/OpenApiModels.js +0 -103
- package/dist/models/OpenApiModels.js.map +0 -1
- package/dist/utils/I18nUtils.d.ts +0 -9
- package/dist/utils/I18nUtils.js +0 -54
- package/dist/utils/I18nUtils.js.map +0 -1
- package/dist/utils/OpenAPIUtils.d.ts +0 -33
- package/dist/utils/OpenAPIUtils.js +0 -279
- package/dist/utils/OpenAPIUtils.js.map +0 -1
|
@@ -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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"}
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.registerInfo = registerInfo;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const os_1 = require("os");
|
|
9
8
|
function registerInfo(program) {
|
|
10
9
|
program
|
|
11
10
|
.command('info')
|
|
@@ -17,12 +16,6 @@ function registerInfo(program) {
|
|
|
17
16
|
console.log(`- Architecture: ${chalk_1.default.yellow(process.arch)}`);
|
|
18
17
|
console.log(`- Nvm version: ${chalk_1.default.yellow(process.env.NVM_BIN ? 'nvm detected' : 'nvm not detected')}`);
|
|
19
18
|
console.log(`- Current directory: ${chalk_1.default.yellow(process.cwd())}`);
|
|
20
|
-
if ((0, os_1.platform)() === 'win32') {
|
|
21
|
-
console.log(`- Download Ide: https://codenotchide.blob.core.windows.net/release-win/Codenotch%20Latest.exe?sv=2023-01-03&ss=btqf&srt=sco&spr=https%2Chttp&st=2025-08-28T12%3A46%3A05Z&se=2039-06-23T15%3A46%3A00Z&sp=rlp&sig=7ivKIFM4nANK4VzdKp20bzaNZhaZZ51YIvzriUacxBw%3D`);
|
|
22
|
-
}
|
|
23
|
-
else if ((0, os_1.platform)() === 'linux') {
|
|
24
|
-
console.log(`- Download Ide: https://codenotchide.blob.core.windows.net/release-linux/codenotch-ide_latest_amd64.deb?sv=2023-01-03&ss=btqf&srt=sco&spr=https%2Chttp&st=2025-08-28T12%3A46%3A05Z&se=2039-06-23T15%3A46%3A00Z&sp=rlp&sig=7ivKIFM4nANK4VzdKp20bzaNZhaZZ51YIvzriUacxBw%3D`);
|
|
25
|
-
}
|
|
26
19
|
});
|
|
27
20
|
}
|
|
28
21
|
//# sourceMappingURL=info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/system/info.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/system/info.ts"],"names":[],"mappings":";;;;;AAGA,oCAYC;AAdD,kDAA0B;AAE1B,SAAgB,YAAY,CAAC,OAAgB;IACzC,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,eAAe,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,kBAAkB,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,wBAAwB,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import ts from 'typescript';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export type KnownFiles = 'bpmn' | 'manifest' | 'table' | 'document' | 'dbschema' | 'i18n' | 'script' | 'json' | 'manifest-cache' | 'app-manifest';
|
|
2
|
+
import { ICodenotchProjectManifest, ICompilationMessage } from '@codenotch/codenotch.core';
|
|
3
|
+
export type KnownFiles = 'manifest' | 'script' | 'json' | 'app-manifest' | 'i18n';
|
|
5
4
|
/** Everything a file validator may need: the file itself and the surrounding Codenotch project when one was found. */
|
|
6
5
|
export interface ValidationContext {
|
|
7
6
|
filePath: string;
|
|
8
7
|
content: string;
|
|
9
8
|
projectPath?: string;
|
|
10
|
-
|
|
11
|
-
manifestCache?: IWorkspaceCache;
|
|
9
|
+
manifest?: ICodenotchProjectManifest;
|
|
12
10
|
}
|
|
13
11
|
export default abstract class ValidationUtils {
|
|
14
12
|
static determineFileType(filePath: string): KnownFiles | undefined;
|
|
@@ -17,12 +15,4 @@ export default abstract class ValidationUtils {
|
|
|
17
15
|
static validateJsonSyntax(content: string, filePath: string): ICompilationMessage[];
|
|
18
16
|
/** Lists all files under a folder, skipping dot-folders and generated/vendored directories. */
|
|
19
17
|
static listFilesRecursive(folderPath: string): string[];
|
|
20
|
-
static loadProjectTables(context: ValidationContext): Promise<{
|
|
21
|
-
service: string;
|
|
22
|
-
model: TableDefinition;
|
|
23
|
-
}[]>;
|
|
24
|
-
static loadProjectDocuments(context: ValidationContext): Promise<{
|
|
25
|
-
service: string;
|
|
26
|
-
model: AbstractRecordContainer;
|
|
27
|
-
}[]>;
|
|
28
18
|
}
|
|
@@ -7,36 +7,21 @@ const path_1 = __importDefault(require("path"));
|
|
|
7
7
|
const fs_1 = require("fs");
|
|
8
8
|
const typescript_1 = __importDefault(require("typescript"));
|
|
9
9
|
const FileUtils_1 = __importDefault(require("../../utils/FileUtils"));
|
|
10
|
-
const codenotch_core_1 = require("@codenotch/codenotch.core");
|
|
11
10
|
class ValidationUtils {
|
|
12
11
|
static determineFileType(filePath) {
|
|
13
12
|
const name = FileUtils_1.default.getNameFromPath(filePath);
|
|
14
13
|
const ext = FileUtils_1.default.getExtensionFromPath(filePath).toLowerCase();
|
|
15
|
-
if (
|
|
16
|
-
return 'bpmn';
|
|
17
|
-
}
|
|
18
|
-
else if (ext === 'jschema') {
|
|
19
|
-
return 'document';
|
|
20
|
-
}
|
|
21
|
-
else if (ext === 'table') {
|
|
22
|
-
return 'table';
|
|
23
|
-
}
|
|
24
|
-
else if (ext === 'csv' && name.endsWith('.i18n.csv')) {
|
|
25
|
-
return 'i18n';
|
|
26
|
-
}
|
|
27
|
-
else if (name === 'db-schema.xml') {
|
|
28
|
-
return 'dbschema';
|
|
29
|
-
}
|
|
30
|
-
else if (name === 'manifest.json') {
|
|
14
|
+
if (name === 'manifest.json') {
|
|
31
15
|
return 'manifest';
|
|
32
16
|
}
|
|
33
|
-
else if (name === 'manifest.cache.json') {
|
|
34
|
-
return 'manifest-cache';
|
|
35
|
-
}
|
|
36
17
|
else if (name.endsWith('.manifest.json')) {
|
|
37
18
|
return 'app-manifest';
|
|
38
19
|
}
|
|
20
|
+
else if (name.endsWith('.i18n.csv')) {
|
|
21
|
+
return 'i18n';
|
|
22
|
+
}
|
|
39
23
|
else if (['ts', 'tsx', 'js', 'jsx', 'cjs', 'mjs', 'cts', 'mts'].includes(ext)) {
|
|
24
|
+
// Table, process, documents, etc
|
|
40
25
|
return 'script';
|
|
41
26
|
}
|
|
42
27
|
else if (ext === 'json') {
|
|
@@ -139,44 +124,6 @@ class ValidationUtils {
|
|
|
139
124
|
visit(folderPath);
|
|
140
125
|
return files;
|
|
141
126
|
}
|
|
142
|
-
static async loadProjectTables(context) {
|
|
143
|
-
const { fullManifest, projectPath } = context;
|
|
144
|
-
if (fullManifest === undefined || projectPath === undefined) {
|
|
145
|
-
return [];
|
|
146
|
-
}
|
|
147
|
-
const tables = [];
|
|
148
|
-
for (const manifestTable of fullManifest.tableDataSources) {
|
|
149
|
-
try {
|
|
150
|
-
const tablePath = path_1.default.join(projectPath, manifestTable.file);
|
|
151
|
-
const tableJson = await FileUtils_1.default.readFileAsync(tablePath);
|
|
152
|
-
const table = (new codenotch_core_1.TableCompiler()).deserialize(tableJson);
|
|
153
|
-
tables.push({ service: fullManifest.serviceName, model: table });
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
// Fail silently
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return tables;
|
|
160
|
-
}
|
|
161
|
-
static async loadProjectDocuments(context) {
|
|
162
|
-
const { fullManifest, projectPath } = context;
|
|
163
|
-
if (fullManifest === undefined || projectPath === undefined) {
|
|
164
|
-
return [];
|
|
165
|
-
}
|
|
166
|
-
const documents = [];
|
|
167
|
-
for (const manifestDoc of fullManifest.documentDataSources) {
|
|
168
|
-
try {
|
|
169
|
-
const docPath = path_1.default.join(projectPath, manifestDoc.file);
|
|
170
|
-
const docJson = await FileUtils_1.default.readFileAsync(docPath);
|
|
171
|
-
const doc = (new codenotch_core_1.DocumentCompiler()).deserialize(docJson);
|
|
172
|
-
documents.push({ service: fullManifest.serviceName, model: doc });
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
// Fail silently
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return documents;
|
|
179
|
-
}
|
|
180
127
|
}
|
|
181
128
|
exports.default = ValidationUtils;
|
|
182
129
|
//# sourceMappingURL=ValidationUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidationUtils.js","sourceRoot":"","sources":["../../../src/commands/validation/ValidationUtils.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,2BAAiC;AACjC,4DAA4B;AAC5B,sEAA8C;
|
|
1
|
+
{"version":3,"file":"ValidationUtils.js","sourceRoot":"","sources":["../../../src/commands/validation/ValidationUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,7 +51,7 @@ class AppManifestValidator {
|
|
|
51
51
|
// The application file must live next to its manifest (App.manifest.json -> App.tsx)
|
|
52
52
|
const folder = path_1.default.dirname(context.filePath);
|
|
53
53
|
const baseName = path_1.default.basename(context.filePath).replace(/\.manifest\.json$/i, '');
|
|
54
|
-
const appFile = ['.tsx', '.jsx'
|
|
54
|
+
const appFile = ['.tsx', '.jsx'].map(ext => (0, path_1.join)(folder, baseName + ext)).find(f => (0, fs_1.existsSync)(f));
|
|
55
55
|
if (appFile === undefined) {
|
|
56
56
|
messages.push({
|
|
57
57
|
severity: 'error',
|
|
@@ -59,33 +59,18 @@ class AppManifestValidator {
|
|
|
59
59
|
target: baseName
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
if (`${manifest.
|
|
62
|
+
if (`${manifest.app?.name ?? ''}`.trim() === '') {
|
|
63
63
|
messages.push({
|
|
64
64
|
severity: 'error',
|
|
65
|
-
message: `The app manifest must define '
|
|
66
|
-
target: 'auml.name'
|
|
65
|
+
message: `The app manifest must define 'app.name', it is used as the application name by the build.`
|
|
67
66
|
});
|
|
68
67
|
}
|
|
69
|
-
if (manifest.
|
|
68
|
+
if (manifest.app?.scope !== undefined && APP_SCOPES.includes(manifest.app.scope) === false) {
|
|
70
69
|
messages.push({
|
|
71
70
|
severity: 'error',
|
|
72
|
-
message: `Invalid scope '${manifest.
|
|
73
|
-
target: 'auml.scope'
|
|
71
|
+
message: `Invalid scope '${manifest.app.scope}', expected one of: ${APP_SCOPES.join(', ')}.`
|
|
74
72
|
});
|
|
75
73
|
}
|
|
76
|
-
// Roles must be declared in the project manifest
|
|
77
|
-
if (context.fullManifest) {
|
|
78
|
-
const knownRoles = (context.fullManifest.roles ?? []).map(r => r.name);
|
|
79
|
-
for (const role of manifest.auml?.roles ?? []) {
|
|
80
|
-
if (knownRoles.includes(role) === false) {
|
|
81
|
-
messages.push({
|
|
82
|
-
severity: 'error',
|
|
83
|
-
message: `The role '${role}' is not declared in the project 'manifest.json' (known roles: ${knownRoles.length > 0 ? knownRoles.join(', ') : 'none'}).`,
|
|
84
|
-
target: 'auml.roles'
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
74
|
return messages;
|
|
90
75
|
}
|
|
91
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppManifestValidator.js","sourceRoot":"","sources":["../../../../src/commands/validation/files/AppManifestValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAkC;AAClC,2BAAgC;
|
|
1
|
+
{"version":3,"file":"AppManifestValidator.js","sourceRoot":"","sources":["../../../../src/commands/validation/files/AppManifestValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAkC;AAClC,2BAAgC;AAEhC,yEAAwE;AAExE,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEtD,uGAAuG;AACvG,MAA8B,oBAAoB;IAE9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAA0B;QAC5C,MAAM,QAAQ,GAAG,yBAAe,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;YAC7C,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE3D,qFAAqF;QACrF,MAAM,MAAM,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAA,WAAI,EAAC,MAAM,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,eAAU,EAAC,CAAC,CAAC,CAAC,CAAC;QACnG,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,yBAAyB,QAAQ,yCAAyC;gBACnF,MAAM,EAAE,QAAQ;aACnB,CAAC,CAAC;QACP,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,QAAQ,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,2FAA2F;aACvG,CAAC,CAAC;QACP,CAAC;QAED,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;YACzF,QAAQ,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,kBAAkB,QAAQ,CAAC,GAAG,CAAC,KAAK,uBAAuB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aAC/F,CAAC,CAAC;QACP,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAtCD,uCAsCC"}
|
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
import { ICompilationMessage } from '@codenotch/codenotch.core';
|
|
2
2
|
import { ValidationContext } from '../ValidationUtils';
|
|
3
|
+
/**
|
|
4
|
+
* Validates a translation file ('*.i18n.csv').
|
|
5
|
+
*
|
|
6
|
+
* The file is read as raw rows rather than through a header parser, so every message can point at
|
|
7
|
+
* the line it comes from, empty lines included. Rules:
|
|
8
|
+
*
|
|
9
|
+
* - errors: no 'key' first column, duplicated key
|
|
10
|
+
* - warnings: empty file, row without key, row longer than the header, language missing from or
|
|
11
|
+
* unexpected in the file, untranslated or 'todo' value, key holding whitespace, placeholders
|
|
12
|
+
* that differ between two languages of the same key
|
|
13
|
+
*/
|
|
3
14
|
export default abstract class I18nValidator {
|
|
4
15
|
static validate(context: ValidationContext): Promise<ICompilationMessage[]>;
|
|
16
|
+
private static validateRow;
|
|
17
|
+
/** Languages of the project that the file does not translate, and columns the project does not declare */
|
|
18
|
+
private static validateLanguages;
|
|
19
|
+
/**
|
|
20
|
+
* Every translation of a key must use the same placeholders, otherwise an argument silently
|
|
21
|
+
* disappears in one language: 'hello {0}' translated as 'bonjour' drops the name.
|
|
22
|
+
*/
|
|
23
|
+
private static validatePlaceholders;
|
|
24
|
+
/** Placeholder indexes of a translation, sorted and deduplicated */
|
|
25
|
+
private static getPlaceholders;
|
|
26
|
+
private static describePlaceholders;
|
|
27
|
+
/** A row papaparse produced for a blank line, or one holding only empty cells */
|
|
28
|
+
private static isEmptyRow;
|
|
5
29
|
}
|
|
@@ -1,12 +1,197 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
6
|
+
const papaparse_1 = __importDefault(require("papaparse"));
|
|
7
|
+
/** Placeholders of a translation: {0}, {1}, ... */
|
|
8
|
+
const PLACEHOLDER_PATTERN = /\{(\d+)\}/g;
|
|
9
|
+
/** Value meaning the translation is still to be written */
|
|
10
|
+
const TODO_VALUE = 'todo';
|
|
11
|
+
/**
|
|
12
|
+
* Validates a translation file ('*.i18n.csv').
|
|
13
|
+
*
|
|
14
|
+
* The file is read as raw rows rather than through a header parser, so every message can point at
|
|
15
|
+
* the line it comes from, empty lines included. Rules:
|
|
16
|
+
*
|
|
17
|
+
* - errors: no 'key' first column, duplicated key
|
|
18
|
+
* - warnings: empty file, row without key, row longer than the header, language missing from or
|
|
19
|
+
* unexpected in the file, untranslated or 'todo' value, key holding whitespace, placeholders
|
|
20
|
+
* that differ between two languages of the same key
|
|
21
|
+
*/
|
|
4
22
|
class I18nValidator {
|
|
5
23
|
static async validate(context) {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
24
|
+
const projectLanguages = context.manifest?.languages ?? [];
|
|
25
|
+
const rows = papaparse_1.default.parse(context.content).data;
|
|
26
|
+
const messages = [];
|
|
27
|
+
const header = rows.find(row => !this.isEmptyRow(row));
|
|
28
|
+
if (header === undefined) {
|
|
29
|
+
return [{
|
|
30
|
+
severity: 'warning',
|
|
31
|
+
code: 'i18n/empty-csv',
|
|
32
|
+
message: 'This translation file is empty, it declares no key at all.'
|
|
33
|
+
}];
|
|
34
|
+
}
|
|
35
|
+
if ((header[0] ?? '').trim() !== 'key') {
|
|
36
|
+
return [{
|
|
37
|
+
severity: 'error',
|
|
38
|
+
code: 'i18n/invalid-header',
|
|
39
|
+
message: `The first column of the header is '${header[0] ?? ''}' but 'key' is expected, so no translation can be read.`,
|
|
40
|
+
line: rows.indexOf(header) + 1,
|
|
41
|
+
target: header[0]
|
|
42
|
+
}];
|
|
43
|
+
}
|
|
44
|
+
const languages = header.slice(1).map(column => column.trim()).filter(column => column !== '');
|
|
45
|
+
messages.push(...this.validateLanguages(languages, projectLanguages));
|
|
46
|
+
// Key -> line it was first declared on, to report the second one as a duplicate
|
|
47
|
+
const declaredKeys = new Map();
|
|
48
|
+
for (let index = rows.indexOf(header) + 1; index < rows.length; index++) {
|
|
49
|
+
const row = rows[index];
|
|
50
|
+
const line = index + 1;
|
|
51
|
+
if (this.isEmptyRow(row)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const key = (row[0] ?? '').trim();
|
|
55
|
+
if (key === '') {
|
|
56
|
+
messages.push({
|
|
57
|
+
severity: 'warning',
|
|
58
|
+
code: 'i18n/empty-key',
|
|
59
|
+
message: `Line ${line} has no key, it is ignored by the translation files.`,
|
|
60
|
+
line
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const declaredAt = declaredKeys.get(key);
|
|
65
|
+
if (declaredAt !== undefined) {
|
|
66
|
+
messages.push({
|
|
67
|
+
severity: 'error',
|
|
68
|
+
code: 'i18n/duplicate-key',
|
|
69
|
+
message: `The key '${key}' is already declared at line ${declaredAt}.`,
|
|
70
|
+
line,
|
|
71
|
+
target: key
|
|
72
|
+
});
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
declaredKeys.set(key, line);
|
|
76
|
+
messages.push(...this.validateRow(row, key, languages, line, header.length));
|
|
77
|
+
}
|
|
78
|
+
return messages;
|
|
79
|
+
}
|
|
80
|
+
static validateRow(row, key, languages, line, headerLength) {
|
|
81
|
+
const messages = [];
|
|
82
|
+
if (/\s/.test(key)) {
|
|
83
|
+
messages.push({
|
|
84
|
+
severity: 'warning',
|
|
85
|
+
code: 'i18n/invalid-key',
|
|
86
|
+
message: `The key '${key}' contains whitespace, which makes it awkward to use from the generated typings.`,
|
|
87
|
+
line,
|
|
88
|
+
target: key
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (row.length > headerLength) {
|
|
92
|
+
messages.push({
|
|
93
|
+
severity: 'warning',
|
|
94
|
+
code: 'i18n/extra-column',
|
|
95
|
+
message: `Line ${line} has ${row.length} values but the header declares ${headerLength} columns, the extra ones are dropped.`,
|
|
96
|
+
line,
|
|
97
|
+
target: key
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Column 0 is the key, the languages follow in header order
|
|
101
|
+
const values = new Map(languages.map((language, position) => [language, (row[position + 1] ?? '').trim()]));
|
|
102
|
+
const untranslated = languages.filter(language => values.get(language) === '');
|
|
103
|
+
if (untranslated.length > 0) {
|
|
104
|
+
messages.push({
|
|
105
|
+
severity: 'warning',
|
|
106
|
+
code: 'i18n/empty-value',
|
|
107
|
+
message: `The key '${key}' has no translation for '${untranslated.join("', '")}'.`,
|
|
108
|
+
line,
|
|
109
|
+
target: key
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const todo = languages.filter(language => values.get(language)?.toLowerCase() === TODO_VALUE);
|
|
113
|
+
if (todo.length > 0) {
|
|
114
|
+
messages.push({
|
|
115
|
+
severity: 'warning',
|
|
116
|
+
code: 'i18n/todo-value',
|
|
117
|
+
message: `The translation of '${key}' for '${todo.join("', '")}' is still a todo.`,
|
|
118
|
+
line,
|
|
119
|
+
target: key
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
messages.push(...this.validatePlaceholders(values, key, line));
|
|
123
|
+
return messages;
|
|
124
|
+
}
|
|
125
|
+
/** Languages of the project that the file does not translate, and columns the project does not declare */
|
|
126
|
+
static validateLanguages(fileLanguages, projectLanguages) {
|
|
127
|
+
// Without a project there is nothing to compare the columns to
|
|
128
|
+
if (projectLanguages.length === 0) {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const messages = [];
|
|
132
|
+
const missing = projectLanguages.filter(language => !fileLanguages.includes(language));
|
|
133
|
+
if (missing.length > 0) {
|
|
134
|
+
messages.push({
|
|
135
|
+
severity: 'warning',
|
|
136
|
+
code: 'i18n/missing-language',
|
|
137
|
+
message: `The project declares the language(s) '${missing.join("', '")}' but this file has no column for them.`,
|
|
138
|
+
line: 1,
|
|
139
|
+
target: missing.join(', ')
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const unexpected = fileLanguages.filter(language => !projectLanguages.includes(language));
|
|
143
|
+
if (unexpected.length > 0) {
|
|
144
|
+
messages.push({
|
|
145
|
+
severity: 'warning',
|
|
146
|
+
code: 'i18n/unexpected-language',
|
|
147
|
+
message: `The column(s) '${unexpected.join("', '")}' are not among the languages declared by the project.`,
|
|
148
|
+
line: 1,
|
|
149
|
+
target: unexpected.join(', ')
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return messages;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Every translation of a key must use the same placeholders, otherwise an argument silently
|
|
156
|
+
* disappears in one language: 'hello {0}' translated as 'bonjour' drops the name.
|
|
157
|
+
*/
|
|
158
|
+
static validatePlaceholders(values, key, line) {
|
|
159
|
+
const translated = [...values.entries()].filter(([, value]) => value !== '');
|
|
160
|
+
if (translated.length < 2) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
const [referenceLanguage, referenceValue] = translated[0];
|
|
164
|
+
const expected = this.getPlaceholders(referenceValue);
|
|
165
|
+
const messages = [];
|
|
166
|
+
for (const [language, value] of translated.slice(1)) {
|
|
167
|
+
const found = this.getPlaceholders(value);
|
|
168
|
+
if (found.join(',') === expected.join(',')) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
messages.push({
|
|
172
|
+
severity: 'warning',
|
|
173
|
+
code: 'i18n/placeholder-mismatch',
|
|
174
|
+
message: `The key '${key}' uses ${this.describePlaceholders(expected)} in '${referenceLanguage}' but ${this.describePlaceholders(found)} in '${language}'.`,
|
|
175
|
+
line,
|
|
176
|
+
target: key
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return messages;
|
|
180
|
+
}
|
|
181
|
+
/** Placeholder indexes of a translation, sorted and deduplicated */
|
|
182
|
+
static getPlaceholders(value) {
|
|
183
|
+
const indexes = new Set();
|
|
184
|
+
for (const match of value.matchAll(PLACEHOLDER_PATTERN)) {
|
|
185
|
+
indexes.add(parseInt(match[1], 10));
|
|
186
|
+
}
|
|
187
|
+
return [...indexes].sort((a, b) => a - b);
|
|
188
|
+
}
|
|
189
|
+
static describePlaceholders(placeholders) {
|
|
190
|
+
return placeholders.length === 0 ? 'no placeholder' : placeholders.map(index => `{${index}}`).join(', ');
|
|
191
|
+
}
|
|
192
|
+
/** A row papaparse produced for a blank line, or one holding only empty cells */
|
|
193
|
+
static isEmptyRow(row) {
|
|
194
|
+
return row.every(cell => (cell ?? '').trim() === '');
|
|
10
195
|
}
|
|
11
196
|
}
|
|
12
197
|
exports.default = I18nValidator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"I18nValidator.js","sourceRoot":"","sources":["../../../../src/commands/validation/files/I18nValidator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"I18nValidator.js","sourceRoot":"","sources":["../../../../src/commands/validation/files/I18nValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ICompilationMessage } from '@codenotch/codenotch.core';
|
|
2
2
|
import { ValidationContext } from '../ValidationUtils';
|
|
3
|
-
export default abstract class
|
|
3
|
+
export default abstract class ProjectManifestValidator {
|
|
4
4
|
static validate(context: ValidationContext): Promise<ICompilationMessage[]>;
|
|
5
5
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
const ValidationUtils_1 = __importDefault(require("../ValidationUtils"));
|
|
7
|
+
class ProjectManifestValidator {
|
|
8
|
+
static async validate(context) {
|
|
9
|
+
const messages = ValidationUtils_1.default.validateJsonSyntax(context.content, context.filePath);
|
|
10
|
+
if (messages.some(m => m.severity === 'error')) {
|
|
11
|
+
return messages;
|
|
12
|
+
}
|
|
13
|
+
const manifest = JSON.parse(context.content);
|
|
14
|
+
if (`${manifest.serviceName ?? ''}`.trim() === '') {
|
|
15
|
+
messages.push({
|
|
16
|
+
severity: 'error',
|
|
17
|
+
message: `The project manifest must define 'serviceName'.`
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (`${manifest.version ?? ''}`.trim() === '') {
|
|
21
|
+
messages.push({
|
|
22
|
+
severity: 'error',
|
|
23
|
+
message: `The project manifest must define 'version'.`
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// TODO: others things ??
|
|
27
|
+
return messages;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.default = ProjectManifestValidator;
|
|
31
|
+
//# sourceMappingURL=ProjectManifestValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectManifestValidator.js","sourceRoot":"","sources":["../../../../src/commands/validation/files/ProjectManifestValidator.ts"],"names":[],"mappings":";;;;;AACA,yEAAwE;AAExE,MAA8B,wBAAwB;IAElD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAA0B;QAC5C,MAAM,QAAQ,GAAG,yBAAe,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;YAC7C,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,MAAM,QAAQ,GAA8B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExE,IAAI,GAAG,QAAQ,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,iDAAiD;aAC7D,CAAC,CAAC;QACP,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,6CAA6C;aACzD,CAAC,CAAC;QACP,CAAC;QAED,yBAAyB;QAEzB,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AA5BD,2CA4BC"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { ICompilationMessage
|
|
1
|
+
import { ICompilationMessage } from '@codenotch/codenotch.core';
|
|
2
2
|
import { ValidationContext } from '../ValidationUtils';
|
|
3
3
|
export default abstract class ScriptValidator {
|
|
4
4
|
static validate(context: ValidationContext): Promise<ICompilationMessage[]>;
|
|
5
5
|
/** Validates several scripts with a single TypeScript program, much faster than one program per file. */
|
|
6
6
|
static validateMany(filePaths: string[]): Promise<ICompilationMessage[]>;
|
|
7
7
|
}
|
|
8
|
-
export
|
|
8
|
+
export interface ScriptFile {
|
|
9
|
+
path: string;
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class CliScriptCompiler {
|
|
9
13
|
validate(files: ScriptFile[]): Promise<ICompilationMessage[]>;
|
|
10
14
|
serialize(files: ScriptFile[]): void;
|
|
11
15
|
deserialize(scripts: string): void;
|