@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,38 @@
1
+ import type { Diagram } from './generated/ast.js';
2
+ export interface DirectiveSchema {
3
+ kind: 'schema';
4
+ path: string;
5
+ raw: string;
6
+ }
7
+ export interface DirectiveStereotype {
8
+ kind: 'stereotype';
9
+ name: string;
10
+ body: string;
11
+ raw: string;
12
+ }
13
+ export interface DirectiveId {
14
+ kind: 'id';
15
+ className: string;
16
+ id: string;
17
+ raw: string;
18
+ }
19
+ export interface DirectiveUnknown {
20
+ kind: 'unknown';
21
+ name: string;
22
+ raw: string;
23
+ }
24
+ export type ParsedDirective = DirectiveSchema | DirectiveStereotype | DirectiveId | DirectiveUnknown;
25
+ export interface DirectiveDiagnostic {
26
+ level: 'warning' | 'error';
27
+ message: string;
28
+ raw: string;
29
+ }
30
+ export interface DirectiveParseResult {
31
+ directives: ParsedDirective[];
32
+ diagnostics: DirectiveDiagnostic[];
33
+ }
34
+ export declare function parseDirectives(ast: Diagram): DirectiveParseResult;
35
+ export declare function findDirective<K extends ParsedDirective['kind']>(result: DirectiveParseResult, kind: K): Extract<ParsedDirective, {
36
+ kind: K;
37
+ }>[];
38
+ //# sourceMappingURL=parse-directives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-directives.d.ts","sourceRoot":"","sources":["../../src/parser/parse-directives.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAIjD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,mBAAmB,GAAG,WAAW,GAAG,gBAAgB,CAAA;AAEpG,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,WAAW,EAAE,mBAAmB,EAAE,CAAA;CACnC;AAwFD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CASlE;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,EAC7D,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAAE,CAIzC"}
@@ -0,0 +1,96 @@
1
+ const RECOGNIZED_DIRECTIVES = new Set(['schema', 'stereotype', 'id']);
2
+ const HEADER_PATTERN = /^%%\s*@(\w+)\s*(.*)$/;
3
+ function stripBlock(rest) {
4
+ const match = /^(\S+)\s*\{(.*)\}\s*$/.exec(rest);
5
+ if (!match)
6
+ return undefined;
7
+ const [, name, body] = match;
8
+ if (name === undefined || body === undefined)
9
+ return undefined;
10
+ return { name, body: body.trim() };
11
+ }
12
+ function parseOne(raw) {
13
+ const m = HEADER_PATTERN.exec(raw.trim());
14
+ if (!m) {
15
+ return {
16
+ directive: { kind: 'unknown', name: '', raw },
17
+ diagnostic: {
18
+ level: 'warning',
19
+ message: `malformed directive: ${raw}`,
20
+ raw,
21
+ },
22
+ };
23
+ }
24
+ const name = m[1] ?? '';
25
+ const rest = (m[2] ?? '').trim();
26
+ if (name === 'schema') {
27
+ if (!rest) {
28
+ return {
29
+ directive: { kind: 'schema', path: '', raw },
30
+ diagnostic: {
31
+ level: 'warning',
32
+ message: '@schema directive requires a path',
33
+ raw,
34
+ },
35
+ };
36
+ }
37
+ return { directive: { kind: 'schema', path: rest, raw } };
38
+ }
39
+ if (name === 'stereotype') {
40
+ const block = stripBlock(rest);
41
+ if (!block) {
42
+ return {
43
+ directive: { kind: 'stereotype', name: rest, body: '', raw },
44
+ diagnostic: {
45
+ level: 'warning',
46
+ message: '@stereotype directive expects `<name> { ... }`',
47
+ raw,
48
+ },
49
+ };
50
+ }
51
+ return { directive: { kind: 'stereotype', name: block.name, body: block.body, raw } };
52
+ }
53
+ if (name === 'id') {
54
+ const parts = rest.split(/\s+/);
55
+ if (parts.length < 2) {
56
+ return {
57
+ directive: { kind: 'id', className: parts[0] ?? '', id: '', raw },
58
+ diagnostic: {
59
+ level: 'warning',
60
+ message: '@id directive expects `<ClassName> <stable-id>`',
61
+ raw,
62
+ },
63
+ };
64
+ }
65
+ return {
66
+ directive: { kind: 'id', className: parts[0] ?? '', id: parts.slice(1).join(' '), raw },
67
+ };
68
+ }
69
+ if (!RECOGNIZED_DIRECTIVES.has(name)) {
70
+ return {
71
+ directive: { kind: 'unknown', name, raw },
72
+ diagnostic: {
73
+ level: 'warning',
74
+ message: `unknown directive @${name} — accepted as-is, but no semantics applied`,
75
+ raw,
76
+ },
77
+ };
78
+ }
79
+ // Recognized but unhandled — defensive.
80
+ return { directive: { kind: 'unknown', name, raw } };
81
+ }
82
+ export function parseDirectives(ast) {
83
+ const directives = [];
84
+ const diagnostics = [];
85
+ for (const d of ast.directives) {
86
+ const { directive, diagnostic } = parseOne(d.text);
87
+ directives.push(directive);
88
+ if (diagnostic)
89
+ diagnostics.push(diagnostic);
90
+ }
91
+ return { directives, diagnostics };
92
+ }
93
+ export function findDirective(result, kind) {
94
+ return result.directives.filter((d) => d.kind === kind);
95
+ }
96
+ //# sourceMappingURL=parse-directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-directives.js","sourceRoot":"","sources":["../../src/parser/parse-directives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ErDiagram } from './generated/ast.js';
2
+ /** Parse a Mermaid `erDiagram` source into the generated AST (plan 0069 Phase 3). */
3
+ export declare function parseErDiagram(text: string): ErDiagram;
4
+ //# sourceMappingURL=parse-er-diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-er-diagram.d.ts","sourceRoot":"","sources":["../../src/parser/parse-er-diagram.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAoBnD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAWtD"}
@@ -0,0 +1,27 @@
1
+ import { EmptyFileSystem, createDefaultCoreModule, createDefaultSharedCoreModule, inject, } from 'langium';
2
+ import { ErDiagramGrammarGeneratedModule, MermaidUnitGeneratedSharedModule, } from './generated/module.js';
3
+ import { MermaidUnitParseError } from './parse-class-diagram.js';
4
+ let cachedServices;
5
+ function getServices() {
6
+ if (cachedServices)
7
+ return cachedServices;
8
+ const shared = inject(createDefaultSharedCoreModule(EmptyFileSystem), MermaidUnitGeneratedSharedModule);
9
+ const services = inject(createDefaultCoreModule({ shared }), ErDiagramGrammarGeneratedModule);
10
+ shared.ServiceRegistry.register(services);
11
+ cachedServices = services;
12
+ return services;
13
+ }
14
+ /** Parse a Mermaid `erDiagram` source into the generated AST (plan 0069 Phase 3). */
15
+ export function parseErDiagram(text) {
16
+ const services = getServices();
17
+ const result = services.parser.LangiumParser.parse(text);
18
+ const errors = [
19
+ ...result.lexerErrors.map((e) => `lexer:${e.line}:${e.column} ${e.message}`),
20
+ ...result.parserErrors.map((e) => `parser: ${e.message}`),
21
+ ];
22
+ if (errors.length > 0) {
23
+ throw new MermaidUnitParseError(errors);
24
+ }
25
+ return result.value;
26
+ }
27
+ //# sourceMappingURL=parse-er-diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-er-diagram.js","sourceRoot":"","sources":["../../src/parser/parse-er-diagram.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,6BAA6B,EAC7B,MAAM,GAGP,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,IAAI,cAA+C,CAAA;AAEnD,SAAS,WAAW;IAClB,IAAI,cAAc;QAAE,OAAO,cAAc,CAAA;IACzC,MAAM,MAAM,GAA8B,MAAM,CAC9C,6BAA6B,CAAC,eAAe,CAAC,EAC9C,gCAAgC,CACjC,CAAA;IACD,MAAM,QAAQ,GAAwB,MAAM,CAC1C,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,EACnC,+BAA+B,CAChC,CAAA;IACD,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACzC,cAAc,GAAG,QAAQ,CAAA;IACzB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAY,IAAI,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5E,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;KAC1D,CAAA;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAA;AACrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Diagram } from './generated/ast.js';
2
+ export interface ReferenceDiagnostic {
3
+ level: 'error' | 'warning';
4
+ kind: 'unresolved-reference' | 'duplicate-class';
5
+ message: string;
6
+ refText: string;
7
+ declaredOn: 'relationship' | 'stereotypeAssignment' | 'note';
8
+ line?: number;
9
+ }
10
+ export declare function validateReferences(ast: Diagram): ReferenceDiagnostic[];
11
+ //# sourceMappingURL=validate-diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-diagram.d.ts","sourceRoot":"","sources":["../../src/parser/validate-diagram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,IAAI,EAAE,sBAAsB,GAAG,iBAAiB,CAAA;IAChD,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,cAAc,GAAG,sBAAsB,GAAG,MAAM,CAAA;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,EAAE,CAsEtE"}
@@ -0,0 +1,67 @@
1
+ export function validateReferences(ast) {
2
+ const declared = new Set(ast.classes.map((c) => c.name));
3
+ const diagnostics = [];
4
+ // Duplicate class declarations
5
+ const seen = new Set();
6
+ for (const c of ast.classes) {
7
+ if (seen.has(c.name)) {
8
+ diagnostics.push({
9
+ level: 'error',
10
+ kind: 'duplicate-class',
11
+ message: `class ${c.name} is declared more than once`,
12
+ refText: c.name,
13
+ declaredOn: 'relationship',
14
+ line: c.$cstNode?.range.start.line,
15
+ });
16
+ }
17
+ seen.add(c.name);
18
+ }
19
+ for (const r of ast.relationships) {
20
+ if (!declared.has(r.lhs.$refText)) {
21
+ diagnostics.push({
22
+ level: 'error',
23
+ kind: 'unresolved-reference',
24
+ message: `relationship references undeclared class '${r.lhs.$refText}'`,
25
+ refText: r.lhs.$refText,
26
+ declaredOn: 'relationship',
27
+ line: r.$cstNode?.range.start.line,
28
+ });
29
+ }
30
+ if (!declared.has(r.rhs.$refText)) {
31
+ diagnostics.push({
32
+ level: 'error',
33
+ kind: 'unresolved-reference',
34
+ message: `relationship references undeclared class '${r.rhs.$refText}'`,
35
+ refText: r.rhs.$refText,
36
+ declaredOn: 'relationship',
37
+ line: r.$cstNode?.range.start.line,
38
+ });
39
+ }
40
+ }
41
+ for (const a of ast.stereotypeAssignments) {
42
+ if (!declared.has(a.classRef.$refText)) {
43
+ diagnostics.push({
44
+ level: 'error',
45
+ kind: 'unresolved-reference',
46
+ message: `stereotype <<${a.stereotype.name}>> references undeclared class '${a.classRef.$refText}'`,
47
+ refText: a.classRef.$refText,
48
+ declaredOn: 'stereotypeAssignment',
49
+ line: a.$cstNode?.range.start.line,
50
+ });
51
+ }
52
+ }
53
+ for (const n of ast.notes) {
54
+ if (n.target && !declared.has(n.target.$refText)) {
55
+ diagnostics.push({
56
+ level: 'error',
57
+ kind: 'unresolved-reference',
58
+ message: `note targets undeclared class '${n.target.$refText}'`,
59
+ refText: n.target.$refText,
60
+ declaredOn: 'note',
61
+ line: n.$cstNode?.range.start.line,
62
+ });
63
+ }
64
+ }
65
+ return diagnostics;
66
+ }
67
+ //# sourceMappingURL=validate-diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-diagram.js","sourceRoot":"","sources":["../../src/parser/validate-diagram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Predicate } from '@nielspeter/eess';
2
+ import type { ArchClass } from '../models/arch-class.js';
3
+ export declare function haveStereotype(name: string): Predicate<ArchClass>;
4
+ export declare function haveNameMatching(pattern: RegExp): Predicate<ArchClass>;
5
+ export declare function haveNameStartingWith(prefix: string): Predicate<ArchClass>;
6
+ export declare function haveNameEndingWith(suffix: string): Predicate<ArchClass>;
7
+ export declare function haveMemberNamed(name: string): Predicate<ArchClass>;
8
+ export declare function haveMethodNamed(name: string): Predicate<ArchClass>;
9
+ export declare function areAbstract(): Predicate<ArchClass>;
10
+ export declare function haveAtLeastOneMethod(): Predicate<ArchClass>;
11
+ export declare function haveNoMembers(): Predicate<ArchClass>;
12
+ export declare function extendName(superName: string): Predicate<ArchClass>;
13
+ //# sourceMappingURL=class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/predicates/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAKjE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAKtE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAKzE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAKvE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAKlE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAKlE;AAED,wBAAgB,WAAW,IAAI,SAAS,CAAC,SAAS,CAAC,CAKlD;AAED,wBAAgB,oBAAoB,IAAI,SAAS,CAAC,SAAS,CAAC,CAK3D;AAED,wBAAgB,aAAa,IAAI,SAAS,CAAC,SAAS,CAAC,CAKpD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAgBlE"}
@@ -0,0 +1,73 @@
1
+ export function haveStereotype(name) {
2
+ return {
3
+ description: `have stereotype <<${name}>>`,
4
+ test: (c) => c.stereotypes.includes(name),
5
+ };
6
+ }
7
+ export function haveNameMatching(pattern) {
8
+ return {
9
+ description: `have name matching ${pattern.toString()}`,
10
+ test: (c) => pattern.test(c.name),
11
+ };
12
+ }
13
+ export function haveNameStartingWith(prefix) {
14
+ return {
15
+ description: `have name starting with '${prefix}'`,
16
+ test: (c) => c.name.startsWith(prefix),
17
+ };
18
+ }
19
+ export function haveNameEndingWith(suffix) {
20
+ return {
21
+ description: `have name ending with '${suffix}'`,
22
+ test: (c) => c.name.endsWith(suffix),
23
+ };
24
+ }
25
+ export function haveMemberNamed(name) {
26
+ return {
27
+ description: `have member named '${name}'`,
28
+ test: (c) => c.memberNames.includes(name),
29
+ };
30
+ }
31
+ export function haveMethodNamed(name) {
32
+ return {
33
+ description: `have method named '${name}'`,
34
+ test: (c) => c.methodNames.includes(name),
35
+ };
36
+ }
37
+ export function areAbstract() {
38
+ return {
39
+ description: 'are abstract',
40
+ test: (c) => c.stereotypes.includes('abstract'),
41
+ };
42
+ }
43
+ export function haveAtLeastOneMethod() {
44
+ return {
45
+ description: 'have at least one method',
46
+ test: (c) => c.methodNames.length > 0,
47
+ };
48
+ }
49
+ export function haveNoMembers() {
50
+ return {
51
+ description: 'have no members',
52
+ test: (c) => c.memberNames.length === 0,
53
+ };
54
+ }
55
+ export function extendName(superName) {
56
+ return {
57
+ description: `extend ${superName}`,
58
+ test: (c) => {
59
+ const project = c.project;
60
+ for (const r of project.ast.relationships) {
61
+ if (r.arrow !== '<|--' && r.arrow !== '<|..' && r.arrow !== '--|>' && r.arrow !== '..|>') {
62
+ continue;
63
+ }
64
+ const sub = r.arrow === '<|--' || r.arrow === '<|..' ? r.rhs.$refText : r.lhs.$refText;
65
+ const sup = r.arrow === '<|--' || r.arrow === '<|..' ? r.lhs.$refText : r.rhs.$refText;
66
+ if (sub === c.name && sup === superName)
67
+ return true;
68
+ }
69
+ return false;
70
+ },
71
+ };
72
+ }
73
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/predicates/class.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@nielspeter/eess-mermaid",
3
+ "version": "0.1.0",
4
+ "description": "Architecture testing for Mermaid class diagrams — the Mermaid dialect of the eess family (formerly mermaidunit)",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
12
+ "bin": {
13
+ "eess-mermaid": "./dist/cli/bin.js"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "engines": {
21
+ "node": ">=24.0.0"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/nielspeter/eess.git",
26
+ "directory": "packages/mermaid"
27
+ },
28
+ "author": "Niels Peter",
29
+ "license": "MIT",
30
+ "scripts": {
31
+ "prepublishOnly": "npm run build",
32
+ "langium:gen": "langium generate --file langium-config.json",
33
+ "build": "npm run langium:gen && tsc -p tsconfig.build.json && chmod +x dist/cli/bin.js",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "typecheck": "tsc --noEmit"
37
+ },
38
+ "keywords": [
39
+ "mermaid",
40
+ "architecture",
41
+ "testing",
42
+ "diagram",
43
+ "eess"
44
+ ],
45
+ "dependencies": {
46
+ "@nielspeter/eess": "^0.1.0",
47
+ "jiti": "^2.7.0",
48
+ "langium": "^4.2.3"
49
+ }
50
+ }