@domainlang/language 0.1.81

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.
Files changed (188) hide show
  1. package/README.md +32 -0
  2. package/out/ast-augmentation.d.ts +6 -0
  3. package/out/ast-augmentation.js +2 -0
  4. package/out/ast-augmentation.js.map +1 -0
  5. package/out/domain-lang-module.d.ts +55 -0
  6. package/out/domain-lang-module.js +59 -0
  7. package/out/domain-lang-module.js.map +1 -0
  8. package/out/generated/ast.d.ts +770 -0
  9. package/out/generated/ast.js +565 -0
  10. package/out/generated/ast.js.map +1 -0
  11. package/out/generated/grammar.d.ts +6 -0
  12. package/out/generated/grammar.js +2502 -0
  13. package/out/generated/grammar.js.map +1 -0
  14. package/out/generated/module.d.ts +13 -0
  15. package/out/generated/module.js +21 -0
  16. package/out/generated/module.js.map +1 -0
  17. package/out/index.d.ts +13 -0
  18. package/out/index.js +17 -0
  19. package/out/index.js.map +1 -0
  20. package/out/lsp/domain-lang-completion.d.ts +37 -0
  21. package/out/lsp/domain-lang-completion.js +452 -0
  22. package/out/lsp/domain-lang-completion.js.map +1 -0
  23. package/out/lsp/domain-lang-formatter.d.ts +15 -0
  24. package/out/lsp/domain-lang-formatter.js +43 -0
  25. package/out/lsp/domain-lang-formatter.js.map +1 -0
  26. package/out/lsp/domain-lang-naming.d.ts +34 -0
  27. package/out/lsp/domain-lang-naming.js +49 -0
  28. package/out/lsp/domain-lang-naming.js.map +1 -0
  29. package/out/lsp/domain-lang-scope.d.ts +59 -0
  30. package/out/lsp/domain-lang-scope.js +102 -0
  31. package/out/lsp/domain-lang-scope.js.map +1 -0
  32. package/out/lsp/hover/ddd-pattern-explanations.d.ts +50 -0
  33. package/out/lsp/hover/ddd-pattern-explanations.js +196 -0
  34. package/out/lsp/hover/ddd-pattern-explanations.js.map +1 -0
  35. package/out/lsp/hover/domain-lang-hover.d.ts +19 -0
  36. package/out/lsp/hover/domain-lang-hover.js +306 -0
  37. package/out/lsp/hover/domain-lang-hover.js.map +1 -0
  38. package/out/lsp/hover/domain-lang-keywords.d.ts +13 -0
  39. package/out/lsp/hover/domain-lang-keywords.js +47 -0
  40. package/out/lsp/hover/domain-lang-keywords.js.map +1 -0
  41. package/out/main-browser.d.ts +1 -0
  42. package/out/main-browser.js +11 -0
  43. package/out/main-browser.js.map +1 -0
  44. package/out/main.d.ts +1 -0
  45. package/out/main.js +74 -0
  46. package/out/main.js.map +1 -0
  47. package/out/sdk/ast-augmentation.d.ts +136 -0
  48. package/out/sdk/ast-augmentation.js +62 -0
  49. package/out/sdk/ast-augmentation.js.map +1 -0
  50. package/out/sdk/index.d.ts +94 -0
  51. package/out/sdk/index.js +97 -0
  52. package/out/sdk/index.js.map +1 -0
  53. package/out/sdk/indexes.d.ts +16 -0
  54. package/out/sdk/indexes.js +97 -0
  55. package/out/sdk/indexes.js.map +1 -0
  56. package/out/sdk/loader-node.d.ts +47 -0
  57. package/out/sdk/loader-node.js +104 -0
  58. package/out/sdk/loader-node.js.map +1 -0
  59. package/out/sdk/loader.d.ts +49 -0
  60. package/out/sdk/loader.js +85 -0
  61. package/out/sdk/loader.js.map +1 -0
  62. package/out/sdk/patterns.d.ts +93 -0
  63. package/out/sdk/patterns.js +123 -0
  64. package/out/sdk/patterns.js.map +1 -0
  65. package/out/sdk/query.d.ts +90 -0
  66. package/out/sdk/query.js +679 -0
  67. package/out/sdk/query.js.map +1 -0
  68. package/out/sdk/resolution.d.ts +52 -0
  69. package/out/sdk/resolution.js +68 -0
  70. package/out/sdk/resolution.js.map +1 -0
  71. package/out/sdk/types.d.ts +301 -0
  72. package/out/sdk/types.js +8 -0
  73. package/out/sdk/types.js.map +1 -0
  74. package/out/services/dependency-analyzer.d.ts +94 -0
  75. package/out/services/dependency-analyzer.js +279 -0
  76. package/out/services/dependency-analyzer.js.map +1 -0
  77. package/out/services/dependency-resolver.d.ts +123 -0
  78. package/out/services/dependency-resolver.js +252 -0
  79. package/out/services/dependency-resolver.js.map +1 -0
  80. package/out/services/git-url-resolver.browser.d.ts +18 -0
  81. package/out/services/git-url-resolver.browser.js +15 -0
  82. package/out/services/git-url-resolver.browser.js.map +1 -0
  83. package/out/services/git-url-resolver.d.ts +192 -0
  84. package/out/services/git-url-resolver.js +382 -0
  85. package/out/services/git-url-resolver.js.map +1 -0
  86. package/out/services/governance-validator.d.ts +80 -0
  87. package/out/services/governance-validator.js +159 -0
  88. package/out/services/governance-validator.js.map +1 -0
  89. package/out/services/import-resolver.d.ts +18 -0
  90. package/out/services/import-resolver.js +22 -0
  91. package/out/services/import-resolver.js.map +1 -0
  92. package/out/services/performance-optimizer.d.ts +60 -0
  93. package/out/services/performance-optimizer.js +140 -0
  94. package/out/services/performance-optimizer.js.map +1 -0
  95. package/out/services/relationship-inference.d.ts +11 -0
  96. package/out/services/relationship-inference.js +98 -0
  97. package/out/services/relationship-inference.js.map +1 -0
  98. package/out/services/workspace-manager.d.ts +76 -0
  99. package/out/services/workspace-manager.js +323 -0
  100. package/out/services/workspace-manager.js.map +1 -0
  101. package/out/syntaxes/domain-lang.monarch.d.ts +76 -0
  102. package/out/syntaxes/domain-lang.monarch.js +29 -0
  103. package/out/syntaxes/domain-lang.monarch.js.map +1 -0
  104. package/out/utils/import-utils.d.ts +57 -0
  105. package/out/utils/import-utils.js +228 -0
  106. package/out/utils/import-utils.js.map +1 -0
  107. package/out/validation/bounded-context.d.ts +11 -0
  108. package/out/validation/bounded-context.js +79 -0
  109. package/out/validation/bounded-context.js.map +1 -0
  110. package/out/validation/classification.d.ts +3 -0
  111. package/out/validation/classification.js +3 -0
  112. package/out/validation/classification.js.map +1 -0
  113. package/out/validation/constants.d.ts +77 -0
  114. package/out/validation/constants.js +96 -0
  115. package/out/validation/constants.js.map +1 -0
  116. package/out/validation/domain-lang-validator.d.ts +2 -0
  117. package/out/validation/domain-lang-validator.js +27 -0
  118. package/out/validation/domain-lang-validator.js.map +1 -0
  119. package/out/validation/domain.d.ts +11 -0
  120. package/out/validation/domain.js +18 -0
  121. package/out/validation/domain.js.map +1 -0
  122. package/out/validation/import.d.ts +44 -0
  123. package/out/validation/import.js +135 -0
  124. package/out/validation/import.js.map +1 -0
  125. package/out/validation/maps.d.ts +21 -0
  126. package/out/validation/maps.js +56 -0
  127. package/out/validation/maps.js.map +1 -0
  128. package/out/validation/metadata.d.ts +7 -0
  129. package/out/validation/metadata.js +12 -0
  130. package/out/validation/metadata.js.map +1 -0
  131. package/out/validation/model.d.ts +12 -0
  132. package/out/validation/model.js +29 -0
  133. package/out/validation/model.js.map +1 -0
  134. package/out/validation/relationships.d.ts +12 -0
  135. package/out/validation/relationships.js +94 -0
  136. package/out/validation/relationships.js.map +1 -0
  137. package/out/validation/shared.d.ts +6 -0
  138. package/out/validation/shared.js +12 -0
  139. package/out/validation/shared.js.map +1 -0
  140. package/package.json +97 -0
  141. package/src/ast-augmentation.ts +5 -0
  142. package/src/domain-lang-module.ts +100 -0
  143. package/src/domain-lang.langium +356 -0
  144. package/src/generated/ast.ts +999 -0
  145. package/src/generated/grammar.ts +2504 -0
  146. package/src/generated/module.ts +25 -0
  147. package/src/index.ts +17 -0
  148. package/src/lsp/domain-lang-completion.ts +514 -0
  149. package/src/lsp/domain-lang-formatter.ts +51 -0
  150. package/src/lsp/domain-lang-naming.ts +56 -0
  151. package/src/lsp/domain-lang-scope.ts +137 -0
  152. package/src/lsp/hover/ddd-pattern-explanations.ts +237 -0
  153. package/src/lsp/hover/domain-lang-hover.ts +340 -0
  154. package/src/lsp/hover/domain-lang-keywords.ts +50 -0
  155. package/src/main-browser.ts +15 -0
  156. package/src/main.ts +85 -0
  157. package/src/sdk/README.md +297 -0
  158. package/src/sdk/ast-augmentation.ts +157 -0
  159. package/src/sdk/index.ts +128 -0
  160. package/src/sdk/indexes.ts +155 -0
  161. package/src/sdk/loader-node.ts +126 -0
  162. package/src/sdk/loader.ts +99 -0
  163. package/src/sdk/patterns.ts +147 -0
  164. package/src/sdk/query.ts +802 -0
  165. package/src/sdk/resolution.ts +78 -0
  166. package/src/sdk/types.ts +346 -0
  167. package/src/services/dependency-analyzer.ts +381 -0
  168. package/src/services/dependency-resolver.ts +334 -0
  169. package/src/services/git-url-resolver.browser.ts +31 -0
  170. package/src/services/git-url-resolver.ts +524 -0
  171. package/src/services/governance-validator.ts +219 -0
  172. package/src/services/import-resolver.ts +30 -0
  173. package/src/services/performance-optimizer.ts +170 -0
  174. package/src/services/relationship-inference.ts +121 -0
  175. package/src/services/workspace-manager.ts +416 -0
  176. package/src/syntaxes/domain-lang.monarch.ts +29 -0
  177. package/src/utils/import-utils.ts +274 -0
  178. package/src/validation/bounded-context.ts +99 -0
  179. package/src/validation/classification.ts +5 -0
  180. package/src/validation/constants.ts +124 -0
  181. package/src/validation/domain-lang-validator.ts +33 -0
  182. package/src/validation/domain.ts +24 -0
  183. package/src/validation/import.ts +171 -0
  184. package/src/validation/maps.ts +72 -0
  185. package/src/validation/metadata.ts +14 -0
  186. package/src/validation/model.ts +37 -0
  187. package/src/validation/relationships.ts +154 -0
  188. package/src/validation/shared.ts +14 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Governance and Compliance Validation Service
3
+ *
4
+ * Enforces organizational policies and best practices:
5
+ * - Allowed/blocked dependency sources
6
+ * - Version policy enforcement (no pre-release in production)
7
+ * - Team ownership validation
8
+ * - License compliance
9
+ * - Audit trail generation
10
+ *
11
+ * Governance policies are defined in the `governance` section of model.yaml:
12
+ *
13
+ * ```yaml
14
+ * governance:
15
+ * allowedSources:
16
+ * - github.com/acme
17
+ * requireStableVersions: true
18
+ * requireTeamOwnership: true
19
+ * ```
20
+ */
21
+ import type { LockFile } from './git-url-resolver.js';
22
+ export interface GovernancePolicy {
23
+ /** Allowed git domains (e.g., ['github.com/acme']) */
24
+ allowedSources?: string[];
25
+ /** Blocked packages or patterns */
26
+ blockedPackages?: string[];
27
+ /** Require stable versions only (no pre-release) */
28
+ requireStableVersions?: boolean;
29
+ /** Require team ownership metadata */
30
+ requireTeamOwnership?: boolean;
31
+ /** Allowed licenses */
32
+ allowedLicenses?: string[];
33
+ }
34
+ export interface GovernanceMetadata {
35
+ /** Team responsible for the model */
36
+ team?: string;
37
+ /** Contact email */
38
+ contact?: string;
39
+ /** Business domain */
40
+ domain?: string;
41
+ /** Compliance tags */
42
+ compliance?: string[];
43
+ }
44
+ export interface GovernanceViolation {
45
+ /** Type of violation */
46
+ type: 'blocked-source' | 'unstable-version' | 'missing-metadata' | 'license-violation';
47
+ /** Package that violates the policy */
48
+ packageKey: string;
49
+ /** Violation message */
50
+ message: string;
51
+ /** Severity: error or warning */
52
+ severity: 'error' | 'warning';
53
+ }
54
+ /**
55
+ * Validates dependencies against organizational governance policies.
56
+ */
57
+ export declare class GovernanceValidator {
58
+ private readonly policy;
59
+ constructor(policy: GovernancePolicy);
60
+ /**
61
+ * Validates a lock file against governance policies.
62
+ */
63
+ validate(lockFile: LockFile, workspaceRoot: string): Promise<GovernanceViolation[]>;
64
+ /**
65
+ * Loads governance metadata from model.yaml.
66
+ */
67
+ loadGovernanceMetadata(workspaceRoot: string): Promise<GovernanceMetadata>;
68
+ /**
69
+ * Generates an audit report for compliance tracking.
70
+ */
71
+ generateAuditReport(lockFile: LockFile, workspaceRoot: string): Promise<string>;
72
+ /**
73
+ * Checks if a version is a pre-release.
74
+ */
75
+ private isPreReleaseVersion;
76
+ }
77
+ /**
78
+ * Loads governance policy from model.yaml governance section.
79
+ */
80
+ export declare function loadGovernancePolicy(workspaceRoot: string): Promise<GovernancePolicy>;
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Governance and Compliance Validation Service
3
+ *
4
+ * Enforces organizational policies and best practices:
5
+ * - Allowed/blocked dependency sources
6
+ * - Version policy enforcement (no pre-release in production)
7
+ * - Team ownership validation
8
+ * - License compliance
9
+ * - Audit trail generation
10
+ *
11
+ * Governance policies are defined in the `governance` section of model.yaml:
12
+ *
13
+ * ```yaml
14
+ * governance:
15
+ * allowedSources:
16
+ * - github.com/acme
17
+ * requireStableVersions: true
18
+ * requireTeamOwnership: true
19
+ * ```
20
+ */
21
+ import path from 'node:path';
22
+ import fs from 'node:fs/promises';
23
+ import YAML from 'yaml';
24
+ /**
25
+ * Validates dependencies against organizational governance policies.
26
+ */
27
+ export class GovernanceValidator {
28
+ constructor(policy) {
29
+ this.policy = policy;
30
+ }
31
+ /**
32
+ * Validates a lock file against governance policies.
33
+ */
34
+ async validate(lockFile, workspaceRoot) {
35
+ const violations = [];
36
+ // Validate each dependency
37
+ for (const [packageKey, locked] of Object.entries(lockFile.dependencies)) {
38
+ // Check allowed sources
39
+ if (this.policy.allowedSources && this.policy.allowedSources.length > 0) {
40
+ const isAllowed = this.policy.allowedSources.some(pattern => locked.resolved.includes(pattern) || packageKey.startsWith(pattern));
41
+ if (!isAllowed) {
42
+ violations.push({
43
+ type: 'blocked-source',
44
+ packageKey,
45
+ message: `Package from unauthorized source: ${locked.resolved}`,
46
+ severity: 'error',
47
+ });
48
+ }
49
+ }
50
+ // Check blocked packages
51
+ if (this.policy.blockedPackages) {
52
+ const isBlocked = this.policy.blockedPackages.some(pattern => packageKey.includes(pattern));
53
+ if (isBlocked) {
54
+ violations.push({
55
+ type: 'blocked-source',
56
+ packageKey,
57
+ message: `Package is blocked by governance policy`,
58
+ severity: 'error',
59
+ });
60
+ }
61
+ }
62
+ // Check version stability
63
+ if (this.policy.requireStableVersions) {
64
+ if (this.isPreReleaseVersion(locked.version)) {
65
+ violations.push({
66
+ type: 'unstable-version',
67
+ packageKey,
68
+ message: `Pre-release version not allowed: ${locked.version}`,
69
+ severity: 'error',
70
+ });
71
+ }
72
+ }
73
+ }
74
+ // Validate workspace metadata
75
+ if (this.policy.requireTeamOwnership) {
76
+ const metadata = await this.loadGovernanceMetadata(workspaceRoot);
77
+ if (!metadata.team || !metadata.contact) {
78
+ violations.push({
79
+ type: 'missing-metadata',
80
+ packageKey: 'workspace',
81
+ message: 'Missing required team ownership metadata in model.yaml',
82
+ severity: 'warning',
83
+ });
84
+ }
85
+ }
86
+ return violations;
87
+ }
88
+ /**
89
+ * Loads governance metadata from model.yaml.
90
+ */
91
+ async loadGovernanceMetadata(workspaceRoot) {
92
+ const manifestPath = path.join(workspaceRoot, 'model.yaml');
93
+ try {
94
+ const content = await fs.readFile(manifestPath, 'utf-8');
95
+ const manifest = YAML.parse(content);
96
+ return manifest.metadata || {};
97
+ }
98
+ catch {
99
+ return {};
100
+ }
101
+ }
102
+ /**
103
+ * Generates an audit report for compliance tracking.
104
+ */
105
+ async generateAuditReport(lockFile, workspaceRoot) {
106
+ const metadata = await this.loadGovernanceMetadata(workspaceRoot);
107
+ const violations = await this.validate(lockFile, workspaceRoot);
108
+ const lines = [];
109
+ lines.push('=== Dependency Audit Report ===');
110
+ lines.push('');
111
+ lines.push(`Workspace: ${workspaceRoot}`);
112
+ lines.push(`Team: ${metadata.team || 'N/A'}`);
113
+ lines.push(`Contact: ${metadata.contact || 'N/A'}`);
114
+ lines.push(`Domain: ${metadata.domain || 'N/A'}`);
115
+ lines.push('');
116
+ lines.push('Dependencies:');
117
+ for (const [packageKey, locked] of Object.entries(lockFile.dependencies)) {
118
+ lines.push(` - ${packageKey}@${locked.version}`);
119
+ lines.push(` Source: ${locked.resolved}`);
120
+ lines.push(` Commit: ${locked.commit}`);
121
+ }
122
+ if (violations.length > 0) {
123
+ lines.push('');
124
+ lines.push('Violations:');
125
+ for (const violation of violations) {
126
+ lines.push(` [${violation.severity.toUpperCase()}] ${violation.packageKey}: ${violation.message}`);
127
+ }
128
+ }
129
+ else {
130
+ lines.push('');
131
+ lines.push('\u2713 No policy violations detected');
132
+ }
133
+ return lines.join('\n');
134
+ }
135
+ /**
136
+ * Checks if a version is a pre-release.
137
+ */
138
+ isPreReleaseVersion(version) {
139
+ const clean = version.replace(/^v/, '');
140
+ return /-(alpha|beta|rc|pre|dev|snapshot)/.test(clean);
141
+ }
142
+ }
143
+ /**
144
+ * Loads governance policy from model.yaml governance section.
145
+ */
146
+ export async function loadGovernancePolicy(workspaceRoot) {
147
+ const manifestPath = path.join(workspaceRoot, 'model.yaml');
148
+ try {
149
+ const content = await fs.readFile(manifestPath, 'utf-8');
150
+ const manifest = YAML.parse(content);
151
+ // Return governance section or empty policy if not defined
152
+ return manifest.governance || {};
153
+ }
154
+ catch {
155
+ // No manifest or parse error = permissive defaults
156
+ return {};
157
+ }
158
+ }
159
+ //# sourceMappingURL=governance-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-validator.js","sourceRoot":"","sources":["../../src/services/governance-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { URI } from 'langium';
2
+ import type { DomainLangServices } from '../domain-lang-module.js';
3
+ import type { LockFile } from './git-url-resolver.js';
4
+ /**
5
+ * ImportResolver resolves import statements using WorkspaceManager and GitUrlResolver.
6
+ */
7
+ export declare class ImportResolver {
8
+ private workspaceManager;
9
+ constructor(services: DomainLangServices);
10
+ /**
11
+ * Resolve an import URL to a file URI using the workspace's GitUrlResolver.
12
+ */
13
+ resolveImport(importUrl: string): Promise<URI>;
14
+ /**
15
+ * Get the current lock file (if loaded).
16
+ */
17
+ getLockFile(): Promise<LockFile | undefined>;
18
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ImportResolver resolves import statements using WorkspaceManager and GitUrlResolver.
3
+ */
4
+ export class ImportResolver {
5
+ constructor(services) {
6
+ this.workspaceManager = services.imports.WorkspaceManager;
7
+ }
8
+ /**
9
+ * Resolve an import URL to a file URI using the workspace's GitUrlResolver.
10
+ */
11
+ async resolveImport(importUrl) {
12
+ const gitResolver = await this.workspaceManager.getGitResolver();
13
+ return gitResolver.resolve(importUrl);
14
+ }
15
+ /**
16
+ * Get the current lock file (if loaded).
17
+ */
18
+ async getLockFile() {
19
+ return this.workspaceManager.getLockFile();
20
+ }
21
+ }
22
+ //# sourceMappingURL=import-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/services/import-resolver.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,OAAO,cAAc;IAGvB,YAAY,QAA4B;QACpC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;QACjE,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC;CACJ"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Performance Optimization Service
3
+ *
4
+ * Provides caching and optimization strategies for dependency resolution:
5
+ * - In-memory caching of frequently accessed lock files
6
+ * - Parallel dependency downloads
7
+ * - Cache warming strategies
8
+ * - Stale cache detection
9
+ */
10
+ import type { LockFile } from './git-url-resolver.js';
11
+ /**
12
+ * Performance optimizer with in-memory caching.
13
+ */
14
+ export declare class PerformanceOptimizer {
15
+ private lockFileCache;
16
+ private manifestCache;
17
+ private readonly cacheTTL;
18
+ constructor(options?: {
19
+ cacheTTL?: number;
20
+ });
21
+ /**
22
+ * Gets a lock file from cache or loads it from disk.
23
+ */
24
+ getCachedLockFile(workspaceRoot: string): Promise<LockFile | undefined>;
25
+ /**
26
+ * Gets a manifest file from cache or loads it from disk.
27
+ */
28
+ getCachedManifest(manifestPath: string): Promise<unknown | undefined>;
29
+ /**
30
+ * Invalidates cache for a specific workspace.
31
+ */
32
+ invalidateCache(workspaceRoot: string): void;
33
+ /**
34
+ * Clears all caches.
35
+ */
36
+ clearAllCaches(): void;
37
+ /**
38
+ * Gets cache statistics.
39
+ */
40
+ getCacheStats(): {
41
+ lockFiles: number;
42
+ manifests: number;
43
+ };
44
+ /**
45
+ * Detects if cached files are stale compared to disk.
46
+ */
47
+ detectStaleCaches(): Promise<string[]>;
48
+ /**
49
+ * Normalizes a file path for cache keys.
50
+ */
51
+ private normalizePath;
52
+ }
53
+ /**
54
+ * Gets the global performance optimizer instance.
55
+ */
56
+ export declare function getGlobalOptimizer(): PerformanceOptimizer;
57
+ /**
58
+ * Resets the global optimizer (useful for testing).
59
+ */
60
+ export declare function resetGlobalOptimizer(): void;
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Performance Optimization Service
3
+ *
4
+ * Provides caching and optimization strategies for dependency resolution:
5
+ * - In-memory caching of frequently accessed lock files
6
+ * - Parallel dependency downloads
7
+ * - Cache warming strategies
8
+ * - Stale cache detection
9
+ */
10
+ import path from 'node:path';
11
+ import fs from 'node:fs/promises';
12
+ /**
13
+ * Performance optimizer with in-memory caching.
14
+ */
15
+ export class PerformanceOptimizer {
16
+ constructor(options = {}) {
17
+ this.lockFileCache = new Map();
18
+ this.manifestCache = new Map();
19
+ // Default TTL: 5 minutes
20
+ this.cacheTTL = options.cacheTTL ?? 5 * 60 * 1000;
21
+ }
22
+ /**
23
+ * Gets a lock file from cache or loads it from disk.
24
+ */
25
+ async getCachedLockFile(workspaceRoot) {
26
+ const cacheKey = this.normalizePath(workspaceRoot);
27
+ const cached = this.lockFileCache.get(cacheKey);
28
+ // Check if cache is still valid
29
+ if (cached && Date.now() - cached.timestamp < this.cacheTTL) {
30
+ return cached.value;
31
+ }
32
+ // Load from disk
33
+ const lockPath = path.join(workspaceRoot, 'model.lock');
34
+ try {
35
+ const content = await fs.readFile(lockPath, 'utf-8');
36
+ const lockFile = JSON.parse(content);
37
+ // Cache it
38
+ this.lockFileCache.set(cacheKey, {
39
+ value: lockFile,
40
+ timestamp: Date.now(),
41
+ });
42
+ return lockFile;
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ /**
49
+ * Gets a manifest file from cache or loads it from disk.
50
+ */
51
+ async getCachedManifest(manifestPath) {
52
+ const cacheKey = this.normalizePath(manifestPath);
53
+ const cached = this.manifestCache.get(cacheKey);
54
+ if (cached && Date.now() - cached.timestamp < this.cacheTTL) {
55
+ return cached.value;
56
+ }
57
+ try {
58
+ const content = await fs.readFile(manifestPath, 'utf-8');
59
+ const manifest = JSON.parse(content);
60
+ this.manifestCache.set(cacheKey, {
61
+ value: manifest,
62
+ timestamp: Date.now(),
63
+ });
64
+ return manifest;
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ /**
71
+ * Invalidates cache for a specific workspace.
72
+ */
73
+ invalidateCache(workspaceRoot) {
74
+ const cacheKey = this.normalizePath(workspaceRoot);
75
+ this.lockFileCache.delete(cacheKey);
76
+ }
77
+ /**
78
+ * Clears all caches.
79
+ */
80
+ clearAllCaches() {
81
+ this.lockFileCache.clear();
82
+ this.manifestCache.clear();
83
+ }
84
+ /**
85
+ * Gets cache statistics.
86
+ */
87
+ getCacheStats() {
88
+ return {
89
+ lockFiles: this.lockFileCache.size,
90
+ manifests: this.manifestCache.size,
91
+ };
92
+ }
93
+ /**
94
+ * Detects if cached files are stale compared to disk.
95
+ */
96
+ async detectStaleCaches() {
97
+ const stale = [];
98
+ for (const [workspaceRoot] of this.lockFileCache) {
99
+ const lockPath = path.join(workspaceRoot, 'model.lock');
100
+ try {
101
+ const stat = await fs.stat(lockPath);
102
+ const cached = this.lockFileCache.get(workspaceRoot);
103
+ if (cached && stat.mtimeMs > cached.timestamp) {
104
+ stale.push(workspaceRoot);
105
+ }
106
+ }
107
+ catch {
108
+ // File doesn't exist anymore
109
+ stale.push(workspaceRoot);
110
+ }
111
+ }
112
+ return stale;
113
+ }
114
+ /**
115
+ * Normalizes a file path for cache keys.
116
+ */
117
+ normalizePath(filePath) {
118
+ return path.resolve(filePath);
119
+ }
120
+ }
121
+ /**
122
+ * Global singleton performance optimizer.
123
+ */
124
+ let globalOptimizer;
125
+ /**
126
+ * Gets the global performance optimizer instance.
127
+ */
128
+ export function getGlobalOptimizer() {
129
+ if (!globalOptimizer) {
130
+ globalOptimizer = new PerformanceOptimizer();
131
+ }
132
+ return globalOptimizer;
133
+ }
134
+ /**
135
+ * Resets the global optimizer (useful for testing).
136
+ */
137
+ export function resetGlobalOptimizer() {
138
+ globalOptimizer = undefined;
139
+ }
140
+ //# sourceMappingURL=performance-optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-optimizer.js","sourceRoot":"","sources":["../../src/services/performance-optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Model } from '../generated/ast.js';
2
+ /**
3
+ * Enriches relationships in the model by inferring relationship types
4
+ * from roles and arrow directions.
5
+ *
6
+ * This service walks the entire model structure and applies inference
7
+ * rules to relationships that don't have an explicit type.
8
+ *
9
+ * @param model - The root model to process
10
+ */
11
+ export declare function setInferredRelationshipTypes(model: Model): void;
@@ -0,0 +1,98 @@
1
+ import { isBoundedContext, isContextMap, isNamespaceDeclaration } from '../generated/ast.js';
2
+ /**
3
+ * Enriches relationships in the model by inferring relationship types
4
+ * from roles and arrow directions.
5
+ *
6
+ * This service walks the entire model structure and applies inference
7
+ * rules to relationships that don't have an explicit type.
8
+ *
9
+ * @param model - The root model to process
10
+ */
11
+ export function setInferredRelationshipTypes(model) {
12
+ walkStructureElements(model.children);
13
+ }
14
+ /**
15
+ * Recursively walks structure elements to find and enrich relationships.
16
+ *
17
+ * @param elements - Array of structure elements to process
18
+ * @param containerBc - Optional container bounded context (for nested contexts)
19
+ */
20
+ function walkStructureElements(elements = [], containerBc) {
21
+ for (const element of elements) {
22
+ if (isNamespaceDeclaration(element)) {
23
+ walkStructureElements(element.children, containerBc);
24
+ }
25
+ else if (isBoundedContext(element)) {
26
+ processContextRelationships(element);
27
+ }
28
+ else if (isContextMap(element)) {
29
+ processMapRelationships(element);
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Processes relationships within a bounded context.
35
+ *
36
+ * @param context - The bounded context to process
37
+ */
38
+ function processContextRelationships(context) {
39
+ for (const rel of context.relationships) {
40
+ enrichRelationship(rel);
41
+ }
42
+ }
43
+ /**
44
+ * Processes relationships within a context map.
45
+ *
46
+ * @param map - The context map to process
47
+ */
48
+ function processMapRelationships(map) {
49
+ if (map.relationships) {
50
+ for (const rel of map.relationships) {
51
+ enrichRelationship(rel);
52
+ }
53
+ }
54
+ }
55
+ /**
56
+ * Enriches a single relationship by inferring its type if not explicitly set.
57
+ *
58
+ * @param rel - The relationship to enrich
59
+ */
60
+ function enrichRelationship(rel) {
61
+ if (!rel.type) {
62
+ rel.inferredType = inferRelationshipType(rel);
63
+ }
64
+ }
65
+ /**
66
+ * Infers relationship type from arrow direction and roles.
67
+ *
68
+ * Inference rules:
69
+ * - `><` → SeparateWays
70
+ * - `<->` with P roles → Partnership
71
+ * - `<->` with SK roles → SharedKernel
72
+ * - `->` or `<-` → UpstreamDownstream
73
+ *
74
+ * @param relationship - The relationship to analyze
75
+ * @returns The inferred type or undefined if no rule matches
76
+ */
77
+ function inferRelationshipType(relationship) {
78
+ const leftPatterns = (relationship.leftPatterns ?? []).map((r) => r.toUpperCase());
79
+ const rightPatterns = (relationship.rightPatterns ?? []).map((r) => r.toUpperCase());
80
+ if (relationship.arrow === '><') {
81
+ return 'SeparateWays';
82
+ }
83
+ if (relationship.arrow === '<->') {
84
+ const noPatterns = leftPatterns.length === 0 && rightPatterns.length === 0;
85
+ const bothPartners = leftPatterns.includes('P') && rightPatterns.includes('P');
86
+ if (noPatterns || bothPartners) {
87
+ return 'Partnership';
88
+ }
89
+ if (leftPatterns.includes('SK') && rightPatterns.includes('SK')) {
90
+ return 'SharedKernel';
91
+ }
92
+ }
93
+ if (relationship.arrow === '->' || relationship.arrow === '<-') {
94
+ return 'UpstreamDownstream';
95
+ }
96
+ return undefined;
97
+ }
98
+ //# sourceMappingURL=relationship-inference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-inference.js","sourceRoot":"","sources":["../../src/services/relationship-inference.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACzB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAY;IACrD,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAC1B,WAA+B,EAAE,EACjC,WAA4B;IAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QACjC,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,2BAA2B,CAAC,OAAuB;IACxD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACtC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,GAAe;IAC5C,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YAClC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,GAAiB;IACzC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACZ,GAAG,CAAC,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,qBAAqB,CAAC,YAA0B;IACrD,MAAM,YAAY,GAAG,CAAC,YAAY,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAE7F,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE/E,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;YAC7B,OAAO,aAAa,CAAC;QACzB,CAAC;QAED,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,OAAO,cAAc,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC7D,OAAO,oBAAoB,CAAC;IAChC,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}