@domainlang/cli 0.1.20
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 +103 -0
- package/out/cli-util.d.ts +9 -0
- package/out/cli-util.js +39 -0
- package/out/cli-util.js.map +1 -0
- package/out/dependency-commands.d.ts +17 -0
- package/out/dependency-commands.js +218 -0
- package/out/dependency-commands.js.map +1 -0
- package/out/generator.d.ts +2 -0
- package/out/generator.js +16 -0
- package/out/generator.js.map +1 -0
- package/out/main.d.ts +6 -0
- package/out/main.js +147 -0
- package/out/main.js.map +1 -0
- package/out/util.d.ts +9 -0
- package/out/util.js +37 -0
- package/out/util.js.map +1 -0
- package/package.json +66 -0
- package/src/cli-util.ts +54 -0
- package/src/dependency-commands.ts +277 -0
- package/src/generator.ts +19 -0
- package/src/main.ts +188 -0
- package/src/util.ts +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# @domainlang/cli
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@domainlang/cli)
|
|
4
|
+
[](https://github.com/larsbaunwall/DomainLang/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
Command-line interface for [DomainLang](https://github.com/larsbaunwall/DomainLang) - a Domain-Driven Design modeling language.
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- 📦 **Dependency Management** - Git-native model dependencies with version locking
|
|
11
|
+
- 🔍 **Validation** - Validate your DomainLang models for correctness
|
|
12
|
+
- 🌳 **Impact Analysis** - Visualize dependency trees and analyze changes
|
|
13
|
+
- 🔒 **Compliance** - Audit and check model compliance
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @domainlang/cli
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or use with npx:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx @domainlang/cli --help
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Validate a DomainLang model
|
|
31
|
+
domain-lang-cli model validate
|
|
32
|
+
|
|
33
|
+
# Install model dependencies
|
|
34
|
+
domain-lang-cli install
|
|
35
|
+
|
|
36
|
+
# View dependency tree
|
|
37
|
+
domain-lang-cli model tree
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Commands
|
|
41
|
+
|
|
42
|
+
### Dependency Management
|
|
43
|
+
|
|
44
|
+
DomainLang supports a git-native model dependency workflow via `model.yaml` and a lock file.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# List dependencies (from lock file)
|
|
48
|
+
domain-lang-cli model list
|
|
49
|
+
|
|
50
|
+
# Add/remove dependencies in model.yaml
|
|
51
|
+
domain-lang-cli model add <name> <owner/repo> [version]
|
|
52
|
+
domain-lang-cli model remove <name>
|
|
53
|
+
|
|
54
|
+
# Install and lock dependencies
|
|
55
|
+
domain-lang-cli install
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Analysis & Validation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Validate model structure and references
|
|
62
|
+
domain-lang-cli model validate
|
|
63
|
+
|
|
64
|
+
# See dependency tree and impact analysis
|
|
65
|
+
domain-lang-cli model tree [--commits]
|
|
66
|
+
domain-lang-cli model deps <owner/repo>
|
|
67
|
+
|
|
68
|
+
# Audit and compliance checks
|
|
69
|
+
domain-lang-cli model audit
|
|
70
|
+
domain-lang-cli model compliance
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Utilities
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Clear dependency cache
|
|
77
|
+
domain-lang-cli cache-clear
|
|
78
|
+
|
|
79
|
+
# Get help
|
|
80
|
+
domain-lang-cli --help
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Code Generation (Experimental)
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Generate code from a model (currently produces stub output)
|
|
87
|
+
domain-lang-cli generate <file>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Related Packages
|
|
91
|
+
|
|
92
|
+
- [@domainlang/language](https://www.npmjs.com/package/@domainlang/language) - Core language library and SDK
|
|
93
|
+
- [DomainLang VS Code Extension](https://marketplace.visualstudio.com/items?itemName=thinkability.domain-lang) - IDE support with syntax highlighting and validation
|
|
94
|
+
|
|
95
|
+
## Documentation
|
|
96
|
+
|
|
97
|
+
- [Getting Started](https://github.com/larsbaunwall/DomainLang/blob/main/dsl/domain-lang/docs/getting-started.md)
|
|
98
|
+
- [Language Reference](https://github.com/larsbaunwall/DomainLang/blob/main/dsl/domain-lang/docs/language.md)
|
|
99
|
+
- [Quick Reference](https://github.com/larsbaunwall/DomainLang/blob/main/dsl/domain-lang/docs/quick-reference.md)
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
Apache-2.0
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AstNode, LangiumCoreServices, LangiumDocument } from 'langium';
|
|
2
|
+
export declare function extractDocument(fileName: string, services: LangiumCoreServices): Promise<LangiumDocument>;
|
|
3
|
+
export declare function extractAstNode<T extends AstNode>(fileName: string, services: LangiumCoreServices): Promise<T>;
|
|
4
|
+
interface FilePathData {
|
|
5
|
+
destination: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function extractDestinationAndName(filePath: string, destination: string | undefined): FilePathData;
|
|
9
|
+
export {};
|
package/out/cli-util.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import { URI } from 'langium';
|
|
5
|
+
export async function extractDocument(fileName, services) {
|
|
6
|
+
const extensions = services.LanguageMetaData.fileExtensions;
|
|
7
|
+
if (!extensions.includes(path.extname(fileName))) {
|
|
8
|
+
console.error(chalk.yellow(`Please choose a file with one of these extensions: ${extensions}.`));
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
if (!fs.existsSync(fileName)) {
|
|
12
|
+
console.error(chalk.red(`File ${fileName} does not exist.`));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const document = await services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(path.resolve(fileName)));
|
|
16
|
+
await services.shared.workspace.DocumentBuilder.build([document], { validation: true });
|
|
17
|
+
const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1);
|
|
18
|
+
if (validationErrors.length > 0) {
|
|
19
|
+
console.error(chalk.red('There are validation errors:'));
|
|
20
|
+
for (const validationError of validationErrors) {
|
|
21
|
+
console.error(chalk.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`));
|
|
22
|
+
}
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
return document;
|
|
26
|
+
}
|
|
27
|
+
export async function extractAstNode(fileName, services) {
|
|
28
|
+
return (await extractDocument(fileName, services)).parseResult?.value;
|
|
29
|
+
}
|
|
30
|
+
export function extractDestinationAndName(filePath, destination) {
|
|
31
|
+
const parsed = path.parse(filePath);
|
|
32
|
+
const sanitizedName = parsed.name.replace(/[.-]/g, '');
|
|
33
|
+
const targetDirectory = destination ?? path.join(parsed.dir || '.', 'generated');
|
|
34
|
+
return {
|
|
35
|
+
destination: targetDirectory,
|
|
36
|
+
name: sanitizedName
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cli-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-util.js","sourceRoot":"","sources":["../src/cli-util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,QAA6B;IACjF,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,UAAU,GAAG,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,QAAQ,kBAAkB,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxH,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAExF,MAAM,gBAAgB,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IACpF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CACnB,QAAQ,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,eAAe,CAAC,OAAO,KAAK,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CACvI,CAAC,CAAC;QACP,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAoB,QAAgB,EAAE,QAA6B;IACnG,OAAO,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,KAAU,CAAC;AAC/E,CAAC;AAOD,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,WAA+B;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,WAAW,CAAC,CAAC;IAEjF,OAAO;QACH,WAAW,EAAE,eAAe;QAC5B,IAAI,EAAE,aAAa;KACtB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI commands for DomainLang dependency management.
|
|
3
|
+
*/
|
|
4
|
+
export declare function listModels(workspaceRoot: string): Promise<void>;
|
|
5
|
+
export declare function addModel(workspaceRoot: string, name: string, source: string, version?: string): Promise<void>;
|
|
6
|
+
export declare function removeModel(workspaceRoot: string, name: string): Promise<void>;
|
|
7
|
+
export declare function statusModels(workspaceRoot: string): Promise<void>;
|
|
8
|
+
export declare function updateModel(workspaceRoot: string, name?: string): Promise<void>;
|
|
9
|
+
export declare function installModels(workspaceRoot: string): Promise<void>;
|
|
10
|
+
export declare function cacheClear(): Promise<void>;
|
|
11
|
+
export declare function showDependencyTree(workspaceRoot: string, options?: {
|
|
12
|
+
commits?: boolean;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function showImpactAnalysis(workspaceRoot: string, packageName: string): Promise<void>;
|
|
15
|
+
export declare function validateModel(workspaceRoot: string): Promise<void>;
|
|
16
|
+
export declare function auditDependencies(workspaceRoot: string): Promise<void>;
|
|
17
|
+
export declare function checkCompliance(workspaceRoot: string): Promise<void>;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { WorkspaceManager, DependencyAnalyzer, GovernanceValidator, loadGovernancePolicy } from '@domainlang/language';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import YAML from 'yaml';
|
|
6
|
+
/**
|
|
7
|
+
* CLI commands for DomainLang dependency management.
|
|
8
|
+
*/
|
|
9
|
+
export async function listModels(workspaceRoot) {
|
|
10
|
+
const manager = new WorkspaceManager();
|
|
11
|
+
await manager.initialize(workspaceRoot);
|
|
12
|
+
const lock = await manager.getLockFile();
|
|
13
|
+
if (!lock) {
|
|
14
|
+
console.log('No lock file found. Run `domain-lang-cli install` to generate dependencies.');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
console.log('Model dependencies:');
|
|
18
|
+
for (const [name, dep] of Object.entries(lock.dependencies)) {
|
|
19
|
+
console.log(` ${name}@${dep.ref} (${dep.commit.substring(0, 7)})`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function addModel(workspaceRoot, name, source, version = 'main') {
|
|
23
|
+
const manifestPath = path.join(workspaceRoot, 'model.yaml');
|
|
24
|
+
// Read existing manifest
|
|
25
|
+
let manifest = {};
|
|
26
|
+
try {
|
|
27
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
28
|
+
manifest = YAML.parse(content);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Create new manifest
|
|
32
|
+
manifest = {
|
|
33
|
+
model: {
|
|
34
|
+
name: path.basename(workspaceRoot),
|
|
35
|
+
version: '1.0.0',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Add dependency
|
|
40
|
+
if (!manifest.dependencies) {
|
|
41
|
+
manifest.dependencies = {};
|
|
42
|
+
}
|
|
43
|
+
manifest.dependencies[name] = {
|
|
44
|
+
source,
|
|
45
|
+
version,
|
|
46
|
+
};
|
|
47
|
+
// Write updated manifest
|
|
48
|
+
const yamlContent = YAML.stringify(manifest);
|
|
49
|
+
await fs.writeFile(manifestPath, yamlContent, 'utf-8');
|
|
50
|
+
console.log(`Added ${name}: ${source}@${version}`);
|
|
51
|
+
console.log('Run `domain-lang-cli install` to download dependencies.');
|
|
52
|
+
}
|
|
53
|
+
export async function removeModel(workspaceRoot, name) {
|
|
54
|
+
const manifestPath = path.join(workspaceRoot, 'model.yaml');
|
|
55
|
+
try {
|
|
56
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
57
|
+
const manifest = YAML.parse(content);
|
|
58
|
+
if (!manifest.dependencies?.[name]) {
|
|
59
|
+
console.error(`Dependency "${name}" not found in model.yaml`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
delete manifest.dependencies[name];
|
|
63
|
+
const yamlContent = YAML.stringify(manifest);
|
|
64
|
+
await fs.writeFile(manifestPath, yamlContent, 'utf-8');
|
|
65
|
+
console.log(`Removed ${name}`);
|
|
66
|
+
console.log('Run `domain-lang-cli install` to update lock file.');
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('Failed to remove dependency:', error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function statusModels(workspaceRoot) {
|
|
73
|
+
const manager = new WorkspaceManager({ autoResolve: false });
|
|
74
|
+
await manager.initialize(workspaceRoot);
|
|
75
|
+
const manifestPath = await manager.getManifestPath();
|
|
76
|
+
if (!manifestPath) {
|
|
77
|
+
console.log('No model.yaml found in workspace.');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const lock = await manager.getLockFile();
|
|
81
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
82
|
+
const manifest = YAML.parse(content);
|
|
83
|
+
if (!manifest.dependencies || Object.keys(manifest.dependencies).length === 0) {
|
|
84
|
+
console.log('No dependencies declared in model.yaml');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log('Dependency status:');
|
|
88
|
+
for (const [name, dep] of Object.entries(manifest.dependencies)) {
|
|
89
|
+
const locked = lock?.dependencies[dep.source];
|
|
90
|
+
if (locked) {
|
|
91
|
+
console.log(` ✓ ${name} (${dep.source}@${dep.version}) → locked to ${locked.commit.substring(0, 7)}`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log(` ✗ ${name} (${dep.source}@${dep.version}) → not locked`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (!lock || Object.keys(lock.dependencies).length === 0) {
|
|
98
|
+
console.log('\nRun `domain-lang-cli install` to lock dependencies.');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function updateModel(workspaceRoot, name) {
|
|
102
|
+
console.log(name ? `Updating ${name}...` : 'Updating all dependencies...');
|
|
103
|
+
// For now, just regenerate the lock file
|
|
104
|
+
const manager = new WorkspaceManager();
|
|
105
|
+
await manager.initialize(workspaceRoot);
|
|
106
|
+
await manager.regenerateLockFile();
|
|
107
|
+
console.log('Dependencies updated and lock file regenerated.');
|
|
108
|
+
}
|
|
109
|
+
export async function installModels(workspaceRoot) {
|
|
110
|
+
const manager = new WorkspaceManager();
|
|
111
|
+
await manager.initialize(workspaceRoot);
|
|
112
|
+
const lock = await manager.ensureLockFile();
|
|
113
|
+
const count = Object.keys(lock.dependencies).length;
|
|
114
|
+
console.log(`Dependencies installed: ${count} package(s) locked.`);
|
|
115
|
+
}
|
|
116
|
+
export async function cacheClear() {
|
|
117
|
+
const cacheDir = path.join(os.homedir(), '.dlang', 'cache');
|
|
118
|
+
try {
|
|
119
|
+
await fs.rm(cacheDir, { recursive: true, force: true });
|
|
120
|
+
console.log('Cache cleared successfully.');
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('Failed to clear cache:', error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export async function showDependencyTree(workspaceRoot, options = {}) {
|
|
127
|
+
const manager = new WorkspaceManager({ autoResolve: false });
|
|
128
|
+
await manager.initialize(workspaceRoot);
|
|
129
|
+
const lock = await manager.getLockFile();
|
|
130
|
+
if (!lock || Object.keys(lock.dependencies).length === 0) {
|
|
131
|
+
console.log('No dependencies found. Run `domain-lang-cli install` first.');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const analyzer = new DependencyAnalyzer();
|
|
135
|
+
const tree = await analyzer.buildDependencyTree(lock, workspaceRoot);
|
|
136
|
+
if (tree.length === 0) {
|
|
137
|
+
console.log('Dependency tree is empty.');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
console.log('Dependency tree:');
|
|
141
|
+
console.log(analyzer.formatDependencyTree(tree, { showCommits: options.commits }));
|
|
142
|
+
}
|
|
143
|
+
export async function showImpactAnalysis(workspaceRoot, packageName) {
|
|
144
|
+
const manager = new WorkspaceManager({ autoResolve: false });
|
|
145
|
+
await manager.initialize(workspaceRoot);
|
|
146
|
+
const lock = await manager.getLockFile();
|
|
147
|
+
if (!lock) {
|
|
148
|
+
console.log('No lock file found. Run `domain-lang-cli install` first.');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const analyzer = new DependencyAnalyzer();
|
|
152
|
+
const reverseDeps = await analyzer.findReverseDependencies(packageName, lock, workspaceRoot);
|
|
153
|
+
if (reverseDeps.length === 0) {
|
|
154
|
+
console.log(`No packages depend on "${packageName}".`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.log(`Packages depending on "${packageName}":`);
|
|
158
|
+
for (const dep of reverseDeps) {
|
|
159
|
+
const typeLabel = dep.type === 'direct' ? '→' : '⇢';
|
|
160
|
+
console.log(` ${typeLabel} ${dep.dependentPackage}@${dep.ref}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export async function validateModel(workspaceRoot) {
|
|
164
|
+
const manager = new WorkspaceManager({ autoResolve: false });
|
|
165
|
+
await manager.initialize(workspaceRoot);
|
|
166
|
+
const lock = await manager.getLockFile();
|
|
167
|
+
if (!lock) {
|
|
168
|
+
console.log('No lock file found. Run `domain-lang-cli install` first.');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const analyzer = new DependencyAnalyzer();
|
|
172
|
+
const cycles = await analyzer.detectCircularDependencies(lock);
|
|
173
|
+
if (cycles.length > 0) {
|
|
174
|
+
console.log('\u26a0 Circular dependencies detected:');
|
|
175
|
+
for (const cycle of cycles) {
|
|
176
|
+
console.log(` ${cycle.join(' \u2192 ')}`);
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
console.log('\u2713 No circular dependencies detected.');
|
|
181
|
+
console.log('\u2713 Model structure is valid.');
|
|
182
|
+
}
|
|
183
|
+
export async function auditDependencies(workspaceRoot) {
|
|
184
|
+
const manager = new WorkspaceManager({ autoResolve: false });
|
|
185
|
+
await manager.initialize(workspaceRoot);
|
|
186
|
+
const lock = await manager.getLockFile();
|
|
187
|
+
if (!lock) {
|
|
188
|
+
console.log('No lock file found. Run `domain-lang-cli install` first.');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const policy = await loadGovernancePolicy(workspaceRoot);
|
|
192
|
+
const validator = new GovernanceValidator(policy);
|
|
193
|
+
const report = await validator.generateAuditReport(lock, workspaceRoot);
|
|
194
|
+
console.log(report);
|
|
195
|
+
}
|
|
196
|
+
export async function checkCompliance(workspaceRoot) {
|
|
197
|
+
const manager = new WorkspaceManager({ autoResolve: false });
|
|
198
|
+
await manager.initialize(workspaceRoot);
|
|
199
|
+
const lock = await manager.getLockFile();
|
|
200
|
+
if (!lock) {
|
|
201
|
+
console.log('No lock file found. Run `domain-lang-cli install` first.');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const policy = await loadGovernancePolicy(workspaceRoot);
|
|
205
|
+
const validator = new GovernanceValidator(policy);
|
|
206
|
+
const violations = await validator.validate(lock, workspaceRoot);
|
|
207
|
+
if (violations.length === 0) {
|
|
208
|
+
console.log('\u2713 All dependencies comply with governance policies.');
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
console.log(`\u26a0 Found ${violations.length} policy violation(s):\n`);
|
|
212
|
+
for (const violation of violations) {
|
|
213
|
+
const icon = violation.severity === 'error' ? '\u2717' : '\u26a0';
|
|
214
|
+
console.log(`${icon} [${violation.severity.toUpperCase()}] ${violation.packageKey}`);
|
|
215
|
+
console.log(` ${violation.message}\n`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=dependency-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-commands.js","sourceRoot":"","sources":["../src/dependency-commands.ts"],"names":[],"mappings":"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"}
|
package/out/generator.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CompositeGeneratorNode, NL, toString } from 'langium/generate';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { extractDestinationAndName } from './cli-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 = new CompositeGeneratorNode();
|
|
9
|
+
fileNode.append('"use strict";', NL, NL);
|
|
10
|
+
if (!fs.existsSync(data.destination)) {
|
|
11
|
+
fs.mkdirSync(data.destination, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
fs.writeFileSync(generatedFilePath, toString(fileNode));
|
|
14
|
+
return generatedFilePath;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,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,IAAI,sBAAsB,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzC,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"}
|
package/out/main.d.ts
ADDED
package/out/main.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { listModels, installModels, addModel, removeModel, statusModels, updateModel, cacheClear, showDependencyTree, showImpactAnalysis, validateModel, auditDependencies, checkCompliance } from './dependency-commands.js';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { DomainLangLanguageMetaData, createDomainLangServices } from '@domainlang/language';
|
|
5
|
+
import { extractAstNode } from './cli-util.js';
|
|
6
|
+
import { generateJavaScript } from './generator.js';
|
|
7
|
+
import { NodeFileSystem } from 'langium/node';
|
|
8
|
+
import { performance } from 'node:perf_hooks';
|
|
9
|
+
import * as url from 'node:url';
|
|
10
|
+
import * as fs from 'node:fs/promises';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
13
|
+
const packagePath = path.resolve(__dirname, '..', '..', 'package.json');
|
|
14
|
+
const packageContent = await fs.readFile(packagePath, 'utf-8');
|
|
15
|
+
export const generateAction = async (fileName, opts) => {
|
|
16
|
+
try {
|
|
17
|
+
const services = createDomainLangServices(NodeFileSystem).DomainLang;
|
|
18
|
+
// Simple performance tracking if requested
|
|
19
|
+
const startTime = opts.profile ? performance.now() : 0;
|
|
20
|
+
let parseTime = 0;
|
|
21
|
+
if (opts.profile) {
|
|
22
|
+
console.log(chalk.blue('🔍 Performance profiling enabled'));
|
|
23
|
+
const parseStart = performance.now();
|
|
24
|
+
const model = await extractAstNode(fileName, services);
|
|
25
|
+
parseTime = performance.now() - parseStart;
|
|
26
|
+
const generatedFilePath = generateJavaScript(model, fileName, opts.destination);
|
|
27
|
+
const totalTime = performance.now() - startTime;
|
|
28
|
+
// Display profiling results
|
|
29
|
+
console.log(chalk.blue('\n📊 Performance Profile:'));
|
|
30
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
31
|
+
console.log(chalk.cyan(` Total Time: ${totalTime.toFixed(2)}ms`));
|
|
32
|
+
console.log(chalk.gray(` - Parsing: ${parseTime.toFixed(2)}ms`));
|
|
33
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
34
|
+
console.log(chalk.green('✓ JavaScript code generated successfully:'), chalk.cyan(generatedFilePath));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const model = await extractAstNode(fileName, services);
|
|
38
|
+
const generatedFilePath = generateJavaScript(model, fileName, opts.destination);
|
|
39
|
+
console.log(chalk.green('✓ JavaScript code generated successfully:'), chalk.cyan(generatedFilePath));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
console.error(chalk.red('✗ Generation failed:'), message);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export default function () {
|
|
49
|
+
const program = new Command();
|
|
50
|
+
program.version(JSON.parse(packageContent).version);
|
|
51
|
+
const fileExtensions = DomainLangLanguageMetaData.fileExtensions.join(', ');
|
|
52
|
+
program
|
|
53
|
+
.command('generate')
|
|
54
|
+
.argument('<file>', `source file (possible file extensions: ${fileExtensions})`)
|
|
55
|
+
.option('-d, --destination <dir>', 'destination directory of generating')
|
|
56
|
+
.option('-p, --profile', 'enable performance profiling')
|
|
57
|
+
.description('generates JavaScript code that prints "Hello, {name}!" for each greeting in a source file')
|
|
58
|
+
.action(generateAction);
|
|
59
|
+
// Model dependency management commands
|
|
60
|
+
program
|
|
61
|
+
.command('model')
|
|
62
|
+
.description('Manage model dependencies')
|
|
63
|
+
.action(() => {
|
|
64
|
+
console.log('Use: model list|add|remove|status|update');
|
|
65
|
+
});
|
|
66
|
+
program
|
|
67
|
+
.command('model list')
|
|
68
|
+
.description('List all model dependencies')
|
|
69
|
+
.action(async () => {
|
|
70
|
+
await listModels(process.cwd());
|
|
71
|
+
});
|
|
72
|
+
program
|
|
73
|
+
.command('model add')
|
|
74
|
+
.description('Add a model dependency')
|
|
75
|
+
.argument('<name>', 'dependency name')
|
|
76
|
+
.argument('<source>', 'git source (e.g., owner/repo)')
|
|
77
|
+
.argument('[version]', 'version constraint (default: main)', 'main')
|
|
78
|
+
.action(async (name, source, version) => {
|
|
79
|
+
await addModel(process.cwd(), name, source, version);
|
|
80
|
+
});
|
|
81
|
+
program
|
|
82
|
+
.command('model remove')
|
|
83
|
+
.description('Remove a model dependency')
|
|
84
|
+
.argument('<name>', 'dependency name')
|
|
85
|
+
.action(async (name) => {
|
|
86
|
+
await removeModel(process.cwd(), name);
|
|
87
|
+
});
|
|
88
|
+
program
|
|
89
|
+
.command('model status')
|
|
90
|
+
.description('Check dependency status')
|
|
91
|
+
.action(async () => {
|
|
92
|
+
await statusModels(process.cwd());
|
|
93
|
+
});
|
|
94
|
+
program
|
|
95
|
+
.command('model update')
|
|
96
|
+
.description('Update dependencies')
|
|
97
|
+
.argument('[name]', 'specific dependency to update (optional)')
|
|
98
|
+
.action(async (name) => {
|
|
99
|
+
await updateModel(process.cwd(), name);
|
|
100
|
+
});
|
|
101
|
+
program
|
|
102
|
+
.command('install')
|
|
103
|
+
.description('Install all model dependencies and generate lock file')
|
|
104
|
+
.action(async () => {
|
|
105
|
+
await installModels(process.cwd());
|
|
106
|
+
});
|
|
107
|
+
program
|
|
108
|
+
.command('cache-clear')
|
|
109
|
+
.description('Clear the dependency cache')
|
|
110
|
+
.action(async () => {
|
|
111
|
+
await cacheClear();
|
|
112
|
+
});
|
|
113
|
+
program
|
|
114
|
+
.command('model tree')
|
|
115
|
+
.description('Show dependency tree')
|
|
116
|
+
.option('-c, --commits', 'Show commit hashes')
|
|
117
|
+
.action(async (opts) => {
|
|
118
|
+
await showDependencyTree(process.cwd(), { commits: opts.commits });
|
|
119
|
+
});
|
|
120
|
+
program
|
|
121
|
+
.command('model deps')
|
|
122
|
+
.description('Show packages that depend on a given package')
|
|
123
|
+
.argument('<package>', 'package name (e.g., owner/repo)')
|
|
124
|
+
.action(async (packageName) => {
|
|
125
|
+
await showImpactAnalysis(process.cwd(), packageName);
|
|
126
|
+
});
|
|
127
|
+
program
|
|
128
|
+
.command('model validate')
|
|
129
|
+
.description('Validate model structure and dependencies')
|
|
130
|
+
.action(async () => {
|
|
131
|
+
await validateModel(process.cwd());
|
|
132
|
+
});
|
|
133
|
+
program
|
|
134
|
+
.command('model audit')
|
|
135
|
+
.description('Generate governance audit report')
|
|
136
|
+
.action(async () => {
|
|
137
|
+
await auditDependencies(process.cwd());
|
|
138
|
+
});
|
|
139
|
+
program
|
|
140
|
+
.command('model compliance')
|
|
141
|
+
.description('Check compliance with governance policies')
|
|
142
|
+
.action(async () => {
|
|
143
|
+
await checkCompliance(process.cwd());
|
|
144
|
+
});
|
|
145
|
+
program.parse(process.argv);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=main.js.map
|
package/out/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/out/util.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AstNode, LangiumCoreServices, LangiumDocument } from 'langium';
|
|
2
|
+
export declare function extractDocument(fileName: string, services: LangiumCoreServices): Promise<LangiumDocument>;
|
|
3
|
+
export declare function extractAstNode<T extends AstNode>(fileName: string, services: LangiumCoreServices): Promise<T>;
|
|
4
|
+
interface FilePathData {
|
|
5
|
+
destination: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function extractDestinationAndName(filePath: string, destination: string | undefined): FilePathData;
|
|
9
|
+
export {};
|
package/out/util.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import { URI } from 'langium';
|
|
5
|
+
export async function extractDocument(fileName, services) {
|
|
6
|
+
const extensions = services.LanguageMetaData.fileExtensions;
|
|
7
|
+
if (!extensions.includes(path.extname(fileName))) {
|
|
8
|
+
console.error(chalk.yellow(`Please choose a file with one of these extensions: ${extensions}.`));
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
if (!fs.existsSync(fileName)) {
|
|
12
|
+
console.error(chalk.red(`File ${fileName} does not exist.`));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const document = await services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(path.resolve(fileName)));
|
|
16
|
+
await services.shared.workspace.DocumentBuilder.build([document], { validation: true });
|
|
17
|
+
const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1);
|
|
18
|
+
if (validationErrors.length > 0) {
|
|
19
|
+
console.error(chalk.red('There are validation errors:'));
|
|
20
|
+
for (const validationError of validationErrors) {
|
|
21
|
+
console.error(chalk.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`));
|
|
22
|
+
}
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
return document;
|
|
26
|
+
}
|
|
27
|
+
export async function extractAstNode(fileName, services) {
|
|
28
|
+
return (await extractDocument(fileName, services)).parseResult?.value;
|
|
29
|
+
}
|
|
30
|
+
export function extractDestinationAndName(filePath, destination) {
|
|
31
|
+
filePath = path.basename(filePath, path.extname(filePath)).replace(/[.-]/g, '');
|
|
32
|
+
return {
|
|
33
|
+
destination: destination ?? path.join(path.dirname(filePath), 'generated'),
|
|
34
|
+
name: path.basename(filePath)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=util.js.map
|