@lionweb/cli 0.7.0-beta.8 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/infer-languages-command.d.ts.map +1 -1
- package/dist/infer-languages-command.js +2 -1
- package/dist/infer-languages-command.js.map +1 -1
- package/dist/language-aware-args.d.ts.map +1 -1
- package/dist/m3/diagram-command.d.ts.map +1 -1
- package/dist/m3/generate-ts-types-command.d.ts.map +1 -1
- package/dist/m3/generate-ts-types-command.js +16 -6
- package/dist/m3/generate-ts-types-command.js.map +1 -1
- package/dist/serialization/diff-command.d.ts.map +1 -1
- package/dist/serialization/measure-command.d.ts.map +1 -1
- package/dist/serialization/repair-command.d.ts.map +1 -1
- package/dist/serialization/sort-command.d.ts.map +1 -1
- package/dist/serialization/textualize-command.d.ts.map +1 -1
- package/dist/validate-command.d.ts.map +1 -1
- package/package.json +36 -35
- package/src/infer-languages-command.ts +17 -0
- package/src/language-aware-args.ts +12 -0
- package/src/lionweb-cli.ts +177 -0
- package/src/m3/diagram-command.ts +21 -0
- package/src/m3/generate-ts-types-command.ts +48 -0
- package/src/serialization/diff-command.ts +10 -0
- package/src/serialization/measure-command.ts +20 -0
- package/src/serialization/repair-command.ts +7 -0
- package/src/serialization/sort-command.ts +10 -0
- package/src/serialization/textualize-command.ts +37 -0
- package/src/validate-command.ts +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
From now on, the versions of all published packages will always be aligned, so also in terms of dependencies.
|
|
6
6
|
|
|
7
|
+
Changes in this version:
|
|
8
|
+
|
|
9
|
+
* The `generate-ts-types` now also produces a `index.g.ts` file when called with a multi-language serialization chunk.
|
|
10
|
+
* Package `src/` again (— i.e., don't ignore for NPM packaging.)
|
|
11
|
+
|
|
12
|
+
|
|
7
13
|
## 0.6.13
|
|
8
14
|
|
|
9
15
|
Dependencies: `@lionweb/core` and `@lionweb/utilities` version 0.6.12
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infer-languages-command.d.ts","sourceRoot":"","sources":["../src/infer-languages-command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"infer-languages-command.d.ts","sourceRoot":"","sources":["../src/infer-languages-command.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,GAAU,UAAU,MAAM,kBAUpD,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { serializeLanguages } from "@lionweb/core";
|
|
2
|
+
import { asPrettyJsonString } from "@lionweb/ts-utils";
|
|
2
3
|
import { inferLanguagesFromSerializationChunk, readSerializationChunk } from "@lionweb/utilities";
|
|
3
4
|
import { writeFileSync } from "fs";
|
|
4
5
|
import path from "path";
|
|
@@ -8,7 +9,7 @@ export const inferLanguages = async (filePath) => {
|
|
|
8
9
|
const languages = inferLanguagesFromSerializationChunk(chunk);
|
|
9
10
|
for (const language of languages) {
|
|
10
11
|
const languageFile = path.join(dirName, `${language.name}.language.json`);
|
|
11
|
-
writeFileSync(languageFile,
|
|
12
|
+
writeFileSync(languageFile, asPrettyJsonString(serializeLanguages(language)));
|
|
12
13
|
console.log(`Language ${language.name} has been generated: "${languageFile}"`);
|
|
13
14
|
}
|
|
14
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infer-languages-command.js","sourceRoot":"","sources":["../src/infer-languages-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,oCAAoC,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAClC,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAEpD,MAAM,SAAS,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAA;IAC7D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAA;QACzE,aAAa,CAAC,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"infer-languages-command.js","sourceRoot":"","sources":["../src/infer-languages-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oCAAoC,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAClC,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAEpD,MAAM,SAAS,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAA;IAC7D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAA;QACzE,aAAa,CAAC,YAAY,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC7E,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,IAAI,yBAAyB,YAAY,GAAG,CAAC,CAAA;IAClF,CAAC;AACL,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language-aware-args.d.ts","sourceRoot":"","sources":["../src/language-aware-args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"language-aware-args.d.ts","sourceRoot":"","sources":["../src/language-aware-args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,KAAG,kBAKzC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagram-command.d.ts","sourceRoot":"","sources":["../../src/m3/diagram-command.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,+BAA+B,
|
|
1
|
+
{"version":3,"file":"diagram-command.d.ts","sourceRoot":"","sources":["../../src/m3/diagram-command.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,+BAA+B,GAAU,MAAM,MAAM,kBAejE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-ts-types-command.d.ts","sourceRoot":"","sources":["../../src/m3/generate-ts-types-command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-ts-types-command.d.ts","sourceRoot":"","sources":["../../src/m3/generate-ts-types-command.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,mBAAmB,GAAU,MAAM,MAAM,EAAE,kBASvD,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AggregatingSimplisticHandler, deserializeLanguagesWithHandler } from "@lionweb/core";
|
|
2
|
-
import { GenerationOptions, readSerializationChunk, tsTypesForLanguage } from "@lionweb/utilities";
|
|
3
|
-
import { existsSync, mkdirSync, statSync, writeFileSync } from "fs";
|
|
4
1
|
import { extname, join } from "path";
|
|
2
|
+
import { existsSync, mkdirSync, statSync, writeFileSync } from "fs";
|
|
3
|
+
import { AggregatingSimplisticHandler, deserializeLanguagesWithHandler } from "@lionweb/core";
|
|
4
|
+
import { GenerationOptions, readSerializationChunk, tsTypeDefsForLanguage } from "@lionweb/utilities";
|
|
5
5
|
const generateTsTypesFromSerialization = async (path, generationOptions) => {
|
|
6
6
|
try {
|
|
7
7
|
const genPath = path.substring(0, path.length - extname(path).length) + "_gen";
|
|
@@ -9,11 +9,21 @@ const generateTsTypesFromSerialization = async (path, generationOptions) => {
|
|
|
9
9
|
mkdirSync(genPath);
|
|
10
10
|
}
|
|
11
11
|
const handler = new AggregatingSimplisticHandler();
|
|
12
|
-
deserializeLanguagesWithHandler(await readSerializationChunk(path), handler)
|
|
13
|
-
writeFileSync(join(genPath, `${language.name}.ts`), tsTypesForLanguage(language, ...generationOptions));
|
|
14
|
-
});
|
|
12
|
+
const languages = deserializeLanguagesWithHandler(await readSerializationChunk(path), handler);
|
|
15
13
|
handler.reportAllProblemsOnConsole();
|
|
14
|
+
languages.forEach((language) => {
|
|
15
|
+
const fileName = `${language.name}.g.ts`;
|
|
16
|
+
writeFileSync(join(genPath, fileName), tsTypeDefsForLanguage(language, ...generationOptions));
|
|
17
|
+
console.log(`generated ${language.name}.g.ts for language "${language.name}"`);
|
|
18
|
+
});
|
|
16
19
|
console.log(`generated TS types: "${path}" -> "${genPath}"`);
|
|
20
|
+
if (languages.length > 1) {
|
|
21
|
+
const linesIndexTs = [
|
|
22
|
+
languages.map((language) => `export * as ${language.name.replaceAll(".", "_")} from "./${language.name}.g.js"`)
|
|
23
|
+
];
|
|
24
|
+
writeFileSync(join(genPath, "index.g.ts"), linesIndexTs.join(`\n`) + `\n`);
|
|
25
|
+
console.log("generated index.g.ts");
|
|
26
|
+
}
|
|
17
27
|
}
|
|
18
28
|
catch (e) {
|
|
19
29
|
console.error(`"${path}" does not point to a valid JSON serialization of a language`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-ts-types-command.js","sourceRoot":"","sources":["../../src/m3/generate-ts-types-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"generate-ts-types-command.js","sourceRoot":"","sources":["../../src/m3/generate-ts-types-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-command.d.ts","sourceRoot":"","sources":["../../src/serialization/diff-command.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"diff-command.d.ts","sourceRoot":"","sources":["../../src/serialization/diff-command.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,GAAU,UAAU,MAAM,EAAE,WAAW,MAAM,EAAE,UAAU,MAAM,kBAIlG,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measure-command.d.ts","sourceRoot":"","sources":["../../src/serialization/measure-command.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"measure-command.d.ts","sourceRoot":"","sources":["../../src/serialization/measure-command.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,GAAU,MAAM,MAAM,EAAE,kBAMzD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair-command.d.ts","sourceRoot":"","sources":["../../src/serialization/repair-command.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"repair-command.d.ts","sourceRoot":"","sources":["../../src/serialization/repair-command.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,GAAU,MAAM,MAAM,kBAI5D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-command.d.ts","sourceRoot":"","sources":["../../src/serialization/sort-command.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"sort-command.d.ts","sourceRoot":"","sources":["../../src/serialization/sort-command.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,GAAU,MAAM,MAAM,kBAM1D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textualize-command.d.ts","sourceRoot":"","sources":["../../src/serialization/textualize-command.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"textualize-command.d.ts","sourceRoot":"","sources":["../../src/serialization/textualize-command.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,wBAAwB,GAAU,MAAM,MAAM,EAAE,kBAQ5D,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../src/validate-command.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mCAAmC,
|
|
1
|
+
{"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../src/validate-command.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mCAAmC,GAAI,MAAM,MAAM,KAAG,IAIlE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,37 +1,38 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
2
|
+
"name": "@lionweb/cli",
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"description": "LionWeb CLI for {Java|Type}Script",
|
|
5
|
+
"bin": {
|
|
6
|
+
"lionweb-cli": "./dist/lionweb-cli.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "dist/lionweb-cli.js",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"license": "Apache-2.0",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/LionWeb-io/lionweb-typescript.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/LionWeb-io/lionweb-typescript/issues"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"clean": "npx rimraf dist node_modules -g lionweb-cli-*.tgz",
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"lint": "eslint src",
|
|
22
|
+
"test": "node dist/lionweb-cli.js",
|
|
23
|
+
"prep:pre-release": "npm run clean && npm install && npm run build",
|
|
24
|
+
"prerelease-alpha": "npm run prep:pre-release",
|
|
25
|
+
"release-alpha": "npm publish --tag alpha",
|
|
26
|
+
"prerelease-beta": "npm run prep:pre-release",
|
|
27
|
+
"release-beta": "npm publish --tag beta",
|
|
28
|
+
"prerelease": "npm run prep:pre-release",
|
|
29
|
+
"release": "npm publish"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@lionweb/core": "0.7.1",
|
|
33
|
+
"@lionweb/json-diff": "0.7.1",
|
|
34
|
+
"@lionweb/ts-utils": "0.7.1",
|
|
35
|
+
"@lionweb/utilities": "0.7.1",
|
|
36
|
+
"@lionweb/validation": "0.7.1"
|
|
37
|
+
}
|
|
37
38
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { serializeLanguages } from "@lionweb/core"
|
|
2
|
+
import { asPrettyJsonString } from "@lionweb/ts-utils"
|
|
3
|
+
import { inferLanguagesFromSerializationChunk, readSerializationChunk } from "@lionweb/utilities"
|
|
4
|
+
import { writeFileSync } from "fs"
|
|
5
|
+
import path from "path"
|
|
6
|
+
|
|
7
|
+
export const inferLanguages = async (filePath: string) => {
|
|
8
|
+
const dirName = path.dirname(filePath)
|
|
9
|
+
const chunk = await readSerializationChunk(filePath)
|
|
10
|
+
|
|
11
|
+
const languages = inferLanguagesFromSerializationChunk(chunk)
|
|
12
|
+
for (const language of languages) {
|
|
13
|
+
const languageFile = path.join(dirName, `${language.name}.language.json`)
|
|
14
|
+
writeFileSync(languageFile, asPrettyJsonString(serializeLanguages(language)))
|
|
15
|
+
console.log(`Language ${language.name} has been generated: "${languageFile}"`)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type LanguageAwarePaths = {
|
|
2
|
+
chunkPaths: string[]
|
|
3
|
+
languagePaths: string[]
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export const separate = (args: string[]): LanguageAwarePaths => {
|
|
7
|
+
const indexLanguageArg = args.findIndex((arg) => arg === "--language" || arg === "--languages")
|
|
8
|
+
return indexLanguageArg > -1
|
|
9
|
+
? { chunkPaths: args.slice(0, indexLanguageArg), languagePaths: args.slice(indexLanguageArg + 1) }
|
|
10
|
+
: { chunkPaths: args, languagePaths: [] }
|
|
11
|
+
}
|
|
12
|
+
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import { argv } from "process"
|
|
5
|
+
import { inferLanguages } from "./infer-languages-command.js"
|
|
6
|
+
|
|
7
|
+
import { diagramFromSerializationChunkAt } from "./m3/diagram-command.js"
|
|
8
|
+
import { generateTsTypesWith } from "./m3/generate-ts-types-command.js"
|
|
9
|
+
import { diffSerializationChunks } from "./serialization/diff-command.js"
|
|
10
|
+
import { executeMeasureCommand } from "./serialization/measure-command.js"
|
|
11
|
+
import { repairSerializationChunkAt } from "./serialization/repair-command.js"
|
|
12
|
+
import { sortSerializationChunkAt } from "./serialization/sort-command.js"
|
|
13
|
+
import { executeTextualizeCommand } from "./serialization/textualize-command.js"
|
|
14
|
+
import { runValidationOnSerializationChunkAt } from "./validate-command.js"
|
|
15
|
+
|
|
16
|
+
const main = async (args: string[]) => {
|
|
17
|
+
const DIAGRAM_COMMAND = "diagram"
|
|
18
|
+
const DIFF_COMMAND = "diff"
|
|
19
|
+
const GENERATE_TS_TYPES_COMMAND = "generate-ts-types"
|
|
20
|
+
const INFER_LANGUAGES_COMMAND = "infer-languages"
|
|
21
|
+
const MEASURE_COMMAND = "measure"
|
|
22
|
+
const REPAIR_COMMAND = "repair"
|
|
23
|
+
const SORT_COMMAND = "sort"
|
|
24
|
+
const TEXTUALIZE_COMMAND = "textualize"
|
|
25
|
+
const VALIDATE_COMMAND = "validate"
|
|
26
|
+
|
|
27
|
+
const commands = [
|
|
28
|
+
DIAGRAM_COMMAND,
|
|
29
|
+
DIFF_COMMAND,
|
|
30
|
+
GENERATE_TS_TYPES_COMMAND,
|
|
31
|
+
INFER_LANGUAGES_COMMAND,
|
|
32
|
+
MEASURE_COMMAND,
|
|
33
|
+
REPAIR_COMMAND,
|
|
34
|
+
SORT_COMMAND,
|
|
35
|
+
TEXTUALIZE_COMMAND,
|
|
36
|
+
VALIDATE_COMMAND
|
|
37
|
+
].sort()
|
|
38
|
+
|
|
39
|
+
if (args.length <= 2) {
|
|
40
|
+
console.log(
|
|
41
|
+
`lionweb-cli is a LionWeb utility around LionWeb-TypeScript
|
|
42
|
+
|
|
43
|
+
Usage: $ npx @lionweb/cli <command> <arguments>
|
|
44
|
+
|
|
45
|
+
Available commands are:
|
|
46
|
+
|
|
47
|
+
${commands.map(command => ` ${command}\n`).join(``)}
|
|
48
|
+
`
|
|
49
|
+
)
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const command = args[2]
|
|
54
|
+
const commandArgs = args.slice(3)
|
|
55
|
+
switch (command) {
|
|
56
|
+
case DIAGRAM_COMMAND: {
|
|
57
|
+
if (commandArgs.length === 0) {
|
|
58
|
+
console.log(
|
|
59
|
+
`The ${DIAGRAM_COMMAND} command generates a PlantUML and Mermaid diagram for the language that the given paths point to.`
|
|
60
|
+
)
|
|
61
|
+
} else {
|
|
62
|
+
commandArgs.forEach(diagramFromSerializationChunkAt)
|
|
63
|
+
}
|
|
64
|
+
break
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
case DIFF_COMMAND: {
|
|
68
|
+
if (commandArgs.length !== 3) {
|
|
69
|
+
console.log(
|
|
70
|
+
`The ${DIFF_COMMAND} command generates the difference between two serialization chunks, in a JSON format.
|
|
71
|
+
The chunks to diff are given as the first two paths, and the path for the diff JSON file as the third.`
|
|
72
|
+
)
|
|
73
|
+
} else {
|
|
74
|
+
await diffSerializationChunks(commandArgs[0], commandArgs[1], commandArgs[2])
|
|
75
|
+
}
|
|
76
|
+
break
|
|
77
|
+
}
|
|
78
|
+
case GENERATE_TS_TYPES_COMMAND: {
|
|
79
|
+
if (commandArgs.length === 0) {
|
|
80
|
+
console.log(
|
|
81
|
+
`The ${GENERATE_TS_TYPES_COMMAND} command generates a TypeScript source files with type definitions for the given (JSON serializations of) languages, assuming the use of the dynamic façade.`
|
|
82
|
+
)
|
|
83
|
+
} else {
|
|
84
|
+
await generateTsTypesWith(commandArgs)
|
|
85
|
+
}
|
|
86
|
+
break
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
case MEASURE_COMMAND: {
|
|
90
|
+
if (commandArgs.length === 0) {
|
|
91
|
+
console.log(
|
|
92
|
+
`The ${MEASURE_COMMAND} command computes statistics on the given serialization chunks,
|
|
93
|
+
such as which concepts are instantiated how often.
|
|
94
|
+
|
|
95
|
+
Usage: npx @lionweb/cli ${MEASURE_COMMAND} <paths_to_chunks> --language[s] <path_to_chunks_of_languages>
|
|
96
|
+
|
|
97
|
+
Chunks given after a '--language' or '--languages' flag (which are synonyms) are assumed to be serializations of languages.
|
|
98
|
+
These languages are then used to try and resolve the keys of languages' entities and their features to names.`
|
|
99
|
+
)
|
|
100
|
+
} else {
|
|
101
|
+
await executeMeasureCommand(commandArgs)
|
|
102
|
+
}
|
|
103
|
+
break
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
case REPAIR_COMMAND: {
|
|
107
|
+
if (commandArgs.length === 0) {
|
|
108
|
+
console.log(
|
|
109
|
+
`The ${REPAIR_COMMAND} command "repairs" the given JSON files that represent serialization chunks.
|
|
110
|
+
Right now, that means that key-value pairs appear in precisely the same order as they do in the specification.
|
|
111
|
+
Missing key-value pairs are put in and get their default values.`
|
|
112
|
+
)
|
|
113
|
+
} else {
|
|
114
|
+
commandArgs.forEach(repairSerializationChunkAt)
|
|
115
|
+
}
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
case SORT_COMMAND: {
|
|
120
|
+
if (commandArgs.length === 0) {
|
|
121
|
+
console.log(
|
|
122
|
+
`The ${SORT_COMMAND} command sorts JSON files that are serialization chunk – sorted serialization chunks can be easily compared.
|
|
123
|
+
(See the README.md for more information.)`
|
|
124
|
+
)
|
|
125
|
+
} else {
|
|
126
|
+
commandArgs.forEach(sortSerializationChunkAt)
|
|
127
|
+
}
|
|
128
|
+
break
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
case TEXTUALIZE_COMMAND: {
|
|
132
|
+
if (commandArgs.length === 0) {
|
|
133
|
+
console.log(
|
|
134
|
+
`The ${TEXTUALIZE_COMMAND} command produces purely textual renderings of the given serialization chunks.
|
|
135
|
+
Chunks given after a '--language' or '--languages' flag (which are synonyms) are assumed to be serializations of languages.
|
|
136
|
+
These languages are then used to try and resolve the keys of languages' entities and their features to names.
|
|
137
|
+
If a serialization chunk is the serialization of a language (as instance of LionCore/M3), then the LionCore/M3-specific
|
|
138
|
+
textual syntax is used, unless a flag '--asRegular' is provided.
|
|
139
|
+
`
|
|
140
|
+
)
|
|
141
|
+
} else {
|
|
142
|
+
await executeTextualizeCommand(commandArgs)
|
|
143
|
+
}
|
|
144
|
+
break
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
case VALIDATE_COMMAND: {
|
|
148
|
+
if (commandArgs.length === 0) {
|
|
149
|
+
console.log(
|
|
150
|
+
`The ${VALIDATE_COMMAND} command validates a serialization chunk.
|
|
151
|
+
Usage: npx @lionweb/cli ${VALIDATE_COMMAND} <path_to_chunk>`
|
|
152
|
+
)
|
|
153
|
+
} else {
|
|
154
|
+
commandArgs.forEach(runValidationOnSerializationChunkAt)
|
|
155
|
+
}
|
|
156
|
+
break
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
case INFER_LANGUAGES_COMMAND: {
|
|
160
|
+
if (commandArgs.length === 0) {
|
|
161
|
+
console.log(
|
|
162
|
+
`The ${INFER_LANGUAGES_COMMAND} command infer language(s) from a given serialization chunk. \nUsage: npx @lionweb/cli infer-language <path_to_chunk>`
|
|
163
|
+
)
|
|
164
|
+
} else {
|
|
165
|
+
await inferLanguages(commandArgs[0])
|
|
166
|
+
}
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
default: {
|
|
171
|
+
console.error(`command "${command}" is not recognized`)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
await main(argv)
|
|
177
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AggregatingSimplisticHandler, deserializeLanguagesWithHandler } from "@lionweb/core"
|
|
2
|
+
import { generateMermaidForLanguage, generatePlantUmlForLanguage, readSerializationChunk } from "@lionweb/utilities"
|
|
3
|
+
import { writeFileSync } from "fs"
|
|
4
|
+
import { dirname } from "path"
|
|
5
|
+
|
|
6
|
+
export const diagramFromSerializationChunkAt = async (path: string) => {
|
|
7
|
+
try {
|
|
8
|
+
const json = await readSerializationChunk(path)
|
|
9
|
+
const dir = dirname(path)
|
|
10
|
+
const handler = new AggregatingSimplisticHandler()
|
|
11
|
+
const languages = deserializeLanguagesWithHandler(json, handler)
|
|
12
|
+
handler.reportAllProblemsOnConsole()
|
|
13
|
+
languages.forEach(language => {
|
|
14
|
+
writeFileSync(`${dir}/${language.name}.puml`, generatePlantUmlForLanguage(language))
|
|
15
|
+
writeFileSync(`${dir}/${language.name}.md`, generateMermaidForLanguage(language))
|
|
16
|
+
})
|
|
17
|
+
console.log(`generated diagrams: "${path}" -> "${dir}/"`)
|
|
18
|
+
} catch (_) {
|
|
19
|
+
console.error(`"${path}" does not point to a valid JSON serialization of a language`)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { extname, join } from "path"
|
|
2
|
+
import { existsSync, mkdirSync, statSync, writeFileSync } from "fs"
|
|
3
|
+
|
|
4
|
+
import { AggregatingSimplisticHandler, deserializeLanguagesWithHandler } from "@lionweb/core"
|
|
5
|
+
import { GenerationOptions, readSerializationChunk, tsTypeDefsForLanguage } from "@lionweb/utilities"
|
|
6
|
+
|
|
7
|
+
const generateTsTypesFromSerialization = async (path: string, generationOptions: GenerationOptions[]) => {
|
|
8
|
+
try {
|
|
9
|
+
const genPath = path.substring(0, path.length - extname(path).length) + "_gen"
|
|
10
|
+
if (!(existsSync(genPath) && statSync(genPath).isDirectory())) {
|
|
11
|
+
mkdirSync(genPath)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const handler = new AggregatingSimplisticHandler()
|
|
15
|
+
const languages = deserializeLanguagesWithHandler(await readSerializationChunk(path), handler)
|
|
16
|
+
handler.reportAllProblemsOnConsole()
|
|
17
|
+
|
|
18
|
+
languages.forEach((language) => {
|
|
19
|
+
const fileName = `${language.name}.g.ts`
|
|
20
|
+
writeFileSync(join(genPath, fileName), tsTypeDefsForLanguage(language, ...generationOptions))
|
|
21
|
+
console.log(`generated ${language.name}.g.ts for language "${language.name}"`)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
console.log(`generated TS types: "${path}" -> "${genPath}"`)
|
|
25
|
+
|
|
26
|
+
if (languages.length > 1) {
|
|
27
|
+
const linesIndexTs = [
|
|
28
|
+
languages.map((language) => `export * as ${language.name.replaceAll(".", "_")} from "./${language.name}.g.js"`)
|
|
29
|
+
]
|
|
30
|
+
writeFileSync(join(genPath, "index.g.ts"), linesIndexTs.join(`\n`) + `\n`)
|
|
31
|
+
console.log("generated index.g.ts")
|
|
32
|
+
}
|
|
33
|
+
} catch (e) {
|
|
34
|
+
console.error(`"${path}" does not point to a valid JSON serialization of a language`)
|
|
35
|
+
throw e
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const generateTsTypesWith = async (args: string[]) => {
|
|
40
|
+
const generationOptions = args
|
|
41
|
+
.filter(arg => arg.startsWith("--"))
|
|
42
|
+
.map(option => option.substring(2).trim())
|
|
43
|
+
.filter(option => option in GenerationOptions)
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
.map(option => (GenerationOptions as any)[option]) // e.g. "assumeSealed" -> GenerationOptions.assumeSealed
|
|
46
|
+
|
|
47
|
+
args.filter(arg => !arg.startsWith("--")).forEach(path => generateTsTypesFromSerialization(path, generationOptions))
|
|
48
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { readSerializationChunk, writeJsonAsFile } from "@lionweb/utilities"
|
|
2
|
+
import { LionWebJsonDiff } from "@lionweb/json-diff"
|
|
3
|
+
|
|
4
|
+
export const diffSerializationChunks = async (leftPath: string, rightPath: string, diffPath: string) => {
|
|
5
|
+
const differ = new LionWebJsonDiff()
|
|
6
|
+
differ.diffLwChunk(await readSerializationChunk(leftPath), await readSerializationChunk(rightPath))
|
|
7
|
+
writeJsonAsFile(diffPath, differ.diffResult.changes)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// TODO re-interpret diff of two languages in a LionCore/M3-specific way, i.e. in terms of domain-specific ∂s
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Language } from "@lionweb/core"
|
|
2
|
+
import { measure, readSerializationChunk, tryReadAllAsLanguages, writeJsonAsFile } from "@lionweb/utilities"
|
|
3
|
+
import { extname } from "path"
|
|
4
|
+
import { separate } from "../language-aware-args.js"
|
|
5
|
+
|
|
6
|
+
export const executeMeasureCommand = async (args: string[]) => {
|
|
7
|
+
const { chunkPaths, languagePaths } = separate(args)
|
|
8
|
+
const languages = await tryReadAllAsLanguages(languagePaths)
|
|
9
|
+
chunkPaths.forEach(chunkPath => {
|
|
10
|
+
measureSerializationChunk(chunkPath, languages)
|
|
11
|
+
})
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const measureSerializationChunk = async (path: string, languages: Language[]) => {
|
|
15
|
+
const chunk = await readSerializationChunk(path)
|
|
16
|
+
const extLessPath = path.substring(0, path.length - extname(path).length)
|
|
17
|
+
const metricsPath = extLessPath + ".metrics.json"
|
|
18
|
+
writeJsonAsFile(metricsPath, measure(chunk, languages))
|
|
19
|
+
console.log(`Wrote metrics for ${path} --> ${metricsPath}`)
|
|
20
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { orderedSerializationChunk, readSerializationChunk, writeJsonAsFile } from "@lionweb/utilities"
|
|
2
|
+
|
|
3
|
+
export const repairSerializationChunkAt = async (path: string) => {
|
|
4
|
+
const chunk = await readSerializationChunk(path)
|
|
5
|
+
writeJsonAsFile(path, orderedSerializationChunk(chunk))
|
|
6
|
+
console.log(`ordered(/"repaired"): ${path}`)
|
|
7
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { readSerializationChunk, sortedSerializationChunk, writeJsonAsFile } from "@lionweb/utilities"
|
|
2
|
+
import { extname } from "path"
|
|
3
|
+
|
|
4
|
+
export const sortSerializationChunkAt = async (path: string) => {
|
|
5
|
+
const chunk = await readSerializationChunk(path)
|
|
6
|
+
const extLessPath = path.substring(0, path.length - extname(path).length)
|
|
7
|
+
const sortedJson = sortedSerializationChunk(chunk)
|
|
8
|
+
writeJsonAsFile(extLessPath + ".sorted.json", sortedJson)
|
|
9
|
+
console.log(`sorted: "${path}" -> ${extLessPath}`)
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AggregatingSimplisticHandler, deserializeLanguagesWithHandler, Language } from "@lionweb/core"
|
|
2
|
+
import {
|
|
3
|
+
genericAsTreeText,
|
|
4
|
+
languagesAsText,
|
|
5
|
+
looksLikeSerializedLanguages,
|
|
6
|
+
readSerializationChunk,
|
|
7
|
+
tryReadAllAsLanguages
|
|
8
|
+
} from "@lionweb/utilities"
|
|
9
|
+
import { writeFile } from "fs/promises"
|
|
10
|
+
import { extname } from "path"
|
|
11
|
+
import { separate } from "../language-aware-args.js"
|
|
12
|
+
|
|
13
|
+
const languagesAsRegularFlag = "--languagesAsRegular"
|
|
14
|
+
|
|
15
|
+
export const executeTextualizeCommand = async (args: string[]) => {
|
|
16
|
+
const languagesAsRegular = args.some(arg => arg === languagesAsRegularFlag)
|
|
17
|
+
const otherArgs = args.filter(arg => arg !== languagesAsRegularFlag)
|
|
18
|
+
const { chunkPaths, languagePaths } = separate(otherArgs)
|
|
19
|
+
const languages = await tryReadAllAsLanguages(languagePaths)
|
|
20
|
+
chunkPaths.forEach(chunkPath => {
|
|
21
|
+
textualizeSerializationChunk(chunkPath, languagesAsRegular, languages)
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const textualizeSerializationChunk = async (path: string, languagesAsRegular: boolean, languages: Language[] = []) => {
|
|
26
|
+
const chunk = await readSerializationChunk(path)
|
|
27
|
+
const extLessPath = path.substring(0, path.length - extname(path).length)
|
|
28
|
+
const handler = new AggregatingSimplisticHandler()
|
|
29
|
+
await writeFile(
|
|
30
|
+
extLessPath + ".txt",
|
|
31
|
+
looksLikeSerializedLanguages(chunk) && !languagesAsRegular
|
|
32
|
+
? languagesAsText(deserializeLanguagesWithHandler(chunk, handler))
|
|
33
|
+
: genericAsTreeText(chunk, languages)
|
|
34
|
+
)
|
|
35
|
+
handler.reportAllProblemsOnConsole()
|
|
36
|
+
console.log(`textualized: ${path}`)
|
|
37
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LanguageRegistry, validateFileResult } from "@lionweb/validation"
|
|
2
|
+
|
|
3
|
+
export const runValidationOnSerializationChunkAt = (path: string): void => {
|
|
4
|
+
console.log(`Validating ${path}`)
|
|
5
|
+
const validationResult = validateFileResult(path, false, new LanguageRegistry())
|
|
6
|
+
console.log(validationResult.hasErrors() ? validationResult.issues.map(issue => issue.errorMsg()).join("\n") : "No errors found")
|
|
7
|
+
}
|