@cwygoda/service-catalog-core 1.0.1
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/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.d.ts +14 -0
- package/dist/adapters/loaders/filesystem.loader.d.ts.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.js +95 -0
- package/dist/adapters/loaders/filesystem.loader.js.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.test.d.ts +2 -0
- package/dist/adapters/loaders/filesystem.loader.test.d.ts.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.test.js +222 -0
- package/dist/adapters/loaders/filesystem.loader.test.js.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.d.ts +21 -0
- package/dist/adapters/parsers/bpmn-txt.parser.d.ts.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.js +56 -0
- package/dist/adapters/parsers/bpmn-txt.parser.js.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.d.ts +2 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.d.ts.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.js +71 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.js.map +1 -0
- package/dist/adapters/parsers/toml.parser.d.ts +26 -0
- package/dist/adapters/parsers/toml.parser.d.ts.map +1 -0
- package/dist/adapters/parsers/toml.parser.js +165 -0
- package/dist/adapters/parsers/toml.parser.js.map +1 -0
- package/dist/adapters/parsers/toml.parser.test.d.ts +2 -0
- package/dist/adapters/parsers/toml.parser.test.d.ts.map +1 -0
- package/dist/adapters/parsers/toml.parser.test.js +197 -0
- package/dist/adapters/parsers/toml.parser.test.js.map +1 -0
- package/dist/adapters/persistence/json.writer.d.ts +7 -0
- package/dist/adapters/persistence/json.writer.d.ts.map +1 -0
- package/dist/adapters/persistence/json.writer.js +14 -0
- package/dist/adapters/persistence/json.writer.js.map +1 -0
- package/dist/adapters/persistence/json.writer.test.d.ts +2 -0
- package/dist/adapters/persistence/json.writer.test.d.ts.map +1 -0
- package/dist/adapters/persistence/json.writer.test.js +78 -0
- package/dist/adapters/persistence/json.writer.test.js.map +1 -0
- package/dist/domain/catalog.d.ts +22 -0
- package/dist/domain/catalog.d.ts.map +1 -0
- package/dist/domain/catalog.js +34 -0
- package/dist/domain/catalog.js.map +1 -0
- package/dist/domain/catalog.test.d.ts +2 -0
- package/dist/domain/catalog.test.d.ts.map +1 -0
- package/dist/domain/catalog.test.js +269 -0
- package/dist/domain/catalog.test.js.map +1 -0
- package/dist/domain/connection.d.ts +23 -0
- package/dist/domain/connection.d.ts.map +1 -0
- package/dist/domain/connection.js +43 -0
- package/dist/domain/connection.js.map +1 -0
- package/dist/domain/connection.test.d.ts +2 -0
- package/dist/domain/connection.test.d.ts.map +1 -0
- package/dist/domain/connection.test.js +94 -0
- package/dist/domain/connection.test.js.map +1 -0
- package/dist/domain/domain.d.ts +9 -0
- package/dist/domain/domain.d.ts.map +1 -0
- package/dist/domain/domain.js +26 -0
- package/dist/domain/domain.js.map +1 -0
- package/dist/domain/domain.test.d.ts +2 -0
- package/dist/domain/domain.test.d.ts.map +1 -0
- package/dist/domain/domain.test.js +92 -0
- package/dist/domain/domain.test.js.map +1 -0
- package/dist/domain/graph.d.ts +18 -0
- package/dist/domain/graph.d.ts.map +1 -0
- package/dist/domain/graph.js +2 -0
- package/dist/domain/graph.js.map +1 -0
- package/dist/domain/index.d.ts +7 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/service.d.ts +19 -0
- package/dist/domain/service.d.ts.map +1 -0
- package/dist/domain/service.js +36 -0
- package/dist/domain/service.js.map +1 -0
- package/dist/domain/service.test.d.ts +2 -0
- package/dist/domain/service.test.d.ts.map +1 -0
- package/dist/domain/service.test.js +101 -0
- package/dist/domain/service.test.js.map +1 -0
- package/dist/domain/use-case.d.ts +36 -0
- package/dist/domain/use-case.d.ts.map +1 -0
- package/dist/domain/use-case.js +70 -0
- package/dist/domain/use-case.js.map +1 -0
- package/dist/domain/use-case.test.d.ts +2 -0
- package/dist/domain/use-case.test.d.ts.map +1 -0
- package/dist/domain/use-case.test.js +249 -0
- package/dist/domain/use-case.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/catalog-loader.port.d.ts +5 -0
- package/dist/ports/catalog-loader.port.d.ts.map +1 -0
- package/dist/ports/catalog-loader.port.js +2 -0
- package/dist/ports/catalog-loader.port.js.map +1 -0
- package/dist/ports/catalog-writer.port.d.ts +5 -0
- package/dist/ports/catalog-writer.port.d.ts.map +1 -0
- package/dist/ports/catalog-writer.port.js +2 -0
- package/dist/ports/catalog-writer.port.js.map +1 -0
- package/dist/ports/index.d.ts +3 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +3 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/schemas/catalog-config.schema.d.ts +12 -0
- package/dist/schemas/catalog-config.schema.d.ts.map +1 -0
- package/dist/schemas/catalog-config.schema.js +14 -0
- package/dist/schemas/catalog-config.schema.js.map +1 -0
- package/dist/schemas/catalog.schema.d.ts +123 -0
- package/dist/schemas/catalog.schema.d.ts.map +1 -0
- package/dist/schemas/catalog.schema.js +52 -0
- package/dist/schemas/catalog.schema.js.map +1 -0
- package/dist/schemas/connection.schema.d.ts +16 -0
- package/dist/schemas/connection.schema.d.ts.map +1 -0
- package/dist/schemas/connection.schema.js +15 -0
- package/dist/schemas/connection.schema.js.map +1 -0
- package/dist/schemas/connection.schema.test.d.ts +2 -0
- package/dist/schemas/connection.schema.test.d.ts.map +1 -0
- package/dist/schemas/connection.schema.test.js +73 -0
- package/dist/schemas/connection.schema.test.js.map +1 -0
- package/dist/schemas/domain.schema.d.ts +11 -0
- package/dist/schemas/domain.schema.d.ts.map +1 -0
- package/dist/schemas/domain.schema.js +10 -0
- package/dist/schemas/domain.schema.js.map +1 -0
- package/dist/schemas/domain.schema.test.d.ts +2 -0
- package/dist/schemas/domain.schema.test.d.ts.map +1 -0
- package/dist/schemas/domain.schema.test.js +95 -0
- package/dist/schemas/domain.schema.test.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/service.schema.d.ts +24 -0
- package/dist/schemas/service.schema.d.ts.map +1 -0
- package/dist/schemas/service.schema.js +16 -0
- package/dist/schemas/service.schema.js.map +1 -0
- package/dist/schemas/use-case.schema.d.ts +36 -0
- package/dist/schemas/use-case.schema.d.ts.map +1 -0
- package/dist/schemas/use-case.schema.js +24 -0
- package/dist/schemas/use-case.schema.js.map +1 -0
- package/dist/schemas/use-case.schema.test.d.ts +2 -0
- package/dist/schemas/use-case.schema.test.d.ts.map +1 -0
- package/dist/schemas/use-case.schema.test.js +152 -0
- package/dist/schemas/use-case.schema.test.js.map +1 -0
- package/dist/services/graph-builder.d.ts +21 -0
- package/dist/services/graph-builder.d.ts.map +1 -0
- package/dist/services/graph-builder.js +134 -0
- package/dist/services/graph-builder.js.map +1 -0
- package/dist/services/graph-builder.test.d.ts +2 -0
- package/dist/services/graph-builder.test.d.ts.map +1 -0
- package/dist/services/graph-builder.test.js +216 -0
- package/dist/services/graph-builder.test.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CatalogLoaderPort } from '../../ports/catalog-loader.port.js';
|
|
2
|
+
import type { Catalog } from '../../domain/catalog.js';
|
|
3
|
+
import type { BpmnLintLevel } from '../../schemas/catalog-config.schema.js';
|
|
4
|
+
export interface LoaderOptions {
|
|
5
|
+
bpmnLint?: BpmnLintLevel;
|
|
6
|
+
}
|
|
7
|
+
export declare class FilesystemLoader implements CatalogLoaderPort {
|
|
8
|
+
private options;
|
|
9
|
+
constructor(options?: LoaderOptions);
|
|
10
|
+
load(path: string): Promise<Catalog>;
|
|
11
|
+
private processBpmnSource;
|
|
12
|
+
}
|
|
13
|
+
export declare function createFilesystemLoader(options?: LoaderOptions): CatalogLoaderPort;
|
|
14
|
+
//# sourceMappingURL=filesystem.loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.loader.d.ts","sourceRoot":"","sources":["../../../src/adapters/loaders/filesystem.loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAcvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAM5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAuBD,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,GAAE,aAAkB;IAIjC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YA2C5B,iBAAiB;CA8BhC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAEjF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { createCatalog } from '../../domain/catalog.js';
|
|
4
|
+
import { parseToml, sidecarToService, parseUseCaseToml, sidecarToUseCase, parseDomainToml, sidecarToDomain, } from '../parsers/toml.parser.js';
|
|
5
|
+
import { parseBpmnTxt } from '../parsers/bpmn-txt.parser.js';
|
|
6
|
+
const SERVICE_FILENAME = 'service.toml';
|
|
7
|
+
const USE_CASE_FILENAME = 'use-case.toml';
|
|
8
|
+
const DOMAIN_FILENAME = 'domain.toml';
|
|
9
|
+
async function findFiles(dir, filename) {
|
|
10
|
+
const files = [];
|
|
11
|
+
async function walk(currentDir) {
|
|
12
|
+
const entries = await readdir(currentDir, { withFileTypes: true });
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
const fullPath = join(currentDir, entry.name);
|
|
15
|
+
if (entry.isDirectory()) {
|
|
16
|
+
await walk(fullPath);
|
|
17
|
+
}
|
|
18
|
+
else if (entry.isFile() && entry.name === filename) {
|
|
19
|
+
files.push(fullPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
await walk(dir);
|
|
24
|
+
return files;
|
|
25
|
+
}
|
|
26
|
+
export class FilesystemLoader {
|
|
27
|
+
options;
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
this.options = options;
|
|
30
|
+
}
|
|
31
|
+
async load(path) {
|
|
32
|
+
const stats = await stat(path);
|
|
33
|
+
if (!stats.isDirectory()) {
|
|
34
|
+
throw new Error(`Path is not a directory: ${path}`);
|
|
35
|
+
}
|
|
36
|
+
// Load services
|
|
37
|
+
const serviceFiles = await findFiles(path, SERVICE_FILENAME);
|
|
38
|
+
const services = [];
|
|
39
|
+
for (const filePath of serviceFiles) {
|
|
40
|
+
const content = await readFile(filePath, 'utf-8');
|
|
41
|
+
const sidecar = parseToml(content, filePath);
|
|
42
|
+
services.push(sidecarToService(sidecar));
|
|
43
|
+
}
|
|
44
|
+
// Load use cases
|
|
45
|
+
const useCaseFiles = await findFiles(path, USE_CASE_FILENAME);
|
|
46
|
+
const useCases = [];
|
|
47
|
+
for (const filePath of useCaseFiles) {
|
|
48
|
+
const content = await readFile(filePath, 'utf-8');
|
|
49
|
+
const sidecar = parseUseCaseToml(content, filePath);
|
|
50
|
+
const useCase = sidecarToUseCase(sidecar);
|
|
51
|
+
const processedUseCase = await this.processBpmnSource(useCase, dirname(filePath));
|
|
52
|
+
useCases.push(processedUseCase);
|
|
53
|
+
}
|
|
54
|
+
// Load domains
|
|
55
|
+
const domainFiles = await findFiles(path, DOMAIN_FILENAME);
|
|
56
|
+
const domains = [];
|
|
57
|
+
for (const filePath of domainFiles) {
|
|
58
|
+
const content = await readFile(filePath, 'utf-8');
|
|
59
|
+
const sidecar = parseDomainToml(content, filePath);
|
|
60
|
+
domains.push(sidecarToDomain(sidecar));
|
|
61
|
+
}
|
|
62
|
+
return createCatalog(services, useCases, domains);
|
|
63
|
+
}
|
|
64
|
+
async processBpmnSource(useCase, useCaseDir) {
|
|
65
|
+
if (!useCase.bpmnSource) {
|
|
66
|
+
return useCase;
|
|
67
|
+
}
|
|
68
|
+
const source = useCase.bpmnSource;
|
|
69
|
+
if (source.type === 'xml') {
|
|
70
|
+
return useCase;
|
|
71
|
+
}
|
|
72
|
+
// source.type === 'bpmn-txt'
|
|
73
|
+
let content;
|
|
74
|
+
let filePath;
|
|
75
|
+
if (source.content) {
|
|
76
|
+
content = source.content;
|
|
77
|
+
filePath = `${useCase.id} (inline bpmn)`;
|
|
78
|
+
}
|
|
79
|
+
else if (source.path) {
|
|
80
|
+
const resolvedPath = join(useCaseDir, source.path);
|
|
81
|
+
content = await readFile(resolvedPath, 'utf-8');
|
|
82
|
+
filePath = source.path;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return useCase;
|
|
86
|
+
}
|
|
87
|
+
const lintLevel = this.options.bpmnLint ?? 'warn';
|
|
88
|
+
const result = await parseBpmnTxt(content, filePath, lintLevel);
|
|
89
|
+
return { ...useCase, bpmn: result.xml };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function createFilesystemLoader(options) {
|
|
93
|
+
return new FilesystemLoader(options);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=filesystem.loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.loader.js","sourceRoot":"","sources":["../../../src/adapters/loaders/filesystem.loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.loader.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/loaders/filesystem.loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { FilesystemLoader } from './filesystem.loader.js';
|
|
6
|
+
describe('FilesystemLoader', () => {
|
|
7
|
+
let tempDir;
|
|
8
|
+
let loader;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
tempDir = await mkdtemp(join(tmpdir(), 'catalog-test-'));
|
|
11
|
+
loader = new FilesystemLoader();
|
|
12
|
+
});
|
|
13
|
+
afterEach(async () => {
|
|
14
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
15
|
+
});
|
|
16
|
+
it('loads empty catalog from empty directory', async () => {
|
|
17
|
+
const catalog = await loader.load(tempDir);
|
|
18
|
+
expect(catalog.services).toEqual([]);
|
|
19
|
+
expect(catalog.useCases).toEqual([]);
|
|
20
|
+
expect(catalog.domains).toEqual([]);
|
|
21
|
+
});
|
|
22
|
+
it('loads single service', async () => {
|
|
23
|
+
const serviceDir = join(tempDir, 'my-service');
|
|
24
|
+
await mkdir(serviceDir);
|
|
25
|
+
await writeFile(join(serviceDir, 'service.toml'), `[service]
|
|
26
|
+
id = "my-service"
|
|
27
|
+
name = "My Service"
|
|
28
|
+
description = "A test service"
|
|
29
|
+
`);
|
|
30
|
+
const catalog = await loader.load(tempDir);
|
|
31
|
+
expect(catalog.services).toHaveLength(1);
|
|
32
|
+
expect(catalog.services[0]).toEqual({
|
|
33
|
+
id: 'my-service',
|
|
34
|
+
name: 'My Service',
|
|
35
|
+
description: 'A test service',
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it('loads multiple services from nested directories', async () => {
|
|
39
|
+
// Create nested structure
|
|
40
|
+
const service1Dir = join(tempDir, 'services', 'auth');
|
|
41
|
+
const service2Dir = join(tempDir, 'services', 'billing');
|
|
42
|
+
await mkdir(service1Dir, { recursive: true });
|
|
43
|
+
await mkdir(service2Dir, { recursive: true });
|
|
44
|
+
await writeFile(join(service1Dir, 'service.toml'), `[service]
|
|
45
|
+
id = "auth"
|
|
46
|
+
name = "Auth"
|
|
47
|
+
description = "Auth service"
|
|
48
|
+
`);
|
|
49
|
+
await writeFile(join(service2Dir, 'service.toml'), `[service]
|
|
50
|
+
id = "billing"
|
|
51
|
+
name = "Billing"
|
|
52
|
+
description = "Billing service"
|
|
53
|
+
`);
|
|
54
|
+
const catalog = await loader.load(tempDir);
|
|
55
|
+
expect(catalog.services).toHaveLength(2);
|
|
56
|
+
const ids = catalog.services.map((s) => s.id).sort();
|
|
57
|
+
expect(ids).toEqual(['auth', 'billing']);
|
|
58
|
+
});
|
|
59
|
+
it('loads service with metadata', async () => {
|
|
60
|
+
const serviceDir = join(tempDir, 'versioned');
|
|
61
|
+
await mkdir(serviceDir);
|
|
62
|
+
await writeFile(join(serviceDir, 'service.toml'), `[service]
|
|
63
|
+
id = "versioned"
|
|
64
|
+
name = "Versioned Service"
|
|
65
|
+
description = "Has version"
|
|
66
|
+
|
|
67
|
+
[service.metadata]
|
|
68
|
+
version = "1.2.3"
|
|
69
|
+
`);
|
|
70
|
+
const catalog = await loader.load(tempDir);
|
|
71
|
+
expect(catalog.services[0]?.metadata?.version).toBe('1.2.3');
|
|
72
|
+
});
|
|
73
|
+
it('throws for non-directory path', async () => {
|
|
74
|
+
const filePath = join(tempDir, 'not-a-dir.txt');
|
|
75
|
+
await writeFile(filePath, 'content');
|
|
76
|
+
await expect(loader.load(filePath)).rejects.toThrow('Path is not a directory');
|
|
77
|
+
});
|
|
78
|
+
it('throws for non-existent path', async () => {
|
|
79
|
+
const badPath = join(tempDir, 'does-not-exist');
|
|
80
|
+
await expect(loader.load(badPath)).rejects.toThrow();
|
|
81
|
+
});
|
|
82
|
+
it('ignores non-service.toml files', async () => {
|
|
83
|
+
await writeFile(join(tempDir, 'readme.md'), '# Hello');
|
|
84
|
+
await writeFile(join(tempDir, 'other.toml'), '[other]\nkey = "value"');
|
|
85
|
+
const catalog = await loader.load(tempDir);
|
|
86
|
+
expect(catalog.services).toEqual([]);
|
|
87
|
+
expect(catalog.useCases).toEqual([]);
|
|
88
|
+
});
|
|
89
|
+
it('loads single use case', async () => {
|
|
90
|
+
const useCaseDir = join(tempDir, 'checkout');
|
|
91
|
+
await mkdir(useCaseDir);
|
|
92
|
+
await writeFile(join(useCaseDir, 'use-case.toml'), `[use_case]
|
|
93
|
+
id = "checkout"
|
|
94
|
+
name = "Customer Checkout"
|
|
95
|
+
description = "Checkout flow"
|
|
96
|
+
participants = []
|
|
97
|
+
steps = []
|
|
98
|
+
`);
|
|
99
|
+
const catalog = await loader.load(tempDir);
|
|
100
|
+
expect(catalog.useCases).toHaveLength(1);
|
|
101
|
+
expect(catalog.useCases[0]?.id).toBe('checkout');
|
|
102
|
+
expect(catalog.useCases[0]?.name).toBe('Customer Checkout');
|
|
103
|
+
});
|
|
104
|
+
it('loads use case with participants and steps', async () => {
|
|
105
|
+
const useCaseDir = join(tempDir, 'full-checkout');
|
|
106
|
+
await mkdir(useCaseDir);
|
|
107
|
+
await writeFile(join(useCaseDir, 'use-case.toml'), `[use_case]
|
|
108
|
+
id = "full-checkout"
|
|
109
|
+
name = "Full Checkout"
|
|
110
|
+
description = "Complete checkout"
|
|
111
|
+
bpmn = "./checkout.bpmn.txt"
|
|
112
|
+
|
|
113
|
+
[[use_case.participants]]
|
|
114
|
+
service = "order-service"
|
|
115
|
+
role = "Creates order"
|
|
116
|
+
|
|
117
|
+
[[use_case.steps]]
|
|
118
|
+
sequence = 1
|
|
119
|
+
actor = "Customer"
|
|
120
|
+
action = "Submit order"
|
|
121
|
+
`);
|
|
122
|
+
// Create bpmn-txt file
|
|
123
|
+
await writeFile(join(useCaseDir, 'checkout.bpmn.txt'), `process: checkout
|
|
124
|
+
start: begin
|
|
125
|
+
-> finish
|
|
126
|
+
end: finish
|
|
127
|
+
`);
|
|
128
|
+
const catalog = await loader.load(tempDir);
|
|
129
|
+
expect(catalog.useCases[0]?.participants).toHaveLength(1);
|
|
130
|
+
expect(catalog.useCases[0]?.steps).toHaveLength(1);
|
|
131
|
+
// bpmn field now contains generated XML
|
|
132
|
+
expect(catalog.useCases[0]?.bpmn).toContain('<?xml');
|
|
133
|
+
});
|
|
134
|
+
it('loads services and use cases together', async () => {
|
|
135
|
+
// Create service
|
|
136
|
+
const serviceDir = join(tempDir, 'services', 'order');
|
|
137
|
+
await mkdir(serviceDir, { recursive: true });
|
|
138
|
+
await writeFile(join(serviceDir, 'service.toml'), `[service]
|
|
139
|
+
id = "order-service"
|
|
140
|
+
name = "Order Service"
|
|
141
|
+
description = "Handles orders"
|
|
142
|
+
`);
|
|
143
|
+
// Create use case
|
|
144
|
+
const useCaseDir = join(tempDir, 'use-cases', 'checkout');
|
|
145
|
+
await mkdir(useCaseDir, { recursive: true });
|
|
146
|
+
await writeFile(join(useCaseDir, 'use-case.toml'), `[use_case]
|
|
147
|
+
id = "checkout"
|
|
148
|
+
name = "Checkout"
|
|
149
|
+
description = "Checkout flow"
|
|
150
|
+
participants = []
|
|
151
|
+
steps = []
|
|
152
|
+
`);
|
|
153
|
+
const catalog = await loader.load(tempDir);
|
|
154
|
+
expect(catalog.services).toHaveLength(1);
|
|
155
|
+
expect(catalog.useCases).toHaveLength(1);
|
|
156
|
+
expect(catalog.services[0]?.id).toBe('order-service');
|
|
157
|
+
expect(catalog.useCases[0]?.id).toBe('checkout');
|
|
158
|
+
});
|
|
159
|
+
it('loads single domain', async () => {
|
|
160
|
+
const domainDir = join(tempDir, 'commerce');
|
|
161
|
+
await mkdir(domainDir);
|
|
162
|
+
await writeFile(join(domainDir, 'domain.toml'), `[domain]
|
|
163
|
+
id = "commerce"
|
|
164
|
+
name = "Commerce"
|
|
165
|
+
description = "E-commerce domain"
|
|
166
|
+
`);
|
|
167
|
+
const catalog = await loader.load(tempDir);
|
|
168
|
+
expect(catalog.domains).toHaveLength(1);
|
|
169
|
+
expect(catalog.domains[0]?.id).toBe('commerce');
|
|
170
|
+
expect(catalog.domains[0]?.name).toBe('Commerce');
|
|
171
|
+
});
|
|
172
|
+
it('loads domain with parent', async () => {
|
|
173
|
+
const domainDir = join(tempDir, 'orders');
|
|
174
|
+
await mkdir(domainDir);
|
|
175
|
+
await writeFile(join(domainDir, 'domain.toml'), `[domain]
|
|
176
|
+
id = "orders"
|
|
177
|
+
name = "Orders"
|
|
178
|
+
description = "Order subdomain"
|
|
179
|
+
parent = "commerce"
|
|
180
|
+
`);
|
|
181
|
+
const catalog = await loader.load(tempDir);
|
|
182
|
+
expect(catalog.domains[0]?.parent).toBe('commerce');
|
|
183
|
+
});
|
|
184
|
+
it('loads services, use cases, and domains together', async () => {
|
|
185
|
+
// Create domain
|
|
186
|
+
const domainDir = join(tempDir, 'domains', 'commerce');
|
|
187
|
+
await mkdir(domainDir, { recursive: true });
|
|
188
|
+
await writeFile(join(domainDir, 'domain.toml'), `[domain]
|
|
189
|
+
id = "commerce"
|
|
190
|
+
name = "Commerce"
|
|
191
|
+
description = "E-commerce domain"
|
|
192
|
+
`);
|
|
193
|
+
// Create service
|
|
194
|
+
const serviceDir = join(tempDir, 'services', 'order');
|
|
195
|
+
await mkdir(serviceDir, { recursive: true });
|
|
196
|
+
await writeFile(join(serviceDir, 'service.toml'), `[service]
|
|
197
|
+
id = "order-service"
|
|
198
|
+
name = "Order Service"
|
|
199
|
+
description = "Handles orders"
|
|
200
|
+
domain = "commerce"
|
|
201
|
+
`);
|
|
202
|
+
// Create use case
|
|
203
|
+
const useCaseDir = join(tempDir, 'use-cases', 'checkout');
|
|
204
|
+
await mkdir(useCaseDir, { recursive: true });
|
|
205
|
+
await writeFile(join(useCaseDir, 'use-case.toml'), `[use_case]
|
|
206
|
+
id = "checkout"
|
|
207
|
+
name = "Checkout"
|
|
208
|
+
description = "Checkout flow"
|
|
209
|
+
domain = "commerce"
|
|
210
|
+
participants = []
|
|
211
|
+
steps = []
|
|
212
|
+
`);
|
|
213
|
+
const catalog = await loader.load(tempDir);
|
|
214
|
+
expect(catalog.domains).toHaveLength(1);
|
|
215
|
+
expect(catalog.services).toHaveLength(1);
|
|
216
|
+
expect(catalog.useCases).toHaveLength(1);
|
|
217
|
+
expect(catalog.domains[0]?.id).toBe('commerce');
|
|
218
|
+
expect(catalog.services[0]?.domain).toBe('commerce');
|
|
219
|
+
expect(catalog.useCases[0]?.domain).toBe('commerce');
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
//# sourceMappingURL=filesystem.loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.loader.test.js","sourceRoot":"","sources":["../../../src/adapters/loaders/filesystem.loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ParseError, type LintResult } from 'bpmn-txt';
|
|
2
|
+
import type { BpmnLintLevel } from '../../schemas/catalog-config.schema.js';
|
|
3
|
+
export interface BpmnTxtParseResult {
|
|
4
|
+
xml: string;
|
|
5
|
+
lintResults: LintResult[];
|
|
6
|
+
}
|
|
7
|
+
export declare class BpmnTxtParseError extends Error {
|
|
8
|
+
readonly filePath: string;
|
|
9
|
+
readonly errors: ParseError[];
|
|
10
|
+
constructor(message: string, filePath: string, errors: ParseError[]);
|
|
11
|
+
toString(): string;
|
|
12
|
+
}
|
|
13
|
+
export declare class BpmnLintError extends Error {
|
|
14
|
+
readonly filePath: string;
|
|
15
|
+
readonly results: LintResult[];
|
|
16
|
+
constructor(message: string, filePath: string, results: LintResult[]);
|
|
17
|
+
toString(): string;
|
|
18
|
+
}
|
|
19
|
+
export declare function detectBpmnTxtContent(content: string): boolean;
|
|
20
|
+
export declare function parseBpmnTxt(content: string, filePath: string, lintLevel?: BpmnLintLevel): Promise<BpmnTxtParseResult>;
|
|
21
|
+
//# sourceMappingURL=bpmn-txt.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpmn-txt.parser.d.ts","sourceRoot":"","sources":["../../../src/adapters/parsers/bpmn-txt.parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAE5E,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,UAAU,EAAE;gBAFpC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAAE;IAM7B,QAAQ,IAAI,MAAM;CAM5B;AAED,qBAAa,aAAc,SAAQ,KAAK;aAGpB,QAAQ,EAAE,MAAM;aAChB,OAAO,EAAE,UAAU,EAAE;gBAFrC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,EAAE;IAM9B,QAAQ,IAAI,MAAM;CAM5B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,aAAsB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAsB7B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { parse, toBpmnXmlAsync, lint } from 'bpmn-txt';
|
|
2
|
+
export class BpmnTxtParseError extends Error {
|
|
3
|
+
filePath;
|
|
4
|
+
errors;
|
|
5
|
+
constructor(message, filePath, errors) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.filePath = filePath;
|
|
8
|
+
this.errors = errors;
|
|
9
|
+
this.name = 'BpmnTxtParseError';
|
|
10
|
+
}
|
|
11
|
+
toString() {
|
|
12
|
+
const errorDetails = this.errors
|
|
13
|
+
.map((e) => ` Line ${String(e.line)}:${String(e.column)}: ${e.message}`)
|
|
14
|
+
.join('\n');
|
|
15
|
+
return `${this.name}: ${this.message} at ${this.filePath}\n${errorDetails}`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class BpmnLintError extends Error {
|
|
19
|
+
filePath;
|
|
20
|
+
results;
|
|
21
|
+
constructor(message, filePath, results) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.filePath = filePath;
|
|
24
|
+
this.results = results;
|
|
25
|
+
this.name = 'BpmnLintError';
|
|
26
|
+
}
|
|
27
|
+
toString() {
|
|
28
|
+
const errorDetails = this.results
|
|
29
|
+
.map((r) => ` [${r.category}] ${r.id}: ${r.message} (${r.rule})`)
|
|
30
|
+
.join('\n');
|
|
31
|
+
return `${this.name}: ${this.message} at ${this.filePath}\n${errorDetails}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function detectBpmnTxtContent(content) {
|
|
35
|
+
const trimmed = content.trim();
|
|
36
|
+
return trimmed.startsWith('process:') || trimmed.startsWith('collaboration:');
|
|
37
|
+
}
|
|
38
|
+
export async function parseBpmnTxt(content, filePath, lintLevel = 'warn') {
|
|
39
|
+
const result = parse(content);
|
|
40
|
+
if (result.errors.length > 0 || !result.document) {
|
|
41
|
+
throw new BpmnTxtParseError('Failed to parse bpmn-txt', filePath, result.errors);
|
|
42
|
+
}
|
|
43
|
+
const xml = await toBpmnXmlAsync(result.document, { includeDiagram: true });
|
|
44
|
+
let lintResults = [];
|
|
45
|
+
if (lintLevel !== 'off') {
|
|
46
|
+
lintResults = await lint(xml);
|
|
47
|
+
if (lintLevel === 'error') {
|
|
48
|
+
const errors = lintResults.filter((r) => r.category === 'error');
|
|
49
|
+
if (errors.length > 0) {
|
|
50
|
+
throw new BpmnLintError('BPMN lint errors found', filePath, errors);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { xml, lintResults };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=bpmn-txt.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpmn-txt.parser.js","sourceRoot":"","sources":["../../../src/adapters/parsers/bpmn-txt.parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpmn-txt.parser.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/parsers/bpmn-txt.parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { detectBpmnTxtContent, parseBpmnTxt, BpmnTxtParseError } from './bpmn-txt.parser.js';
|
|
3
|
+
describe('bpmn-txt.parser', () => {
|
|
4
|
+
describe('detectBpmnTxtContent', () => {
|
|
5
|
+
it('detects process: prefix', () => {
|
|
6
|
+
expect(detectBpmnTxtContent('process: my-process\n')).toBe(true);
|
|
7
|
+
});
|
|
8
|
+
it('detects collaboration: prefix', () => {
|
|
9
|
+
expect(detectBpmnTxtContent('collaboration: my-collab\n')).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it('handles whitespace before content', () => {
|
|
12
|
+
expect(detectBpmnTxtContent(' \n process: test\n')).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it('returns false for XML content', () => {
|
|
15
|
+
expect(detectBpmnTxtContent('<?xml version="1.0"?>\n<bpmn:definitions')).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
it('returns false for file paths', () => {
|
|
18
|
+
expect(detectBpmnTxtContent('/bpmn/checkout.bpmn')).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it('returns false for empty content', () => {
|
|
21
|
+
expect(detectBpmnTxtContent('')).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('parseBpmnTxt', () => {
|
|
25
|
+
it('parses valid bpmn-txt to XML', async () => {
|
|
26
|
+
const input = `process: test
|
|
27
|
+
start: begin
|
|
28
|
+
-> finish
|
|
29
|
+
end: finish
|
|
30
|
+
`;
|
|
31
|
+
const result = await parseBpmnTxt(input, 'test.bpmn.txt', 'off');
|
|
32
|
+
expect(result.xml).toContain('<?xml');
|
|
33
|
+
expect(result.xml).toContain('bpmn:definitions');
|
|
34
|
+
expect(result.xml).toContain('bpmn:startEvent');
|
|
35
|
+
expect(result.xml).toContain('bpmn:endEvent');
|
|
36
|
+
});
|
|
37
|
+
it('returns lint results when linting enabled', async () => {
|
|
38
|
+
const input = `process: test
|
|
39
|
+
task: lonely-task
|
|
40
|
+
name: "No connections"
|
|
41
|
+
`;
|
|
42
|
+
const result = await parseBpmnTxt(input, 'test.bpmn.txt', 'warn');
|
|
43
|
+
expect(result.lintResults.length).toBeGreaterThan(0);
|
|
44
|
+
});
|
|
45
|
+
it('skips linting when lint level is off', async () => {
|
|
46
|
+
const input = `process: test
|
|
47
|
+
task: lonely-task
|
|
48
|
+
`;
|
|
49
|
+
const result = await parseBpmnTxt(input, 'test.bpmn.txt', 'off');
|
|
50
|
+
expect(result.lintResults).toHaveLength(0);
|
|
51
|
+
});
|
|
52
|
+
it('throws BpmnTxtParseError for invalid syntax', async () => {
|
|
53
|
+
const input = `invalid syntax here`;
|
|
54
|
+
await expect(parseBpmnTxt(input, 'bad.bpmn.txt', 'off')).rejects.toThrow(BpmnTxtParseError);
|
|
55
|
+
});
|
|
56
|
+
it('includes file path in parse error', async () => {
|
|
57
|
+
const input = `process: test
|
|
58
|
+
invalid-keyword: foo
|
|
59
|
+
`;
|
|
60
|
+
try {
|
|
61
|
+
await parseBpmnTxt(input, 'my-file.bpmn.txt', 'off');
|
|
62
|
+
expect.fail('Should have thrown');
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
expect(e).toBeInstanceOf(BpmnTxtParseError);
|
|
66
|
+
expect(e.filePath).toBe('my-file.bpmn.txt');
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=bpmn-txt.parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bpmn-txt.parser.test.js","sourceRoot":"","sources":["../../../src/adapters/parsers/bpmn-txt.parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ServiceSidecar } from '../../schemas/service.schema.js';
|
|
2
|
+
import { type UseCaseSidecar } from '../../schemas/use-case.schema.js';
|
|
3
|
+
import { type DomainSidecar } from '../../schemas/domain.schema.js';
|
|
4
|
+
import type { Service } from '../../domain/service.js';
|
|
5
|
+
import type { UseCase } from '../../domain/use-case.js';
|
|
6
|
+
import type { Domain } from '../../domain/domain.js';
|
|
7
|
+
export declare class TomlParseError extends Error {
|
|
8
|
+
readonly filePath: string;
|
|
9
|
+
readonly line?: number | undefined;
|
|
10
|
+
readonly column?: number | undefined;
|
|
11
|
+
constructor(message: string, filePath: string, line?: number | undefined, column?: number | undefined);
|
|
12
|
+
toString(): string;
|
|
13
|
+
}
|
|
14
|
+
export declare class ValidationError extends Error {
|
|
15
|
+
readonly filePath: string;
|
|
16
|
+
readonly errors: string[];
|
|
17
|
+
constructor(message: string, filePath: string, errors: string[]);
|
|
18
|
+
toString(): string;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseToml(content: string, filePath: string): ServiceSidecar;
|
|
21
|
+
export declare function sidecarToService(sidecar: ServiceSidecar): Service;
|
|
22
|
+
export declare function parseUseCaseToml(content: string, filePath: string): UseCaseSidecar;
|
|
23
|
+
export declare function sidecarToUseCase(sidecar: UseCaseSidecar): UseCase;
|
|
24
|
+
export declare function parseDomainToml(content: string, filePath: string): DomainSidecar;
|
|
25
|
+
export declare function sidecarToDomain(sidecar: DomainSidecar): Domain;
|
|
26
|
+
//# sourceMappingURL=toml.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toml.parser.d.ts","sourceRoot":"","sources":["../../../src/adapters/parsers/toml.parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,0BAA0B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMrD,qBAAa,cAAe,SAAQ,KAAK;aAGrB,QAAQ,EAAE,MAAM;aAChB,IAAI,CAAC,EAAE,MAAM;aACb,MAAM,CAAC,EAAE,MAAM;gBAH/B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,MAAM,CAAC,EAAE,MAAM,YAAA;IAMxB,QAAQ,IAAI,MAAM;CAM5B;AAED,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM,EAAE;gBAFhC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE;IAMzB,QAAQ,IAAI,MAAM;CAG5B;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuB3E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAyBjE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBlF;AAeD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CA8BjE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAuBhF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAc9D"}
|