@webpieces/nx-webpieces-rules 0.4.865 → 0.4.867
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/package.json +7 -7
- package/src/configs/wiring-format-config.d.ts +7 -0
- package/src/configs/wiring-format-config.js +14 -0
- package/src/configs/wiring-format-config.js.map +1 -0
- package/src/executors/generate/executor.d.ts +11 -0
- package/src/executors/generate/executor.js +49 -42
- package/src/executors/generate/executor.js.map +1 -1
- package/src/executors/validate-architecture-unchanged/executor.js +0 -2
- package/src/executors/validate-architecture-unchanged/executor.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +3 -1
- package/src/index.js.map +1 -1
- package/src/lib/di-graph/angular-providers.js +67 -39
- package/src/lib/di-graph/angular-providers.js.map +1 -1
- package/src/lib/di-graph/runtime-client-bindings.d.ts +1 -0
- package/src/lib/di-graph/runtime-client-bindings.js +10 -0
- package/src/lib/di-graph/runtime-client-bindings.js.map +1 -1
- package/src/lib/runtime-wiring/approved-graph.js +1 -2
- package/src/lib/runtime-wiring/approved-graph.js.map +1 -1
- package/src/lib/runtime-wiring/assembler.d.ts +2 -1
- package/src/lib/runtime-wiring/assembler.js +38 -18
- package/src/lib/runtime-wiring/assembler.js.map +1 -1
- package/src/lib/runtime-wiring/canonical-clients.d.ts +1 -8
- package/src/lib/runtime-wiring/canonical-clients.js +6 -45
- package/src/lib/runtime-wiring/canonical-clients.js.map +1 -1
- package/src/lib/runtime-wiring/codec.js +29 -9
- package/src/lib/runtime-wiring/codec.js.map +1 -1
- package/src/lib/runtime-wiring/declaration.d.ts +11 -6
- package/src/lib/runtime-wiring/declaration.js +8 -4
- package/src/lib/runtime-wiring/declaration.js.map +1 -1
- package/src/lib/runtime-wiring/prepared-targets.d.ts +11 -0
- package/src/lib/runtime-wiring/prepared-targets.js +82 -0
- package/src/lib/runtime-wiring/prepared-targets.js.map +1 -0
- package/src/lib/runtime-wiring/source-extractor.d.ts +4 -3
- package/src/lib/runtime-wiring/source-extractor.js +77 -118
- package/src/lib/runtime-wiring/source-extractor.js.map +1 -1
- package/src/lib/runtime-wiring/source-types.d.ts +13 -0
- package/src/lib/runtime-wiring/source-types.js +75 -0
- package/src/lib/runtime-wiring/source-types.js.map +1 -0
- package/src/lib/runtime-wiring/source-values.d.ts +4 -2
- package/src/lib/runtime-wiring/source-values.js +86 -35
- package/src/lib/runtime-wiring/source-values.js.map +1 -1
- package/src/lib/runtime-wiring/wiring-format.d.ts +15 -0
- package/src/lib/runtime-wiring/wiring-format.js +160 -0
- package/src/lib/runtime-wiring/wiring-format.js.map +1 -0
- package/src/lib/runtime-wiring/workspace-format.d.ts +6 -0
- package/src/lib/runtime-wiring/workspace-format.js +39 -0
- package/src/lib/runtime-wiring/workspace-format.js.map +1 -0
- package/src/native-actions.d.ts +1 -0
- package/src/native-actions.js +6 -0
- package/src/native-actions.js.map +1 -1
- package/src/nx-policy-registry.js +2 -0
- package/src/nx-policy-registry.js.map +1 -1
- package/src/rule-help.js +2 -1
- package/src/rule-help.js.map +1 -1
- package/src/rule-settings.js +7 -0
- package/src/rule-settings.js.map +1 -1
- package/src/runtime-wiring-targets.js +2 -0
- package/src/runtime-wiring-targets.js.map +1 -1
|
@@ -16,8 +16,8 @@ class RuntimeDeclarationCodec {
|
|
|
16
16
|
'entry',
|
|
17
17
|
'host',
|
|
18
18
|
]);
|
|
19
|
-
if (root['schemaVersion'] !==
|
|
20
|
-
this.fail('Unsupported runtime-deps schemaVersion; migrate to version
|
|
19
|
+
if (root['schemaVersion'] !== 2)
|
|
20
|
+
this.fail('Unsupported runtime-deps schemaVersion; migrate src/wiring.ts to Wiring/AppWiring and explicitly review a version 2 candidate.');
|
|
21
21
|
if (root['project'] !== expectedProject)
|
|
22
22
|
this.fail(`Expected project ${expectedProject}, found ${String(root['project'])}.`);
|
|
23
23
|
const framework = this.string(root['framework']);
|
|
@@ -26,6 +26,23 @@ class RuntimeDeclarationCodec {
|
|
|
26
26
|
const exports = {};
|
|
27
27
|
for (const [name, value] of Object.entries(this.record(root['exports'])))
|
|
28
28
|
exports[name] = this.exported(value);
|
|
29
|
+
const entry = root['entry'] === undefined ? undefined : this.string(root['entry']);
|
|
30
|
+
const apps = Object.values(exports).filter((exported) => exported.kind === 'app');
|
|
31
|
+
if ((entry === undefined && apps.length > 0) || (entry !== undefined && apps.length !== 1))
|
|
32
|
+
this.fail('Declare exactly one AppWiring entry for an application; libraries export Wiring without an entry.');
|
|
33
|
+
if (entry !== undefined && exports[entry]?.kind !== 'app')
|
|
34
|
+
this.fail('A runtime entry must select an AppWiring export. Libraries have no entry.');
|
|
35
|
+
if (entry === undefined && root['host'] !== undefined)
|
|
36
|
+
this.fail('Library declarations cannot carry an application host.');
|
|
37
|
+
for (const [name, exported] of Object.entries(exports)) {
|
|
38
|
+
if (exported.kind !== 'app' && exported.wirings.length > 0)
|
|
39
|
+
this.fail(`${name}: only AppWiring may select library Wirings.`);
|
|
40
|
+
if (!['app', 'wiring'].includes(exported.kind) &&
|
|
41
|
+
(exported.bindingModules.length > 0 || exported.routingModules.length > 0))
|
|
42
|
+
this.fail(`${name}: leaf modules cannot select module lists.`);
|
|
43
|
+
if (['app', 'wiring'].includes(exported.kind) && exported.relationships.length > 0)
|
|
44
|
+
this.fail(`${name}: declare relationships in named binding/route modules.`);
|
|
45
|
+
}
|
|
29
46
|
return new declaration_1.RuntimeDeclaration(expectedProject, framework, exports, root['entry'] === undefined ? undefined : this.string(root['entry']), root['host'] === undefined ? undefined : this.string(root['host']));
|
|
30
47
|
}
|
|
31
48
|
// webpieces-disable no-any-unknown -- JSON syntax boundary; fields are narrowed by decode
|
|
@@ -41,15 +58,15 @@ class RuntimeDeclarationCodec {
|
|
|
41
58
|
}
|
|
42
59
|
// webpieces-disable no-any-unknown -- untrusted JSON is narrowed and validated at the input boundary
|
|
43
60
|
exported(value) {
|
|
44
|
-
const exported = this.record(value, ['kind', 'relationships', '
|
|
61
|
+
const exported = this.record(value, ['kind', 'relationships', 'bindingModules', 'routingModules', 'wirings']);
|
|
45
62
|
const kind = this.string(exported['kind']);
|
|
46
63
|
if (kind !== 'binding' &&
|
|
47
64
|
kind !== 'routing' &&
|
|
48
|
-
kind !== '
|
|
49
|
-
kind !== '
|
|
65
|
+
kind !== 'wiring' &&
|
|
66
|
+
kind !== 'app' &&
|
|
50
67
|
kind !== 'external')
|
|
51
68
|
this.fail(`Invalid export kind ${kind}.`);
|
|
52
|
-
return new declaration_1.WiringExport(kind, this.array(exported['relationships']).map((value) => this.relationship(value)), this.array(exported['
|
|
69
|
+
return new declaration_1.WiringExport(kind, this.array(exported['relationships']).map((value) => this.relationship(value)), this.array(exported['bindingModules']).map((value) => this.selection(value)), this.array(exported['routingModules']).map((value) => this.selection(value)), this.array(exported['wirings']).map((value) => this.selection(value)));
|
|
53
70
|
}
|
|
54
71
|
// webpieces-disable no-any-unknown -- untrusted relationship JSON is narrowed before construction
|
|
55
72
|
relationship(value) {
|
|
@@ -85,9 +102,12 @@ class RuntimeDeclarationCodec {
|
|
|
85
102
|
for (const [name, target] of Object.entries(this.record(selection['targets'])))
|
|
86
103
|
targets[name] = this.target(target);
|
|
87
104
|
for (const [name, policy] of Object.entries(this.record(selection['policies']))) {
|
|
88
|
-
if (typeof policy
|
|
89
|
-
|
|
90
|
-
|
|
105
|
+
if (typeof policy === 'boolean' || policy === 'runtime')
|
|
106
|
+
policies[name] = policy;
|
|
107
|
+
else {
|
|
108
|
+
const forwarded = this.record(policy, ['parameter']);
|
|
109
|
+
policies[name] = { parameter: this.string(forwarded['parameter']) };
|
|
110
|
+
}
|
|
91
111
|
}
|
|
92
112
|
return new declaration_1.WiringSelection(this.string(selection['project']), this.string(selection['exportedName']), targets, policies);
|
|
93
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/nx-webpieces-rules/src/lib/runtime-wiring/codec.ts"],"names":[],"mappings":"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","sourcesContent":["import { toError } from '../../toError';\nimport { Option, RuleFailError } from '@webpieces/rules-config';\nimport {\n ContractIdentity,\n ImplementsFacts,\n UsesFacts,\n RuntimeDeclaration,\n WiringExport,\n WiringRelationship,\n WiringSelection,\n} from './declaration';\nimport type { DeclaredTarget } from './declaration';\nimport { isExternalSystemKind } from '../api-usage/api-relations';\n\n/** JSON is validated before it is allowed to influence graph assembly. */\nexport class RuntimeDeclarationCodec {\n decode(text: string, expectedProject: string): RuntimeDeclaration {\n const root = this.record(this.parse(text, expectedProject), [\n 'schemaVersion',\n 'project',\n 'framework',\n 'exports',\n 'entry',\n 'host',\n ]);\n if (root['schemaVersion'] !== 1)\n this.fail('Unsupported runtime-deps schemaVersion; migrate to version 1.');\n if (root['project'] !== expectedProject)\n this.fail(`Expected project ${expectedProject}, found ${String(root['project'])}.`);\n const framework = this.string(root['framework']);\n if (framework !== 'node' && framework !== 'angular' && framework !== 'browser')\n this.fail(`Unsupported framework ${framework}.`);\n const exports: Record<string, WiringExport> = {};\n for (const [name, value] of Object.entries(this.record(root['exports'])))\n exports[name] = this.exported(value);\n return new RuntimeDeclaration(\n expectedProject,\n framework,\n exports,\n root['entry'] === undefined ? undefined : this.string(root['entry']),\n root['host'] === undefined ? undefined : this.string(root['host']),\n );\n }\n\n // webpieces-disable no-any-unknown -- JSON syntax boundary; fields are narrowed by decode\n private parse(text: string, project: string): unknown {\n // eslint-disable-next-line @webpieces/no-unmanaged-exceptions\n try {\n return JSON.parse(text);\n } catch (err: unknown) {\n const error = toError(err);\n this.fail(`${project}/runtime-deps.json contains invalid JSON.`, error);\n }\n }\n\n // webpieces-disable no-any-unknown -- untrusted JSON is narrowed and validated at the input boundary\n private exported(value: unknown): WiringExport {\n const exported = this.record(value, ['kind', 'relationships', 'selections']);\n const kind = this.string(exported['kind']);\n if (\n kind !== 'binding' &&\n kind !== 'routing' &&\n kind !== 'providers' &&\n kind !== 'plan' &&\n kind !== 'external'\n )\n this.fail(`Invalid export kind ${kind}.`);\n return new WiringExport(\n kind,\n this.array(exported['relationships']).map((value) => this.relationship(value)),\n this.array(exported['selections']).map((value) => this.selection(value)),\n );\n }\n\n // webpieces-disable no-any-unknown -- untrusted relationship JSON is narrowed before construction\n private relationship(value: unknown): WiringRelationship {\n const relation = this.record(value, [\n 'contract',\n 'direction',\n 'transport',\n 'target',\n 'policy',\n ]);\n const contract = this.record(relation['contract'], ['project', 'exportedName']);\n const direction = this.string(relation['direction']);\n const transport = this.string(relation['transport']);\n if (direction !== 'implements' && direction !== 'uses')\n this.fail(`Invalid direction ${direction}.`);\n if (transport !== 'rpc' && transport !== 'pubsub' && transport !== 'external')\n this.fail(`Invalid transport ${transport}.`);\n const target =\n relation['target'] === undefined ? undefined : this.target(relation['target']);\n const policy =\n relation['policy'] === undefined ? undefined : this.string(relation['policy']);\n if (direction === 'uses' && target === undefined)\n this.fail('Uses requires an explicit target.');\n if (direction === 'implements' && target !== undefined)\n this.fail('Implements cannot declare a client target.');\n return new WiringRelationship(\n new ContractIdentity(\n this.string(contract['project']),\n this.string(contract['exportedName']),\n ),\n direction === 'uses'\n ? new UsesFacts(transport, target!, policy)\n : new ImplementsFacts(transport, policy),\n );\n }\n\n // webpieces-disable no-any-unknown -- untrusted selection arguments are validated before substitution\n private selection(value: unknown): WiringSelection {\n const selection = this.record(value, ['project', 'exportedName', 'targets', 'policies']);\n const targets: Record<string, DeclaredTarget> = {};\n const policies: Record<string, boolean | 'runtime'> = {};\n for (const [name, target] of Object.entries(this.record(selection['targets'])))\n targets[name] = this.target(target);\n for (const [name, policy] of Object.entries(this.record(selection['policies']))) {\n if (typeof policy !== 'boolean' && policy !== 'runtime')\n this.fail(`Policy ${name} must be explicitly true, false, or runtime.`);\n policies[name] = policy;\n }\n return new WiringSelection(\n this.string(selection['project']),\n this.string(selection['exportedName']),\n targets,\n policies,\n );\n }\n\n // webpieces-disable no-any-unknown -- target discriminant controls the exact accepted JSON shape\n private target(value: unknown): DeclaredTarget {\n const target = this.record(value);\n switch (target['kind']) {\n case 'service': {\n this.record(value, ['kind', 'service', 'contract']);\n const contract =\n target['contract'] === undefined\n ? undefined\n : this.record(target['contract'], ['project', 'exportedName']);\n return {\n kind: 'service',\n service: this.string(target['service']),\n contract:\n contract === undefined\n ? undefined\n : new ContractIdentity(\n this.string(contract['project']),\n this.string(contract['exportedName']),\n ),\n };\n }\n case 'parameter':\n this.record(value, ['kind', 'parameter']);\n return { kind: 'parameter', parameter: this.string(target['parameter']) };\n case 'unknown':\n this.record(value, ['kind', 'reason']);\n return { kind: 'unknown', reason: this.string(target['reason']) };\n case 'external': {\n this.record(value, ['kind', 'system']);\n const system = this.record(target['system'], ['kind', 'label']);\n const kind = this.string(system['kind']);\n if (!isExternalSystemKind(kind)) this.fail(`Invalid external system kind ${kind}.`);\n return { kind: 'external', system: { kind, label: this.string(system['label']) } };\n }\n default:\n return this.fail(\n 'Targets require an explicit service, parameter, external, or unknown kind.',\n );\n }\n }\n\n // webpieces-disable no-any-unknown -- JSON record boundary; never a runtime topology type\n private record(value: unknown, allowed?: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value))\n this.fail('Expected a JSON object.');\n const record = value as Record<string, unknown>;\n for (const key of Object.keys(record))\n if (['__proto__', 'constructor', 'prototype'].includes(key))\n this.fail(`Reserved runtime-deps field ${key}.`);\n if (allowed !== undefined)\n for (const key of Object.keys(record))\n if (!allowed.includes(key)) this.fail(`Unknown runtime-deps field ${key}.`);\n return record;\n }\n\n // webpieces-disable no-any-unknown -- JSON array boundary\n private array(value: unknown): unknown[] {\n if (!Array.isArray(value)) this.fail('Expected a JSON array.');\n return value;\n }\n\n // webpieces-disable no-any-unknown -- JSON scalar boundary\n private string(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '')\n this.fail('Expected a non-empty string.');\n return value;\n }\n\n private fail(message: string, cause?: Error): never {\n throw new RuleFailError(\n 'validate-runtime-architecture',\n message,\n undefined,\n undefined,\n [\n new Option(\n 'Review and correct runtime-deps.json using the versioned runtime wiring schema.',\n true,\n ),\n ],\n undefined,\n cause,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/nx-webpieces-rules/src/lib/runtime-wiring/codec.ts"],"names":[],"mappings":"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","sourcesContent":["import { toError } from '../../toError';\nimport { Option, RuleFailError } from '@webpieces/rules-config';\nimport {\n ContractIdentity,\n ImplementsFacts,\n UsesFacts,\n RuntimeDeclaration,\n WiringExport,\n WiringRelationship,\n WiringSelection,\n} from './declaration';\nimport type { DeclaredTarget, PolicyValue } from './declaration';\nimport { isExternalSystemKind } from '../api-usage/api-relations';\n\n/** JSON is validated before it is allowed to influence graph assembly. */\nexport class RuntimeDeclarationCodec {\n decode(text: string, expectedProject: string): RuntimeDeclaration {\n const root = this.record(this.parse(text, expectedProject), [\n 'schemaVersion',\n 'project',\n 'framework',\n 'exports',\n 'entry',\n 'host',\n ]);\n if (root['schemaVersion'] !== 2)\n this.fail('Unsupported runtime-deps schemaVersion; migrate src/wiring.ts to Wiring/AppWiring and explicitly review a version 2 candidate.');\n if (root['project'] !== expectedProject)\n this.fail(`Expected project ${expectedProject}, found ${String(root['project'])}.`);\n const framework = this.string(root['framework']);\n if (framework !== 'node' && framework !== 'angular' && framework !== 'browser')\n this.fail(`Unsupported framework ${framework}.`);\n const exports: Record<string, WiringExport> = {};\n for (const [name, value] of Object.entries(this.record(root['exports'])))\n exports[name] = this.exported(value);\n const entry = root['entry'] === undefined ? undefined : this.string(root['entry']);\n const apps = Object.values(exports).filter((exported: WiringExport) => exported.kind === 'app');\n if ((entry === undefined && apps.length > 0) || (entry !== undefined && apps.length !== 1))\n this.fail('Declare exactly one AppWiring entry for an application; libraries export Wiring without an entry.');\n if (entry !== undefined && exports[entry]?.kind !== 'app')\n this.fail('A runtime entry must select an AppWiring export. Libraries have no entry.');\n if (entry === undefined && root['host'] !== undefined)\n this.fail('Library declarations cannot carry an application host.');\n for (const [name, exported] of Object.entries(exports)) {\n if (exported.kind !== 'app' && exported.wirings.length > 0)\n this.fail(`${name}: only AppWiring may select library Wirings.`);\n if (!['app', 'wiring'].includes(exported.kind) &&\n (exported.bindingModules.length > 0 || exported.routingModules.length > 0))\n this.fail(`${name}: leaf modules cannot select module lists.`);\n if (['app', 'wiring'].includes(exported.kind) && exported.relationships.length > 0)\n this.fail(`${name}: declare relationships in named binding/route modules.`);\n }\n return new RuntimeDeclaration(\n expectedProject,\n framework,\n exports,\n root['entry'] === undefined ? undefined : this.string(root['entry']),\n root['host'] === undefined ? undefined : this.string(root['host']),\n );\n }\n\n // webpieces-disable no-any-unknown -- JSON syntax boundary; fields are narrowed by decode\n private parse(text: string, project: string): unknown {\n // eslint-disable-next-line @webpieces/no-unmanaged-exceptions\n try {\n return JSON.parse(text);\n } catch (err: unknown) {\n const error = toError(err);\n this.fail(`${project}/runtime-deps.json contains invalid JSON.`, error);\n }\n }\n\n // webpieces-disable no-any-unknown -- untrusted JSON is narrowed and validated at the input boundary\n private exported(value: unknown): WiringExport {\n const exported = this.record(value, ['kind', 'relationships', 'bindingModules', 'routingModules', 'wirings']);\n const kind = this.string(exported['kind']);\n if (\n kind !== 'binding' &&\n kind !== 'routing' &&\n kind !== 'wiring' &&\n kind !== 'app' &&\n kind !== 'external'\n )\n this.fail(`Invalid export kind ${kind}.`);\n return new WiringExport(\n kind,\n this.array(exported['relationships']).map((value) => this.relationship(value)),\n this.array(exported['bindingModules']).map((value) => this.selection(value)),\n this.array(exported['routingModules']).map((value) => this.selection(value)),\n this.array(exported['wirings']).map((value) => this.selection(value)),\n );\n }\n\n // webpieces-disable no-any-unknown -- untrusted relationship JSON is narrowed before construction\n private relationship(value: unknown): WiringRelationship {\n const relation = this.record(value, [\n 'contract',\n 'direction',\n 'transport',\n 'target',\n 'policy',\n ]);\n const contract = this.record(relation['contract'], ['project', 'exportedName']);\n const direction = this.string(relation['direction']);\n const transport = this.string(relation['transport']);\n if (direction !== 'implements' && direction !== 'uses')\n this.fail(`Invalid direction ${direction}.`);\n if (transport !== 'rpc' && transport !== 'pubsub' && transport !== 'external')\n this.fail(`Invalid transport ${transport}.`);\n const target =\n relation['target'] === undefined ? undefined : this.target(relation['target']);\n const policy =\n relation['policy'] === undefined ? undefined : this.string(relation['policy']);\n if (direction === 'uses' && target === undefined)\n this.fail('Uses requires an explicit target.');\n if (direction === 'implements' && target !== undefined)\n this.fail('Implements cannot declare a client target.');\n return new WiringRelationship(\n new ContractIdentity(\n this.string(contract['project']),\n this.string(contract['exportedName']),\n ),\n direction === 'uses'\n ? new UsesFacts(transport, target!, policy)\n : new ImplementsFacts(transport, policy),\n );\n }\n\n // webpieces-disable no-any-unknown -- untrusted selection arguments are validated before substitution\n private selection(value: unknown): WiringSelection {\n const selection = this.record(value, ['project', 'exportedName', 'targets', 'policies']);\n const targets: Record<string, DeclaredTarget> = {};\n const policies: Record<string, PolicyValue> = {};\n for (const [name, target] of Object.entries(this.record(selection['targets'])))\n targets[name] = this.target(target);\n for (const [name, policy] of Object.entries(this.record(selection['policies']))) {\n if (typeof policy === 'boolean' || policy === 'runtime') policies[name] = policy;\n else {\n const forwarded = this.record(policy, ['parameter']);\n policies[name] = { parameter: this.string(forwarded['parameter']) };\n }\n }\n return new WiringSelection(\n this.string(selection['project']),\n this.string(selection['exportedName']),\n targets,\n policies,\n );\n }\n\n // webpieces-disable no-any-unknown -- target discriminant controls the exact accepted JSON shape\n private target(value: unknown): DeclaredTarget {\n const target = this.record(value);\n switch (target['kind']) {\n case 'service': {\n this.record(value, ['kind', 'service', 'contract']);\n const contract =\n target['contract'] === undefined\n ? undefined\n : this.record(target['contract'], ['project', 'exportedName']);\n return {\n kind: 'service',\n service: this.string(target['service']),\n contract:\n contract === undefined\n ? undefined\n : new ContractIdentity(\n this.string(contract['project']),\n this.string(contract['exportedName']),\n ),\n };\n }\n case 'parameter':\n this.record(value, ['kind', 'parameter']);\n return { kind: 'parameter', parameter: this.string(target['parameter']) };\n case 'unknown':\n this.record(value, ['kind', 'reason']);\n return { kind: 'unknown', reason: this.string(target['reason']) };\n case 'external': {\n this.record(value, ['kind', 'system']);\n const system = this.record(target['system'], ['kind', 'label']);\n const kind = this.string(system['kind']);\n if (!isExternalSystemKind(kind)) this.fail(`Invalid external system kind ${kind}.`);\n return { kind: 'external', system: { kind, label: this.string(system['label']) } };\n }\n default:\n return this.fail(\n 'Targets require an explicit service, parameter, external, or unknown kind.',\n );\n }\n }\n\n // webpieces-disable no-any-unknown -- JSON record boundary; never a runtime topology type\n private record(value: unknown, allowed?: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value))\n this.fail('Expected a JSON object.');\n const record = value as Record<string, unknown>;\n for (const key of Object.keys(record))\n if (['__proto__', 'constructor', 'prototype'].includes(key))\n this.fail(`Reserved runtime-deps field ${key}.`);\n if (allowed !== undefined)\n for (const key of Object.keys(record))\n if (!allowed.includes(key)) this.fail(`Unknown runtime-deps field ${key}.`);\n return record;\n }\n\n // webpieces-disable no-any-unknown -- JSON array boundary\n private array(value: unknown): unknown[] {\n if (!Array.isArray(value)) this.fail('Expected a JSON array.');\n return value;\n }\n\n // webpieces-disable no-any-unknown -- JSON scalar boundary\n private string(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '')\n this.fail('Expected a non-empty string.');\n return value;\n }\n\n private fail(message: string, cause?: Error): never {\n throw new RuleFailError(\n 'validate-runtime-architecture',\n message,\n undefined,\n undefined,\n [\n new Option(\n 'Review and correct runtime-deps.json using the versioned runtime wiring schema.',\n true,\n ),\n ],\n undefined,\n cause,\n );\n }\n}\n"]}
|
|
@@ -47,18 +47,23 @@ export declare class WiringSelection {
|
|
|
47
47
|
readonly project: string;
|
|
48
48
|
readonly exportedName: string;
|
|
49
49
|
readonly targets: Record<string, DeclaredTarget>;
|
|
50
|
-
readonly policies: Record<string,
|
|
51
|
-
constructor(project: string, exportedName: string, targets: Record<string, DeclaredTarget>, policies: Record<string,
|
|
50
|
+
readonly policies: Record<string, PolicyValue>;
|
|
51
|
+
constructor(project: string, exportedName: string, targets: Record<string, DeclaredTarget>, policies: Record<string, PolicyValue>);
|
|
52
52
|
}
|
|
53
|
+
export type PolicyValue = boolean | 'runtime' | {
|
|
54
|
+
parameter: string;
|
|
55
|
+
};
|
|
53
56
|
export declare class WiringExport {
|
|
54
|
-
readonly kind: 'binding' | 'routing' | '
|
|
57
|
+
readonly kind: 'binding' | 'routing' | 'wiring' | 'app' | 'external';
|
|
55
58
|
readonly relationships: WiringRelationship[];
|
|
56
|
-
readonly
|
|
57
|
-
|
|
59
|
+
readonly bindingModules: WiringSelection[];
|
|
60
|
+
readonly routingModules: WiringSelection[];
|
|
61
|
+
readonly wirings: WiringSelection[];
|
|
62
|
+
constructor(kind: 'binding' | 'routing' | 'wiring' | 'app' | 'external', relationships: WiringRelationship[], bindingModules: WiringSelection[], routingModules?: WiringSelection[], wirings?: WiringSelection[]);
|
|
58
63
|
}
|
|
59
64
|
/** No timestamps, machine paths, credentials, deployment URLs, or cache keys belong here. */
|
|
60
65
|
export declare class RuntimeDeclaration {
|
|
61
|
-
readonly schemaVersion:
|
|
66
|
+
readonly schemaVersion: 2;
|
|
62
67
|
readonly project: string;
|
|
63
68
|
readonly framework: 'node' | 'angular' | 'browser';
|
|
64
69
|
readonly exports: Record<string, WiringExport>;
|
|
@@ -65,18 +65,22 @@ exports.WiringSelection = WiringSelection;
|
|
|
65
65
|
class WiringExport {
|
|
66
66
|
kind;
|
|
67
67
|
relationships;
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
bindingModules;
|
|
69
|
+
routingModules;
|
|
70
|
+
wirings;
|
|
71
|
+
constructor(kind, relationships, bindingModules, routingModules = [], wirings = []) {
|
|
70
72
|
this.kind = kind;
|
|
71
73
|
this.relationships = relationships;
|
|
72
|
-
this.
|
|
74
|
+
this.bindingModules = bindingModules;
|
|
75
|
+
this.routingModules = routingModules;
|
|
76
|
+
this.wirings = wirings;
|
|
73
77
|
}
|
|
74
78
|
}
|
|
75
79
|
exports.WiringExport = WiringExport;
|
|
76
80
|
/** No timestamps, machine paths, credentials, deployment URLs, or cache keys belong here. */
|
|
77
81
|
class RuntimeDeclaration {
|
|
78
82
|
constructor(project, framework, exports, entry, host) {
|
|
79
|
-
this.schemaVersion =
|
|
83
|
+
this.schemaVersion = 2;
|
|
80
84
|
this.project = project;
|
|
81
85
|
this.framework = framework;
|
|
82
86
|
this.exports = exports;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/nx-webpieces-rules/src/lib/runtime-wiring/declaration.ts"],"names":[],"mappings":";;;AAEA,8FAA8F;AAC9F,MAAa,gBAAgB;IAEL;IACA;IAFpB,YACoB,OAAe,EACf,YAAoB;QADpB,YAAO,GAAP,OAAO,CAAQ;QACf,iBAAY,GAAZ,YAAY,CAAQ;IACrC,CAAC;CACP;AALD,4CAKC;AAQD,MAAa,eAAe;IAIJ;IACA;IAJX,SAAS,GAAG,YAAY,CAAC;IAElC,YACoB,SAAuB,EACvB,MAAe;QADf,cAAS,GAAT,SAAS,CAAc;QACvB,WAAM,GAAN,MAAM,CAAS;IAChC,CAAC;CACP;AAPD,0CAOC;AAED,MAAa,SAAS;IAGE;IACA;IACA;IAJX,SAAS,GAAG,MAAM,CAAC;IAC5B,YACoB,SAAuB,EACvB,MAAsB,EACtB,MAAe;QAFf,cAAS,GAAT,SAAS,CAAc;QACvB,WAAM,GAAN,MAAM,CAAgB;QACtB,WAAM,GAAN,MAAM,CAAS;IAChC,CAAC;CACP;AAPD,8BAOC;AAID,MAAa,kBAAkB;IAOP;IANX,SAAS,CAAwB;IACjC,SAAS,CAAe;IACxB,MAAM,CAAkB;IACxB,MAAM,CAAU;IAEzB,YACoB,QAA0B,EAC1C,KAAkB;QADF,aAAQ,GAAR,QAAQ,CAAkB;QAG1C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;CACJ;AAfD,gDAeC;AAED,sFAAsF;AACtF,MAAa,eAAe;IAEJ;IACA;IACA;IACA;IAJpB,YACoB,OAAe,EACf,YAAoB,EACpB,OAAuC,EACvC,
|
|
1
|
+
{"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/nx-webpieces-rules/src/lib/runtime-wiring/declaration.ts"],"names":[],"mappings":";;;AAEA,8FAA8F;AAC9F,MAAa,gBAAgB;IAEL;IACA;IAFpB,YACoB,OAAe,EACf,YAAoB;QADpB,YAAO,GAAP,OAAO,CAAQ;QACf,iBAAY,GAAZ,YAAY,CAAQ;IACrC,CAAC;CACP;AALD,4CAKC;AAQD,MAAa,eAAe;IAIJ;IACA;IAJX,SAAS,GAAG,YAAY,CAAC;IAElC,YACoB,SAAuB,EACvB,MAAe;QADf,cAAS,GAAT,SAAS,CAAc;QACvB,WAAM,GAAN,MAAM,CAAS;IAChC,CAAC;CACP;AAPD,0CAOC;AAED,MAAa,SAAS;IAGE;IACA;IACA;IAJX,SAAS,GAAG,MAAM,CAAC;IAC5B,YACoB,SAAuB,EACvB,MAAsB,EACtB,MAAe;QAFf,cAAS,GAAT,SAAS,CAAc;QACvB,WAAM,GAAN,MAAM,CAAgB;QACtB,WAAM,GAAN,MAAM,CAAS;IAChC,CAAC;CACP;AAPD,8BAOC;AAID,MAAa,kBAAkB;IAOP;IANX,SAAS,CAAwB;IACjC,SAAS,CAAe;IACxB,MAAM,CAAkB;IACxB,MAAM,CAAU;IAEzB,YACoB,QAA0B,EAC1C,KAAkB;QADF,aAAQ,GAAR,QAAQ,CAAkB;QAG1C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;CACJ;AAfD,gDAeC;AAED,sFAAsF;AACtF,MAAa,eAAe;IAEJ;IACA;IACA;IACA;IAJpB,YACoB,OAAe,EACf,YAAoB,EACpB,OAAuC,EACvC,QAAqC;QAHrC,YAAO,GAAP,OAAO,CAAQ;QACf,iBAAY,GAAZ,YAAY,CAAQ;QACpB,YAAO,GAAP,OAAO,CAAgC;QACvC,aAAQ,GAAR,QAAQ,CAA6B;IACtD,CAAC;CACP;AAPD,0CAOC;AAID,MAAa,YAAY;IAED;IACA;IACA;IACA;IACA;IALpB,YACoB,IAA2D,EAC3D,aAAmC,EACnC,cAAiC,EACjC,iBAAoC,EAAE,EACtC,UAA6B,EAAE;QAJ/B,SAAI,GAAJ,IAAI,CAAuD;QAC3D,kBAAa,GAAb,aAAa,CAAsB;QACnC,mBAAc,GAAd,cAAc,CAAmB;QACjC,mBAAc,GAAd,cAAc,CAAwB;QACtC,YAAO,GAAP,OAAO,CAAwB;IAChD,CAAC;CACP;AARD,oCAQC;AAED,6FAA6F;AAC7F,MAAa,kBAAkB;IAQ3B,YACI,OAAe,EACf,SAAyC,EACzC,OAAqC,EACrC,KAAc,EACd,IAAa;QAEb,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ;AAtBD,gDAsBC","sourcesContent":["import type { ApiTransport, ExternalSystemDeclaration } from '../api-usage/api-relations';\n\n/** Stable source identity. Equal class shapes or short names never establish API identity. */\nexport class ContractIdentity {\n constructor(\n public readonly project: string,\n public readonly exportedName: string,\n ) {}\n}\n\nexport type DeclaredTarget =\n | { kind: 'service'; service: string; contract?: ContractIdentity }\n | { kind: 'parameter'; parameter: string }\n | { kind: 'external'; system: ExternalSystemDeclaration }\n | { kind: 'unknown'; reason: string };\n\nexport class ImplementsFacts {\n readonly direction = 'implements';\n declare readonly target?: never;\n constructor(\n public readonly transport: ApiTransport,\n public readonly policy?: string,\n ) {}\n}\n\nexport class UsesFacts {\n readonly direction = 'uses';\n constructor(\n public readonly transport: ApiTransport,\n public readonly target: DeclaredTarget,\n public readonly policy?: string,\n ) {}\n}\n\nexport type WiringFacts = ImplementsFacts | UsesFacts;\n\nexport class WiringRelationship {\n readonly direction: 'implements' | 'uses';\n readonly transport: ApiTransport;\n readonly target?: DeclaredTarget;\n readonly policy?: string;\n\n constructor(\n public readonly contract: ContractIdentity,\n facts: WiringFacts,\n ) {\n this.direction = facts.direction;\n this.transport = facts.transport;\n this.target = facts.direction === 'uses' ? facts.target : undefined;\n this.policy = facts.policy;\n }\n}\n\n/** Only these exports execute, in this order, with these graph-relevant arguments. */\nexport class WiringSelection {\n constructor(\n public readonly project: string,\n public readonly exportedName: string,\n public readonly targets: Record<string, DeclaredTarget>,\n public readonly policies: Record<string, PolicyValue>,\n ) {}\n}\n\nexport type PolicyValue = boolean | 'runtime' | { parameter: string };\n\nexport class WiringExport {\n constructor(\n public readonly kind: 'binding' | 'routing' | 'wiring' | 'app' | 'external',\n public readonly relationships: WiringRelationship[],\n public readonly bindingModules: WiringSelection[],\n public readonly routingModules: WiringSelection[] = [],\n public readonly wirings: WiringSelection[] = [],\n ) {}\n}\n\n/** No timestamps, machine paths, credentials, deployment URLs, or cache keys belong here. */\nexport class RuntimeDeclaration {\n declare readonly schemaVersion: 2;\n declare readonly project: string;\n declare readonly framework: 'node' | 'angular' | 'browser';\n declare readonly exports: Record<string, WiringExport>;\n declare readonly entry?: string;\n declare readonly host?: string;\n\n constructor(\n project: string,\n framework: 'node' | 'angular' | 'browser',\n exports: Record<string, WiringExport>,\n entry?: string,\n host?: string,\n ) {\n this.schemaVersion = 2;\n this.project = project;\n this.framework = framework;\n this.exports = exports;\n this.entry = entry;\n this.host = host;\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
/** Infer graph-relevant constructor paths from destination uses and selected named modules. */
|
|
3
|
+
export declare class PreparedTargets {
|
|
4
|
+
private readonly checker;
|
|
5
|
+
private readonly types;
|
|
6
|
+
constructor(checker: ts.TypeChecker);
|
|
7
|
+
paths(invocation: ts.NewExpression | ts.CallExpression, channel: 'target' | 'policy'): string[];
|
|
8
|
+
path(expression: ts.Expression): string | undefined;
|
|
9
|
+
private collect;
|
|
10
|
+
private clientCall;
|
|
11
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PreparedTargets = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ts = tslib_1.__importStar(require("typescript"));
|
|
6
|
+
const source_types_1 = require("./source-types");
|
|
7
|
+
/** Infer graph-relevant constructor paths from destination uses and selected named modules. */
|
|
8
|
+
class PreparedTargets {
|
|
9
|
+
checker;
|
|
10
|
+
types;
|
|
11
|
+
constructor(checker) {
|
|
12
|
+
this.checker = checker;
|
|
13
|
+
this.types = new source_types_1.WiringSourceTypes(checker);
|
|
14
|
+
}
|
|
15
|
+
paths(invocation, channel) {
|
|
16
|
+
const declaration = this.checker.getResolvedSignature(invocation)?.declaration?.parent;
|
|
17
|
+
if (declaration === undefined || !ts.isClassDeclaration(declaration))
|
|
18
|
+
return [];
|
|
19
|
+
return this.collect(declaration, new Set(), channel);
|
|
20
|
+
}
|
|
21
|
+
path(expression) {
|
|
22
|
+
if (ts.isIdentifier(expression))
|
|
23
|
+
return expression.text;
|
|
24
|
+
if (!ts.isPropertyAccessExpression(expression))
|
|
25
|
+
return undefined;
|
|
26
|
+
if (expression.expression.kind === ts.SyntaxKind.ThisKeyword)
|
|
27
|
+
return expression.name.text;
|
|
28
|
+
const parent = this.path(expression.expression);
|
|
29
|
+
return parent === undefined ? undefined : `${parent}.${expression.name.text}`;
|
|
30
|
+
}
|
|
31
|
+
collect(declaration, active, channel) {
|
|
32
|
+
if (active.has(declaration))
|
|
33
|
+
return [];
|
|
34
|
+
const next = new Set([...active, declaration]);
|
|
35
|
+
const parameters = declaration.members.filter(ts.isConstructorDeclaration).flatMap((constructor) => constructor.parameters.map((parameter) => parameter.name.getText()));
|
|
36
|
+
const paths = new Set();
|
|
37
|
+
const retain = (path) => {
|
|
38
|
+
if (path !== undefined && parameters.includes(path.split('.')[0]))
|
|
39
|
+
paths.add(path);
|
|
40
|
+
};
|
|
41
|
+
const visit = (node) => {
|
|
42
|
+
if (channel === 'policy' && ts.isPropertyAccessExpression(node) && node.name.text === 'enabled')
|
|
43
|
+
retain(this.path(node.expression));
|
|
44
|
+
if (channel === 'target' && ts.isCallExpression(node) && this.clientCall(node)) {
|
|
45
|
+
const target = node.arguments[2];
|
|
46
|
+
if (target !== undefined)
|
|
47
|
+
retain(this.path(target));
|
|
48
|
+
}
|
|
49
|
+
if (ts.isNewExpression(node) && this.types.kind(node.expression) !== undefined) {
|
|
50
|
+
const child = this.types.declaration(node.expression);
|
|
51
|
+
const signature = this.checker.getResolvedSignature(node);
|
|
52
|
+
if (child !== undefined && ts.isClassDeclaration(child)) {
|
|
53
|
+
for (const path of this.collect(child, next, channel)) {
|
|
54
|
+
const parts = path.split('.');
|
|
55
|
+
const name = parts[0];
|
|
56
|
+
const suffix = parts.slice(1);
|
|
57
|
+
const index = signature?.getParameters().findIndex((parameter) => parameter.name === name) ?? -1;
|
|
58
|
+
const argument = node.arguments?.[index];
|
|
59
|
+
if (argument === undefined)
|
|
60
|
+
continue;
|
|
61
|
+
const parent = this.path(argument);
|
|
62
|
+
retain(parent === undefined ? undefined : [parent, ...suffix].join('.'));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
ts.forEachChild(node, visit);
|
|
67
|
+
};
|
|
68
|
+
ts.forEachChild(declaration, visit);
|
|
69
|
+
return [...paths].sort();
|
|
70
|
+
}
|
|
71
|
+
clientCall(call) {
|
|
72
|
+
const signature = this.checker.getResolvedSignature(call)?.declaration;
|
|
73
|
+
if (signature === undefined || (!ts.isMethodDeclaration(signature) && !ts.isFunctionDeclaration(signature)))
|
|
74
|
+
return false;
|
|
75
|
+
const file = signature.getSourceFile().fileName.replace(/\\/g, '/');
|
|
76
|
+
const name = signature.name?.getText();
|
|
77
|
+
return name !== undefined && ['bindRpc', 'bindPubSub', 'provideRpcClient'].includes(name) &&
|
|
78
|
+
/(?:\/packages\/(?:http|cloud)\/|\/node_modules\/@webpieces\/)(?:http-client-node|http-client-browser|cloudtasks-client)\//.test(file);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.PreparedTargets = PreparedTargets;
|
|
82
|
+
//# sourceMappingURL=prepared-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepared-targets.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/nx-webpieces-rules/src/lib/runtime-wiring/prepared-targets.ts"],"names":[],"mappings":";;;;AAAA,uDAAiC;AACjC,iDAAmD;AAEnD,+FAA+F;AAC/F,MAAa,eAAe;IAGK;IAFZ,KAAK,CAAoB;IAE1C,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,gCAAiB,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,UAAgD,EAAE,OAA4B;QAChF,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC;QACvF,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC;YAAE,OAAO,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,GAAG,EAAuB,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,CAAC,UAAyB;QAC1B,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC,IAAI,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC;YAAE,OAAO,SAAS,CAAC;QACjE,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;YAAE,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAChD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClF,CAAC;IAEO,OAAO,CAAC,WAAgC,EAAE,MAAgC,EAAE,OAA4B;QAC5G,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAC9E,CAAC,WAAsC,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAClE,CAAC,SAAkC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CACnE,CACJ,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,IAAwB,EAAQ,EAAE;YAC9C,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;YAClC,IAAI,OAAO,KAAK,QAAQ,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;gBAC3F,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACvC,IAAI,OAAO,KAAK,QAAQ,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,MAAM,KAAK,SAAS;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;wBACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBACtB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC9B,MAAM,KAAK,GAAG,SAAS,EAAE,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,SAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC5G,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;wBACzC,IAAI,QAAQ,KAAK,SAAS;4BAAE,SAAS;wBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACnC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC7E,CAAC;gBACL,CAAC;YACL,CAAC;YACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAEO,UAAU,CAAC,IAAuB;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QACvE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1H,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QACvC,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrF,2HAA2H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/I,CAAC;CACJ;AAtED,0CAsEC","sourcesContent":["import * as ts from 'typescript';\nimport { WiringSourceTypes } from './source-types';\n\n/** Infer graph-relevant constructor paths from destination uses and selected named modules. */\nexport class PreparedTargets {\n private readonly types: WiringSourceTypes;\n\n constructor(private readonly checker: ts.TypeChecker) {\n this.types = new WiringSourceTypes(checker);\n }\n\n paths(invocation: ts.NewExpression | ts.CallExpression, channel: 'target' | 'policy'): string[] {\n const declaration = this.checker.getResolvedSignature(invocation)?.declaration?.parent;\n if (declaration === undefined || !ts.isClassDeclaration(declaration)) return [];\n return this.collect(declaration, new Set<ts.ClassDeclaration>(), channel);\n }\n\n path(expression: ts.Expression): string | undefined {\n if (ts.isIdentifier(expression)) return expression.text;\n if (!ts.isPropertyAccessExpression(expression)) return undefined;\n if (expression.expression.kind === ts.SyntaxKind.ThisKeyword) return expression.name.text;\n const parent = this.path(expression.expression);\n return parent === undefined ? undefined : `${parent}.${expression.name.text}`;\n }\n\n private collect(declaration: ts.ClassDeclaration, active: Set<ts.ClassDeclaration>, channel: 'target' | 'policy'): string[] {\n if (active.has(declaration)) return [];\n const next = new Set([...active, declaration]);\n const parameters = declaration.members.filter(ts.isConstructorDeclaration).flatMap(\n (constructor: ts.ConstructorDeclaration) => constructor.parameters.map(\n (parameter: ts.ParameterDeclaration) => parameter.name.getText(),\n ),\n );\n const paths = new Set<string>();\n const retain = (path: string | undefined): void => {\n if (path !== undefined && parameters.includes(path.split('.')[0])) paths.add(path);\n };\n const visit = (node: ts.Node): void => {\n if (channel === 'policy' && ts.isPropertyAccessExpression(node) && node.name.text === 'enabled')\n retain(this.path(node.expression));\n if (channel === 'target' && ts.isCallExpression(node) && this.clientCall(node)) {\n const target = node.arguments[2];\n if (target !== undefined) retain(this.path(target));\n }\n if (ts.isNewExpression(node) && this.types.kind(node.expression) !== undefined) {\n const child = this.types.declaration(node.expression);\n const signature = this.checker.getResolvedSignature(node);\n if (child !== undefined && ts.isClassDeclaration(child)) {\n for (const path of this.collect(child, next, channel)) {\n const parts = path.split('.');\n const name = parts[0];\n const suffix = parts.slice(1);\n const index = signature?.getParameters().findIndex((parameter: ts.Symbol) => parameter.name === name) ?? -1;\n const argument = node.arguments?.[index];\n if (argument === undefined) continue;\n const parent = this.path(argument);\n retain(parent === undefined ? undefined : [parent, ...suffix].join('.'));\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(declaration, visit);\n return [...paths].sort();\n }\n\n private clientCall(call: ts.CallExpression): boolean {\n const signature = this.checker.getResolvedSignature(call)?.declaration;\n if (signature === undefined || (!ts.isMethodDeclaration(signature) && !ts.isFunctionDeclaration(signature))) return false;\n const file = signature.getSourceFile().fileName.replace(/\\\\/g, '/');\n const name = signature.name?.getText();\n return name !== undefined && ['bindRpc', 'bindPubSub', 'provideRpcClient'].includes(name) &&\n /(?:\\/packages\\/(?:http|cloud)\\/|\\/node_modules\\/@webpieces\\/)(?:http-client-node|http-client-browser|cloudtasks-client)\\//.test(file);\n }\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as ts from 'typescript';
|
|
2
2
|
import type { ProjectInfo } from '../project-info';
|
|
3
3
|
import { RuntimeDeclaration } from './declaration';
|
|
4
|
-
/** Build-only extraction. It never imports application modules or invokes their constructors. */
|
|
5
4
|
export declare class WiringSourceExtractor {
|
|
6
5
|
private readonly workspaceRoot;
|
|
7
6
|
private readonly info;
|
|
@@ -14,10 +13,12 @@ export declare class WiringSourceExtractor {
|
|
|
14
13
|
constructor(workspaceRoot: string, info: ProjectInfo, infos: ReadonlyMap<string, ProjectInfo>, program: ts.Program);
|
|
15
14
|
extract(): RuntimeDeclaration;
|
|
16
15
|
private visit;
|
|
16
|
+
private facts;
|
|
17
17
|
private recordExternal;
|
|
18
18
|
private recordRelationship;
|
|
19
|
-
private
|
|
20
|
-
private
|
|
19
|
+
private frameworkCall;
|
|
20
|
+
private recordWiring;
|
|
21
|
+
private moduleSelections;
|
|
21
22
|
private exportOwner;
|
|
22
23
|
private owns;
|
|
23
24
|
private fail;
|