@endora-commerce/cli 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +37 -0
- package/dist/bin/endora.d.ts +28 -0
- package/dist/bin/endora.d.ts.map +1 -0
- package/dist/bin/endora.js +926 -0
- package/dist/bin/endora.js.map +1 -0
- package/dist/check/estate.d.ts +189 -0
- package/dist/check/estate.d.ts.map +1 -0
- package/dist/check/estate.js +1037 -0
- package/dist/check/estate.js.map +1 -0
- package/dist/check/hosts.d.ts +25 -0
- package/dist/check/hosts.d.ts.map +1 -0
- package/dist/check/hosts.js +1347 -0
- package/dist/check/hosts.js.map +1 -0
- package/dist/check/index.d.ts +60 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +111 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/layout.d.ts +136 -0
- package/dist/check/layout.d.ts.map +1 -0
- package/dist/check/layout.js +262 -0
- package/dist/check/layout.js.map +1 -0
- package/dist/check/ledger.d.ts +98 -0
- package/dist/check/ledger.d.ts.map +1 -0
- package/dist/check/ledger.js +173 -0
- package/dist/check/ledger.js.map +1 -0
- package/dist/check/peer-owners.d.ts +116 -0
- package/dist/check/peer-owners.d.ts.map +1 -0
- package/dist/check/peer-owners.js +225 -0
- package/dist/check/peer-owners.js.map +1 -0
- package/dist/check/report.d.ts +33 -0
- package/dist/check/report.d.ts.map +1 -0
- package/dist/check/report.js +107 -0
- package/dist/check/report.js.map +1 -0
- package/dist/check/run.d.ts +147 -0
- package/dist/check/run.d.ts.map +1 -0
- package/dist/check/run.js +111 -0
- package/dist/check/run.js.map +1 -0
- package/dist/checks.d.ts +17 -0
- package/dist/checks.d.ts.map +1 -0
- package/dist/checks.js +17 -0
- package/dist/checks.js.map +1 -0
- package/dist/dev/index.d.ts +83 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +298 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/generate/divergence.d.ts +38 -0
- package/dist/generate/divergence.d.ts.map +1 -0
- package/dist/generate/divergence.js +237 -0
- package/dist/generate/divergence.js.map +1 -0
- package/dist/generate/index.d.ts +90 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +369 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/declaration.d.ts +18 -0
- package/dist/inputs/declaration.d.ts.map +1 -0
- package/dist/inputs/declaration.js +64 -0
- package/dist/inputs/declaration.js.map +1 -0
- package/dist/inputs/env-file.d.ts +73 -0
- package/dist/inputs/env-file.d.ts.map +1 -0
- package/dist/inputs/env-file.js +134 -0
- package/dist/inputs/env-file.js.map +1 -0
- package/dist/inputs/prompt.d.ts +21 -0
- package/dist/inputs/prompt.d.ts.map +1 -0
- package/dist/inputs/prompt.js +59 -0
- package/dist/inputs/prompt.js.map +1 -0
- package/dist/inputs/resolve.d.ts +163 -0
- package/dist/inputs/resolve.d.ts.map +1 -0
- package/dist/inputs/resolve.js +290 -0
- package/dist/inputs/resolve.js.map +1 -0
- package/dist/install/host.d.ts +27 -0
- package/dist/install/host.d.ts.map +1 -0
- package/dist/install/host.js +90 -0
- package/dist/install/host.js.map +1 -0
- package/dist/install/index.d.ts +173 -0
- package/dist/install/index.d.ts.map +1 -0
- package/dist/install/index.js +793 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/wizard.d.ts +144 -0
- package/dist/install/wizard.d.ts.map +1 -0
- package/dist/install/wizard.js +362 -0
- package/dist/install/wizard.js.map +1 -0
- package/dist/lib/admin-artefacts.d.ts +70 -0
- package/dist/lib/admin-artefacts.d.ts.map +1 -0
- package/dist/lib/admin-artefacts.js +354 -0
- package/dist/lib/admin-artefacts.js.map +1 -0
- package/dist/lib/admin-surfaces.d.ts +298 -0
- package/dist/lib/admin-surfaces.d.ts.map +1 -0
- package/dist/lib/admin-surfaces.js +669 -0
- package/dist/lib/admin-surfaces.js.map +1 -0
- package/dist/lib/delegated-composer.d.ts +85 -0
- package/dist/lib/delegated-composer.d.ts.map +1 -0
- package/dist/lib/delegated-composer.js +241 -0
- package/dist/lib/delegated-composer.js.map +1 -0
- package/dist/lib/divergence-artefacts.d.ts +305 -0
- package/dist/lib/divergence-artefacts.d.ts.map +1 -0
- package/dist/lib/divergence-artefacts.js +828 -0
- package/dist/lib/divergence-artefacts.js.map +1 -0
- package/dist/lib/divergence.d.ts +337 -0
- package/dist/lib/divergence.d.ts.map +1 -0
- package/dist/lib/divergence.js +1005 -0
- package/dist/lib/divergence.js.map +1 -0
- package/dist/lib/docs-artefacts.d.ts +395 -0
- package/dist/lib/docs-artefacts.d.ts.map +1 -0
- package/dist/lib/docs-artefacts.js +781 -0
- package/dist/lib/docs-artefacts.js.map +1 -0
- package/dist/lib/emitted-exports.d.ts +21 -0
- package/dist/lib/emitted-exports.d.ts.map +1 -0
- package/dist/lib/emitted-exports.js +96 -0
- package/dist/lib/emitted-exports.js.map +1 -0
- package/dist/lib/emitted-freshness.d.ts +112 -0
- package/dist/lib/emitted-freshness.d.ts.map +1 -0
- package/dist/lib/emitted-freshness.js +288 -0
- package/dist/lib/emitted-freshness.js.map +1 -0
- package/dist/lib/entity-index-artefact.d.ts +95 -0
- package/dist/lib/entity-index-artefact.d.ts.map +1 -0
- package/dist/lib/entity-index-artefact.js +210 -0
- package/dist/lib/entity-index-artefact.js.map +1 -0
- package/dist/lib/instance-build-inputs.d.ts +108 -0
- package/dist/lib/instance-build-inputs.d.ts.map +1 -0
- package/dist/lib/instance-build-inputs.js +165 -0
- package/dist/lib/instance-build-inputs.js.map +1 -0
- package/dist/lib/module-docs.d.ts +473 -0
- package/dist/lib/module-docs.d.ts.map +1 -0
- package/dist/lib/module-docs.js +711 -0
- package/dist/lib/module-docs.js.map +1 -0
- package/dist/lib/module-package-subpaths.d.ts +56 -0
- package/dist/lib/module-package-subpaths.d.ts.map +1 -0
- package/dist/lib/module-package-subpaths.js +223 -0
- package/dist/lib/module-package-subpaths.js.map +1 -0
- package/dist/lib/module-packages.d.ts +200 -0
- package/dist/lib/module-packages.d.ts.map +1 -0
- package/dist/lib/module-packages.js +580 -0
- package/dist/lib/module-packages.js.map +1 -0
- package/dist/lib/module-population.d.ts +129 -0
- package/dist/lib/module-population.d.ts.map +1 -0
- package/dist/lib/module-population.js +172 -0
- package/dist/lib/module-population.js.map +1 -0
- package/dist/lib/module-roots.d.ts +337 -0
- package/dist/lib/module-roots.d.ts.map +1 -0
- package/dist/lib/module-roots.js +586 -0
- package/dist/lib/module-roots.js.map +1 -0
- package/dist/lib/nested-checkouts.d.ts +33 -0
- package/dist/lib/nested-checkouts.d.ts.map +1 -0
- package/dist/lib/nested-checkouts.js +160 -0
- package/dist/lib/nested-checkouts.js.map +1 -0
- package/dist/lib/platform-root.d.ts +43 -0
- package/dist/lib/platform-root.d.ts.map +1 -0
- package/dist/lib/platform-root.js +134 -0
- package/dist/lib/platform-root.js.map +1 -0
- package/dist/lib/platform-surface.d.ts +235 -0
- package/dist/lib/platform-surface.d.ts.map +1 -0
- package/dist/lib/platform-surface.js +393 -0
- package/dist/lib/platform-surface.js.map +1 -0
- package/dist/lib/port-registrations.d.ts +223 -0
- package/dist/lib/port-registrations.d.ts.map +1 -0
- package/dist/lib/port-registrations.js +532 -0
- package/dist/lib/port-registrations.js.map +1 -0
- package/dist/lib/read-size.d.ts +154 -0
- package/dist/lib/read-size.d.ts.map +1 -0
- package/dist/lib/read-size.js +182 -0
- package/dist/lib/read-size.js.map +1 -0
- package/dist/lib/registration-owners.d.ts +79 -0
- package/dist/lib/registration-owners.d.ts.map +1 -0
- package/dist/lib/registration-owners.js +77 -0
- package/dist/lib/registration-owners.js.map +1 -0
- package/dist/lib/release-index.d.ts +53 -0
- package/dist/lib/release-index.d.ts.map +1 -0
- package/dist/lib/release-index.js +162 -0
- package/dist/lib/release-index.js.map +1 -0
- package/dist/lib/repeating-timers.d.ts +79 -0
- package/dist/lib/repeating-timers.d.ts.map +1 -0
- package/dist/lib/repeating-timers.js +189 -0
- package/dist/lib/repeating-timers.js.map +1 -0
- package/dist/lib/source-text.d.ts +34 -0
- package/dist/lib/source-text.d.ts.map +1 -0
- package/dist/lib/source-text.js +80 -0
- package/dist/lib/source-text.js.map +1 -0
- package/dist/lib/specifiers.d.ts +20 -0
- package/dist/lib/specifiers.d.ts.map +1 -0
- package/dist/lib/specifiers.js +130 -0
- package/dist/lib/specifiers.js.map +1 -0
- package/dist/lib/sql-tables.d.ts +166 -0
- package/dist/lib/sql-tables.d.ts.map +1 -0
- package/dist/lib/sql-tables.js +464 -0
- package/dist/lib/sql-tables.js.map +1 -0
- package/dist/lib/switchable-modules.d.ts +54 -0
- package/dist/lib/switchable-modules.d.ts.map +1 -0
- package/dist/lib/switchable-modules.js +104 -0
- package/dist/lib/switchable-modules.js.map +1 -0
- package/dist/lib/tailwind-sources.d.ts +136 -0
- package/dist/lib/tailwind-sources.d.ts.map +1 -0
- package/dist/lib/tailwind-sources.js +307 -0
- package/dist/lib/tailwind-sources.js.map +1 -0
- package/dist/lib/ui-layer.d.ts +54 -0
- package/dist/lib/ui-layer.d.ts.map +1 -0
- package/dist/lib/ui-layer.js +57 -0
- package/dist/lib/ui-layer.js.map +1 -0
- package/dist/lib/workspace-packages.d.ts +186 -0
- package/dist/lib/workspace-packages.d.ts.map +1 -0
- package/dist/lib/workspace-packages.js +351 -0
- package/dist/lib/workspace-packages.js.map +1 -0
- package/dist/new-instance/deploy.d.ts +211 -0
- package/dist/new-instance/deploy.d.ts.map +1 -0
- package/dist/new-instance/deploy.js +1381 -0
- package/dist/new-instance/deploy.js.map +1 -0
- package/dist/new-instance/docs-toolchain.d.ts +66 -0
- package/dist/new-instance/docs-toolchain.d.ts.map +1 -0
- package/dist/new-instance/docs-toolchain.js +69 -0
- package/dist/new-instance/docs-toolchain.js.map +1 -0
- package/dist/new-instance/host.d.ts +124 -0
- package/dist/new-instance/host.d.ts.map +1 -0
- package/dist/new-instance/host.js +276 -0
- package/dist/new-instance/host.js.map +1 -0
- package/dist/new-instance/index.d.ts +118 -0
- package/dist/new-instance/index.d.ts.map +1 -0
- package/dist/new-instance/index.js +567 -0
- package/dist/new-instance/index.js.map +1 -0
- package/dist/new-instance/modules.d.ts +188 -0
- package/dist/new-instance/modules.d.ts.map +1 -0
- package/dist/new-instance/modules.js +392 -0
- package/dist/new-instance/modules.js.map +1 -0
- package/dist/new-instance/template.d.ts +505 -0
- package/dist/new-instance/template.d.ts.map +1 -0
- package/dist/new-instance/template.js +1886 -0
- package/dist/new-instance/template.js.map +1 -0
- package/dist/new-module/emit.d.ts +67 -0
- package/dist/new-module/emit.d.ts.map +1 -0
- package/dist/new-module/emit.js +1393 -0
- package/dist/new-module/emit.js.map +1 -0
- package/dist/new-module/host.d.ts +67 -0
- package/dist/new-module/host.d.ts.map +1 -0
- package/dist/new-module/host.js +224 -0
- package/dist/new-module/host.js.map +1 -0
- package/dist/new-module/index.d.ts +32 -0
- package/dist/new-module/index.d.ts.map +1 -0
- package/dist/new-module/index.js +193 -0
- package/dist/new-module/index.js.map +1 -0
- package/dist/new-module/spec.d.ts +188 -0
- package/dist/new-module/spec.d.ts.map +1 -0
- package/dist/new-module/spec.js +404 -0
- package/dist/new-module/spec.js.map +1 -0
- package/dist/new-module/text.d.ts +15 -0
- package/dist/new-module/text.d.ts.map +1 -0
- package/dist/new-module/text.js +22 -0
- package/dist/new-module/text.js.map +1 -0
- package/dist/new-storefront/dockerfile.d.ts +20 -0
- package/dist/new-storefront/dockerfile.d.ts.map +1 -0
- package/dist/new-storefront/dockerfile.js +131 -0
- package/dist/new-storefront/dockerfile.js.map +1 -0
- package/dist/new-storefront/gitignore.d.ts +23 -0
- package/dist/new-storefront/gitignore.d.ts.map +1 -0
- package/dist/new-storefront/gitignore.js +39 -0
- package/dist/new-storefront/gitignore.js.map +1 -0
- package/dist/new-storefront/index.d.ts +93 -0
- package/dist/new-storefront/index.d.ts.map +1 -0
- package/dist/new-storefront/index.js +329 -0
- package/dist/new-storefront/index.js.map +1 -0
- package/dist/new-storefront/npmrc.d.ts +98 -0
- package/dist/new-storefront/npmrc.d.ts.map +1 -0
- package/dist/new-storefront/npmrc.js +217 -0
- package/dist/new-storefront/npmrc.js.map +1 -0
- package/dist/new-storefront/reference.d.ts +189 -0
- package/dist/new-storefront/reference.d.ts.map +1 -0
- package/dist/new-storefront/reference.js +430 -0
- package/dist/new-storefront/reference.js.map +1 -0
- package/dist/new-storefront/rewrite.d.ts +171 -0
- package/dist/new-storefront/rewrite.d.ts.map +1 -0
- package/dist/new-storefront/rewrite.js +701 -0
- package/dist/new-storefront/rewrite.js.map +1 -0
- package/dist/release-index.json +284 -0
- package/dist/rules/action-route-permissions.d.ts +141 -0
- package/dist/rules/action-route-permissions.d.ts.map +1 -0
- package/dist/rules/action-route-permissions.js +556 -0
- package/dist/rules/action-route-permissions.js.map +1 -0
- package/dist/rules/bundle-pairing.d.ts +74 -0
- package/dist/rules/bundle-pairing.d.ts.map +1 -0
- package/dist/rules/bundle-pairing.js +281 -0
- package/dist/rules/bundle-pairing.js.map +1 -0
- package/dist/rules/channel-resolution.d.ts +17 -0
- package/dist/rules/channel-resolution.d.ts.map +1 -0
- package/dist/rules/channel-resolution.js +382 -0
- package/dist/rules/channel-resolution.js.map +1 -0
- package/dist/rules/command-coverage.d.ts +210 -0
- package/dist/rules/command-coverage.d.ts.map +1 -0
- package/dist/rules/command-coverage.js +714 -0
- package/dist/rules/command-coverage.js.map +1 -0
- package/dist/rules/container-imports.d.ts +60 -0
- package/dist/rules/container-imports.d.ts.map +1 -0
- package/dist/rules/container-imports.js +158 -0
- package/dist/rules/container-imports.js.map +1 -0
- package/dist/rules/default-language-prose.d.ts +212 -0
- package/dist/rules/default-language-prose.d.ts.map +1 -0
- package/dist/rules/default-language-prose.js +710 -0
- package/dist/rules/default-language-prose.js.map +1 -0
- package/dist/rules/diacritic-folds.d.ts +238 -0
- package/dist/rules/diacritic-folds.d.ts.map +1 -0
- package/dist/rules/diacritic-folds.js +681 -0
- package/dist/rules/diacritic-folds.js.map +1 -0
- package/dist/rules/entity-tenant-classification.d.ts +171 -0
- package/dist/rules/entity-tenant-classification.d.ts.map +1 -0
- package/dist/rules/entity-tenant-classification.js +323 -0
- package/dist/rules/entity-tenant-classification.js.map +1 -0
- package/dist/rules/entry-presence.d.ts +142 -0
- package/dist/rules/entry-presence.d.ts.map +1 -0
- package/dist/rules/entry-presence.js +339 -0
- package/dist/rules/entry-presence.js.map +1 -0
- package/dist/rules/entry-scope.d.ts +91 -0
- package/dist/rules/entry-scope.d.ts.map +1 -0
- package/dist/rules/entry-scope.js +404 -0
- package/dist/rules/entry-scope.js.map +1 -0
- package/dist/rules/env-inputs.d.ts +222 -0
- package/dist/rules/env-inputs.d.ts.map +1 -0
- package/dist/rules/env-inputs.js +951 -0
- package/dist/rules/env-inputs.js.map +1 -0
- package/dist/rules/kernel-boundary.d.ts +37 -0
- package/dist/rules/kernel-boundary.d.ts.map +1 -0
- package/dist/rules/kernel-boundary.js +195 -0
- package/dist/rules/kernel-boundary.js.map +1 -0
- package/dist/rules/nul-bytes.d.ts +233 -0
- package/dist/rules/nul-bytes.d.ts.map +1 -0
- package/dist/rules/nul-bytes.js +332 -0
- package/dist/rules/nul-bytes.js.map +1 -0
- package/dist/rules/platform-surface.d.ts +479 -0
- package/dist/rules/platform-surface.d.ts.map +1 -0
- package/dist/rules/platform-surface.js +749 -0
- package/dist/rules/platform-surface.js.map +1 -0
- package/dist/rules/port-catches.d.ts +225 -0
- package/dist/rules/port-catches.d.ts.map +1 -0
- package/dist/rules/port-catches.js +1374 -0
- package/dist/rules/port-catches.js.map +1 -0
- package/dist/rules/port-shape.d.ts +213 -0
- package/dist/rules/port-shape.d.ts.map +1 -0
- package/dist/rules/port-shape.js +670 -0
- package/dist/rules/port-shape.js.map +1 -0
- package/dist/rules/queue-names.d.ts +108 -0
- package/dist/rules/queue-names.d.ts.map +1 -0
- package/dist/rules/queue-names.js +395 -0
- package/dist/rules/queue-names.js.map +1 -0
- package/dist/rules/singleton-identity.d.ts +205 -0
- package/dist/rules/singleton-identity.d.ts.map +1 -0
- package/dist/rules/singleton-identity.js +830 -0
- package/dist/rules/singleton-identity.js.map +1 -0
- package/dist/rules/subscribe-seam.d.ts +121 -0
- package/dist/rules/subscribe-seam.d.ts.map +1 -0
- package/dist/rules/subscribe-seam.js +594 -0
- package/dist/rules/subscribe-seam.js.map +1 -0
- package/dist/rules/transaction-context.d.ts +40 -0
- package/dist/rules/transaction-context.d.ts.map +1 -0
- package/dist/rules/transaction-context.js +294 -0
- package/dist/rules/transaction-context.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container registrations and port resolutions, read out of TypeScript sources
|
|
3
|
+
* through the compiler API.
|
|
4
|
+
*
|
|
5
|
+
* `check:port-dependencies` and `check:port-shape` both have to answer the same
|
|
6
|
+
* three questions of a module's sources — *which names does it register*, *which
|
|
7
|
+
* ports does it provide* and *which names does it resolve* — and one of those two
|
|
8
|
+
* rules now has two hosts (`specs/101-endora-check/contracts/package-scope-layout.md`
|
|
9
|
+
* §6: `backend/scripts/check-port-shape.ts` over this repository, `endora check`
|
|
10
|
+
* over one module package). A predicate three callers share has to live where
|
|
11
|
+
* all three can reach it, which is the package.
|
|
12
|
+
*
|
|
13
|
+
* Everything here is **syntactic only**, deliberately. Whether a name is owned,
|
|
14
|
+
* whether an edge is declared and whether a capture is allowed are questions
|
|
15
|
+
* about a *composition*, and they stay with the checks that know what a
|
|
16
|
+
* composition is: this file says only what a source text spells.
|
|
17
|
+
*
|
|
18
|
+
* Attribution keys on `/src/apps/<deployment>/modules/<id>/`, then on
|
|
19
|
+
* `/src/modules/<id>/`, then on `lib/module-population.ts`' `moduleIdOf` — the
|
|
20
|
+
* same segment reader the population floor uses, with the `hostResident` map for
|
|
21
|
+
* a module whose sources the host owns. A file the walk reads and cannot name is
|
|
22
|
+
* a file every consumer here judges as nobody's and reports clean about, which
|
|
23
|
+
* is issue #215's failure one layer in.
|
|
24
|
+
*/
|
|
25
|
+
import ts from 'typescript';
|
|
26
|
+
import { moduleIdOf, NO_HOST_RESIDENT_MODULES, } from './module-population.js';
|
|
27
|
+
/**
|
|
28
|
+
* Stand-in recorded when a `lazyPort` name is not a string literal. It is owned
|
|
29
|
+
* by nobody on purpose, so it surfaces as an `unowned-name` violation naming the
|
|
30
|
+
* file and line — the same way a genuinely unregistered name does.
|
|
31
|
+
*/
|
|
32
|
+
export const NON_LITERAL_PORT_NAME = '<computed>';
|
|
33
|
+
/**
|
|
34
|
+
* The owning module id of a source file, over every root a module can live in.
|
|
35
|
+
*
|
|
36
|
+
* Three shapes, in order. The two anchored regexes answer for the application's
|
|
37
|
+
* own trees — a deployment overlay first, then the core module tree — and both
|
|
38
|
+
* key on `/src/`, so they say nothing about a module that has become a
|
|
39
|
+
* **package** (feature 080, T040a). The third is `lib/module-population.ts`'
|
|
40
|
+
* `moduleIdOf`, the same segment reader the population floor uses, and it is
|
|
41
|
+
* what makes a path like `packages/modules/blog/src/services/x.ts` attribute to
|
|
42
|
+
* `blog` instead of to nobody.
|
|
43
|
+
*
|
|
44
|
+
* That fallback is not cosmetic. Without it a package's files are read by the
|
|
45
|
+
* walk, satisfy the floor, and are then attributed to `null` — which for every
|
|
46
|
+
* consumer here means *not a module*, so the check judges none of them and
|
|
47
|
+
* reports clean. That is issue #215's failure one layer in, and it is why
|
|
48
|
+
* `resolveModuleLayout` refuses a package root whose location the segment
|
|
49
|
+
* reader cannot attribute rather than letting it through unnamed.
|
|
50
|
+
*
|
|
51
|
+
* The fourth answer is `hostResident`, the map the layout derives from the
|
|
52
|
+
* manifest index for a module whose sources the host owns and whose directory
|
|
53
|
+
* therefore carries no `modules/<id>/` segment (feature 080, T040b). It is
|
|
54
|
+
* threaded from `main` rather than left to default, for exactly the reason the
|
|
55
|
+
* third shape exists: a file the walk reads and cannot name is a file this
|
|
56
|
+
* check judges as nobody's and reports clean about.
|
|
57
|
+
*/
|
|
58
|
+
export function moduleOf(file, hostResident = NO_HOST_RESIDENT_MODULES) {
|
|
59
|
+
const overlay = /\/src\/apps\/[^/]+\/modules\/([^/]+)\//.exec(file);
|
|
60
|
+
if (overlay)
|
|
61
|
+
return overlay[1] ?? null;
|
|
62
|
+
const core = /\/src\/modules\/([^/]+)\//.exec(file);
|
|
63
|
+
if (core)
|
|
64
|
+
return core[1] ?? null;
|
|
65
|
+
return moduleIdOf(file, hostResident);
|
|
66
|
+
}
|
|
67
|
+
/** `ctx.di.register` → `di.register`; used to match on the tail, not the receiver name. */
|
|
68
|
+
export function calleeTail(node) {
|
|
69
|
+
const expression = node.expression;
|
|
70
|
+
if (!ts.isPropertyAccessExpression(expression))
|
|
71
|
+
return '';
|
|
72
|
+
const inner = expression.expression;
|
|
73
|
+
const prefix = ts.isPropertyAccessExpression(inner) ? `${inner.name.text}.` : '';
|
|
74
|
+
return `${prefix}${expression.name.text}`;
|
|
75
|
+
}
|
|
76
|
+
/** Every registration name a module claims: `di.register` keys plus `di.providePort`. */
|
|
77
|
+
export function registeredNames(source, file) {
|
|
78
|
+
const sf = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true);
|
|
79
|
+
const names = [];
|
|
80
|
+
const visit = (node) => {
|
|
81
|
+
if (ts.isCallExpression(node)) {
|
|
82
|
+
const tail = calleeTail(node);
|
|
83
|
+
const [first] = node.arguments;
|
|
84
|
+
if (tail === 'di.register' && first && ts.isObjectLiteralExpression(first)) {
|
|
85
|
+
for (const property of first.properties) {
|
|
86
|
+
if (property.name && ts.isIdentifier(property.name))
|
|
87
|
+
names.push(property.name.text);
|
|
88
|
+
else if (property.name && ts.isStringLiteral(property.name))
|
|
89
|
+
names.push(property.name.text);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (tail === 'di.providePort' && first && ts.isStringLiteral(first)) {
|
|
93
|
+
names.push(first.text);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
node.forEachChild(visit);
|
|
97
|
+
};
|
|
98
|
+
sf.forEachChild(visit);
|
|
99
|
+
return names;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The names a module registers as **gated ports** (`di.providePort`), which is
|
|
103
|
+
* the subset a composition root must never re-register.
|
|
104
|
+
*
|
|
105
|
+
* The distinction is the whole of the shadowing rule below. `di.register` is
|
|
106
|
+
* how a module declares a *contribution point* — a name it defaults, expecting
|
|
107
|
+
* a root that has something better to override it — so a root registering one
|
|
108
|
+
* of those is the design working. `di.providePort` wraps the resolver in the
|
|
109
|
+
* presence gate, and a root registration replaces the gate with a plain value.
|
|
110
|
+
*/
|
|
111
|
+
export function providedPortNames(source, file) {
|
|
112
|
+
return providedPorts(source, file).map((port) => port.name);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Every gated registration a file makes, with its type argument.
|
|
116
|
+
*
|
|
117
|
+
* The single expression of "this call is a `providePort`" in the tree.
|
|
118
|
+
* `providedPortNames` above and `check-port-shape`'s container-name signal both
|
|
119
|
+
* come through here rather than each writing the predicate again: a check whose
|
|
120
|
+
* decision exists in two places can go half-missing without its red proof
|
|
121
|
+
* noticing, which is how `check:nul-bytes` kept printing `violations=0` with its
|
|
122
|
+
* rule mutated.
|
|
123
|
+
*/
|
|
124
|
+
export function providedPorts(source, file) {
|
|
125
|
+
const sf = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true);
|
|
126
|
+
const ports = [];
|
|
127
|
+
const visit = (node) => {
|
|
128
|
+
if (ts.isCallExpression(node) && calleeTail(node) === 'di.providePort') {
|
|
129
|
+
const [first] = node.arguments;
|
|
130
|
+
if (first && ts.isStringLiteral(first)) {
|
|
131
|
+
const [typeArgument] = node.typeArguments ?? [];
|
|
132
|
+
ports.push({
|
|
133
|
+
name: first.text,
|
|
134
|
+
typeName: typeArgument && ts.isTypeReferenceNode(typeArgument) &&
|
|
135
|
+
ts.isIdentifier(typeArgument.typeName)
|
|
136
|
+
? typeArgument.typeName.text
|
|
137
|
+
: null,
|
|
138
|
+
line: sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
node.forEachChild(visit);
|
|
143
|
+
};
|
|
144
|
+
sf.forEachChild(visit);
|
|
145
|
+
return ports;
|
|
146
|
+
}
|
|
147
|
+
function isFunctionLike(node) {
|
|
148
|
+
return (ts.isArrowFunction(node) ||
|
|
149
|
+
ts.isFunctionExpression(node) ||
|
|
150
|
+
ts.isFunctionDeclaration(node) ||
|
|
151
|
+
ts.isMethodDeclaration(node));
|
|
152
|
+
}
|
|
153
|
+
/** Is `node` the first argument of a `ctx.<seam>(…)` call? */
|
|
154
|
+
function isCallbackOf(seam, node) {
|
|
155
|
+
const parent = node.parent;
|
|
156
|
+
return (parent !== undefined &&
|
|
157
|
+
ts.isCallExpression(parent) &&
|
|
158
|
+
calleeTail(parent) === seam &&
|
|
159
|
+
parent.arguments[0] === node);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Where in the module's lifecycle this read happens — see {@link ResolutionSite}.
|
|
163
|
+
*
|
|
164
|
+
* `boot` is lexical and deliberately wide: `lazyPort` defers to the method
|
|
165
|
+
* call, and inside a boot hook that call is two lines down. All seven
|
|
166
|
+
* `emailDefaultsPort` contributors had exactly that shape, and every one of
|
|
167
|
+
* them would have failed the boot had the port stayed gated.
|
|
168
|
+
*
|
|
169
|
+
* `wiring` is narrow on purpose: only the `ctx.routes` callback's own body,
|
|
170
|
+
* because that is what runs during `buildServer`. Anything nested one function
|
|
171
|
+
* deeper — a route handler, an `onRequest` hook, a preHandler — runs per
|
|
172
|
+
* request, where a gate is exactly what should be asked.
|
|
173
|
+
*/
|
|
174
|
+
export function siteAt(node) {
|
|
175
|
+
for (let current = node; current; current = current.parent) {
|
|
176
|
+
if (isCallbackOf('onBoot', current))
|
|
177
|
+
return 'boot';
|
|
178
|
+
}
|
|
179
|
+
let enclosing = node.parent;
|
|
180
|
+
while (enclosing && !isFunctionLike(enclosing))
|
|
181
|
+
enclosing = enclosing.parent;
|
|
182
|
+
if (enclosing && isCallbackOf('routes', enclosing))
|
|
183
|
+
return 'wiring';
|
|
184
|
+
return 'call';
|
|
185
|
+
}
|
|
186
|
+
/** Is this the container-cradle accessor, `ctx.cradle<C>()`? */
|
|
187
|
+
function isCradleCall(node) {
|
|
188
|
+
return ts.isCallExpression(node) && calleeTail(node).endsWith('cradle');
|
|
189
|
+
}
|
|
190
|
+
/** The expression a zero-argument function returns, if it returns exactly one. */
|
|
191
|
+
function soleReturnedExpression(fn) {
|
|
192
|
+
if (ts.isArrowFunction(fn) && !ts.isBlock(fn.body))
|
|
193
|
+
return fn.body;
|
|
194
|
+
if (!ts.isBlock(fn.body))
|
|
195
|
+
return null;
|
|
196
|
+
const [statement, ...rest] = fn.body.statements;
|
|
197
|
+
if (rest.length > 0 || statement === undefined || !ts.isReturnStatement(statement))
|
|
198
|
+
return null;
|
|
199
|
+
return statement.expression ?? null;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Every local name that stands for the container cradle, with the scope it is
|
|
203
|
+
* visible in.
|
|
204
|
+
*
|
|
205
|
+
* The check used to see two shapes only — a destructured factory parameter and
|
|
206
|
+
* `ctx.cradle<C>()` read inline — and a module that bound the cradle to a local
|
|
207
|
+
* first resolved everything it wanted unseen (issue #90). Nine modules had the
|
|
208
|
+
* object form and six the accessor form, and among them were gated ports read
|
|
209
|
+
* in a `ctx.routes` body: exactly what the wiring rule below exists to refuse.
|
|
210
|
+
*/
|
|
211
|
+
function collectCradleAliases(sf) {
|
|
212
|
+
const aliases = new Map();
|
|
213
|
+
const add = (name, alias) => {
|
|
214
|
+
const existing = aliases.get(name);
|
|
215
|
+
if (existing)
|
|
216
|
+
existing.push(alias);
|
|
217
|
+
else
|
|
218
|
+
aliases.set(name, [alias]);
|
|
219
|
+
};
|
|
220
|
+
/** The block (or file) a `const` is visible in. */
|
|
221
|
+
const blockOf = (node) => {
|
|
222
|
+
for (let current = node.parent; current; current = current.parent) {
|
|
223
|
+
if (ts.isBlock(current) || ts.isSourceFile(current))
|
|
224
|
+
return current;
|
|
225
|
+
}
|
|
226
|
+
return sf;
|
|
227
|
+
};
|
|
228
|
+
const visit = (node) => {
|
|
229
|
+
if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {
|
|
230
|
+
const initializer = node.initializer;
|
|
231
|
+
const scope = blockOf(node);
|
|
232
|
+
if (isCradleCall(initializer)) {
|
|
233
|
+
add(node.name.text, { kind: 'object', scope });
|
|
234
|
+
}
|
|
235
|
+
else if ((ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)) &&
|
|
236
|
+
initializer.parameters.length === 0) {
|
|
237
|
+
const returned = soleReturnedExpression(initializer);
|
|
238
|
+
if (returned !== null && isCradleCall(returned)) {
|
|
239
|
+
add(node.name.text, { kind: 'accessor', scope });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// A factory's first parameter *is* the cradle — that is how Awilix calls
|
|
244
|
+
// it — so a named one resolves exactly as a destructured one does. The
|
|
245
|
+
// destructured form was already read; this is the same seam written with a
|
|
246
|
+
// name, and `delivery_methods` and `payment_methods` use it.
|
|
247
|
+
if (ts.isCallExpression(node) && calleeTail(node).endsWith('asFunction')) {
|
|
248
|
+
const [factory] = node.arguments;
|
|
249
|
+
if (factory && (ts.isArrowFunction(factory) || ts.isFunctionExpression(factory))) {
|
|
250
|
+
const [parameter] = factory.parameters;
|
|
251
|
+
if (parameter && ts.isIdentifier(parameter.name)) {
|
|
252
|
+
add(parameter.name.text, { kind: 'object', scope: factory });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
node.forEachChild(visit);
|
|
257
|
+
};
|
|
258
|
+
sf.forEachChild(visit);
|
|
259
|
+
return aliases;
|
|
260
|
+
}
|
|
261
|
+
/** Is `node` inside `scope` (or `scope` itself)? */
|
|
262
|
+
function isWithin(node, scope) {
|
|
263
|
+
for (let current = node; current; current = current.parent) {
|
|
264
|
+
if (current === scope)
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Every registration name a module resolves.
|
|
271
|
+
*
|
|
272
|
+
* Three shapes, because those are the ones the kernel offers: the cradle
|
|
273
|
+
* parameter of a factory (`ctx.asFunction(({ a, b }: C) => …)`, destructured or
|
|
274
|
+
* named), the deferred surface (`ctx.cradle<C>()`) read by destructuring or by
|
|
275
|
+
* property access, and either of those bound to a local first — see
|
|
276
|
+
* {@link collectCradleAliases}.
|
|
277
|
+
*
|
|
278
|
+
* **Each shape is read both ways round.** The alias and the destructuring are
|
|
279
|
+
* independent axes, and the check used to see only five of their six
|
|
280
|
+
* combinations: `cradle().a` yes, `const { a } = ctx.cradle<C>()` yes,
|
|
281
|
+
* `const { a } = cradle()` no. That last one is what `catalog`'s
|
|
282
|
+
* asset-reference boot hook is written as, so its two reads were invisible
|
|
283
|
+
* until issue #127 — the eighth time this scanner's *reach*, rather than the
|
|
284
|
+
* rules under it, turned out to be the defect.
|
|
285
|
+
*/
|
|
286
|
+
export function resolvedNames(source, file, hostResident = NO_HOST_RESIDENT_MODULES) {
|
|
287
|
+
const moduleId = moduleOf(file, hostResident);
|
|
288
|
+
if (moduleId === null)
|
|
289
|
+
return [];
|
|
290
|
+
const sf = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true);
|
|
291
|
+
const found = [];
|
|
292
|
+
const cradleAliases = collectCradleAliases(sf);
|
|
293
|
+
const record = (name, node, kind, site = siteAt(node), via = 'cradle') => {
|
|
294
|
+
found.push({
|
|
295
|
+
moduleId,
|
|
296
|
+
name,
|
|
297
|
+
file,
|
|
298
|
+
line: sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1,
|
|
299
|
+
kind,
|
|
300
|
+
site,
|
|
301
|
+
via,
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
const recordBindingPattern = (pattern, kind) => {
|
|
305
|
+
for (const element of pattern.elements) {
|
|
306
|
+
const property = element.propertyName ?? element.name;
|
|
307
|
+
if (ts.isIdentifier(property))
|
|
308
|
+
record(property.text, element, kind);
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
/**
|
|
312
|
+
* Is this `ctx.cradle()` call evaluated when the registration is built, or
|
|
313
|
+
* when somebody uses it?
|
|
314
|
+
*
|
|
315
|
+
* Walk out to the nearest enclosing function. If that function is the factory
|
|
316
|
+
* handed to `asFunction`, the call runs at construction — a capture. If any
|
|
317
|
+
* other function sits in between (a method, a route registrar, a subscriber
|
|
318
|
+
* handler, an arrow passed to a service), the call runs when that function
|
|
319
|
+
* does — a genuine deferral.
|
|
320
|
+
*/
|
|
321
|
+
const readKindAt = (node) => {
|
|
322
|
+
let current = node.parent;
|
|
323
|
+
while (current) {
|
|
324
|
+
if (ts.isArrowFunction(current) ||
|
|
325
|
+
ts.isFunctionExpression(current) ||
|
|
326
|
+
ts.isFunctionDeclaration(current) ||
|
|
327
|
+
ts.isMethodDeclaration(current)) {
|
|
328
|
+
const owner = current.parent;
|
|
329
|
+
const isFactoryOfAsFunction = owner !== undefined &&
|
|
330
|
+
ts.isCallExpression(owner) &&
|
|
331
|
+
calleeTail(owner).endsWith('asFunction') &&
|
|
332
|
+
owner.arguments[0] === current;
|
|
333
|
+
return isFactoryOfAsFunction ? 'captured' : 'deferred';
|
|
334
|
+
}
|
|
335
|
+
current = current.parent;
|
|
336
|
+
}
|
|
337
|
+
return 'deferred';
|
|
338
|
+
};
|
|
339
|
+
/**
|
|
340
|
+
* The cradle a read is written against, if the receiver is a local alias
|
|
341
|
+
* visible here — `cradle.x` for an `object` alias, `cradle().x` for an
|
|
342
|
+
* `accessor` one. Innermost declaration wins, so a shadowed name is read in
|
|
343
|
+
* the scope that declared it.
|
|
344
|
+
*/
|
|
345
|
+
const aliasReceiverOf = (receiver) => {
|
|
346
|
+
const named = ts.isIdentifier(receiver) && cradleAliases.has(receiver.text)
|
|
347
|
+
? { name: receiver.text, wanted: 'object' }
|
|
348
|
+
: ts.isCallExpression(receiver) &&
|
|
349
|
+
receiver.arguments.length === 0 &&
|
|
350
|
+
ts.isIdentifier(receiver.expression) &&
|
|
351
|
+
cradleAliases.has(receiver.expression.text)
|
|
352
|
+
? { name: receiver.expression.text, wanted: 'accessor' }
|
|
353
|
+
: null;
|
|
354
|
+
if (named === null)
|
|
355
|
+
return null;
|
|
356
|
+
const candidates = (cradleAliases.get(named.name) ?? []).filter((alias) => alias.kind === named.wanted && isWithin(receiver, alias.scope));
|
|
357
|
+
return candidates.at(-1) ?? null;
|
|
358
|
+
};
|
|
359
|
+
const visit = (node) => {
|
|
360
|
+
// A read off a local cradle alias. The alias itself resolves nothing — the
|
|
361
|
+
// cradle is a proxy — so the property access is the resolution, and its own
|
|
362
|
+
// position decides both the kind and the site.
|
|
363
|
+
if (ts.isPropertyAccessExpression(node) && aliasReceiverOf(node.expression) !== null) {
|
|
364
|
+
record(node.name.text, node, readKindAt(node));
|
|
365
|
+
}
|
|
366
|
+
else if (ts.isElementAccessExpression(node) && aliasReceiverOf(node.expression) !== null) {
|
|
367
|
+
// Same rule as `lazyPort`: a literal is a name this check can verify, and
|
|
368
|
+
// anything else must surface rather than pass.
|
|
369
|
+
const argument = node.argumentExpression;
|
|
370
|
+
const name = ts.isStringLiteralLike(argument) ? argument.text : NON_LITERAL_PORT_NAME;
|
|
371
|
+
record(name, node, readKindAt(node));
|
|
372
|
+
}
|
|
373
|
+
// The same alias, destructured instead of read a name at a time:
|
|
374
|
+
// `const { a, b } = cradle()` for an accessor alias, `const { a } = cradle`
|
|
375
|
+
// for an object one. The check saw each half — `cradle().a`, and
|
|
376
|
+
// `const { a } = ctx.cradle<C>()` written inline — and not the two combined,
|
|
377
|
+
// so `catalog`'s asset-reference boot hook resolved two names invisibly
|
|
378
|
+
// (issue #127). The destructuring *is* the resolution, exactly as the
|
|
379
|
+
// property access is, so its own position decides the kind and the site.
|
|
380
|
+
//
|
|
381
|
+
// Keyed on the alias table rather than on the shape, which is what keeps the
|
|
382
|
+
// widening from swallowing the tree: `const { rows } = await list()` is the
|
|
383
|
+
// commonest line in `src/` and resolves nothing. And the receiver must be
|
|
384
|
+
// the alias itself — `const { x } = cradle().service` destructures a
|
|
385
|
+
// *resolved value*, whose fields are not container names.
|
|
386
|
+
if (ts.isVariableDeclaration(node) &&
|
|
387
|
+
ts.isObjectBindingPattern(node.name) &&
|
|
388
|
+
node.initializer !== undefined &&
|
|
389
|
+
aliasReceiverOf(node.initializer) !== null) {
|
|
390
|
+
recordBindingPattern(node.name, readKindAt(node.initializer));
|
|
391
|
+
}
|
|
392
|
+
if (ts.isCallExpression(node)) {
|
|
393
|
+
const tail = calleeTail(node);
|
|
394
|
+
// A factory's cradle parameter.
|
|
395
|
+
if (tail.endsWith('asFunction')) {
|
|
396
|
+
const [factory] = node.arguments;
|
|
397
|
+
if (factory && (ts.isArrowFunction(factory) || ts.isFunctionExpression(factory))) {
|
|
398
|
+
const [parameter] = factory.parameters;
|
|
399
|
+
if (parameter && ts.isObjectBindingPattern(parameter.name)) {
|
|
400
|
+
recordBindingPattern(parameter.name, 'captured');
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// The resolution surface — deferred *only* when the read happens inside a
|
|
405
|
+
// nested function. `ctx.cradle<C>().thing` written straight into a
|
|
406
|
+
// factory body looks deferred and is not: the body runs when Awilix first
|
|
407
|
+
// constructs the registration, so the read is every bit as eager as a
|
|
408
|
+
// destructured parameter. `addresses` had exactly that, and it survived
|
|
409
|
+
// until `dictionaries` turned the name it read into a port.
|
|
410
|
+
if (tail.endsWith('cradle')) {
|
|
411
|
+
const kind = readKindAt(node);
|
|
412
|
+
const parent = node.parent;
|
|
413
|
+
if (parent && ts.isPropertyAccessExpression(parent)) {
|
|
414
|
+
record(parent.name.text, parent, kind);
|
|
415
|
+
}
|
|
416
|
+
else if (parent &&
|
|
417
|
+
ts.isVariableDeclaration(parent) &&
|
|
418
|
+
ts.isObjectBindingPattern(parent.name)) {
|
|
419
|
+
recordBindingPattern(parent.name, kind);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// `lazyPort<T>(ctx, 'name')` — the shape the conversions were told to
|
|
423
|
+
// prefer, and the one this check could not see until feature 072 wave 3.
|
|
424
|
+
// Every read through it went unchecked: `pim_ergonode` resolved fourteen
|
|
425
|
+
// names this way, several registered by nobody, and the check reported a
|
|
426
|
+
// clean bill while the media pipeline produced no assets.
|
|
427
|
+
//
|
|
428
|
+
// Always `deferred`: the proxy resolves the name on each method call, not
|
|
429
|
+
// when it is constructed. That is the whole point of the helper, and it
|
|
430
|
+
// is why capturing one is safe where capturing a port is not.
|
|
431
|
+
//
|
|
432
|
+
// The same reasoning decides the **site**, and it is why a `lazyPort` is
|
|
433
|
+
// not read positionally like a cradle access. Building one in a
|
|
434
|
+
// `ctx.routes` body resolves nothing — that is the sanctioned fix for the
|
|
435
|
+
// wiring hazard, not an instance of it, so it is a `call`. Building one
|
|
436
|
+
// in a boot hook is different in kind: the whole hook body is pre-request,
|
|
437
|
+
// so the method call it defers to happens at boot too, usually on the next
|
|
438
|
+
// line. All seven `emailDefaultsPort` contributors were exactly that.
|
|
439
|
+
const calleeName = ts.isIdentifier(node.expression) ? node.expression.text : tail;
|
|
440
|
+
if (calleeName === 'lazyPort') {
|
|
441
|
+
const [, nameArgument] = node.arguments;
|
|
442
|
+
const lazySite = siteAt(node) === 'boot' ? 'boot' : 'call';
|
|
443
|
+
if (nameArgument !== undefined) {
|
|
444
|
+
if (ts.isStringLiteralLike(nameArgument)) {
|
|
445
|
+
record(nameArgument.text, nameArgument, 'deferred', lazySite, 'lazyPort');
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
// A name this check cannot read statically must not pass silently.
|
|
449
|
+
// A generic `port(ctx, name)` helper written during T131 hid twelve
|
|
450
|
+
// resolutions behind a variable; the fix is to refuse the shape,
|
|
451
|
+
// not to guess at it.
|
|
452
|
+
record(NON_LITERAL_PORT_NAME, nameArgument, 'deferred', lazySite, 'lazyPort');
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
node.forEachChild(visit);
|
|
458
|
+
};
|
|
459
|
+
sf.forEachChild(visit);
|
|
460
|
+
return found;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Every registration name a **composition root** writes into the container.
|
|
464
|
+
*
|
|
465
|
+
* A different spelling from {@link registeredNames} and that is the whole reason
|
|
466
|
+
* it exists: a module writes `ctx.di.register({ … })`, and a root writes
|
|
467
|
+
* `registerValues(container, { … })`, `container.register({ … })` or
|
|
468
|
+
* `composedModules.contribute({ … })` — D-45's contribution window as a method
|
|
469
|
+
* (issue #52). Missing the third would drop nearly every name a root supplies.
|
|
470
|
+
*
|
|
471
|
+
* ## Why the CLI needs it
|
|
472
|
+
*
|
|
473
|
+
* `specs/110-instance-repository/` T138a. The divergence report's second host is
|
|
474
|
+
* a client's instance, where `composeApp` **is** the composition root and comes
|
|
475
|
+
* out of `node_modules`, and `registration-owners.ts`' `rootSuppliedNames` is
|
|
476
|
+
* what tells *"a root registers it"* from *"nobody registers it"*. Its own doc
|
|
477
|
+
* block says what happens without it, and it was measured happening: an overlay
|
|
478
|
+
* module decorating `commandBus` in a real scaffolded instance was reported
|
|
479
|
+
* `unowned-subject` — a finding about the run dressed as one about the tree —
|
|
480
|
+
* because the platform registers it in a root spelling this file did not read.
|
|
481
|
+
*
|
|
482
|
+
* ## It is a **second copy**, knowingly, and here is the whole of that decision
|
|
483
|
+
*
|
|
484
|
+
* `backend/scripts/check-port-dependencies.ts` exports a `rootRegisteredNames`
|
|
485
|
+
* this one is taken from, unchanged. Two derivations of one predicate is the
|
|
486
|
+
* shape this estate refuses, so the copy is **not** the end state: that file's
|
|
487
|
+
* should become an import of this one, which is a one-line change and is
|
|
488
|
+
* deliberately not made in the merge request that adds this, feature 117's
|
|
489
|
+
* Phase 6 holding that file open at the time. Until it is,
|
|
490
|
+
* `backend/test/unit/scripts/check-divergence.test.ts` holds the two to each
|
|
491
|
+
* other over the shapes a root really writes — a divergence between them is red
|
|
492
|
+
* rather than silent, which is what a duplicated predicate otherwise costs.
|
|
493
|
+
*
|
|
494
|
+
* Spread elements are ignored: a name that only exists inside a spread is not a
|
|
495
|
+
* name this analysis can reason about.
|
|
496
|
+
*/
|
|
497
|
+
export function rootRegisteredNames(source, file) {
|
|
498
|
+
const sf = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true);
|
|
499
|
+
const names = [];
|
|
500
|
+
const collect = (literal) => {
|
|
501
|
+
for (const property of literal.properties) {
|
|
502
|
+
if (!property.name)
|
|
503
|
+
continue;
|
|
504
|
+
if (ts.isIdentifier(property.name))
|
|
505
|
+
names.push(property.name.text);
|
|
506
|
+
else if (ts.isStringLiteral(property.name))
|
|
507
|
+
names.push(property.name.text);
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
const visit = (node) => {
|
|
511
|
+
if (ts.isCallExpression(node)) {
|
|
512
|
+
const callee = ts.isIdentifier(node.expression) ? node.expression.text : calleeTail(node);
|
|
513
|
+
if (callee === 'registerValues') {
|
|
514
|
+
const [, second] = node.arguments;
|
|
515
|
+
if (second && ts.isObjectLiteralExpression(second))
|
|
516
|
+
collect(second);
|
|
517
|
+
}
|
|
518
|
+
if (callee === 'container.register' ||
|
|
519
|
+
callee === 'register' ||
|
|
520
|
+
callee === 'contribute' ||
|
|
521
|
+
callee.endsWith('.contribute')) {
|
|
522
|
+
const [first] = node.arguments;
|
|
523
|
+
if (first && ts.isObjectLiteralExpression(first))
|
|
524
|
+
collect(first);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
node.forEachChild(visit);
|
|
528
|
+
};
|
|
529
|
+
sf.forEachChild(visit);
|
|
530
|
+
return names;
|
|
531
|
+
}
|
|
532
|
+
//# sourceMappingURL=port-registrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-registrations.js","sourceRoot":"","sources":["../../src/lib/port-registrations.ts"],"names":[],"mappings":"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"}
|