@porulle/core 0.64.0 → 0.65.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/dist/adapters/email-render.d.ts +18 -0
- package/dist/adapters/email-render.d.ts.map +1 -0
- package/dist/adapters/email-render.js +37 -0
- package/dist/auth/actor.d.ts.map +1 -1
- package/dist/auth/actor.js +11 -0
- package/dist/auth/auth-failure.d.ts +0 -2
- package/dist/auth/auth-failure.d.ts.map +1 -1
- package/dist/auth/auth-failure.js +0 -4
- package/dist/auth/middleware.d.ts +0 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +7 -6
- package/dist/auth/permissions.d.ts +2 -0
- package/dist/auth/permissions.d.ts.map +1 -1
- package/dist/auth/permissions.js +8 -6
- package/dist/auth/role-authority.d.ts +0 -1
- package/dist/auth/role-authority.d.ts.map +1 -1
- package/dist/auth/role-authority.js +1 -8
- package/dist/auth/setup.d.ts.map +1 -1
- package/dist/auth/setup.js +5 -0
- package/dist/auth/strict-org-resolution.d.ts +8 -1
- package/dist/auth/strict-org-resolution.d.ts.map +1 -1
- package/dist/auth/strict-org-resolution.js +9 -19
- package/dist/auth/system-actor.d.ts +3 -2
- package/dist/auth/system-actor.d.ts.map +1 -1
- package/dist/auth/system-actor.js +3 -3
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +3 -20
- package/dist/config/define-config.d.ts +2 -2
- package/dist/config/define-config.d.ts.map +1 -1
- package/dist/config/define-config.js +3 -2
- package/dist/config/types.d.ts +2 -3
- package/dist/config/types.d.ts.map +1 -1
- package/dist/hooks/checkout.d.ts +2 -15
- package/dist/hooks/checkout.d.ts.map +1 -1
- package/dist/hooks/checkout.js +2 -51
- package/dist/index.d.ts +11 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -12
- package/dist/interfaces/rest/router.js +3 -3
- package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/compensation-failures.js +5 -5
- package/dist/interfaces/rest/routes/admin/entity-field-definitions.js +5 -5
- package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/staff.js +2 -3
- package/dist/interfaces/rest/routes/analytics.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/analytics.js +2 -2
- package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/carts.js +12 -12
- package/dist/interfaces/rest/routes/catalog.js +37 -37
- package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/checkout.js +9 -10
- package/dist/interfaces/rest/routes/customers.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/customers.js +12 -12
- package/dist/interfaces/rest/routes/documents.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/documents.js +9 -9
- package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/inventory.js +8 -8
- package/dist/interfaces/rest/routes/media.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/media.js +5 -5
- package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/orders.js +32 -32
- package/dist/interfaces/rest/routes/payments.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/payments.js +2 -2
- package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/pricing.js +8 -8
- package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/promotions.js +7 -7
- package/dist/interfaces/rest/routes/search.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/search.js +3 -3
- package/dist/interfaces/rest/routes/settings.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/settings.js +4 -4
- package/dist/interfaces/rest/routes/shipping.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/shipping.js +9 -9
- package/dist/interfaces/rest/routes/tax.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/tax.js +9 -9
- package/dist/interfaces/rest/routes/webhooks.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/webhooks.js +4 -4
- package/dist/interfaces/rest/utils.d.ts +1 -1
- package/dist/interfaces/rest/utils.d.ts.map +1 -1
- package/dist/interfaces/rest/utils.js +4 -13
- package/dist/jobs.d.ts +1 -0
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +1 -0
- package/dist/kernel/database/adapter.d.ts +9 -0
- package/dist/kernel/database/adapter.d.ts.map +1 -1
- package/dist/kernel/database/adapter.js +1 -1
- package/dist/kernel/database/migrate.d.ts +0 -4
- package/dist/kernel/database/migrate.d.ts.map +1 -1
- package/dist/kernel/database/migrate.js +2 -14
- package/dist/kernel/database/pglite-transaction.d.ts +28 -0
- package/dist/kernel/database/pglite-transaction.d.ts.map +1 -0
- package/dist/kernel/database/pglite-transaction.js +52 -0
- package/dist/kernel/database/tx-context.d.ts +0 -1
- package/dist/kernel/database/tx-context.d.ts.map +1 -1
- package/dist/kernel/database/tx-context.js +2 -14
- package/dist/kernel/database/unique-violation.d.ts +3 -0
- package/dist/kernel/database/unique-violation.d.ts.map +1 -0
- package/dist/kernel/database/unique-violation.js +9 -0
- package/dist/kernel/error-mapper.d.ts.map +1 -1
- package/dist/kernel/error-mapper.js +1 -0
- package/dist/kernel/errors.d.ts +12 -0
- package/dist/kernel/errors.d.ts.map +1 -1
- package/dist/kernel/errors.js +16 -0
- package/dist/kernel/hooks/create-context.d.ts +18 -9
- package/dist/kernel/hooks/create-context.d.ts.map +1 -1
- package/dist/kernel/hooks/create-context.js +24 -3
- package/dist/kernel/hooks/registry.d.ts +0 -19
- package/dist/kernel/hooks/registry.d.ts.map +1 -1
- package/dist/kernel/hooks/registry.js +0 -32
- package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -1
- package/dist/kernel/jobs/drizzle-adapter.js +3 -10
- package/dist/kernel/jobs/prepare-enqueue.d.ts +20 -0
- package/dist/kernel/jobs/prepare-enqueue.d.ts.map +1 -0
- package/dist/kernel/jobs/prepare-enqueue.js +24 -0
- package/dist/kernel/jobs/types.d.ts +0 -4
- package/dist/kernel/jobs/types.d.ts.map +1 -1
- package/dist/kernel/jobs/types.js +0 -4
- package/dist/kernel/local-api.d.ts +0 -33
- package/dist/kernel/local-api.d.ts.map +1 -1
- package/dist/kernel/local-api.js +0 -36
- package/dist/kernel/plugin/manifest.d.ts +3 -5
- package/dist/kernel/plugin/manifest.d.ts.map +1 -1
- package/dist/modules/analytics/service.d.ts +0 -6
- package/dist/modules/analytics/service.d.ts.map +1 -1
- package/dist/modules/analytics/service.js +0 -32
- package/dist/modules/cart/service.d.ts.map +1 -1
- package/dist/modules/cart/service.js +5 -17
- package/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +9 -17
- package/dist/modules/catalog/import-service.d.ts.map +1 -1
- package/dist/modules/catalog/import-service.js +4 -13
- package/dist/modules/catalog/service.d.ts +1 -81
- package/dist/modules/catalog/service.d.ts.map +1 -1
- package/dist/modules/catalog/service.js +1 -8
- package/dist/modules/customers/service.d.ts.map +1 -1
- package/dist/modules/customers/service.js +5 -17
- package/dist/modules/documents/render.d.ts +0 -3
- package/dist/modules/documents/render.d.ts.map +1 -1
- package/dist/modules/documents/render.js +2 -17
- package/dist/modules/fulfillment/service.d.ts.map +1 -1
- package/dist/modules/fulfillment/service.js +8 -26
- package/dist/modules/inventory/service.d.ts.map +1 -1
- package/dist/modules/inventory/service.js +3 -20
- package/dist/modules/media/service.d.ts.map +1 -1
- package/dist/modules/media/service.js +2 -10
- package/dist/modules/orders/quote.d.ts.map +1 -1
- package/dist/modules/orders/quote.js +1 -2
- package/dist/modules/orders/service.d.ts.map +1 -1
- package/dist/modules/orders/service.js +4 -17
- package/dist/modules/pricing/service.d.ts.map +1 -1
- package/dist/modules/pricing/service.js +7 -18
- package/dist/modules/promotions/service.d.ts.map +1 -1
- package/dist/modules/promotions/service.js +4 -16
- package/dist/modules/tax/service.d.ts +1 -3
- package/dist/modules/tax/service.d.ts.map +1 -1
- package/dist/modules/tax/service.js +16 -52
- package/dist/modules/webhooks/hook.d.ts.map +1 -1
- package/dist/modules/webhooks/hook.js +3 -2
- package/dist/modules/webhooks/service.d.ts.map +1 -1
- package/dist/modules/webhooks/service.js +1 -50
- package/dist/runtime/commerce.d.ts.map +1 -1
- package/dist/runtime/commerce.js +4 -11
- package/dist/runtime/kernel-modules.d.ts +38 -1799
- package/dist/runtime/kernel-modules.d.ts.map +1 -1
- package/dist/runtime/kernel-modules.js +160 -66
- package/dist/runtime/kernel-types.d.ts +3 -15
- package/dist/runtime/kernel-types.d.ts.map +1 -1
- package/dist/runtime/kernel-types.js +0 -10
- package/dist/runtime/kernel.d.ts +2 -3
- package/dist/runtime/kernel.d.ts.map +1 -1
- package/dist/runtime/kernel.js +10 -51
- package/dist/runtime/server.d.ts +1 -1
- package/dist/runtime/server.d.ts.map +1 -1
- package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -1
- package/dist/test-utils/create-pglite-adapter.js +5 -62
- package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -1
- package/dist/test-utils/create-plugin-test-app.js +13 -32
- package/dist/test-utils/rest-api-test-utils.d.ts +0 -12
- package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
- package/dist/test-utils/rest-api-test-utils.js +3 -70
- package/dist/test-utils/test-actors.d.ts +9 -0
- package/dist/test-utils/test-actors.d.ts.map +1 -1
- package/dist/test-utils/test-actors.js +62 -0
- package/dist/testing.d.ts +1 -4
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +1 -4
- package/dist/utils/escape-html.d.ts +3 -0
- package/dist/utils/escape-html.d.ts.map +1 -0
- package/dist/utils/escape-html.js +9 -0
- package/dist/utils/id.d.ts +0 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +0 -3
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/money.d.ts +13 -0
- package/dist/utils/money.d.ts.map +1 -0
- package/dist/utils/money.js +58 -0
- package/package.json +5 -6
- package/src/adapters/email-render.ts +63 -0
- package/src/auth/actor.ts +14 -0
- package/src/auth/auth-failure.ts +0 -5
- package/src/auth/middleware.ts +7 -6
- package/src/auth/permissions.ts +12 -6
- package/src/auth/role-authority.ts +1 -10
- package/src/auth/setup.ts +8 -0
- package/src/auth/strict-org-resolution.ts +9 -16
- package/src/auth/system-actor.ts +3 -3
- package/src/config/defaults.ts +3 -20
- package/src/config/define-config.ts +5 -4
- package/src/config/types.ts +2 -2
- package/src/hooks/checkout.ts +2 -86
- package/src/index.ts +9 -36
- package/src/interfaces/rest/router.ts +3 -3
- package/src/interfaces/rest/routes/admin/compensation-failures.ts +5 -5
- package/src/interfaces/rest/routes/admin/entity-field-definitions.ts +5 -5
- package/src/interfaces/rest/routes/admin/staff.ts +2 -3
- package/src/interfaces/rest/routes/analytics.ts +2 -2
- package/src/interfaces/rest/routes/carts.ts +12 -12
- package/src/interfaces/rest/routes/catalog.ts +37 -37
- package/src/interfaces/rest/routes/checkout.ts +8 -10
- package/src/interfaces/rest/routes/customers.ts +12 -12
- package/src/interfaces/rest/routes/documents.ts +9 -9
- package/src/interfaces/rest/routes/inventory.ts +8 -8
- package/src/interfaces/rest/routes/media.ts +5 -5
- package/src/interfaces/rest/routes/orders.ts +32 -32
- package/src/interfaces/rest/routes/payments.ts +2 -2
- package/src/interfaces/rest/routes/pricing.ts +8 -8
- package/src/interfaces/rest/routes/promotions.ts +7 -7
- package/src/interfaces/rest/routes/search.ts +3 -3
- package/src/interfaces/rest/routes/settings.ts +4 -4
- package/src/interfaces/rest/routes/shipping.ts +9 -9
- package/src/interfaces/rest/routes/tax.ts +9 -9
- package/src/interfaces/rest/routes/webhooks.ts +4 -4
- package/src/interfaces/rest/utils.ts +4 -14
- package/src/jobs.ts +2 -1
- package/src/kernel/database/adapter.ts +1 -1
- package/src/kernel/database/migrate.ts +2 -17
- package/src/kernel/database/pglite-transaction.ts +61 -0
- package/src/kernel/database/tx-context.ts +2 -20
- package/src/kernel/database/unique-violation.ts +7 -0
- package/src/kernel/error-mapper.ts +1 -0
- package/src/kernel/errors.ts +18 -0
- package/src/kernel/hooks/create-context.ts +38 -8
- package/src/kernel/hooks/registry.ts +0 -37
- package/src/kernel/jobs/drizzle-adapter.ts +4 -15
- package/src/kernel/jobs/prepare-enqueue.ts +42 -0
- package/src/kernel/jobs/types.ts +0 -5
- package/src/kernel/local-api.ts +0 -44
- package/src/kernel/plugin/manifest.ts +3 -5
- package/src/modules/analytics/service.ts +0 -36
- package/src/modules/cart/service.ts +6 -29
- package/src/modules/catalog/entity-service.ts +9 -19
- package/src/modules/catalog/import-service.ts +4 -11
- package/src/modules/catalog/service.ts +2 -286
- package/src/modules/customers/service.ts +6 -27
- package/src/modules/documents/render.ts +2 -19
- package/src/modules/fulfillment/service.ts +8 -27
- package/src/modules/inventory/service.ts +3 -21
- package/src/modules/media/service.ts +2 -8
- package/src/modules/orders/quote.ts +1 -2
- package/src/modules/orders/service.ts +5 -30
- package/src/modules/pricing/service.ts +12 -30
- package/src/modules/promotions/service.ts +5 -28
- package/src/modules/tax/service.ts +20 -48
- package/src/modules/webhooks/hook.ts +3 -2
- package/src/modules/webhooks/service.ts +1 -42
- package/src/runtime/commerce.ts +4 -11
- package/src/runtime/kernel-modules.ts +191 -67
- package/src/runtime/kernel-types.ts +3 -26
- package/src/runtime/kernel.ts +11 -66
- package/src/runtime/server.ts +1 -3
- package/src/test-utils/create-pglite-adapter.ts +5 -67
- package/src/test-utils/create-plugin-test-app.ts +13 -52
- package/src/test-utils/rest-api-test-utils.ts +3 -70
- package/src/test-utils/test-actors.ts +66 -0
- package/src/testing.ts +1 -3
- package/src/utils/escape-html.ts +9 -0
- package/src/utils/id.ts +0 -4
- package/src/utils/logger.ts +1 -1
- package/src/utils/money.ts +62 -0
- package/dist/auth/access.d.ts +0 -101
- package/dist/auth/access.d.ts.map +0 -1
- package/dist/auth/access.js +0 -128
- package/dist/generated/plugin-manifest.d.ts +0 -51
- package/dist/generated/plugin-manifest.d.ts.map +0 -1
- package/dist/generated/plugin-manifest.js +0 -21
- package/dist/kernel/factory/repository-factory.d.ts +0 -71
- package/dist/kernel/factory/repository-factory.d.ts.map +0 -1
- package/dist/kernel/factory/repository-factory.js +0 -138
- package/dist/kernel/http-error.d.ts +0 -30
- package/dist/kernel/http-error.d.ts.map +0 -1
- package/dist/kernel/http-error.js +0 -35
- package/dist/kernel/jobs/builtin-job-tasks.d.ts +0 -3
- package/dist/kernel/jobs/builtin-job-tasks.d.ts.map +0 -1
- package/dist/kernel/jobs/builtin-job-tasks.js +0 -6
- package/dist/kernel/module/define.d.ts +0 -21
- package/dist/kernel/module/define.d.ts.map +0 -1
- package/dist/kernel/module/define.js +0 -3
- package/dist/kernel/module/index.d.ts +0 -4
- package/dist/kernel/module/index.d.ts.map +0 -1
- package/dist/kernel/module/index.js +0 -2
- package/dist/kernel/module/topo-sort.d.ts +0 -7
- package/dist/kernel/module/topo-sort.d.ts.map +0 -1
- package/dist/kernel/module/topo-sort.js +0 -89
- package/dist/kernel/query/executor.d.ts +0 -21
- package/dist/kernel/query/executor.d.ts.map +0 -1
- package/dist/kernel/query/executor.js +0 -128
- package/dist/kernel/query/registry.d.ts +0 -33
- package/dist/kernel/query/registry.d.ts.map +0 -1
- package/dist/kernel/query/registry.js +0 -20
- package/dist/kernel/service-registry.d.ts +0 -109
- package/dist/kernel/service-registry.d.ts.map +0 -1
- package/dist/kernel/service-registry.js +0 -26
- package/dist/modules/analytics/hooks.d.ts +0 -13
- package/dist/modules/analytics/hooks.d.ts.map +0 -1
- package/dist/modules/analytics/hooks.js +0 -12
- package/dist/modules/analytics/module.d.ts +0 -3
- package/dist/modules/analytics/module.d.ts.map +0 -1
- package/dist/modules/analytics/module.js +0 -24
- package/dist/modules/analytics/repository/index.d.ts +0 -5
- package/dist/modules/analytics/repository/index.d.ts.map +0 -1
- package/dist/modules/analytics/repository/index.js +0 -1
- package/dist/modules/audit/index.d.ts +0 -2
- package/dist/modules/audit/index.d.ts.map +0 -1
- package/dist/modules/audit/index.js +0 -1
- package/dist/modules/audit/module.d.ts +0 -180
- package/dist/modules/audit/module.d.ts.map +0 -1
- package/dist/modules/audit/module.js +0 -8
- package/dist/modules/cart/access.d.ts +0 -11
- package/dist/modules/cart/access.d.ts.map +0 -1
- package/dist/modules/cart/access.js +0 -18
- package/dist/modules/cart/module.d.ts +0 -14
- package/dist/modules/cart/module.d.ts.map +0 -1
- package/dist/modules/cart/module.js +0 -17
- package/dist/modules/catalog/module.d.ts +0 -26
- package/dist/modules/catalog/module.d.ts.map +0 -1
- package/dist/modules/catalog/module.js +0 -33
- package/dist/modules/customers/index.d.ts +0 -2
- package/dist/modules/customers/index.d.ts.map +0 -1
- package/dist/modules/customers/index.js +0 -1
- package/dist/modules/customers/module.d.ts +0 -563
- package/dist/modules/customers/module.d.ts.map +0 -1
- package/dist/modules/customers/module.js +0 -20
- package/dist/modules/documents/module.d.ts +0 -7
- package/dist/modules/documents/module.d.ts.map +0 -1
- package/dist/modules/documents/module.js +0 -13
- package/dist/modules/fulfillment/module.d.ts +0 -13
- package/dist/modules/fulfillment/module.d.ts.map +0 -1
- package/dist/modules/fulfillment/module.js +0 -23
- package/dist/modules/inventory/module.d.ts +0 -13
- package/dist/modules/inventory/module.d.ts.map +0 -1
- package/dist/modules/inventory/module.js +0 -20
- package/dist/modules/media/index.d.ts +0 -2
- package/dist/modules/media/index.d.ts.map +0 -1
- package/dist/modules/media/index.js +0 -1
- package/dist/modules/media/module.d.ts +0 -360
- package/dist/modules/media/module.d.ts.map +0 -1
- package/dist/modules/media/module.js +0 -24
- package/dist/modules/orders/module.d.ts +0 -25
- package/dist/modules/orders/module.d.ts.map +0 -1
- package/dist/modules/orders/module.js +0 -33
- package/dist/modules/organization/index.d.ts +0 -2
- package/dist/modules/organization/index.d.ts.map +0 -1
- package/dist/modules/organization/index.js +0 -1
- package/dist/modules/organization/module.d.ts +0 -205
- package/dist/modules/organization/module.d.ts.map +0 -1
- package/dist/modules/organization/module.js +0 -8
- package/dist/modules/payments/module.d.ts +0 -3
- package/dist/modules/payments/module.d.ts.map +0 -1
- package/dist/modules/payments/module.js +0 -7
- package/dist/modules/payments/repository/index.d.ts +0 -5
- package/dist/modules/payments/repository/index.d.ts.map +0 -1
- package/dist/modules/payments/repository/index.js +0 -1
- package/dist/modules/pricing/index.d.ts +0 -2
- package/dist/modules/pricing/index.d.ts.map +0 -1
- package/dist/modules/pricing/index.js +0 -1
- package/dist/modules/pricing/module.d.ts +0 -14
- package/dist/modules/pricing/module.d.ts.map +0 -1
- package/dist/modules/pricing/module.js +0 -17
- package/dist/modules/promotions/module.d.ts +0 -14
- package/dist/modules/promotions/module.d.ts.map +0 -1
- package/dist/modules/promotions/module.js +0 -19
- package/dist/modules/search/module.d.ts +0 -8
- package/dist/modules/search/module.d.ts.map +0 -1
- package/dist/modules/search/module.js +0 -22
- package/dist/modules/search/repository/index.d.ts +0 -5
- package/dist/modules/search/repository/index.d.ts.map +0 -1
- package/dist/modules/search/repository/index.js +0 -1
- package/dist/modules/settings/module.d.ts +0 -6
- package/dist/modules/settings/module.d.ts.map +0 -1
- package/dist/modules/settings/module.js +0 -12
- package/dist/modules/shipping/module.d.ts +0 -12
- package/dist/modules/shipping/module.d.ts.map +0 -1
- package/dist/modules/shipping/module.js +0 -14
- package/dist/modules/tax/module.d.ts +0 -7
- package/dist/modules/tax/module.d.ts.map +0 -1
- package/dist/modules/tax/module.js +0 -13
- package/dist/modules/webhooks/index.d.ts +0 -2
- package/dist/modules/webhooks/index.d.ts.map +0 -1
- package/dist/modules/webhooks/index.js +0 -1
- package/dist/modules/webhooks/module.d.ts +0 -403
- package/dist/modules/webhooks/module.d.ts.map +0 -1
- package/dist/modules/webhooks/module.js +0 -16
- package/dist/test-utils/create-repository-test-harness.d.ts +0 -8
- package/dist/test-utils/create-repository-test-harness.d.ts.map +0 -1
- package/dist/test-utils/create-repository-test-harness.js +0 -7
- package/dist/test-utils/create-test-plugin-context.d.ts +0 -38
- package/dist/test-utils/create-test-plugin-context.d.ts.map +0 -1
- package/dist/test-utils/create-test-plugin-context.js +0 -39
- package/dist/test-utils/typed-hooks.d.ts +0 -44
- package/dist/test-utils/typed-hooks.d.ts.map +0 -1
- package/dist/test-utils/typed-hooks.js +0 -36
- package/dist/types/commerce-types.d.ts +0 -34
- package/dist/types/commerce-types.d.ts.map +0 -1
- package/dist/types/commerce-types.js +0 -1
- package/src/auth/access.ts +0 -187
- package/src/generated/plugin-capabilities.d.ts +0 -21
- package/src/generated/plugin-manifest.ts +0 -24
- package/src/generated/plugin-repositories.d.ts +0 -21
- package/src/kernel/factory/repository-factory.ts +0 -244
- package/src/kernel/http-error.ts +0 -44
- package/src/kernel/jobs/builtin-job-tasks.ts +0 -17
- package/src/kernel/module/define.ts +0 -36
- package/src/kernel/module/index.ts +0 -3
- package/src/kernel/module/topo-sort.ts +0 -99
- package/src/kernel/query/executor.ts +0 -184
- package/src/kernel/query/registry.ts +0 -46
- package/src/kernel/service-registry.ts +0 -76
- package/src/modules/analytics/hooks.ts +0 -11
- package/src/modules/analytics/module.ts +0 -35
- package/src/modules/analytics/repository/index.ts +0 -5
- package/src/modules/audit/index.ts +0 -1
- package/src/modules/audit/module.ts +0 -11
- package/src/modules/cart/access.ts +0 -27
- package/src/modules/cart/module.ts +0 -32
- package/src/modules/catalog/module.ts +0 -80
- package/src/modules/customers/index.ts +0 -1
- package/src/modules/customers/module.ts +0 -29
- package/src/modules/documents/module.ts +0 -21
- package/src/modules/fulfillment/module.ts +0 -44
- package/src/modules/inventory/module.ts +0 -37
- package/src/modules/media/index.ts +0 -1
- package/src/modules/media/module.ts +0 -27
- package/src/modules/orders/module.ts +0 -67
- package/src/modules/organization/index.ts +0 -1
- package/src/modules/organization/module.ts +0 -11
- package/src/modules/payments/module.ts +0 -14
- package/src/modules/payments/repository/index.ts +0 -5
- package/src/modules/pricing/index.ts +0 -1
- package/src/modules/pricing/module.ts +0 -32
- package/src/modules/promotions/module.ts +0 -34
- package/src/modules/search/module.ts +0 -32
- package/src/modules/search/repository/index.ts +0 -5
- package/src/modules/settings/module.ts +0 -20
- package/src/modules/shipping/module.ts +0 -27
- package/src/modules/tax/module.ts +0 -21
- package/src/modules/webhooks/index.ts +0 -1
- package/src/modules/webhooks/module.ts +0 -24
- package/src/test-utils/create-repository-test-harness.ts +0 -16
- package/src/test-utils/create-test-plugin-context.ts +0 -66
- package/src/test-utils/typed-hooks.ts +0 -55
- package/src/types/commerce-types.ts +0 -34
|
@@ -5,48 +5,7 @@ import { CommerceNotFoundError, CommerceValidationError } from "../../kernel/err
|
|
|
5
5
|
import { Err, Ok, type Result } from "../../kernel/result.js";
|
|
6
6
|
import type { TxContext } from "../../kernel/database/tx-context.js";
|
|
7
7
|
import type { WebhooksRepository, WebhookEndpoint } from "./repository/index.js";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Checks whether a URL points to a private/internal IP address.
|
|
11
|
-
* Blocks: loopback (127.x), link-local (169.254.x), private (10.x, 172.16-31.x, 192.168.x),
|
|
12
|
-
* cloud metadata (169.254.169.254, metadata.google.internal), and localhost.
|
|
13
|
-
*/
|
|
14
|
-
function isPrivateUrl(urlStr: string): boolean {
|
|
15
|
-
try {
|
|
16
|
-
const parsed = new URL(urlStr);
|
|
17
|
-
// Strip IPv6 brackets: URL.hostname returns "[::1]" not "::1"
|
|
18
|
-
const hostname = parsed.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
19
|
-
|
|
20
|
-
// Loopback (IPv4 + IPv6)
|
|
21
|
-
if (hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1") return true;
|
|
22
|
-
if (hostname.endsWith(".localhost")) return true;
|
|
23
|
-
|
|
24
|
-
// IPv6 loopback and link-local patterns
|
|
25
|
-
if (hostname.startsWith("::ffff:")) return true; // IPv6-mapped IPv4 (e.g., ::ffff:127.0.0.1)
|
|
26
|
-
if (hostname.startsWith("fe80:")) return true; // IPv6 link-local
|
|
27
|
-
if (hostname === "::") return true; // Unspecified address
|
|
28
|
-
|
|
29
|
-
// Cloud metadata endpoints
|
|
30
|
-
if (hostname === "169.254.169.254") return true;
|
|
31
|
-
if (hostname === "metadata.google.internal") return true;
|
|
32
|
-
|
|
33
|
-
// Private IP ranges (RFC 1918 + link-local)
|
|
34
|
-
const parts = hostname.split(".").map(Number);
|
|
35
|
-
if (parts.length === 4 && parts.every((n) => !isNaN(n))) {
|
|
36
|
-
const [a, b] = parts;
|
|
37
|
-
if (a === 10) return true;
|
|
38
|
-
if (a === 172 && b !== undefined && b >= 16 && b <= 31) return true;
|
|
39
|
-
if (a === 192 && b === 168) return true;
|
|
40
|
-
if (a === 169 && b === 254) return true;
|
|
41
|
-
if (a === 127) return true; // Full 127.0.0.0/8 range
|
|
42
|
-
if (a === 0) return true;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return false;
|
|
46
|
-
} catch {
|
|
47
|
-
return true; // Invalid URLs are blocked
|
|
48
|
-
}
|
|
49
|
-
}
|
|
8
|
+
import { isPrivateUrl } from "./ssrf-guard.js";
|
|
50
9
|
|
|
51
10
|
interface WebhookServiceDeps {
|
|
52
11
|
repository: WebhooksRepository;
|
package/src/runtime/commerce.ts
CHANGED
|
@@ -3,8 +3,7 @@ import type { CommerceConfig } from "../config/types.js";
|
|
|
3
3
|
import type { Kernel } from "./kernel.js";
|
|
4
4
|
import { createKernel } from "./kernel.js";
|
|
5
5
|
import { pushSchema } from "../kernel/database/migrate.js";
|
|
6
|
-
import { ensureDefaultOrg
|
|
7
|
-
import { setBootStrictOrgResolution } from "../auth/strict-org-resolution.js";
|
|
6
|
+
import { ensureDefaultOrg } from "../auth/org.js";
|
|
8
7
|
import { createAuth, type AuthInstance } from "../auth/setup.js";
|
|
9
8
|
import { createLogger, type Logger } from "./logger.js";
|
|
10
9
|
import { createLocalAPI, type CommerceLocalAPI, type LocalAPIOptions } from "../kernel/local-api.js";
|
|
@@ -132,15 +131,9 @@ export async function createCommerce(
|
|
|
132
131
|
await pushSchema(kernel.database.db, config);
|
|
133
132
|
}
|
|
134
133
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
// without requiring every service to have config access.
|
|
139
|
-
if (config.auth?.defaultOrganizationId) {
|
|
140
|
-
setBootDefaultOrgId(config.auth.defaultOrganizationId);
|
|
141
|
-
} else {
|
|
142
|
-
// Legacy fallback: auto-create org_default for deployments
|
|
143
|
-
// that haven't migrated to seed-based org creation yet.
|
|
134
|
+
// createKernel registered a configured default organization; without one,
|
|
135
|
+
// create org_default for deployments that have not seeded their own.
|
|
136
|
+
if (!config.auth?.defaultOrganizationId) {
|
|
144
137
|
await ensureDefaultOrg(kernel.database.db, config.storeName);
|
|
145
138
|
}
|
|
146
139
|
|
|
@@ -1,70 +1,194 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
1
|
+
import type { CommerceConfig } from "../config/types.js";
|
|
2
|
+
import type { DatabaseAdapter } from "../kernel/database/adapter.js";
|
|
3
|
+
import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
|
|
4
|
+
import type { PluginDb } from "../kernel/database/plugin-types.js";
|
|
5
|
+
import type { HookRegistry } from "../kernel/hooks/registry.js";
|
|
6
|
+
import { extendOrderStateMachine } from "../kernel/state-machine/machine.js";
|
|
7
|
+
import { DrizzleAnalyticsAdapter } from "../modules/analytics/drizzle-adapter.js";
|
|
8
|
+
import { BUILTIN_ANALYTICS_MODELS } from "../modules/analytics/models.js";
|
|
9
|
+
import { RetailReportsEngine } from "../modules/analytics/reports.js";
|
|
10
|
+
import { AnalyticsService } from "../modules/analytics/service.js";
|
|
11
|
+
import { createAuditService } from "../modules/audit/service.js";
|
|
12
|
+
import { CartRepository } from "../modules/cart/repository/index.js";
|
|
13
|
+
import { CartService } from "../modules/cart/service.js";
|
|
14
|
+
import { CatalogRepository } from "../modules/catalog/repository/index.js";
|
|
15
|
+
import { CatalogServiceImpl } from "../modules/catalog/service.js";
|
|
16
|
+
import { CustomersRepository } from "../modules/customers/repository/index.js";
|
|
17
|
+
import { CustomerService } from "../modules/customers/service.js";
|
|
18
|
+
import { DocumentsRepository } from "../modules/documents/repository/index.js";
|
|
19
|
+
import { DocumentsService } from "../modules/documents/service.js";
|
|
20
|
+
import { FulfillmentRepository } from "../modules/fulfillment/repository/index.js";
|
|
21
|
+
import { FulfillmentService } from "../modules/fulfillment/service.js";
|
|
22
|
+
import { InventoryRepository } from "../modules/inventory/repository/index.js";
|
|
23
|
+
import { InventoryService } from "../modules/inventory/service.js";
|
|
24
|
+
import { MediaRepository } from "../modules/media/repository/index.js";
|
|
25
|
+
import { MediaService } from "../modules/media/service.js";
|
|
26
|
+
import { OrdersRepository } from "../modules/orders/repository/index.js";
|
|
27
|
+
import { OrderService } from "../modules/orders/service.js";
|
|
28
|
+
import { OrganizationService } from "../modules/organization/service.js";
|
|
29
|
+
import { PaymentsService } from "../modules/payments/service.js";
|
|
30
|
+
import { PricingRepository } from "../modules/pricing/repository/index.js";
|
|
31
|
+
import { PricingService } from "../modules/pricing/service.js";
|
|
32
|
+
import { PromotionsRepository } from "../modules/promotions/repository/index.js";
|
|
33
|
+
import { PromotionService } from "../modules/promotions/service.js";
|
|
34
|
+
import { SearchService } from "../modules/search/service.js";
|
|
35
|
+
import { SettingsRepository } from "../modules/settings/repository/index.js";
|
|
36
|
+
import { SettingsService } from "../modules/settings/service.js";
|
|
37
|
+
import { ShippingConfigRepository } from "../modules/shipping/repository/index.js";
|
|
38
|
+
import { ShippingService } from "../modules/shipping/service.js";
|
|
39
|
+
import { TaxRatesRepository } from "../modules/tax/repository/index.js";
|
|
40
|
+
import { TaxService } from "../modules/tax/service.js";
|
|
41
|
+
import { WebhooksRepository } from "../modules/webhooks/repository/index.js";
|
|
42
|
+
import { WebhookService } from "../modules/webhooks/service.js";
|
|
22
43
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
pricing: pricingModule,
|
|
32
|
-
catalog: catalogModule,
|
|
33
|
-
inventory: inventoryModule,
|
|
34
|
-
cart: cartModule,
|
|
35
|
-
orders: ordersModule,
|
|
36
|
-
fulfillment: fulfillmentModule,
|
|
37
|
-
promotions: promotionsModule,
|
|
38
|
-
search: searchModule,
|
|
39
|
-
shipping: shippingModule,
|
|
40
|
-
tax: taxModule,
|
|
41
|
-
payments: paymentsModule,
|
|
42
|
-
analytics: analyticsModule,
|
|
43
|
-
} as const;
|
|
44
|
-
|
|
45
|
-
/** Strip symmetric/lazy manifest edges so topo sort reflects constructor-safe ordering. */
|
|
46
|
-
export function kernelModulesForTopoSort(): Record<string, AppModule> {
|
|
47
|
-
return {
|
|
48
|
-
...KERNEL_ALL_MODULES,
|
|
49
|
-
catalog: { ...catalogModule, dependencies: [] },
|
|
50
|
-
promotions: {
|
|
51
|
-
...promotionsModule,
|
|
52
|
-
dependencies: ["catalog"],
|
|
53
|
-
},
|
|
54
|
-
orders: {
|
|
55
|
-
...ordersModule,
|
|
56
|
-
dependencies: [
|
|
57
|
-
"cart",
|
|
58
|
-
"inventory",
|
|
59
|
-
"payments",
|
|
60
|
-
"pricing",
|
|
61
|
-
"fulfillment",
|
|
62
|
-
"tax",
|
|
63
|
-
],
|
|
64
|
-
},
|
|
65
|
-
} as unknown as Record<string, AppModule>;
|
|
44
|
+
/** What every core service factory is built from. */
|
|
45
|
+
export interface ServiceFactoryDeps {
|
|
46
|
+
database: DatabaseAdapter;
|
|
47
|
+
db: DrizzleDatabase;
|
|
48
|
+
hooks: HookRegistry;
|
|
49
|
+
config: CommerceConfig;
|
|
50
|
+
/** The services built so far, in the order below. A factory may read only those above it. */
|
|
51
|
+
services: Record<string, unknown>;
|
|
66
52
|
}
|
|
67
53
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
54
|
+
type Built = {
|
|
55
|
+
catalog: CatalogServiceImpl;
|
|
56
|
+
inventory: InventoryService;
|
|
57
|
+
settings: SettingsService;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const built = (deps: ServiceFactoryDeps) => deps.services as Built;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The core services, in the order the kernel constructs them. A factory that
|
|
64
|
+
* reads another service at construction (catalog's repository, the inventory
|
|
65
|
+
* service) must come after it; services reached only at call time through
|
|
66
|
+
* `deps.services` may sit anywhere.
|
|
67
|
+
*/
|
|
68
|
+
export const KERNEL_SERVICE_FACTORIES = [
|
|
69
|
+
["audit", (d: ServiceFactoryDeps) => createAuditService(d.db)],
|
|
70
|
+
["settings", (d: ServiceFactoryDeps) =>
|
|
71
|
+
new SettingsService({ repository: new SettingsRepository(d.db), config: d.config })],
|
|
72
|
+
["documents", (d: ServiceFactoryDeps) =>
|
|
73
|
+
new DocumentsService({ repository: new DocumentsRepository(d.db), services: d.services, config: d.config })],
|
|
74
|
+
["webhooks", (d: ServiceFactoryDeps) =>
|
|
75
|
+
new WebhookService({ repository: new WebhooksRepository(d.db), config: d.config })],
|
|
76
|
+
["media", (d: ServiceFactoryDeps) => {
|
|
77
|
+
if (d.config.storage == null) throw new Error("Media module requires config.storage");
|
|
78
|
+
return new MediaService({
|
|
79
|
+
repository: new MediaRepository(d.db),
|
|
80
|
+
catalogRepository: new CatalogRepository(d.db),
|
|
81
|
+
storage: d.config.storage,
|
|
82
|
+
config: d.config,
|
|
83
|
+
database: d.database,
|
|
84
|
+
services: d.services,
|
|
85
|
+
});
|
|
86
|
+
}],
|
|
87
|
+
["organization", (d: ServiceFactoryDeps) => new OrganizationService(d.db)],
|
|
88
|
+
["customers", (d: ServiceFactoryDeps) =>
|
|
89
|
+
new CustomerService({
|
|
90
|
+
repository: new CustomersRepository(d.db),
|
|
91
|
+
hooks: d.hooks,
|
|
92
|
+
config: d.config,
|
|
93
|
+
services: d.services,
|
|
94
|
+
database: d.database,
|
|
95
|
+
})],
|
|
96
|
+
["catalog", (d: ServiceFactoryDeps) =>
|
|
97
|
+
new CatalogServiceImpl({
|
|
98
|
+
repository: new CatalogRepository(d.db),
|
|
99
|
+
hooks: d.hooks,
|
|
100
|
+
config: d.config,
|
|
101
|
+
services: d.services,
|
|
102
|
+
database: d.database,
|
|
103
|
+
})],
|
|
104
|
+
["tax", (d: ServiceFactoryDeps) =>
|
|
105
|
+
new TaxService({
|
|
106
|
+
adapter: d.config.tax?.adapter,
|
|
107
|
+
repository: new TaxRatesRepository(d.db),
|
|
108
|
+
config: d.config,
|
|
109
|
+
})],
|
|
110
|
+
["payments", (d: ServiceFactoryDeps) => new PaymentsService(d.config.payments)],
|
|
111
|
+
["analytics", (d: ServiceFactoryDeps) => {
|
|
112
|
+
const adapter = new DrizzleAnalyticsAdapter(d.db);
|
|
113
|
+
for (const model of BUILTIN_ANALYTICS_MODELS) adapter.registerModel(model);
|
|
114
|
+
// Settings is read at call time, not construction.
|
|
115
|
+
const reports = new RetailReportsEngine(d.db, (orgId, group) => built(d).settings.read(orgId, group));
|
|
116
|
+
return new AnalyticsService({ adapter, config: d.config, reports });
|
|
117
|
+
}],
|
|
118
|
+
["pricing", (d: ServiceFactoryDeps) =>
|
|
119
|
+
new PricingService({
|
|
120
|
+
repository: new PricingRepository(d.db),
|
|
121
|
+
catalogRepository: built(d).catalog.repository,
|
|
122
|
+
hooks: d.hooks,
|
|
123
|
+
config: d.config,
|
|
124
|
+
services: d.services,
|
|
125
|
+
database: d.database,
|
|
126
|
+
})],
|
|
127
|
+
["inventory", (d: ServiceFactoryDeps) =>
|
|
128
|
+
new InventoryService({
|
|
129
|
+
repository: new InventoryRepository(d.db),
|
|
130
|
+
hooks: d.hooks,
|
|
131
|
+
config: d.config,
|
|
132
|
+
services: d.services,
|
|
133
|
+
database: d.database,
|
|
134
|
+
})],
|
|
135
|
+
["promotions", (d: ServiceFactoryDeps) =>
|
|
136
|
+
new PromotionService({
|
|
137
|
+
repository: new PromotionsRepository(d.db),
|
|
138
|
+
catalogRepository: built(d).catalog.repository,
|
|
139
|
+
ordersRepository: new OrdersRepository(d.db),
|
|
140
|
+
hooks: d.hooks,
|
|
141
|
+
config: d.config,
|
|
142
|
+
services: d.services,
|
|
143
|
+
database: d.database,
|
|
144
|
+
})],
|
|
145
|
+
["search", (d: ServiceFactoryDeps) => {
|
|
146
|
+
const adapter = d.config.search?.adapter;
|
|
147
|
+
adapter?.init?.({ db: d.db as PluginDb });
|
|
148
|
+
const catalog = built(d).catalog;
|
|
149
|
+
return new SearchService({
|
|
150
|
+
catalogRepository: catalog.repository,
|
|
151
|
+
resolveEntityFieldDefinitions: catalog.resolveEntityFieldDefinitions.bind(catalog),
|
|
152
|
+
config: d.config,
|
|
153
|
+
...(d.config.entities ? { entities: d.config.entities } : {}),
|
|
154
|
+
...(adapter ? { adapter } : {}),
|
|
155
|
+
...(d.config.search?.defaultFacets ? { defaultFacets: d.config.search.defaultFacets } : {}),
|
|
156
|
+
});
|
|
157
|
+
}],
|
|
158
|
+
["shipping", (d: ServiceFactoryDeps) =>
|
|
159
|
+
new ShippingService({
|
|
160
|
+
config: d.config,
|
|
161
|
+
catalogRepository: built(d).catalog.repository,
|
|
162
|
+
repository: new ShippingConfigRepository(d.db),
|
|
163
|
+
})],
|
|
164
|
+
["cart", (d: ServiceFactoryDeps) =>
|
|
165
|
+
new CartService({
|
|
166
|
+
repository: new CartRepository(d.db),
|
|
167
|
+
catalogRepository: built(d).catalog.repository,
|
|
168
|
+
hooks: d.hooks,
|
|
169
|
+
config: d.config,
|
|
170
|
+
services: d.services,
|
|
171
|
+
database: d.database,
|
|
172
|
+
})],
|
|
173
|
+
["fulfillment", (d: ServiceFactoryDeps) =>
|
|
174
|
+
new FulfillmentService({
|
|
175
|
+
repository: new FulfillmentRepository(d.db),
|
|
176
|
+
ordersRepository: new OrdersRepository(d.db),
|
|
177
|
+
inventoryService: built(d).inventory,
|
|
178
|
+
hooks: d.hooks,
|
|
179
|
+
config: d.config,
|
|
180
|
+
services: d.services,
|
|
181
|
+
database: d.database,
|
|
182
|
+
})],
|
|
183
|
+
["orders", (d: ServiceFactoryDeps) =>
|
|
184
|
+
new OrderService({
|
|
185
|
+
repository: new OrdersRepository(d.db),
|
|
186
|
+
hooks: d.hooks,
|
|
187
|
+
config: d.config,
|
|
188
|
+
services: d.services,
|
|
189
|
+
database: d.database,
|
|
190
|
+
...(d.config.orders?.customTransitions
|
|
191
|
+
? { stateMachine: extendOrderStateMachine(d.config.orders.customTransitions) }
|
|
192
|
+
: {}),
|
|
193
|
+
})],
|
|
194
|
+
] as const;
|
|
@@ -24,14 +24,9 @@ import { SettingsService } from "../modules/settings/service.js";
|
|
|
24
24
|
import { DocumentsService } from "../modules/documents/service.js";
|
|
25
25
|
import type { AuditService } from "../modules/audit/service.js";
|
|
26
26
|
import { OrganizationService } from "../modules/organization/service.js";
|
|
27
|
-
import {
|
|
27
|
+
import { createConsoleLogger } from "../utils/logger.js";
|
|
28
28
|
import { CompensationFailuresRepository } from "../kernel/compensation/repository.js";
|
|
29
29
|
|
|
30
|
-
export interface WebhookDeliveryPayload {
|
|
31
|
-
endpoint: { id: string; url: string; secret: string };
|
|
32
|
-
eventName: string;
|
|
33
|
-
payload: unknown;
|
|
34
|
-
}
|
|
35
30
|
|
|
36
31
|
export interface Kernel {
|
|
37
32
|
config: CommerceConfig;
|
|
@@ -46,9 +41,7 @@ export interface Kernel {
|
|
|
46
41
|
payments: PaymentsService;
|
|
47
42
|
fulfillment: FulfillmentService;
|
|
48
43
|
customers: CustomerService;
|
|
49
|
-
webhooks: WebhookService
|
|
50
|
-
enqueueDelivery(payload: WebhookDeliveryPayload): Promise<void>;
|
|
51
|
-
};
|
|
44
|
+
webhooks: WebhookService;
|
|
52
45
|
analytics: AnalyticsService;
|
|
53
46
|
pricing: PricingService;
|
|
54
47
|
promotions: PromotionService;
|
|
@@ -63,7 +56,7 @@ export interface Kernel {
|
|
|
63
56
|
organization: OrganizationService;
|
|
64
57
|
};
|
|
65
58
|
pluginPermissions: PluginPermission[];
|
|
66
|
-
logger: ReturnType<typeof
|
|
59
|
+
logger: ReturnType<typeof createConsoleLogger>;
|
|
67
60
|
}
|
|
68
61
|
|
|
69
62
|
export interface ConfigRouteDatabase extends DatabaseAdapter {
|
|
@@ -106,19 +99,3 @@ export function assertKernelServicesReady(
|
|
|
106
99
|
}
|
|
107
100
|
}
|
|
108
101
|
|
|
109
|
-
export function assertSortedBefore(
|
|
110
|
-
topo: readonly string[],
|
|
111
|
-
a: string,
|
|
112
|
-
b: string,
|
|
113
|
-
): void {
|
|
114
|
-
const ia = topo.indexOf(a);
|
|
115
|
-
const ib = topo.indexOf(b);
|
|
116
|
-
if (ia < 0 || ib < 0) {
|
|
117
|
-
throw new Error(`kernelModuleInstantiationOrder missing key: ${a} or ${b}`);
|
|
118
|
-
}
|
|
119
|
-
if (ia >= ib) {
|
|
120
|
-
throw new Error(
|
|
121
|
-
`Invalid kernel topo order: expected "${a}" before "${b}" (indices ${ia}, ${ib})`,
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
}
|
package/src/runtime/kernel.ts
CHANGED
|
@@ -2,47 +2,30 @@ import type { CommerceConfig } from "../config/types.js";
|
|
|
2
2
|
import { HookRegistry, isHookMarkedInTransaction, type HookHandler } from "../kernel/hooks/registry.js";
|
|
3
3
|
import { createDatabaseConnection } from "../kernel/database/adapter.js";
|
|
4
4
|
import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
|
|
5
|
-
import
|
|
6
|
-
import { topoSortModules } from "../kernel/module/index.js";
|
|
7
|
-
import { WebhookDeliveryWorker } from "../modules/webhooks/worker.js";
|
|
8
|
-
import { WebhooksRepository } from "../modules/webhooks/repository/index.js";
|
|
9
|
-
import { createLogger } from "../utils/logger.js";
|
|
5
|
+
import { createConsoleLogger } from "../utils/logger.js";
|
|
10
6
|
import { withTiming } from "../kernel/service-timing.js";
|
|
11
7
|
import { setBootDefaultOrgId } from "../auth/org.js";
|
|
12
|
-
import { setBootStrictOrgResolution } from "../auth/strict-org-resolution.js";
|
|
13
8
|
import { DrizzleJobsAdapter } from "../kernel/jobs/drizzle-adapter.js";
|
|
14
9
|
import type { ExecutionEngine } from "../kernel/jobs/adapter.js";
|
|
15
10
|
import { CompensationFailuresRepository } from "../kernel/compensation/repository.js";
|
|
16
11
|
|
|
17
|
-
import {
|
|
18
|
-
KERNEL_ALL_MODULES,
|
|
19
|
-
kernelModulesForTopoSort,
|
|
20
|
-
} from "./kernel-modules.js";
|
|
12
|
+
import { KERNEL_SERVICE_FACTORIES } from "./kernel-modules.js";
|
|
21
13
|
import { registerConfiguredKernelHooks } from "./kernel-register-hooks.js";
|
|
22
14
|
import {
|
|
23
15
|
assertKernelServicesReady,
|
|
24
|
-
assertSortedBefore,
|
|
25
16
|
type Kernel,
|
|
26
|
-
type WebhookDeliveryPayload,
|
|
27
17
|
} from "./kernel-types.js";
|
|
28
18
|
|
|
29
|
-
export type { Kernel
|
|
19
|
+
export type { Kernel };
|
|
30
20
|
export type { ConfigRouteKernel, ConfigRouteDatabase } from "./kernel-types.js";
|
|
31
|
-
export {
|
|
32
|
-
KERNEL_ALL_MODULES,
|
|
33
|
-
kernelModuleInstantiationOrder,
|
|
34
|
-
} from "./kernel-modules.js";
|
|
35
21
|
|
|
36
22
|
export function createKernel(config: CommerceConfig): Kernel {
|
|
37
23
|
const hooks = new HookRegistry();
|
|
38
|
-
const logger =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
// had services fall back to DEFAULT_ORG_ID with a deprecation warning even
|
|
44
|
-
// when config.auth.defaultOrganizationId was set.
|
|
45
|
-
setBootStrictOrgResolution(config.auth?.strictOrgResolution === true);
|
|
24
|
+
const logger = createConsoleLogger("kernel");
|
|
25
|
+
|
|
26
|
+
// Register the configured default organization for resolveOrgId(). Done here
|
|
27
|
+
// rather than only in createCommerce so tests calling createKernel directly
|
|
28
|
+
// see it too.
|
|
46
29
|
if (config.auth?.defaultOrganizationId) {
|
|
47
30
|
setBootDefaultOrgId(config.auth.defaultOrganizationId);
|
|
48
31
|
}
|
|
@@ -76,57 +59,19 @@ export function createKernel(config: CommerceConfig): Kernel {
|
|
|
76
59
|
);
|
|
77
60
|
const jobsEngine: ExecutionEngine =
|
|
78
61
|
config.jobs?.adapter ?? new DrizzleJobsAdapter(db);
|
|
79
|
-
const jobLogger = {
|
|
80
|
-
info: (message: string, data?: unknown) => logger.info(message, data),
|
|
81
|
-
warn: (message: string, data?: unknown) => logger.warn(message, data),
|
|
82
|
-
error: (message: string, data?: unknown) => logger.error(message, data),
|
|
83
|
-
};
|
|
84
62
|
jobsEngine.register({
|
|
85
63
|
tasks: jobsTaskMap,
|
|
86
|
-
context: { logger
|
|
64
|
+
context: { logger, db, services: serviceContainer },
|
|
87
65
|
...(config.jobs?.processingOrder !== undefined
|
|
88
66
|
? { processingOrder: config.jobs.processingOrder }
|
|
89
67
|
: {}),
|
|
90
68
|
});
|
|
91
69
|
serviceContainer.jobs = jobsEngine;
|
|
92
70
|
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
const moduleKeys = Object.keys(KERNEL_ALL_MODULES);
|
|
96
|
-
if (order.length !== moduleKeys.length) {
|
|
97
|
-
throw new Error(
|
|
98
|
-
`topoSortModules length mismatch: got ${order.length}, expected ${moduleKeys.length}`,
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
assertSortedBefore(order, "catalog", "inventory");
|
|
102
|
-
assertSortedBefore(order, "catalog", "pricing");
|
|
103
|
-
|
|
104
|
-
const moduleDeps = {
|
|
105
|
-
db: database,
|
|
106
|
-
hooks,
|
|
107
|
-
config,
|
|
108
|
-
logger,
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
for (const id of order) {
|
|
112
|
-
const mod = KERNEL_ALL_MODULES[id as keyof typeof KERNEL_ALL_MODULES];
|
|
113
|
-
const svc = (mod as AppModule<unknown, unknown, Record<string, unknown>>).service({
|
|
114
|
-
...moduleDeps,
|
|
115
|
-
services: services as Record<string, unknown>,
|
|
116
|
-
});
|
|
117
|
-
(services as Record<string, unknown>)[id] = svc;
|
|
71
|
+
for (const [id, create] of KERNEL_SERVICE_FACTORIES) {
|
|
72
|
+
serviceContainer[id] = create({ database, db, hooks, config, services: serviceContainer });
|
|
118
73
|
}
|
|
119
74
|
|
|
120
|
-
const baseWebhooks = services.webhooks!;
|
|
121
|
-
const webhookWorker = new WebhookDeliveryWorker({
|
|
122
|
-
repository: new WebhooksRepository(db),
|
|
123
|
-
});
|
|
124
|
-
services.webhooks = Object.assign(baseWebhooks, {
|
|
125
|
-
async enqueueDelivery(payload: WebhookDeliveryPayload) {
|
|
126
|
-
await webhookWorker.deliver(payload);
|
|
127
|
-
},
|
|
128
|
-
});
|
|
129
|
-
|
|
130
75
|
services.compensationFailures = new CompensationFailuresRepository(db);
|
|
131
76
|
|
|
132
77
|
assertKernelServicesReady(services);
|
package/src/runtime/server.ts
CHANGED
|
@@ -17,9 +17,7 @@ import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
|
|
|
17
17
|
import { CommerceCsrfError } from "../kernel/errors.js";
|
|
18
18
|
import { createRestRoutes } from "../interfaces/rest/index.js";
|
|
19
19
|
import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.js";
|
|
20
|
-
import {
|
|
21
|
-
import { ensureDefaultOrg } from "../auth/org.js";
|
|
22
|
-
import { createLogger, type Logger } from "./logger.js";
|
|
20
|
+
import type { Logger } from "./logger.js";
|
|
23
21
|
import { createCommerce, type CommerceInstance } from "./commerce.js";
|
|
24
22
|
import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
|
|
25
23
|
import { mapErrorToResponse } from "../kernel/error-mapper.js";
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
import { PGlite } from "@electric-sql/pglite";
|
|
16
16
|
import { drizzle } from "drizzle-orm/pglite";
|
|
17
17
|
import { sql } from "drizzle-orm";
|
|
18
|
-
import { createRequire } from "node:module";
|
|
19
18
|
import type { DatabaseAdapter } from "../kernel/database/adapter.js";
|
|
20
|
-
import {
|
|
19
|
+
import { createPGliteTransaction } from "../kernel/database/pglite-transaction.js";
|
|
20
|
+
import { pushSchema } from "../kernel/database/migrate.js";
|
|
21
21
|
import { ensureDefaultOrg } from "../auth/org.js";
|
|
22
22
|
|
|
23
23
|
// Single barrel import --- includes all core modules + auth tables
|
|
@@ -39,29 +39,6 @@ export interface QueryLog {
|
|
|
39
39
|
stop(): string[];
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
// drizzle-kit/api uses CJS internally; createRequire provides ESM compat.
|
|
43
|
-
const require = createRequire(import.meta.url);
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Pushes the core Drizzle schema to the database using drizzle-kit/api.
|
|
47
|
-
*
|
|
48
|
-
* drizzle-kit introspects the live database via information_schema, diffs
|
|
49
|
-
* against the pgTable definitions, and generates the minimal DDL needed.
|
|
50
|
-
* Typed as DrizzleDatabase (our concrete schema type) to avoid the
|
|
51
|
-
* PGlite → PgDatabase<HKT> invariance cast — drizzle-kit accepts any
|
|
52
|
-
* Drizzle instance at runtime regardless of the schema generic.
|
|
53
|
-
*/
|
|
54
|
-
async function pushCoreSchema(db: DrizzleDatabase): Promise<void> {
|
|
55
|
-
const coreSchema = getSchema();
|
|
56
|
-
const drizzleKit = require("drizzle-kit/api") as {
|
|
57
|
-
pushSchema(
|
|
58
|
-
imports: Record<string, unknown>,
|
|
59
|
-
drizzleInstance: DrizzleDatabase,
|
|
60
|
-
): Promise<{ apply: () => Promise<void> }>;
|
|
61
|
-
};
|
|
62
|
-
const { apply } = await drizzleKit.pushSchema(coreSchema, db);
|
|
63
|
-
await apply();
|
|
64
|
-
}
|
|
65
42
|
|
|
66
43
|
/**
|
|
67
44
|
* Creates a PGlite-backed database adapter for testing.
|
|
@@ -117,51 +94,12 @@ export async function createPGliteTestAdapter(): Promise<{
|
|
|
117
94
|
// PgliteDatabase<Schema> and DrizzleDatabase share the same Schema type;
|
|
118
95
|
// the HKT parameter differs (PgliteQueryResultHKT vs PgQueryResultHKT)
|
|
119
96
|
// but drizzle-kit's pushSchema doesn't use it at runtime.
|
|
120
|
-
await
|
|
97
|
+
await pushSchema(db);
|
|
121
98
|
|
|
122
99
|
// Ensure the default organization exists for all tests
|
|
123
100
|
await ensureDefaultOrg(db);
|
|
124
101
|
|
|
125
|
-
|
|
126
|
-
* PGlite-compatible transaction wrapper.
|
|
127
|
-
*
|
|
128
|
-
* Drizzle's transaction() method can hang with PGlite due to how the adapter
|
|
129
|
-
* manages transaction state, so this drives BEGIN/COMMIT manually.
|
|
130
|
-
*
|
|
131
|
-
* PGlite is a single connection, so two transaction bodies awaiting
|
|
132
|
-
* concurrently would otherwise interleave their statements between one
|
|
133
|
-
* BEGIN and one COMMIT — the second BEGIN is a no-op Postgres only warns
|
|
134
|
-
* about. Merged that way, two callers share a snapshot and hold each other's
|
|
135
|
-
* row locks, so an isolation bug reads as if the guard failed. Bodies are
|
|
136
|
-
* queued instead, which is what a connection pool would do to two
|
|
137
|
-
* transactions competing for the same rows.
|
|
138
|
-
*
|
|
139
|
-
* A nested call joins the transaction already open rather than deadlocking
|
|
140
|
-
* on the queue; without savepoints that is the only sound reading.
|
|
141
|
-
*/
|
|
142
|
-
let transactionQueue: Promise<unknown> = Promise.resolve();
|
|
143
|
-
let inTransaction = false;
|
|
144
|
-
|
|
145
|
-
async function transaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T> {
|
|
146
|
-
if (inTransaction) return fn(db);
|
|
147
|
-
|
|
148
|
-
const run = transactionQueue.then(async () => {
|
|
149
|
-
inTransaction = true;
|
|
150
|
-
await pg.exec("BEGIN");
|
|
151
|
-
try {
|
|
152
|
-
const result = await fn(db);
|
|
153
|
-
await pg.exec("COMMIT");
|
|
154
|
-
return result;
|
|
155
|
-
} catch (error) {
|
|
156
|
-
await pg.exec("ROLLBACK");
|
|
157
|
-
throw error;
|
|
158
|
-
} finally {
|
|
159
|
-
inTransaction = false;
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
transactionQueue = run.catch(() => undefined);
|
|
163
|
-
return run as Promise<T>;
|
|
164
|
-
}
|
|
102
|
+
const { transaction, inTransaction } = createPGliteTransaction(pg, db);
|
|
165
103
|
|
|
166
104
|
const adapter: DatabaseAdapter & { inTransaction(): boolean } = {
|
|
167
105
|
provider: "postgresql",
|
|
@@ -181,7 +119,7 @@ export async function createPGliteTestAdapter(): Promise<{
|
|
|
181
119
|
* Test-utils only. Production adapters do not carry it, and nothing outside a test may branch
|
|
182
120
|
* on it — a behaviour that depends on this flag would be a behaviour no production adapter has.
|
|
183
121
|
*/
|
|
184
|
-
inTransaction
|
|
122
|
+
inTransaction,
|
|
185
123
|
};
|
|
186
124
|
|
|
187
125
|
/**
|