@nielspeter/eess-mermaid 0.1.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/bridge/from-diagram.d.ts +58 -0
  4. package/dist/bridge/from-diagram.d.ts.map +1 -0
  5. package/dist/bridge/from-diagram.js +112 -0
  6. package/dist/bridge/from-diagram.js.map +1 -0
  7. package/dist/builders/class-rule-builder.d.ts +45 -0
  8. package/dist/builders/class-rule-builder.d.ts.map +1 -0
  9. package/dist/builders/class-rule-builder.js +89 -0
  10. package/dist/builders/class-rule-builder.js.map +1 -0
  11. package/dist/cli/bin.d.ts +3 -0
  12. package/dist/cli/bin.d.ts.map +1 -0
  13. package/dist/cli/bin.js +4 -0
  14. package/dist/cli/bin.js.map +1 -0
  15. package/dist/cli/commands/check.d.ts +8 -0
  16. package/dist/cli/commands/check.d.ts.map +1 -0
  17. package/dist/cli/commands/check.js +44 -0
  18. package/dist/cli/commands/check.js.map +1 -0
  19. package/dist/cli/commands/explain.d.ts +6 -0
  20. package/dist/cli/commands/explain.d.ts.map +1 -0
  21. package/dist/cli/commands/explain.js +29 -0
  22. package/dist/cli/commands/explain.js.map +1 -0
  23. package/dist/cli/config.d.ts +8 -0
  24. package/dist/cli/config.d.ts.map +1 -0
  25. package/dist/cli/config.js +4 -0
  26. package/dist/cli/config.js.map +1 -0
  27. package/dist/cli/index.d.ts +2 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +130 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/cli/load-rules.d.ts +10 -0
  32. package/dist/cli/load-rules.d.ts.map +1 -0
  33. package/dist/cli/load-rules.js +62 -0
  34. package/dist/cli/load-rules.js.map +1 -0
  35. package/dist/cli/resolve-config.d.ts +3 -0
  36. package/dist/cli/resolve-config.d.ts.map +1 -0
  37. package/dist/cli/resolve-config.js +50 -0
  38. package/dist/cli/resolve-config.js.map +1 -0
  39. package/dist/cli/watch.d.ts +8 -0
  40. package/dist/cli/watch.d.ts.map +1 -0
  41. package/dist/cli/watch.js +114 -0
  42. package/dist/cli/watch.js.map +1 -0
  43. package/dist/conditions/class.d.ts +11 -0
  44. package/dist/conditions/class.d.ts.map +1 -0
  45. package/dist/conditions/class.js +163 -0
  46. package/dist/conditions/class.js.map +1 -0
  47. package/dist/core/diagram.d.ts +3 -0
  48. package/dist/core/diagram.d.ts.map +1 -0
  49. package/dist/core/diagram.js +18 -0
  50. package/dist/core/diagram.js.map +1 -0
  51. package/dist/core/index.d.ts +5 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +3 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/project.d.ts +7 -0
  56. package/dist/core/project.d.ts.map +1 -0
  57. package/dist/core/project.js +2 -0
  58. package/dist/core/project.js.map +1 -0
  59. package/dist/core/violation.d.ts +15 -0
  60. package/dist/core/violation.d.ts.map +1 -0
  61. package/dist/core/violation.js +16 -0
  62. package/dist/core/violation.js.map +1 -0
  63. package/dist/index.d.ts +33 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +31 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/models/arch-class.d.ts +20 -0
  68. package/dist/models/arch-class.d.ts.map +1 -0
  69. package/dist/models/arch-class.js +33 -0
  70. package/dist/models/arch-class.js.map +1 -0
  71. package/dist/models/er-entity.d.ts +32 -0
  72. package/dist/models/er-entity.d.ts.map +1 -0
  73. package/dist/models/er-entity.js +37 -0
  74. package/dist/models/er-entity.js.map +1 -0
  75. package/dist/parser/generated/ast.d.ts +539 -0
  76. package/dist/parser/generated/ast.d.ts.map +1 -0
  77. package/dist/parser/generated/ast.js +443 -0
  78. package/dist/parser/generated/ast.js.map +1 -0
  79. package/dist/parser/generated/grammar.d.ts +8 -0
  80. package/dist/parser/generated/grammar.d.ts.map +1 -0
  81. package/dist/parser/generated/grammar.js +10 -0
  82. package/dist/parser/generated/grammar.js.map +1 -0
  83. package/dist/parser/generated/module.d.ts +21 -0
  84. package/dist/parser/generated/module.d.ts.map +1 -0
  85. package/dist/parser/generated/module.js +32 -0
  86. package/dist/parser/generated/module.js.map +1 -0
  87. package/dist/parser/parse-class-diagram.d.ts +7 -0
  88. package/dist/parser/parse-class-diagram.d.ts.map +1 -0
  89. package/dist/parser/parse-class-diagram.js +33 -0
  90. package/dist/parser/parse-class-diagram.js.map +1 -0
  91. package/dist/parser/parse-directives.d.ts +38 -0
  92. package/dist/parser/parse-directives.d.ts.map +1 -0
  93. package/dist/parser/parse-directives.js +96 -0
  94. package/dist/parser/parse-directives.js.map +1 -0
  95. package/dist/parser/parse-er-diagram.d.ts +4 -0
  96. package/dist/parser/parse-er-diagram.d.ts.map +1 -0
  97. package/dist/parser/parse-er-diagram.js +27 -0
  98. package/dist/parser/parse-er-diagram.js.map +1 -0
  99. package/dist/parser/validate-diagram.d.ts +11 -0
  100. package/dist/parser/validate-diagram.d.ts.map +1 -0
  101. package/dist/parser/validate-diagram.js +67 -0
  102. package/dist/parser/validate-diagram.js.map +1 -0
  103. package/dist/predicates/class.d.ts +13 -0
  104. package/dist/predicates/class.d.ts.map +1 -0
  105. package/dist/predicates/class.js +73 -0
  106. package/dist/predicates/class.js.map +1 -0
  107. package/package.json +50 -0
@@ -0,0 +1,130 @@
1
+ import { parseArgs } from 'node:util';
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import path from 'node:path';
5
+ import { resolveConfig } from './resolve-config.js';
6
+ import { runCheck } from './commands/check.js';
7
+ import { runExplain } from './commands/explain.js';
8
+ import { watchAndRerun } from './watch.js';
9
+ function getVersion() {
10
+ const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../package.json');
11
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
12
+ if (pkg !== null &&
13
+ typeof pkg === 'object' &&
14
+ 'version' in pkg &&
15
+ typeof pkg.version === 'string') {
16
+ return pkg.version;
17
+ }
18
+ return '0.0.0';
19
+ }
20
+ const HELP_TEXT = `
21
+ eess-mermaid — Architecture testing for Mermaid diagrams (the Mermaid dialect of eess)
22
+
23
+ Usage:
24
+ eess-mermaid check [files...] Run architecture rules
25
+ eess-mermaid explain [files...] Dump all active rules as JSON
26
+
27
+ Options:
28
+ --format <format> Output format: terminal, json, github, auto (default: auto)
29
+ --markdown Output explain results as markdown table
30
+ -w, --watch Watch for changes and re-run (check command only)
31
+ --config <path> Path to config file
32
+ -v, --version Show version number
33
+ -h, --help Show this help message
34
+ `;
35
+ function parseCliArgs(args) {
36
+ return parseArgs({
37
+ args,
38
+ options: {
39
+ markdown: { type: 'boolean', default: false },
40
+ format: { type: 'string' },
41
+ config: { type: 'string' },
42
+ help: { type: 'boolean', short: 'h', default: false },
43
+ version: { type: 'boolean', short: 'v', default: false },
44
+ watch: { type: 'boolean', short: 'w', default: false },
45
+ },
46
+ allowPositionals: true,
47
+ strict: true,
48
+ });
49
+ }
50
+ function requireRuleFiles(ruleFiles) {
51
+ if (ruleFiles.length > 0)
52
+ return true;
53
+ console.error('Error: No rule files specified. Pass rule files as arguments or set them in eess-mermaid.config.ts.');
54
+ process.exitCode = 1;
55
+ return false;
56
+ }
57
+ async function handleCheck(ruleFiles, values, config, format) {
58
+ if (!requireRuleFiles(ruleFiles))
59
+ return;
60
+ if (values.watch === true) {
61
+ const watchDirs = config.watchDirs ?? ['src'];
62
+ const checkArgs = { ruleFiles, format, fresh: true };
63
+ process.stdout.write('eess-mermaid — watching for changes\n\n');
64
+ await runCheck(checkArgs).catch(() => undefined);
65
+ process.stdout.write('\nWatching for changes...\n');
66
+ const watchOptions = {
67
+ watchDirs,
68
+ watchFiles: ruleFiles,
69
+ onChangeDetected: async () => {
70
+ await runCheck(checkArgs);
71
+ },
72
+ };
73
+ watchAndRerun(watchOptions);
74
+ }
75
+ else {
76
+ const failures = await runCheck({ ruleFiles, format });
77
+ if (failures > 0) {
78
+ process.exitCode = 1;
79
+ }
80
+ }
81
+ }
82
+ async function handleExplain(ruleFiles, markdown) {
83
+ if (!requireRuleFiles(ruleFiles))
84
+ return;
85
+ const explainArgs = { ruleFiles, markdown };
86
+ await runExplain(explainArgs);
87
+ }
88
+ export async function run(args) {
89
+ const parsed = parseCliArgs(args);
90
+ const { values, positionals } = parsed;
91
+ if (values.version === true) {
92
+ process.stdout.write(getVersion() + '\n');
93
+ return;
94
+ }
95
+ if (values.help === true) {
96
+ process.stdout.write(HELP_TEXT + '\n');
97
+ return;
98
+ }
99
+ const command = positionals[0];
100
+ if (command === undefined) {
101
+ console.error('Error: No command specified. Use --help for usage.');
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ if (values.watch === true && command !== 'check') {
106
+ console.error('Error: --watch is only supported with the check command.');
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ const config = await resolveConfig(values.config);
111
+ const ruleFiles = positionals.slice(1).length > 0 ? positionals.slice(1) : (config.rules ?? []);
112
+ const rawFormat = values.format ?? config.format ?? 'auto';
113
+ const format = rawFormat === 'terminal' ||
114
+ rawFormat === 'json' ||
115
+ rawFormat === 'github' ||
116
+ rawFormat === 'auto'
117
+ ? rawFormat
118
+ : 'auto';
119
+ if (command === 'check') {
120
+ await handleCheck(ruleFiles, values, config, format);
121
+ }
122
+ else if (command === 'explain') {
123
+ await handleExplain(ruleFiles, values.markdown);
124
+ }
125
+ else {
126
+ console.error(`Error: Unknown command "${command}". Use --help for usage.`);
127
+ process.exitCode = 1;
128
+ }
129
+ }
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CheckOptions } from '@nielspeter/eess';
2
+ export interface RuleBuilderLike {
3
+ check: (opts?: CheckOptions) => void;
4
+ describeRule?: () => unknown;
5
+ }
6
+ export interface LoadOptions {
7
+ fresh?: boolean;
8
+ }
9
+ export declare function loadRuleFiles(files: string[], options?: LoadOptions): Promise<RuleBuilderLike[]>;
10
+ //# sourceMappingURL=load-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-rules.d.ts","sourceRoot":"","sources":["../../src/cli/load-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAUD,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAkB5B"}
@@ -0,0 +1,62 @@
1
+ import path from 'node:path';
2
+ import { createJiti } from 'jiti';
3
+ let cachedJiti;
4
+ function getJiti(fresh) {
5
+ if (fresh)
6
+ return createJiti(import.meta.url, { fsCache: false, moduleCache: false });
7
+ if (!cachedJiti)
8
+ cachedJiti = createJiti(import.meta.url);
9
+ return cachedJiti;
10
+ }
11
+ export async function loadRuleFiles(files, options) {
12
+ const builders = [];
13
+ const jiti = getJiti(options?.fresh === true);
14
+ for (const file of files) {
15
+ const resolved = path.resolve(file);
16
+ const mod = await jiti.import(resolved);
17
+ const exported = extractDefault(mod);
18
+ const items = resolveExported(exported);
19
+ for (const item of items) {
20
+ if (isRuleBuilderLike(item)) {
21
+ builders.push(item);
22
+ }
23
+ }
24
+ }
25
+ return builders;
26
+ }
27
+ /**
28
+ * Resolve the exported value to an array of unknowns.
29
+ * Supports: direct arrays, or factory functions returning arrays.
30
+ */
31
+ function resolveExported(exported) {
32
+ if (Array.isArray(exported)) {
33
+ return exported;
34
+ }
35
+ if (typeof exported === 'function') {
36
+ // Runtime validated: exported is a function. Invoke via Function.prototype.call
37
+ // so the unknown-signature factory yields `any`, narrowed here to `unknown`.
38
+ const result = exported.call(undefined);
39
+ if (Array.isArray(result)) {
40
+ return result;
41
+ }
42
+ }
43
+ return [];
44
+ }
45
+ function extractDefault(mod) {
46
+ if (mod === null || mod === undefined || typeof mod !== 'object') {
47
+ return undefined;
48
+ }
49
+ // Dynamic import returns a module namespace object — 'in' narrows safely
50
+ if ('default' in mod) {
51
+ return mod.default;
52
+ }
53
+ return undefined;
54
+ }
55
+ function isRuleBuilderLike(value) {
56
+ if (value === null || value === undefined || typeof value !== 'object') {
57
+ return false;
58
+ }
59
+ // Structural type check: must have a 'check' method
60
+ return 'check' in value && typeof value.check === 'function';
61
+ }
62
+ //# sourceMappingURL=load-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-rules.js","sourceRoot":"","sources":["../../src/cli/load-rules.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAYjC,IAAI,UAAqD,CAAA;AAEzD,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,KAAK;QAAE,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;IACrF,IAAI,CAAC,UAAU;QAAE,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACzD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAe,EACf,OAAqB;IAErB,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC,CAAA;IAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,GAAG,GAAY,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAEhD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,QAAiB;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,gFAAgF;QAChF,6EAA6E;QAC7E,MAAM,MAAM,GAAY,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,yEAAyE;IACzE,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,OAAO,CAAA;IACpB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO,KAAK,CAAA;IACd,CAAC;IACD,oDAAoD;IACpD,OAAO,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliConfig } from './config.js';
2
+ export declare function resolveConfig(explicitPath?: string): Promise<CliConfig>;
3
+ //# sourceMappingURL=resolve-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config.d.ts","sourceRoot":"","sources":["../../src/cli/resolve-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAS5C,wBAAsB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAM7E"}
@@ -0,0 +1,50 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ const CONFIG_FILENAMES = [
4
+ 'eess-mermaid.config.ts',
5
+ 'eess-mermaid.config.js',
6
+ 'mermaidunit.config.ts',
7
+ 'mermaidunit.config.js',
8
+ ];
9
+ export async function resolveConfig(explicitPath) {
10
+ const configPath = explicitPath ?? findConfigFile();
11
+ if (configPath === undefined)
12
+ return {};
13
+ const mod = await import(path.resolve(configPath));
14
+ return extractDefault(mod);
15
+ }
16
+ function findConfigFile() {
17
+ const cwd = process.cwd();
18
+ for (const name of CONFIG_FILENAMES) {
19
+ const candidate = path.join(cwd, name);
20
+ if (fs.existsSync(candidate))
21
+ return candidate;
22
+ }
23
+ return undefined;
24
+ }
25
+ function isRecord(value) {
26
+ return value !== null && typeof value === 'object';
27
+ }
28
+ function extractDefault(mod) {
29
+ if (!isRecord(mod))
30
+ return {};
31
+ if (!('default' in mod))
32
+ return {};
33
+ const defaultExport = mod.default;
34
+ if (!isRecord(defaultExport))
35
+ return {};
36
+ const obj = defaultExport;
37
+ const config = {};
38
+ const format = obj['format'];
39
+ if (format === 'terminal' || format === 'json' || format === 'github' || format === 'auto') {
40
+ config.format = format;
41
+ }
42
+ if (Array.isArray(obj['rules'])) {
43
+ config.rules = obj['rules'].filter((r) => typeof r === 'string');
44
+ }
45
+ if (Array.isArray(obj['watchDirs'])) {
46
+ config.watchDirs = obj['watchDirs'].filter((r) => typeof r === 'string');
47
+ }
48
+ return config;
49
+ }
50
+ //# sourceMappingURL=resolve-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../../src/cli/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AAGxB,MAAM,gBAAgB,GAAG;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,uBAAuB;CACxB,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAAqB;IACvD,MAAM,UAAU,GAAG,YAAY,IAAI,cAAc,EAAE,CAAA;IACnD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,GAAG,GAAY,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IAC3D,OAAO,cAAc,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAChD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAA;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAA;IACjC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,aAAa,CAAA;IACzB,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3F,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;IAC/E,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;IACvF,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface WatchOptions {
2
+ watchDirs: string[];
3
+ watchFiles: string[];
4
+ onChangeDetected: () => Promise<void>;
5
+ debounceMs?: number;
6
+ }
7
+ export declare function watchAndRerun(options: WatchOptions): void;
8
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAkED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAoDzD"}
@@ -0,0 +1,114 @@
1
+ import { watch } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { ArchRuleError } from '@nielspeter/eess';
4
+ const WATCHED_FILE_RE = /\.(mmd|[cm]?tsx?|[cm]?jsx?)$/;
5
+ class RunScheduler {
6
+ debounceTimer;
7
+ running = false;
8
+ _pendingRerun = false;
9
+ debounceMs;
10
+ onRun;
11
+ #runCount = 0;
12
+ constructor(onRun, debounceMs = 250) {
13
+ this.onRun = onRun;
14
+ this.debounceMs = debounceMs;
15
+ }
16
+ get runCount() {
17
+ return this.#runCount;
18
+ }
19
+ get pendingRerun() {
20
+ return this._pendingRerun;
21
+ }
22
+ get isRunning() {
23
+ return this.running;
24
+ }
25
+ /** Debounce a change on `trigger`, coalescing bursts into a single re-run. */
26
+ schedule(trigger) {
27
+ if (this.debounceTimer)
28
+ clearTimeout(this.debounceTimer);
29
+ this.debounceTimer = setTimeout(() => {
30
+ if (this.running) {
31
+ this._pendingRerun = true;
32
+ return;
33
+ }
34
+ this.executeRun(trigger);
35
+ }, this.debounceMs);
36
+ }
37
+ executeRun(trigger) {
38
+ this.running = true;
39
+ this._pendingRerun = false;
40
+ this.#runCount++;
41
+ process.stdout.write('\x1B[2J\x1B[H');
42
+ process.stdout.write(`Change detected: ${trigger}\n\n`);
43
+ this.onRun(trigger)
44
+ .catch((err) => {
45
+ if (!(err instanceof ArchRuleError)) {
46
+ if (err instanceof Error) {
47
+ console.error(err.message);
48
+ }
49
+ }
50
+ })
51
+ .finally(() => {
52
+ this.running = false;
53
+ if (this._pendingRerun) {
54
+ this.executeRun('(queued change)');
55
+ }
56
+ else {
57
+ process.stdout.write('\nWatching for changes...\n');
58
+ }
59
+ });
60
+ }
61
+ }
62
+ export function watchAndRerun(options) {
63
+ const { watchDirs, watchFiles, onChangeDetected, debounceMs = 250 } = options;
64
+ const scheduler = new RunScheduler(onChangeDetected, debounceMs);
65
+ const watchers = [];
66
+ for (const dir of watchDirs) {
67
+ const resolved = path.resolve(dir);
68
+ const watcher = watch(resolved, { recursive: true });
69
+ watchers.push(watcher);
70
+ void (async () => {
71
+ try {
72
+ for await (const event of watcher) {
73
+ if (event.filename && WATCHED_FILE_RE.test(event.filename)) {
74
+ scheduler.schedule(event.filename);
75
+ }
76
+ }
77
+ }
78
+ catch (err) {
79
+ if (err instanceof Error && err.message !== 'The operation was aborted') {
80
+ console.error(`Watcher error on ${dir}: ${err.message}`);
81
+ }
82
+ }
83
+ })();
84
+ }
85
+ for (const file of watchFiles) {
86
+ const resolved = path.resolve(file);
87
+ const watcher = watch(resolved);
88
+ watchers.push(watcher);
89
+ void (async () => {
90
+ try {
91
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- must consume async iterator
92
+ for await (const _event of watcher) {
93
+ scheduler.schedule(path.basename(file));
94
+ }
95
+ }
96
+ catch (err) {
97
+ if (err instanceof Error && err.message !== 'The operation was aborted') {
98
+ console.error(`Watcher error on ${file}: ${err.message}`);
99
+ }
100
+ }
101
+ })();
102
+ }
103
+ process.on('SIGINT', () => {
104
+ for (const w of watchers) {
105
+ if ('return' in w && typeof w.return === 'function') {
106
+ // AsyncIterable's optional return() is untyped; invoke via Function.prototype.call
107
+ // (yields `any`) and discard the settle-promise — best-effort watcher shutdown.
108
+ void w.return.call(w);
109
+ }
110
+ }
111
+ process.exit(0);
112
+ });
113
+ }
114
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Condition } from '@nielspeter/eess';
2
+ import type { ArchClass } from '../models/arch-class.js';
3
+ export declare function notExtendStereotype(name: string): Condition<ArchClass>;
4
+ export declare function extendClass(superName: string): Condition<ArchClass>;
5
+ export declare function notExist(): Condition<ArchClass>;
6
+ export declare function haveStereotype(name: string): Condition<ArchClass>;
7
+ export declare function notHaveStereotype(name: string): Condition<ArchClass>;
8
+ export declare function dependOn(targetName: string): Condition<ArchClass>;
9
+ export declare function notDependOn(targetName: string): Condition<ArchClass>;
10
+ export declare function notDependOnStereotype(stereotype: string): Condition<ArchClass>;
11
+ //# sourceMappingURL=class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAGnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAkCxD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAsCtE;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAqBnE;AAED,wBAAgB,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC,CAO/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAWjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CASpE;AAQD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CASjE;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CASpE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAiC9E"}
@@ -0,0 +1,163 @@
1
+ import { createViolation } from '../core/violation.js';
2
+ import { collectRelationships, getClassLine } from '../models/arch-class.js';
3
+ const INHERITANCE_ARROWS = new Set(['<|--', '<|..', '--|>', '..|>']);
4
+ function classViolation(c, message, ctx) {
5
+ return createViolation({
6
+ element: c.name,
7
+ file: c.project.filePath ?? '<inline>',
8
+ line: getClassLine(c) + 1,
9
+ sourceText: c.project.source,
10
+ }, message, ctx);
11
+ }
12
+ function isExtensionEdge(arrow) {
13
+ return INHERITANCE_ARROWS.has(arrow);
14
+ }
15
+ function inheritsBetween(arrow, source, target) {
16
+ if (!isExtensionEdge(arrow))
17
+ return undefined;
18
+ if (arrow === '<|--' || arrow === '<|..') {
19
+ return { sub: target, sup: source };
20
+ }
21
+ return { sub: source, sup: target };
22
+ }
23
+ export function notExtendStereotype(name) {
24
+ return {
25
+ description: `not extend a class with stereotype <<${name}>>`,
26
+ evaluate(elements, context) {
27
+ const first = elements[0];
28
+ if (first === undefined)
29
+ return [];
30
+ const project = first.project;
31
+ const allClasses = new Map(project.ast.classes.map((c) => {
32
+ const stereotypes = c.stereotypes.map((s) => s.name);
33
+ for (const a of project.ast.stereotypeAssignments) {
34
+ if (a.classRef.$refText === c.name)
35
+ stereotypes.push(a.stereotype.name);
36
+ }
37
+ return [c.name, stereotypes];
38
+ }));
39
+ const violations = [];
40
+ for (const c of elements) {
41
+ for (const r of collectRelationships(project)) {
42
+ const inh = inheritsBetween(r.arrow, r.source, r.target);
43
+ if (!inh)
44
+ continue;
45
+ if (inh.sub !== c.name)
46
+ continue;
47
+ const supStereotypes = allClasses.get(inh.sup) ?? [];
48
+ if (supStereotypes.includes(name)) {
49
+ violations.push(classViolation(c, `${c.name} extends ${inh.sup} which has stereotype <<${name}>>`, context));
50
+ }
51
+ }
52
+ }
53
+ return violations;
54
+ },
55
+ };
56
+ }
57
+ export function extendClass(superName) {
58
+ return {
59
+ description: `extend ${superName}`,
60
+ evaluate(elements, context) {
61
+ const first = elements[0];
62
+ if (first === undefined)
63
+ return [];
64
+ const project = first.project;
65
+ const violations = [];
66
+ for (const c of elements) {
67
+ const extends_ = collectRelationships(project)
68
+ .map((r) => inheritsBetween(r.arrow, r.source, r.target))
69
+ .filter((inh) => inh !== undefined)
70
+ .filter((inh) => inh.sub === c.name)
71
+ .map((inh) => inh.sup);
72
+ if (!extends_.includes(superName)) {
73
+ violations.push(classViolation(c, `${c.name} does not extend ${superName}`, context));
74
+ }
75
+ }
76
+ return violations;
77
+ },
78
+ };
79
+ }
80
+ export function notExist() {
81
+ return {
82
+ description: 'not exist',
83
+ evaluate(elements, context) {
84
+ return elements.map((c) => classViolation(c, `class ${c.name} should not exist`, context));
85
+ },
86
+ };
87
+ }
88
+ export function haveStereotype(name) {
89
+ return {
90
+ description: `have stereotype <<${name}>>`,
91
+ evaluate(elements, context) {
92
+ return elements
93
+ .filter((c) => !c.stereotypes.includes(name))
94
+ .map((c) => classViolation(c, `${c.name} is missing required stereotype <<${name}>>`, context));
95
+ },
96
+ };
97
+ }
98
+ export function notHaveStereotype(name) {
99
+ return {
100
+ description: `not have stereotype <<${name}>>`,
101
+ evaluate(elements, context) {
102
+ return elements
103
+ .filter((c) => c.stereotypes.includes(name))
104
+ .map((c) => classViolation(c, `${c.name} has forbidden stereotype <<${name}>>`, context));
105
+ },
106
+ };
107
+ }
108
+ function dependenciesOf(c) {
109
+ return collectRelationships(c.project)
110
+ .filter((r) => r.source === c.name && !INHERITANCE_ARROWS.has(r.arrow))
111
+ .map((r) => r.target);
112
+ }
113
+ export function dependOn(targetName) {
114
+ return {
115
+ description: `depend on ${targetName}`,
116
+ evaluate(elements, context) {
117
+ return elements
118
+ .filter((c) => !dependenciesOf(c).includes(targetName))
119
+ .map((c) => classViolation(c, `${c.name} does not depend on ${targetName}`, context));
120
+ },
121
+ };
122
+ }
123
+ export function notDependOn(targetName) {
124
+ return {
125
+ description: `not depend on ${targetName}`,
126
+ evaluate(elements, context) {
127
+ return elements
128
+ .filter((c) => dependenciesOf(c).includes(targetName))
129
+ .map((c) => classViolation(c, `${c.name} depends on ${targetName}`, context));
130
+ },
131
+ };
132
+ }
133
+ export function notDependOnStereotype(stereotype) {
134
+ return {
135
+ description: `not depend on a class with stereotype <<${stereotype}>>`,
136
+ evaluate(elements, context) {
137
+ const first = elements[0];
138
+ if (first === undefined)
139
+ return [];
140
+ const project = first.project;
141
+ const stereotypesByClass = new Map();
142
+ for (const c of project.ast.classes) {
143
+ const list = c.stereotypes.map((s) => s.name);
144
+ for (const a of project.ast.stereotypeAssignments) {
145
+ if (a.classRef.$refText === c.name)
146
+ list.push(a.stereotype.name);
147
+ }
148
+ stereotypesByClass.set(c.name, list);
149
+ }
150
+ const violations = [];
151
+ for (const c of elements) {
152
+ for (const target of dependenciesOf(c)) {
153
+ const ts = stereotypesByClass.get(target) ?? [];
154
+ if (ts.includes(stereotype)) {
155
+ violations.push(classViolation(c, `${c.name} depends on ${target} which has stereotype <<${stereotype}>>`, context));
156
+ }
157
+ }
158
+ }
159
+ return violations;
160
+ },
161
+ };
162
+ }
163
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ArchProject } from './project.js';
2
+ export declare function diagram(input: string): ArchProject;
3
+ //# sourceMappingURL=diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../../src/core/diagram.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAI/C,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAalD"}
@@ -0,0 +1,18 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { parseClassDiagram } from '../parser/parse-class-diagram.js';
3
+ const HEADER_PATTERN = /^\s*classDiagram\b/;
4
+ export function diagram(input) {
5
+ if (!HEADER_PATTERN.test(input) && existsSync(input)) {
6
+ const source = readFileSync(input, 'utf-8');
7
+ return {
8
+ source,
9
+ filePath: input,
10
+ ast: parseClassDiagram(source),
11
+ };
12
+ }
13
+ return {
14
+ source: input,
15
+ ast: parseClassDiagram(input),
16
+ };
17
+ }
18
+ //# sourceMappingURL=diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagram.js","sourceRoot":"","sources":["../../src/core/diagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAGpE,MAAM,cAAc,GAAG,oBAAoB,CAAA;AAE3C,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC3C,OAAO;YACL,MAAM;YACN,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,iBAAiB,CAAC,MAAM,CAAC;SAC/B,CAAA;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC;KAC9B,CAAA;AACH,CAAC"}