@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,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Which of this repository's workspace members is a module, and how does a
|
|
3
|
+
* generated artefact name a file inside one?" (feature 080, T041a; D-149.)
|
|
4
|
+
*
|
|
5
|
+
* `generate-composer.ts` had no notion of a module package at all. Every one of
|
|
6
|
+
* its four artefacts was rooted at `backend/src`: the two discovery walks listed
|
|
7
|
+
* `<src>/modules`, `readSourceTree` walked `<src>`, `MODULE_MIGRATION_RE` was
|
|
8
|
+
* anchored at `^modules/<id>/migrations/`, and `specifierFromDb` emitted `./…`
|
|
9
|
+
* or `../…` and nothing else. So the first module to become a package would have
|
|
10
|
+
* vanished from the composer, from the manifest index and — the one that is not
|
|
11
|
+
* recoverable by reading an error message — from the **migration registry**,
|
|
12
|
+
* where an absent entry is a migration that does not run, `migration:pending`
|
|
13
|
+
* reporting nothing pending, and a first symptom that is a query against a table
|
|
14
|
+
* nobody created.
|
|
15
|
+
*
|
|
16
|
+
* ## What a module package is, here
|
|
17
|
+
*
|
|
18
|
+
* A workspace member whose `package.json` declares `endora: { type: 'module',
|
|
19
|
+
* id }` — the package's own statement about itself, the same one
|
|
20
|
+
* `src/packages/installed-packages.ts` reads at boot and the same one
|
|
21
|
+
* `lib/module-roots.ts` keys its package roots on. It is **not** a path: nothing
|
|
22
|
+
* in this file knows or cares that D-141 puts them at `packages/modules/<id>/`,
|
|
23
|
+
* and `pnpm-workspace.yaml` remains the only authority for which directories are
|
|
24
|
+
* members (D-100).
|
|
25
|
+
*
|
|
26
|
+
* A consequence worth stating rather than discovering: a module package the
|
|
27
|
+
* workspace globs do **not** match is not a member and is not discovered here.
|
|
28
|
+
* That is the correct behaviour — the globs are the declaration — but it means
|
|
29
|
+
* moving a module into a directory no glob reaches removes it from every
|
|
30
|
+
* artefact, so the glob and the move belong in one merge request.
|
|
31
|
+
*
|
|
32
|
+
* ## How a file inside one is named
|
|
33
|
+
*
|
|
34
|
+
* By the package's **own `exports` map**, never by a subpath written down here.
|
|
35
|
+
* The rule is *the most specific declared subpath whose target covers the file*,
|
|
36
|
+
* where a target named `index.*` covers its directory recursively and any other
|
|
37
|
+
* target covers exactly itself. So a package declaring
|
|
38
|
+
* `"./migrations": "./src/migrations/index.ts"` has every file under
|
|
39
|
+
* `src/migrations/` named `@scope/mod-<id>/migrations`, and one declaring
|
|
40
|
+
* `"./entities"` instead gets that — both spellings appear in the F4 material
|
|
41
|
+
* (D-149 writes `/entities`, `module-package-layout.md` §2 folds entities into
|
|
42
|
+
* `./backend`), and reading the declaration is how a generator can be right
|
|
43
|
+
* under either without choosing between two documents.
|
|
44
|
+
*
|
|
45
|
+
* A file **no** declared subpath covers is refused, not skipped. It cannot be
|
|
46
|
+
* imported by a committed registry — that is what an `exports` map means — so
|
|
47
|
+
* emitting a specifier for it would produce an artefact that fails at its first
|
|
48
|
+
* import, and skipping it would reproduce the silent-loss failure above.
|
|
49
|
+
* Wildcard subpaths (`"./i18n/*"`) are outside the rule: a deep import through
|
|
50
|
+
* one is the shape `module-package-layout.md` R2 forbids, and it is the one
|
|
51
|
+
* consumer specifier that breaks when full F4 repoints `exports` at `dist`.
|
|
52
|
+
*
|
|
53
|
+
* ## The file the generator walked is not the file the subpath serves
|
|
54
|
+
*
|
|
55
|
+
* The paragraph above was written when D-140 ruled that a module package ships
|
|
56
|
+
* **source**, so an `exports` target named a `.ts` file the walk had just read
|
|
57
|
+
* and the two were the same path. **D-164 supersedes D-140**: a module package
|
|
58
|
+
* ships `dist`, because `tsx` applies one tsconfig per process and lowers a
|
|
59
|
+
* decorated file outside it with standard semantics, which kills every MikroORM
|
|
60
|
+
* entity a source package carries. So the map now names `./dist/backend/index.js`
|
|
61
|
+
* while the walk produces `src/backend/entities/blog-post.entity.ts`, and
|
|
62
|
+
* matching one against the other refuses **every** file of a package that
|
|
63
|
+
* follows the ruling — measured, before this paragraph existed: all four of
|
|
64
|
+
* `blog`'s shapes raised "no subpath of its exports map covers it".
|
|
65
|
+
*
|
|
66
|
+
* The missing step is the package's own **build declaration**, and it is read
|
|
67
|
+
* rather than assumed: `tsconfig.build.json`, following a relative `extends`
|
|
68
|
+
* exactly as `check-release-intent.ts` does, for its `rootDir` and `outDir`.
|
|
69
|
+
* A source file under `rootDir` is emitted at the same relative position under
|
|
70
|
+
* `outDir` with a `.js` extension, and *that* is the path matched against the
|
|
71
|
+
* `exports` targets. A package with **no** build configuration publishes what
|
|
72
|
+
* the walk read, so its paths match unchanged — which is what keeps the
|
|
73
|
+
* source-shipping regime working and is why this is a mapping rather than a
|
|
74
|
+
* `dist/` prefix written into the matcher.
|
|
75
|
+
*
|
|
76
|
+
* A `tsconfig.build.json` that exists and cannot be read or parsed is a
|
|
77
|
+
* **refusal**, never a fall back to "then it ships source": that reading would
|
|
78
|
+
* emit specifiers naming `.ts` files inside a package that publishes `.js`, and
|
|
79
|
+
* every one of them would fail at the artefact's first import.
|
|
80
|
+
*/
|
|
81
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
82
|
+
import { basename, isAbsolute, join, relative, sep } from 'node:path';
|
|
83
|
+
import { nodeWorkspaceFs, workspaceMembers, } from './workspace-packages.js';
|
|
84
|
+
/** Raised when a package cannot be turned into artefact entries. Never skipped. */
|
|
85
|
+
export class ModulePackageError extends Error {
|
|
86
|
+
name = 'ModulePackageError';
|
|
87
|
+
}
|
|
88
|
+
/** The `endora` block a member declares about itself, if it is a module's. */
|
|
89
|
+
function declaredModuleId(manifest) {
|
|
90
|
+
const endora = manifest['endora'];
|
|
91
|
+
if (typeof endora !== 'object' || endora === null || Array.isArray(endora))
|
|
92
|
+
return null;
|
|
93
|
+
const block = endora;
|
|
94
|
+
if (block['type'] !== 'module')
|
|
95
|
+
return null;
|
|
96
|
+
const id = block['id'];
|
|
97
|
+
return typeof id === 'string' && id.length > 0 ? id : null;
|
|
98
|
+
}
|
|
99
|
+
/** `packages/modules/blog/src` → `src`; `./dist/` → `dist`; `.` → `''`. */
|
|
100
|
+
function normaliseRelativeDirectory(value) {
|
|
101
|
+
return value.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '').replace(/^\.$/, '');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* `tsconfig.build.json`'s emit layout for one package, or `null` when it has no
|
|
105
|
+
* build configuration at all.
|
|
106
|
+
*
|
|
107
|
+
* Follows a relative `extends` for the same reason `check-release-intent.ts`
|
|
108
|
+
* does: !891's two-config split puts `rootDir` in the build file and everything
|
|
109
|
+
* else in the file it extends, so a reader of one alone finds half an answer.
|
|
110
|
+
* The **nearest** declaration of each key wins, which is what `tsc` itself does.
|
|
111
|
+
*
|
|
112
|
+
* A non-relative `extends` (`"@scope/tsconfig/base"`) is a refusal rather than a
|
|
113
|
+
* stop: this repository has none, and treating one as "no more to read" would
|
|
114
|
+
* silently answer with whatever half of the layout had been found so far.
|
|
115
|
+
*/
|
|
116
|
+
export function readEmitLayout(packageDir, packageName, fs) {
|
|
117
|
+
const seen = new Set();
|
|
118
|
+
let current = join(packageDir, 'tsconfig.build.json');
|
|
119
|
+
let rootDir = null;
|
|
120
|
+
let outDir = null;
|
|
121
|
+
while (rootDir === null || outDir === null) {
|
|
122
|
+
if (seen.has(current)) {
|
|
123
|
+
throw new ModulePackageError(`[composer] ${packageName}: ${current} is part of an \`extends\` cycle, so where its ` +
|
|
124
|
+
`sources are emitted cannot be read.`);
|
|
125
|
+
}
|
|
126
|
+
seen.add(current);
|
|
127
|
+
const text = fs.readText(current);
|
|
128
|
+
if (text === null) {
|
|
129
|
+
// Only the first hop may be absent: a package with no build configuration
|
|
130
|
+
// publishes its sources where they are. A missing file *inside* an
|
|
131
|
+
// `extends` chain is a broken configuration and is refused below.
|
|
132
|
+
if (seen.size === 1)
|
|
133
|
+
return null;
|
|
134
|
+
throw new ModulePackageError(`[composer] ${packageName}: ${current} is named by an \`extends\` and could not be ` +
|
|
135
|
+
`read, so where its sources are emitted is unknown. A committed registry names ` +
|
|
136
|
+
`those emitted files by specifier; guessing one produces an artefact that fails ` +
|
|
137
|
+
`at its first import.`);
|
|
138
|
+
}
|
|
139
|
+
let config;
|
|
140
|
+
try {
|
|
141
|
+
config = JSON.parse(stripLineComments(text));
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new ModulePackageError(`[composer] ${packageName}: ${current} does not parse (${String(error)}), so where ` +
|
|
145
|
+
`its sources are emitted is unknown.`);
|
|
146
|
+
}
|
|
147
|
+
const options = (config['compilerOptions'] ?? {});
|
|
148
|
+
if (rootDir === null && typeof options['rootDir'] === 'string') {
|
|
149
|
+
rootDir = normaliseRelativeDirectory(options['rootDir']);
|
|
150
|
+
}
|
|
151
|
+
if (outDir === null && typeof options['outDir'] === 'string') {
|
|
152
|
+
outDir = normaliseRelativeDirectory(options['outDir']);
|
|
153
|
+
}
|
|
154
|
+
const parent = config['extends'];
|
|
155
|
+
if (parent === undefined)
|
|
156
|
+
break;
|
|
157
|
+
if (typeof parent !== 'string' || !parent.startsWith('.')) {
|
|
158
|
+
throw new ModulePackageError(`[composer] ${packageName}: ${current} extends '${String(parent)}', which is not a ` +
|
|
159
|
+
`relative path — this derivation cannot follow it, and stopping here would answer ` +
|
|
160
|
+
`with half of the emit layout.`);
|
|
161
|
+
}
|
|
162
|
+
current = join(current, '..', parent);
|
|
163
|
+
}
|
|
164
|
+
if (rootDir === null || outDir === null) {
|
|
165
|
+
throw new ModulePackageError(`[composer] ${packageName}: ${join(packageDir, 'tsconfig.build.json')} and its ` +
|
|
166
|
+
`\`extends\` chain declare ${rootDir === null ? '`rootDir`' : '`outDir`'} nowhere. A ` +
|
|
167
|
+
`package that emits needs both, because the specifier a committed registry carries ` +
|
|
168
|
+
`names the emitted file and not the source the walk read.`);
|
|
169
|
+
}
|
|
170
|
+
return { rootDir, outDir };
|
|
171
|
+
}
|
|
172
|
+
/** A tsconfig is JSON with comments; the same stripper the other readers use. */
|
|
173
|
+
function stripLineComments(text) {
|
|
174
|
+
return text
|
|
175
|
+
.split('\n')
|
|
176
|
+
.map((line) => (/^\s*\/\//.test(line) ? '' : line))
|
|
177
|
+
.join('\n');
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Where a source file the walk read ends up in the published artefact.
|
|
181
|
+
*
|
|
182
|
+
* Package-relative in, package-relative out. Without a build layout the answer
|
|
183
|
+
* is the input — a source-shipping package publishes what was walked. With one,
|
|
184
|
+
* a file under `rootDir` moves to the same position under `outDir` and its
|
|
185
|
+
* TypeScript extension becomes the emitted `.js`; a file **outside** `rootDir`
|
|
186
|
+
* is returned unchanged, so it goes on to fail the `exports` match with the
|
|
187
|
+
* message that names the file, rather than being silently relocated to a path
|
|
188
|
+
* the build never writes.
|
|
189
|
+
*/
|
|
190
|
+
export function emittedPathOf(pkg, packageRelativePath) {
|
|
191
|
+
if (pkg.emit === null)
|
|
192
|
+
return packageRelativePath;
|
|
193
|
+
const prefix = pkg.emit.rootDir === '' ? '' : `${pkg.emit.rootDir}/`;
|
|
194
|
+
if (prefix !== '' && !packageRelativePath.startsWith(prefix))
|
|
195
|
+
return packageRelativePath;
|
|
196
|
+
const withinRoot = packageRelativePath.slice(prefix.length);
|
|
197
|
+
const emitted = withinRoot
|
|
198
|
+
.replace(/\.mts$/, '.mjs')
|
|
199
|
+
.replace(/\.cts$/, '.cjs')
|
|
200
|
+
.replace(/\.tsx?$/, '.js');
|
|
201
|
+
return pkg.emit.outDir === '' ? emitted : `${pkg.emit.outDir}/${emitted}`;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The **runtime** string target under an `exports` value.
|
|
205
|
+
*
|
|
206
|
+
* A value is either a target string or a conditions object (`{ types, import,
|
|
207
|
+
* default }`). This used to take the first string it found, on the ground that
|
|
208
|
+
* "every condition of one subpath points into the same place in the source
|
|
209
|
+
* tree". That holds for a *directory* and not for a *file*, which is the
|
|
210
|
+
* granularity actually used: `{ types: './dist/backend/index.d.ts', default:
|
|
211
|
+
* './dist/backend/index.js' }` — the shape every package in this repository
|
|
212
|
+
* writes since !876 — answered `index.d.ts`, which is neither the file the
|
|
213
|
+
* registry imports nor a name the "a barrel covers its directory" rule
|
|
214
|
+
* recognises, so `./backend` covered nothing at all.
|
|
215
|
+
*
|
|
216
|
+
* `types` is therefore skipped while any other condition is present. It is the
|
|
217
|
+
* one condition that deliberately names a *different* file from the rest, and
|
|
218
|
+
* the question asked here — which subpath serves the file a committed artefact
|
|
219
|
+
* imports — is a runtime question.
|
|
220
|
+
*/
|
|
221
|
+
function targetOf(value) {
|
|
222
|
+
if (typeof value === 'string')
|
|
223
|
+
return value;
|
|
224
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
225
|
+
return null;
|
|
226
|
+
const conditions = Object.entries(value);
|
|
227
|
+
for (const [condition, nested] of conditions) {
|
|
228
|
+
if (condition === 'types')
|
|
229
|
+
continue;
|
|
230
|
+
const found = targetOf(nested);
|
|
231
|
+
if (found !== null)
|
|
232
|
+
return found;
|
|
233
|
+
}
|
|
234
|
+
// Types-only is legal and is still an answer, if a narrower one.
|
|
235
|
+
for (const [, nested] of conditions) {
|
|
236
|
+
const found = targetOf(nested);
|
|
237
|
+
if (found !== null)
|
|
238
|
+
return found;
|
|
239
|
+
}
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
/** The declared, non-wildcard subpaths of a manifest's `exports` block. */
|
|
243
|
+
export function declaredExports(manifest) {
|
|
244
|
+
const block = manifest['exports'];
|
|
245
|
+
const found = new Map();
|
|
246
|
+
if (typeof block !== 'object' || block === null || Array.isArray(block))
|
|
247
|
+
return found;
|
|
248
|
+
for (const [subpath, value] of Object.entries(block)) {
|
|
249
|
+
if (subpath.includes('*'))
|
|
250
|
+
continue;
|
|
251
|
+
const target = targetOf(value);
|
|
252
|
+
if (target === null || !target.startsWith('./'))
|
|
253
|
+
continue;
|
|
254
|
+
found.set(subpath, target);
|
|
255
|
+
}
|
|
256
|
+
return found;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Every module package this repository declares, sorted by module id.
|
|
260
|
+
*
|
|
261
|
+
* Unlike `lib/module-roots.ts` this does **not** filter by the registered set:
|
|
262
|
+
* the generator is what *produces* the registered set, so filtering by it would
|
|
263
|
+
* make a newly packaged module invisible to the artefact that is supposed to
|
|
264
|
+
* register it — the instrument reading its own output.
|
|
265
|
+
*/
|
|
266
|
+
export function discoverModulePackages(repoRoot, fs = nodeWorkspaceFs()) {
|
|
267
|
+
const found = [];
|
|
268
|
+
for (const member of workspaceMembers(repoRoot, fs)) {
|
|
269
|
+
const moduleId = declaredModuleId(member.manifest);
|
|
270
|
+
if (moduleId === null)
|
|
271
|
+
continue;
|
|
272
|
+
found.push({
|
|
273
|
+
moduleId,
|
|
274
|
+
name: member.name,
|
|
275
|
+
dir: member.dir,
|
|
276
|
+
exports: declaredExports(member.manifest),
|
|
277
|
+
emit: readEmitLayout(member.dir, member.name, fs),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
const byId = new Map();
|
|
281
|
+
for (const pkg of found) {
|
|
282
|
+
const previous = byId.get(pkg.moduleId);
|
|
283
|
+
if (previous !== undefined) {
|
|
284
|
+
throw new ModulePackageError(`[composer] two workspace packages claim module id '${pkg.moduleId}': ` +
|
|
285
|
+
`${previous.name} (${previous.dir}) and ${pkg.name} (${pkg.dir}). One id is one ` +
|
|
286
|
+
`module's tables, settings and permissions; the artefacts cannot register both.`);
|
|
287
|
+
}
|
|
288
|
+
byId.set(pkg.moduleId, pkg);
|
|
289
|
+
}
|
|
290
|
+
return [...byId.values()].sort((a, b) => a.moduleId.localeCompare(b.moduleId));
|
|
291
|
+
}
|
|
292
|
+
/** `./src/backend/index.ts` → `src/backend`, recursively; anything else → itself. */
|
|
293
|
+
function coveredPathOf(target) {
|
|
294
|
+
const normalised = target.replace(/^\.\//, '');
|
|
295
|
+
const isBarrel = /(^|\/)index\.[cm]?[jt]sx?$/.test(normalised);
|
|
296
|
+
return isBarrel
|
|
297
|
+
? { path: normalised.replace(/(^|\/)index\.[cm]?[jt]sx?$/, ''), recursive: true }
|
|
298
|
+
: { path: normalised, recursive: false };
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* How a committed artefact names one file of a module package (D-149).
|
|
302
|
+
*
|
|
303
|
+
* `packageRelativePath` is the file's path inside the package, `/`-separated.
|
|
304
|
+
* The answer is the **longest** covering target's subpath, so a package that
|
|
305
|
+
* declares both `./backend` and a narrower `./backend/entities` gets the
|
|
306
|
+
* narrower one — the same "most specific wins" rule Node's own resolver applies
|
|
307
|
+
* to an `exports` map.
|
|
308
|
+
*/
|
|
309
|
+
export function packageSpecifierFor(pkg, packageRelativePath) {
|
|
310
|
+
const published = emittedPathOf(pkg, packageRelativePath);
|
|
311
|
+
let best = null;
|
|
312
|
+
for (const [subpath, target] of pkg.exports) {
|
|
313
|
+
if (subpath === './package.json')
|
|
314
|
+
continue;
|
|
315
|
+
const covered = coveredPathOf(target);
|
|
316
|
+
const matches = covered.recursive
|
|
317
|
+
? covered.path === '' || published.startsWith(`${covered.path}/`)
|
|
318
|
+
: published === covered.path;
|
|
319
|
+
if (!matches)
|
|
320
|
+
continue;
|
|
321
|
+
if (best === null || covered.path.length > best.length) {
|
|
322
|
+
best = { subpath, length: covered.path.length };
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (best === null) {
|
|
326
|
+
const declared = [...pkg.exports.keys()].sort().join(', ') || '(none)';
|
|
327
|
+
const via = published === packageRelativePath ? '' : `, published at ${published}`;
|
|
328
|
+
throw new ModulePackageError(`[composer] ${pkg.name} owns ${packageRelativePath}${via}, and no subpath of its exports ` +
|
|
329
|
+
`map covers it (declared: ${declared}). A committed registry imports it by that ` +
|
|
330
|
+
`specifier, so an uncovered file would be registered under a specifier the package ` +
|
|
331
|
+
`refuses with ERR_PACKAGE_PATH_NOT_EXPORTED — and dropping it instead is how a ` +
|
|
332
|
+
`migration goes missing without a word. Declare a subpath for it, or move the file ` +
|
|
333
|
+
`under one that exists.`);
|
|
334
|
+
}
|
|
335
|
+
return best.subpath === '.' ? pkg.name : `${pkg.name}/${best.subpath.replace(/^\.\//, '')}`;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* A **published** package's own entry point — the file `import '<name>'` loads.
|
|
339
|
+
*
|
|
340
|
+
* The source-tree locators search text for a marker, because a source tree
|
|
341
|
+
* declares nowhere which of its files is the manifest. A published package does
|
|
342
|
+
* declare it: the `.` subpath of its `exports` map is the package's statement
|
|
343
|
+
* about its own entry point, so the marker search is not merely unavailable
|
|
344
|
+
* here (there is no `.ts` to search), it is the wrong question. A third-party
|
|
345
|
+
* author's published manifest is a plain object literal and names
|
|
346
|
+
* `defineModuleManifest` nowhere.
|
|
347
|
+
*
|
|
348
|
+
* A package declaring no `.` subpath, or one whose target is not on disk, is a
|
|
349
|
+
* **refusal**: an artefact would name a specifier the package refuses with
|
|
350
|
+
* `ERR_PACKAGE_PATH_NOT_EXPORTED`, and skipping it is how a module drops out of
|
|
351
|
+
* a client's admin bundle or documentation with no error anywhere.
|
|
352
|
+
*/
|
|
353
|
+
export function publishedManifestEntryOf(pkg) {
|
|
354
|
+
const target = pkg.exports.get('.');
|
|
355
|
+
if (target === undefined) {
|
|
356
|
+
const declared = [...pkg.exports.keys()].sort().join(', ') || '(none)';
|
|
357
|
+
throw new ModulePackageError(`[composer] ${pkg.name} declares module '${pkg.moduleId}', ships no sources, and its ` +
|
|
358
|
+
`exports map declares no '.' subpath (declared: ${declared}). That subpath is where a ` +
|
|
359
|
+
`published package states its own entry point, and it is the only thing an artefact ` +
|
|
360
|
+
`can name it by.`);
|
|
361
|
+
}
|
|
362
|
+
const relativePath = target.replace(/^\.\//, '');
|
|
363
|
+
const manifestPath = absolutePathInPackage(pkg, relativePath);
|
|
364
|
+
if (!existsSync(manifestPath)) {
|
|
365
|
+
throw new ModulePackageError(`[composer] ${pkg.name} exports '.' as ${target}, and that file is not in the package. ` +
|
|
366
|
+
`An artefact naming it would fail at its first import; a package whose own entry ` +
|
|
367
|
+
`point is missing is not one this run can register.`);
|
|
368
|
+
}
|
|
369
|
+
return { manifestPath, manifestSpecifier: packageSpecifierFor(pkg, relativePath) };
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Is this source file the one a declared subpath points **at** — a barrel?
|
|
373
|
+
*
|
|
374
|
+
* `module-package-layout.md` §1 puts a module package's migrations under
|
|
375
|
+
* `src/migrations/`, and the `./migrations` subpath has to name a file, so the
|
|
376
|
+
* directory holds one that is not a migration: the barrel re-exporting the
|
|
377
|
+
* classes, which is what makes `import { Migration… } from
|
|
378
|
+
* '<pkg>/migrations'` resolve. `collectMigrations` refuses an unrecognised
|
|
379
|
+
* `.ts` in a migrations directory — correctly, because skipping one is how a
|
|
380
|
+
* migration goes missing without a word — so it needs to tell the barrel from
|
|
381
|
+
* a misnamed migration.
|
|
382
|
+
*
|
|
383
|
+
* It is answered from the **package's own `exports` map** rather than from
|
|
384
|
+
* `contracts/naming-convention.md` §4's allow-list, which is keyed on
|
|
385
|
+
* application paths and would have to grow an entry per package. A file a
|
|
386
|
+
* subpath points at is an entry point by declaration; a file that merely sits
|
|
387
|
+
* beside it is not.
|
|
388
|
+
*/
|
|
389
|
+
export function isDeclaredEntryPoint(pkg, packageRelativePath) {
|
|
390
|
+
const published = emittedPathOf(pkg, packageRelativePath);
|
|
391
|
+
for (const [subpath, target] of pkg.exports) {
|
|
392
|
+
if (subpath === './package.json')
|
|
393
|
+
continue;
|
|
394
|
+
if (target.replace(/^\.\//, '') === published)
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
/** A file's path inside its package, `/`-separated. */
|
|
400
|
+
export function packageRelativePathOf(pkg, absolutePath) {
|
|
401
|
+
return relative(pkg.dir, absolutePath).split(sep).join('/');
|
|
402
|
+
}
|
|
403
|
+
/** The absolute path a package-relative path names. */
|
|
404
|
+
export function absolutePathInPackage(pkg, packageRelativePath) {
|
|
405
|
+
return join(pkg.dir, ...packageRelativePath.split('/'));
|
|
406
|
+
}
|
|
407
|
+
/** The real filesystem behind {@link InstanceFs}. Absence is `null`, never a throw. */
|
|
408
|
+
export function nodeInstanceFs() {
|
|
409
|
+
const base = nodeWorkspaceFs();
|
|
410
|
+
return {
|
|
411
|
+
...base,
|
|
412
|
+
realPath(path) {
|
|
413
|
+
try {
|
|
414
|
+
return realpathSync(path);
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
/** Top-level candidate directories in one `node_modules`, `@scope/` expanded. */
|
|
423
|
+
function installedCandidates(root, fs) {
|
|
424
|
+
const found = [];
|
|
425
|
+
for (const name of [...fs.listDirectories(root)].sort()) {
|
|
426
|
+
// `.pnpm`, `.bin`: the store is reached through the top-level link, so
|
|
427
|
+
// descending would find every package a second time.
|
|
428
|
+
if (name.startsWith('.'))
|
|
429
|
+
continue;
|
|
430
|
+
const full = join(root, name);
|
|
431
|
+
if (!name.startsWith('@')) {
|
|
432
|
+
found.push(full);
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
for (const inner of [...fs.listDirectories(full)].sort()) {
|
|
436
|
+
if (inner.startsWith('.'))
|
|
437
|
+
continue;
|
|
438
|
+
found.push(join(full, inner));
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return found;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Every module package an instance installed, with what was skipped and why.
|
|
445
|
+
*
|
|
446
|
+
* `instanceRoot` is the directory whose `node_modules` holds them — the client's
|
|
447
|
+
* repository root. A root with no `node_modules` reads as *nothing to read*
|
|
448
|
+
* (`root: null`) rather than as *no module installed*, so a caller can tell an
|
|
449
|
+
* uninstalled instance from a module-less one.
|
|
450
|
+
*/
|
|
451
|
+
export function scanInstalledModulePackages(instanceRoot, fs = nodeInstanceFs()) {
|
|
452
|
+
const root = join(instanceRoot, 'node_modules');
|
|
453
|
+
const realRoot = fs.realPath(root);
|
|
454
|
+
if (realRoot === null)
|
|
455
|
+
return { packages: [], skipped: [], root: null };
|
|
456
|
+
const skipped = [];
|
|
457
|
+
const byId = new Map();
|
|
458
|
+
for (const directory of installedCandidates(root, fs)) {
|
|
459
|
+
const manifestPath = join(directory, 'package.json');
|
|
460
|
+
const text = fs.readText(manifestPath);
|
|
461
|
+
if (text === null)
|
|
462
|
+
continue;
|
|
463
|
+
let parsed;
|
|
464
|
+
try {
|
|
465
|
+
parsed = JSON.parse(text);
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
// Reported, never thrown: one unreadable stranger in a `node_modules`
|
|
469
|
+
// must not stop a client's build, exactly as it must not stop their boot.
|
|
470
|
+
skipped.push({ kind: 'unreadable', at: manifestPath, reason: String(error) });
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
474
|
+
continue;
|
|
475
|
+
const manifest = parsed;
|
|
476
|
+
const moduleId = declaredModuleId(manifest);
|
|
477
|
+
if (moduleId === null)
|
|
478
|
+
continue;
|
|
479
|
+
const name = typeof manifest['name'] === 'string' ? manifest['name'] : basename(directory);
|
|
480
|
+
const real = fs.realPath(directory);
|
|
481
|
+
if (real === null) {
|
|
482
|
+
skipped.push({
|
|
483
|
+
kind: 'unreadable',
|
|
484
|
+
at: directory,
|
|
485
|
+
reason: 'its real path could not be resolved, so whether it is installed here or ' +
|
|
486
|
+
'linked from somewhere else cannot be decided',
|
|
487
|
+
});
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
if (!isUnderDirectory(real, realRoot)) {
|
|
491
|
+
skipped.push({ kind: 'links-out-of-node-modules', name, at: directory, realPath: real });
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
const pkg = {
|
|
495
|
+
moduleId,
|
|
496
|
+
name,
|
|
497
|
+
dir: directory,
|
|
498
|
+
exports: declaredExports(manifest),
|
|
499
|
+
emit: readEmitLayout(directory, name, fs),
|
|
500
|
+
};
|
|
501
|
+
const previous = byId.get(moduleId);
|
|
502
|
+
if (previous !== undefined) {
|
|
503
|
+
throw new ModulePackageError(`[composer] two installed packages claim module id '${moduleId}': ${previous.name} ` +
|
|
504
|
+
`(${previous.dir}) and ${pkg.name} (${pkg.dir}). One id is one module's tables, ` +
|
|
505
|
+
`settings and permissions; the artefacts cannot register both.`);
|
|
506
|
+
}
|
|
507
|
+
byId.set(moduleId, pkg);
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
packages: [...byId.values()].sort((a, b) => a.moduleId.localeCompare(b.moduleId)),
|
|
511
|
+
skipped,
|
|
512
|
+
root,
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
/** {@link scanInstalledModulePackages}' accepted half. */
|
|
516
|
+
export function installedModulePackages(instanceRoot, fs = nodeInstanceFs()) {
|
|
517
|
+
return scanInstalledModulePackages(instanceRoot, fs).packages;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* The platform an instance installed, or `null` when none resolves.
|
|
521
|
+
*
|
|
522
|
+
* The same walk and the same three rules as {@link scanInstalledModulePackages},
|
|
523
|
+
* one `endora.type` value over: the discriminator is the package's own
|
|
524
|
+
* declaration and never its name, which is `platform-root.ts`' rule applied to
|
|
525
|
+
* an installed tree rather than to a workspace. The scope was `@b2b/` until
|
|
526
|
+
* D-161 and a name written into a tool is a rename away from a walk that
|
|
527
|
+
* silently sees nothing.
|
|
528
|
+
*
|
|
529
|
+
* Two installed packages declaring it is an error rather than a first-one-wins,
|
|
530
|
+
* for the reason `platform-root.ts` refuses the same state in a workspace: the
|
|
531
|
+
* walk would narrow to whichever sorted first and report on it as if it were the
|
|
532
|
+
* platform.
|
|
533
|
+
*/
|
|
534
|
+
export function scanInstalledPlatformPackage(instanceRoot, fs = nodeInstanceFs()) {
|
|
535
|
+
const root = join(instanceRoot, 'node_modules');
|
|
536
|
+
const realRoot = fs.realPath(root);
|
|
537
|
+
if (realRoot === null)
|
|
538
|
+
return null;
|
|
539
|
+
const found = [];
|
|
540
|
+
for (const directory of installedCandidates(root, fs)) {
|
|
541
|
+
const text = fs.readText(join(directory, 'package.json'));
|
|
542
|
+
if (text === null)
|
|
543
|
+
continue;
|
|
544
|
+
let parsed;
|
|
545
|
+
try {
|
|
546
|
+
parsed = JSON.parse(text);
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
552
|
+
continue;
|
|
553
|
+
const manifest = parsed;
|
|
554
|
+
const endora = manifest['endora'];
|
|
555
|
+
if (typeof endora !== 'object' || endora === null || Array.isArray(endora))
|
|
556
|
+
continue;
|
|
557
|
+
if (endora['type'] !== 'platform')
|
|
558
|
+
continue;
|
|
559
|
+
const real = fs.realPath(directory);
|
|
560
|
+
if (real === null || !isUnderDirectory(real, realRoot))
|
|
561
|
+
continue;
|
|
562
|
+
found.push({
|
|
563
|
+
name: typeof manifest['name'] === 'string' ? manifest['name'] : basename(directory),
|
|
564
|
+
dir: directory,
|
|
565
|
+
exports: declaredExports(manifest),
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
if (found.length > 1) {
|
|
569
|
+
throw new ModulePackageError(`[composer] ${String(found.length)} installed packages declare ` +
|
|
570
|
+
`\`endora.type: "platform"\` (${found.map((pkg) => pkg.name).join(', ')}). A walk would ` +
|
|
571
|
+
'narrow to whichever sorted first and report on it as if it were the platform.');
|
|
572
|
+
}
|
|
573
|
+
return found[0] ?? null;
|
|
574
|
+
}
|
|
575
|
+
/** `true` when `child` is inside `parent` and is not `parent` itself. */
|
|
576
|
+
function isUnderDirectory(child, parent) {
|
|
577
|
+
const rel = relative(parent, child);
|
|
578
|
+
return rel !== '' && rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=module-packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-packages.js","sourceRoot":"","sources":["../../src/lib/module-packages.ts"],"names":[],"mappings":"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"}
|