@porulle/core 0.1.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/README.md +56 -0
- package/dist/adapters/console-email.d.ts +23 -0
- package/dist/adapters/console-email.d.ts.map +1 -0
- package/dist/adapters/console-email.js +38 -0
- package/dist/auth/access.d.ts +101 -0
- package/dist/auth/access.d.ts.map +1 -0
- package/dist/auth/access.js +128 -0
- package/dist/auth/auth-schema.d.ts +1475 -0
- package/dist/auth/auth-schema.d.ts.map +1 -0
- package/dist/auth/auth-schema.js +124 -0
- package/dist/auth/middleware.d.ts +5 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +220 -0
- package/dist/auth/org.d.ts +28 -0
- package/dist/auth/org.d.ts.map +1 -0
- package/dist/auth/org.js +68 -0
- package/dist/auth/permissions.d.ts +4 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +24 -0
- package/dist/auth/setup.d.ts +29 -0
- package/dist/auth/setup.d.ts.map +1 -0
- package/dist/auth/setup.js +137 -0
- package/dist/auth/strict-org-resolution.d.ts +4 -0
- package/dist/auth/strict-org-resolution.d.ts.map +1 -0
- package/dist/auth/strict-org-resolution.js +13 -0
- package/dist/auth/system-actor.d.ts +7 -0
- package/dist/auth/system-actor.d.ts.map +1 -0
- package/dist/auth/system-actor.js +17 -0
- package/dist/auth/types.d.ts +11 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +1 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +83 -0
- package/dist/config/define-config.d.ts +10 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +64 -0
- package/dist/config/types.d.ts +412 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +1 -0
- package/dist/drizzle.d.ts +28 -0
- package/dist/drizzle.d.ts.map +1 -0
- package/dist/drizzle.js +24 -0
- package/dist/generated/plugin-manifest.d.ts +45 -0
- package/dist/generated/plugin-manifest.d.ts.map +1 -0
- package/dist/generated/plugin-manifest.js +19 -0
- package/dist/hooks/checkout-completion.d.ts +58 -0
- package/dist/hooks/checkout-completion.d.ts.map +1 -0
- package/dist/hooks/checkout-completion.js +146 -0
- package/dist/hooks/checkout.d.ts +99 -0
- package/dist/hooks/checkout.d.ts.map +1 -0
- package/dist/hooks/checkout.js +331 -0
- package/dist/hooks/order-emails.d.ts +16 -0
- package/dist/hooks/order-emails.d.ts.map +1 -0
- package/dist/hooks/order-emails.js +44 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/interfaces/rest/customer-portal.d.ts +5 -0
- package/dist/interfaces/rest/customer-portal.d.ts.map +1 -0
- package/dist/interfaces/rest/customer-portal.js +206 -0
- package/dist/interfaces/rest/index.d.ts +5 -0
- package/dist/interfaces/rest/index.d.ts.map +1 -0
- package/dist/interfaces/rest/index.js +94 -0
- package/dist/interfaces/rest/router.d.ts +164 -0
- package/dist/interfaces/rest/router.d.ts.map +1 -0
- package/dist/interfaces/rest/router.js +259 -0
- package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts +5 -0
- package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/admin/compensation-failures.js +114 -0
- package/dist/interfaces/rest/routes/admin/permissions.d.ts +5 -0
- package/dist/interfaces/rest/routes/admin/permissions.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/admin/permissions.js +28 -0
- package/dist/interfaces/rest/routes/admin-jobs.d.ts +5 -0
- package/dist/interfaces/rest/routes/admin-jobs.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/admin-jobs.js +48 -0
- package/dist/interfaces/rest/routes/audit.d.ts +5 -0
- package/dist/interfaces/rest/routes/audit.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/audit.js +43 -0
- package/dist/interfaces/rest/routes/carts.d.ts +5 -0
- package/dist/interfaces/rest/routes/carts.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/carts.js +61 -0
- package/dist/interfaces/rest/routes/catalog.d.ts +5 -0
- package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/catalog.js +269 -0
- package/dist/interfaces/rest/routes/checkout.d.ts +5 -0
- package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/checkout.js +220 -0
- package/dist/interfaces/rest/routes/customers.d.ts +5 -0
- package/dist/interfaces/rest/routes/customers.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/customers.js +78 -0
- package/dist/interfaces/rest/routes/inventory.d.ts +5 -0
- package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/inventory.js +74 -0
- package/dist/interfaces/rest/routes/media.d.ts +5 -0
- package/dist/interfaces/rest/routes/media.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/media.js +66 -0
- package/dist/interfaces/rest/routes/orders.d.ts +5 -0
- package/dist/interfaces/rest/routes/orders.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/orders.js +64 -0
- package/dist/interfaces/rest/routes/payments.d.ts +5 -0
- package/dist/interfaces/rest/routes/payments.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/payments.js +45 -0
- package/dist/interfaces/rest/routes/pricing.d.ts +5 -0
- package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/pricing.js +61 -0
- package/dist/interfaces/rest/routes/promotions.d.ts +5 -0
- package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/promotions.js +76 -0
- package/dist/interfaces/rest/routes/search.d.ts +5 -0
- package/dist/interfaces/rest/routes/search.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/search.js +72 -0
- package/dist/interfaces/rest/routes/webhooks.d.ts +5 -0
- package/dist/interfaces/rest/routes/webhooks.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/webhooks.js +39 -0
- package/dist/interfaces/rest/schemas/admin-jobs.d.ts +327 -0
- package/dist/interfaces/rest/schemas/admin-jobs.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/admin-jobs.js +37 -0
- package/dist/interfaces/rest/schemas/admin-permissions.d.ts +27 -0
- package/dist/interfaces/rest/schemas/admin-permissions.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/admin-permissions.js +25 -0
- package/dist/interfaces/rest/schemas/audit.d.ts +59 -0
- package/dist/interfaces/rest/schemas/audit.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/audit.js +43 -0
- package/dist/interfaces/rest/schemas/carts.d.ts +1456 -0
- package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/carts.js +109 -0
- package/dist/interfaces/rest/schemas/catalog.d.ts +5452 -0
- package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/catalog.js +397 -0
- package/dist/interfaces/rest/schemas/checkout.d.ts +160 -0
- package/dist/interfaces/rest/schemas/checkout.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/checkout.js +60 -0
- package/dist/interfaces/rest/schemas/compensation-failures.d.ts +122 -0
- package/dist/interfaces/rest/schemas/compensation-failures.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/compensation-failures.js +84 -0
- package/dist/interfaces/rest/schemas/customer-portal.d.ts +2237 -0
- package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/customer-portal.js +177 -0
- package/dist/interfaces/rest/schemas/customers.d.ts +422 -0
- package/dist/interfaces/rest/schemas/customers.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/customers.js +150 -0
- package/dist/interfaces/rest/schemas/inventory.d.ts +561 -0
- package/dist/interfaces/rest/schemas/inventory.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/inventory.js +148 -0
- package/dist/interfaces/rest/schemas/media.d.ts +303 -0
- package/dist/interfaces/rest/schemas/media.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/media.js +69 -0
- package/dist/interfaces/rest/schemas/orders.d.ts +1877 -0
- package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/orders.js +93 -0
- package/dist/interfaces/rest/schemas/pricing.d.ts +256 -0
- package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/pricing.js +72 -0
- package/dist/interfaces/rest/schemas/promotions.d.ts +374 -0
- package/dist/interfaces/rest/schemas/promotions.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/promotions.js +104 -0
- package/dist/interfaces/rest/schemas/responses.d.ts +4138 -0
- package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/responses.js +74 -0
- package/dist/interfaces/rest/schemas/search.d.ts +247 -0
- package/dist/interfaces/rest/schemas/search.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/search.js +55 -0
- package/dist/interfaces/rest/schemas/shared.d.ts +95 -0
- package/dist/interfaces/rest/schemas/shared.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/shared.js +51 -0
- package/dist/interfaces/rest/schemas/webhooks.d.ts +221 -0
- package/dist/interfaces/rest/schemas/webhooks.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/webhooks.js +62 -0
- package/dist/interfaces/rest/utils.d.ts +45 -0
- package/dist/interfaces/rest/utils.d.ts.map +1 -0
- package/dist/interfaces/rest/utils.js +71 -0
- package/dist/interfaces/rest/webhook-router.d.ts +41 -0
- package/dist/interfaces/rest/webhook-router.d.ts.map +1 -0
- package/dist/interfaces/rest/webhook-router.js +36 -0
- package/dist/kernel/compensation/executor.d.ts +21 -0
- package/dist/kernel/compensation/executor.d.ts.map +1 -0
- package/dist/kernel/compensation/executor.js +80 -0
- package/dist/kernel/compensation/repository.d.ts +47 -0
- package/dist/kernel/compensation/repository.d.ts.map +1 -0
- package/dist/kernel/compensation/repository.js +93 -0
- package/dist/kernel/compensation/schema.d.ts +217 -0
- package/dist/kernel/compensation/schema.d.ts.map +1 -0
- package/dist/kernel/compensation/schema.js +29 -0
- package/dist/kernel/compensation/types.d.ts +29 -0
- package/dist/kernel/compensation/types.d.ts.map +1 -0
- package/dist/kernel/compensation/types.js +1 -0
- package/dist/kernel/database/adapter.d.ts +18 -0
- package/dist/kernel/database/adapter.d.ts.map +1 -0
- package/dist/kernel/database/adapter.js +3 -0
- package/dist/kernel/database/drizzle-db.d.ts +49 -0
- package/dist/kernel/database/drizzle-db.d.ts.map +1 -0
- package/dist/kernel/database/drizzle-db.js +20 -0
- package/dist/kernel/database/migrate.d.ts +38 -0
- package/dist/kernel/database/migrate.d.ts.map +1 -0
- package/dist/kernel/database/migrate.js +61 -0
- package/dist/kernel/database/plugin-db-context.d.ts +3 -0
- package/dist/kernel/database/plugin-db-context.d.ts.map +1 -0
- package/dist/kernel/database/plugin-db-context.js +8 -0
- package/dist/kernel/database/plugin-types.d.ts +32 -0
- package/dist/kernel/database/plugin-types.d.ts.map +1 -0
- package/dist/kernel/database/plugin-types.js +10 -0
- package/dist/kernel/database/schema.d.ts +26 -0
- package/dist/kernel/database/schema.d.ts.map +1 -0
- package/dist/kernel/database/schema.js +39 -0
- package/dist/kernel/database/scoped-db.d.ts +14 -0
- package/dist/kernel/database/scoped-db.d.ts.map +1 -0
- package/dist/kernel/database/scoped-db.js +103 -0
- package/dist/kernel/database/tx-context.d.ts +15 -0
- package/dist/kernel/database/tx-context.d.ts.map +1 -0
- package/dist/kernel/database/tx-context.js +19 -0
- package/dist/kernel/error-mapper.d.ts +14 -0
- package/dist/kernel/error-mapper.d.ts.map +1 -0
- package/dist/kernel/error-mapper.js +93 -0
- package/dist/kernel/errors.d.ts +43 -0
- package/dist/kernel/errors.d.ts.map +1 -0
- package/dist/kernel/errors.js +78 -0
- package/dist/kernel/factory/repository-factory.d.ts +71 -0
- package/dist/kernel/factory/repository-factory.d.ts.map +1 -0
- package/dist/kernel/factory/repository-factory.js +138 -0
- package/dist/kernel/hooks/create-context.d.ts +32 -0
- package/dist/kernel/hooks/create-context.d.ts.map +1 -0
- package/dist/kernel/hooks/create-context.js +23 -0
- package/dist/kernel/hooks/executor.d.ts +13 -0
- package/dist/kernel/hooks/executor.d.ts.map +1 -0
- package/dist/kernel/hooks/executor.js +56 -0
- package/dist/kernel/hooks/registry.d.ts +28 -0
- package/dist/kernel/hooks/registry.d.ts.map +1 -0
- package/dist/kernel/hooks/registry.js +58 -0
- package/dist/kernel/hooks/types.d.ts +40 -0
- package/dist/kernel/hooks/types.d.ts.map +1 -0
- package/dist/kernel/hooks/types.js +1 -0
- package/dist/kernel/http-error.d.ts +30 -0
- package/dist/kernel/http-error.d.ts.map +1 -0
- package/dist/kernel/http-error.js +35 -0
- package/dist/kernel/jobs/adapter.d.ts +25 -0
- package/dist/kernel/jobs/adapter.d.ts.map +1 -0
- package/dist/kernel/jobs/adapter.js +9 -0
- package/dist/kernel/jobs/builtin-job-tasks.d.ts +3 -0
- package/dist/kernel/jobs/builtin-job-tasks.d.ts.map +1 -0
- package/dist/kernel/jobs/builtin-job-tasks.js +6 -0
- package/dist/kernel/jobs/drizzle-adapter.d.ts +15 -0
- package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -0
- package/dist/kernel/jobs/drizzle-adapter.js +46 -0
- package/dist/kernel/jobs/reaper.d.ts +12 -0
- package/dist/kernel/jobs/reaper.d.ts.map +1 -0
- package/dist/kernel/jobs/reaper.js +62 -0
- package/dist/kernel/jobs/runner.d.ts +24 -0
- package/dist/kernel/jobs/runner.d.ts.map +1 -0
- package/dist/kernel/jobs/runner.js +118 -0
- package/dist/kernel/jobs/schema.d.ts +280 -0
- package/dist/kernel/jobs/schema.d.ts.map +1 -0
- package/dist/kernel/jobs/schema.js +37 -0
- package/dist/kernel/jobs/types.d.ts +40 -0
- package/dist/kernel/jobs/types.d.ts.map +1 -0
- package/dist/kernel/jobs/types.js +4 -0
- package/dist/kernel/local-api.d.ts +104 -0
- package/dist/kernel/local-api.d.ts.map +1 -0
- package/dist/kernel/local-api.js +89 -0
- package/dist/kernel/module/define.d.ts +21 -0
- package/dist/kernel/module/define.d.ts.map +1 -0
- package/dist/kernel/module/define.js +3 -0
- package/dist/kernel/module/index.d.ts +4 -0
- package/dist/kernel/module/index.d.ts.map +1 -0
- package/dist/kernel/module/index.js +2 -0
- package/dist/kernel/module/topo-sort.d.ts +7 -0
- package/dist/kernel/module/topo-sort.d.ts.map +1 -0
- package/dist/kernel/module/topo-sort.js +89 -0
- package/dist/kernel/plugin/manifest.d.ts +84 -0
- package/dist/kernel/plugin/manifest.d.ts.map +1 -0
- package/dist/kernel/plugin/manifest.js +196 -0
- package/dist/kernel/query/executor.d.ts +21 -0
- package/dist/kernel/query/executor.d.ts.map +1 -0
- package/dist/kernel/query/executor.js +128 -0
- package/dist/kernel/query/registry.d.ts +33 -0
- package/dist/kernel/query/registry.d.ts.map +1 -0
- package/dist/kernel/query/registry.js +20 -0
- package/dist/kernel/result.d.ts +36 -0
- package/dist/kernel/result.d.ts.map +1 -0
- package/dist/kernel/result.js +16 -0
- package/dist/kernel/service-registry.d.ts +109 -0
- package/dist/kernel/service-registry.d.ts.map +1 -0
- package/dist/kernel/service-registry.js +26 -0
- package/dist/kernel/service-timing.d.ts +25 -0
- package/dist/kernel/service-timing.d.ts.map +1 -0
- package/dist/kernel/service-timing.js +62 -0
- package/dist/kernel/state-machine/machine.d.ts +24 -0
- package/dist/kernel/state-machine/machine.d.ts.map +1 -0
- package/dist/kernel/state-machine/machine.js +70 -0
- package/dist/modules/analytics/drizzle-adapter.d.ts +13 -0
- package/dist/modules/analytics/drizzle-adapter.d.ts.map +1 -0
- package/dist/modules/analytics/drizzle-adapter.js +358 -0
- package/dist/modules/analytics/hooks.d.ts +13 -0
- package/dist/modules/analytics/hooks.d.ts.map +1 -0
- package/dist/modules/analytics/hooks.js +12 -0
- package/dist/modules/analytics/models.d.ts +14 -0
- package/dist/modules/analytics/models.d.ts.map +1 -0
- package/dist/modules/analytics/models.js +118 -0
- package/dist/modules/analytics/module.d.ts +3 -0
- package/dist/modules/analytics/module.d.ts.map +1 -0
- package/dist/modules/analytics/module.js +18 -0
- package/dist/modules/analytics/repository/index.d.ts +5 -0
- package/dist/modules/analytics/repository/index.d.ts.map +1 -0
- package/dist/modules/analytics/repository/index.js +1 -0
- package/dist/modules/analytics/service.d.ts +45 -0
- package/dist/modules/analytics/service.d.ts.map +1 -0
- package/dist/modules/analytics/service.js +196 -0
- package/dist/modules/analytics/types.d.ts +119 -0
- package/dist/modules/analytics/types.d.ts.map +1 -0
- package/dist/modules/analytics/types.js +25 -0
- package/dist/modules/audit/hooks.d.ts +7 -0
- package/dist/modules/audit/hooks.d.ts.map +1 -0
- package/dist/modules/audit/hooks.js +67 -0
- package/dist/modules/audit/index.d.ts +2 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +1 -0
- package/dist/modules/audit/module.d.ts +180 -0
- package/dist/modules/audit/module.d.ts.map +1 -0
- package/dist/modules/audit/module.js +8 -0
- package/dist/modules/audit/schema.d.ts +178 -0
- package/dist/modules/audit/schema.d.ts.map +1 -0
- package/dist/modules/audit/schema.js +21 -0
- package/dist/modules/audit/service.d.ts +38 -0
- package/dist/modules/audit/service.d.ts.map +1 -0
- package/dist/modules/audit/service.js +109 -0
- package/dist/modules/cart/access.d.ts +11 -0
- package/dist/modules/cart/access.d.ts.map +1 -0
- package/dist/modules/cart/access.js +18 -0
- package/dist/modules/cart/matcher.d.ts +20 -0
- package/dist/modules/cart/matcher.d.ts.map +1 -0
- package/dist/modules/cart/matcher.js +2 -0
- package/dist/modules/cart/module.d.ts +14 -0
- package/dist/modules/cart/module.d.ts.map +1 -0
- package/dist/modules/cart/module.js +17 -0
- package/dist/modules/cart/repository/index.d.ts +45 -0
- package/dist/modules/cart/repository/index.d.ts.map +1 -0
- package/dist/modules/cart/repository/index.js +158 -0
- package/dist/modules/cart/schema.d.ts +359 -0
- package/dist/modules/cart/schema.d.ts.map +1 -0
- package/dist/modules/cart/schema.js +40 -0
- package/dist/modules/cart/schemas.d.ts +29 -0
- package/dist/modules/cart/schemas.d.ts.map +1 -0
- package/dist/modules/cart/schemas.js +14 -0
- package/dist/modules/cart/service.d.ts +87 -0
- package/dist/modules/cart/service.d.ts.map +1 -0
- package/dist/modules/cart/service.js +454 -0
- package/dist/modules/catalog/brand-service.d.ts +18 -0
- package/dist/modules/catalog/brand-service.d.ts.map +1 -0
- package/dist/modules/catalog/brand-service.js +126 -0
- package/dist/modules/catalog/category-service.d.ts +17 -0
- package/dist/modules/catalog/category-service.d.ts.map +1 -0
- package/dist/modules/catalog/category-service.js +128 -0
- package/dist/modules/catalog/entity-service.d.ts +30 -0
- package/dist/modules/catalog/entity-service.d.ts.map +1 -0
- package/dist/modules/catalog/entity-service.js +481 -0
- package/dist/modules/catalog/module.d.ts +21 -0
- package/dist/modules/catalog/module.d.ts.map +1 -0
- package/dist/modules/catalog/module.js +28 -0
- package/dist/modules/catalog/repository/index.d.ts +106 -0
- package/dist/modules/catalog/repository/index.d.ts.map +1 -0
- package/dist/modules/catalog/repository/index.js +459 -0
- package/dist/modules/catalog/schema.d.ts +1193 -0
- package/dist/modules/catalog/schema.d.ts.map +1 -0
- package/dist/modules/catalog/schema.js +149 -0
- package/dist/modules/catalog/schemas.d.ts +81 -0
- package/dist/modules/catalog/schemas.d.ts.map +1 -0
- package/dist/modules/catalog/schemas.js +62 -0
- package/dist/modules/catalog/service.d.ts +167 -0
- package/dist/modules/catalog/service.d.ts.map +1 -0
- package/dist/modules/catalog/service.js +96 -0
- package/dist/modules/customers/index.d.ts +2 -0
- package/dist/modules/customers/index.d.ts.map +1 -0
- package/dist/modules/customers/index.js +1 -0
- package/dist/modules/customers/module.d.ts +563 -0
- package/dist/modules/customers/module.d.ts.map +1 -0
- package/dist/modules/customers/module.js +19 -0
- package/dist/modules/customers/repository/index.d.ts +47 -0
- package/dist/modules/customers/repository/index.d.ts.map +1 -0
- package/dist/modules/customers/repository/index.js +206 -0
- package/dist/modules/customers/schema.d.ts +560 -0
- package/dist/modules/customers/schema.d.ts.map +1 -0
- package/dist/modules/customers/schema.js +60 -0
- package/dist/modules/customers/service.d.ts +32 -0
- package/dist/modules/customers/service.d.ts.map +1 -0
- package/dist/modules/customers/service.js +132 -0
- package/dist/modules/fulfillment/module.d.ts +13 -0
- package/dist/modules/fulfillment/module.d.ts.map +1 -0
- package/dist/modules/fulfillment/module.js +22 -0
- package/dist/modules/fulfillment/repository/index.d.ts +63 -0
- package/dist/modules/fulfillment/repository/index.d.ts.map +1 -0
- package/dist/modules/fulfillment/repository/index.js +268 -0
- package/dist/modules/fulfillment/schema.d.ts +655 -0
- package/dist/modules/fulfillment/schema.d.ts.map +1 -0
- package/dist/modules/fulfillment/schema.js +83 -0
- package/dist/modules/fulfillment/service.d.ts +63 -0
- package/dist/modules/fulfillment/service.d.ts.map +1 -0
- package/dist/modules/fulfillment/service.js +351 -0
- package/dist/modules/fulfillment/types.d.ts +44 -0
- package/dist/modules/fulfillment/types.d.ts.map +1 -0
- package/dist/modules/fulfillment/types.js +1 -0
- package/dist/modules/inventory/module.d.ts +13 -0
- package/dist/modules/inventory/module.d.ts.map +1 -0
- package/dist/modules/inventory/module.js +20 -0
- package/dist/modules/inventory/repository/index.d.ts +96 -0
- package/dist/modules/inventory/repository/index.d.ts.map +1 -0
- package/dist/modules/inventory/repository/index.js +361 -0
- package/dist/modules/inventory/schema.d.ts +604 -0
- package/dist/modules/inventory/schema.d.ts.map +1 -0
- package/dist/modules/inventory/schema.js +78 -0
- package/dist/modules/inventory/schemas.d.ts +31 -0
- package/dist/modules/inventory/schemas.d.ts.map +1 -0
- package/dist/modules/inventory/schemas.js +28 -0
- package/dist/modules/inventory/service.d.ts +70 -0
- package/dist/modules/inventory/service.d.ts.map +1 -0
- package/dist/modules/inventory/service.js +284 -0
- package/dist/modules/media/adapter.d.ts +16 -0
- package/dist/modules/media/adapter.d.ts.map +1 -0
- package/dist/modules/media/adapter.js +1 -0
- package/dist/modules/media/index.d.ts +2 -0
- package/dist/modules/media/index.d.ts.map +1 -0
- package/dist/modules/media/index.js +1 -0
- package/dist/modules/media/module.d.ts +292 -0
- package/dist/modules/media/module.d.ts.map +1 -0
- package/dist/modules/media/module.js +22 -0
- package/dist/modules/media/repository/index.d.ts +35 -0
- package/dist/modules/media/repository/index.d.ts.map +1 -0
- package/dist/modules/media/repository/index.js +176 -0
- package/dist/modules/media/schema.d.ts +289 -0
- package/dist/modules/media/schema.d.ts.map +1 -0
- package/dist/modules/media/schema.js +35 -0
- package/dist/modules/media/service.d.ts +45 -0
- package/dist/modules/media/service.d.ts.map +1 -0
- package/dist/modules/media/service.js +149 -0
- package/dist/modules/orders/module.d.ts +25 -0
- package/dist/modules/orders/module.d.ts.map +1 -0
- package/dist/modules/orders/module.js +32 -0
- package/dist/modules/orders/repository/index.d.ts +48 -0
- package/dist/modules/orders/repository/index.d.ts.map +1 -0
- package/dist/modules/orders/repository/index.js +204 -0
- package/dist/modules/orders/schema.d.ts +689 -0
- package/dist/modules/orders/schema.d.ts.map +1 -0
- package/dist/modules/orders/schema.js +64 -0
- package/dist/modules/orders/sequences.d.ts +2 -0
- package/dist/modules/orders/sequences.d.ts.map +1 -0
- package/dist/modules/orders/sequences.js +5 -0
- package/dist/modules/orders/service.d.ts +81 -0
- package/dist/modules/orders/service.d.ts.map +1 -0
- package/dist/modules/orders/service.js +325 -0
- package/dist/modules/orders/stale-order-cleanup.d.ts +27 -0
- package/dist/modules/orders/stale-order-cleanup.d.ts.map +1 -0
- package/dist/modules/orders/stale-order-cleanup.js +55 -0
- package/dist/modules/organization/index.d.ts +2 -0
- package/dist/modules/organization/index.d.ts.map +1 -0
- package/dist/modules/organization/index.js +1 -0
- package/dist/modules/organization/module.d.ts +205 -0
- package/dist/modules/organization/module.d.ts.map +1 -0
- package/dist/modules/organization/module.js +8 -0
- package/dist/modules/organization/service.d.ts +53 -0
- package/dist/modules/organization/service.d.ts.map +1 -0
- package/dist/modules/organization/service.js +151 -0
- package/dist/modules/payments/adapter.d.ts +40 -0
- package/dist/modules/payments/adapter.d.ts.map +1 -0
- package/dist/modules/payments/adapter.js +1 -0
- package/dist/modules/payments/module.d.ts +3 -0
- package/dist/modules/payments/module.d.ts.map +1 -0
- package/dist/modules/payments/module.js +7 -0
- package/dist/modules/payments/repository/index.d.ts +5 -0
- package/dist/modules/payments/repository/index.d.ts.map +1 -0
- package/dist/modules/payments/repository/index.js +1 -0
- package/dist/modules/payments/service.d.ts +23 -0
- package/dist/modules/payments/service.d.ts.map +1 -0
- package/dist/modules/payments/service.js +72 -0
- package/dist/modules/pricing/index.d.ts +2 -0
- package/dist/modules/pricing/index.d.ts.map +1 -0
- package/dist/modules/pricing/index.js +1 -0
- package/dist/modules/pricing/module.d.ts +14 -0
- package/dist/modules/pricing/module.d.ts.map +1 -0
- package/dist/modules/pricing/module.js +16 -0
- package/dist/modules/pricing/repository/index.d.ts +34 -0
- package/dist/modules/pricing/repository/index.d.ts.map +1 -0
- package/dist/modules/pricing/repository/index.js +179 -0
- package/dist/modules/pricing/schema.d.ts +565 -0
- package/dist/modules/pricing/schema.d.ts.map +1 -0
- package/dist/modules/pricing/schema.js +57 -0
- package/dist/modules/pricing/schemas.d.ts +37 -0
- package/dist/modules/pricing/schemas.d.ts.map +1 -0
- package/dist/modules/pricing/schemas.js +30 -0
- package/dist/modules/pricing/service.d.ts +67 -0
- package/dist/modules/pricing/service.d.ts.map +1 -0
- package/dist/modules/pricing/service.js +329 -0
- package/dist/modules/promotions/module.d.ts +14 -0
- package/dist/modules/promotions/module.d.ts.map +1 -0
- package/dist/modules/promotions/module.js +18 -0
- package/dist/modules/promotions/repository/index.d.ts +41 -0
- package/dist/modules/promotions/repository/index.d.ts.map +1 -0
- package/dist/modules/promotions/repository/index.js +204 -0
- package/dist/modules/promotions/schema.d.ts +427 -0
- package/dist/modules/promotions/schema.d.ts.map +1 -0
- package/dist/modules/promotions/schema.js +52 -0
- package/dist/modules/promotions/schemas.d.ts +33 -0
- package/dist/modules/promotions/schemas.d.ts.map +1 -0
- package/dist/modules/promotions/schemas.js +32 -0
- package/dist/modules/promotions/service.d.ts +90 -0
- package/dist/modules/promotions/service.d.ts.map +1 -0
- package/dist/modules/promotions/service.js +387 -0
- package/dist/modules/search/adapter.d.ts +51 -0
- package/dist/modules/search/adapter.d.ts.map +1 -0
- package/dist/modules/search/adapter.js +1 -0
- package/dist/modules/search/hooks.d.ts +8 -0
- package/dist/modules/search/hooks.d.ts.map +1 -0
- package/dist/modules/search/hooks.js +6 -0
- package/dist/modules/search/module.d.ts +8 -0
- package/dist/modules/search/module.d.ts.map +1 -0
- package/dist/modules/search/module.js +17 -0
- package/dist/modules/search/repository/index.d.ts +5 -0
- package/dist/modules/search/repository/index.d.ts.map +1 -0
- package/dist/modules/search/repository/index.js +1 -0
- package/dist/modules/search/service.d.ts +24 -0
- package/dist/modules/search/service.d.ts.map +1 -0
- package/dist/modules/search/service.js +243 -0
- package/dist/modules/shipping/calculator.d.ts +42 -0
- package/dist/modules/shipping/calculator.d.ts.map +1 -0
- package/dist/modules/shipping/calculator.js +91 -0
- package/dist/modules/shipping/module.d.ts +8 -0
- package/dist/modules/shipping/module.d.ts.map +1 -0
- package/dist/modules/shipping/module.js +11 -0
- package/dist/modules/shipping/repository/index.d.ts +5 -0
- package/dist/modules/shipping/repository/index.d.ts.map +1 -0
- package/dist/modules/shipping/repository/index.js +1 -0
- package/dist/modules/shipping/service.d.ts +28 -0
- package/dist/modules/shipping/service.d.ts.map +1 -0
- package/dist/modules/shipping/service.js +20 -0
- package/dist/modules/tax/adapter.d.ts +58 -0
- package/dist/modules/tax/adapter.d.ts.map +1 -0
- package/dist/modules/tax/adapter.js +1 -0
- package/dist/modules/tax/module.d.ts +3 -0
- package/dist/modules/tax/module.d.ts.map +1 -0
- package/dist/modules/tax/module.js +9 -0
- package/dist/modules/tax/repository/index.d.ts +5 -0
- package/dist/modules/tax/repository/index.d.ts.map +1 -0
- package/dist/modules/tax/repository/index.js +1 -0
- package/dist/modules/tax/service.d.ts +19 -0
- package/dist/modules/tax/service.d.ts.map +1 -0
- package/dist/modules/tax/service.js +34 -0
- package/dist/modules/webhooks/hook.d.ts +13 -0
- package/dist/modules/webhooks/hook.d.ts.map +1 -0
- package/dist/modules/webhooks/hook.js +35 -0
- package/dist/modules/webhooks/index.d.ts +2 -0
- package/dist/modules/webhooks/index.d.ts.map +1 -0
- package/dist/modules/webhooks/index.js +1 -0
- package/dist/modules/webhooks/module.d.ts +403 -0
- package/dist/modules/webhooks/module.d.ts.map +1 -0
- package/dist/modules/webhooks/module.js +15 -0
- package/dist/modules/webhooks/repository/index.d.ts +40 -0
- package/dist/modules/webhooks/repository/index.d.ts.map +1 -0
- package/dist/modules/webhooks/repository/index.js +183 -0
- package/dist/modules/webhooks/schema.d.ts +404 -0
- package/dist/modules/webhooks/schema.d.ts.map +1 -0
- package/dist/modules/webhooks/schema.js +40 -0
- package/dist/modules/webhooks/service.d.ts +23 -0
- package/dist/modules/webhooks/service.d.ts.map +1 -0
- package/dist/modules/webhooks/service.js +94 -0
- package/dist/modules/webhooks/signing.d.ts +2 -0
- package/dist/modules/webhooks/signing.d.ts.map +1 -0
- package/dist/modules/webhooks/signing.js +5 -0
- package/dist/modules/webhooks/ssrf-guard.d.ts +19 -0
- package/dist/modules/webhooks/ssrf-guard.d.ts.map +1 -0
- package/dist/modules/webhooks/ssrf-guard.js +79 -0
- package/dist/modules/webhooks/tasks.d.ts +16 -0
- package/dist/modules/webhooks/tasks.d.ts.map +1 -0
- package/dist/modules/webhooks/tasks.js +42 -0
- package/dist/modules/webhooks/worker.d.ts +28 -0
- package/dist/modules/webhooks/worker.d.ts.map +1 -0
- package/dist/modules/webhooks/worker.js +133 -0
- package/dist/runtime/commerce.d.ts +110 -0
- package/dist/runtime/commerce.d.ts.map +1 -0
- package/dist/runtime/commerce.js +48 -0
- package/dist/runtime/kernel-modules.d.ts +1714 -0
- package/dist/runtime/kernel-modules.d.ts.map +1 -0
- package/dist/runtime/kernel-modules.js +62 -0
- package/dist/runtime/kernel-register-hooks.d.ts +4 -0
- package/dist/runtime/kernel-register-hooks.d.ts.map +1 -0
- package/dist/runtime/kernel-register-hooks.js +46 -0
- package/dist/runtime/kernel-types.d.ts +65 -0
- package/dist/runtime/kernel-types.d.ts.map +1 -0
- package/dist/runtime/kernel-types.js +36 -0
- package/dist/runtime/kernel.d.ts +6 -0
- package/dist/runtime/kernel.d.ts.map +1 -0
- package/dist/runtime/kernel.js +113 -0
- package/dist/runtime/logger.d.ts +11 -0
- package/dist/runtime/logger.d.ts.map +1 -0
- package/dist/runtime/logger.js +32 -0
- package/dist/runtime/server.d.ts +37 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +398 -0
- package/dist/runtime/shutdown.d.ts +15 -0
- package/dist/runtime/shutdown.d.ts.map +1 -0
- package/dist/runtime/shutdown.js +34 -0
- package/dist/runtime/url-alias-rewrite.d.ts +3 -0
- package/dist/runtime/url-alias-rewrite.d.ts.map +1 -0
- package/dist/runtime/url-alias-rewrite.js +33 -0
- package/dist/test-utils/create-pglite-adapter.d.ts +32 -0
- package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -0
- package/dist/test-utils/create-pglite-adapter.js +107 -0
- package/dist/test-utils/create-plugin-test-app.d.ts +50 -0
- package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -0
- package/dist/test-utils/create-plugin-test-app.js +90 -0
- package/dist/test-utils/create-repository-test-harness.d.ts +8 -0
- package/dist/test-utils/create-repository-test-harness.d.ts.map +1 -0
- package/dist/test-utils/create-repository-test-harness.js +7 -0
- package/dist/test-utils/create-test-config.d.ts +18 -0
- package/dist/test-utils/create-test-config.d.ts.map +1 -0
- package/dist/test-utils/create-test-config.js +172 -0
- package/dist/test-utils/create-test-kernel.d.ts +3 -0
- package/dist/test-utils/create-test-kernel.d.ts.map +1 -0
- package/dist/test-utils/create-test-kernel.js +5 -0
- package/dist/test-utils/create-test-plugin-context.d.ts +38 -0
- package/dist/test-utils/create-test-plugin-context.d.ts.map +1 -0
- package/dist/test-utils/create-test-plugin-context.js +39 -0
- package/dist/test-utils/rest-api-test-utils.d.ts +64 -0
- package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -0
- package/dist/test-utils/rest-api-test-utils.js +208 -0
- package/dist/test-utils/test-actors.d.ts +21 -0
- package/dist/test-utils/test-actors.d.ts.map +1 -0
- package/dist/test-utils/test-actors.js +64 -0
- package/dist/test-utils/typed-hooks.d.ts +44 -0
- package/dist/test-utils/typed-hooks.d.ts.map +1 -0
- package/dist/test-utils/typed-hooks.js +36 -0
- package/dist/testing.d.ts +15 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +13 -0
- package/dist/types/commerce-types.d.ts +34 -0
- package/dist/types/commerce-types.d.ts.map +1 -0
- package/dist/types/commerce-types.js +1 -0
- package/dist/utils/agent-prompt.d.ts +2 -0
- package/dist/utils/agent-prompt.d.ts.map +1 -0
- package/dist/utils/agent-prompt.js +12 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +3 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +16 -0
- package/dist/utils/pagination.d.ts +11 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +15 -0
- package/package.json +89 -0
- package/src/adapters/console-email.ts +43 -0
- package/src/auth/access.ts +187 -0
- package/src/auth/auth-schema.ts +139 -0
- package/src/auth/middleware.ts +257 -0
- package/src/auth/org.ts +83 -0
- package/src/auth/permissions.ts +28 -0
- package/src/auth/setup.ts +187 -0
- package/src/auth/strict-org-resolution.ts +14 -0
- package/src/auth/system-actor.ts +19 -0
- package/src/auth/types.ts +10 -0
- package/src/config/defaults.ts +85 -0
- package/src/config/define-config.ts +81 -0
- package/src/config/types.ts +417 -0
- package/src/drizzle.ts +95 -0
- package/src/generated/plugin-capabilities.d.ts +19 -0
- package/src/generated/plugin-manifest.ts +22 -0
- package/src/generated/plugin-repositories.d.ts +19 -0
- package/src/hooks/checkout-completion.ts +285 -0
- package/src/hooks/checkout.ts +695 -0
- package/src/hooks/order-emails.ts +62 -0
- package/src/index.ts +213 -0
- package/src/interfaces/rest/customer-portal.ts +299 -0
- package/src/interfaces/rest/index.ts +105 -0
- package/src/interfaces/rest/router.ts +333 -0
- package/src/interfaces/rest/routes/admin/compensation-failures.ts +160 -0
- package/src/interfaces/rest/routes/admin/permissions.ts +37 -0
- package/src/interfaces/rest/routes/admin-jobs.ts +58 -0
- package/src/interfaces/rest/routes/audit.ts +50 -0
- package/src/interfaces/rest/routes/carts.ts +100 -0
- package/src/interfaces/rest/routes/catalog.ts +508 -0
- package/src/interfaces/rest/routes/checkout.ts +289 -0
- package/src/interfaces/rest/routes/customers.ts +100 -0
- package/src/interfaces/rest/routes/inventory.ts +93 -0
- package/src/interfaces/rest/routes/media.ts +87 -0
- package/src/interfaces/rest/routes/orders.ts +78 -0
- package/src/interfaces/rest/routes/payments.ts +60 -0
- package/src/interfaces/rest/routes/pricing.ts +78 -0
- package/src/interfaces/rest/routes/promotions.ts +96 -0
- package/src/interfaces/rest/routes/search.ts +81 -0
- package/src/interfaces/rest/routes/webhooks.ts +49 -0
- package/src/interfaces/rest/schemas/admin-jobs.ts +40 -0
- package/src/interfaces/rest/schemas/admin-permissions.ts +27 -0
- package/src/interfaces/rest/schemas/audit.ts +46 -0
- package/src/interfaces/rest/schemas/carts.ts +125 -0
- package/src/interfaces/rest/schemas/catalog.ts +450 -0
- package/src/interfaces/rest/schemas/checkout.ts +66 -0
- package/src/interfaces/rest/schemas/compensation-failures.ts +89 -0
- package/src/interfaces/rest/schemas/customer-portal.ts +195 -0
- package/src/interfaces/rest/schemas/customers.ts +155 -0
- package/src/interfaces/rest/schemas/inventory.ts +159 -0
- package/src/interfaces/rest/schemas/media.ts +75 -0
- package/src/interfaces/rest/schemas/orders.ts +104 -0
- package/src/interfaces/rest/schemas/pricing.ts +80 -0
- package/src/interfaces/rest/schemas/promotions.ts +116 -0
- package/src/interfaces/rest/schemas/responses.ts +96 -0
- package/src/interfaces/rest/schemas/search.ts +58 -0
- package/src/interfaces/rest/schemas/shared.ts +62 -0
- package/src/interfaces/rest/schemas/webhooks.ts +68 -0
- package/src/interfaces/rest/utils.ts +104 -0
- package/src/interfaces/rest/webhook-router.ts +50 -0
- package/src/kernel/compensation/executor.ts +123 -0
- package/src/kernel/compensation/repository.ts +157 -0
- package/src/kernel/compensation/schema.ts +45 -0
- package/src/kernel/compensation/types.ts +30 -0
- package/src/kernel/database/adapter.ts +21 -0
- package/src/kernel/database/drizzle-db.ts +56 -0
- package/src/kernel/database/migrate.ts +76 -0
- package/src/kernel/database/plugin-db-context.ts +14 -0
- package/src/kernel/database/plugin-types.ts +34 -0
- package/src/kernel/database/schema.ts +53 -0
- package/src/kernel/database/scoped-db.ts +112 -0
- package/src/kernel/database/tx-context.ts +46 -0
- package/src/kernel/error-mapper.ts +118 -0
- package/src/kernel/errors.ts +100 -0
- package/src/kernel/factory/repository-factory.ts +244 -0
- package/src/kernel/hooks/create-context.ts +52 -0
- package/src/kernel/hooks/executor.ts +95 -0
- package/src/kernel/hooks/registry.ts +74 -0
- package/src/kernel/hooks/types.ts +55 -0
- package/src/kernel/http-error.ts +44 -0
- package/src/kernel/jobs/adapter.ts +36 -0
- package/src/kernel/jobs/builtin-job-tasks.ts +17 -0
- package/src/kernel/jobs/drizzle-adapter.ts +65 -0
- package/src/kernel/jobs/reaper.ts +95 -0
- package/src/kernel/jobs/runner.ts +157 -0
- package/src/kernel/jobs/schema.ts +46 -0
- package/src/kernel/jobs/types.ts +42 -0
- package/src/kernel/local-api.ts +188 -0
- package/src/kernel/module/define.ts +36 -0
- package/src/kernel/module/index.ts +3 -0
- package/src/kernel/module/topo-sort.ts +99 -0
- package/src/kernel/plugin/manifest.ts +310 -0
- package/src/kernel/query/executor.ts +184 -0
- package/src/kernel/query/registry.ts +46 -0
- package/src/kernel/result.ts +33 -0
- package/src/kernel/service-registry.ts +76 -0
- package/src/kernel/service-timing.ts +89 -0
- package/src/kernel/state-machine/machine.ts +101 -0
- package/src/modules/analytics/drizzle-adapter.ts +426 -0
- package/src/modules/analytics/hooks.ts +11 -0
- package/src/modules/analytics/models.ts +125 -0
- package/src/modules/analytics/module.ts +25 -0
- package/src/modules/analytics/repository/index.ts +6 -0
- package/src/modules/analytics/service.ts +245 -0
- package/src/modules/analytics/types.ts +180 -0
- package/src/modules/audit/hooks.ts +78 -0
- package/src/modules/audit/index.ts +1 -0
- package/src/modules/audit/module.ts +11 -0
- package/src/modules/audit/schema.ts +33 -0
- package/src/modules/audit/service.ts +151 -0
- package/src/modules/cart/access.ts +27 -0
- package/src/modules/cart/matcher.ts +26 -0
- package/src/modules/cart/module.ts +32 -0
- package/src/modules/cart/repository/index.ts +234 -0
- package/src/modules/cart/schema.ts +42 -0
- package/src/modules/cart/schemas.ts +38 -0
- package/src/modules/cart/service.ts +710 -0
- package/src/modules/catalog/brand-service.ts +101 -0
- package/src/modules/catalog/category-service.ts +103 -0
- package/src/modules/catalog/entity-service.ts +469 -0
- package/src/modules/catalog/module.ts +65 -0
- package/src/modules/catalog/repository/index.ts +777 -0
- package/src/modules/catalog/schema.ts +203 -0
- package/src/modules/catalog/schemas.ts +104 -0
- package/src/modules/catalog/service.ts +392 -0
- package/src/modules/customers/index.ts +1 -0
- package/src/modules/customers/module.ts +27 -0
- package/src/modules/customers/repository/index.ts +327 -0
- package/src/modules/customers/schema.ts +64 -0
- package/src/modules/customers/service.ts +276 -0
- package/src/modules/fulfillment/module.ts +42 -0
- package/src/modules/fulfillment/repository/index.ts +426 -0
- package/src/modules/fulfillment/schema.ts +101 -0
- package/src/modules/fulfillment/service.ts +581 -0
- package/src/modules/fulfillment/types.ts +59 -0
- package/src/modules/inventory/module.ts +37 -0
- package/src/modules/inventory/repository/index.ts +677 -0
- package/src/modules/inventory/schema.ts +107 -0
- package/src/modules/inventory/schemas.ts +38 -0
- package/src/modules/inventory/service.ts +567 -0
- package/src/modules/media/adapter.ts +17 -0
- package/src/modules/media/index.ts +1 -0
- package/src/modules/media/module.ts +25 -0
- package/src/modules/media/repository/index.ts +274 -0
- package/src/modules/media/schema.ts +41 -0
- package/src/modules/media/service.ts +237 -0
- package/src/modules/orders/module.ts +66 -0
- package/src/modules/orders/repository/index.ts +290 -0
- package/src/modules/orders/schema.ts +67 -0
- package/src/modules/orders/sequences.ts +6 -0
- package/src/modules/orders/service.ts +639 -0
- package/src/modules/orders/stale-order-cleanup.ts +76 -0
- package/src/modules/organization/index.ts +1 -0
- package/src/modules/organization/module.ts +11 -0
- package/src/modules/organization/service.ts +191 -0
- package/src/modules/payments/adapter.ts +45 -0
- package/src/modules/payments/module.ts +14 -0
- package/src/modules/payments/repository/index.ts +6 -0
- package/src/modules/payments/service.ts +107 -0
- package/src/modules/pricing/index.ts +1 -0
- package/src/modules/pricing/module.ts +30 -0
- package/src/modules/pricing/repository/index.ts +305 -0
- package/src/modules/pricing/schema.ts +71 -0
- package/src/modules/pricing/schemas.ts +38 -0
- package/src/modules/pricing/service.ts +557 -0
- package/src/modules/promotions/module.ts +32 -0
- package/src/modules/promotions/repository/index.ts +325 -0
- package/src/modules/promotions/schema.ts +62 -0
- package/src/modules/promotions/schemas.ts +38 -0
- package/src/modules/promotions/service.ts +674 -0
- package/src/modules/search/adapter.ts +57 -0
- package/src/modules/search/hooks.ts +12 -0
- package/src/modules/search/module.ts +26 -0
- package/src/modules/search/repository/index.ts +6 -0
- package/src/modules/search/service.ts +341 -0
- package/src/modules/shipping/calculator.ts +188 -0
- package/src/modules/shipping/module.ts +23 -0
- package/src/modules/shipping/repository/index.ts +6 -0
- package/src/modules/shipping/service.ts +51 -0
- package/src/modules/tax/adapter.ts +60 -0
- package/src/modules/tax/module.ts +16 -0
- package/src/modules/tax/repository/index.ts +6 -0
- package/src/modules/tax/service.ts +53 -0
- package/src/modules/webhooks/hook.ts +41 -0
- package/src/modules/webhooks/index.ts +1 -0
- package/src/modules/webhooks/module.ts +22 -0
- package/src/modules/webhooks/repository/index.ts +304 -0
- package/src/modules/webhooks/schema.ts +56 -0
- package/src/modules/webhooks/service.ts +127 -0
- package/src/modules/webhooks/signing.ts +6 -0
- package/src/modules/webhooks/ssrf-guard.ts +71 -0
- package/src/modules/webhooks/tasks.ts +60 -0
- package/src/modules/webhooks/worker.ts +171 -0
- package/src/runtime/commerce.ts +158 -0
- package/src/runtime/kernel-modules.ts +66 -0
- package/src/runtime/kernel-register-hooks.ts +63 -0
- package/src/runtime/kernel-types.ts +109 -0
- package/src/runtime/kernel.ts +159 -0
- package/src/runtime/logger.ts +36 -0
- package/src/runtime/server.ts +470 -0
- package/src/runtime/shutdown.ts +43 -0
- package/src/runtime/url-alias-rewrite.ts +40 -0
- package/src/test-utils/create-pglite-adapter.ts +129 -0
- package/src/test-utils/create-plugin-test-app.ts +151 -0
- package/src/test-utils/create-repository-test-harness.ts +16 -0
- package/src/test-utils/create-test-config.ts +188 -0
- package/src/test-utils/create-test-kernel.ts +7 -0
- package/src/test-utils/create-test-plugin-context.ts +66 -0
- package/src/test-utils/rest-api-test-utils.ts +266 -0
- package/src/test-utils/test-actors.ts +70 -0
- package/src/test-utils/typed-hooks.ts +55 -0
- package/src/testing.ts +21 -0
- package/src/types/commerce-types.ts +34 -0
- package/src/utils/agent-prompt.ts +12 -0
- package/src/utils/id.ts +3 -0
- package/src/utils/logger.ts +18 -0
- package/src/utils/pagination.ts +22 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
3
|
+
import { cors } from "hono/cors";
|
|
4
|
+
import { csrf } from "hono/csrf";
|
|
5
|
+
import { bodyLimit } from "hono/body-limit";
|
|
6
|
+
import { rateLimiter } from "hono-rate-limiter";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import type { Actor } from "../auth/types.js";
|
|
9
|
+
import type { AuthInstance } from "../auth/setup.js";
|
|
10
|
+
import type { CommerceConfig } from "../config/types.js";
|
|
11
|
+
import { authMiddleware } from "../auth/middleware.js";
|
|
12
|
+
import { createRestRoutes } from "../interfaces/rest/index.js";
|
|
13
|
+
import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.js";
|
|
14
|
+
import { createKernel } from "./kernel.js";
|
|
15
|
+
import { ensureDefaultOrg } from "../auth/org.js";
|
|
16
|
+
import { createLogger, type Logger } from "./logger.js";
|
|
17
|
+
import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
|
|
18
|
+
import { createCommerce, type CommerceInstance } from "./commerce.js";
|
|
19
|
+
import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
|
|
20
|
+
import { mapErrorToResponse } from "../kernel/error-mapper.js";
|
|
21
|
+
|
|
22
|
+
type ServerEnv = {
|
|
23
|
+
Variables: {
|
|
24
|
+
auth: AuthInstance;
|
|
25
|
+
actor: Actor | null;
|
|
26
|
+
requestId: string;
|
|
27
|
+
logger: Logger;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Returns true if running in a Node-like runtime that supports
|
|
33
|
+
* `process.on()` + `process.exit()`. Edge runtimes (Cloudflare Workers,
|
|
34
|
+
* Vercel Edge) return false — caller should skip process-crash handlers
|
|
35
|
+
* and defer unhandled errors to the platform.
|
|
36
|
+
*
|
|
37
|
+
* Exposed for direct unit testing — see test/server-edge-runtime.test.ts.
|
|
38
|
+
*/
|
|
39
|
+
export function isNodeRuntime(): boolean {
|
|
40
|
+
return (
|
|
41
|
+
typeof process !== "undefined" &&
|
|
42
|
+
typeof process.on === "function" &&
|
|
43
|
+
typeof process.exit === "function"
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function hashRateLimitEmail(email: string): string {
|
|
48
|
+
return createHash("sha256")
|
|
49
|
+
.update(email.trim().toLowerCase())
|
|
50
|
+
.digest("hex");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function matchPathPattern(path: string, pattern: string): boolean {
|
|
54
|
+
if (pattern.endsWith("*")) {
|
|
55
|
+
return path.startsWith(pattern.slice(0, -1));
|
|
56
|
+
}
|
|
57
|
+
return path === pattern;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Create a full HTTP server (Hono) with all REST routes, auth, and middleware.
|
|
62
|
+
*
|
|
63
|
+
* For server-side frameworks (Next.js, TanStack Start, SvelteKit), use
|
|
64
|
+
* `createCommerce()` instead — it gives you a local API without HTTP overhead.
|
|
65
|
+
*/
|
|
66
|
+
export async function createServer(config: CommerceConfig) {
|
|
67
|
+
const commerce = await createCommerce(config);
|
|
68
|
+
const { kernel, auth, logger } = commerce;
|
|
69
|
+
const isProdEnv = process.env.NODE_ENV === "production";
|
|
70
|
+
|
|
71
|
+
const app = new OpenAPIHono<ServerEnv>({
|
|
72
|
+
defaultHook: (result, c) => {
|
|
73
|
+
if (!result.success) {
|
|
74
|
+
return c.json({
|
|
75
|
+
error: {
|
|
76
|
+
code: "VALIDATION_FAILED",
|
|
77
|
+
message: isProdEnv
|
|
78
|
+
? "Invalid input."
|
|
79
|
+
: result.error.issues
|
|
80
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
81
|
+
.join("; "),
|
|
82
|
+
},
|
|
83
|
+
}, 422);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// ─── Security Guards ──────────────────────────────────────────────
|
|
89
|
+
if ((config.auth as Record<string, unknown>)?.enableDevKey !== undefined) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
"FATAL: auth.enableDevKey has been removed. " +
|
|
92
|
+
"Use 'bunx @porulle/cli api-key create --scope admin' to generate a real API key. " +
|
|
93
|
+
"See RFC-050: https://github.com/octalpixel/unified-commerce/blob/main/RFC-050-AUTH-KEY-SCOPING.md",
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
if ((config.auth as Record<string, unknown>)?.devKey !== undefined) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
"FATAL: auth.devKey has been removed. " +
|
|
99
|
+
"Use 'bunx @porulle/cli api-key create --scope admin' to generate a real API key. " +
|
|
100
|
+
"See RFC-050: https://github.com/octalpixel/unified-commerce/blob/main/RFC-050-AUTH-KEY-SCOPING.md",
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// exposed for direct unit testing — see test/server-edge-runtime.test.ts
|
|
105
|
+
// ─── Process Crash Handlers (F4) ─────────────────────────────────────
|
|
106
|
+
if (isNodeRuntime()) {
|
|
107
|
+
process.on("unhandledRejection", (reason) => {
|
|
108
|
+
logger.fatal({ err: reason }, "unhandled promise rejection -- exiting");
|
|
109
|
+
process.exit(1);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
process.on("uncaughtException", (err) => {
|
|
113
|
+
logger.fatal({ err }, "uncaught exception -- exiting");
|
|
114
|
+
process.exit(1);
|
|
115
|
+
});
|
|
116
|
+
} else {
|
|
117
|
+
logger.info("running on edge runtime — process crash handlers skipped");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ─── Security Response Headers ──────────────────────────────────────
|
|
121
|
+
app.use("*", async (c, next) => {
|
|
122
|
+
c.header("X-Content-Type-Options", "nosniff");
|
|
123
|
+
c.header("X-Frame-Options", "DENY");
|
|
124
|
+
c.header("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
125
|
+
c.header("Permissions-Policy", "camera=(), microphone=(), geolocation=()");
|
|
126
|
+
if (isProdEnv) {
|
|
127
|
+
c.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
|
|
128
|
+
}
|
|
129
|
+
await next();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// ─── Request ID + Logging (F2, F12) ──────────────────────────────────
|
|
133
|
+
app.use("*", async (c, next) => {
|
|
134
|
+
const requestId = c.req.header("x-request-id") ?? crypto.randomUUID();
|
|
135
|
+
c.header("x-request-id", requestId);
|
|
136
|
+
c.set("requestId", requestId);
|
|
137
|
+
const child = logger.child({ requestId, method: c.req.method, path: c.req.path });
|
|
138
|
+
c.set("logger", child);
|
|
139
|
+
|
|
140
|
+
const start = performance.now();
|
|
141
|
+
await next();
|
|
142
|
+
|
|
143
|
+
// Sanitize ZodError responses in production.
|
|
144
|
+
// @hono/zod-openapi returns { success: false, error: { name: "ZodError" } }
|
|
145
|
+
// which leaks schema details. The library does not respect defaultHook for
|
|
146
|
+
// this format, so we intercept at the response level.
|
|
147
|
+
if (isProdEnv && c.res.status >= 400 && c.res.status < 500) {
|
|
148
|
+
const ct = c.res.headers.get("content-type");
|
|
149
|
+
if (ct?.includes("json")) {
|
|
150
|
+
try {
|
|
151
|
+
const body = await c.res.clone().json();
|
|
152
|
+
if (body?.error?.name === "ZodError") {
|
|
153
|
+
c.res = new Response(
|
|
154
|
+
JSON.stringify({ error: { code: "VALIDATION_FAILED", message: "Invalid input." } }),
|
|
155
|
+
{ status: 422, headers: { "content-type": "application/json" } },
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
} catch { /* non-parseable, skip */ }
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const duration = Math.round(performance.now() - start);
|
|
163
|
+
|
|
164
|
+
child.info({ status: c.res.status, durationMs: duration }, "request completed");
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// ─── CORS (hardened by default) ──────────────────────────────────────
|
|
168
|
+
const trustedOrigins = config.auth?.trustedOrigins ?? [];
|
|
169
|
+
app.use("*", cors({
|
|
170
|
+
origin: trustedOrigins.length > 0
|
|
171
|
+
? trustedOrigins
|
|
172
|
+
: (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
|
|
173
|
+
credentials: true,
|
|
174
|
+
allowMethods: ["GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"],
|
|
175
|
+
allowHeaders: ["Content-Type", "Authorization", "x-api-key", "x-request-id"],
|
|
176
|
+
maxAge: 86400,
|
|
177
|
+
}));
|
|
178
|
+
|
|
179
|
+
// ─── CSRF Protection (F14) ──────────────────────────────────────────
|
|
180
|
+
app.use("/api/*", csrf({
|
|
181
|
+
origin: trustedOrigins.length > 0
|
|
182
|
+
? trustedOrigins
|
|
183
|
+
: (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
|
|
184
|
+
}));
|
|
185
|
+
|
|
186
|
+
// ─── Body Size Limit (F6) ──────────────────────────────────────────
|
|
187
|
+
app.use("*", bodyLimit({
|
|
188
|
+
maxSize: 1024 * 1024, // 1 MB default
|
|
189
|
+
onError: (c) => c.json({
|
|
190
|
+
error: { code: "PAYLOAD_TOO_LARGE", message: "Request body exceeds 1MB limit." },
|
|
191
|
+
}, 413),
|
|
192
|
+
}));
|
|
193
|
+
|
|
194
|
+
// ─── Rate Limiting (F1) ──────────────────────────────────────────────
|
|
195
|
+
// Trust X-Forwarded-For ONLY from a known reverse proxy IP.
|
|
196
|
+
// Set TRUSTED_PROXY_IP env var to the proxy's IP (e.g., "127.0.0.1").
|
|
197
|
+
const trustedProxyIp = process.env.TRUSTED_PROXY_IP;
|
|
198
|
+
const signInEmailRateKeyCache = new WeakMap<Request, string>();
|
|
199
|
+
const getClientIp = (c: { req: { raw: unknown; header: (name: string) => string | undefined } }): string => {
|
|
200
|
+
const raw = c.req.raw as { socket?: { remoteAddress?: string } };
|
|
201
|
+
const remoteAddress = raw.socket?.remoteAddress;
|
|
202
|
+
// Only trust X-Forwarded-For when the direct connection is from a trusted proxy
|
|
203
|
+
if (trustedProxyIp && remoteAddress === trustedProxyIp) {
|
|
204
|
+
const xff = c.req.header("x-forwarded-for")?.split(",")[0]?.trim();
|
|
205
|
+
if (xff) return xff;
|
|
206
|
+
}
|
|
207
|
+
return remoteAddress ?? "unknown";
|
|
208
|
+
};
|
|
209
|
+
const keyGenerator = getClientIp;
|
|
210
|
+
|
|
211
|
+
app.use("/api/auth/*", rateLimiter({
|
|
212
|
+
windowMs: 60 * 1000,
|
|
213
|
+
limit: config.rateLimits?.auth ?? 10,
|
|
214
|
+
keyGenerator,
|
|
215
|
+
}));
|
|
216
|
+
|
|
217
|
+
app.use("/api/auth/sign-in/email", async (c, next) => {
|
|
218
|
+
if (c.req.method !== "POST") {
|
|
219
|
+
await next();
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const payload = await c.req.raw.clone().json() as { email?: unknown };
|
|
224
|
+
if (typeof payload.email === "string" && payload.email.trim().length > 0) {
|
|
225
|
+
signInEmailRateKeyCache.set(c.req.raw, hashRateLimitEmail(payload.email));
|
|
226
|
+
}
|
|
227
|
+
} catch {
|
|
228
|
+
// Ignore parse failures; endpoint validation will handle malformed bodies.
|
|
229
|
+
}
|
|
230
|
+
await next();
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
app.use("/api/auth/sign-in/email", rateLimiter({
|
|
234
|
+
windowMs: 15 * 60 * 1000,
|
|
235
|
+
limit: config.rateLimits?.signInPerEmail ?? 10,
|
|
236
|
+
keyGenerator: (c) =>
|
|
237
|
+
signInEmailRateKeyCache.get(c.req.raw) ?? "signin-email:unknown",
|
|
238
|
+
}));
|
|
239
|
+
|
|
240
|
+
app.use("/api/checkout", rateLimiter({
|
|
241
|
+
windowMs: 60 * 1000,
|
|
242
|
+
limit: config.rateLimits?.checkout ?? 5,
|
|
243
|
+
keyGenerator,
|
|
244
|
+
}));
|
|
245
|
+
|
|
246
|
+
app.use("/api/*", rateLimiter({
|
|
247
|
+
windowMs: 60 * 1000,
|
|
248
|
+
limit: config.rateLimits?.api ?? 100,
|
|
249
|
+
keyGenerator,
|
|
250
|
+
}));
|
|
251
|
+
|
|
252
|
+
app.use("*", async (c, next) => {
|
|
253
|
+
await next();
|
|
254
|
+
const csp = config.security?.csp;
|
|
255
|
+
if (!csp) return;
|
|
256
|
+
// Recommended checkout policy baseline (adjust provider domains):
|
|
257
|
+
// default-src 'self'; script-src 'self' https://js.stripe.com; frame-src https://js.stripe.com https://hooks.stripe.com; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
|
|
258
|
+
const routePolicy = Object.entries(csp.perRoute ?? {}).find(([pattern]) =>
|
|
259
|
+
matchPathPattern(c.req.path, pattern),
|
|
260
|
+
)?.[1];
|
|
261
|
+
const policy = routePolicy ?? csp.default;
|
|
262
|
+
if (policy) {
|
|
263
|
+
c.header("Content-Security-Policy", policy);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// ─── Custom Middleware ──────────────────────────────────────────────
|
|
268
|
+
if (config.middleware) {
|
|
269
|
+
for (const middleware of config.middleware) {
|
|
270
|
+
app.use("*", middleware);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// ─── Auth ──────────────────────────────────────────────────────────
|
|
275
|
+
app.use("/api/auth/*", async (c, next) => {
|
|
276
|
+
if (c.req.path.startsWith("/api/auth/pos/")) {
|
|
277
|
+
await next();
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
return auth.handler(c.req.raw);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
app.use("*", authMiddleware(auth, config));
|
|
284
|
+
app.use("*", async (c, next) => {
|
|
285
|
+
c.set("auth", auth);
|
|
286
|
+
await next();
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// ─── Global Error Handler ─────────────────────────────────────────
|
|
290
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
291
|
+
app.onError((err, c) => {
|
|
292
|
+
const { body, status } = mapErrorToResponse(err, isProd, logger);
|
|
293
|
+
return c.json(body, status);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// ─── Routes ──────────────────────────────────────────────────────────
|
|
297
|
+
app.route("/api", createRestRoutes(kernel));
|
|
298
|
+
// Mounted under /api so the auth middleware, rate limiter, CSRF, and
|
|
299
|
+
// body-limit stack apply (all are scoped to /api/*).
|
|
300
|
+
app.route("/api/me", createCustomerPortalRoutes(kernel));
|
|
301
|
+
|
|
302
|
+
if (config.routes) {
|
|
303
|
+
config.routes(app, kernel);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// OpenAPI spec — disabled in production unless explicitly enabled
|
|
307
|
+
const exposeSpec = config.exposeOpenApiSpec ?? !isProd;
|
|
308
|
+
if (exposeSpec) {
|
|
309
|
+
app.doc("/api/doc", {
|
|
310
|
+
openapi: "3.0.0",
|
|
311
|
+
info: {
|
|
312
|
+
title: "UnifiedCommerce API",
|
|
313
|
+
version: config.version ?? "0.0.1",
|
|
314
|
+
description: "Headless commerce engine REST API. Includes core and plugin endpoints.",
|
|
315
|
+
},
|
|
316
|
+
tags: [
|
|
317
|
+
// ── Entity aliases (generated from config.entities[type].alias) ──
|
|
318
|
+
...Object.entries(config.entities ?? {})
|
|
319
|
+
.filter(([, cfg]) => cfg.alias)
|
|
320
|
+
.map(([type, cfg]) => {
|
|
321
|
+
const name = cfg.alias!.charAt(0).toUpperCase() + cfg.alias!.slice(1);
|
|
322
|
+
return { name, description: `Ergonomic alias for ${type} entities — CRUD, variants, attributes` };
|
|
323
|
+
}),
|
|
324
|
+
// ── Storefront ──
|
|
325
|
+
{ name: "Catalog", description: "Products, categories, brands, variants, and option types (unified entity API)" },
|
|
326
|
+
{ name: "Search", description: "Full-text search and typeahead suggestions" },
|
|
327
|
+
{ name: "Pricing", description: "Base prices, price modifiers, and customer group pricing" },
|
|
328
|
+
{ name: "Carts", description: "Shopping cart lifecycle — create, add items, update quantities" },
|
|
329
|
+
{ name: "Checkout", description: "Convert a cart into a paid order" },
|
|
330
|
+
{ name: "Promotions", description: "Discount codes, validation, and usage tracking" },
|
|
331
|
+
// ── Admin ──
|
|
332
|
+
{ name: "Orders", description: "Order management — list, detail, status transitions, fulfillments" },
|
|
333
|
+
{ name: "Customers", description: "Customer profiles, addresses, groups, and order history" },
|
|
334
|
+
{ name: "Inventory", description: "Stock levels, warehouse management, adjustments, and reservations" },
|
|
335
|
+
{ name: "Media", description: "File uploads, entity attachments, and signed URLs" },
|
|
336
|
+
{ name: "Payments", description: "Payment provider webhooks and event processing" },
|
|
337
|
+
// ── Operations ──
|
|
338
|
+
{ name: "Webhooks", description: "Outbound webhook endpoint registration and management" },
|
|
339
|
+
{ name: "Audit", description: "Immutable audit log — who changed what and when" },
|
|
340
|
+
{ name: "Admin Jobs", description: "Background job queue — view failed jobs and retry" },
|
|
341
|
+
],
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// Serve enriched spec with x-tagGroups vendor extension (Scalar/Redocly sidebar grouping)
|
|
345
|
+
const aliasTags = Object.values(config.entities ?? {})
|
|
346
|
+
.filter((cfg) => cfg.alias)
|
|
347
|
+
.map((cfg) => cfg.alias!.charAt(0).toUpperCase() + cfg.alias!.slice(1));
|
|
348
|
+
const tagGroups = [
|
|
349
|
+
...(aliasTags.length > 0 ? [{ name: "Quick Access", tags: aliasTags }] : []),
|
|
350
|
+
{ name: "Storefront", tags: ["Catalog", "Search", "Pricing", "Carts", "Checkout", "Promotions"] },
|
|
351
|
+
{ name: "Admin", tags: ["Orders", "Customers", "Inventory", "Media", "Payments"] },
|
|
352
|
+
{ name: "Operations", tags: ["Webhooks", "Audit", "Admin Jobs"] },
|
|
353
|
+
];
|
|
354
|
+
app.get("/api/doc-ext", (c) => {
|
|
355
|
+
const spec = app.getOpenAPIDocument({ openapi: "3.0.0", info: { title: "UnifiedCommerce API", version: config.version ?? "0.0.1" } });
|
|
356
|
+
return c.json({ ...spec, "x-tagGroups": tagGroups });
|
|
357
|
+
});
|
|
358
|
+
} else {
|
|
359
|
+
app.get("/api/doc", (c) => c.json({ error: { code: "NOT_FOUND", message: "Not found." } }, 404));
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// ─── Job Queue ───────────────────────────────────────────────────────
|
|
363
|
+
// Background job processing: webhook delivery, stale-job reaper, scheduled work.
|
|
364
|
+
//
|
|
365
|
+
// Three runner strategies (inspired by Payload CMS):
|
|
366
|
+
// 1. autorun: in-process polling (long-running servers)
|
|
367
|
+
// 2. GET /api/jobs/run: cron endpoint (serverless — Vercel, Cloudflare)
|
|
368
|
+
// 3. runPendingJobs() export (custom worker process)
|
|
369
|
+
|
|
370
|
+
const { runPendingJobs } = await import("../kernel/jobs/runner.js");
|
|
371
|
+
const { runStaleJobReaper, getJobReapThresholdMs, getJobsReaperIntervalMs } =
|
|
372
|
+
await import("../kernel/jobs/reaper.js");
|
|
373
|
+
const taskMap = new Map<string, unknown>();
|
|
374
|
+
for (const task of config.jobs?.tasks ?? []) {
|
|
375
|
+
const t = task as { slug?: string; name?: string };
|
|
376
|
+
taskMap.set(t.slug ?? t.name ?? "", task);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const jobLogger = {
|
|
380
|
+
info: (msg: string, data?: unknown) => logger.info(data != null ? { data } : {}, msg),
|
|
381
|
+
warn: (msg: string, data?: unknown) => logger.warn(data != null ? { data } : {}, msg),
|
|
382
|
+
error: (msg: string, data?: unknown) => logger.error(data != null ? { data } : {}, msg),
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
let lastStaleJobReaperAt = 0;
|
|
386
|
+
|
|
387
|
+
const maybeRunStaleJobReaper = async () => {
|
|
388
|
+
const interval = getJobsReaperIntervalMs();
|
|
389
|
+
const now = Date.now();
|
|
390
|
+
if (now - lastStaleJobReaperAt < interval) return;
|
|
391
|
+
lastStaleJobReaperAt = now;
|
|
392
|
+
try {
|
|
393
|
+
await runStaleJobReaper(
|
|
394
|
+
kernel.database.db as DrizzleDatabase,
|
|
395
|
+
getJobReapThresholdMs(),
|
|
396
|
+
jobLogger,
|
|
397
|
+
);
|
|
398
|
+
} catch (err) {
|
|
399
|
+
logger.error({ err }, "Stale job reaper failed");
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
const runJobs = async (queue?: string, limit?: number) => {
|
|
404
|
+
await maybeRunStaleJobReaper();
|
|
405
|
+
return runPendingJobs({
|
|
406
|
+
db: kernel.database.db as DrizzleDatabase,
|
|
407
|
+
tasks: taskMap as Parameters<typeof runPendingJobs>[0]["tasks"],
|
|
408
|
+
queue: queue ?? "default",
|
|
409
|
+
limit: limit ?? 10,
|
|
410
|
+
logger: jobLogger,
|
|
411
|
+
services: kernel.services as Parameters<typeof runPendingJobs>[0]["services"],
|
|
412
|
+
});
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
// Strategy 1: Built-in cron endpoint for serverless deployments.
|
|
416
|
+
// Point Vercel Cron or Cloudflare Cron Trigger at GET /api/jobs/run
|
|
417
|
+
// Optional query params: ?queue=emails&limit=20
|
|
418
|
+
app.get("/api/jobs/run", async (c) => {
|
|
419
|
+
// Always require admin — cron triggers must authenticate
|
|
420
|
+
const actor = c.get("actor") as { permissions?: string[] } | null;
|
|
421
|
+
if (!actor?.permissions?.includes("*:*")) {
|
|
422
|
+
return c.json({ error: { code: "FORBIDDEN", message: "Job runner requires admin access" } }, 403);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
const queue = c.req.query("queue") ?? "default";
|
|
426
|
+
const limit = parseInt(c.req.query("limit") ?? "10", 10);
|
|
427
|
+
|
|
428
|
+
try {
|
|
429
|
+
const result = await runJobs(queue, limit);
|
|
430
|
+
return c.json({ data: result });
|
|
431
|
+
} catch (err) {
|
|
432
|
+
logger.error({ err }, "Job runner endpoint failed");
|
|
433
|
+
return c.json({ error: { code: "INTERNAL_ERROR", message: "Job processing failed" } }, 500);
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
// Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
|
|
438
|
+
// Enable via config.jobs.autorun.enabled = true
|
|
439
|
+
if (config.jobs?.autorun?.enabled) {
|
|
440
|
+
const intervalMs = config.jobs.autorun.intervalMs ?? 10_000;
|
|
441
|
+
|
|
442
|
+
const jobInterval = setInterval(async () => {
|
|
443
|
+
try {
|
|
444
|
+
await runJobs();
|
|
445
|
+
} catch (err) {
|
|
446
|
+
logger.error({ err }, "Job runner iteration failed");
|
|
447
|
+
}
|
|
448
|
+
}, intervalMs);
|
|
449
|
+
|
|
450
|
+
const cleanup = () => clearInterval(jobInterval);
|
|
451
|
+
process.on("SIGTERM", cleanup);
|
|
452
|
+
process.on("SIGINT", cleanup);
|
|
453
|
+
|
|
454
|
+
logger.info({ intervalMs }, "Job queue autorun started (in-process polling)");
|
|
455
|
+
} else {
|
|
456
|
+
logger.info(
|
|
457
|
+
"Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
|
|
458
|
+
"or set config.jobs.autorun.enabled = true for in-process polling.",
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const dispatchFetch = app.fetch.bind(app);
|
|
463
|
+
app.fetch = ((input: RequestInfo | URL, env?: unknown, executionCtx?: unknown) => {
|
|
464
|
+
const req = input instanceof Request ? input : new Request(input);
|
|
465
|
+
const rewritten = rewriteCommerceAliasRequest(req, config.entities);
|
|
466
|
+
return dispatchFetch(rewritten as Request, env as never, executionCtx as never);
|
|
467
|
+
}) as typeof app.fetch;
|
|
468
|
+
|
|
469
|
+
return { app, kernel, logger, commerce };
|
|
470
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Logger } from "./logger.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sets up graceful shutdown handlers for SIGTERM and SIGINT.
|
|
5
|
+
*
|
|
6
|
+
* On signal:
|
|
7
|
+
* 1. Stops accepting new connections
|
|
8
|
+
* 2. Runs cleanup (close DB pool, flush logs)
|
|
9
|
+
* 3. Force-exits after timeout if cleanup hangs
|
|
10
|
+
*/
|
|
11
|
+
export function setupGracefulShutdown(opts: {
|
|
12
|
+
cleanup: () => Promise<void>;
|
|
13
|
+
logger: Logger;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
}): void {
|
|
16
|
+
const { cleanup, logger, timeoutMs = 30_000 } = opts;
|
|
17
|
+
let isShuttingDown = false;
|
|
18
|
+
|
|
19
|
+
async function shutdown(signal: string) {
|
|
20
|
+
if (isShuttingDown) return;
|
|
21
|
+
isShuttingDown = true;
|
|
22
|
+
|
|
23
|
+
logger.info({ signal }, "shutdown signal received, draining connections");
|
|
24
|
+
|
|
25
|
+
const forceTimer = setTimeout(() => {
|
|
26
|
+
logger.error("shutdown timeout exceeded, forcing exit");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}, timeoutMs);
|
|
29
|
+
forceTimer.unref();
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
await cleanup();
|
|
33
|
+
logger.info("graceful shutdown complete");
|
|
34
|
+
process.exit(0);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
logger.error({ err }, "error during shutdown");
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
42
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
43
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CommerceConfig } from "../config/types.js";
|
|
2
|
+
|
|
3
|
+
export function rewriteCommerceAliasRequest(
|
|
4
|
+
request: Request,
|
|
5
|
+
entities: CommerceConfig["entities"] | undefined,
|
|
6
|
+
): Request {
|
|
7
|
+
const url = new URL(request.url);
|
|
8
|
+
const path = url.pathname;
|
|
9
|
+
|
|
10
|
+
for (const [entityType, entityConfig] of Object.entries(entities ?? {})) {
|
|
11
|
+
if (!entityConfig.alias) continue;
|
|
12
|
+
const alias = entityConfig.alias;
|
|
13
|
+
const prefix = `/api/${alias}`;
|
|
14
|
+
if (path === prefix) {
|
|
15
|
+
url.pathname = "/api/catalog/entities";
|
|
16
|
+
if (request.method === "GET") {
|
|
17
|
+
url.searchParams.set("type", entityType);
|
|
18
|
+
}
|
|
19
|
+
return new Request(url.toString(), request);
|
|
20
|
+
}
|
|
21
|
+
if (path.startsWith(`${prefix}/`)) {
|
|
22
|
+
url.pathname = path.replace(prefix, "/api/catalog/entities");
|
|
23
|
+
return new Request(url.toString(), request);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for (const [shortcut, target] of [["categories", "catalog/categories"], ["brands", "catalog/brands"]] as const) {
|
|
28
|
+
const prefix = `/api/${shortcut}`;
|
|
29
|
+
if (path === prefix) {
|
|
30
|
+
url.pathname = `/api/${target}`;
|
|
31
|
+
return new Request(url.toString(), request);
|
|
32
|
+
}
|
|
33
|
+
if (path.startsWith(`${prefix}/`)) {
|
|
34
|
+
url.pathname = path.replace(prefix, `/api/${target}`);
|
|
35
|
+
return new Request(url.toString(), request);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return request;
|
|
40
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PGlite-backed test adapter for real PostgreSQL behavior in tests.
|
|
3
|
+
*
|
|
4
|
+
* Creates an in-memory PGlite (WASM PostgreSQL) instance, pushes the
|
|
5
|
+
* core Drizzle schema programmatically via drizzle-kit/api, and provides
|
|
6
|
+
* a cleanup function to reset data between tests.
|
|
7
|
+
*
|
|
8
|
+
* Benefits over in-memory repository doubles:
|
|
9
|
+
* - Real SQL execution (Drizzle query generation)
|
|
10
|
+
* - PostgreSQL type coercion and constraint enforcement
|
|
11
|
+
* - Real transaction rollback semantics
|
|
12
|
+
* - Production parity for query edge cases
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { PGlite } from "@electric-sql/pglite";
|
|
16
|
+
import { drizzle } from "drizzle-orm/pglite";
|
|
17
|
+
import { sql } from "drizzle-orm";
|
|
18
|
+
import { createRequire } from "node:module";
|
|
19
|
+
import type { DatabaseAdapter } from "../kernel/database/adapter.js";
|
|
20
|
+
import { getSchema } from "../kernel/database/migrate.js";
|
|
21
|
+
import { ensureDefaultOrg } from "../auth/org.js";
|
|
22
|
+
|
|
23
|
+
// Single barrel import --- includes all core modules + auth tables
|
|
24
|
+
import * as fullSchema from "../kernel/database/schema.js";
|
|
25
|
+
import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
|
|
26
|
+
|
|
27
|
+
// drizzle-kit/api uses CJS internally; createRequire provides ESM compat.
|
|
28
|
+
const require = createRequire(import.meta.url);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Pushes the core Drizzle schema to the database using drizzle-kit/api.
|
|
32
|
+
*
|
|
33
|
+
* drizzle-kit introspects the live database via information_schema, diffs
|
|
34
|
+
* against the pgTable definitions, and generates the minimal DDL needed.
|
|
35
|
+
* Typed as DrizzleDatabase (our concrete schema type) to avoid the
|
|
36
|
+
* PGlite → PgDatabase<HKT> invariance cast — drizzle-kit accepts any
|
|
37
|
+
* Drizzle instance at runtime regardless of the schema generic.
|
|
38
|
+
*/
|
|
39
|
+
async function pushCoreSchema(db: DrizzleDatabase): Promise<void> {
|
|
40
|
+
const coreSchema = getSchema();
|
|
41
|
+
const drizzleKit = require("drizzle-kit/api") as {
|
|
42
|
+
pushSchema(
|
|
43
|
+
imports: Record<string, unknown>,
|
|
44
|
+
drizzleInstance: DrizzleDatabase,
|
|
45
|
+
): Promise<{ apply: () => Promise<void> }>;
|
|
46
|
+
};
|
|
47
|
+
const { apply } = await drizzleKit.pushSchema(coreSchema, db);
|
|
48
|
+
await apply();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates a PGlite-backed database adapter for testing.
|
|
53
|
+
*
|
|
54
|
+
* Each call creates a new isolated PGlite instance with its own
|
|
55
|
+
* in-memory database. Core schema is pushed once during initialization.
|
|
56
|
+
*
|
|
57
|
+
* @returns A promise resolving to an object containing:
|
|
58
|
+
* - adapter: The DatabaseAdapter for use with createKernel
|
|
59
|
+
* - db: The Drizzle ORM instance for direct queries
|
|
60
|
+
* - cleanup: Function to truncate all tables (call between tests)
|
|
61
|
+
*/
|
|
62
|
+
export async function createPGliteTestAdapter(): Promise<{
|
|
63
|
+
adapter: DatabaseAdapter;
|
|
64
|
+
db: DrizzleDatabase;
|
|
65
|
+
cleanup: () => Promise<void>;
|
|
66
|
+
}> {
|
|
67
|
+
// Create in-memory PGlite instance
|
|
68
|
+
const pg = new PGlite();
|
|
69
|
+
|
|
70
|
+
// Wrap with Drizzle ORM first (pushSchema needs the Drizzle instance)
|
|
71
|
+
const db = drizzle(pg, { schema: fullSchema });
|
|
72
|
+
|
|
73
|
+
// Push core schema via drizzle-kit/api (no migration files needed)
|
|
74
|
+
// PgliteDatabase<Schema> and DrizzleDatabase share the same Schema type;
|
|
75
|
+
// the HKT parameter differs (PgliteQueryResultHKT vs PgQueryResultHKT)
|
|
76
|
+
// but drizzle-kit's pushSchema doesn't use it at runtime.
|
|
77
|
+
await pushCoreSchema(db as DrizzleDatabase);
|
|
78
|
+
|
|
79
|
+
// Ensure the default organization exists for all tests
|
|
80
|
+
await ensureDefaultOrg(db);
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* PGlite-compatible transaction wrapper.
|
|
84
|
+
*
|
|
85
|
+
* Drizzle's transaction() method can hang with PGlite due to how
|
|
86
|
+
* the adapter manages transaction state. This implementation uses
|
|
87
|
+
* manual BEGIN/COMMIT control which works more reliably.
|
|
88
|
+
*/
|
|
89
|
+
async function transaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T> {
|
|
90
|
+
await pg.exec("BEGIN");
|
|
91
|
+
try {
|
|
92
|
+
const result = await fn(db);
|
|
93
|
+
await pg.exec("COMMIT");
|
|
94
|
+
return result;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
await pg.exec("ROLLBACK");
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const adapter: DatabaseAdapter = {
|
|
102
|
+
provider: "postgresql",
|
|
103
|
+
db,
|
|
104
|
+
transaction,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Cleanup function to reset data between tests.
|
|
109
|
+
* Truncates all tables in reverse dependency order with CASCADE.
|
|
110
|
+
*/
|
|
111
|
+
async function cleanup(): Promise<void> {
|
|
112
|
+
await db.execute(sql`
|
|
113
|
+
DO $$ DECLARE
|
|
114
|
+
r RECORD;
|
|
115
|
+
BEGIN
|
|
116
|
+
FOR r IN (
|
|
117
|
+
SELECT tablename FROM pg_tables
|
|
118
|
+
WHERE schemaname = 'public'
|
|
119
|
+
) LOOP
|
|
120
|
+
EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' CASCADE';
|
|
121
|
+
END LOOP;
|
|
122
|
+
END $$;
|
|
123
|
+
`);
|
|
124
|
+
// Re-insert default org after truncation (CASCADE wipes it)
|
|
125
|
+
await ensureDefaultOrg(db);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return { adapter, db, cleanup };
|
|
129
|
+
}
|