@living-architecture/riviere-extract-ts 0.4.4 → 0.4.6

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.
@@ -1,5 +1,6 @@
1
1
  import type { Project } from 'ts-morph';
2
2
  import type { ConnectionPattern, EventPublisherConfig } from '@living-architecture/riviere-extract-config';
3
+ import type { ExternalLink } from '@living-architecture/riviere-schema';
3
4
  import type { EnrichedComponent } from '../value-extraction/enrich-components';
4
5
  import type { GlobMatcher } from '../component-extraction/extractor';
5
6
  import type { ExtractedLink } from './extracted-link';
@@ -22,10 +23,13 @@ export interface ConnectionTimings {
22
23
  /** @riviere-role value-object */
23
24
  export interface ConnectionDetectionResult {
24
25
  links: ExtractedLink[];
26
+ externalLinks: ExternalLink[];
25
27
  timings: ConnectionTimings;
26
28
  }
27
29
  /** @riviere-role domain-service */
28
30
  export declare function deduplicateCrossStrategy(links: ExtractedLink[]): ExtractedLink[];
31
+ /** @riviere-role domain-service */
32
+ export declare function stripHttpCallComponents(components: readonly EnrichedComponent[]): EnrichedComponent[];
29
33
  /** @riviere-role value-object */
30
34
  export interface PerModuleConnectionOptions {
31
35
  allowIncomplete?: boolean;
@@ -42,6 +46,7 @@ export interface PerModuleTimings {
42
46
  /** @riviere-role value-object */
43
47
  export interface PerModuleDetectionResult {
44
48
  links: ExtractedLink[];
49
+ externalLinks: ExternalLink[];
45
50
  timings: PerModuleTimings;
46
51
  }
47
52
  /** @riviere-role domain-service */
@@ -59,6 +64,7 @@ export interface CrossModuleTimings {
59
64
  /** @riviere-role value-object */
60
65
  export interface CrossModuleDetectionResult {
61
66
  links: ExtractedLink[];
67
+ externalLinks: ExternalLink[];
62
68
  timings: CrossModuleTimings;
63
69
  }
64
70
  /** @riviere-role domain-service */
@@ -1 +1 @@
1
- {"version":3,"file":"detect-connections.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/connection-detection/detect-connections.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,6CAA6C,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAOrD,iCAAiC;AACjC,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC9B,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,OAAO,EAAE,iBAAiB,CAAA;CAC3B;AAaD,mCAAmC;AACnC,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAchF;AAED,iCAAiC;AACjC,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAED,mCAAmC;AACnC,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,SAAS,iBAAiB,EAAE,EACxC,OAAO,EAAE,0BAA0B,EACnC,WAAW,EAAE,WAAW,GACvB,wBAAwB,CAqC1B;AAED,iCAAiC;AACjC,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,kBAAkB;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAC;AAE9D,iCAAiC;AACjC,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AAED,mCAAmC;AACnC,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,OAAO,EAAE,4BAA4B,GACpC,0BAA0B,CAqB5B;AA8BD,mCAAmC;AACnC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,SAAS,iBAAiB,EAAE,EACxC,OAAO,EAAE,0BAA0B,EACnC,WAAW,EAAE,WAAW,GACvB,yBAAyB,CA2D3B"}
1
+ {"version":3,"file":"detect-connections.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/connection-detection/detect-connections.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { buildCallGraph } from './call-graph/build-call-graph';
4
4
  import { detectEventPublisherConnections } from './async-detection/detect-event-publisher-connections';
5
5
  import { detectSubscribeConnections } from './async-detection/detect-subscribe-connections';
6
6
  import { detectConfigurableConnections } from './configurable/detect-configurable-connections';
7
+ import { rewriteHttpCallLinks, stripHttpCallComponents as stripHttpCallComponentsInternal, } from './http-call-link-rewrite';
7
8
  function computeFilteredFilePaths(project, moduleGlobs, globMatcher) {
8
9
  return project
9
10
  .getSourceFiles()
@@ -27,6 +28,10 @@ export function deduplicateCrossStrategy(links) {
27
28
  return [...seen.values()];
28
29
  }
29
30
  /** @riviere-role domain-service */
31
+ export function stripHttpCallComponents(components) {
32
+ return stripHttpCallComponentsInternal(components);
33
+ }
34
+ /** @riviere-role domain-service */
30
35
  export function detectPerModuleConnections(project, components, options, globMatcher) {
31
36
  const setupStart = performance.now();
32
37
  const componentIndex = new ComponentIndex(components);
@@ -43,8 +48,10 @@ export function detectPerModuleConnections(project, components, options, globMat
43
48
  const callGraphMs = performance.now() - callGraphStart;
44
49
  const patterns = options.patterns ?? [];
45
50
  const { configurableLinks, configurableMs } = runConfigurableDetection(project, patterns, components, componentIndex, strict, repository);
51
+ const rewritten = rewriteHttpCallLinks([...syncLinks, ...configurableLinks], components);
46
52
  return {
47
- links: [...syncLinks, ...configurableLinks],
53
+ links: rewritten.links,
54
+ externalLinks: rewritten.externalLinks,
48
55
  timings: {
49
56
  callGraphMs,
50
57
  configurableMs,
@@ -66,6 +73,7 @@ export function detectCrossModuleConnections(allComponents, options) {
66
73
  const asyncDetectionMs = performance.now() - asyncStart;
67
74
  return {
68
75
  links: [...publishLinks, ...subscribeLinks],
76
+ externalLinks: [],
69
77
  timings: { asyncDetectionMs },
70
78
  };
71
79
  }
@@ -112,11 +120,13 @@ export function detectConnections(project, components, options, globMatcher) {
112
120
  const asyncDetectionMs = performance.now() - asyncStart;
113
121
  const patterns = options.patterns ?? [];
114
122
  const { configurableLinks, configurableMs } = runConfigurableDetection(project, patterns, components, componentIndex, strict, repository);
115
- const totalMs = performance.now() - totalStart;
116
123
  const allLinks = [...syncLinks, ...publishLinks, ...subscribeLinks, ...configurableLinks];
117
124
  const deduplicatedLinks = deduplicateCrossStrategy(allLinks);
125
+ const rewritten = rewriteHttpCallLinks(deduplicatedLinks, components);
126
+ const totalMs = performance.now() - totalStart;
118
127
  return {
119
- links: deduplicatedLinks,
128
+ links: rewritten.links,
129
+ externalLinks: rewritten.externalLinks,
120
130
  timings: {
121
131
  callGraphMs,
122
132
  asyncDetectionMs,
@@ -0,0 +1,13 @@
1
+ import type { ExternalLink } from '@living-architecture/riviere-schema';
2
+ import type { EnrichedComponent } from '../value-extraction/enrich-components';
3
+ import type { ExtractedLink } from './extracted-link';
4
+ /** @riviere-role value-object */
5
+ export interface HttpCallRewriteResult {
6
+ links: ExtractedLink[];
7
+ externalLinks: ExternalLink[];
8
+ }
9
+ /** @riviere-role domain-service */
10
+ export declare function rewriteHttpCallLinks(links: readonly ExtractedLink[], components: readonly EnrichedComponent[]): HttpCallRewriteResult;
11
+ /** @riviere-role domain-service */
12
+ export declare function stripHttpCallComponents(components: readonly EnrichedComponent[]): EnrichedComponent[];
13
+ //# sourceMappingURL=http-call-link-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-call-link-rewrite.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/connection-detection/http-call-link-rewrite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAIrD,iCAAiC;AACjC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,aAAa,EAAE,YAAY,EAAE,CAAA;CAC9B;AA+ED,mCAAmC;AACnC,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,UAAU,EAAE,SAAS,iBAAiB,EAAE,GACvC,qBAAqB,CA2CvB;AAED,mCAAmC;AACnC,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,iBAAiB,EAAE,GACvC,iBAAiB,EAAE,CAErB"}
@@ -0,0 +1,105 @@
1
+ import { componentIdentity } from './call-graph/call-graph-types';
2
+ import { ConnectionDetectionError } from './connection-detection-error';
3
+ function mapComponentsByIdentity(components) {
4
+ const byIdentity = new Map();
5
+ for (const component of components) {
6
+ byIdentity.set(componentIdentity(component), component);
7
+ }
8
+ return byIdentity;
9
+ }
10
+ function mapInternalComponentsByName(components) {
11
+ const byName = new Map();
12
+ for (const component of components) {
13
+ if (component.type === 'httpCall') {
14
+ continue;
15
+ }
16
+ const existing = byName.get(component.name);
17
+ if (existing === undefined) {
18
+ byName.set(component.name, [component]);
19
+ continue;
20
+ }
21
+ existing.push(component);
22
+ }
23
+ return byName;
24
+ }
25
+ function parseServiceName(httpCallComponent) {
26
+ const rawServiceName = httpCallComponent.metadata['serviceName'];
27
+ if (typeof rawServiceName === 'string' && rawServiceName.trim().length > 0) {
28
+ return rawServiceName;
29
+ }
30
+ throw new ConnectionDetectionError({
31
+ file: httpCallComponent.location.file,
32
+ line: httpCallComponent.location.line,
33
+ typeName: componentIdentity(httpCallComponent),
34
+ reason: `Expected metadata.serviceName to be a non-empty string, got ${JSON.stringify(rawServiceName)}`,
35
+ });
36
+ }
37
+ function parseRoute(httpCallComponent) {
38
+ const rawRoute = httpCallComponent.metadata['route'];
39
+ if (rawRoute === undefined) {
40
+ return undefined;
41
+ }
42
+ if (typeof rawRoute === 'string' && rawRoute.trim().length > 0) {
43
+ return rawRoute;
44
+ }
45
+ throw new ConnectionDetectionError({
46
+ file: httpCallComponent.location.file,
47
+ line: httpCallComponent.location.line,
48
+ typeName: componentIdentity(httpCallComponent),
49
+ reason: `Expected metadata.route to be a non-empty string when provided, got ${JSON.stringify(rawRoute)}`,
50
+ });
51
+ }
52
+ function toExternalLink(link, serviceName, route) {
53
+ return {
54
+ source: link.source,
55
+ target: {
56
+ name: serviceName,
57
+ ...(route === undefined ? {} : { route }),
58
+ },
59
+ ...(link.type === undefined ? {} : { type: link.type }),
60
+ ...(link.sourceLocation === undefined ? {} : { sourceLocation: link.sourceLocation }),
61
+ };
62
+ }
63
+ /** @riviere-role domain-service */
64
+ export function rewriteHttpCallLinks(links, components) {
65
+ const linksToKeep = [];
66
+ const externalLinks = [];
67
+ const componentsByIdentity = mapComponentsByIdentity(components);
68
+ const internalComponentsByName = mapInternalComponentsByName(components);
69
+ for (const link of links) {
70
+ const targetComponent = componentsByIdentity.get(link.target);
71
+ if (targetComponent?.type !== 'httpCall') {
72
+ linksToKeep.push(link);
73
+ continue;
74
+ }
75
+ const serviceName = parseServiceName(targetComponent);
76
+ const matchedInternalComponents = internalComponentsByName.get(serviceName) ?? [];
77
+ const matchedInternalCount = matchedInternalComponents.length;
78
+ if (matchedInternalCount > 1) {
79
+ throw new ConnectionDetectionError({
80
+ file: targetComponent.location.file,
81
+ line: targetComponent.location.line,
82
+ typeName: componentIdentity(targetComponent),
83
+ reason: `Expected metadata.serviceName to match exactly one internal component name, got ${matchedInternalCount} matches for ${JSON.stringify(serviceName)}`,
84
+ });
85
+ }
86
+ const [uniqueInternalTarget] = matchedInternalComponents;
87
+ if (uniqueInternalTarget !== undefined) {
88
+ linksToKeep.push({
89
+ ...link,
90
+ target: componentIdentity(uniqueInternalTarget),
91
+ });
92
+ continue;
93
+ }
94
+ const route = parseRoute(targetComponent);
95
+ externalLinks.push(toExternalLink(link, serviceName, route));
96
+ }
97
+ return {
98
+ links: linksToKeep,
99
+ externalLinks,
100
+ };
101
+ }
102
+ /** @riviere-role domain-service */
103
+ export function stripHttpCallComponents(components) {
104
+ return components.filter((component) => component.type !== 'httpCall');
105
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"enrich-components.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/value-extraction/enrich-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAC2B,OAAO,EAC7C,MAAM,UAAU,CAAA;AAEjB,OAAO,KAAK,EACV,wBAAwB,EAKzB,MAAM,6CAA6C,CAAA;AACpD,OAAO,KAAK,EACV,cAAc,EAAE,WAAW,EAC5B,MAAM,mCAAmC,CAAA;AAa1C,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;AAEzD,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,cAAc,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAiRD,mCAAmC;AACnC,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,cAAc,EAAE,EACjC,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,GAChB,gBAAgB,CAclB"}
1
+ {"version":3,"file":"enrich-components.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/value-extraction/enrich-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAC2B,OAAO,EAC7C,MAAM,UAAU,CAAA;AAEjB,OAAO,KAAK,EACV,wBAAwB,EAKzB,MAAM,6CAA6C,CAAA;AACpD,OAAO,KAAK,EACV,cAAc,EAAE,WAAW,EAC5B,MAAM,mCAAmC,CAAA;AAgB1C,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;AAEzD,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,cAAc,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AA8WD,mCAAmC;AACnC,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,cAAc,EAAE,EACjC,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,GAChB,gBAAgB,CAclB"}
@@ -1,5 +1,5 @@
1
1
  import { posix } from 'node:path';
2
- import { evaluateLiteralRule, evaluateFromClassNameRule, evaluateFromFilePathRule, evaluateFromPropertyRule, evaluateFromMethodNameRule, } from './evaluate-extraction-rule';
2
+ import { evaluateLiteralRule, evaluateFromClassNameRule, evaluateFromFilePathRule, evaluateFromPropertyRule, evaluateFromMethodNameRule, evaluateFromDecoratorArgRule, evaluateFromDecoratorNameRule, evaluateFromClassDecoratorArgRule, } from './evaluate-extraction-rule';
3
3
  import { evaluateFromGenericArgRule } from './evaluate-extraction-rule-generic';
4
4
  import { ExtractionError } from '../../../../platform/domain/ast-literals/literal-detection';
5
5
  import { applyTransforms } from '../../../../platform/domain/string-transforms/transforms';
@@ -65,6 +65,39 @@ function findMethodAtLine(project, draft) {
65
65
  }
66
66
  throw new ExtractionError(`No method declaration found at line ${draft.location.line}`, draft.location.file, draft.location.line);
67
67
  }
68
+ function requireMethodForDecoratorRule(project, draft, ruleName) {
69
+ try {
70
+ return findMethodAtLine(project, draft);
71
+ }
72
+ catch (error) {
73
+ if (error instanceof ExtractionError &&
74
+ error.message.includes('No method declaration found at line')) {
75
+ throw new ExtractionError(`Rule '${ruleName}' requires a method component. Use 'fromClassDecoratorArg' for class decorators.`, draft.location.file, draft.location.line);
76
+ }
77
+ throw error;
78
+ }
79
+ }
80
+ function findDecoratorOnMethod(methodDecl, decoratorName) {
81
+ const decorators = methodDecl.getDecorators();
82
+ const sourceFile = methodDecl.getSourceFile();
83
+ const line = methodDecl.getStartLineNumber();
84
+ if (decorators.length === 0) {
85
+ throw new ExtractionError(`No decorators found on method '${methodDecl.getName()}'`, sourceFile.getFilePath(), line);
86
+ }
87
+ if (decoratorName === undefined) {
88
+ const firstDecorator = decorators[0];
89
+ /* v8 ignore next -- @preserve: decorators.length > 0 guarantees first decorator exists */
90
+ if (firstDecorator === undefined) {
91
+ throw new ExtractionError(`No decorators found on method '${methodDecl.getName()}'`, sourceFile.getFilePath(), line);
92
+ }
93
+ return firstDecorator;
94
+ }
95
+ const decorator = decorators.find((candidate) => candidate.getName() === decoratorName);
96
+ if (decorator === undefined) {
97
+ throw new ExtractionError(`Decorator '@${decoratorName}' not found on method '${methodDecl.getName()}'`, sourceFile.getFilePath(), line);
98
+ }
99
+ return decorator;
100
+ }
68
101
  function findContainingClass(project, draft) {
69
102
  const sourceFile = project.getSourceFile(draft.location.file);
70
103
  if (sourceFile === undefined) {
@@ -86,24 +119,24 @@ function evaluateClassRule(rule, classDecl) {
86
119
  }
87
120
  throw new ExtractionError('Unsupported extraction rule type for class-based component', classDecl.getSourceFile().getFilePath(), classDecl.getStartLineNumber());
88
121
  }
89
- function evaluateRule(rule, draft, project) {
90
- if ('literal' in rule) {
91
- return evaluateLiteralRule(rule);
92
- }
93
- if ('fromFilePath' in rule) {
94
- return evaluateFromFilePathRule(rule, draft.location.file);
95
- }
122
+ function evaluateMethodRule(rule, draft, project) {
96
123
  if ('fromMethodName' in rule) {
97
124
  const methodDecl = findMethodAtLine(project, draft);
98
125
  return evaluateFromMethodNameRule(rule, methodDecl);
99
126
  }
100
- if ('fromGenericArg' in rule) {
101
- const classDecl = findContainingClass(project, draft);
102
- return evaluateFromGenericArgRule(rule, classDecl);
127
+ if ('fromDecoratorArg' in rule) {
128
+ const methodDecl = requireMethodForDecoratorRule(project, draft, 'fromDecoratorArg');
129
+ const decorator = findDecoratorOnMethod(methodDecl, rule.fromDecoratorArg.decorator);
130
+ return evaluateFromDecoratorArgRule(rule, decorator);
103
131
  }
104
- if ('fromProperty' in rule) {
105
- const classDecl = findContainingClass(project, draft);
106
- return evaluateFromPropertyRule(rule, classDecl);
132
+ if ('fromClassDecoratorArg' in rule) {
133
+ const methodDecl = findMethodAtLine(project, draft);
134
+ return evaluateFromClassDecoratorArgRule(rule, methodDecl);
135
+ }
136
+ if ('fromDecoratorName' in rule) {
137
+ const methodDecl = requireMethodForDecoratorRule(project, draft, 'fromDecoratorName');
138
+ const decorator = findDecoratorOnMethod(methodDecl);
139
+ return evaluateFromDecoratorNameRule(rule, decorator);
107
140
  }
108
141
  if ('fromParameterType' in rule) {
109
142
  const methodDecl = findMethodAtLine(project, draft);
@@ -120,6 +153,27 @@ function evaluateRule(rule, draft, project) {
120
153
  }
121
154
  return { value: applyTransforms(typeName, transform) };
122
155
  }
156
+ return undefined;
157
+ }
158
+ function evaluateRule(rule, draft, project) {
159
+ if ('literal' in rule) {
160
+ return evaluateLiteralRule(rule);
161
+ }
162
+ if ('fromFilePath' in rule) {
163
+ return evaluateFromFilePathRule(rule, draft.location.file);
164
+ }
165
+ const methodRuleResult = evaluateMethodRule(rule, draft, project);
166
+ if (methodRuleResult !== undefined) {
167
+ return methodRuleResult;
168
+ }
169
+ if ('fromGenericArg' in rule) {
170
+ const classDecl = findContainingClass(project, draft);
171
+ return evaluateFromGenericArgRule(rule, classDecl);
172
+ }
173
+ if ('fromProperty' in rule) {
174
+ const classDecl = findContainingClass(project, draft);
175
+ return evaluateFromPropertyRule(rule, classDecl);
176
+ }
123
177
  const classDecl = findClassAtLine(project, draft);
124
178
  return evaluateClassRule(rule, classDecl);
125
179
  }
@@ -1,7 +1,9 @@
1
- import type { LiteralExtractionRule, FromClassNameExtractionRule, FromMethodNameExtractionRule, FromFilePathExtractionRule, FromPropertyExtractionRule, FromDecoratorArgExtractionRule, FromDecoratorNameExtractionRule } from '@living-architecture/riviere-extract-config';
1
+ import type { LiteralExtractionRule, FromClassNameExtractionRule, FromMethodNameExtractionRule, FromFilePathExtractionRule, FromPropertyExtractionRule, FromDecoratorArgExtractionRule, FromClassDecoratorArgExtractionRule, FromDecoratorNameExtractionRule } from '@living-architecture/riviere-extract-config';
2
2
  export { evaluateFromMethodSignatureRule, evaluateFromConstructorParamsRule, evaluateFromParameterTypeRule, type ParameterInfo, type MethodSignature, } from './evaluate-extraction-rule-method';
3
3
  export { evaluateFromGenericArgRule } from './evaluate-extraction-rule-generic';
4
- import type { ClassDeclaration, MethodDeclaration, Decorator } from 'ts-morph';
4
+ type ClassDeclaration = import('ts-morph').ClassDeclaration;
5
+ type MethodDeclaration = import('ts-morph').MethodDeclaration;
6
+ type Decorator = import('ts-morph').Decorator;
5
7
  /** @riviere-role value-object */
6
8
  export type ExtractionContext = {
7
9
  filePath: string;
@@ -24,5 +26,7 @@ export declare function evaluateFromPropertyRule(rule: FromPropertyExtractionRul
24
26
  /** @riviere-role domain-service */
25
27
  export declare function evaluateFromDecoratorArgRule(rule: FromDecoratorArgExtractionRule, decorator: Decorator): ExtractionResult;
26
28
  /** @riviere-role domain-service */
29
+ export declare function evaluateFromClassDecoratorArgRule(rule: FromClassDecoratorArgExtractionRule, methodDecl: MethodDeclaration): ExtractionResult;
30
+ /** @riviere-role domain-service */
27
31
  export declare function evaluateFromDecoratorNameRule(rule: FromDecoratorNameExtractionRule, decorator: Decorator): ExtractionResult;
28
32
  //# sourceMappingURL=evaluate-extraction-rule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate-extraction-rule.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/value-extraction/evaluate-extraction-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,8BAA8B,EAC9B,+BAA+B,EAChC,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,6BAA6B,EAC7B,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AAC/E,OAAO,KAAK,EACV,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAC/C,MAAM,UAAU,CAAA;AAQjB,iCAAiC;AACjC,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;AAE3D,iCAAiC;AACjC,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,CAAA;AAMzD,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAEjF;AAED,mCAAmC;AACnC,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,2BAA2B,EACjC,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAkBlB;AAED,mCAAmC;AACnC,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,4BAA4B,EAClC,UAAU,EAAE,iBAAiB,GAC5B,gBAAgB,CAalB;AAED,mCAAmC;AACnC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,0BAA0B,EAChC,QAAQ,EAAE,MAAM,GACf,gBAAgB,CA6BlB;AAqCD,mCAAmC;AACnC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,0BAA0B,EAChC,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAgClB;AA8GD,mCAAmC;AACnC,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,8BAA8B,EACpC,SAAS,EAAE,SAAS,GACnB,gBAAgB,CA2BlB;AAED,mCAAmC;AACnC,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,+BAA+B,EACrC,SAAS,EAAE,SAAS,GACnB,gBAAgB,CAkBlB"}
1
+ {"version":3,"file":"evaluate-extraction-rule.d.ts","sourceRoot":"","sources":["../../../../../src/features/extraction/domain/value-extraction/evaluate-extraction-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,EACnC,+BAA+B,EAChC,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,6BAA6B,EAC7B,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AAQ/E,KAAK,gBAAgB,GAAG,OAAO,UAAU,EAAE,gBAAgB,CAAA;AAC3D,KAAK,iBAAiB,GAAG,OAAO,UAAU,EAAE,iBAAiB,CAAA;AAC7D,KAAK,SAAS,GAAG,OAAO,UAAU,EAAE,SAAS,CAAA;AAE7C,iCAAiC;AACjC,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;AAE3D,iCAAiC;AACjC,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,CAAA;AAMzD,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAEjF;AAED,mCAAmC;AACnC,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,2BAA2B,EACjC,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAkBlB;AAED,mCAAmC;AACnC,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,4BAA4B,EAClC,UAAU,EAAE,iBAAiB,GAC5B,gBAAgB,CAalB;AAED,mCAAmC;AACnC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,0BAA0B,EAChC,QAAQ,EAAE,MAAM,GACf,gBAAgB,CA6BlB;AAqCD,mCAAmC;AACnC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,0BAA0B,EAChC,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAgClB;AAgHD,mCAAmC;AACnC,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,8BAA8B,EACpC,SAAS,EAAE,SAAS,GACnB,gBAAgB,CAqClB;AAED,mCAAmC;AACnC,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,mCAAmC,EACzC,UAAU,EAAE,iBAAiB,GAC5B,gBAAgB,CAqClB;AAED,mCAAmC;AACnC,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,+BAA+B,EACrC,SAAS,EAAE,SAAS,GACnB,gBAAgB,CAiBlB"}
@@ -41,7 +41,9 @@ export function evaluateFromMethodNameRule(rule, methodDecl) {
41
41
  }
42
42
  /** @riviere-role domain-service */
43
43
  export function evaluateFromFilePathRule(rule, filePath) {
44
- const { pattern, capture, transform } = rule.fromFilePath;
44
+ const pattern = rule.fromFilePath.pattern;
45
+ const capture = rule.fromFilePath.capture;
46
+ const transform = rule.fromFilePath.transform;
45
47
  const regex = new RegExp(pattern);
46
48
  const match = regex.exec(filePath);
47
49
  if (match === null) {
@@ -78,7 +80,9 @@ function findPropertyInHierarchy(classDecl, propertyName, isStatic) {
78
80
  }
79
81
  /** @riviere-role domain-service */
80
82
  export function evaluateFromPropertyRule(rule, classDecl) {
81
- const { name, kind, transform } = rule.fromProperty;
83
+ const name = rule.fromProperty.name;
84
+ const kind = rule.fromProperty.kind;
85
+ const transform = rule.fromProperty.transform;
82
86
  const isStatic = kind === 'static';
83
87
  const propertyInfo = findPropertyInHierarchy(classDecl, name, isStatic);
84
88
  if (propertyInfo === undefined) {
@@ -149,7 +153,14 @@ function extractNamedArg(decorator, name) {
149
153
  }
150
154
  /** @riviere-role domain-service */
151
155
  export function evaluateFromDecoratorArgRule(rule, decorator) {
152
- const { position, name, transform } = rule.fromDecoratorArg;
156
+ const decoratorName = rule.fromDecoratorArg.decorator;
157
+ const position = rule.fromDecoratorArg.position;
158
+ const name = rule.fromDecoratorArg.name;
159
+ const transform = rule.fromDecoratorArg.transform;
160
+ if (decoratorName !== undefined && decorator.getName() !== decoratorName) {
161
+ const location = getDecoratorLocation(decorator);
162
+ throw new ExtractionError(`Expected decorator '@${decoratorName}', got '@${decorator.getName()}'`, location.filePath, location.line);
163
+ }
153
164
  const extractValue = () => {
154
165
  if (position !== undefined) {
155
166
  return extractPositionalArg(decorator, position);
@@ -167,12 +178,40 @@ export function evaluateFromDecoratorArgRule(rule, decorator) {
167
178
  return { value: applyTransforms(value, transform) };
168
179
  }
169
180
  /** @riviere-role domain-service */
181
+ export function evaluateFromClassDecoratorArgRule(rule, methodDecl) {
182
+ const classDecl = methodDecl.getParentIfKind(SyntaxKind.ClassDeclaration);
183
+ if (classDecl === undefined) {
184
+ const sourceFile = methodDecl.getSourceFile();
185
+ throw new ExtractionError(`Expected method '${methodDecl.getName()}' to be declared inside a class`, sourceFile.getFilePath(), methodDecl.getStartLineNumber());
186
+ }
187
+ const classDecorator = classDecl
188
+ .getDecorators()
189
+ .find((decorator) => decorator.getName() === rule.fromClassDecoratorArg.decorator);
190
+ if (classDecorator === undefined) {
191
+ const sourceFile = classDecl.getSourceFile();
192
+ throw new ExtractionError(`Decorator '@${rule.fromClassDecoratorArg.decorator}' not found on containing class '${classDecl.getName() ?? 'anonymous'}'`, sourceFile.getFilePath(), classDecl.getStartLineNumber());
193
+ }
194
+ const fromClassDecoratorArg = rule.fromClassDecoratorArg;
195
+ const fromDecoratorArgRule = {
196
+ decorator: fromClassDecoratorArg.decorator,
197
+ ...(fromClassDecoratorArg.position === undefined
198
+ ? {}
199
+ : { position: fromClassDecoratorArg.position }),
200
+ ...(fromClassDecoratorArg.name === undefined ? {} : { name: fromClassDecoratorArg.name }),
201
+ ...(fromClassDecoratorArg.transform === undefined
202
+ ? {}
203
+ : { transform: fromClassDecoratorArg.transform }),
204
+ };
205
+ return evaluateFromDecoratorArgRule({ fromDecoratorArg: fromDecoratorArgRule }, classDecorator);
206
+ }
207
+ /** @riviere-role domain-service */
170
208
  export function evaluateFromDecoratorNameRule(rule, decorator) {
171
209
  const decoratorName = decorator.getName();
172
210
  if (rule.fromDecoratorName === true) {
173
211
  return { value: decoratorName };
174
212
  }
175
- const { mapping, transform } = rule.fromDecoratorName;
213
+ const mapping = rule.fromDecoratorName.mapping;
214
+ const transform = rule.fromDecoratorName.transform;
176
215
  const mappedValue = mapping?.[decoratorName] ?? decoratorName;
177
216
  if (transform === undefined) {
178
217
  return { value: mappedValue };
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { resolveConfig, type ConfigLoader, } from './features/extraction/domain/
4
4
  export { ConfigLoaderRequiredError, MissingComponentRuleError, } from './features/extraction/domain/config-resolution/config-resolution-errors';
5
5
  export { applyTransforms, ExtractionError, type ExtractionContext, type ExtractionResult, type ParameterInfo, type MethodSignature, } from './features/extraction/domain/value-extraction';
6
6
  export { matchesGlob } from './platform/infra/external-clients/minimatch/minimatch-glob';
7
- export { detectConnections, detectPerModuleConnections, detectCrossModuleConnections, deduplicateCrossStrategy, type ConnectionDetectionOptions, type ConnectionDetectionResult, type ConnectionTimings, type PerModuleConnectionOptions, type PerModuleDetectionResult, type PerModuleTimings, type CrossModuleConnectionOptions, type CrossModuleDetectionResult, type CrossModuleTimings, } from './features/extraction/domain/connection-detection/detect-connections';
7
+ export { detectConnections, detectPerModuleConnections, detectCrossModuleConnections, deduplicateCrossStrategy, stripHttpCallComponents, type ConnectionDetectionOptions, type ConnectionDetectionResult, type ConnectionTimings, type PerModuleConnectionOptions, type PerModuleDetectionResult, type PerModuleTimings, type CrossModuleConnectionOptions, type CrossModuleDetectionResult, type CrossModuleTimings, } from './features/extraction/domain/connection-detection/detect-connections';
8
8
  export type { ExtractedLink } from './features/extraction/domain/connection-detection/extracted-link';
9
9
  export { ComponentIndex } from './features/extraction/domain/connection-detection/component-index';
10
10
  export { ConnectionDetectionError } from './features/extraction/domain/connection-detection/connection-detection-error';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,6DAA6D,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sEAAsE,CAAA;AACxG,OAAO,EACL,aAAa,EACb,KAAK,YAAY,GAClB,MAAM,+DAA+D,CAAA;AACtE,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,yEAAyE,CAAA;AAChF,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,+CAA+C,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4DAA4D,CAAA;AACxF,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,sEAAsE,CAAA;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,kEAAkE,CAAA;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,mEAAmE,CAAA;AAClG,OAAO,EAAE,wBAAwB,EAAE,MAAM,8EAA8E,CAAA;AACvH,OAAO,EACL,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,iEAAiE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,6DAA6D,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sEAAsE,CAAA;AACxG,OAAO,EACL,aAAa,EACb,KAAK,YAAY,GAClB,MAAM,+DAA+D,CAAA;AACtE,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,yEAAyE,CAAA;AAChF,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,+CAA+C,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4DAA4D,CAAA;AACxF,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,sEAAsE,CAAA;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,kEAAkE,CAAA;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,mEAAmE,CAAA;AAClG,OAAO,EAAE,wBAAwB,EAAE,MAAM,8EAA8E,CAAA;AACvH,OAAO,EACL,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,iEAAiE,CAAA"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ export { resolveConfig, } from './features/extraction/domain/config-resolution/r
4
4
  export { ConfigLoaderRequiredError, MissingComponentRuleError, } from './features/extraction/domain/config-resolution/config-resolution-errors';
5
5
  export { applyTransforms, ExtractionError, } from './features/extraction/domain/value-extraction';
6
6
  export { matchesGlob } from './platform/infra/external-clients/minimatch/minimatch-glob';
7
- export { detectConnections, detectPerModuleConnections, detectCrossModuleConnections, deduplicateCrossStrategy, } from './features/extraction/domain/connection-detection/detect-connections';
7
+ export { detectConnections, detectPerModuleConnections, detectCrossModuleConnections, deduplicateCrossStrategy, stripHttpCallComponents, } from './features/extraction/domain/connection-detection/detect-connections';
8
8
  export { ComponentIndex } from './features/extraction/domain/connection-detection/component-index';
9
9
  export { ConnectionDetectionError } from './features/extraction/domain/connection-detection/connection-detection-error';
10
10
  export { enrichComponents, } from './features/extraction/domain/value-extraction/enrich-components';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@living-architecture/riviere-extract-ts",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -24,7 +24,7 @@
24
24
  "dependencies": {
25
25
  "minimatch": "^10.0.1",
26
26
  "ts-morph": "^24.0.0",
27
- "@living-architecture/riviere-extract-config": "0.5.4",
28
- "@living-architecture/riviere-schema": "0.6.4"
27
+ "@living-architecture/riviere-extract-config": "0.5.6",
28
+ "@living-architecture/riviere-schema": "0.6.6"
29
29
  }
30
30
  }