@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,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CI check — SQL written inside a transaction runs inside that transaction
|
|
3
|
+
* (issue #200).
|
|
4
|
+
*
|
|
5
|
+
* `SqlEntityManager.getKnex()` is `getConnection().getKnex()`, and a connection
|
|
6
|
+
* is not a transaction: the handle it returns takes its own pooled connection
|
|
7
|
+
* and knows nothing about the EntityManager's active transaction. So does
|
|
8
|
+
* `getConnection().execute(sql, params)` when it is not handed a transaction
|
|
9
|
+
* context as its fourth argument. Either one, written inside
|
|
10
|
+
* `em.transactional(...)`, **commits the moment it runs** — the enclosing
|
|
11
|
+
* rollback cannot reach it, and a read cannot see what the transaction has
|
|
12
|
+
* written.
|
|
13
|
+
*
|
|
14
|
+
* That is not a theoretical hazard. `PromotionUsageService.finalize` said in its
|
|
15
|
+
* own doc comment that its counter increments had to be co-transactional with
|
|
16
|
+
* order placement and issued them through `em.getKnex()`, so a usage cap hit
|
|
17
|
+
* rolled the order back and left the counter incremented and a redemption row
|
|
18
|
+
* pointing at an order that never existed (D-94). The sweep that produced this
|
|
19
|
+
* check found the same mechanism in sixty-five more places — fifty-one of them
|
|
20
|
+
* writes — none of them suspected: `BlogCategoryService.create` left a category with no channel scope
|
|
21
|
+
* behind a failed create, `CmsPageService.create` left a page, and
|
|
22
|
+
* `MegamenuItemService.setTree` — a delete-then-insert whose doc comment says
|
|
23
|
+
* "in one transaction" — **wiped an operator's whole menu** when the re-insert
|
|
24
|
+
* was refused.
|
|
25
|
+
*
|
|
26
|
+
* ## What is decidable, and what this check therefore looks at
|
|
27
|
+
*
|
|
28
|
+
* Whether an arbitrary method runs inside a transaction is a question about its
|
|
29
|
+
* callers, and not decidable here: services take an `em` that may or may not
|
|
30
|
+
* have one open. What *is* decidable is the lexical case — SQL written inside a
|
|
31
|
+
* scope that opens the transaction itself — and that is the whole population:
|
|
32
|
+
*
|
|
33
|
+
* 1. **`transactional-callback`** — the body of `<em>.transactional(cb)`.
|
|
34
|
+
* 2. **`command-run`** — the `run` of a Command literal (one that also carries
|
|
35
|
+
* an `action`). `CommandBus.run` executes it inside `scoped.transactional`
|
|
36
|
+
* (Principle XIII), so the transaction is as certain there as in (1).
|
|
37
|
+
*
|
|
38
|
+
* A guard reached one hop away — `this.replaceChannelScope(tx, …)` — is outside
|
|
39
|
+
* the population by construction, and deliberately: the check would have to
|
|
40
|
+
* guess at call sites to see it, and guessing is what gets a check switched off.
|
|
41
|
+
* The remedy does not need the check to see it, either, because it is safe
|
|
42
|
+
* everywhere: `em.execute(sql, params)` passes the EntityManager's transaction
|
|
43
|
+
* context when there is one and behaves exactly like the connection-level call
|
|
44
|
+
* when there is not.
|
|
45
|
+
*
|
|
46
|
+
* ## The two shapes refused
|
|
47
|
+
*
|
|
48
|
+
* - **`knex-instance`** — a `getKnex()` call, whatever the receiver. The
|
|
49
|
+
* predicate is shared with `check-module-boundary`'s builder path
|
|
50
|
+
* (`lib/sql-tables.ts`), so the two cannot drift over what a knex handle
|
|
51
|
+
* looks like.
|
|
52
|
+
* - **`connection-execute`** — an `execute(...)` whose receiver reaches
|
|
53
|
+
* `getConnection()`, directly or through a `const conn = …` binding in the
|
|
54
|
+
* same file, with fewer than four arguments. The fourth argument is the
|
|
55
|
+
* transaction context, and passing it is the house pattern
|
|
56
|
+
* (`sales-channel-membership.service.ts`); an `execute` that has it is not a
|
|
57
|
+
* finding.
|
|
58
|
+
*
|
|
59
|
+
* `em.execute(...)` is not in the population at all: the EntityManager's own
|
|
60
|
+
* `execute` fills the context in for you, which is why it is the recommended
|
|
61
|
+
* repair.
|
|
62
|
+
*
|
|
63
|
+
* ## One analysis, two hosts
|
|
64
|
+
*
|
|
65
|
+
* This file is the analysis (`specs/101-endora-check/contracts/package-scope-layout.md`
|
|
66
|
+
* §6). `backend/scripts/check-transaction-context.ts` hosts it over this
|
|
67
|
+
* repository's module walk roots and its ledger; `endora check` hosts it over
|
|
68
|
+
* one module package's declared source layer. Neither host re-derives the
|
|
69
|
+
* other's population, and neither holds a second copy of the predicate.
|
|
70
|
+
*/
|
|
71
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
72
|
+
import { join } from 'node:path';
|
|
73
|
+
import ts from 'typescript';
|
|
74
|
+
import { isGetKnexCall, sqlTableAccesses } from '../lib/sql-tables.js';
|
|
75
|
+
/** `<file>#<shape>#<statement>` — the ledger key, and the identity of a site. */
|
|
76
|
+
export function keyOf(found) {
|
|
77
|
+
return `${found.file}#${found.shape}#${found.statement}`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Every TypeScript source under `dir`, with the rule's own prunes applied.
|
|
81
|
+
*
|
|
82
|
+
* Exported because the population is part of the rule, not part of a host: two
|
|
83
|
+
* hosts computing "which files this check reads" two ways is the shape that
|
|
84
|
+
* lets one of them go half-blind.
|
|
85
|
+
*/
|
|
86
|
+
export function collectTransactionSources(dir, out = []) {
|
|
87
|
+
if (!existsSync(dir))
|
|
88
|
+
return out;
|
|
89
|
+
for (const name of readdirSync(dir)) {
|
|
90
|
+
const full = join(dir, name);
|
|
91
|
+
if (statSync(full).isDirectory()) {
|
|
92
|
+
if (name === 'node_modules' || name === 'dist')
|
|
93
|
+
continue;
|
|
94
|
+
collectTransactionSources(full, out);
|
|
95
|
+
}
|
|
96
|
+
else if (name.endsWith('.ts') && !name.endsWith('.test.ts') && !name.endsWith('.d.ts')) {
|
|
97
|
+
out.push(full);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
/** The identifiers a file binds to a `getConnection()` result. */
|
|
103
|
+
function connectionBindings(sf) {
|
|
104
|
+
const bound = new Set();
|
|
105
|
+
const visit = (node) => {
|
|
106
|
+
if (ts.isVariableDeclaration(node) &&
|
|
107
|
+
ts.isIdentifier(node.name) &&
|
|
108
|
+
node.initializer !== undefined &&
|
|
109
|
+
isGetConnectionCall(node.initializer)) {
|
|
110
|
+
bound.add(node.name.text);
|
|
111
|
+
}
|
|
112
|
+
node.forEachChild(visit);
|
|
113
|
+
};
|
|
114
|
+
sf.forEachChild(visit);
|
|
115
|
+
return bound;
|
|
116
|
+
}
|
|
117
|
+
function isGetConnectionCall(node) {
|
|
118
|
+
return (ts.isCallExpression(node) &&
|
|
119
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
120
|
+
node.expression.name.text === 'getConnection');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Whether the receiver of an `execute` is a connection.
|
|
124
|
+
*
|
|
125
|
+
* Two ways to be one, and both have to be read: the call chain names
|
|
126
|
+
* `getConnection()` itself (`tx.getConnection().execute(…)`), or it is an
|
|
127
|
+
* identifier the file bound to one (`const conn = tx.getConnection()`), which is
|
|
128
|
+
* how thirty-nine of the sites in the D-94 sweep were written.
|
|
129
|
+
*/
|
|
130
|
+
function receiverIsConnection(expression, bindings) {
|
|
131
|
+
let current = expression;
|
|
132
|
+
for (;;) {
|
|
133
|
+
if (ts.isCallExpression(current)) {
|
|
134
|
+
if (isGetConnectionCall(current))
|
|
135
|
+
return true;
|
|
136
|
+
current = current.expression;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (ts.isPropertyAccessExpression(current)) {
|
|
140
|
+
current = current.expression;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (ts.isParenthesizedExpression(current) ||
|
|
144
|
+
ts.isAsExpression(current) ||
|
|
145
|
+
ts.isNonNullExpression(current)) {
|
|
146
|
+
current = current.expression;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
return ts.isIdentifier(current) && bindings.has(current.text);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** The SQL a call's first argument spells out, as far as it is literal. */
|
|
153
|
+
function statementText(node) {
|
|
154
|
+
if (node === undefined)
|
|
155
|
+
return null;
|
|
156
|
+
if (ts.isStringLiteralLike(node))
|
|
157
|
+
return node.text;
|
|
158
|
+
if (ts.isTemplateExpression(node)) {
|
|
159
|
+
return node.head.text + node.templateSpans.map((span) => span.literal.text).join(' ? ');
|
|
160
|
+
}
|
|
161
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.PlusToken) {
|
|
162
|
+
return `${statementText(node.left) ?? ''}${statementText(node.right) ?? ''}`;
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/** One line of SQL, collapsed, for a message and a stable ledger key. */
|
|
167
|
+
function head(text) {
|
|
168
|
+
return text.replace(/\s+/g, ' ').trim().slice(0, 70);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* A Command literal's `run`.
|
|
172
|
+
*
|
|
173
|
+
* `action` has to be there too: `run` on its own is a common enough property
|
|
174
|
+
* name (a worker's `run`, a script's `run`) and only the Command shape carries
|
|
175
|
+
* the Command Bus' transaction with it.
|
|
176
|
+
*/
|
|
177
|
+
function commandRunBody(node) {
|
|
178
|
+
if (!ts.isObjectLiteralExpression(node))
|
|
179
|
+
return null;
|
|
180
|
+
const named = (name) => node.properties.find((property) => ts.isPropertyAssignment(property) &&
|
|
181
|
+
ts.isIdentifier(property.name) &&
|
|
182
|
+
property.name.text === name);
|
|
183
|
+
if (named('action') === undefined)
|
|
184
|
+
return null;
|
|
185
|
+
const run = named('run');
|
|
186
|
+
if (run === undefined)
|
|
187
|
+
return null;
|
|
188
|
+
if (!ts.isArrowFunction(run.initializer) && !ts.isFunctionExpression(run.initializer))
|
|
189
|
+
return null;
|
|
190
|
+
return run.initializer.body;
|
|
191
|
+
}
|
|
192
|
+
/** The body of an `<em>.transactional(cb)` call. */
|
|
193
|
+
function transactionalCallbackBody(node) {
|
|
194
|
+
if (!ts.isCallExpression(node))
|
|
195
|
+
return null;
|
|
196
|
+
if (!ts.isPropertyAccessExpression(node.expression))
|
|
197
|
+
return null;
|
|
198
|
+
if (node.expression.name.text !== 'transactional')
|
|
199
|
+
return null;
|
|
200
|
+
const [callback] = node.arguments;
|
|
201
|
+
if (callback === undefined)
|
|
202
|
+
return null;
|
|
203
|
+
if (!ts.isArrowFunction(callback) && !ts.isFunctionExpression(callback))
|
|
204
|
+
return null;
|
|
205
|
+
return callback.body;
|
|
206
|
+
}
|
|
207
|
+
/** Every statement written inside a transaction that does not run inside it. */
|
|
208
|
+
export function findTransactionEscapes(input) {
|
|
209
|
+
const found = [];
|
|
210
|
+
for (const [file, text] of input.sources) {
|
|
211
|
+
if (!text.includes('transactional(') && !text.includes('run:'))
|
|
212
|
+
continue;
|
|
213
|
+
const sf = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true);
|
|
214
|
+
const bindings = connectionBindings(sf);
|
|
215
|
+
// The direction of the statement on a line, from the predicate
|
|
216
|
+
// `check-module-boundary` reads tables with — so "write" means here what it
|
|
217
|
+
// means there, rather than a second opinion maintained next to it.
|
|
218
|
+
const writeLines = new Set(sqlTableAccesses(text, file)
|
|
219
|
+
.filter((access) => access.direction === 'write')
|
|
220
|
+
.map((access) => access.line));
|
|
221
|
+
const readLines = new Set(sqlTableAccesses(text, file)
|
|
222
|
+
.filter((access) => access.direction === 'read')
|
|
223
|
+
.map((access) => access.line));
|
|
224
|
+
const inspect = (body, scope) => {
|
|
225
|
+
const visit = (node) => {
|
|
226
|
+
// A nested transactional callback or Command literal is the same scope
|
|
227
|
+
// for this purpose, so recursion into it needs no special case.
|
|
228
|
+
if (ts.isCallExpression(node) && isGetKnexCall(node)) {
|
|
229
|
+
found.push({
|
|
230
|
+
file,
|
|
231
|
+
line: sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1,
|
|
232
|
+
scope,
|
|
233
|
+
shape: 'knex-instance',
|
|
234
|
+
direction: 'unknown',
|
|
235
|
+
statement: head(node.getText(sf)),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
else if (ts.isCallExpression(node) &&
|
|
239
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
240
|
+
node.expression.name.text === 'execute' &&
|
|
241
|
+
node.arguments.length < 4 &&
|
|
242
|
+
receiverIsConnection(node.expression.expression, bindings)) {
|
|
243
|
+
const line = sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1;
|
|
244
|
+
const argument = node.arguments[0];
|
|
245
|
+
const sql = statementText(argument);
|
|
246
|
+
// The direction is looked up by the **literal's** line, not the
|
|
247
|
+
// call's: `await em\n .getConnection()\n .execute(\n 'select …'`
|
|
248
|
+
// puts four lines between them, and keying on the call's line reported
|
|
249
|
+
// every one of those as `unknown`.
|
|
250
|
+
const sqlLine = argument === undefined
|
|
251
|
+
? line
|
|
252
|
+
: sf.getLineAndCharacterOfPosition(argument.getStart(sf)).line + 1;
|
|
253
|
+
found.push({
|
|
254
|
+
file,
|
|
255
|
+
line,
|
|
256
|
+
scope,
|
|
257
|
+
shape: 'connection-execute',
|
|
258
|
+
direction: writeLines.has(sqlLine)
|
|
259
|
+
? 'write'
|
|
260
|
+
: readLines.has(sqlLine)
|
|
261
|
+
? 'read'
|
|
262
|
+
: 'unknown',
|
|
263
|
+
statement: sql === null ? head(node.getText(sf)) : head(sql),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
node.forEachChild(visit);
|
|
267
|
+
};
|
|
268
|
+
body.forEachChild(visit);
|
|
269
|
+
};
|
|
270
|
+
const visitTop = (node) => {
|
|
271
|
+
const transactional = transactionalCallbackBody(node);
|
|
272
|
+
if (transactional !== null)
|
|
273
|
+
inspect(transactional, 'transactional-callback');
|
|
274
|
+
const commandRun = commandRunBody(node);
|
|
275
|
+
if (commandRun !== null)
|
|
276
|
+
inspect(commandRun, 'command-run');
|
|
277
|
+
node.forEachChild(visitTop);
|
|
278
|
+
};
|
|
279
|
+
sf.forEachChild(visitTop);
|
|
280
|
+
}
|
|
281
|
+
found.sort((a, b) => (a.file === b.file ? a.line - b.line : a.file.localeCompare(b.file)));
|
|
282
|
+
return found;
|
|
283
|
+
}
|
|
284
|
+
export function checkTransactionContext(input, ledger) {
|
|
285
|
+
const all = findTransactionEscapes(input);
|
|
286
|
+
const keys = new Set(all.map(keyOf));
|
|
287
|
+
return {
|
|
288
|
+
total: all.length,
|
|
289
|
+
violations: all.filter((entry) => ledger[keyOf(entry)] === undefined),
|
|
290
|
+
ledgered: all.filter((entry) => ledger[keyOf(entry)] !== undefined),
|
|
291
|
+
stale: Object.keys(ledger).filter((key) => !keys.has(key)),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=transaction-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-context.js","sourceRoot":"","sources":["../../src/rules/transaction-context.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@endora-commerce/cli",
|
|
3
|
+
"version": "0.100.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "The `endora` command line: scaffolding and conformance tooling for Endora Commerce modules and integrations.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/endora-commerce/endora-commerce.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"endora": "./dist/bin/endora.js"
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./lib/*.js": {
|
|
26
|
+
"types": "./dist/lib/*.d.ts",
|
|
27
|
+
"default": "./dist/lib/*.js"
|
|
28
|
+
},
|
|
29
|
+
"./rules/*.js": {
|
|
30
|
+
"types": "./dist/rules/*.d.ts",
|
|
31
|
+
"default": "./dist/rules/*.js"
|
|
32
|
+
},
|
|
33
|
+
"./checks": {
|
|
34
|
+
"types": "./dist/checks.d.ts",
|
|
35
|
+
"default": "./dist/checks.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.18.0"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"typescript": "^5.9.3",
|
|
47
|
+
"@endora-commerce/contracts": "0.100.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.9.0",
|
|
51
|
+
"vitest": "^4.1.11"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "tsc -p tsconfig.build.json && node scripts/write-release-index.mjs",
|
|
55
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
56
|
+
"lint": "eslint src test",
|
|
57
|
+
"test": "vitest run"
|
|
58
|
+
}
|
|
59
|
+
}
|