domain-knowledge-kit 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.
- package/LICENSE +94 -0
- package/README.md +266 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -0
- package/dist/features/adr/commands/adr-related.d.ts +14 -0
- package/dist/features/adr/commands/adr-related.d.ts.map +1 -0
- package/dist/features/adr/commands/adr-related.js +146 -0
- package/dist/features/adr/commands/adr-related.js.map +1 -0
- package/dist/features/adr/commands/adr-show.d.ts +10 -0
- package/dist/features/adr/commands/adr-show.d.ts.map +1 -0
- package/dist/features/adr/commands/adr-show.js +30 -0
- package/dist/features/adr/commands/adr-show.js.map +1 -0
- package/dist/features/pipeline/commands/render.d.ts +10 -0
- package/dist/features/pipeline/commands/render.d.ts.map +1 -0
- package/dist/features/pipeline/commands/render.js +71 -0
- package/dist/features/pipeline/commands/render.js.map +1 -0
- package/dist/features/pipeline/commands/validate.d.ts +10 -0
- package/dist/features/pipeline/commands/validate.d.ts.map +1 -0
- package/dist/features/pipeline/commands/validate.js +48 -0
- package/dist/features/pipeline/commands/validate.js.map +1 -0
- package/dist/features/pipeline/indexer.d.ts +36 -0
- package/dist/features/pipeline/indexer.d.ts.map +1 -0
- package/dist/features/pipeline/indexer.js +279 -0
- package/dist/features/pipeline/indexer.js.map +1 -0
- package/dist/features/pipeline/renderer.d.ts +42 -0
- package/dist/features/pipeline/renderer.d.ts.map +1 -0
- package/dist/features/pipeline/renderer.js +239 -0
- package/dist/features/pipeline/renderer.js.map +1 -0
- package/dist/features/pipeline/tests/indexer.test.d.ts +2 -0
- package/dist/features/pipeline/tests/indexer.test.d.ts.map +1 -0
- package/dist/features/pipeline/tests/indexer.test.js +224 -0
- package/dist/features/pipeline/tests/indexer.test.js.map +1 -0
- package/dist/features/pipeline/tests/renderer.test.d.ts +2 -0
- package/dist/features/pipeline/tests/renderer.test.d.ts.map +1 -0
- package/dist/features/pipeline/tests/renderer.test.js +252 -0
- package/dist/features/pipeline/tests/renderer.test.js.map +1 -0
- package/dist/features/pipeline/tests/validate-schemas.test.d.ts +2 -0
- package/dist/features/pipeline/tests/validate-schemas.test.d.ts.map +1 -0
- package/dist/features/pipeline/tests/validate-schemas.test.js +183 -0
- package/dist/features/pipeline/tests/validate-schemas.test.js.map +1 -0
- package/dist/features/pipeline/tests/validator.test.d.ts +2 -0
- package/dist/features/pipeline/tests/validator.test.d.ts.map +1 -0
- package/dist/features/pipeline/tests/validator.test.js +371 -0
- package/dist/features/pipeline/tests/validator.test.js.map +1 -0
- package/dist/features/pipeline/validator.d.ts +44 -0
- package/dist/features/pipeline/validator.d.ts.map +1 -0
- package/dist/features/pipeline/validator.js +289 -0
- package/dist/features/pipeline/validator.js.map +1 -0
- package/dist/features/query/commands/list.d.ts +10 -0
- package/dist/features/query/commands/list.d.ts.map +1 -0
- package/dist/features/query/commands/list.js +123 -0
- package/dist/features/query/commands/list.js.map +1 -0
- package/dist/features/query/commands/related.d.ts +10 -0
- package/dist/features/query/commands/related.d.ts.map +1 -0
- package/dist/features/query/commands/related.js +61 -0
- package/dist/features/query/commands/related.js.map +1 -0
- package/dist/features/query/commands/search.d.ts +10 -0
- package/dist/features/query/commands/search.d.ts.map +1 -0
- package/dist/features/query/commands/search.js +55 -0
- package/dist/features/query/commands/search.js.map +1 -0
- package/dist/features/query/commands/show.d.ts +10 -0
- package/dist/features/query/commands/show.d.ts.map +1 -0
- package/dist/features/query/commands/show.js +96 -0
- package/dist/features/query/commands/show.js.map +1 -0
- package/dist/features/query/searcher.d.ts +58 -0
- package/dist/features/query/searcher.d.ts.map +1 -0
- package/dist/features/query/searcher.js +185 -0
- package/dist/features/query/searcher.js.map +1 -0
- package/dist/features/query/tests/searcher.test.d.ts +2 -0
- package/dist/features/query/tests/searcher.test.d.ts.map +1 -0
- package/dist/features/query/tests/searcher.test.js +320 -0
- package/dist/features/query/tests/searcher.test.js.map +1 -0
- package/dist/shared/adr-parser.d.ts +14 -0
- package/dist/shared/adr-parser.d.ts.map +1 -0
- package/dist/shared/adr-parser.js +72 -0
- package/dist/shared/adr-parser.js.map +1 -0
- package/dist/shared/errors.d.ts +43 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +60 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/graph.d.ts +71 -0
- package/dist/shared/graph.d.ts.map +1 -0
- package/dist/shared/graph.js +250 -0
- package/dist/shared/graph.js.map +1 -0
- package/dist/shared/index.d.ts +16 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +24 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/item-visitor.d.ts +62 -0
- package/dist/shared/item-visitor.d.ts.map +1 -0
- package/dist/shared/item-visitor.js +95 -0
- package/dist/shared/item-visitor.js.map +1 -0
- package/dist/shared/loader.d.ts +19 -0
- package/dist/shared/loader.d.ts.map +1 -0
- package/dist/shared/loader.js +166 -0
- package/dist/shared/loader.js.map +1 -0
- package/dist/shared/paths.d.ts +32 -0
- package/dist/shared/paths.d.ts.map +1 -0
- package/dist/shared/paths.js +62 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/shared/tests/graph.test.d.ts +2 -0
- package/dist/shared/tests/graph.test.d.ts.map +1 -0
- package/dist/shared/tests/graph.test.js +291 -0
- package/dist/shared/tests/graph.test.js.map +1 -0
- package/dist/shared/tests/loader.test.d.ts +2 -0
- package/dist/shared/tests/loader.test.d.ts.map +1 -0
- package/dist/shared/tests/loader.test.js +239 -0
- package/dist/shared/tests/loader.test.js.map +1 -0
- package/dist/shared/tests/verify-collision-fix.test.d.ts +2 -0
- package/dist/shared/tests/verify-collision-fix.test.d.ts.map +1 -0
- package/dist/shared/tests/verify-collision-fix.test.js +114 -0
- package/dist/shared/tests/verify-collision-fix.test.js.map +1 -0
- package/dist/shared/types/domain.d.ts +244 -0
- package/dist/shared/types/domain.d.ts.map +1 -0
- package/dist/shared/types/domain.js +6 -0
- package/dist/shared/types/domain.js.map +1 -0
- package/dist/shared/types/index.d.ts +34 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/shared/types/index.js +9 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/shared/yaml.d.ts +13 -0
- package/dist/shared/yaml.d.ts.map +1 -0
- package/dist/shared/yaml.js +29 -0
- package/dist/shared/yaml.js.map +1 -0
- package/package.json +48 -0
- package/tools/domain-pack/schema/.gitkeep +0 -0
- package/tools/domain-pack/schema/actors.schema.json +42 -0
- package/tools/domain-pack/schema/adr-frontmatter.schema.json +51 -0
- package/tools/domain-pack/schema/aggregate.schema.json +58 -0
- package/tools/domain-pack/schema/command.schema.json +76 -0
- package/tools/domain-pack/schema/context.schema.json +51 -0
- package/tools/domain-pack/schema/event.schema.json +66 -0
- package/tools/domain-pack/schema/glossary.schema.json +33 -0
- package/tools/domain-pack/schema/index.schema.json +76 -0
- package/tools/domain-pack/schema/policy.schema.json +53 -0
- package/tools/domain-pack/schema/read-model.schema.json +39 -0
- package/tools/domain-pack/templates/.gitkeep +0 -0
- package/tools/domain-pack/templates/context.md.hbs +89 -0
- package/tools/domain-pack/templates/index.md.hbs +60 -0
- package/tools/domain-pack/templates/item.md.hbs +85 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain model loader.
|
|
3
|
+
*
|
|
4
|
+
* Recursively walks `domain/` and `docs/adr/` to discover all YAML
|
|
5
|
+
* definition files and ADR Markdown files, then assembles and returns
|
|
6
|
+
* a fully-typed {@link DomainModel}.
|
|
7
|
+
*
|
|
8
|
+
* Context layout (per-item directory format):
|
|
9
|
+
*
|
|
10
|
+
* domain/contexts/<name>/
|
|
11
|
+
* context.yml ← metadata: name, description, glossary
|
|
12
|
+
* events/ ← one .yml file per DomainEvent
|
|
13
|
+
* commands/ ← one .yml file per Command
|
|
14
|
+
* policies/ ← one .yml file per Policy
|
|
15
|
+
* aggregates/ ← one .yml file per Aggregate
|
|
16
|
+
* read-models/ ← one .yml file per ReadModel
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
19
|
+
import { join, basename, extname } from "node:path";
|
|
20
|
+
import { parseYaml } from "./yaml.js";
|
|
21
|
+
import { parseAdrFile } from "./adr-parser.js";
|
|
22
|
+
import { actorsFile, contextsDir, indexFile, adrDir, } from "./paths.js";
|
|
23
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
24
|
+
/** Read a YAML file and parse it into `T`. */
|
|
25
|
+
function loadYaml(filePath) {
|
|
26
|
+
const text = readFileSync(filePath, "utf-8");
|
|
27
|
+
return parseYaml(text);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Discover all `.yml` / `.yaml` files under a directory (non-recursive).
|
|
31
|
+
* Skips dotfiles (e.g. `.gitkeep`).
|
|
32
|
+
*/
|
|
33
|
+
function listYamlFiles(dir) {
|
|
34
|
+
if (!existsSync(dir))
|
|
35
|
+
return [];
|
|
36
|
+
return readdirSync(dir)
|
|
37
|
+
.filter((f) => {
|
|
38
|
+
const ext = extname(f).toLowerCase();
|
|
39
|
+
return (ext === ".yml" || ext === ".yaml") && !f.startsWith(".");
|
|
40
|
+
})
|
|
41
|
+
.sort()
|
|
42
|
+
.map((f) => join(dir, f));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Discover all `.md` files under a directory (non-recursive).
|
|
46
|
+
* Skips README.md and dotfiles.
|
|
47
|
+
*/
|
|
48
|
+
function listAdrFiles(dir) {
|
|
49
|
+
if (!existsSync(dir))
|
|
50
|
+
return [];
|
|
51
|
+
return readdirSync(dir)
|
|
52
|
+
.filter((f) => {
|
|
53
|
+
const ext = extname(f).toLowerCase();
|
|
54
|
+
const name = basename(f).toLowerCase();
|
|
55
|
+
return ext === ".md" && !f.startsWith(".") && name !== "readme.md";
|
|
56
|
+
})
|
|
57
|
+
.sort()
|
|
58
|
+
.map((f) => join(dir, f));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load a bounded context from a per-item directory.
|
|
62
|
+
*
|
|
63
|
+
* Expects:
|
|
64
|
+
* <ctxDir>/context.yml — identity: name, description, glossary
|
|
65
|
+
* <ctxDir>/events/*.yml — one file per DomainEvent
|
|
66
|
+
* <ctxDir>/commands/*.yml — one file per Command
|
|
67
|
+
* <ctxDir>/policies/*.yml — one file per Policy
|
|
68
|
+
* <ctxDir>/aggregates/*.yml — one file per Aggregate
|
|
69
|
+
* <ctxDir>/read-models/*.yml — one file per ReadModel
|
|
70
|
+
*
|
|
71
|
+
* Returns `null` if `context.yml` is absent or has no `name`.
|
|
72
|
+
*/
|
|
73
|
+
function loadPerItemContext(ctxDir) {
|
|
74
|
+
const metaPath = join(ctxDir, "context.yml");
|
|
75
|
+
if (!existsSync(metaPath))
|
|
76
|
+
return null;
|
|
77
|
+
const meta = loadYaml(metaPath);
|
|
78
|
+
if (!meta.name)
|
|
79
|
+
return null;
|
|
80
|
+
const events = listYamlFiles(join(ctxDir, "events")).map((f) => loadYaml(f));
|
|
81
|
+
const commands = listYamlFiles(join(ctxDir, "commands")).map((f) => loadYaml(f));
|
|
82
|
+
const policies = listYamlFiles(join(ctxDir, "policies")).map((f) => loadYaml(f));
|
|
83
|
+
const aggregates = listYamlFiles(join(ctxDir, "aggregates")).map((f) => loadYaml(f));
|
|
84
|
+
const readModels = listYamlFiles(join(ctxDir, "read-models")).map((f) => loadYaml(f));
|
|
85
|
+
const ctx = {
|
|
86
|
+
name: meta.name,
|
|
87
|
+
description: meta.description,
|
|
88
|
+
};
|
|
89
|
+
if (meta.glossary?.length)
|
|
90
|
+
ctx.glossary = meta.glossary;
|
|
91
|
+
if (events.length)
|
|
92
|
+
ctx.events = events;
|
|
93
|
+
if (commands.length)
|
|
94
|
+
ctx.commands = commands;
|
|
95
|
+
if (policies.length)
|
|
96
|
+
ctx.policies = policies;
|
|
97
|
+
if (aggregates.length)
|
|
98
|
+
ctx.aggregates = aggregates;
|
|
99
|
+
if (readModels.length)
|
|
100
|
+
ctx.read_models = readModels;
|
|
101
|
+
return ctx;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Discover and load all bounded contexts from `domain/contexts/`.
|
|
105
|
+
*
|
|
106
|
+
* Each sub-directory that contains a `context.yml` is treated as a
|
|
107
|
+
* bounded context in the new per-item format.
|
|
108
|
+
*/
|
|
109
|
+
function loadAllContexts(ctxDir) {
|
|
110
|
+
const contexts = new Map();
|
|
111
|
+
if (!existsSync(ctxDir))
|
|
112
|
+
return contexts;
|
|
113
|
+
const entries = readdirSync(ctxDir, { withFileTypes: true });
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
if (entry.name.startsWith("."))
|
|
116
|
+
continue;
|
|
117
|
+
if (!entry.isDirectory())
|
|
118
|
+
continue;
|
|
119
|
+
const ctx = loadPerItemContext(join(ctxDir, entry.name));
|
|
120
|
+
if (ctx)
|
|
121
|
+
contexts.set(ctx.name, ctx);
|
|
122
|
+
}
|
|
123
|
+
return contexts;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Load the complete domain model from disk.
|
|
127
|
+
*
|
|
128
|
+
* 1. Parses `domain/index.yml`
|
|
129
|
+
* 2. Parses `domain/actors.yml`
|
|
130
|
+
* 3. Discovers and parses every bounded-context YAML file
|
|
131
|
+
* under `domain/contexts/`
|
|
132
|
+
* 4. Discovers and parses ADR frontmatter from `docs/adr/*.md`
|
|
133
|
+
*
|
|
134
|
+
* @returns A fully-populated {@link DomainModel}.
|
|
135
|
+
*/
|
|
136
|
+
export function loadDomainModel(options = {}) {
|
|
137
|
+
const root = options.root;
|
|
138
|
+
// 1. Domain index
|
|
139
|
+
const indexPath = indexFile(root);
|
|
140
|
+
const index = existsSync(indexPath)
|
|
141
|
+
? loadYaml(indexPath)
|
|
142
|
+
: { contexts: [] };
|
|
143
|
+
// 2. Actors
|
|
144
|
+
const actorsPath = actorsFile(root);
|
|
145
|
+
const actorsData = existsSync(actorsPath)
|
|
146
|
+
? loadYaml(actorsPath)
|
|
147
|
+
: { actors: [] };
|
|
148
|
+
// 3. Bounded contexts
|
|
149
|
+
const contexts = loadAllContexts(contextsDir(root));
|
|
150
|
+
// 4. ADRs
|
|
151
|
+
const adrs = new Map();
|
|
152
|
+
const adrFiles = listAdrFiles(adrDir(root));
|
|
153
|
+
for (const adrPath of adrFiles) {
|
|
154
|
+
const record = parseAdrFile(adrPath);
|
|
155
|
+
if (record) {
|
|
156
|
+
adrs.set(record.id, record);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
index,
|
|
161
|
+
actors: actorsData.actors ?? [],
|
|
162
|
+
contexts,
|
|
163
|
+
adrs,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/shared/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the repository root.
|
|
3
|
+
*
|
|
4
|
+
* When running from source (`tsx src/cli.ts`) `import.meta.dirname`
|
|
5
|
+
* points at `src/shared/`, so we go up two levels. When running from
|
|
6
|
+
* the compiled output (`dist/shared/`) we also go up two levels.
|
|
7
|
+
*
|
|
8
|
+
* Callers can override by passing an explicit `repoRoot`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function repoRoot(override?: string): string;
|
|
11
|
+
/** Absolute path to the `domain/` directory. */
|
|
12
|
+
export declare function domainDir(root?: string): string;
|
|
13
|
+
/** Absolute path to `domain/contexts/`. */
|
|
14
|
+
export declare function contextsDir(root?: string): string;
|
|
15
|
+
/** Absolute path to `domain/actors.yml`. */
|
|
16
|
+
export declare function actorsFile(root?: string): string;
|
|
17
|
+
/** Absolute path to `domain/index.yml`. */
|
|
18
|
+
export declare function indexFile(root?: string): string;
|
|
19
|
+
/** Absolute path to `docs/adr/`. */
|
|
20
|
+
export declare function adrDir(root?: string): string;
|
|
21
|
+
/** Absolute path to `docs/domain/` (rendered output). */
|
|
22
|
+
export declare function docsDir(root?: string): string;
|
|
23
|
+
/** Absolute path to `tools/domain-pack/templates/`. */
|
|
24
|
+
export declare function templatesDir(root?: string): string;
|
|
25
|
+
/** Absolute path to `tools/domain-pack/schema/`. */
|
|
26
|
+
export declare function schemaDir(root?: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Turn an absolute path into a repo-relative POSIX path
|
|
29
|
+
* (forward slashes, no leading `./`).
|
|
30
|
+
*/
|
|
31
|
+
export declare function repoRelative(absPath: string, root?: string): string;
|
|
32
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,oCAAoC;AACpC,wBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-relative path resolution utilities.
|
|
3
|
+
*
|
|
4
|
+
* Every path helper resolves relative to the repository root
|
|
5
|
+
* so callers never need to worry about the working directory.
|
|
6
|
+
*/
|
|
7
|
+
import { resolve, join, relative } from "node:path";
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the repository root.
|
|
10
|
+
*
|
|
11
|
+
* When running from source (`tsx src/cli.ts`) `import.meta.dirname`
|
|
12
|
+
* points at `src/shared/`, so we go up two levels. When running from
|
|
13
|
+
* the compiled output (`dist/shared/`) we also go up two levels.
|
|
14
|
+
*
|
|
15
|
+
* Callers can override by passing an explicit `repoRoot`.
|
|
16
|
+
*/
|
|
17
|
+
export function repoRoot(override) {
|
|
18
|
+
if (override)
|
|
19
|
+
return resolve(override);
|
|
20
|
+
// import.meta.dirname is src/shared or dist/shared
|
|
21
|
+
return resolve(import.meta.dirname, "../..");
|
|
22
|
+
}
|
|
23
|
+
/** Absolute path to the `domain/` directory. */
|
|
24
|
+
export function domainDir(root) {
|
|
25
|
+
return join(repoRoot(root), "domain");
|
|
26
|
+
}
|
|
27
|
+
/** Absolute path to `domain/contexts/`. */
|
|
28
|
+
export function contextsDir(root) {
|
|
29
|
+
return join(domainDir(root), "contexts");
|
|
30
|
+
}
|
|
31
|
+
/** Absolute path to `domain/actors.yml`. */
|
|
32
|
+
export function actorsFile(root) {
|
|
33
|
+
return join(domainDir(root), "actors.yml");
|
|
34
|
+
}
|
|
35
|
+
/** Absolute path to `domain/index.yml`. */
|
|
36
|
+
export function indexFile(root) {
|
|
37
|
+
return join(domainDir(root), "index.yml");
|
|
38
|
+
}
|
|
39
|
+
/** Absolute path to `docs/adr/`. */
|
|
40
|
+
export function adrDir(root) {
|
|
41
|
+
return join(repoRoot(root), "docs", "adr");
|
|
42
|
+
}
|
|
43
|
+
/** Absolute path to `docs/domain/` (rendered output). */
|
|
44
|
+
export function docsDir(root) {
|
|
45
|
+
return join(repoRoot(root), "docs", "domain");
|
|
46
|
+
}
|
|
47
|
+
/** Absolute path to `tools/domain-pack/templates/`. */
|
|
48
|
+
export function templatesDir(root) {
|
|
49
|
+
return join(repoRoot(root), "tools", "domain-pack", "templates");
|
|
50
|
+
}
|
|
51
|
+
/** Absolute path to `tools/domain-pack/schema/`. */
|
|
52
|
+
export function schemaDir(root) {
|
|
53
|
+
return join(repoRoot(root), "tools", "domain-pack", "schema");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Turn an absolute path into a repo-relative POSIX path
|
|
57
|
+
* (forward slashes, no leading `./`).
|
|
58
|
+
*/
|
|
59
|
+
export function repoRelative(absPath, root) {
|
|
60
|
+
return relative(repoRoot(root), absPath).replace(/\\/g, "/");
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAiB;IACxC,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,oDAAoD;IACpD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,MAAM,CAAC,IAAa;IAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,OAAO,CAAC,IAAa;IACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AACnE,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAa;IACzD,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.test.d.ts","sourceRoot":"","sources":["../../../src/shared/tests/graph.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the domain graph (adjacency-list) module.
|
|
3
|
+
*
|
|
4
|
+
* Builds a DomainModel in-memory (via the loader's temp-dir approach)
|
|
5
|
+
* and verifies that DomainGraph correctly wires nodes and edges.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { loadDomainModel } from "../loader.js";
|
|
11
|
+
import { DomainGraph } from "../graph.js";
|
|
12
|
+
// ── Fixture setup ─────────────────────────────────────────────────────
|
|
13
|
+
const TMP = join(tmpdir(), `dkk-graph-test-${Date.now()}`);
|
|
14
|
+
const DOMAIN = join(TMP, "domain");
|
|
15
|
+
const CONTEXTS = join(DOMAIN, "contexts");
|
|
16
|
+
const ADR_DIR = join(TMP, "docs", "adr");
|
|
17
|
+
function setup() {
|
|
18
|
+
mkdirSync(join(CONTEXTS, "ordering", "events"), { recursive: true });
|
|
19
|
+
mkdirSync(join(CONTEXTS, "ordering", "commands"), { recursive: true });
|
|
20
|
+
mkdirSync(join(CONTEXTS, "ordering", "policies"), { recursive: true });
|
|
21
|
+
mkdirSync(join(CONTEXTS, "ordering", "aggregates"), { recursive: true });
|
|
22
|
+
mkdirSync(join(CONTEXTS, "shipping", "events"), { recursive: true });
|
|
23
|
+
mkdirSync(join(CONTEXTS, "shipping", "commands"), { recursive: true });
|
|
24
|
+
mkdirSync(join(CONTEXTS, "shipping", "aggregates"), { recursive: true });
|
|
25
|
+
mkdirSync(join(CONTEXTS, "shipping", "read-models"), { recursive: true });
|
|
26
|
+
mkdirSync(ADR_DIR, { recursive: true });
|
|
27
|
+
// domain/index.yml
|
|
28
|
+
writeFileSync(join(DOMAIN, "index.yml"), [
|
|
29
|
+
"contexts:",
|
|
30
|
+
" - name: ordering",
|
|
31
|
+
' description: "Order management"',
|
|
32
|
+
" - name: shipping",
|
|
33
|
+
' description: "Shipping logistics"',
|
|
34
|
+
"flows:",
|
|
35
|
+
" - name: PlaceAndShip",
|
|
36
|
+
' description: "Order to shipment"',
|
|
37
|
+
" steps:",
|
|
38
|
+
" - ref: ordering.PlaceOrder",
|
|
39
|
+
" type: command",
|
|
40
|
+
" - ref: ordering.OrderPlaced",
|
|
41
|
+
" type: event",
|
|
42
|
+
" - ref: shipping.ShipOrder",
|
|
43
|
+
" type: command",
|
|
44
|
+
].join("\n"));
|
|
45
|
+
// domain/actors.yml
|
|
46
|
+
writeFileSync(join(DOMAIN, "actors.yml"), [
|
|
47
|
+
"actors:",
|
|
48
|
+
" - name: Customer",
|
|
49
|
+
" type: human",
|
|
50
|
+
' description: "A paying customer"',
|
|
51
|
+
" - name: WarehouseBot",
|
|
52
|
+
" type: system",
|
|
53
|
+
' description: "Automated warehouse robot"',
|
|
54
|
+
].join("\n"));
|
|
55
|
+
// domain/contexts/ordering/ — per-item directory
|
|
56
|
+
writeFileSync(join(CONTEXTS, "ordering", "context.yml"), [
|
|
57
|
+
"name: ordering",
|
|
58
|
+
'description: "Handles the order lifecycle"',
|
|
59
|
+
"glossary:",
|
|
60
|
+
" - term: Order",
|
|
61
|
+
' definition: "A customer purchase request"',
|
|
62
|
+
" adr_refs:",
|
|
63
|
+
" - adr-0001",
|
|
64
|
+
].join("\n"));
|
|
65
|
+
writeFileSync(join(CONTEXTS, "ordering", "events", "OrderPlaced.yml"), [
|
|
66
|
+
"name: OrderPlaced",
|
|
67
|
+
'description: "Raised when an order is placed"',
|
|
68
|
+
"fields:",
|
|
69
|
+
" - name: orderId",
|
|
70
|
+
" type: UUID",
|
|
71
|
+
"raised_by: Order",
|
|
72
|
+
].join("\n"));
|
|
73
|
+
writeFileSync(join(CONTEXTS, "ordering", "events", "OrderCancelled.yml"), [
|
|
74
|
+
"name: OrderCancelled",
|
|
75
|
+
'description: "Raised when an order is cancelled"',
|
|
76
|
+
"raised_by: Order",
|
|
77
|
+
].join("\n"));
|
|
78
|
+
writeFileSync(join(CONTEXTS, "ordering", "commands", "PlaceOrder.yml"), [
|
|
79
|
+
"name: PlaceOrder",
|
|
80
|
+
'description: "Submit a new order"',
|
|
81
|
+
"actor: Customer",
|
|
82
|
+
"handled_by: Order",
|
|
83
|
+
].join("\n"));
|
|
84
|
+
writeFileSync(join(CONTEXTS, "ordering", "commands", "CancelOrder.yml"), [
|
|
85
|
+
"name: CancelOrder",
|
|
86
|
+
'description: "Cancel an order"',
|
|
87
|
+
"handled_by: Order",
|
|
88
|
+
].join("\n"));
|
|
89
|
+
writeFileSync(join(CONTEXTS, "ordering", "policies", "NotifyOnCancel.yml"), [
|
|
90
|
+
"name: NotifyOnCancel",
|
|
91
|
+
'description: "Notify customer when order is cancelled"',
|
|
92
|
+
"when:",
|
|
93
|
+
" events:",
|
|
94
|
+
" - OrderCancelled",
|
|
95
|
+
"then:",
|
|
96
|
+
" commands:",
|
|
97
|
+
" - SendNotification",
|
|
98
|
+
].join("\n"));
|
|
99
|
+
writeFileSync(join(CONTEXTS, "ordering", "aggregates", "Order.yml"), [
|
|
100
|
+
"name: Order",
|
|
101
|
+
'description: "Order aggregate root"',
|
|
102
|
+
"handles:",
|
|
103
|
+
" commands:",
|
|
104
|
+
" - PlaceOrder",
|
|
105
|
+
" - CancelOrder",
|
|
106
|
+
"emits:",
|
|
107
|
+
" events:",
|
|
108
|
+
" - OrderPlaced",
|
|
109
|
+
" - OrderCancelled",
|
|
110
|
+
].join("\n"));
|
|
111
|
+
// domain/contexts/shipping/ — per-item directory
|
|
112
|
+
writeFileSync(join(CONTEXTS, "shipping", "context.yml"), [
|
|
113
|
+
"name: shipping",
|
|
114
|
+
'description: "Handles shipment tracking"',
|
|
115
|
+
].join("\n"));
|
|
116
|
+
writeFileSync(join(CONTEXTS, "shipping", "commands", "ShipOrder.yml"), [
|
|
117
|
+
"name: ShipOrder",
|
|
118
|
+
'description: "Initiate shipment for an order"',
|
|
119
|
+
"handled_by: Shipment",
|
|
120
|
+
].join("\n"));
|
|
121
|
+
writeFileSync(join(CONTEXTS, "shipping", "events", "ShipmentDispatched.yml"), [
|
|
122
|
+
"name: ShipmentDispatched",
|
|
123
|
+
'description: "Raised when a shipment is dispatched"',
|
|
124
|
+
"raised_by: Shipment",
|
|
125
|
+
].join("\n"));
|
|
126
|
+
writeFileSync(join(CONTEXTS, "shipping", "aggregates", "Shipment.yml"), [
|
|
127
|
+
"name: Shipment",
|
|
128
|
+
'description: "Shipment aggregate"',
|
|
129
|
+
"handles:",
|
|
130
|
+
" commands:",
|
|
131
|
+
" - ShipOrder",
|
|
132
|
+
"emits:",
|
|
133
|
+
" events:",
|
|
134
|
+
" - ShipmentDispatched",
|
|
135
|
+
].join("\n"));
|
|
136
|
+
writeFileSync(join(CONTEXTS, "shipping", "read-models", "ShipmentStatus.yml"), [
|
|
137
|
+
"name: ShipmentStatus",
|
|
138
|
+
'description: "Current status of a shipment"',
|
|
139
|
+
"subscribes_to:",
|
|
140
|
+
" - ShipmentDispatched",
|
|
141
|
+
"used_by:",
|
|
142
|
+
" - Customer",
|
|
143
|
+
].join("\n"));
|
|
144
|
+
// docs/adr/0001-use-yaml.md
|
|
145
|
+
writeFileSync(join(ADR_DIR, "0001-use-yaml.md"), [
|
|
146
|
+
"---",
|
|
147
|
+
"id: adr-0001",
|
|
148
|
+
"title: Use YAML for domain models",
|
|
149
|
+
"status: accepted",
|
|
150
|
+
"date: 2026-01-15",
|
|
151
|
+
"deciders:",
|
|
152
|
+
" - Alice",
|
|
153
|
+
"domain_refs:",
|
|
154
|
+
" - ordering.Order",
|
|
155
|
+
"---",
|
|
156
|
+
"",
|
|
157
|
+
"# ADR-0001 — Use YAML for domain models",
|
|
158
|
+
].join("\n"));
|
|
159
|
+
// docs/adr/0002-superseded.md
|
|
160
|
+
writeFileSync(join(ADR_DIR, "0002-superseded.md"), [
|
|
161
|
+
"---",
|
|
162
|
+
"id: adr-0002",
|
|
163
|
+
"title: Old approach",
|
|
164
|
+
"status: superseded",
|
|
165
|
+
"date: 2026-01-10",
|
|
166
|
+
"superseded_by: adr-0001",
|
|
167
|
+
"---",
|
|
168
|
+
"",
|
|
169
|
+
"# ADR-0002",
|
|
170
|
+
].join("\n"));
|
|
171
|
+
writeFileSync(join(ADR_DIR, "README.md"), "# ADRs\n");
|
|
172
|
+
}
|
|
173
|
+
function teardown() {
|
|
174
|
+
rmSync(TMP, { recursive: true, force: true });
|
|
175
|
+
}
|
|
176
|
+
// ── Assertions ────────────────────────────────────────────────────────
|
|
177
|
+
let passed = 0;
|
|
178
|
+
let failed = 0;
|
|
179
|
+
function assert(label, condition, detail) {
|
|
180
|
+
if (condition) {
|
|
181
|
+
console.log(` OK: ${label}`);
|
|
182
|
+
passed++;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.error(`FAIL: ${label}${detail ? ` — ${detail}` : ""}`);
|
|
186
|
+
failed++;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ── Run tests ─────────────────────────────────────────────────────────
|
|
190
|
+
setup();
|
|
191
|
+
try {
|
|
192
|
+
const model = loadDomainModel({ root: TMP });
|
|
193
|
+
const graph = DomainGraph.from(model);
|
|
194
|
+
// ── Node existence ───────────────────────────────────────────────
|
|
195
|
+
console.log("\n=== Node existence ===");
|
|
196
|
+
assert("actor.Customer node exists", graph.hasNode("actor.Customer"));
|
|
197
|
+
assert("actor.WarehouseBot node exists", graph.hasNode("actor.WarehouseBot"));
|
|
198
|
+
assert("context.ordering node exists", graph.hasNode("context.ordering"));
|
|
199
|
+
assert("context.shipping node exists", graph.hasNode("context.shipping"));
|
|
200
|
+
assert("ordering.OrderPlaced node exists", graph.hasNode("ordering.OrderPlaced"));
|
|
201
|
+
assert("ordering.PlaceOrder node exists", graph.hasNode("ordering.PlaceOrder"));
|
|
202
|
+
assert("ordering.Order (aggregate) node exists", graph.hasNode("ordering.Order"));
|
|
203
|
+
assert("ordering.Order (glossary) exists", graph.hasNode("ordering.Order"));
|
|
204
|
+
assert("shipping.ShipmentStatus node exists", graph.hasNode("shipping.ShipmentStatus"));
|
|
205
|
+
assert("adr-0001 node exists", graph.hasNode("adr-0001"));
|
|
206
|
+
assert("adr-0002 node exists", graph.hasNode("adr-0002"));
|
|
207
|
+
assert("flow.PlaceAndShip node exists", graph.hasNode("flow.PlaceAndShip"));
|
|
208
|
+
assert("ordering.NotifyOnCancel (policy) exists", graph.hasNode("ordering.NotifyOnCancel"));
|
|
209
|
+
// ── Edge counts (sanity) ─────────────────────────────────────────
|
|
210
|
+
console.log("\n=== Edge existence ===");
|
|
211
|
+
assert("graph has edges", graph.edges.length > 0);
|
|
212
|
+
// ── getNeighbours ────────────────────────────────────────────────
|
|
213
|
+
console.log("\n=== getNeighbours ===");
|
|
214
|
+
const orderAggNeighbours = graph.getNeighbours("ordering.Order");
|
|
215
|
+
assert("Order aggregate neighbours include PlaceOrder", orderAggNeighbours.has("ordering.PlaceOrder"));
|
|
216
|
+
assert("Order aggregate neighbours include OrderPlaced", orderAggNeighbours.has("ordering.OrderPlaced"));
|
|
217
|
+
assert("Order aggregate neighbours include CancelOrder", orderAggNeighbours.has("ordering.CancelOrder"));
|
|
218
|
+
assert("Order aggregate neighbours include OrderCancelled", orderAggNeighbours.has("ordering.OrderCancelled"));
|
|
219
|
+
assert("Order aggregate neighbours include context.ordering", orderAggNeighbours.has("context.ordering"));
|
|
220
|
+
// Command → Actor
|
|
221
|
+
const placeOrderNeighbours = graph.getNeighbours("ordering.PlaceOrder");
|
|
222
|
+
assert("PlaceOrder neighbours include actor.Customer", placeOrderNeighbours.has("actor.Customer"));
|
|
223
|
+
// ReadModel → Event (subscribes_to)
|
|
224
|
+
const shipmentStatusNeighbours = graph.getNeighbours("shipping.ShipmentStatus");
|
|
225
|
+
assert("ShipmentStatus subscribes_to ShipmentDispatched", shipmentStatusNeighbours.has("shipping.ShipmentDispatched"));
|
|
226
|
+
// ReadModel → Actor (used_by)
|
|
227
|
+
assert("ShipmentStatus used_by Customer", shipmentStatusNeighbours.has("actor.Customer"));
|
|
228
|
+
// Policy → Event (triggers) and Command (emits)
|
|
229
|
+
const policyNeighbours = graph.getNeighbours("ordering.NotifyOnCancel");
|
|
230
|
+
assert("NotifyOnCancel triggered by OrderCancelled", policyNeighbours.has("ordering.OrderCancelled"));
|
|
231
|
+
assert("NotifyOnCancel emits SendNotification", policyNeighbours.has("ordering.SendNotification"));
|
|
232
|
+
// ADR → domain_ref
|
|
233
|
+
const adr0001Neighbours = graph.getNeighbours("adr-0001");
|
|
234
|
+
assert("adr-0001 linked to ordering.Order", adr0001Neighbours.has("ordering.Order"));
|
|
235
|
+
// ADR superseded_by
|
|
236
|
+
const adr0002Neighbours = graph.getNeighbours("adr-0002");
|
|
237
|
+
assert("adr-0002 superseded_by adr-0001", adr0002Neighbours.has("adr-0001"));
|
|
238
|
+
// Flow steps
|
|
239
|
+
const flowNeighbours = graph.getNeighbours("flow.PlaceAndShip");
|
|
240
|
+
assert("flow linked to ordering.PlaceOrder", flowNeighbours.has("ordering.PlaceOrder"));
|
|
241
|
+
assert("flow linked to ordering.OrderPlaced", flowNeighbours.has("ordering.OrderPlaced"));
|
|
242
|
+
assert("flow linked to shipping.ShipOrder", flowNeighbours.has("shipping.ShipOrder"));
|
|
243
|
+
// Flow consecutive steps linked
|
|
244
|
+
const placeOrderFlowNeighbours = graph.getNeighbours("ordering.PlaceOrder");
|
|
245
|
+
assert("PlaceOrder flow_next to OrderPlaced", placeOrderFlowNeighbours.has("ordering.OrderPlaced"));
|
|
246
|
+
const orderPlacedFlowNeighbours = graph.getNeighbours("ordering.OrderPlaced");
|
|
247
|
+
assert("OrderPlaced flow_next to ShipOrder", orderPlacedFlowNeighbours.has("shipping.ShipOrder"));
|
|
248
|
+
// Glossary adr_ref
|
|
249
|
+
const orderGlossaryNeighbours = graph.getNeighbours("ordering.Order");
|
|
250
|
+
assert("Order glossary/aggregate linked to adr-0001", orderGlossaryNeighbours.has("adr-0001"));
|
|
251
|
+
// ── getRelated (depth traversal) ─────────────────────────────────
|
|
252
|
+
console.log("\n=== getRelated (BFS depth) ===");
|
|
253
|
+
// depth 0 equivalent — returns empty
|
|
254
|
+
const related0 = graph.getRelated("ordering.PlaceOrder", 0);
|
|
255
|
+
assert("depth 0 returns empty set", related0.size === 0);
|
|
256
|
+
// depth 1 — immediate neighbours
|
|
257
|
+
const related1 = graph.getRelated("ordering.PlaceOrder", 1);
|
|
258
|
+
assert("depth 1 includes actor.Customer", related1.has("actor.Customer"));
|
|
259
|
+
assert("depth 1 includes ordering.Order", related1.has("ordering.Order"));
|
|
260
|
+
assert("depth 1 includes context.ordering", related1.has("context.ordering"));
|
|
261
|
+
// depth 2 — two hops out
|
|
262
|
+
const related2 = graph.getRelated("ordering.PlaceOrder", 2);
|
|
263
|
+
assert("depth 2 includes OrderPlaced (via Order aggregate)", related2.has("ordering.OrderPlaced"));
|
|
264
|
+
// actor.Customer → shipping.ShipmentStatus (via used_by)
|
|
265
|
+
assert("depth 2 includes ShipmentStatus (via Customer)", related2.has("shipping.ShipmentStatus"));
|
|
266
|
+
// ── Unknown node ──────────────────────────────────────────────────
|
|
267
|
+
console.log("\n=== Edge cases ===");
|
|
268
|
+
const unknownRelated = graph.getRelated("nonexistent.Node", 1);
|
|
269
|
+
assert("unknown node returns empty set", unknownRelated.size === 0);
|
|
270
|
+
assert("hasNode returns false for unknown", !graph.hasNode("nonexistent.Node"));
|
|
271
|
+
// ── Empty model ───────────────────────────────────────────────────
|
|
272
|
+
console.log("\n=== Empty model ===");
|
|
273
|
+
const emptyTmp = join(tmpdir(), `dkk-graph-empty-${Date.now()}`);
|
|
274
|
+
mkdirSync(join(emptyTmp, "domain", "contexts"), { recursive: true });
|
|
275
|
+
mkdirSync(join(emptyTmp, "docs", "adr"), { recursive: true });
|
|
276
|
+
writeFileSync(join(emptyTmp, "domain", "index.yml"), "contexts: []\n");
|
|
277
|
+
writeFileSync(join(emptyTmp, "domain", "actors.yml"), "actors: []\n");
|
|
278
|
+
const emptyModel = loadDomainModel({ root: emptyTmp });
|
|
279
|
+
const emptyGraph = DomainGraph.from(emptyModel);
|
|
280
|
+
assert("empty graph has 0 nodes", emptyGraph.nodes.size === 0);
|
|
281
|
+
assert("empty graph has 0 edges", emptyGraph.edges.length === 0);
|
|
282
|
+
rmSync(emptyTmp, { recursive: true, force: true });
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
teardown();
|
|
286
|
+
}
|
|
287
|
+
// ── Summary ───────────────────────────────────────────────────────────
|
|
288
|
+
console.log(`\n${passed} passed, ${failed} failed`);
|
|
289
|
+
if (failed > 0)
|
|
290
|
+
process.exit(1);
|
|
291
|
+
//# sourceMappingURL=graph.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.test.js","sourceRoot":"","sources":["../../../src/shared/tests/graph.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../../src/shared/tests/loader.test.ts"],"names":[],"mappings":""}
|