@hydranium/cli 1.0.0-next.10
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/LICENSE +21 -0
- package/README.md +240 -0
- package/heap-analysis/analyze-heap.mjs +798 -0
- package/heap-analysis/heap/core/aggregate.mjs +152 -0
- package/heap-analysis/heap/core/bucket-label.mjs +23 -0
- package/heap-analysis/heap/core/cutpoints.mjs +51 -0
- package/heap-analysis/heap/core/diff.mjs +56 -0
- package/heap-analysis/heap/core/format.mjs +47 -0
- package/heap-analysis/heap/core/holders.mjs +80 -0
- package/heap-analysis/heap/core/load.mjs +46 -0
- package/heap-analysis/heap/core/report.mjs +68 -0
- package/heap-analysis/heap/core/strings.mjs +80 -0
- package/heap-analysis/heap/langium/concepts.mjs +230 -0
- package/heap-analysis/heap/langium/glsp.classifier.mjs +80 -0
- package/heap-analysis/heap/langium/langium.classifier.mjs +203 -0
- package/heap-analysis/heap/renderer/renderer.mjs +122 -0
- package/lib/cli-version.d.ts +21 -0
- package/lib/cli-version.d.ts.map +1 -0
- package/lib/cli-version.js +30 -0
- package/lib/cli-version.js.map +1 -0
- package/lib/cli.d.ts +11 -0
- package/lib/cli.d.ts.map +1 -0
- package/lib/cli.js +135 -0
- package/lib/cli.js.map +1 -0
- package/lib/commands/analyze-heap-args.d.ts +46 -0
- package/lib/commands/analyze-heap-args.d.ts.map +1 -0
- package/lib/commands/analyze-heap-args.js +174 -0
- package/lib/commands/analyze-heap-args.js.map +1 -0
- package/lib/commands/analyze-heap.d.ts +37 -0
- package/lib/commands/analyze-heap.d.ts.map +1 -0
- package/lib/commands/analyze-heap.js +63 -0
- package/lib/commands/analyze-heap.js.map +1 -0
- package/lib/commands/ast-ground-truth-args.d.ts +23 -0
- package/lib/commands/ast-ground-truth-args.d.ts.map +1 -0
- package/lib/commands/ast-ground-truth-args.js +47 -0
- package/lib/commands/ast-ground-truth-args.js.map +1 -0
- package/lib/commands/ast-ground-truth-driver.d.ts +10 -0
- package/lib/commands/ast-ground-truth-driver.d.ts.map +1 -0
- package/lib/commands/ast-ground-truth-driver.js +72 -0
- package/lib/commands/ast-ground-truth-driver.js.map +1 -0
- package/lib/commands/ast-ground-truth.d.ts +31 -0
- package/lib/commands/ast-ground-truth.d.ts.map +1 -0
- package/lib/commands/ast-ground-truth.js +36 -0
- package/lib/commands/ast-ground-truth.js.map +1 -0
- package/lib/commands/generate-transfer-model-args.d.ts +38 -0
- package/lib/commands/generate-transfer-model-args.d.ts.map +1 -0
- package/lib/commands/generate-transfer-model-args.js +183 -0
- package/lib/commands/generate-transfer-model-args.js.map +1 -0
- package/lib/commands/generate-transfer-model-config.d.ts +32 -0
- package/lib/commands/generate-transfer-model-config.d.ts.map +1 -0
- package/lib/commands/generate-transfer-model-config.js +122 -0
- package/lib/commands/generate-transfer-model-config.js.map +1 -0
- package/lib/commands/generate-transfer-model.d.ts +110 -0
- package/lib/commands/generate-transfer-model.d.ts.map +1 -0
- package/lib/commands/generate-transfer-model.js +587 -0
- package/lib/commands/generate-transfer-model.js.map +1 -0
- package/lib/commands/harness-args.d.ts +198 -0
- package/lib/commands/harness-args.d.ts.map +1 -0
- package/lib/commands/harness-args.js +339 -0
- package/lib/commands/harness-args.js.map +1 -0
- package/lib/commands/headless-harness.d.ts +97 -0
- package/lib/commands/headless-harness.d.ts.map +1 -0
- package/lib/commands/headless-harness.js +121 -0
- package/lib/commands/headless-harness.js.map +1 -0
- package/lib/commands/init-args.d.ts +81 -0
- package/lib/commands/init-args.d.ts.map +1 -0
- package/lib/commands/init-args.js +250 -0
- package/lib/commands/init-args.js.map +1 -0
- package/lib/commands/init-prompt.d.ts +66 -0
- package/lib/commands/init-prompt.d.ts.map +1 -0
- package/lib/commands/init-prompt.js +71 -0
- package/lib/commands/init-prompt.js.map +1 -0
- package/lib/commands/init-templates.d.ts +42 -0
- package/lib/commands/init-templates.d.ts.map +1 -0
- package/lib/commands/init-templates.js +1902 -0
- package/lib/commands/init-templates.js.map +1 -0
- package/lib/commands/init-wizard.d.ts +65 -0
- package/lib/commands/init-wizard.d.ts.map +1 -0
- package/lib/commands/init-wizard.js +302 -0
- package/lib/commands/init-wizard.js.map +1 -0
- package/lib/commands/init-workspace.d.ts +168 -0
- package/lib/commands/init-workspace.d.ts.map +1 -0
- package/lib/commands/init-workspace.js +372 -0
- package/lib/commands/init-workspace.js.map +1 -0
- package/lib/commands/init.d.ts +273 -0
- package/lib/commands/init.d.ts.map +1 -0
- package/lib/commands/init.js +303 -0
- package/lib/commands/init.js.map +1 -0
- package/lib/commands/lint-grammar-args.d.ts +23 -0
- package/lib/commands/lint-grammar-args.d.ts.map +1 -0
- package/lib/commands/lint-grammar-args.js +63 -0
- package/lib/commands/lint-grammar-args.js.map +1 -0
- package/lib/commands/lint-grammar-driver.d.ts +10 -0
- package/lib/commands/lint-grammar-driver.d.ts.map +1 -0
- package/lib/commands/lint-grammar-driver.js +72 -0
- package/lib/commands/lint-grammar-driver.js.map +1 -0
- package/lib/commands/lint-grammar-report.d.ts +24 -0
- package/lib/commands/lint-grammar-report.d.ts.map +1 -0
- package/lib/commands/lint-grammar-report.js +65 -0
- package/lib/commands/lint-grammar-report.js.map +1 -0
- package/lib/commands/lint-grammar.d.ts +33 -0
- package/lib/commands/lint-grammar.d.ts.map +1 -0
- package/lib/commands/lint-grammar.js +42 -0
- package/lib/commands/lint-grammar.js.map +1 -0
- package/lib/commands/measure-memory-args.d.ts +23 -0
- package/lib/commands/measure-memory-args.d.ts.map +1 -0
- package/lib/commands/measure-memory-args.js +106 -0
- package/lib/commands/measure-memory-args.js.map +1 -0
- package/lib/commands/measure-memory-driver.d.ts +10 -0
- package/lib/commands/measure-memory-driver.d.ts.map +1 -0
- package/lib/commands/measure-memory-driver.js +110 -0
- package/lib/commands/measure-memory-driver.js.map +1 -0
- package/lib/commands/measure-memory.d.ts +68 -0
- package/lib/commands/measure-memory.d.ts.map +1 -0
- package/lib/commands/measure-memory.js +100 -0
- package/lib/commands/measure-memory.js.map +1 -0
- package/lib/commands/model-docs-args.d.ts +23 -0
- package/lib/commands/model-docs-args.d.ts.map +1 -0
- package/lib/commands/model-docs-args.js +53 -0
- package/lib/commands/model-docs-args.js.map +1 -0
- package/lib/commands/model-docs-driver.d.ts +10 -0
- package/lib/commands/model-docs-driver.d.ts.map +1 -0
- package/lib/commands/model-docs-driver.js +61 -0
- package/lib/commands/model-docs-driver.js.map +1 -0
- package/lib/commands/model-docs-report.d.ts +18 -0
- package/lib/commands/model-docs-report.d.ts.map +1 -0
- package/lib/commands/model-docs-report.js +123 -0
- package/lib/commands/model-docs-report.js.map +1 -0
- package/lib/commands/model-docs.d.ts +30 -0
- package/lib/commands/model-docs.d.ts.map +1 -0
- package/lib/commands/model-docs.js +37 -0
- package/lib/commands/model-docs.js.map +1 -0
- package/lib/commands/projects-args.d.ts +25 -0
- package/lib/commands/projects-args.d.ts.map +1 -0
- package/lib/commands/projects-args.js +49 -0
- package/lib/commands/projects-args.js.map +1 -0
- package/lib/commands/projects.d.ts +45 -0
- package/lib/commands/projects.d.ts.map +1 -0
- package/lib/commands/projects.js +39 -0
- package/lib/commands/projects.js.map +1 -0
- package/lib/commands/query-args.d.ts +25 -0
- package/lib/commands/query-args.d.ts.map +1 -0
- package/lib/commands/query-args.js +46 -0
- package/lib/commands/query-args.js.map +1 -0
- package/lib/commands/query.d.ts +32 -0
- package/lib/commands/query.d.ts.map +1 -0
- package/lib/commands/query.js +29 -0
- package/lib/commands/query.js.map +1 -0
- package/lib/commands/reflect-args.d.ts +23 -0
- package/lib/commands/reflect-args.d.ts.map +1 -0
- package/lib/commands/reflect-args.js +59 -0
- package/lib/commands/reflect-args.js.map +1 -0
- package/lib/commands/reflect-driver.d.ts +10 -0
- package/lib/commands/reflect-driver.d.ts.map +1 -0
- package/lib/commands/reflect-driver.js +66 -0
- package/lib/commands/reflect-driver.js.map +1 -0
- package/lib/commands/reflect-report.d.ts +20 -0
- package/lib/commands/reflect-report.d.ts.map +1 -0
- package/lib/commands/reflect-report.js +127 -0
- package/lib/commands/reflect-report.js.map +1 -0
- package/lib/commands/reflect.d.ts +30 -0
- package/lib/commands/reflect.d.ts.map +1 -0
- package/lib/commands/reflect.js +38 -0
- package/lib/commands/reflect.js.map +1 -0
- package/lib/commands/save-args.d.ts +26 -0
- package/lib/commands/save-args.d.ts.map +1 -0
- package/lib/commands/save-args.js +59 -0
- package/lib/commands/save-args.js.map +1 -0
- package/lib/commands/save.d.ts +38 -0
- package/lib/commands/save.d.ts.map +1 -0
- package/lib/commands/save.js +48 -0
- package/lib/commands/save.js.map +1 -0
- package/lib/commands/validate-args.d.ts +23 -0
- package/lib/commands/validate-args.d.ts.map +1 -0
- package/lib/commands/validate-args.js +60 -0
- package/lib/commands/validate-args.js.map +1 -0
- package/lib/commands/validate-driver.d.ts +10 -0
- package/lib/commands/validate-driver.d.ts.map +1 -0
- package/lib/commands/validate-driver.js +72 -0
- package/lib/commands/validate-driver.js.map +1 -0
- package/lib/commands/validate-report.d.ts +30 -0
- package/lib/commands/validate-report.d.ts.map +1 -0
- package/lib/commands/validate-report.js +87 -0
- package/lib/commands/validate-report.js.map +1 -0
- package/lib/commands/validate.d.ts +34 -0
- package/lib/commands/validate.d.ts.map +1 -0
- package/lib/commands/validate.js +41 -0
- package/lib/commands/validate.js.map +1 -0
- package/lib/commands/watch-args.d.ts +26 -0
- package/lib/commands/watch-args.d.ts.map +1 -0
- package/lib/commands/watch-args.js +59 -0
- package/lib/commands/watch-args.js.map +1 -0
- package/lib/commands/watch.d.ts +75 -0
- package/lib/commands/watch.d.ts.map +1 -0
- package/lib/commands/watch.js +112 -0
- package/lib/commands/watch.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +16 -0
- package/lib/index.js.map +1 -0
- package/lib/log-level.d.ts +39 -0
- package/lib/log-level.d.ts.map +1 -0
- package/lib/log-level.js +47 -0
- package/lib/log-level.js.map +1 -0
- package/lib/package-name.d.ts +33 -0
- package/lib/package-name.d.ts.map +1 -0
- package/lib/package-name.js +37 -0
- package/lib/package-name.js.map +1 -0
- package/lib/spawn-data-server.d.ts +102 -0
- package/lib/spawn-data-server.d.ts.map +1 -0
- package/lib/spawn-data-server.js +154 -0
- package/lib/spawn-data-server.js.map +1 -0
- package/lib/testing/echo-server.d.ts +11 -0
- package/lib/testing/echo-server.d.ts.map +1 -0
- package/lib/testing/echo-server.js +79 -0
- package/lib/testing/echo-server.js.map +1 -0
- package/package.json +105 -0
- package/src/cli-version.ts +32 -0
- package/src/cli.ts +139 -0
- package/src/commands/analyze-heap-args.ts +184 -0
- package/src/commands/analyze-heap.ts +76 -0
- package/src/commands/ast-ground-truth-args.ts +63 -0
- package/src/commands/ast-ground-truth-driver.ts +81 -0
- package/src/commands/ast-ground-truth.ts +49 -0
- package/src/commands/generate-transfer-model-args.ts +203 -0
- package/src/commands/generate-transfer-model-config.ts +128 -0
- package/src/commands/generate-transfer-model.ts +716 -0
- package/src/commands/harness-args.ts +429 -0
- package/src/commands/headless-harness.ts +165 -0
- package/src/commands/init-args.ts +273 -0
- package/src/commands/init-prompt.ts +149 -0
- package/src/commands/init-templates.ts +2037 -0
- package/src/commands/init-wizard.ts +378 -0
- package/src/commands/init-workspace.ts +442 -0
- package/src/commands/init.ts +554 -0
- package/src/commands/lint-grammar-args.ts +79 -0
- package/src/commands/lint-grammar-driver.ts +83 -0
- package/src/commands/lint-grammar-report.ts +74 -0
- package/src/commands/lint-grammar.ts +57 -0
- package/src/commands/measure-memory-args.ts +123 -0
- package/src/commands/measure-memory-driver.ts +128 -0
- package/src/commands/measure-memory.ts +143 -0
- package/src/commands/model-docs-args.ts +69 -0
- package/src/commands/model-docs-driver.ts +68 -0
- package/src/commands/model-docs-report.ts +133 -0
- package/src/commands/model-docs.ts +48 -0
- package/src/commands/projects-args.ts +62 -0
- package/src/commands/projects.ts +76 -0
- package/src/commands/query-args.ts +61 -0
- package/src/commands/query.ts +58 -0
- package/src/commands/reflect-args.ts +75 -0
- package/src/commands/reflect-driver.ts +76 -0
- package/src/commands/reflect-report.ts +138 -0
- package/src/commands/reflect.ts +51 -0
- package/src/commands/save-args.ts +74 -0
- package/src/commands/save.ts +84 -0
- package/src/commands/validate-args.ts +76 -0
- package/src/commands/validate-driver.ts +84 -0
- package/src/commands/validate-report.ts +95 -0
- package/src/commands/validate.ts +58 -0
- package/src/commands/watch-args.ts +74 -0
- package/src/commands/watch.ts +185 -0
- package/src/index.ts +16 -0
- package/src/log-level.ts +49 -0
- package/src/package-name.ts +39 -0
- package/src/spawn-data-server.ts +247 -0
- package/src/testing/echo-server.ts +93 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 CrossBreeze, EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { Project, SyntaxKind } from 'ts-morph';
|
|
12
|
+
const DEFAULT_ELEMENT_TYPE_NAME = 'TransferElement';
|
|
13
|
+
const DEFAULT_TERMINALS_NAME = 'ModelTerminals';
|
|
14
|
+
const DEFAULT_REGEN_COMMAND = 'Run the hydranium-cli generate-transfer-model command to regenerate.';
|
|
15
|
+
/**
|
|
16
|
+
* Name of the per-language terminals const Langium declares inside each
|
|
17
|
+
* language's namespace in a multi-language project. The top-level
|
|
18
|
+
* `<LanguageId>Terminals` const then spreads these.
|
|
19
|
+
*/
|
|
20
|
+
const NAMESPACED_TERMINALS_NAME = 'Terminals';
|
|
21
|
+
/**
|
|
22
|
+
* Generate once, then re-generate whenever the AST or augmentation file changes,
|
|
23
|
+
* until `signal` aborts (the CLI wires this to SIGINT). Regeneration is debounced
|
|
24
|
+
* so an editor's multi-event save fires a single run, and a generation error is
|
|
25
|
+
* logged without tearing down the watch. Resolves when the signal aborts.
|
|
26
|
+
*/
|
|
27
|
+
export function watchTransferModel(options, context) {
|
|
28
|
+
const runSafely = () => {
|
|
29
|
+
try {
|
|
30
|
+
generateTransferModel(options);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(`Transfer-model generation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
runSafely();
|
|
37
|
+
console.log(`Watching ${options.astFile} and ${options.augmentationFile} for changes. Press Ctrl-C to stop.`);
|
|
38
|
+
let timer;
|
|
39
|
+
const scheduleRerun = () => {
|
|
40
|
+
if (timer) {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
}
|
|
43
|
+
timer = setTimeout(runSafely, 150);
|
|
44
|
+
};
|
|
45
|
+
const watchers = [options.astFile, options.augmentationFile].map(file => fs.watch(file, scheduleRerun));
|
|
46
|
+
return new Promise(resolve => {
|
|
47
|
+
context.signal.addEventListener('abort', () => {
|
|
48
|
+
for (const watcher of watchers) {
|
|
49
|
+
watcher.close();
|
|
50
|
+
}
|
|
51
|
+
if (timer) {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
resolve();
|
|
55
|
+
}, { once: true });
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Run the transfer-model generator. */
|
|
59
|
+
export function generateTransferModel(options) {
|
|
60
|
+
const elementTypeName = options.elementTypeName ?? DEFAULT_ELEMENT_TYPE_NAME;
|
|
61
|
+
const terminalsName = options.terminalsName ?? DEFAULT_TERMINALS_NAME;
|
|
62
|
+
const regenCommand = options.regenCommand ?? DEFAULT_REGEN_COMMAND;
|
|
63
|
+
const extraSkipTypeAliases = new Set(options.skipTypeAliases ?? []);
|
|
64
|
+
const skipTerminals = new Set(options.skipTerminals ?? []);
|
|
65
|
+
const project = new Project({
|
|
66
|
+
compilerOptions: { strict: true },
|
|
67
|
+
skipAddingFilesFromTsConfig: true
|
|
68
|
+
});
|
|
69
|
+
const astSource = project.addSourceFileAtPath(options.astFile);
|
|
70
|
+
const augSource = project.addSourceFileAtPath(options.augmentationFile);
|
|
71
|
+
// 1. Locate the AstReflection class in the AST source. Langium names it
|
|
72
|
+
// `<LanguageId>AstReflection` and exports it. We accept any class extending
|
|
73
|
+
// `AbstractAstReflection`; in practice each language has exactly one.
|
|
74
|
+
const reflectionClass = findAstReflectionClass(astSource);
|
|
75
|
+
const languageId = reflectionClass.getName()?.replace(/AstReflection$/, '') ?? '';
|
|
76
|
+
// 2. Auto-skip Langium infrastructure type aliases derived from the language id,
|
|
77
|
+
// plus the consumer's extra entries.
|
|
78
|
+
const autoSkipTypeAliases = new Set([`${languageId}AstType`, `${languageId}TerminalNames`, `${languageId}TokenNames`]);
|
|
79
|
+
const skipTypeAliases = new Set([...autoSkipTypeAliases, ...extraSkipTypeAliases]);
|
|
80
|
+
// 3. Extract reflection metadata (superTypes per type) via ts-morph rather than
|
|
81
|
+
// dynamic-importing the AST module — keeps the CLI runnable on raw .ts source
|
|
82
|
+
// without requiring a tsx loader on the consumer.
|
|
83
|
+
const reflectionTypes = parseReflectionTypes(reflectionClass);
|
|
84
|
+
// 4. Collect AST interfaces + type aliases.
|
|
85
|
+
const astInterfaces = new Map();
|
|
86
|
+
for (const iface of astSource.getInterfaces()) {
|
|
87
|
+
astInterfaces.set(iface.getName(), iface);
|
|
88
|
+
}
|
|
89
|
+
const typeAliases = [];
|
|
90
|
+
for (const alias of astSource.getTypeAliases()) {
|
|
91
|
+
const name = alias.getName();
|
|
92
|
+
if (skipTypeAliases.has(name)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const typeText = alias.getTypeNode()?.getText();
|
|
96
|
+
if (typeText) {
|
|
97
|
+
typeAliases.push({ name, definition: mapType(resolveNamespacedStringUnion(astSource, typeText), elementTypeName) });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 5. Parse augmentations from the consumer's `declare module` blocks.
|
|
101
|
+
const constants = resolveConstants(augSource);
|
|
102
|
+
const augmented = parseAugmentations(augSource, constants, elementTypeName);
|
|
103
|
+
// 6. Parse terminal regex literals from the AST file — the top-level const for
|
|
104
|
+
// a single-language project, plus every per-language namespace's `Terminals`
|
|
105
|
+
// for a multi-language one.
|
|
106
|
+
const terminalsSourceName = options.terminalsSourceName ?? `${languageId}Terminals`;
|
|
107
|
+
const terminals = parseTerminals(astSource, terminalsSourceName, skipTerminals);
|
|
108
|
+
// 7. Classify interfaces: abstract (union $type) vs concrete (literal $type).
|
|
109
|
+
const interfaceNames = [];
|
|
110
|
+
const abstractTypes = new Set();
|
|
111
|
+
const concreteTypes = new Set();
|
|
112
|
+
for (const name of Object.keys(reflectionTypes)) {
|
|
113
|
+
const iface = astInterfaces.get(name);
|
|
114
|
+
if (!iface) {
|
|
115
|
+
// Type alias, not an interface — handled separately via `typeAliases`.
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
interfaceNames.push(name);
|
|
119
|
+
const typeText = iface.getProperty('$type')?.getTypeNode()?.getText() ?? '';
|
|
120
|
+
if (typeText.includes('|')) {
|
|
121
|
+
abstractTypes.add(name);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
concreteTypes.add(name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// 8. Resolve extends-chains. Filter out type-alias supertypes (Langium reflection
|
|
128
|
+
// includes them for the grammar hierarchy but TypeScript can't extend a union
|
|
129
|
+
// type alias). Empty supers fall back to the framework's element type.
|
|
130
|
+
const typeAliasNames = new Set(typeAliases.map(ta => ta.name));
|
|
131
|
+
const getExtends = (name) => {
|
|
132
|
+
const supers = reflectionTypes[name]?.superTypes;
|
|
133
|
+
if (!supers?.length) {
|
|
134
|
+
return [elementTypeName];
|
|
135
|
+
}
|
|
136
|
+
const interfaceSupers = supers.filter(s => !typeAliasNames.has(s));
|
|
137
|
+
return interfaceSupers.length ? [...interfaceSupers] : [elementTypeName];
|
|
138
|
+
};
|
|
139
|
+
// 9. Topological sort so base types appear first.
|
|
140
|
+
const sorted = topologicalSort(interfaceNames, getExtends);
|
|
141
|
+
// 10. Build output.
|
|
142
|
+
const out = [];
|
|
143
|
+
out.push('/******************************************************************************');
|
|
144
|
+
out.push(' * Generated from the Langium AST — DO NOT EDIT MANUALLY!');
|
|
145
|
+
out.push(` * ${regenCommand}`);
|
|
146
|
+
out.push(' ******************************************************************************/');
|
|
147
|
+
out.push('');
|
|
148
|
+
out.push('/* eslint-disable */');
|
|
149
|
+
out.push('');
|
|
150
|
+
// Base types (inlined — no external dependency on @hydranium/protocol so the
|
|
151
|
+
// generated file is fully self-contained and consumers stay in control of how
|
|
152
|
+
// they layer the framework's `TransferElement` on top via the overlay).
|
|
153
|
+
out.push('// eslint-disable-next-line @typescript-eslint/no-unused-vars');
|
|
154
|
+
out.push('export type Reference<T> = string;');
|
|
155
|
+
out.push('');
|
|
156
|
+
out.push(`export interface ${elementTypeName} {`);
|
|
157
|
+
out.push(' readonly $type: string;');
|
|
158
|
+
out.push('}');
|
|
159
|
+
out.push('');
|
|
160
|
+
// Type constants for concrete types.
|
|
161
|
+
out.push('// --- Type Constants ---');
|
|
162
|
+
for (const name of sorted) {
|
|
163
|
+
if (concreteTypes.has(name)) {
|
|
164
|
+
out.push(`export const ${name}Type = '${name}';`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
out.push('');
|
|
168
|
+
// Type aliases.
|
|
169
|
+
if (typeAliases.length > 0) {
|
|
170
|
+
out.push('// --- Type Aliases ---');
|
|
171
|
+
for (const { name, definition } of typeAliases) {
|
|
172
|
+
out.push(`export type ${name} = ${definition};`);
|
|
173
|
+
const literals = extractStringLiterals(definition);
|
|
174
|
+
if (literals) {
|
|
175
|
+
const items = literals.map(l => `'${l}'`).join(', ');
|
|
176
|
+
out.push(`export const ${name}Values = [${items}] as const;`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
out.push('');
|
|
180
|
+
}
|
|
181
|
+
// Terminal regex patterns (anchored for full-string validation).
|
|
182
|
+
if (terminals.length > 0) {
|
|
183
|
+
out.push('// --- Terminal Patterns (anchored for validation) ---');
|
|
184
|
+
out.push(`export const ${terminalsName} = {`);
|
|
185
|
+
for (const { name, pattern } of terminals) {
|
|
186
|
+
out.push(` ${name}: ${pattern},`);
|
|
187
|
+
}
|
|
188
|
+
out.push('};');
|
|
189
|
+
out.push('');
|
|
190
|
+
}
|
|
191
|
+
// Interfaces.
|
|
192
|
+
out.push('// --- Interfaces ---');
|
|
193
|
+
for (const name of sorted) {
|
|
194
|
+
const iface = astInterfaces.get(name);
|
|
195
|
+
const isAbstract = abstractTypes.has(name);
|
|
196
|
+
const extendsTypes = getExtends(name);
|
|
197
|
+
out.push(`export interface ${name} extends ${extendsTypes.join(', ')} {`);
|
|
198
|
+
if (isAbstract) {
|
|
199
|
+
const typeValue = iface.getProperty('$type')?.getTypeNode()?.getText() ?? `'${name}'`;
|
|
200
|
+
out.push(` readonly $type: ${typeValue};`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
out.push(` readonly $type: typeof ${name}Type;`);
|
|
204
|
+
}
|
|
205
|
+
const emitted = new Set(['$type']);
|
|
206
|
+
for (const prop of iface.getProperties()) {
|
|
207
|
+
const propName = prop.getName();
|
|
208
|
+
if (propName.startsWith('$')) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const mappedType = mapType(prop.getTypeNode()?.getText() ?? 'unknown', elementTypeName);
|
|
212
|
+
const opt = prop.hasQuestionToken() ? '?' : '';
|
|
213
|
+
const ro = prop.isReadonly() ? 'readonly ' : '';
|
|
214
|
+
const jsDocs = prop.getJsDocs();
|
|
215
|
+
if (jsDocs.length > 0) {
|
|
216
|
+
const comment = jsDocs[0]
|
|
217
|
+
.getInnerText()
|
|
218
|
+
.trim()
|
|
219
|
+
.replace(/\s*\n\s*/g, ' ');
|
|
220
|
+
if (comment) {
|
|
221
|
+
out.push(` /** ${comment} */`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
out.push(` ${ro}${propName}${opt}: ${mappedType};`);
|
|
225
|
+
emitted.add(propName);
|
|
226
|
+
}
|
|
227
|
+
for (const aug of augmented.get(name) ?? []) {
|
|
228
|
+
if (emitted.has(aug.name)) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const opt = aug.optional ? '?' : '';
|
|
232
|
+
const ro = aug.readonly ? 'readonly ' : '';
|
|
233
|
+
if (aug.comment) {
|
|
234
|
+
out.push(` /** ${aug.comment} */`);
|
|
235
|
+
}
|
|
236
|
+
out.push(` ${ro}${aug.name}${opt}: ${aug.type};`);
|
|
237
|
+
emitted.add(aug.name);
|
|
238
|
+
}
|
|
239
|
+
out.push('}');
|
|
240
|
+
out.push('');
|
|
241
|
+
}
|
|
242
|
+
// Type guards.
|
|
243
|
+
out.push('// --- Type Guards ---');
|
|
244
|
+
out.push(`export function is${elementTypeName}(item: unknown): item is ${elementTypeName} {`);
|
|
245
|
+
out.push(` return !!item && typeof item === 'object' && '$type' in item && typeof (item as ${elementTypeName}).$type === 'string';`);
|
|
246
|
+
out.push('}');
|
|
247
|
+
out.push('');
|
|
248
|
+
for (const name of sorted) {
|
|
249
|
+
const iface = astInterfaces.get(name);
|
|
250
|
+
const isAbstract = abstractTypes.has(name);
|
|
251
|
+
out.push(`export function is${name}(item: unknown): item is ${name} {`);
|
|
252
|
+
if (isAbstract) {
|
|
253
|
+
const typeText = iface.getProperty('$type')?.getTypeNode()?.getText() ?? '';
|
|
254
|
+
const members = [...typeText.matchAll(/'([^']+)'/g)].map(m => m[1]);
|
|
255
|
+
const checks = members.map(m => `item.$type === '${m}'`).join(' || ');
|
|
256
|
+
out.push(` return is${elementTypeName}(item) && (${checks});`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
out.push(` return is${elementTypeName}(item) && item.$type === ${name}Type;`);
|
|
260
|
+
}
|
|
261
|
+
out.push('}');
|
|
262
|
+
out.push('');
|
|
263
|
+
}
|
|
264
|
+
for (const { name, definition } of typeAliases) {
|
|
265
|
+
const literals = extractStringLiterals(definition);
|
|
266
|
+
if (literals) {
|
|
267
|
+
const checks = literals.map(l => `item === '${l}'`).join(' || ');
|
|
268
|
+
out.push(`export function is${name}(item: unknown): item is ${name} {`);
|
|
269
|
+
out.push(` return ${checks};`);
|
|
270
|
+
out.push('}');
|
|
271
|
+
out.push('');
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// Union (or single) of named members and/or Langium data-type primitives. Each member maps
|
|
275
|
+
// to its own check (typeof / instanceof / named-guard) via typeAliasMemberGuard.
|
|
276
|
+
const members = definition.split('|').map(s => s.trim());
|
|
277
|
+
const checks = members.map(typeAliasMemberGuard).join(' || ');
|
|
278
|
+
out.push(`export function is${name}(item: unknown): item is ${name} {`);
|
|
279
|
+
out.push(` return ${checks};`);
|
|
280
|
+
out.push('}');
|
|
281
|
+
out.push('');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Coverage check: warn on reflection types not emitted.
|
|
285
|
+
const processedSet = new Set(sorted);
|
|
286
|
+
for (const name of Object.keys(reflectionTypes)) {
|
|
287
|
+
if (!processedSet.has(name) && !typeAliasNames.has(name)) {
|
|
288
|
+
console.warn(`Warning: reflection type '${name}' was not included in the transfer model`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Up-to-date check + write.
|
|
292
|
+
const content = out.join('\n') + '\n';
|
|
293
|
+
fs.mkdirSync(path.dirname(options.outFile), { recursive: true });
|
|
294
|
+
if (fs.existsSync(options.outFile) && fs.readFileSync(options.outFile, 'utf-8') === content) {
|
|
295
|
+
console.log('Transfer model is up to date.');
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
fs.writeFileSync(options.outFile, content, 'utf-8');
|
|
299
|
+
console.log(`Generated: ${options.outFile}`);
|
|
300
|
+
}
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// AST source parsing helpers
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
/**
|
|
305
|
+
* Drill past `as const`, `satisfies X`, and parenthesised wrappers to the
|
|
306
|
+
* underlying object literal. Newer Langium emit decorates the reflection-types
|
|
307
|
+
* initializer with `as const` and/or `satisfies AstReflectionTypes`.
|
|
308
|
+
*/
|
|
309
|
+
function unwrapToObjectLiteral(node) {
|
|
310
|
+
let current = node;
|
|
311
|
+
while (current && !current.isKind(SyntaxKind.ObjectLiteralExpression)) {
|
|
312
|
+
if (current.isKind(SyntaxKind.AsExpression) || current.isKind(SyntaxKind.SatisfiesExpression)) {
|
|
313
|
+
current = current.getExpression();
|
|
314
|
+
}
|
|
315
|
+
else if (current.isKind(SyntaxKind.ParenthesizedExpression)) {
|
|
316
|
+
current = current.getExpression();
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return current?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
323
|
+
}
|
|
324
|
+
function findAstReflectionClass(source) {
|
|
325
|
+
for (const cls of source.getClasses()) {
|
|
326
|
+
const heritage = cls.getHeritageClauses();
|
|
327
|
+
for (const clause of heritage) {
|
|
328
|
+
for (const type of clause.getTypeNodes()) {
|
|
329
|
+
if (type.getText().includes('AbstractAstReflection')) {
|
|
330
|
+
return cls;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
throw new Error('Could not find a class extending AbstractAstReflection in the AST source.');
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Extract `superTypes` for each entry of the reflection class's `types` property
|
|
339
|
+
* initializer. We rely on the Langium convention that `X.$type === 'X'`, so a
|
|
340
|
+
* supertype expression resolves to the literal type-name string by stripping
|
|
341
|
+
* `.$type`.
|
|
342
|
+
*/
|
|
343
|
+
function parseReflectionTypes(reflectionClass) {
|
|
344
|
+
const result = {};
|
|
345
|
+
const typesProp = reflectionClass.getProperty('types');
|
|
346
|
+
const rawInitializer = typesProp?.getInitializer();
|
|
347
|
+
const initializer = rawInitializer ? unwrapToObjectLiteral(rawInitializer) : undefined;
|
|
348
|
+
if (!initializer) {
|
|
349
|
+
throw new Error('Reflection class is missing an object-literal `types` property.');
|
|
350
|
+
}
|
|
351
|
+
for (const entry of initializer.getProperties()) {
|
|
352
|
+
if (entry.getKind() !== SyntaxKind.PropertyAssignment) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
const name = entry.getFirstChildByKind(SyntaxKind.Identifier)?.getText();
|
|
356
|
+
if (!name) {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
const value = entry.getLastChildByKind(SyntaxKind.ObjectLiteralExpression);
|
|
360
|
+
const supersProp = value?.getProperty('superTypes');
|
|
361
|
+
const supersInit = supersProp?.getFirstChildByKind(SyntaxKind.ArrayLiteralExpression);
|
|
362
|
+
const superTypes = [];
|
|
363
|
+
if (supersInit) {
|
|
364
|
+
for (const element of supersInit.getElements()) {
|
|
365
|
+
const text = element.getText();
|
|
366
|
+
const dotMatch = /^([A-Za-z_$][\w$]*)\.\$type$/.exec(text);
|
|
367
|
+
if (dotMatch) {
|
|
368
|
+
superTypes.push(dotMatch[1]);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
// Bare identifier or quoted string fall-back.
|
|
372
|
+
const stringMatch = /^['"](.+)['"]$/.exec(text);
|
|
373
|
+
if (stringMatch) {
|
|
374
|
+
superTypes.push(stringMatch[1]);
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
superTypes.push(text);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
result[name] = { superTypes };
|
|
382
|
+
}
|
|
383
|
+
return result;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Collect terminal regex literals from the AST file.
|
|
387
|
+
*
|
|
388
|
+
* Single-language projects put every terminal in one top-level
|
|
389
|
+
* `<LanguageId>Terminals` const. Multi-language projects keep that const as a
|
|
390
|
+
* spread of per-language `Terminals` consts declared inside each language's
|
|
391
|
+
* namespace, and each namespace carries only the terminals its own grammar
|
|
392
|
+
* reaches — so both sources are read and unioned.
|
|
393
|
+
*
|
|
394
|
+
* De-duplicated by terminal name, top-level first: when two grammars declare the
|
|
395
|
+
* same terminal, the first declaration wins and the rest are dropped rather than
|
|
396
|
+
* emitting a duplicate validation pattern. Terminals differing only by grammar are indistinguishable
|
|
397
|
+
* in the flat output, which is why the emitted patterns stay a
|
|
398
|
+
* lowest-common-denominator client-side check rather than a per-language one.
|
|
399
|
+
*/
|
|
400
|
+
export function parseTerminals(astSource, terminalsSourceName, skipTerminals) {
|
|
401
|
+
const terminals = [];
|
|
402
|
+
const seen = new Set();
|
|
403
|
+
const collectFrom = (objLiteral) => {
|
|
404
|
+
if (!objLiteral) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
for (const prop of objLiteral.getChildrenOfKind(SyntaxKind.PropertyAssignment)) {
|
|
408
|
+
const name = prop.getName();
|
|
409
|
+
if (skipTerminals.has(name) || seen.has(name)) {
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
const regex = prop.getFirstChildByKind(SyntaxKind.RegularExpressionLiteral);
|
|
413
|
+
if (!regex) {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
const match = /^\/(.+)\/([gimsuy]*)$/s.exec(regex.getText());
|
|
417
|
+
if (match) {
|
|
418
|
+
terminals.push({ name, pattern: `/^(?:${match[1]})$/` });
|
|
419
|
+
seen.add(name);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
collectFrom(astSource.getVariableDeclaration(terminalsSourceName)?.getFirstChildByKind(SyntaxKind.ObjectLiteralExpression));
|
|
424
|
+
for (const namespaceDecl of astSource.getModules()) {
|
|
425
|
+
collectFrom(namespaceDecl.getVariableDeclaration(NAMESPACED_TERMINALS_NAME)?.getFirstChildByKind(SyntaxKind.ObjectLiteralExpression));
|
|
426
|
+
}
|
|
427
|
+
return terminals;
|
|
428
|
+
}
|
|
429
|
+
function resolveConstants(source) {
|
|
430
|
+
const constants = new Map();
|
|
431
|
+
for (const decl of source.getVariableDeclarations()) {
|
|
432
|
+
const init = decl.getInitializer();
|
|
433
|
+
if (init) {
|
|
434
|
+
const match = /^['"](.+)['"]$/.exec(init.getText());
|
|
435
|
+
if (match) {
|
|
436
|
+
constants.set(decl.getName(), match[1]);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return constants;
|
|
441
|
+
}
|
|
442
|
+
function parseAugmentations(source, constants, elementTypeName) {
|
|
443
|
+
const result = new Map();
|
|
444
|
+
for (const stmt of source.getStatements()) {
|
|
445
|
+
if (stmt.getKind() !== SyntaxKind.ModuleDeclaration) {
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
const body = stmt.getFirstChildByKind(SyntaxKind.ModuleBlock);
|
|
449
|
+
if (!body) {
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
for (const iface of body.getChildrenOfKind(SyntaxKind.InterfaceDeclaration)) {
|
|
453
|
+
const props = [];
|
|
454
|
+
for (const prop of iface.getProperties()) {
|
|
455
|
+
const nameText = prop.getNameNode().getText();
|
|
456
|
+
let propName;
|
|
457
|
+
if (nameText.startsWith('[') && nameText.endsWith(']')) {
|
|
458
|
+
const constName = nameText.slice(1, -1).trim();
|
|
459
|
+
const resolved = constants.get(constName);
|
|
460
|
+
if (!resolved) {
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
propName = resolved;
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
propName = prop.getName();
|
|
467
|
+
}
|
|
468
|
+
if (propName.startsWith('$')) {
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
const jsDocs = prop.getJsDocs();
|
|
472
|
+
const comment = jsDocs.length > 0
|
|
473
|
+
? jsDocs[0]
|
|
474
|
+
.getInnerText()
|
|
475
|
+
.trim()
|
|
476
|
+
.replace(/\s*\n\s*/g, ' ')
|
|
477
|
+
: undefined;
|
|
478
|
+
props.push({
|
|
479
|
+
name: propName,
|
|
480
|
+
type: mapType(prop.getTypeNode()?.getText() ?? 'unknown', elementTypeName),
|
|
481
|
+
optional: prop.hasQuestionToken(),
|
|
482
|
+
readonly: prop.isReadonly(),
|
|
483
|
+
comment: comment || undefined
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
if (props.length > 0) {
|
|
487
|
+
const existing = result.get(iface.getName()) ?? [];
|
|
488
|
+
result.set(iface.getName(), [...existing, ...props]);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return result;
|
|
493
|
+
}
|
|
494
|
+
// ---------------------------------------------------------------------------
|
|
495
|
+
// Pure helpers
|
|
496
|
+
// ---------------------------------------------------------------------------
|
|
497
|
+
/** Map AST type text to transfer-model form: strip the `langium.` namespace. */
|
|
498
|
+
function mapType(text, elementTypeName) {
|
|
499
|
+
return text.replace(/langium\.Reference<(\w+)>/g, 'Reference<$1>').replace(/langium\.AstNode/g, elementTypeName);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Type-guard expression (against an `item: unknown`) for one member of a non-literal type-alias
|
|
503
|
+
* union. Covers the full set of Langium data-type primitives: the `typeof`-checkable ones
|
|
504
|
+
* (`string`/`number`/`boolean`/`bigint`) use `typeof`; `Date` — the one Langium primitive `typeof`
|
|
505
|
+
* reports as `'object'` — uses `instanceof`; any other member is a named type whose generated
|
|
506
|
+
* `is<Member>` guard is called.
|
|
507
|
+
*/
|
|
508
|
+
export function typeAliasMemberGuard(member) {
|
|
509
|
+
switch (member) {
|
|
510
|
+
case 'string':
|
|
511
|
+
case 'number':
|
|
512
|
+
case 'boolean':
|
|
513
|
+
case 'bigint':
|
|
514
|
+
return `typeof item === '${member}'`;
|
|
515
|
+
case 'Date':
|
|
516
|
+
return 'item instanceof Date';
|
|
517
|
+
default:
|
|
518
|
+
return `is${member}(item)`;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Flatten a type-alias definition that references per-language namespace members
|
|
523
|
+
* into a single string-literal union.
|
|
524
|
+
*
|
|
525
|
+
* Langium emits namespace-qualified aliases for a multi-language project, but the
|
|
526
|
+
* protocol package that consumes the generated transfer model cannot see those
|
|
527
|
+
* namespaces, so the reference has to be inlined here or it emits an unresolvable
|
|
528
|
+
* name.
|
|
529
|
+
*
|
|
530
|
+
* Each referenced member is inlined and de-duplicated, preserving first-seen
|
|
531
|
+
* order. The definition is returned UNCHANGED when it holds no
|
|
532
|
+
* namespace-qualified reference (the single-language case) or when any referenced
|
|
533
|
+
* member is not a pure string-literal union — passing it through rather than
|
|
534
|
+
* emitting a half-resolved union.
|
|
535
|
+
*/
|
|
536
|
+
export function resolveNamespacedStringUnion(astSource, definition) {
|
|
537
|
+
const references = [...definition.matchAll(/\b([A-Za-z_]\w*)\.([A-Za-z_]\w*)\b/g)];
|
|
538
|
+
if (references.length === 0) {
|
|
539
|
+
return definition;
|
|
540
|
+
}
|
|
541
|
+
const literals = [];
|
|
542
|
+
const seen = new Set();
|
|
543
|
+
for (const [, namespaceName, memberName] of references) {
|
|
544
|
+
const alias = astSource.getModule(namespaceName)?.getTypeAlias(memberName);
|
|
545
|
+
const memberLiterals = extractStringLiterals(alias?.getTypeNode()?.getText() ?? '');
|
|
546
|
+
if (!memberLiterals) {
|
|
547
|
+
return definition;
|
|
548
|
+
}
|
|
549
|
+
for (const literal of memberLiterals) {
|
|
550
|
+
if (!seen.has(literal)) {
|
|
551
|
+
seen.add(literal);
|
|
552
|
+
literals.push(literal);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return literals.map(literal => `'${literal}'`).join(' | ');
|
|
557
|
+
}
|
|
558
|
+
/** Extract string literals from a union definition, or undefined if not pure literals. */
|
|
559
|
+
function extractStringLiterals(definition) {
|
|
560
|
+
const stringLiteral = '(?:\'[^\']*\'|"[^"]*")';
|
|
561
|
+
if (!new RegExp(`^\\|?\\s*${stringLiteral}(\\s*\\|\\s*${stringLiteral})*$`).test(definition.trim())) {
|
|
562
|
+
return undefined;
|
|
563
|
+
}
|
|
564
|
+
return [...definition.matchAll(/'([^']*)'|"([^"]*)"/g)].map(m => m[1] ?? m[2]);
|
|
565
|
+
}
|
|
566
|
+
function topologicalSort(names, getDeps) {
|
|
567
|
+
const visited = new Set();
|
|
568
|
+
const nameSet = new Set(names);
|
|
569
|
+
const sorted = [];
|
|
570
|
+
function visit(name) {
|
|
571
|
+
if (visited.has(name)) {
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
visited.add(name);
|
|
575
|
+
for (const dep of getDeps(name)) {
|
|
576
|
+
if (nameSet.has(dep)) {
|
|
577
|
+
visit(dep);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
sorted.push(name);
|
|
581
|
+
}
|
|
582
|
+
for (const name of names) {
|
|
583
|
+
visit(name);
|
|
584
|
+
}
|
|
585
|
+
return sorted;
|
|
586
|
+
}
|
|
587
|
+
//# sourceMappingURL=generate-transfer-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-transfer-model.js","sourceRoot":"","sources":["../../src/commands/generate-transfer-model.ts"],"names":[],"mappings":"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"}
|