@tokenoftrust/storefront-runner 1.4.2-rc.0 → 2.0.1
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/apps/storefront/astro.config.mjs +3 -3
- package/apps/storefront/dev-plugins/tenant-hot-reload.mjs +8 -3
- package/apps/storefront/env.d.ts +54 -5
- package/apps/storefront/integrations/materialize-guard.mjs +12 -14
- package/apps/storefront/migrations-apps/0004_deep_morph.sql +36 -0
- package/apps/storefront/migrations-apps/0005_common_mystique.sql +23 -0
- package/apps/storefront/migrations-apps/0006_broad_microchip.sql +16 -0
- package/apps/storefront/migrations-apps/0007_brave_outlaw_kid.sql +15 -0
- package/apps/storefront/migrations-apps/0008_blue_dazzler.sql +11 -0
- package/apps/storefront/migrations-apps/0009_bored_shinobi_shaw.sql +15 -0
- package/apps/storefront/migrations-apps/0010_ws4_verified_provider_measurement.sql +35 -0
- package/apps/storefront/migrations-apps/meta/0004_snapshot.json +1474 -0
- package/apps/storefront/migrations-apps/meta/0005_snapshot.json +1617 -0
- package/apps/storefront/migrations-apps/meta/0006_snapshot.json +1716 -0
- package/apps/storefront/migrations-apps/meta/0007_snapshot.json +1812 -0
- package/apps/storefront/migrations-apps/meta/0008_snapshot.json +1881 -0
- package/apps/storefront/migrations-apps/meta/0009_snapshot.json +1979 -0
- package/apps/storefront/migrations-apps/meta/_journal.json +42 -0
- package/apps/storefront/public/apps/tot.demo.analytics/0.1.0/entry.js +42 -0
- package/apps/storefront/public/platform/amplitude-http/v1/entry.mjs +19 -0
- package/apps/storefront/public/platform/google-measurement/v1/entry.mjs +19 -0
- package/apps/storefront/public/shared/commerce-chrome.css +20 -2
- package/apps/storefront/scripts/build-v84-clean-clone-standalone.mjs +68 -0
- package/apps/storefront/scripts/deny-v84-clean-clone-standalone-capabilities.mjs +111 -0
- package/apps/storefront/scripts/deny-v84-dogfood-capabilities.mjs +2 -0
- package/apps/storefront/scripts/deny-v84-lifecycle-capabilities.mjs +247 -0
- package/apps/storefront/scripts/dogfood-v84-nonportable-routes.ts +73 -0
- package/apps/storefront/scripts/fixed-v84-native-install-producer.ts +79 -0
- package/apps/storefront/scripts/generated/v84-clean-clone-replay.bundle.mjs +10982 -0
- package/apps/storefront/scripts/import-v84-through-ws2.ts +38 -0
- package/apps/storefront/scripts/initialize-v84-lifecycle-tooling-dependency.ts +2 -0
- package/apps/storefront/scripts/initialize-v84-lifecycle-tooling.ts +4 -0
- package/apps/storefront/scripts/install-v84-native-through-ws1.ts +185 -0
- package/apps/storefront/scripts/prove-clone-isolation.ts +506 -0
- package/apps/storefront/scripts/replay-v84-clean-clone-pass.ts +148 -0
- package/apps/storefront/scripts/replay-v84-clean-clone-standalone.ts +35 -0
- package/apps/storefront/scripts/replay-v84-clean-clone.ts +214 -0
- package/apps/storefront/scripts/run-fixed-v84-native-install-producer.mjs +18 -0
- package/apps/storefront/scripts/run-v84-clone-isolation-proof.mjs +18 -0
- package/apps/storefront/scripts/run-v84-clone-lifecycle-proof.mjs +18 -0
- package/apps/storefront/scripts/run-v84-import-through-ws2-proof.mjs +17 -0
- package/apps/storefront/scripts/run-v84-nonportable-route-dogfood.mjs +15 -0
- package/apps/storefront/scripts/sanitize-v84-proof-environment.mjs +21 -0
- package/apps/storefront/scripts/v84CleanCloneGraphPin.ts +42 -0
- package/apps/storefront/scripts/v84CleanCloneSourceGraph.ts +145 -0
- package/apps/storefront/scripts/validate-v84-clone-lifecycle.ts +18 -0
- package/apps/storefront/src/components/Img.astro +1 -1
- package/apps/storefront/src/components/admin/AdminBlogTab.astro +19 -16
- package/apps/storefront/src/components/admin/AdminIntegrationsTab.astro +105 -0
- package/apps/storefront/src/components/admin/AdminPublishTab.astro +1057 -412
- package/apps/storefront/src/components/admin/AdminSettingsTab.astro +2 -2
- package/apps/storefront/src/components/admin/orders/OrdersWorkspace.astro +5 -5
- package/apps/storefront/src/components/chrome/NavDropdown.astro +12 -0
- package/apps/storefront/src/components/chrome/SiteFooter.astro +7 -2
- package/apps/storefront/src/components/chrome/SiteHeader.astro +46 -10
- package/apps/storefront/src/components/compliance/AdultSignatureNotice.astro +1 -1
- package/apps/storefront/src/components/compliance/ComplianceNotice.astro +1 -2
- package/apps/storefront/src/components/compliance/ExciseTaxNotice.astro +1 -2
- package/apps/storefront/src/components/compliance/PactActNotice.astro +1 -1
- package/apps/storefront/src/components/compliance/Prop65Warning.astro +1 -2
- package/apps/storefront/src/components/compliance/PurchaseLimitNotice.astro +2 -3
- package/apps/storefront/src/components/compliance/ShippingRestrictionNotice.astro +2 -2
- package/apps/storefront/src/components/compliance/StateEligibilityNotice.astro +2 -3
- package/apps/storefront/src/components/content/TrustStrip.astro +4 -4
- package/apps/storefront/src/components/islands/MobileNav.tsx +26 -1
- package/apps/storefront/src/components/islands/VariantSelector.tsx +27 -2
- package/apps/storefront/src/components/islands/useCheckoutHandoffCorrelation.ts +75 -0
- package/apps/storefront/src/components/membership/IllustrativeLabel.astro +1 -2
- package/apps/storefront/src/components/membership/TierCards.astro +2 -2
- package/apps/storefront/src/components/membership/TierComparisonTable.astro +2 -2
- package/apps/storefront/src/components/subscription/SavingsExplainer.astro +2 -2
- package/apps/storefront/src/config/adminTenantLookup.ts +35 -0
- package/apps/storefront/src/config/devTenantSeed.ts +9 -9
- package/apps/storefront/src/config/resolver.ts +18 -10
- package/apps/storefront/src/layouts/Layout.astro +100 -20
- package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +87 -0
- package/apps/storefront/src/lib/activity/changeActorAttribution.ts +86 -6
- package/apps/storefront/src/lib/activity/deployVersion.ts +1 -1
- package/apps/storefront/src/lib/admin/adminShell.ts +2 -0
- package/apps/storefront/src/lib/admin/envelope.ts +1 -2
- package/apps/storefront/src/lib/apps/adminService.ts +10 -0
- package/apps/storefront/src/lib/apps/adminSession.ts +1 -1
- package/apps/storefront/src/lib/apps/appVersionStore.ts +281 -0
- package/apps/storefront/src/lib/apps/consentConfigStore.ts +228 -0
- package/apps/storefront/src/lib/apps/gtmMigrationInstall.ts +447 -0
- package/apps/storefront/src/lib/apps/gtmMigrationReport.ts +367 -0
- package/apps/storefront/src/lib/apps/gtmMigrationTab.ts +315 -0
- package/apps/storefront/src/lib/apps/integrationLifecycle.ts +614 -0
- package/apps/storefront/src/lib/apps/integrationLifecycleController.ts +125 -0
- package/apps/storefront/src/lib/apps/integrationReadModel.ts +563 -0
- package/apps/storefront/src/lib/apps/integrationsTab.ts +547 -0
- package/apps/storefront/src/lib/apps/integrationsView.ts +106 -0
- package/apps/storefront/src/lib/apps/managedAnalyticsService.ts +599 -0
- package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +150 -0
- package/apps/storefront/src/lib/apps/orders/orderForwardReceiver.ts +8 -0
- package/apps/storefront/src/lib/apps/orders/ordersStore.ts +1 -1
- package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +117 -0
- package/apps/storefront/src/lib/apps/registryService.ts +264 -10
- package/apps/storefront/src/lib/apps/tenantIntegrationMaterialization.ts +170 -0
- package/apps/storefront/src/lib/apps/v84CleanCloneReplayContext.ts +16 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleCacheEvidence.ts +105 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleEvidence.ts +177 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleMaterialization.ts +251 -0
- package/apps/storefront/src/lib/apps/v84CloneLifecycleSemantics.ts +241 -0
- package/apps/storefront/src/lib/apps/v84CloneMigrationEvidence.ts +211 -0
- package/apps/storefront/src/lib/apps/v84CloneNativeInstallEvidence.ts +409 -0
- package/apps/storefront/src/lib/apps/v84NonportableCodeCoaching.ts +368 -0
- package/apps/storefront/src/lib/apps/v84NonportableRouteContract.ts +188 -0
- package/apps/storefront/src/lib/apps/v84NonportableRouteDogfood.ts +291 -0
- package/apps/storefront/src/lib/apps/ws1ManagedAnalyticsClient.ts +95 -0
- package/apps/storefront/src/lib/auth/adminApiGuard.ts +66 -0
- package/apps/storefront/src/lib/auth/adminEntry.ts +2 -2
- package/apps/storefront/src/lib/auth/adminLanding.ts +88 -0
- package/apps/storefront/src/lib/blog/collection.ts +114 -17
- package/apps/storefront/src/lib/blog/markdown.ts +1 -1
- package/apps/storefront/src/lib/blog/provider.ts +76 -9
- package/apps/storefront/src/lib/blog/types.ts +9 -9
- package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome-assignments.example.json +6 -0
- package/apps/storefront/src/lib/chrome/examples/tokenoftrust.chrome.example.json +79 -0
- package/apps/storefront/src/lib/chrome/model.ts +48 -253
- package/apps/storefront/src/lib/chrome/navCurrent.ts +29 -0
- package/apps/storefront/src/lib/chrome/parseConfig.ts +18 -32
- package/apps/storefront/src/lib/chrome/variant.ts +39 -0
- package/apps/storefront/src/lib/commerce/checkoutHandoffCorrelation.ts +105 -0
- package/apps/storefront/src/lib/compliance/tamper-sentinel-boot.ts +152 -0
- package/apps/storefront/src/lib/compliance/tamper-sentinel.ts +327 -0
- package/apps/storefront/src/lib/content/index.ts +5 -5
- package/apps/storefront/src/lib/content-edit/applyDiff.ts +1 -1
- package/apps/storefront/src/lib/content-edit/route.ts +1 -1
- package/apps/storefront/src/lib/d1/catalog.ts +12 -0
- package/apps/storefront/src/lib/d1/schema-apps.ts +276 -0
- package/apps/storefront/src/lib/dev/cockpit/ask.ts +49 -0
- package/apps/storefront/src/lib/dev/cockpit/clickToSource.ts +71 -0
- package/apps/storefront/src/lib/dev/cockpit/copyCommand.ts +227 -0
- package/apps/storefront/src/lib/dev/cockpit/files.ts +249 -0
- package/apps/storefront/src/lib/dev/cockpit/hostedActivity.ts +500 -0
- package/apps/storefront/src/lib/dev/cockpit/infoPopover.ts +12 -0
- package/apps/storefront/src/lib/dev/cockpit/mcpCopy.ts +34 -0
- package/apps/storefront/src/lib/dev/cockpit/monitor.ts +107 -0
- package/apps/storefront/src/lib/dev/cockpit/stepper.ts +116 -0
- package/apps/storefront/src/lib/dev/cockpit/themeToggle.ts +23 -0
- package/apps/storefront/src/lib/dev/runtimeStore.ts +1 -1
- package/apps/storefront/src/lib/edgeCache.ts +18 -6
- package/apps/storefront/src/lib/email/candidateConflictEmail.ts +80 -0
- package/apps/storefront/src/lib/integration/browserEnvironment.ts +137 -0
- package/apps/storefront/src/lib/integration/managedInstallDeclarations.ts +72 -0
- package/apps/storefront/src/lib/integration/nonceStamp.ts +49 -0
- package/apps/storefront/src/lib/integration/tenantDeclarations.ts +116 -0
- package/apps/storefront/src/lib/membership/eligibility.ts +1 -1
- package/apps/storefront/src/lib/membership/model.ts +1 -2
- package/apps/storefront/src/lib/newsletter/confirmationEmail.ts +2 -2
- package/apps/storefront/src/lib/newsletter/consent.ts +2 -2
- package/apps/storefront/src/lib/newsletter/send.ts +3 -3
- package/apps/storefront/src/lib/previewReload.ts +57 -1
- package/apps/storefront/src/lib/publish/adminPublishTab.ts +1775 -669
- package/apps/storefront/src/lib/publish/buildStream.ts +269 -0
- package/apps/storefront/src/lib/publish/collapsePersistence.ts +72 -0
- package/apps/storefront/src/lib/publish/lifecycleState.ts +369 -0
- package/apps/storefront/src/lib/publish/liveReleaseSummary.ts +29 -0
- package/apps/storefront/src/lib/publish/mergeDoctorOnFailure.ts +78 -0
- package/apps/storefront/src/lib/publish/mergeHealthBanner.ts +62 -0
- package/apps/storefront/src/lib/publish/mergeRowFindings.ts +124 -0
- package/apps/storefront/src/lib/publish/mergeSupportEscalation.ts +75 -0
- package/apps/storefront/src/lib/publish/publish-guard.ts +88 -0
- package/apps/storefront/src/lib/publish/publishFormat.ts +165 -0
- package/apps/storefront/src/lib/publish/publishHero.ts +177 -0
- package/apps/storefront/src/lib/publish/reviewRelease/changeState.ts +66 -0
- package/apps/storefront/src/lib/publish/reviewRelease/copy.ts +141 -0
- package/apps/storefront/src/lib/publish/reviewRelease/index.ts +41 -0
- package/apps/storefront/src/lib/publish/reviewRelease/permissions.ts +47 -0
- package/apps/storefront/src/lib/publish/reviewRelease/releaseState.ts +42 -0
- package/apps/storefront/src/lib/publish/reviewRelease/types.ts +59 -0
- package/apps/storefront/src/lib/publish/reviewRelease/viewModel.ts +440 -0
- package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/actions.ts +161 -0
- package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/controller.ts +325 -0
- package/apps/storefront/src/lib/publish/reviewReleaseWorkspace/render.ts +241 -0
- package/apps/storefront/src/lib/publish/shipWorkspace.ts +22 -3
- package/apps/storefront/src/lib/publish/sseRoute.ts +119 -0
- package/apps/storefront/src/lib/publish/streamLogConsole.ts +142 -0
- package/apps/storefront/src/lib/publish/versionNumber.ts +52 -0
- package/apps/storefront/src/lib/rawChrome.ts +125 -47
- package/apps/storefront/src/lib/rawMarketingHtml.ts +74 -3
- package/apps/storefront/src/lib/seo/alternates.ts +1 -1
- package/apps/storefront/src/lib/social/notify.ts +4 -4
- package/apps/storefront/src/lib/storyblok/content-model.ts +7 -33
- package/apps/storefront/src/lib/storyblok/provider.ts +203 -69
- package/apps/storefront/src/lib/subscription/model.ts +4 -4
- package/apps/storefront/src/lib/the-build/provider.ts +9 -4
- package/apps/storefront/src/middleware/index.ts +273 -51
- package/apps/storefront/src/pages/[...slug].astro +9 -4
- package/apps/storefront/src/pages/admin/review-release.astro +265 -0
- package/apps/storefront/src/pages/admin/select.astro +96 -0
- package/apps/storefront/src/pages/admin.astro +16 -2
- package/apps/storefront/src/pages/api/activity.ts +8 -8
- package/apps/storefront/src/pages/api/admin/activity-alerts.ts +5 -20
- package/apps/storefront/src/pages/api/admin/orders/[id].ts +7 -2
- package/apps/storefront/src/pages/api/admin/orders.ts +8 -2
- package/apps/storefront/src/pages/api/apps/admin/gtm-migration-install.ts +174 -0
- package/apps/storefront/src/pages/api/apps/admin/gtm-migration.ts +96 -0
- package/apps/storefront/src/pages/api/apps/admin/integration-lifecycle.ts +118 -0
- package/apps/storefront/src/pages/api/apps/admin/integrations.ts +89 -0
- package/apps/storefront/src/pages/api/apps/admin/platform-adapters.ts +85 -0
- package/apps/storefront/src/pages/api/apps/internal/order-forward.ts +74 -2
- package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +77 -0
- package/apps/storefront/src/pages/api/compliance/tamper.ts +88 -0
- package/apps/storefront/src/pages/api/integrations/v1/[operation].ts +108 -0
- package/apps/storefront/src/pages/api/rum/vitals.ts +1 -2
- package/apps/storefront/src/pages/blog/[slug].astro +5 -5
- package/apps/storefront/src/pages/blog/author/[author].astro +3 -3
- package/apps/storefront/src/pages/blog/category/[category].astro +2 -2
- package/apps/storefront/src/pages/blog/index.astro +2 -2
- package/apps/storefront/src/pages/blog/tag/[tag].astro +2 -2
- package/apps/storefront/src/pages/cockpit.astro +61 -1362
- package/apps/storefront/src/pages/index.astro +10 -5
- package/apps/storefront/src/pages/llms.txt.ts +1 -1
- package/apps/storefront/src/pages/products/[handle].astro +7 -6
- package/apps/storefront/src/pages/sitemap.xml.ts +2 -2
- package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +42 -31
- package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +8 -3
- package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +6 -2
- package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +6 -2
- package/apps/storefront/src/pages/style-guide/index.astro +19 -5
- package/apps/storefront/src/pages/tenants/[id]/[...path].ts +38 -2
- package/apps/storefront/src/pages/the-build/[slug].astro +4 -4
- package/apps/storefront/src/pages/the-build/index.astro +2 -2
- package/apps/storefront/src/pages/the-build/rss.xml.ts +2 -2
- package/apps/storefront/src/styles/admin.css +27 -1
- package/apps/storefront/src/themes/tenants/index.ts +19 -7
- package/apps/storefront/tsconfig.json +1 -1
- package/package.json +1 -1
- package/packages/public-runtime/package.json +2 -1
- package/packages/public-runtime/schemas/managed-analytics/v1/adapter-definition.schema.json +427 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/create-integration-install-request.schema.json +161 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/create-migration-draft-request.schema.json +157 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/delete-integration-install-request.schema.json +84 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/delete-migration-draft-request.schema.json +84 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/error-envelope.schema.json +180 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-adapter-definition-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-install-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-integration-revision-request.schema.json +79 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/get-migration-draft-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/integration-install.schema.json +167 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/integration-revision.schema.json +208 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/list-adapter-definitions-request.schema.json +53 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-installs-request.schema.json +53 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/list-integration-revisions-request.schema.json +82 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/migration-draft.schema.json +218 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/mutation-request.schema.json +52 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/mutation-success-envelope.schema.json +49 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/read-request.schema.json +20 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/read-success-envelope.schema.json +45 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/revise-integration-install-request.schema.json +156 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/set-integration-install-status-request.schema.json +92 -0
- package/packages/public-runtime/schemas/managed-analytics/v1/update-migration-draft-request.schema.json +184 -0
- package/packages/public-runtime/scripts/generate-managed-analytics-api-v1-schemas.mjs +13 -0
- package/packages/public-runtime/src/activity/catalog.ts +41 -37
- package/packages/public-runtime/src/activity/event.ts +6 -6
- package/packages/public-runtime/src/activity/index.ts +2 -2
- package/packages/public-runtime/src/activity/redaction.ts +4 -4
- package/packages/public-runtime/src/candidate-index.ts +42 -8
- package/packages/public-runtime/src/checkout-orders.ts +2 -2
- package/packages/public-runtime/src/checkout-style-publish.ts +2 -2
- package/packages/public-runtime/src/checkout-style.ts +7 -7
- package/packages/public-runtime/src/checkout.ts +3 -3
- package/packages/public-runtime/src/chrome.ts +777 -0
- package/packages/public-runtime/src/compliance-obligations.ts +310 -0
- package/packages/public-runtime/src/csp.ts +99 -0
- package/packages/public-runtime/src/customization-runtime.ts +32 -1
- package/packages/public-runtime/src/destination-webhook/contract.ts +353 -0
- package/packages/public-runtime/src/embed-catalog.d.mts +9 -0
- package/packages/public-runtime/src/embed-catalog.mjs +40 -0
- package/packages/public-runtime/src/evidence.ts +288 -0
- package/packages/public-runtime/src/gtm-migration/bounds.ts +138 -0
- package/packages/public-runtime/src/gtm-migration/disposition-rules.ts +361 -0
- package/packages/public-runtime/src/gtm-migration/dispositions.ts +181 -0
- package/packages/public-runtime/src/gtm-migration/draft-generator.ts +400 -0
- package/packages/public-runtime/src/gtm-migration/graph.ts +468 -0
- package/packages/public-runtime/src/gtm-migration/index.ts +95 -0
- package/packages/public-runtime/src/gtm-migration/parse.ts +410 -0
- package/packages/public-runtime/src/gtm-migration/references.ts +266 -0
- package/packages/public-runtime/src/gtm-migration/types.ts +86 -0
- package/packages/public-runtime/src/index.ts +16 -1
- package/packages/public-runtime/src/integration/assurance-decision.ts +259 -0
- package/packages/public-runtime/src/integration/assurance.ts +228 -0
- package/packages/public-runtime/src/integration/candidate-evidence.ts +377 -0
- package/packages/public-runtime/src/integration/commerce-broker.ts +497 -0
- package/packages/public-runtime/src/integration/consent-broker.ts +337 -0
- package/packages/public-runtime/src/integration/consent-cmp-demand.ts +115 -0
- package/packages/public-runtime/src/integration/consent-config.ts +260 -0
- package/packages/public-runtime/src/integration/consent-preview.ts +125 -0
- package/packages/public-runtime/src/integration/correlation-token.ts +444 -0
- package/packages/public-runtime/src/integration/csp-compiler.ts +267 -0
- package/packages/public-runtime/src/integration/csp.ts +105 -0
- package/packages/public-runtime/src/integration/digest.ts +43 -0
- package/packages/public-runtime/src/integration/environment.ts +228 -0
- package/packages/public-runtime/src/integration/events-catalog.ts +186 -0
- package/packages/public-runtime/src/integration/events.ts +701 -0
- package/packages/public-runtime/src/integration/g2-action-boundary.ts +106 -0
- package/packages/public-runtime/src/integration/index.ts +90 -0
- package/packages/public-runtime/src/integration/interim-bridge.ts +138 -0
- package/packages/public-runtime/src/integration/lifecycle-boot.ts +317 -0
- package/packages/public-runtime/src/integration/lifecycle-runtime.ts +393 -0
- package/packages/public-runtime/src/integration/lifecycle.ts +94 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.d.mts +2 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1-safety.mjs +10 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1.schemas.ts +382 -0
- package/packages/public-runtime/src/integration/managed-analytics-api-v1.ts +684 -0
- package/packages/public-runtime/src/integration/managed-analytics-bridge.ts +383 -0
- package/packages/public-runtime/src/integration/managed-analytics-value-safety.ts +14 -0
- package/packages/public-runtime/src/integration/managed-analytics.ts +277 -0
- package/packages/public-runtime/src/integration/manifest.ts +470 -0
- package/packages/public-runtime/src/integration/native-amplitude.ts +362 -0
- package/packages/public-runtime/src/integration/native-ga4.ts +352 -0
- package/packages/public-runtime/src/integration/observability.ts +451 -0
- package/packages/public-runtime/src/integration/order-conversion.ts +0 -0
- package/packages/public-runtime/src/integration/phases.ts +182 -0
- package/packages/public-runtime/src/integration/plan.ts +112 -0
- package/packages/public-runtime/src/integration/platform-adapter-runtime.ts +146 -0
- package/packages/public-runtime/src/integration/platform-adapters.ts +671 -0
- package/packages/public-runtime/src/integration/promotion-gate.ts +451 -0
- package/packages/public-runtime/src/integration/provider-checkout-extension.ts +425 -0
- package/packages/public-runtime/src/integration/receipt-measurement.ts +370 -0
- package/packages/public-runtime/src/integration/regulated-parent-cert.ts +311 -0
- package/packages/public-runtime/src/integration/render-phases.ts +267 -0
- package/packages/public-runtime/src/integration/resolve.ts +465 -0
- package/packages/public-runtime/src/integration/result.ts +239 -0
- package/packages/public-runtime/src/integration/secrets.ts +92 -0
- package/packages/public-runtime/src/integration/tamper-evidence.ts +205 -0
- package/packages/public-runtime/src/integration/tamper-recovery.ts +127 -0
- package/packages/public-runtime/src/integration/version.ts +92 -0
- package/packages/public-runtime/src/integration-capabilities.ts +520 -0
- package/packages/public-runtime/src/membership.ts +2 -2
- package/packages/public-runtime/src/raw-html-policy.ts +2 -4
- package/packages/public-runtime/src/regulated-commerce/broker/consent-dedupe.ts +144 -0
- package/packages/public-runtime/src/regulated-commerce/correlation/contract.ts +177 -0
- package/packages/public-runtime/src/regulated-commerce/diagnostics/local-dispatch.ts +24 -0
- package/packages/public-runtime/src/regulated-commerce/diagnostics/read-model.ts +69 -0
- package/packages/public-runtime/src/regulated-commerce/dispatch/core.ts +134 -0
- package/packages/public-runtime/src/regulated-commerce/events/contract.ts +113 -0
- package/packages/public-runtime/src/regulated-commerce/ledger/core.ts +81 -0
- package/packages/public-runtime/src/regulated-commerce/mappings/ga4-ads.ts +87 -0
- package/packages/public-runtime/src/regulated-commerce/provider-order/bridge.ts +52 -0
- package/packages/public-runtime/src/regulated-commerce/purchase-truth/contract.ts +252 -0
- package/packages/public-runtime/src/regulated-commerce/sources/accepted-browser-operation.ts +67 -0
- package/packages/public-runtime/src/regulated-commerce/testing/fake-destination.ts +93 -0
- package/packages/public-runtime/src/static-bundle.ts +5 -5
- package/packages/public-runtime/src/tenant-assets.ts +143 -4
- package/packages/public-runtime/src/tenant.ts +136 -9
- package/packages/public-runtime/tests/fixtures/integration/browser-environment.example.json +8 -0
- package/packages/public-runtime/tests/fixtures/integration/commerce-event.example.json +44 -0
- package/packages/public-runtime/tests/fixtures/integration/commerce-order-event.example.json +44 -0
- package/packages/public-runtime/tests/fixtures/integration/compliance-assurance-record.example.json +50 -0
- package/packages/public-runtime/tests/fixtures/integration/integration-manifest-v2.example.json +120 -0
- package/packages/public-runtime/tests/fixtures/integration/managed-analytics-v1/fake-adapter-catalog.json +35 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-action-registry.example.json +11 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/README.md +22 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/entry.js +30 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/manifest.json +75 -0
- package/packages/public-runtime/tests/fixtures/integration/tenant-local-example/public-config.json +3 -0
- package/packages/public-runtime/tests/fixtures/regulated-commerce/fake-destinations.ts +38 -0
- package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.provenance.json +29 -0
- package/packages/public-runtime/tests/gtm-migration/fixtures/gtm-sample-container-v84.redacted.json +3397 -0
- package/scripts/build/copy-tenant-assets.mjs +12 -5
- package/scripts/dev/ai-edit.mjs +2 -1
- package/scripts/dev/file-browser.mjs +2 -2
- package/scripts/dev/file-writer.mjs +2 -2
- package/scripts/dev/integration-guardrails.mjs +498 -0
- package/scripts/dev/safe-path.mjs +2 -2
- package/scripts/dev/tenant-source-root.mjs +3 -2
- package/scripts/tot-dev.mjs +5 -4
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The D1-backed durable seams the verified-order conversion join
|
|
3
|
+
* (`@tot/public-runtime`'s `computeOrderConversion`) needs in the Worker, plus the
|
|
4
|
+
* thin wrapper the order-forward receiver route calls to run the join.
|
|
5
|
+
*
|
|
6
|
+
* Two durable stores on `STOREFRONT_APPS_DB` (the same D1 the order rows live in, so
|
|
7
|
+
* attribution and the order it attributes share one database):
|
|
8
|
+
* - `correlation_replay` — the single-use `jti` ledger behind the injected
|
|
9
|
+
* {@link CorrelationReplayGuard}: a correlation token is honored exactly once, and
|
|
10
|
+
* a replay of a consumed `jti` is refused. Rows are pruned once past their `exp`
|
|
11
|
+
* (a past-`exp` token is already rejected `expired` before the guard is reached).
|
|
12
|
+
* - `order_attribution` — the per-`(tenant, orderId)` attribution ledger: the order's
|
|
13
|
+
* attribution is fixed on its first conversion and reused for later lifecycle events.
|
|
14
|
+
*
|
|
15
|
+
* Both run over the `Queryable` seam, so they serve real D1 in the Worker and an
|
|
16
|
+
* in-memory `node:sqlite` in tests unchanged.
|
|
17
|
+
*/
|
|
18
|
+
import type { Queryable } from "../../d1/catalog.js";
|
|
19
|
+
import { readEnv } from "@/lib/env";
|
|
20
|
+
import {
|
|
21
|
+
computeOrderConversion,
|
|
22
|
+
resolveConversionEnvironment,
|
|
23
|
+
readEchoedCorrelation,
|
|
24
|
+
type CorrelationReplayGuard,
|
|
25
|
+
type OrderConversionAttributionStore,
|
|
26
|
+
type OrderConversionResult,
|
|
27
|
+
type StoredAttribution,
|
|
28
|
+
} from "@tot/public-runtime";
|
|
29
|
+
import type { OrderForwardInput, OrderForwardResult } from "./orderForwardReceiver.js";
|
|
30
|
+
|
|
31
|
+
/** The server-only correlation-signing key binding, distinct from the cart secret. */
|
|
32
|
+
const CORRELATION_SECRET_ENV = "COMMERCE_CORRELATION_SECRET";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Durable single-use `jti` guard over `correlation_replay`. `seen` is an existence
|
|
36
|
+
* check; `remember` prunes any past-`exp` rows (bounded growth) then records the `jti`
|
|
37
|
+
* idempotently.
|
|
38
|
+
*/
|
|
39
|
+
export class D1CorrelationReplayGuard implements CorrelationReplayGuard {
|
|
40
|
+
constructor(
|
|
41
|
+
private readonly db: Queryable,
|
|
42
|
+
private readonly nowSec: () => number = () => Math.floor(Date.now() / 1000),
|
|
43
|
+
) {}
|
|
44
|
+
|
|
45
|
+
async seen(jti: string): Promise<boolean> {
|
|
46
|
+
const row = await this.db.first<{ one: number }>(
|
|
47
|
+
`SELECT 1 AS one FROM correlation_replay WHERE jti = ?`,
|
|
48
|
+
jti,
|
|
49
|
+
);
|
|
50
|
+
return row != null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async remember(jti: string, expiresAtSec: number): Promise<void> {
|
|
54
|
+
const now = this.nowSec();
|
|
55
|
+
await this.db.run(`DELETE FROM correlation_replay WHERE expires_at <= ?`, now);
|
|
56
|
+
await this.db.run(
|
|
57
|
+
`INSERT OR IGNORE INTO correlation_replay (jti, expires_at, consumed_at) VALUES (?, ?, ?)`,
|
|
58
|
+
jti,
|
|
59
|
+
expiresAtSec,
|
|
60
|
+
new Date(now * 1000).toISOString(),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
interface OrderAttributionRow {
|
|
66
|
+
attributed: number;
|
|
67
|
+
correlation_id: string | null;
|
|
68
|
+
correlation_expires_at: string | null;
|
|
69
|
+
reason: string | null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Durable per-`(tenant, orderId)` attribution ledger over `order_attribution`. */
|
|
73
|
+
export class D1OrderConversionAttributionStore implements OrderConversionAttributionStore {
|
|
74
|
+
constructor(
|
|
75
|
+
private readonly db: Queryable,
|
|
76
|
+
private readonly now: () => string = () => new Date().toISOString(),
|
|
77
|
+
) {}
|
|
78
|
+
|
|
79
|
+
async get(tenant: string, orderId: string): Promise<StoredAttribution | null> {
|
|
80
|
+
const row = await this.db.first<OrderAttributionRow>(
|
|
81
|
+
`SELECT attributed, correlation_id, correlation_expires_at, reason
|
|
82
|
+
FROM order_attribution WHERE tenant_id = ? AND external_order_id = ?`,
|
|
83
|
+
tenant,
|
|
84
|
+
orderId,
|
|
85
|
+
);
|
|
86
|
+
return row ? toStored(row) : null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async putIfAbsent(
|
|
90
|
+
tenant: string,
|
|
91
|
+
orderId: string,
|
|
92
|
+
record: StoredAttribution,
|
|
93
|
+
): Promise<StoredAttribution> {
|
|
94
|
+
await this.db.run(
|
|
95
|
+
`INSERT OR IGNORE INTO order_attribution
|
|
96
|
+
(tenant_id, external_order_id, attributed, correlation_id, correlation_expires_at, reason, recorded_at)
|
|
97
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
98
|
+
tenant,
|
|
99
|
+
orderId,
|
|
100
|
+
record.attributed ? 1 : 0,
|
|
101
|
+
record.correlationId,
|
|
102
|
+
record.correlationExpiresAt,
|
|
103
|
+
record.reason,
|
|
104
|
+
this.now(),
|
|
105
|
+
);
|
|
106
|
+
// Return the EFFECTIVE row: a concurrent first-writer's record wins over this one.
|
|
107
|
+
const stored = await this.get(tenant, orderId);
|
|
108
|
+
return stored ?? record;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function toStored(row: OrderAttributionRow): StoredAttribution {
|
|
113
|
+
return {
|
|
114
|
+
attributed: row.attributed === 1,
|
|
115
|
+
correlationId: row.correlation_id,
|
|
116
|
+
correlationExpiresAt: row.correlation_expires_at,
|
|
117
|
+
reason: (row.reason as StoredAttribution["reason"]) ?? null,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Run the verified-order → server conversion join for one forwarded order: read the
|
|
123
|
+
* echoed correlation the provider carried back, resolve the durable guard + attribution
|
|
124
|
+
* ledger over `db`, and produce the canonical server conversion event(s) plus the
|
|
125
|
+
* explicit attribution outcome. The correlation is verified against the ORDER's own
|
|
126
|
+
* tenant/environment, so a cross-tenant/stage token can never attribute.
|
|
127
|
+
*/
|
|
128
|
+
export async function joinForwardedOrderConversion(
|
|
129
|
+
db: Queryable,
|
|
130
|
+
input: OrderForwardInput,
|
|
131
|
+
receiverResult: OrderForwardResult,
|
|
132
|
+
): Promise<OrderConversionResult> {
|
|
133
|
+
const correlationSecret = await readEnv(CORRELATION_SECRET_ENV);
|
|
134
|
+
return computeOrderConversion({
|
|
135
|
+
order: {
|
|
136
|
+
tenant: input.tenantId,
|
|
137
|
+
externalOrderId: input.externalOrderId,
|
|
138
|
+
status: receiverResult.order.status,
|
|
139
|
+
currency: input.currency,
|
|
140
|
+
total: input.total,
|
|
141
|
+
lineItems: input.lineItems,
|
|
142
|
+
},
|
|
143
|
+
environment: resolveConversionEnvironment(input.env),
|
|
144
|
+
emittedTopics: receiverResult.emitted,
|
|
145
|
+
echoedCorrelation: readEchoedCorrelation(input.providerFields),
|
|
146
|
+
correlationSecret,
|
|
147
|
+
guard: new D1CorrelationReplayGuard(db),
|
|
148
|
+
attributionStore: new D1OrderConversionAttributionStore(db),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -51,6 +51,14 @@ export interface OrderForwardInput {
|
|
|
51
51
|
rawCustomerId?: string;
|
|
52
52
|
/** ISO timestamp the order was actually created at tot-foxycart. Defaults to receipt time when omitted (e.g. a backfill missing it) — only matters for a brand-new row; ignored on an update. */
|
|
53
53
|
createdAt?: string;
|
|
54
|
+
/** The provider's echoed custom cart fields (e.g. `h:tot_correlation`) the order-conversion join reads the correlation token from. Absent → the conversion is explicitly unattributed. */
|
|
55
|
+
providerFields?: Record<string, unknown>;
|
|
56
|
+
/** Opaque provider event identity. Missing legacy forwards are never measured. */
|
|
57
|
+
providerEventId?: string;
|
|
58
|
+
/** Exact provider event instant; measurement rejects non-canonical/missing values. */
|
|
59
|
+
occurredAt?: string;
|
|
60
|
+
/** Provider-authoritative non-negative minor-unit total; no float conversion is used. */
|
|
61
|
+
amountMinor?: number;
|
|
54
62
|
}
|
|
55
63
|
|
|
56
64
|
export interface OrderForwardResult {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { Queryable } from "../../d1/catalog.js";
|
|
14
14
|
|
|
15
|
-
export type OrderStatus = "created" | "fulfilled" | "cancelled";
|
|
15
|
+
export type OrderStatus = "created" | "fulfilled" | "refunded" | "cancelled";
|
|
16
16
|
|
|
17
17
|
/** One order line item (JSON-as-text in the row; see `Order.lineItems` in the contract). */
|
|
18
18
|
export interface OrderLineItem {
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/** Durable WS4 adapter for the already HMAC-verified Foxy order-forward path.
|
|
2
|
+
* It has no browser, GTM, dataLayer, receipt-DOM, destination, or admin capability.
|
|
3
|
+
* The caller catches every error, so a measurement-store outage cannot block commerce. */
|
|
4
|
+
import {
|
|
5
|
+
intentFromVerifiedProviderTruth,
|
|
6
|
+
} from "../../../../../../packages/public-runtime/src/regulated-commerce/provider-order/bridge.js";
|
|
7
|
+
import {
|
|
8
|
+
parseVerifiedOrderTruth,
|
|
9
|
+
resolveVerifiedOrderTruth,
|
|
10
|
+
verifiedOrderTruthFingerprint,
|
|
11
|
+
type VerifiedOrderSnapshot,
|
|
12
|
+
type VerifiedOrderTruth,
|
|
13
|
+
type VerifiedOrderTruthResolution,
|
|
14
|
+
} from "../../../../../../packages/public-runtime/src/regulated-commerce/purchase-truth/contract.js";
|
|
15
|
+
import type { RegulatedCommerceIntent } from "../../../../../../packages/public-runtime/src/regulated-commerce/events/contract.js";
|
|
16
|
+
import type { Queryable } from "../../d1/catalog.js";
|
|
17
|
+
import type { OrderForwardInput } from "./orderForwardReceiver.js";
|
|
18
|
+
|
|
19
|
+
const FOXY_PROVIDER = "foxycart";
|
|
20
|
+
const LIVE_ENVS = new Set(["live", "production"]);
|
|
21
|
+
type ProviderEventRow = { fingerprint: string; receipt_id: string };
|
|
22
|
+
type ProviderOrderRow = { provider: string; provider_order_id: string; tenant_id: string; state: "purchased" | "refunded" | "cancelled" };
|
|
23
|
+
|
|
24
|
+
export type VerifiedProviderMeasurementOutcome =
|
|
25
|
+
| "recorded" | "duplicate" | "replay-conflict" | "stale-transition" | "ignored-non-live" | "ignored-malformed";
|
|
26
|
+
export interface VerifiedProviderMeasurementResult { readonly outcome: VerifiedProviderMeasurementOutcome; readonly intent: RegulatedCommerceIntent | null; }
|
|
27
|
+
|
|
28
|
+
function snapshot(row: ProviderOrderRow | null): VerifiedOrderSnapshot | null {
|
|
29
|
+
return row ? { provider: row.provider, providerOrderId: row.provider_order_id, tenant: row.tenant_id, state: row.state } : null;
|
|
30
|
+
}
|
|
31
|
+
function isIsoInstant(value: unknown): value is string {
|
|
32
|
+
return typeof value === "string" && Number.isFinite(Date.parse(value)) && new Date(Date.parse(value)).toISOString() === value;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Missing event identity/minor units fails closed. Legacy forwards still ACK as
|
|
36
|
+
* commerce, but cannot become regulated measurement. */
|
|
37
|
+
export function verifiedTruthFromForwardedOrder(input: OrderForwardInput): VerifiedOrderTruth | null {
|
|
38
|
+
if (!LIVE_ENVS.has(input.env)) return null;
|
|
39
|
+
if (typeof input.providerEventId !== "string" || !isIsoInstant(input.occurredAt) || typeof input.amountMinor !== "number" || !Number.isSafeInteger(input.amountMinor) || input.amountMinor < 0) return null;
|
|
40
|
+
const parsed = parseVerifiedOrderTruth({
|
|
41
|
+
schemaVersion: "1", authority: "verified-provider", provider: FOXY_PROVIDER,
|
|
42
|
+
providerEventId: input.providerEventId, providerOrderId: input.externalOrderId,
|
|
43
|
+
tenant: input.tenantId, status: input.status, occurredAt: input.occurredAt,
|
|
44
|
+
currency: input.currency, amountMinor: input.amountMinor,
|
|
45
|
+
});
|
|
46
|
+
return parsed.ok ? parsed.value : null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Server-only D1 ledger/outbox. Event insertion uses a receipt id plus RETURNING,
|
|
50
|
+
* giving concurrent identical deliveries one winner. The order state change is a
|
|
51
|
+
* guarded SQL CAS, so a race cannot overwrite a refund/cancel with a purchase. */
|
|
52
|
+
export class D1VerifiedProviderMeasurementStore {
|
|
53
|
+
constructor(
|
|
54
|
+
private readonly db: Queryable,
|
|
55
|
+
private readonly receiptId: () => string = () => crypto.randomUUID(),
|
|
56
|
+
private readonly now: () => string = () => new Date().toISOString(),
|
|
57
|
+
) {}
|
|
58
|
+
|
|
59
|
+
async record(input: OrderForwardInput): Promise<VerifiedProviderMeasurementResult> {
|
|
60
|
+
if (!LIVE_ENVS.has(input.env)) return { outcome: "ignored-non-live", intent: null };
|
|
61
|
+
const record = verifiedTruthFromForwardedOrder(input);
|
|
62
|
+
if (!record) return { outcome: "ignored-malformed", intent: null };
|
|
63
|
+
const fingerprint = verifiedOrderTruthFingerprint(record);
|
|
64
|
+
const receiptId = this.receiptId();
|
|
65
|
+
const inserted = await this.db.all<{ receipt_id: string }>(
|
|
66
|
+
`INSERT INTO regulated_commerce_provider_events
|
|
67
|
+
(provider, provider_event_id, fingerprint, receipt_id, received_at)
|
|
68
|
+
VALUES (?, ?, ?, ?, ?) ON CONFLICT(provider, provider_event_id) DO NOTHING RETURNING receipt_id`,
|
|
69
|
+
record.provider, record.providerEventId, fingerprint, receiptId, this.now(),
|
|
70
|
+
);
|
|
71
|
+
if (inserted.length === 0) {
|
|
72
|
+
const existing = await this.event(record.provider, record.providerEventId);
|
|
73
|
+
return { outcome: existing?.fingerprint === fingerprint ? "duplicate" : "replay-conflict", intent: null };
|
|
74
|
+
}
|
|
75
|
+
for (let attempts = 0; attempts < 3; attempts++) {
|
|
76
|
+
const resolution = resolveVerifiedOrderTruth({ record, existingEvent: null, existingOrder: snapshot(await this.order(record)) });
|
|
77
|
+
if (resolution.outcome !== "accepted") return { outcome: resolution.outcome === "stale-transition" ? "stale-transition" : "replay-conflict", intent: null };
|
|
78
|
+
if (!(await this.claimTransition(record, resolution))) continue;
|
|
79
|
+
const built = intentFromVerifiedProviderTruth(record, resolution);
|
|
80
|
+
if (!built.intent) return { outcome: "recorded", intent: null };
|
|
81
|
+
await this.db.run(
|
|
82
|
+
`INSERT OR IGNORE INTO regulated_commerce_intent_outbox
|
|
83
|
+
(intent_id, tenant_id, provider, provider_event_id, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`,
|
|
84
|
+
built.intent.id, record.tenant, record.provider, record.providerEventId, JSON.stringify(built.intent), this.now(),
|
|
85
|
+
);
|
|
86
|
+
return { outcome: "recorded", intent: built.intent };
|
|
87
|
+
}
|
|
88
|
+
return { outcome: "stale-transition", intent: null };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Local/admin-safe test surface: only the minimized semantic outbox. */
|
|
92
|
+
async intents(): Promise<RegulatedCommerceIntent[]> {
|
|
93
|
+
const rows = await this.db.all<{ payload: string }>(`SELECT payload FROM regulated_commerce_intent_outbox ORDER BY created_at, intent_id`);
|
|
94
|
+
return rows.map((row) => JSON.parse(row.payload) as RegulatedCommerceIntent);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private event(provider: string, providerEventId: string): Promise<ProviderEventRow | null> {
|
|
98
|
+
return this.db.first<ProviderEventRow>(`SELECT fingerprint, receipt_id FROM regulated_commerce_provider_events WHERE provider = ? AND provider_event_id = ?`, provider, providerEventId);
|
|
99
|
+
}
|
|
100
|
+
private order(record: VerifiedOrderTruth): Promise<ProviderOrderRow | null> {
|
|
101
|
+
return this.db.first<ProviderOrderRow>(`SELECT provider, provider_order_id, tenant_id, state FROM regulated_commerce_provider_orders WHERE provider = ? AND provider_order_id = ? AND tenant_id = ?`, record.provider, record.providerOrderId, record.tenant);
|
|
102
|
+
}
|
|
103
|
+
private async claimTransition(record: VerifiedOrderTruth, resolution: Extract<VerifiedOrderTruthResolution, { outcome: "accepted" }>): Promise<boolean> {
|
|
104
|
+
const rows = await this.db.all<{ provider_event_id: string }>(
|
|
105
|
+
`INSERT INTO regulated_commerce_provider_orders
|
|
106
|
+
(provider, provider_order_id, tenant_id, state, provider_event_id, updated_at)
|
|
107
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
108
|
+
ON CONFLICT(provider, provider_order_id, tenant_id) DO UPDATE SET
|
|
109
|
+
state = excluded.state, provider_event_id = excluded.provider_event_id, updated_at = excluded.updated_at
|
|
110
|
+
WHERE regulated_commerce_provider_orders.state = 'purchased'
|
|
111
|
+
AND excluded.state IN ('purchased', 'refunded', 'cancelled')
|
|
112
|
+
RETURNING provider_event_id`,
|
|
113
|
+
record.provider, record.providerOrderId, record.tenant, resolution.nextOrder.state, record.providerEventId, this.now(),
|
|
114
|
+
);
|
|
115
|
+
return rows.some((row) => row.provider_event_id === record.providerEventId);
|
|
116
|
+
}
|
|
117
|
+
}
|