@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,129 @@
|
|
|
1
|
+
export { ManifestIndexUnreadableError } from './switchable-modules.js';
|
|
2
|
+
export interface ModulePopulationInput {
|
|
3
|
+
/** Module ids the generated manifest index registers. */
|
|
4
|
+
readonly registered: readonly string[];
|
|
5
|
+
/**
|
|
6
|
+
* Every path the walk produced. Absolute or relative, either separator: the
|
|
7
|
+
* module id is read out of the `modules/<id>/` segment, which every caller's
|
|
8
|
+
* paths carry whichever root they were made relative to.
|
|
9
|
+
*/
|
|
10
|
+
readonly files: readonly string[];
|
|
11
|
+
/**
|
|
12
|
+
* Registered modules this check excludes from its own scan by design, so its
|
|
13
|
+
* floor asks for the population it actually reads. Every entry is a claim the
|
|
14
|
+
* check makes in its header, not a convenience.
|
|
15
|
+
*/
|
|
16
|
+
readonly excluded?: readonly string[];
|
|
17
|
+
/**
|
|
18
|
+
* How a path is attributed to a module, where the `modules/<id>/` segment is
|
|
19
|
+
* not the answer (feature 080, T040a).
|
|
20
|
+
*
|
|
21
|
+
* A module that has become a **package** lives at a path of its own choosing
|
|
22
|
+
* — `packages/modules/blog/src/…` today, whatever the workspace globs allow
|
|
23
|
+
* tomorrow — and its id is read from its manifest's `endora.id` rather than
|
|
24
|
+
* from a directory name. `lib/module-roots.ts` supplies the function; the
|
|
25
|
+
* default is {@link moduleIdOf}, so a caller with only an application tree
|
|
26
|
+
* gets exactly the behaviour it had before this field existed.
|
|
27
|
+
*/
|
|
28
|
+
readonly moduleIdOf?: (path: string) => string | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Directories whose files belong to one module although no `modules/<id>/`
|
|
32
|
+
* segment says so — keyed by the directory's path under the application's own
|
|
33
|
+
* source root, mapped to the module id (feature 080, T040b).
|
|
34
|
+
*
|
|
35
|
+
* There is one, and it is `_lifecycle` at `src/lifecycle/`. D-160.11 keeps the
|
|
36
|
+
* lifecycle subsystem out of the package sweep — it is the platform's operator
|
|
37
|
+
* half — so it is the one registered module whose sources the host owns, and
|
|
38
|
+
* the directory is deliberately not named after its id (a `src/_lifecycle/`
|
|
39
|
+
* would make `backend/src` itself a module root, see
|
|
40
|
+
* `scripts/lib/module-roots.ts`). Nothing here is written down: the map is
|
|
41
|
+
* derived per run from the manifest index's own `manifestPath`, which is the
|
|
42
|
+
* artefact that records where each module's manifest actually is.
|
|
43
|
+
*/
|
|
44
|
+
export type HostResidentModules = ReadonlyMap<string, string>;
|
|
45
|
+
/** The default: every path attributes by its `modules/<id>/` segment alone. */
|
|
46
|
+
export declare const NO_HOST_RESIDENT_MODULES: HostResidentModules;
|
|
47
|
+
/**
|
|
48
|
+
* The module a path belongs to, or `null` for a file outside the module tree.
|
|
49
|
+
*
|
|
50
|
+
* Reads the **first** `modules/<id>/` segment, so an overlay module under
|
|
51
|
+
* `apps/<deployment>/modules/<id>/` resolves to its own id rather than to the
|
|
52
|
+
* deployment. `node_modules/` cannot match: the segment must start the path or
|
|
53
|
+
* follow a separator.
|
|
54
|
+
*
|
|
55
|
+
* `hostResident` is the second answer, and it is a **map rather than a shape**
|
|
56
|
+
* because there is no shape to read: a host-resident module's directory says
|
|
57
|
+
* nothing about which module it is, so the id comes from the index. Omitting it
|
|
58
|
+
* is not a neutral default — a file the walk read and attributed to `null` is a
|
|
59
|
+
* file every consumer treats as *not a module's*, which is the check judging
|
|
60
|
+
* nothing and reporting clean (issue #215 one layer in). Every caller that
|
|
61
|
+
* attributes inside its analysis therefore takes it from the layout and passes
|
|
62
|
+
* it down; the default exists for a fixture that has no such module.
|
|
63
|
+
*
|
|
64
|
+
* The comparison is made on the path's tail after the last `/src/`, so it
|
|
65
|
+
* answers the same for the three key shapes this repository uses — a layout
|
|
66
|
+
* key, an absolute path, and the synthetic `/src/<key>` several checks build —
|
|
67
|
+
* and cannot be fooled by a directory of that name deeper in another tree
|
|
68
|
+
* (`packages/platform/src/kernel/lifecycle/` is the live example).
|
|
69
|
+
*/
|
|
70
|
+
export declare function moduleIdOf(path: string, hostResident?: HostResidentModules): string | null;
|
|
71
|
+
/** Registered modules the walk produced no file for. */
|
|
72
|
+
export declare function modulesWithoutSources(input: ModulePopulationInput): string[];
|
|
73
|
+
/**
|
|
74
|
+
* What the index expected of the walk and what the walk delivered, in the shape
|
|
75
|
+
* `scripts/lib/read-size.ts` prints (issue #244).
|
|
76
|
+
*
|
|
77
|
+
* The floor below already computes both numbers to decide whether to refuse;
|
|
78
|
+
* returning them is what lets the check *print* them, so a run that was never
|
|
79
|
+
* short still says which population it covered. A number nothing prints is a
|
|
80
|
+
* number nobody can see going wrong.
|
|
81
|
+
*/
|
|
82
|
+
export interface ModulePopulationCoverage {
|
|
83
|
+
readonly source: 'manifest-index';
|
|
84
|
+
/** Registered modules this check is expected to read, exclusions removed. */
|
|
85
|
+
readonly expected: number;
|
|
86
|
+
/** How many of them the walk produced at least one file for. */
|
|
87
|
+
readonly covered: number;
|
|
88
|
+
}
|
|
89
|
+
/** The two numbers, without the refusal — the same derivation, printed. */
|
|
90
|
+
export declare function modulePopulationCoverage(input: ModulePopulationInput): ModulePopulationCoverage;
|
|
91
|
+
/**
|
|
92
|
+
* The sentence a check prints before `process.exit(2)`, or `null` when the walk
|
|
93
|
+
* covered every module the index registers.
|
|
94
|
+
*
|
|
95
|
+
* An index that registers nothing is refused too: "no module is registered" and
|
|
96
|
+
* "the index did not load" would otherwise be the same answer, and the second
|
|
97
|
+
* silently turns the floor off while looking like a normal run.
|
|
98
|
+
*/
|
|
99
|
+
export declare function vacuousModulePopulation(input: ModulePopulationInput): string | null;
|
|
100
|
+
/**
|
|
101
|
+
* Ids of every module the generated index at `indexPath` registers.
|
|
102
|
+
*
|
|
103
|
+
* Throws `ManifestIndexUnreadableError` when the index is missing or empty; a
|
|
104
|
+
* caller turns that into exit 2, never into a pass.
|
|
105
|
+
*/
|
|
106
|
+
export declare function loadRegisteredModuleIds(indexPath: string): Promise<readonly string[]>;
|
|
107
|
+
/**
|
|
108
|
+
* The CLI half: read the index, compare it against what the walk produced, and
|
|
109
|
+
* exit 2 rather than report on a residue.
|
|
110
|
+
*
|
|
111
|
+
* One function rather than nine copies, because nine copies of an exit-2 guard
|
|
112
|
+
* is nine chances to write the one that returns instead — and a check whose
|
|
113
|
+
* guard is subtly wrong is invisible by construction, since it reports green
|
|
114
|
+
* either way.
|
|
115
|
+
*
|
|
116
|
+
* Returns the coverage it just enforced, so the caller can hand it to
|
|
117
|
+
* `reportReadSize` and print the corroboration rather than only its own count
|
|
118
|
+
* of files (issue #244).
|
|
119
|
+
*/
|
|
120
|
+
export declare function refuseVacuousModulePopulation(input: {
|
|
121
|
+
/** The check's log prefix, e.g. `[subscribe-seam]`. */
|
|
122
|
+
readonly prefix: string;
|
|
123
|
+
/** The generated manifest index, as `lib/module-roots.ts` resolved it. */
|
|
124
|
+
readonly manifestIndexPath: string;
|
|
125
|
+
readonly files: readonly string[];
|
|
126
|
+
readonly excluded?: readonly string[];
|
|
127
|
+
readonly moduleIdOf?: (path: string) => string | null;
|
|
128
|
+
}): Promise<ModulePopulationCoverage>;
|
|
129
|
+
//# sourceMappingURL=module-population.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-population.d.ts","sourceRoot":"","sources":["../../src/lib/module-population.ts"],"names":[],"mappings":"AAyCA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAKvE,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACvD;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9D,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,EAAE,mBAA+B,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,mBAA8C,GAC3D,MAAM,GAAG,IAAI,CAUf;AAED,wDAAwD;AACxD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAS5E;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,qBAAqB,GAC3B,wBAAwB,CAQ1B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAcnF;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAE3F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACvD,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAwBpC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Did the walk read the module tree, or a residue of it?" — the one derivation
|
|
3
|
+
* (issue #215).
|
|
4
|
+
*
|
|
5
|
+
* Fourteen of the twenty `check-*` scripts are filesystem walks whose whole
|
|
6
|
+
* population is `backend/src/modules`: 1364 of the 1469 `.ts` files under
|
|
7
|
+
* `backend/src` live there. Eight of them guarded that walk with
|
|
8
|
+
* `files.length === 0`, which is the wrong predicate. It catches only the case
|
|
9
|
+
* where the walk finds **nothing at all**; it cannot catch the case that
|
|
10
|
+
* actually happens when the tree moves, which is that the walk finds the
|
|
11
|
+
* remaining 105 files — `src/kernel`, `src/db`, `src/apps`, `src/http` — reads
|
|
12
|
+
* them, finds nothing wrong in them, and reports a clean tree. That is issue
|
|
13
|
+
* #113's failure mode, in eight checks at once, at the moment the repository is
|
|
14
|
+
* most disturbed.
|
|
15
|
+
*
|
|
16
|
+
* So the guard has to assert the walk found **the population it expects**, not
|
|
17
|
+
* merely a non-empty list. The expectation is derived from the generated
|
|
18
|
+
* manifest index, never written down: a hand-written count is a copy of a
|
|
19
|
+
* derived fact and goes stale in silence, which is what D-100 was written
|
|
20
|
+
* about. Two properties fall out of reading it, and the check needs both:
|
|
21
|
+
*
|
|
22
|
+
* 1. **The index is a path that must resolve.** Where it lives is
|
|
23
|
+
* `lib/module-roots.ts`' answer since feature 080's T040a — searched for
|
|
24
|
+
* over the workspace members rather than joined onto a source root — so a
|
|
25
|
+
* tree that moved without it is an error rather than an empty result, and
|
|
26
|
+
* the whole module directory going missing is refused before a single file
|
|
27
|
+
* is analysed.
|
|
28
|
+
* 2. **Every module it registers must contribute a source.** A *partial*
|
|
29
|
+
* move — the one a package split actually performs, index regenerated and
|
|
30
|
+
* pointing at the new home — leaves the index readable and the walk
|
|
31
|
+
* short. Only a per-module floor sees that, and it sees it without
|
|
32
|
+
* anybody choosing a number.
|
|
33
|
+
*
|
|
34
|
+
* The pure half takes the file list and the ids, so a red proof can drive it
|
|
35
|
+
* from a residue the tree does not contain, entering where a real run enters
|
|
36
|
+
* (issues #113, #130). {@link loadRegisteredModuleIds} is the only part that
|
|
37
|
+
* knows where the index lives, and it is `switchable-modules.ts`' reader — the
|
|
38
|
+
* two derivations cannot disagree about which modules exist.
|
|
39
|
+
*/
|
|
40
|
+
import { loadManifestActivations } from './switchable-modules.js';
|
|
41
|
+
export { ManifestIndexUnreadableError } from './switchable-modules.js';
|
|
42
|
+
/** How many missing ids the message names before it counts the rest. */
|
|
43
|
+
const NAMED_IN_MESSAGE = 8;
|
|
44
|
+
/** The default: every path attributes by its `modules/<id>/` segment alone. */
|
|
45
|
+
export const NO_HOST_RESIDENT_MODULES = new Map();
|
|
46
|
+
/**
|
|
47
|
+
* The module a path belongs to, or `null` for a file outside the module tree.
|
|
48
|
+
*
|
|
49
|
+
* Reads the **first** `modules/<id>/` segment, so an overlay module under
|
|
50
|
+
* `apps/<deployment>/modules/<id>/` resolves to its own id rather than to the
|
|
51
|
+
* deployment. `node_modules/` cannot match: the segment must start the path or
|
|
52
|
+
* follow a separator.
|
|
53
|
+
*
|
|
54
|
+
* `hostResident` is the second answer, and it is a **map rather than a shape**
|
|
55
|
+
* because there is no shape to read: a host-resident module's directory says
|
|
56
|
+
* nothing about which module it is, so the id comes from the index. Omitting it
|
|
57
|
+
* is not a neutral default — a file the walk read and attributed to `null` is a
|
|
58
|
+
* file every consumer treats as *not a module's*, which is the check judging
|
|
59
|
+
* nothing and reporting clean (issue #215 one layer in). Every caller that
|
|
60
|
+
* attributes inside its analysis therefore takes it from the layout and passes
|
|
61
|
+
* it down; the default exists for a fixture that has no such module.
|
|
62
|
+
*
|
|
63
|
+
* The comparison is made on the path's tail after the last `/src/`, so it
|
|
64
|
+
* answers the same for the three key shapes this repository uses — a layout
|
|
65
|
+
* key, an absolute path, and the synthetic `/src/<key>` several checks build —
|
|
66
|
+
* and cannot be fooled by a directory of that name deeper in another tree
|
|
67
|
+
* (`packages/platform/src/kernel/lifecycle/` is the live example).
|
|
68
|
+
*/
|
|
69
|
+
export function moduleIdOf(path, hostResident = NO_HOST_RESIDENT_MODULES) {
|
|
70
|
+
const normalised = path.split('\\').join('/');
|
|
71
|
+
const match = /(?:^|\/)modules\/([^/]+)\//.exec(normalised);
|
|
72
|
+
if (match)
|
|
73
|
+
return match[1] ?? null;
|
|
74
|
+
const marker = normalised.lastIndexOf('/src/');
|
|
75
|
+
const tail = marker === -1 ? normalised : normalised.slice(marker + '/src/'.length);
|
|
76
|
+
for (const [directory, moduleId] of hostResident) {
|
|
77
|
+
if (tail === directory || tail.startsWith(`${directory}/`))
|
|
78
|
+
return moduleId;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/** Registered modules the walk produced no file for. */
|
|
83
|
+
export function modulesWithoutSources(input) {
|
|
84
|
+
const excluded = new Set(input.excluded ?? []);
|
|
85
|
+
const idOf = input.moduleIdOf ?? moduleIdOf;
|
|
86
|
+
const seen = new Set();
|
|
87
|
+
for (const file of input.files) {
|
|
88
|
+
const id = idOf(file);
|
|
89
|
+
if (id !== null)
|
|
90
|
+
seen.add(id);
|
|
91
|
+
}
|
|
92
|
+
return input.registered.filter((id) => !excluded.has(id) && !seen.has(id)).sort();
|
|
93
|
+
}
|
|
94
|
+
/** The two numbers, without the refusal — the same derivation, printed. */
|
|
95
|
+
export function modulePopulationCoverage(input) {
|
|
96
|
+
const excluded = new Set(input.excluded ?? []);
|
|
97
|
+
const expected = input.registered.filter((id) => !excluded.has(id)).length;
|
|
98
|
+
return {
|
|
99
|
+
source: 'manifest-index',
|
|
100
|
+
expected,
|
|
101
|
+
covered: expected - modulesWithoutSources(input).length,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The sentence a check prints before `process.exit(2)`, or `null` when the walk
|
|
106
|
+
* covered every module the index registers.
|
|
107
|
+
*
|
|
108
|
+
* An index that registers nothing is refused too: "no module is registered" and
|
|
109
|
+
* "the index did not load" would otherwise be the same answer, and the second
|
|
110
|
+
* silently turns the floor off while looking like a normal run.
|
|
111
|
+
*/
|
|
112
|
+
export function vacuousModulePopulation(input) {
|
|
113
|
+
if (input.registered.length === 0) {
|
|
114
|
+
return 'the manifest index registers no module — refusing to report a vacuous pass';
|
|
115
|
+
}
|
|
116
|
+
const missing = modulesWithoutSources(input);
|
|
117
|
+
if (missing.length === 0)
|
|
118
|
+
return null;
|
|
119
|
+
const named = missing.slice(0, NAMED_IN_MESSAGE).join(', ');
|
|
120
|
+
const rest = missing.length > NAMED_IN_MESSAGE ? `, +${missing.length - NAMED_IN_MESSAGE} more` : '';
|
|
121
|
+
return (`the walk read ${input.files.length} file(s) but produced none for ` +
|
|
122
|
+
`${missing.length} of the ${input.registered.length} registered modules ` +
|
|
123
|
+
`(${named}${rest}) — it is reading a residue of the module tree, not the tree; ` +
|
|
124
|
+
'refusing to report a vacuous pass');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Ids of every module the generated index at `indexPath` registers.
|
|
128
|
+
*
|
|
129
|
+
* Throws `ManifestIndexUnreadableError` when the index is missing or empty; a
|
|
130
|
+
* caller turns that into exit 2, never into a pass.
|
|
131
|
+
*/
|
|
132
|
+
export async function loadRegisteredModuleIds(indexPath) {
|
|
133
|
+
return (await loadManifestActivations(indexPath)).map((manifest) => manifest.id);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The CLI half: read the index, compare it against what the walk produced, and
|
|
137
|
+
* exit 2 rather than report on a residue.
|
|
138
|
+
*
|
|
139
|
+
* One function rather than nine copies, because nine copies of an exit-2 guard
|
|
140
|
+
* is nine chances to write the one that returns instead — and a check whose
|
|
141
|
+
* guard is subtly wrong is invisible by construction, since it reports green
|
|
142
|
+
* either way.
|
|
143
|
+
*
|
|
144
|
+
* Returns the coverage it just enforced, so the caller can hand it to
|
|
145
|
+
* `reportReadSize` and print the corroboration rather than only its own count
|
|
146
|
+
* of files (issue #244).
|
|
147
|
+
*/
|
|
148
|
+
export async function refuseVacuousModulePopulation(input) {
|
|
149
|
+
let registered;
|
|
150
|
+
try {
|
|
151
|
+
registered = await loadRegisteredModuleIds(input.manifestIndexPath);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error(`${input.prefix} the module index at ${input.manifestIndexPath} could not be read ` +
|
|
155
|
+
`(${String(error)}) — the expected population is derived from it, so there is ` +
|
|
156
|
+
'nothing to compare the walk against; refusing to report a vacuous pass');
|
|
157
|
+
process.exit(2);
|
|
158
|
+
}
|
|
159
|
+
const population = {
|
|
160
|
+
registered,
|
|
161
|
+
files: input.files,
|
|
162
|
+
...(input.excluded === undefined ? {} : { excluded: input.excluded }),
|
|
163
|
+
...(input.moduleIdOf === undefined ? {} : { moduleIdOf: input.moduleIdOf }),
|
|
164
|
+
};
|
|
165
|
+
const reason = vacuousModulePopulation(population);
|
|
166
|
+
if (reason !== null) {
|
|
167
|
+
console.error(`${input.prefix} ${reason}`);
|
|
168
|
+
process.exit(2);
|
|
169
|
+
}
|
|
170
|
+
return modulePopulationCoverage(population);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=module-population.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-population.js","sourceRoot":"","sources":["../../src/lib/module-population.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import type { AdminSurfaceLayout } from './admin-surfaces.js';
|
|
2
|
+
import { type WorkspaceFs } from './workspace-packages.js';
|
|
3
|
+
/** The file the composer generates and every module walk derives its floor from. */
|
|
4
|
+
export declare const MANIFEST_INDEX_FILENAME = "manifest-index.generated.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Directories that are not this repository's own source and would either slow
|
|
7
|
+
* the search to no purpose or answer it with somebody else's copy.
|
|
8
|
+
*
|
|
9
|
+
* The same list the shell twin (`scripts/lib/module-root.sh`) prunes, kept in
|
|
10
|
+
* step with it by `test/unit/scripts/module-roots.test.ts`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const PRUNED_DIRECTORIES: readonly string[];
|
|
13
|
+
/** Raised when the module layout cannot be resolved; a caller turns it into exit 2. */
|
|
14
|
+
export declare class ModuleLayoutUnresolvableError extends Error {
|
|
15
|
+
readonly name = "ModuleLayoutUnresolvableError";
|
|
16
|
+
}
|
|
17
|
+
/** One place backend module sources live. */
|
|
18
|
+
export interface ModuleSourceRoot {
|
|
19
|
+
/** Absolute directory to walk. */
|
|
20
|
+
readonly directory: string;
|
|
21
|
+
/**
|
|
22
|
+
* The module every file under {@link directory} belongs to, or `null` when
|
|
23
|
+
* the directory holds several and attribution is read from the path.
|
|
24
|
+
*/
|
|
25
|
+
readonly moduleId: string | null;
|
|
26
|
+
readonly origin: 'application' | 'workspace-package' | 'host-resident' | 'platform-resident';
|
|
27
|
+
}
|
|
28
|
+
export interface ModuleTreeLayout {
|
|
29
|
+
/** The checkout, fully resolved. */
|
|
30
|
+
readonly repoRoot: string;
|
|
31
|
+
/** The workspace member holding the manifest index — the application. */
|
|
32
|
+
readonly applicationRoot: string;
|
|
33
|
+
/** Its source root, derived from where the index sits. */
|
|
34
|
+
readonly srcRoot: string;
|
|
35
|
+
/** The generated manifest index, absolute. */
|
|
36
|
+
readonly manifestIndexPath: string;
|
|
37
|
+
/** Module ids that index registers. */
|
|
38
|
+
readonly registeredIds: readonly string[];
|
|
39
|
+
/** Every root holding module sources — application trees first, then packages. */
|
|
40
|
+
readonly moduleRoots: readonly ModuleSourceRoot[];
|
|
41
|
+
/** The per-deployment overlay tree (`<src>/apps`), which the index never lists. */
|
|
42
|
+
readonly overlayRoot: string;
|
|
43
|
+
/**
|
|
44
|
+
* The platform's own source directory, or `null` when this workspace has no
|
|
45
|
+
* member declaring `endora.type: "platform"` (every fixture tree).
|
|
46
|
+
*
|
|
47
|
+
* It is a root of its own because it is not the application's and not a
|
|
48
|
+
* module's: `packages/platform/src/{kernel,http,tenancy,commands,events}` is
|
|
49
|
+
* what `backend/src` reached relatively until the relocation, and what it now
|
|
50
|
+
* reaches through re-export shims. A check whose population *is* the platform
|
|
51
|
+
* refuses on `null` itself.
|
|
52
|
+
*/
|
|
53
|
+
readonly platformRoot: string | null;
|
|
54
|
+
/**
|
|
55
|
+
* The npm name that platform publishes under — `null` on the same workspaces
|
|
56
|
+
* {@link ModuleTreeLayout.platformRoot} is `null` on.
|
|
57
|
+
*
|
|
58
|
+
* It is the other half of the same answer (feature 080, T060): a module in the
|
|
59
|
+
* application tree reaches the platform by relative path and a module in a
|
|
60
|
+
* package reaches it by this name, so a check whose population is *module
|
|
61
|
+
* reaches into the platform* needs both spellings or it loses the second set
|
|
62
|
+
* as the sweep converts them.
|
|
63
|
+
*/
|
|
64
|
+
readonly platformPackageName: string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Every directory a check that reads the whole application source tree must
|
|
67
|
+
* walk: the source root, the platform's, plus each package root — all three
|
|
68
|
+
* outside one another.
|
|
69
|
+
*
|
|
70
|
+
* The platform is here so that the twelve checks reading this keep the
|
|
71
|
+
* population they had before the relocation. Its five directories were under
|
|
72
|
+
* `src/` and every one of these walks covered them; leaving them out would
|
|
73
|
+
* have dropped six entity classifications from
|
|
74
|
+
* `check-entity-tenant-classification`, four repeating timers from
|
|
75
|
+
* `check:entry-scope` and the whole of `check:kernel-boundary`'s subject —
|
|
76
|
+
* each of which keeps printing a number and exiting 0, which is issue #215.
|
|
77
|
+
*/
|
|
78
|
+
readonly sourceRoots: readonly string[];
|
|
79
|
+
/** Every directory a check that reads only module sources must walk. */
|
|
80
|
+
readonly moduleWalkRoots: readonly string[];
|
|
81
|
+
/** `modules/blog/x.ts` for the application, repo-relative for a package. */
|
|
82
|
+
readonly keyOf: (absolutePath: string) => string;
|
|
83
|
+
/** The same, with the application's own prefix: `src/modules/blog/x.ts`. */
|
|
84
|
+
readonly displayOf: (absolutePath: string) => string;
|
|
85
|
+
/**
|
|
86
|
+
* {@link ModuleTreeLayout.keyOf} inverted — the absolute path a key names.
|
|
87
|
+
*
|
|
88
|
+
* The two bases a key can be relative to are tried in the order that keeps
|
|
89
|
+
* the application's own spelling authoritative, because that is the one a
|
|
90
|
+
* ledger and a message already use.
|
|
91
|
+
*/
|
|
92
|
+
readonly absolutePathOf: (key: string) => string;
|
|
93
|
+
/** The module a path belongs to, over every root, or `null`. */
|
|
94
|
+
readonly moduleIdOfPath: (absolutePath: string) => string | null;
|
|
95
|
+
/**
|
|
96
|
+
* Every module's own directory, by id — the enumeration half of
|
|
97
|
+
* {@link ModuleTreeLayout.moduleDirectoryOf}.
|
|
98
|
+
*
|
|
99
|
+
* A walk that has to visit *each* module (a bundle sweep, an i18n reconcile)
|
|
100
|
+
* reads this instead of listing a directory, because listing one answers for
|
|
101
|
+
* one root and there is now more than one.
|
|
102
|
+
*/
|
|
103
|
+
readonly moduleDirectories: ReadonlyMap<string, string>;
|
|
104
|
+
/**
|
|
105
|
+
* The directory holding a module's own sources, or `null`.
|
|
106
|
+
*
|
|
107
|
+
* For an application root it is `<root>/<id>`; for a package it is the
|
|
108
|
+
* member directory. What it does **not** answer is where inside a package a
|
|
109
|
+
* named file lives — a package declares its entry points in its `exports`
|
|
110
|
+
* map, and reading that is the host package's business (T042a), not this
|
|
111
|
+
* one's. A caller that needs `backend.ts` therefore asks for the directory
|
|
112
|
+
* and looks in the two places a workspace member can keep it.
|
|
113
|
+
*/
|
|
114
|
+
readonly moduleDirectoryOf: (moduleId: string) => string | null;
|
|
115
|
+
/**
|
|
116
|
+
* The npm name each module package publishes, mapped to the module id it
|
|
117
|
+
* declares — `@endora-commerce/mod-blog` → `blog`.
|
|
118
|
+
*
|
|
119
|
+
* It exists because a bare specifier can now reach a module, which is a thing
|
|
120
|
+
* this repository had never been able to say. `check-module-boundary`'s
|
|
121
|
+
* predicate 1 resolved relative specifiers only, on the stated premise that
|
|
122
|
+
* "there is no `@endora-commerce/mod-*` package yet"; !910 falsified that
|
|
123
|
+
* premise and the premise stayed. `blog` shipped with no ledger shard, so the
|
|
124
|
+
* hole cost nothing and showed nothing.
|
|
125
|
+
*
|
|
126
|
+
* The direction is name → id, and it is the only direction that is safe to
|
|
127
|
+
* key a ledger on (D-142): the npm name is npm's namespace, the manifest id is
|
|
128
|
+
* identity of record, and an edge that was `../blog/entities/blog-post.entity`
|
|
129
|
+
* before the move has to stay one key after it. Nothing here reads the name's
|
|
130
|
+
* spelling — a `mod-` prefix rule would be a derived fact written down (D-100)
|
|
131
|
+
* and would answer wrongly for the first package that is not named that way.
|
|
132
|
+
*/
|
|
133
|
+
readonly modulePackageNames: ReadonlyMap<string, string>;
|
|
134
|
+
/**
|
|
135
|
+
* The directories of every **host-resident** module, keyed as
|
|
136
|
+
* {@link ModuleTreeLayout.keyOf} keys them, mapped to the module id.
|
|
137
|
+
*
|
|
138
|
+
* It is what a check hands to `moduleIdOf` / `moduleOf` so that its analysis
|
|
139
|
+
* attributes those files to their module. Empty on a tree that has none, in
|
|
140
|
+
* which case every attributor answers exactly as it did before this existed.
|
|
141
|
+
*/
|
|
142
|
+
readonly hostResidentModules: ReadonlyMap<string, string>;
|
|
143
|
+
/**
|
|
144
|
+
* The admin application's module surfaces, or `null` when this workspace has
|
|
145
|
+
* no member declaring the source alias (feature 091, FR-017).
|
|
146
|
+
*
|
|
147
|
+
* It is a field of its own and deliberately **not** a member of
|
|
148
|
+
* {@link ModuleTreeLayout.moduleWalkRoots}: fifteen checks read that list and
|
|
149
|
+
* every one of them would acquire a population of `.ts`/`.tsx` files under
|
|
150
|
+
* `admin/` that it was never written to judge. `check:module-boundary` is the
|
|
151
|
+
* one check FR-017 names, and it is the one that calls this.
|
|
152
|
+
*
|
|
153
|
+
* **A function, and awaited, because the derivation parses TypeScript.**
|
|
154
|
+
* `admin-surfaces.ts` imports the compiler — the route table and the nav are
|
|
155
|
+
* read as AST nodes, not as text — and every consumer of this layout would
|
|
156
|
+
* otherwise load it. `test/helpers/lock-claims-check-fixture.ts` builds a
|
|
157
|
+
* spawnable tree out of a named list of libs and no `node_modules`, so an
|
|
158
|
+
* eager import there is `ERR_MODULE_NOT_FOUND` for `typescript` and every
|
|
159
|
+
* proof in that file fails for a reason that has nothing to do with a lock
|
|
160
|
+
* claim — measured, six of them.
|
|
161
|
+
*
|
|
162
|
+
* `null` is the tree with no frontend, and it is the behaviour that shipped.
|
|
163
|
+
* It is not a silent floor: `check:module-boundary` refuses a run whose
|
|
164
|
+
* ledger holds admin keys and whose layout answered `null` here.
|
|
165
|
+
*
|
|
166
|
+
* Since feature 091's Phase 5 it no longer answers `null` for an admin
|
|
167
|
+
* application whose module surfaces have all moved into their packages —
|
|
168
|
+
* that is {@link AdminSurfaceLayout.moduleRoot} being `null`, which is a
|
|
169
|
+
* measurement rather than a refusal (R16).
|
|
170
|
+
*/
|
|
171
|
+
readonly adminSurfaces: () => Promise<AdminSurfaceLayout | null>;
|
|
172
|
+
/**
|
|
173
|
+
* Why {@link ModuleTreeLayout.adminSurfaces} answered `null`, or `null` when
|
|
174
|
+
* it did not (feature 091, Phase 5 T2; `admin-kit-surface.md` §7.3 R17).
|
|
175
|
+
*
|
|
176
|
+
* `resolveAdminSurfaces` refuses for four distinct causes — no member
|
|
177
|
+
* declares the alias, two do, the alias target is not on disk, and `App.tsx`
|
|
178
|
+
* or `components/AppShell.tsx` could not be read — and every one of them used
|
|
179
|
+
* to arrive at a caller as the same bare `null`, whereupon the caller printed
|
|
180
|
+
* a sentence of its own choosing. Measured: the tree refused on the module
|
|
181
|
+
* root and both callers reported the alias, which sends a reader to repair a
|
|
182
|
+
* file that is correct.
|
|
183
|
+
*
|
|
184
|
+
* **The reason travels with the answer.** It is memoised on the same call, so
|
|
185
|
+
* the two accessors cannot come to disagree, and it is non-null *exactly*
|
|
186
|
+
* when the layout is `null`. A check printing an admin refusal prints this
|
|
187
|
+
* string; the only case it may word itself is a workspace with no frontend at
|
|
188
|
+
* all, which is what the string then says.
|
|
189
|
+
*/
|
|
190
|
+
readonly adminSurfacesRefusal: () => Promise<string | null>;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The nearest ancestor of `from` that declares a pnpm workspace.
|
|
194
|
+
*
|
|
195
|
+
* Nearest, so a worktree parked *inside* the main tree — which is where this
|
|
196
|
+
* repository's agents work — answers with itself rather than with its host.
|
|
197
|
+
* This is the same judgement `scripts/workspace-resolution.ts` makes, and the
|
|
198
|
+
* shell twin makes it through the `.git` marker instead, because a sourced
|
|
199
|
+
* library cannot assume a node toolchain.
|
|
200
|
+
*/
|
|
201
|
+
export declare function findRepoRoot(from: string): string | null;
|
|
202
|
+
/**
|
|
203
|
+
* The one manifest index this repository owns.
|
|
204
|
+
*
|
|
205
|
+
* Searched over the workspace members rather than under a named source root: a
|
|
206
|
+
* search rooted at `backend/src` would answer "gone" for an index that merely
|
|
207
|
+
* moved one level up, which is the event this whole file exists for.
|
|
208
|
+
*/
|
|
209
|
+
export declare function findManifestIndex(repoRoot: string, fs?: WorkspaceFs): string;
|
|
210
|
+
/**
|
|
211
|
+
* The application's source root: the index's ancestor that is an immediate
|
|
212
|
+
* child of the workspace member holding it.
|
|
213
|
+
*
|
|
214
|
+
* `backend/src/modules/_lifecycle/<index>` and `backend/src/<index>` both
|
|
215
|
+
* answer `backend/src`, which is what makes the owner's ruling about where the
|
|
216
|
+
* index lives a change this derivation does not have to be told about.
|
|
217
|
+
*/
|
|
218
|
+
export declare function sourceRootOfIndex(indexPath: string, memberDir: string): string;
|
|
219
|
+
/**
|
|
220
|
+
* Application module roots: the parents of registered-id directories that hold
|
|
221
|
+
* a `manifest.ts`.
|
|
222
|
+
*
|
|
223
|
+
* Both halves of that predicate are load-bearing. The id filter is what keeps
|
|
224
|
+
* an overlay tree (`src/apps/<deployment>/modules/<id>`) and the test
|
|
225
|
+
* fixtures' module-shaped directories out — neither is in the bare-core index.
|
|
226
|
+
* The `manifest.ts` filter is what keeps a directory that merely shares a
|
|
227
|
+
* module's name out: `test/unit/orders` is not a module root's child, and a
|
|
228
|
+
* derivation that took the name alone would say it was.
|
|
229
|
+
*/
|
|
230
|
+
export declare function applicationModuleRoots(srcRoot: string, registered: ReadonlySet<string>): readonly string[];
|
|
231
|
+
/**
|
|
232
|
+
* The module roots the two derivations above cannot see: a module whose sources
|
|
233
|
+
* the **host application** owns (feature 080, T040b).
|
|
234
|
+
*
|
|
235
|
+
* There is one, `_lifecycle`, and it is one by D-160.11 — the lifecycle
|
|
236
|
+
* subsystem is the platform's operator half, so it never became a package the
|
|
237
|
+
* way the other 66 modules did. It is still a registered module with a
|
|
238
|
+
* manifest, permissions, an activation declaration and its own i18n bundles, so
|
|
239
|
+
* every module walk has to keep reading it; what changed is only where its
|
|
240
|
+
* directory sits.
|
|
241
|
+
*
|
|
242
|
+
* It cannot be found the way {@link applicationModuleRoots} finds a module,
|
|
243
|
+
* because that predicate is *"a directory named after a registered id"* and
|
|
244
|
+
* this directory is deliberately **not**: a `src/_lifecycle/` would make
|
|
245
|
+
* `backend/src` itself a module root, and every kernel, `db/` and `http/` file
|
|
246
|
+
* under it a module's source with no module to attribute it to. So it is read
|
|
247
|
+
* from the index's own `manifestPath` — the artefact that already records where
|
|
248
|
+
* each module's manifest is, for all three origins — and a module whose
|
|
249
|
+
* manifest sits under the application source root but is not an immediate child
|
|
250
|
+
* of a module root is one of these.
|
|
251
|
+
*
|
|
252
|
+
* Nothing is written down and the derivation fails closed in both directions
|
|
253
|
+
* (D-100, issue #215). A module whose directory disappeared cannot arrive here
|
|
254
|
+
* as "host-resident": its manifest specifier would resolve to nothing and the
|
|
255
|
+
* index would not import at all, which is exit 2 at the reader. And a candidate
|
|
256
|
+
* that is the source root itself, or an ancestor of a root already found, is
|
|
257
|
+
* refused rather than walked — a root that swallows the tree reports every file
|
|
258
|
+
* in it as one module's.
|
|
259
|
+
*/
|
|
260
|
+
export declare function hostResidentModuleRoots(srcRoot: string, found: readonly ModuleSourceRoot[], manifestPaths: ReadonlyMap<string, string>): ModuleSourceRoot[];
|
|
261
|
+
/**
|
|
262
|
+
* Module roots inside the **platform package** (feature 080, D-160.11's second
|
|
263
|
+
* half).
|
|
264
|
+
*
|
|
265
|
+
* `_lifecycle` moved from `backend/src/lifecycle/` into
|
|
266
|
+
* `packages/platform/src/lifecycle/`, which is neither an application module
|
|
267
|
+
* root nor a module package: the platform declares `endora.type: "platform"`,
|
|
268
|
+
* so `declaredModuleId` answers `null` for it and the package half of the
|
|
269
|
+
* derivation never sees the module inside. Without this the one registered
|
|
270
|
+
* module living there produces no file for any module walk and the #215 floor
|
|
271
|
+
* refuses all sixteen of them — the correct failure, and not a useful one.
|
|
272
|
+
*
|
|
273
|
+
* **It cannot be derived from the index's `manifestPath` the way
|
|
274
|
+
* {@link hostResidentModuleRoots} is**, and that is a fact about the package
|
|
275
|
+
* rather than a shortcut taken here. A platform-resident module is imported by
|
|
276
|
+
* the generated index at the package's **built** file — the host publishes five
|
|
277
|
+
* subpaths and no more (D-160.7), and naming the source would evaluate the
|
|
278
|
+
* platform twice — so `manifestPath` resolves under `dist/`, which is where the
|
|
279
|
+
* module's i18n bundles are and is not where its sources are. Mapping one to
|
|
280
|
+
* the other would be a `dist`↔`src` convention written into a derivation
|
|
281
|
+
* (D-100), and the package's own emit layout is free to change it.
|
|
282
|
+
*
|
|
283
|
+
* So the module is found by the **same marker core discovery uses** — a
|
|
284
|
+
* directory holding a `manifest.ts` that declares a registered id — with the id
|
|
285
|
+
* read out of the manifest rather than off the directory name, because
|
|
286
|
+
* `_lifecycle` deliberately lives in `lifecycle/`: a directory named after a
|
|
287
|
+
* registered id makes its *parent* a module root, and `src/_lifecycle/` would
|
|
288
|
+
* make the whole platform source root one.
|
|
289
|
+
*/
|
|
290
|
+
export declare function platformResidentModuleRoots(platformRoot: string | null, found: readonly ModuleSourceRoot[], registered: ReadonlySet<string>): ModuleSourceRoot[];
|
|
291
|
+
/**
|
|
292
|
+
* The whole layout, resolved once.
|
|
293
|
+
*
|
|
294
|
+
* Async because the registered ids come out of the generated index, which is a
|
|
295
|
+
* TypeScript module the checks import rather than a file they parse — the same
|
|
296
|
+
* reader `lib/switchable-modules.ts` uses, so the two derivations cannot
|
|
297
|
+
* disagree about which modules exist.
|
|
298
|
+
*/
|
|
299
|
+
export declare function resolveModuleLayout(from?: string, fs?: WorkspaceFs): Promise<ModuleTreeLayout>;
|
|
300
|
+
/**
|
|
301
|
+
* The CLI half: resolve the layout, or print the refusal and exit 2.
|
|
302
|
+
*
|
|
303
|
+
* One function rather than a copy per check, for the reason
|
|
304
|
+
* `refuseVacuousModulePopulation` is one function: a copy per check is a chance
|
|
305
|
+
* per check to write the one that returns instead of exiting, and a check whose
|
|
306
|
+
* guard is subtly wrong is invisible by construction.
|
|
307
|
+
*/
|
|
308
|
+
export declare function requireModuleLayout(prefix: string): Promise<ModuleTreeLayout>;
|
|
309
|
+
/**
|
|
310
|
+
* Does this source file compose a module — i.e. is it the module's entry point?
|
|
311
|
+
*
|
|
312
|
+
* **The marker, never a filename** (feature 080, T040b). A module in the
|
|
313
|
+
* application's tree keeps `registerModule` in `backend.ts`; a module package
|
|
314
|
+
* keeps it wherever its `exports` map's `./backend` subpath leads, which for
|
|
315
|
+
* both packages in this repository is `src/backend/index.ts`. A predicate
|
|
316
|
+
* spelled as a filename therefore answers `false` for a packaged module, and
|
|
317
|
+
* the answer is not merely incomplete — it is fail-*open* at the place it is
|
|
318
|
+
* asked. `check-port-dependencies` matched `'/backend.ts'` and so could not see
|
|
319
|
+
* a packaged module's `di.providePort` calls: every consumer of one of those
|
|
320
|
+
* ports read as *resolving an ungated registration*, and was told to write an
|
|
321
|
+
* absent-owner policy for a gate that was right there. `blog` hid it by owning
|
|
322
|
+
* no port another module resolves; `quote_requests` owns two, resolved by six
|
|
323
|
+
* modules, and reported six findings the moment it moved.
|
|
324
|
+
*
|
|
325
|
+
* One expression, shared by `generate-composer.ts` — which locates a module's
|
|
326
|
+
* entry point this way for both origins — and by every check that needs the
|
|
327
|
+
* same file. A check whose decision exists in two places can go half-missing
|
|
328
|
+
* without either red proof noticing.
|
|
329
|
+
*
|
|
330
|
+
* It reads the **export**, not an import or a call, so a file that merely
|
|
331
|
+
* mentions `registerModule` is not one; and it does not follow a re-export, so
|
|
332
|
+
* a barrel that forwards `registerModule` from a neighbour is not recognised
|
|
333
|
+
* here. The composer refuses a package with zero or two such files with a
|
|
334
|
+
* message that says so, which is where that shape is caught.
|
|
335
|
+
*/
|
|
336
|
+
export declare function declaresRegisterModule(source: string): boolean;
|
|
337
|
+
//# sourceMappingURL=module-roots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-roots.d.ts","sourceRoot":"","sources":["../../src/lib/module-roots.ts"],"names":[],"mappings":"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"}
|