@reqlan/cli 0.1.0 → 0.2.0
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 +64 -11
- package/README.template.md +47 -0
- package/out/commands/export.d.ts +17 -0
- package/out/commands/export.js +137 -0
- package/out/commands/export.js.map +1 -0
- package/out/main.js +2 -0
- package/out/main.js.map +1 -1
- package/package.json +4 -4
- package/out/generator.d.ts +0 -2
- package/out/generator.js +0 -19
- package/out/generator.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/littletuna4/reqlan/HEAD/packages/extension/media/logo.png" alt="reqlan logo" width="128" height="128">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
# @reqlan/cli
|
|
6
|
+
|
|
7
|
+
CLI for parsing, analysing, and exporting reqlan requirement graphs
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- `reqlan` / `rq` Clipanion CLI for requirement workspaces
|
|
12
|
+
- `parse` — parse a `.rq` file and print diagnostics or an AST summary
|
|
13
|
+
- `analyse` / `analyze` — file, idea, or workspace graph analysis via `AnalysisApi`
|
|
14
|
+
- `search` — semantic search across indexed requirements (`--json` for scripting)
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g @reqlan/cli
|
|
20
|
+
# or
|
|
21
|
+
npx @reqlan/cli --help
|
|
22
|
+
```
|
|
4
23
|
|
|
5
24
|
## Commands
|
|
6
25
|
|
|
@@ -11,15 +30,49 @@ reqlan analyze # alias of analyse
|
|
|
11
30
|
reqlan search <query> [--limit <n>] [--cwd <dir>] [--json]
|
|
12
31
|
```
|
|
13
32
|
|
|
14
|
-
|
|
33
|
+
Set `REQLAN_WORKSPACE` or pass `--cwd` to override the workspace root.
|
|
15
34
|
|
|
16
|
-
|
|
35
|
+
The ideas index is shared application memory at `<workspace>/.reqlan/ideas-index.sqlite` (same path as the VS Code extension and MCP). Override the storage directory with `REQLAN_INDEX_PATH` when needed.
|
|
17
36
|
|
|
18
|
-
|
|
37
|
+
## Links
|
|
19
38
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
39
|
+
- [Site](https://tony.is-a.dev/reqlan)
|
|
40
|
+
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=reqlan.reqlan-extension)
|
|
41
|
+
- [Open VSX](https://open-vsx.org/extension/reqlan/reqlan-extension)
|
|
42
|
+
- [GitHub repository](https://github.com/littletuna4/reqlan)
|
|
43
|
+
- [Contact](mailto:reqlan@tony.is-a.dev)
|
|
44
|
+
|
|
45
|
+
## Changelog
|
|
46
|
+
|
|
47
|
+
### 0.2.0
|
|
48
|
+
|
|
49
|
+
#### Minor Changes
|
|
50
|
+
|
|
51
|
+
- 627d502: updates to cli, site export, site (showing spec), replace welcome screen, temp remove old extension name.
|
|
52
|
+
|
|
53
|
+
#### Patch Changes
|
|
54
|
+
|
|
55
|
+
- Updated dependencies [627d502]
|
|
56
|
+
- @reqlan/analytical@0.5.0
|
|
57
|
+
- @reqlan/language@1.5.0
|
|
58
|
+
|
|
59
|
+
### 0.1.1
|
|
60
|
+
|
|
61
|
+
#### Patch Changes
|
|
62
|
+
|
|
63
|
+
- 1790ce1: Update the landers.
|
|
64
|
+
- Updated dependencies [1790ce1]
|
|
65
|
+
- @reqlan/language@1.4.1
|
|
66
|
+
- @reqlan/analytical@0.4.1
|
|
67
|
+
|
|
68
|
+
### 0.1.0
|
|
69
|
+
|
|
70
|
+
#### Minor Changes
|
|
71
|
+
|
|
72
|
+
- 8ac3f82: Minor site showcase fixes, extension search functinoality, cli init.
|
|
73
|
+
|
|
74
|
+
#### Patch Changes
|
|
75
|
+
|
|
76
|
+
- Updated dependencies [8ac3f82]
|
|
77
|
+
- @reqlan/analytical@0.4.0
|
|
78
|
+
- @reqlan/language@1.4.0
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="{{LOGO_URL}}" alt="reqlan logo" width="128" height="128">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# {{PACKAGE_NAME}}
|
|
6
|
+
|
|
7
|
+
{{DESCRIPTION}}
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- `reqlan` / `rq` Clipanion CLI for requirement workspaces
|
|
12
|
+
- `parse` — parse a `.rq` file and print diagnostics or an AST summary
|
|
13
|
+
- `analyse` / `analyze` — file, idea, or workspace graph analysis via `AnalysisApi`
|
|
14
|
+
- `search` — semantic search across indexed requirements (`--json` for scripting)
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g @reqlan/cli
|
|
20
|
+
# or
|
|
21
|
+
npx @reqlan/cli --help
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Commands
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
reqlan parse <file> [--json]
|
|
28
|
+
reqlan analyse [--file <path> | --idea <name>] [--depth <n>] [--cwd <dir>] [--json]
|
|
29
|
+
reqlan analyze # alias of analyse
|
|
30
|
+
reqlan search <query> [--limit <n>] [--cwd <dir>] [--json]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Set `REQLAN_WORKSPACE` or pass `--cwd` to override the workspace root.
|
|
34
|
+
|
|
35
|
+
The ideas index is shared application memory at `<workspace>/.reqlan/ideas-index.sqlite` (same path as the VS Code extension and MCP). Override the storage directory with `REQLAN_INDEX_PATH` when needed.
|
|
36
|
+
|
|
37
|
+
## Links
|
|
38
|
+
|
|
39
|
+
- [{{SITE_LABEL}}]({{SITE_URL}})
|
|
40
|
+
- [{{VSC_LABEL}}]({{VSC_URL}})
|
|
41
|
+
- [{{OPENVSX_LABEL}}]({{OPENVSX_URL}})
|
|
42
|
+
- [GitHub repository]({{GITHUB_URL}})
|
|
43
|
+
- [Contact]({{EMAIL_URL}})
|
|
44
|
+
|
|
45
|
+
## Changelog
|
|
46
|
+
|
|
47
|
+
{{CHANGELOG}}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from 'clipanion';
|
|
2
|
+
export declare class ExportCommand extends Command {
|
|
3
|
+
static paths: string[][];
|
|
4
|
+
static usage: import("clipanion").Usage;
|
|
5
|
+
output: string | undefined;
|
|
6
|
+
name: string;
|
|
7
|
+
file: string | undefined;
|
|
8
|
+
runtimeMode: string;
|
|
9
|
+
clusterStrategy: string;
|
|
10
|
+
excludeSecret: boolean;
|
|
11
|
+
urlBase: string | undefined;
|
|
12
|
+
headerHref: string | undefined;
|
|
13
|
+
headerLabel: string | undefined;
|
|
14
|
+
cwd: string | undefined;
|
|
15
|
+
json: boolean;
|
|
16
|
+
execute(): Promise<number>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Command, Option } from 'clipanion';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { toWorkspaceRelativePath } from '@reqlan/analytical';
|
|
4
|
+
import { withAnalysisApi, resolveWorkspaceRoot } from '../runtime.js';
|
|
5
|
+
import { emit } from '../output.js';
|
|
6
|
+
const RUNTIME_MODES = new Set(['interactive', 'document', 'print']);
|
|
7
|
+
const CLUSTER_STRATEGIES = new Set(['hybrid', 'deterministic']);
|
|
8
|
+
export class ExportCommand extends Command {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.output = Option.String('-o,--output', {
|
|
12
|
+
description: 'Parent directory for the export folder (default: <cwd>/reqlan-export)'
|
|
13
|
+
});
|
|
14
|
+
this.name = Option.String('-n,--name', 'reqlan-export', {
|
|
15
|
+
description: 'Export folder name (default: reqlan-export)'
|
|
16
|
+
});
|
|
17
|
+
this.file = Option.String('-f,--file', {
|
|
18
|
+
description: 'Export only the given .rq file and its local graph'
|
|
19
|
+
});
|
|
20
|
+
this.runtimeMode = Option.String('--runtime-mode', 'interactive', {
|
|
21
|
+
description: 'HTML runtime mode: interactive | document | print (default: interactive)'
|
|
22
|
+
});
|
|
23
|
+
this.clusterStrategy = Option.String('--cluster-strategy', 'hybrid', {
|
|
24
|
+
description: 'Cluster strategy: hybrid | deterministic (default: hybrid)'
|
|
25
|
+
});
|
|
26
|
+
this.excludeSecret = Option.Boolean('--exclude-secret', false, {
|
|
27
|
+
description: 'Omit ideas hosted in *.secret.rq files'
|
|
28
|
+
});
|
|
29
|
+
this.urlBase = Option.String('--url-base', {
|
|
30
|
+
description: 'Absolute URL prefix for the export mount (e.g. /spec or /reqlan/spec)'
|
|
31
|
+
});
|
|
32
|
+
this.headerHref = Option.String('--header-href', {
|
|
33
|
+
description: 'Optional topbar link href back to a parent site'
|
|
34
|
+
});
|
|
35
|
+
this.headerLabel = Option.String('--header-label', {
|
|
36
|
+
description: 'Optional topbar link label (requires --header-href)'
|
|
37
|
+
});
|
|
38
|
+
this.cwd = Option.String('--cwd', {
|
|
39
|
+
description: 'Workspace root (default: walk from cwd, or REQLAN_WORKSPACE)'
|
|
40
|
+
});
|
|
41
|
+
this.json = Option.Boolean('--json', false, {
|
|
42
|
+
description: 'Emit machine-readable JSON with export paths'
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async execute() {
|
|
46
|
+
const runtimeMode = this.runtimeMode;
|
|
47
|
+
if (!RUNTIME_MODES.has(runtimeMode)) {
|
|
48
|
+
this.context.stderr.write(`Invalid --runtime-mode "${this.runtimeMode}". Expected interactive, document, or print.\n`);
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
const clusterStrategy = this.clusterStrategy;
|
|
52
|
+
if (!CLUSTER_STRATEGIES.has(clusterStrategy)) {
|
|
53
|
+
this.context.stderr.write(`Invalid --cluster-strategy "${this.clusterStrategy}". Expected hybrid or deterministic.\n`);
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
56
|
+
const headerHref = this.headerHref?.trim();
|
|
57
|
+
const headerLabel = this.headerLabel?.trim();
|
|
58
|
+
if ((headerHref && !headerLabel) || (!headerHref && headerLabel)) {
|
|
59
|
+
this.context.stderr.write('Both --header-href and --header-label are required when setting a header link.\n');
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
const exportName = this.name.trim() || 'reqlan-export';
|
|
63
|
+
if (/[\\/]/.test(exportName)) {
|
|
64
|
+
this.context.stderr.write('Export name cannot contain path separators.\n');
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
const workspaceRoot = resolveWorkspaceRoot(this.cwd);
|
|
68
|
+
const outputDir = resolve(this.output?.trim() || resolve(workspaceRoot, 'reqlan-export'));
|
|
69
|
+
const scope = this.file ? 'currentFile' : 'workspace';
|
|
70
|
+
const sourceFileUri = this.file
|
|
71
|
+
? toWorkspaceRelativePath(resolve(workspaceRoot, this.file), workspaceRoot)
|
|
72
|
+
: undefined;
|
|
73
|
+
try {
|
|
74
|
+
await withAnalysisApi(this.cwd, async (api) => {
|
|
75
|
+
const result = await api.exportHtml({
|
|
76
|
+
format: 'html',
|
|
77
|
+
outputDir,
|
|
78
|
+
exportName,
|
|
79
|
+
templateId: 'default',
|
|
80
|
+
scope,
|
|
81
|
+
sourceFileUri,
|
|
82
|
+
includeRequirementsPage: true,
|
|
83
|
+
includeGraphPage: true,
|
|
84
|
+
printEntryFileName: 'print.html',
|
|
85
|
+
runtimeMode,
|
|
86
|
+
clusterStrategy,
|
|
87
|
+
includeIdeaPages: true,
|
|
88
|
+
includeFilePages: true,
|
|
89
|
+
includeCodeFilePages: true,
|
|
90
|
+
includeClusterPages: true,
|
|
91
|
+
includeAttributePages: true,
|
|
92
|
+
includePrintPages: true,
|
|
93
|
+
excludeSecretFiles: this.excludeSecret,
|
|
94
|
+
urlBase: this.urlBase?.trim() || undefined,
|
|
95
|
+
headerLink: headerHref && headerLabel
|
|
96
|
+
? { href: headerHref, label: headerLabel }
|
|
97
|
+
: undefined
|
|
98
|
+
});
|
|
99
|
+
if (this.json) {
|
|
100
|
+
emit({
|
|
101
|
+
outputDir: result.outputDir,
|
|
102
|
+
indexFilePath: result.indexFilePath,
|
|
103
|
+
printFilePath: result.printFilePath,
|
|
104
|
+
graphFilePath: result.graphFilePath,
|
|
105
|
+
dataFilePath: result.dataFilePath
|
|
106
|
+
}, true);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
emit(`Exported HTML site to ${result.outputDir}`, false);
|
|
110
|
+
});
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
115
|
+
this.context.stderr.write(`${message}\n`);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
ExportCommand.paths = [['export'], ['export', 'html']];
|
|
121
|
+
ExportCommand.usage = Command.Usage({
|
|
122
|
+
description: 'Export the requirement graph as a multi-file static HTML site.',
|
|
123
|
+
details: `
|
|
124
|
+
Writes an HTML export under <output>/<name>/.
|
|
125
|
+
Use --exclude-secret to omit gitignored *.secret.rq files from the export.
|
|
126
|
+
`,
|
|
127
|
+
examples: [
|
|
128
|
+
['Workspace HTML export', '$0 export --output ./reqlan-export --name workspace'],
|
|
129
|
+
['Public non-secret graph', '$0 export html --exclude-secret --output ./out --name spec'],
|
|
130
|
+
[
|
|
131
|
+
'Site embed with mount + home link',
|
|
132
|
+
'$0 export html --exclude-secret --url-base /spec --header-href / --header-label reqlan --output ./out --name spec'
|
|
133
|
+
],
|
|
134
|
+
['Current-file scope', '$0 export --file ./reqlan\\ rq/cli/cli_package.rq --output ./tmp']
|
|
135
|
+
]
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
package/out/main.js
CHANGED
|
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
import { ParseCommand } from './commands/parse.js';
|
|
6
6
|
import { AnalyseCommand } from './commands/analyse.js';
|
|
7
7
|
import { SearchCommand } from './commands/search.js';
|
|
8
|
+
import { ExportCommand } from './commands/export.js';
|
|
8
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
10
|
const packageJson = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf8'));
|
|
10
11
|
const cli = new Cli({
|
|
@@ -17,5 +18,6 @@ cli.register(Builtins.VersionCommand);
|
|
|
17
18
|
cli.register(ParseCommand);
|
|
18
19
|
cli.register(AnalyseCommand);
|
|
19
20
|
cli.register(SearchCommand);
|
|
21
|
+
cli.register(ExportCommand);
|
|
20
22
|
await cli.runExit(process.argv.slice(2));
|
|
21
23
|
//# sourceMappingURL=main.js.map
|
package/out/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE5F,CAAC;AAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAChB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,WAAW,CAAC,OAAO;CACrC,CAAC,CAAC;AAEH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC3B,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC7B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE5F,CAAC;AAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAChB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,WAAW,CAAC,OAAO;CACrC,CAAC,CAAC;AAEH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC3B,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC7B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reqlan/cli",
|
|
3
|
-
"description": "CLI for parsing and
|
|
4
|
-
"version": "0.
|
|
3
|
+
"description": "CLI for parsing, analysing, and exporting reqlan requirement graphs",
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
7
7
|
"repository": {
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"clipanion": "3.2.1",
|
|
28
28
|
"langium": "~4.3.0",
|
|
29
|
-
"@reqlan/
|
|
30
|
-
"@reqlan/
|
|
29
|
+
"@reqlan/analytical": "0.5.0",
|
|
30
|
+
"@reqlan/language": "1.5.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"shx": "~0.4.0"
|
package/out/generator.d.ts
DELETED
package/out/generator.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { expandToNode, joinToNode, toString } from 'langium/generate';
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
import * as path from 'node:path';
|
|
4
|
-
import { extractDestinationAndName } from './util.js';
|
|
5
|
-
export function generateJavaScript(model, filePath, destination) {
|
|
6
|
-
const data = extractDestinationAndName(filePath, destination);
|
|
7
|
-
const generatedFilePath = `${path.join(data.destination, data.name)}.js`;
|
|
8
|
-
const fileNode = expandToNode `
|
|
9
|
-
"use strict";
|
|
10
|
-
|
|
11
|
-
${joinToNode(model.elements, (element) => `// ${element.$type}`, { appendNewLineIfNotEmpty: true })}
|
|
12
|
-
`.appendNewLineIfNotEmpty();
|
|
13
|
-
if (!fs.existsSync(data.destination)) {
|
|
14
|
-
fs.mkdirSync(data.destination, { recursive: true });
|
|
15
|
-
}
|
|
16
|
-
fs.writeFileSync(generatedFilePath, toString(fileNode));
|
|
17
|
-
return generatedFilePath;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=generator.js.map
|
package/out/generator.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,QAAgB,EAAE,WAA+B;IAC9F,MAAM,IAAI,GAAG,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAEzE,MAAM,QAAQ,GAAG,YAAY,CAAA;;;UAGvB,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAwB,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC;KACvH,CAAC,uBAAuB,EAAE,CAAC;IAE5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,OAAO,iBAAiB,CAAC;AAC7B,CAAC"}
|