@living-architecture/riviere-extract-config 0.5.3 → 0.5.4
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/extraction-config-schema.d.ts +20 -5
- package/dist/extraction-config-schema.d.ts.map +1 -1
- package/dist/validation-fixtures.d.ts.map +1 -1
- package/dist/validation-fixtures.js +0 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +53 -5
- package/extraction-config.schema.json +43 -7
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ export type FindTarget = 'classes' | 'methods' | 'functions';
|
|
|
6
6
|
* Standard architectural component types recognized by the Riviere extractor.
|
|
7
7
|
* Each type represents a distinct role in the system's flow-based architecture.
|
|
8
8
|
*/
|
|
9
|
-
export type ComponentType = 'api' | 'useCase' | 'domainOp' | 'event' | 'eventHandler' | '
|
|
9
|
+
export type ComponentType = 'api' | 'useCase' | 'domainOp' | 'event' | 'eventHandler' | 'ui';
|
|
10
10
|
/** Matches elements with a specific decorator. */
|
|
11
11
|
export interface HasDecoratorPredicate {
|
|
12
12
|
hasDecorator: {
|
|
@@ -198,9 +198,25 @@ export interface ConnectionPattern {
|
|
|
198
198
|
extract?: ConnectionExtractBlock;
|
|
199
199
|
linkType: ConnectionLinkType;
|
|
200
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Declares a custom component type as an event publisher.
|
|
203
|
+
* The component type must be defined in customTypes in at least one module.
|
|
204
|
+
*/
|
|
205
|
+
export interface EventPublisherConfig {
|
|
206
|
+
/** The custom component type name (e.g. 'eventPublisher'). */
|
|
207
|
+
fromType: string;
|
|
208
|
+
/** The metadata key on this component type that holds the published event type name. */
|
|
209
|
+
metadataKey: string;
|
|
210
|
+
}
|
|
201
211
|
/** Connection detection configuration with pattern definitions. */
|
|
202
212
|
export interface ConnectionsConfig {
|
|
203
|
-
patterns
|
|
213
|
+
patterns?: ConnectionPattern[];
|
|
214
|
+
/** Declares which custom component types publish events and how to detect them. */
|
|
215
|
+
eventPublishers?: EventPublisherConfig[];
|
|
216
|
+
}
|
|
217
|
+
/** Module-level connection detection configuration (patterns only — eventPublishers is top-level only). */
|
|
218
|
+
export interface ModuleConnectionsConfig {
|
|
219
|
+
patterns?: ConnectionPattern[];
|
|
204
220
|
}
|
|
205
221
|
/**
|
|
206
222
|
* Reference to an external module definition file.
|
|
@@ -224,10 +240,9 @@ export interface ModuleConfig {
|
|
|
224
240
|
domainOp?: ComponentRule;
|
|
225
241
|
event?: ComponentRule;
|
|
226
242
|
eventHandler?: ComponentRule;
|
|
227
|
-
eventPublisher?: ComponentRule;
|
|
228
243
|
ui?: ComponentRule;
|
|
229
244
|
customTypes?: CustomTypes;
|
|
230
|
-
connections?:
|
|
245
|
+
connections?: ModuleConnectionsConfig;
|
|
231
246
|
}
|
|
232
247
|
/**
|
|
233
248
|
* A fully resolved module with all component rules.
|
|
@@ -242,7 +257,6 @@ export interface Module {
|
|
|
242
257
|
domainOp: ComponentRule;
|
|
243
258
|
event: ComponentRule;
|
|
244
259
|
eventHandler: ComponentRule;
|
|
245
|
-
eventPublisher: ComponentRule;
|
|
246
260
|
ui: ComponentRule;
|
|
247
261
|
customTypes?: CustomTypes;
|
|
248
262
|
}
|
|
@@ -263,5 +277,6 @@ export interface ExtractionConfig {
|
|
|
263
277
|
export interface ResolvedExtractionConfig {
|
|
264
278
|
$schema?: string;
|
|
265
279
|
modules: Module[];
|
|
280
|
+
connections?: ConnectionsConfig;
|
|
266
281
|
}
|
|
267
282
|
//# sourceMappingURL=extraction-config-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extraction-config-schema.d.ts","sourceRoot":"","sources":["../src/extraction-config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAA;AAE5D;;;GAGG;AACH,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"extraction-config-schema.d.ts","sourceRoot":"","sources":["../src/extraction-config-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-fixtures.d.ts","sourceRoot":"","sources":["../src/validation-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EACnD,MAAM,4BAA4B,CAAA;AAEnC,wBAAgB,uBAAuB,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"validation-fixtures.d.ts","sourceRoot":"","sources":["../src/validation-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,EACnD,MAAM,4BAA4B,CAAA;AAEnC,wBAAgB,uBAAuB,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAW9D;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAW5D;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED,wBAAgB,oBAAoB,IAAI,wBAAwB,CAE/D;AAED,wBAAgB,mBAAmB,IAAI;IACrC,MAAM,EAAE,gBAAgB,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;CACf,CAOA;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAoCnD"}
|
|
@@ -7,7 +7,6 @@ export function createModuleWithoutPath() {
|
|
|
7
7
|
domainOp: { notUsed: true },
|
|
8
8
|
event: { notUsed: true },
|
|
9
9
|
eventHandler: { notUsed: true },
|
|
10
|
-
eventPublisher: { notUsed: true },
|
|
11
10
|
ui: { notUsed: true },
|
|
12
11
|
};
|
|
13
12
|
}
|
|
@@ -20,7 +19,6 @@ export function createModuleWithoutApi() {
|
|
|
20
19
|
domainOp: { notUsed: true },
|
|
21
20
|
event: { notUsed: true },
|
|
22
21
|
eventHandler: { notUsed: true },
|
|
23
|
-
eventPublisher: { notUsed: true },
|
|
24
22
|
ui: { notUsed: true },
|
|
25
23
|
};
|
|
26
24
|
}
|
|
@@ -34,7 +32,6 @@ export function createMinimalModule() {
|
|
|
34
32
|
domainOp: { notUsed: true },
|
|
35
33
|
event: { notUsed: true },
|
|
36
34
|
eventHandler: { notUsed: true },
|
|
37
|
-
eventPublisher: { notUsed: true },
|
|
38
35
|
ui: { notUsed: true },
|
|
39
36
|
};
|
|
40
37
|
}
|
|
@@ -84,7 +81,6 @@ export function createFullConfig() {
|
|
|
84
81
|
find: 'classes',
|
|
85
82
|
where: { implementsInterface: { name: 'EventHandler' } },
|
|
86
83
|
},
|
|
87
|
-
eventPublisher: { notUsed: true },
|
|
88
84
|
ui: { notUsed: true },
|
|
89
85
|
},
|
|
90
86
|
],
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,gBAAgB,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,gBAAgB,EAGjB,MAAM,4BAA4B,CAAA;AA8BnC;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,gBAAgB,CAE/E;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED,4DAA4D;AAC5D,qBAAa,+BAAgC,SAAQ,KAAK;aAE5B,MAAM,EAAE,eAAe,EAAE;IADrD,mEAAmE;gBACvC,MAAM,EAAE,eAAe,EAAE;CAItD;AASD,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,EAAE,CAQzF;AA0HD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAa9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAqBxE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAMrE"}
|
package/dist/validation.js
CHANGED
|
@@ -9,7 +9,6 @@ const REQUIRED_FIELDS = {
|
|
|
9
9
|
api: ['apiType'],
|
|
10
10
|
event: ['eventName'],
|
|
11
11
|
eventHandler: ['subscribedEvents'],
|
|
12
|
-
eventPublisher: [],
|
|
13
12
|
domainOp: ['operationName'],
|
|
14
13
|
ui: ['route'],
|
|
15
14
|
useCase: [],
|
|
@@ -20,7 +19,6 @@ const COMPONENT_TYPES = [
|
|
|
20
19
|
'domainOp',
|
|
21
20
|
'event',
|
|
22
21
|
'eventHandler',
|
|
23
|
-
'eventPublisher',
|
|
24
22
|
'ui',
|
|
25
23
|
];
|
|
26
24
|
const ajv = new Ajv({ allErrors: true });
|
|
@@ -110,6 +108,56 @@ function validateAllExtractionRules(config) {
|
|
|
110
108
|
return validateModuleExtractionRules(module, index);
|
|
111
109
|
});
|
|
112
110
|
}
|
|
111
|
+
function collectCustomTypeExtractedFields(config) {
|
|
112
|
+
const fieldsByType = new Map();
|
|
113
|
+
for (const module of config.modules) {
|
|
114
|
+
if ('$ref' in module || module.customTypes === undefined) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
for (const [typeName, rule] of Object.entries(module.customTypes)) {
|
|
118
|
+
const existing = fieldsByType.get(typeName) ?? new Set();
|
|
119
|
+
for (const key of Object.keys(rule.extract ?? {})) {
|
|
120
|
+
existing.add(key);
|
|
121
|
+
}
|
|
122
|
+
fieldsByType.set(typeName, existing);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return fieldsByType;
|
|
126
|
+
}
|
|
127
|
+
function validateEventPublishers(connections, customTypeFields) {
|
|
128
|
+
if (connections.eventPublishers === undefined) {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
return connections.eventPublishers.flatMap((publisher, index) => {
|
|
132
|
+
const extractedFields = customTypeFields.get(publisher.fromType);
|
|
133
|
+
if (extractedFields === undefined) {
|
|
134
|
+
return [
|
|
135
|
+
{
|
|
136
|
+
path: `/connections/eventPublishers/${index}/fromType`,
|
|
137
|
+
message: `"${publisher.fromType}" is not defined as a customType in any module. ` +
|
|
138
|
+
`Add a customType named "${publisher.fromType}" to at least one module.`,
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
if (!extractedFields.has(publisher.metadataKey)) {
|
|
143
|
+
return [
|
|
144
|
+
{
|
|
145
|
+
path: `/connections/eventPublishers/${index}/fromType`,
|
|
146
|
+
message: `customType "${publisher.fromType}" does not extract "${publisher.metadataKey}". ` +
|
|
147
|
+
`Add extract["${publisher.metadataKey}"] to that custom type.`,
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
return [];
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function validateConnectionsConfig(config) {
|
|
155
|
+
if (config.connections === undefined) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
const customTypeFields = collectCustomTypeExtractedFields(config);
|
|
159
|
+
return validateEventPublishers(config.connections, customTypeFields);
|
|
160
|
+
}
|
|
113
161
|
/**
|
|
114
162
|
* Validates data against the ExtractionConfig JSON Schema only.
|
|
115
163
|
* Does NOT check semantic rules like required extraction fields.
|
|
@@ -144,7 +192,7 @@ export function validateExtractionConfig(data) {
|
|
|
144
192
|
return validateExtractionConfigSchema(data);
|
|
145
193
|
}
|
|
146
194
|
// data is now narrowed to ExtractionConfig
|
|
147
|
-
const semanticErrors = validateAllExtractionRules(data);
|
|
195
|
+
const semanticErrors = [...validateAllExtractionRules(data), ...validateConnectionsConfig(data)];
|
|
148
196
|
if (semanticErrors.length > 0) {
|
|
149
197
|
return {
|
|
150
198
|
valid: false,
|
|
@@ -171,9 +219,9 @@ export function formatValidationErrors(errors) {
|
|
|
171
219
|
* @throws ExtractionConfigValidationError if validation fails.
|
|
172
220
|
*/
|
|
173
221
|
export function parseExtractionConfig(data) {
|
|
174
|
-
|
|
222
|
+
const result = validateExtractionConfig(data);
|
|
223
|
+
if (result.valid && isValidExtractionConfig(data)) {
|
|
175
224
|
return data;
|
|
176
225
|
}
|
|
177
|
-
const result = validateExtractionConfig(data);
|
|
178
226
|
throw new ExtractionConfigValidationError(result.errors);
|
|
179
227
|
}
|
|
@@ -87,10 +87,6 @@
|
|
|
87
87
|
"$ref": "#/$defs/componentRule",
|
|
88
88
|
"description": "Detection rule for EventHandler components"
|
|
89
89
|
},
|
|
90
|
-
"eventPublisher": {
|
|
91
|
-
"$ref": "#/$defs/componentRule",
|
|
92
|
-
"description": "Detection rule for EventPublisher components"
|
|
93
|
-
},
|
|
94
90
|
"ui": {
|
|
95
91
|
"$ref": "#/$defs/componentRule",
|
|
96
92
|
"description": "Detection rule for UI components"
|
|
@@ -103,7 +99,7 @@
|
|
|
103
99
|
}
|
|
104
100
|
},
|
|
105
101
|
"connections": {
|
|
106
|
-
"$ref": "#/$defs/
|
|
102
|
+
"$ref": "#/$defs/moduleConnectionsConfig",
|
|
107
103
|
"description": "Module-level connection detection patterns additive to global"
|
|
108
104
|
}
|
|
109
105
|
},
|
|
@@ -113,7 +109,7 @@
|
|
|
113
109
|
}
|
|
114
110
|
},
|
|
115
111
|
"then": {
|
|
116
|
-
"required": ["api", "useCase", "domainOp", "event", "eventHandler", "
|
|
112
|
+
"required": ["api", "useCase", "domainOp", "event", "eventHandler", "ui"]
|
|
117
113
|
}
|
|
118
114
|
},
|
|
119
115
|
"componentRule": {
|
|
@@ -607,7 +603,6 @@
|
|
|
607
603
|
"connectionsConfig": {
|
|
608
604
|
"type": "object",
|
|
609
605
|
"description": "Connection detection configuration with pattern definitions",
|
|
610
|
-
"required": ["patterns"],
|
|
611
606
|
"additionalProperties": false,
|
|
612
607
|
"properties": {
|
|
613
608
|
"patterns": {
|
|
@@ -617,6 +612,47 @@
|
|
|
617
612
|
"items": {
|
|
618
613
|
"$ref": "#/$defs/connectionPattern"
|
|
619
614
|
}
|
|
615
|
+
},
|
|
616
|
+
"eventPublishers": {
|
|
617
|
+
"type": "array",
|
|
618
|
+
"description": "Declares which custom component types publish events and how to detect the connections",
|
|
619
|
+
"minItems": 1,
|
|
620
|
+
"items": {
|
|
621
|
+
"$ref": "#/$defs/eventPublisherConfig"
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
},
|
|
626
|
+
"moduleConnectionsConfig": {
|
|
627
|
+
"type": "object",
|
|
628
|
+
"description": "Module-level connection detection configuration (patterns only — eventPublishers is top-level only)",
|
|
629
|
+
"additionalProperties": false,
|
|
630
|
+
"properties": {
|
|
631
|
+
"patterns": {
|
|
632
|
+
"type": "array",
|
|
633
|
+
"description": "Connection detection patterns",
|
|
634
|
+
"minItems": 1,
|
|
635
|
+
"items": {
|
|
636
|
+
"$ref": "#/$defs/connectionPattern"
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
},
|
|
641
|
+
"eventPublisherConfig": {
|
|
642
|
+
"type": "object",
|
|
643
|
+
"description": "Declares a custom component type as an event publisher",
|
|
644
|
+
"required": ["fromType", "metadataKey"],
|
|
645
|
+
"additionalProperties": false,
|
|
646
|
+
"properties": {
|
|
647
|
+
"fromType": {
|
|
648
|
+
"type": "string",
|
|
649
|
+
"description": "The custom component type name — must be defined in customTypes in at least one module",
|
|
650
|
+
"minLength": 1
|
|
651
|
+
},
|
|
652
|
+
"metadataKey": {
|
|
653
|
+
"type": "string",
|
|
654
|
+
"description": "The metadata key on this component type that holds the published event type name",
|
|
655
|
+
"minLength": 1
|
|
620
656
|
}
|
|
621
657
|
}
|
|
622
658
|
},
|