@unifiedcommerce/core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +1383 -0
- package/dist/auth/auth-schema.d.ts.map +1 -0
- package/dist/auth/auth-schema.js +117 -0
- package/dist/auth/middleware.d.ts +5 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +91 -0
- package/dist/auth/org.d.ts +22 -0
- package/dist/auth/org.d.ts.map +1 -0
- package/dist/auth/org.js +36 -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/pos.d.ts +3 -0
- package/dist/auth/pos.d.ts.map +1 -0
- package/dist/auth/pos.js +62 -0
- package/dist/auth/setup.d.ts +31 -0
- package/dist/auth/setup.d.ts.map +1 -0
- package/dist/auth/setup.js +106 -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 +80 -0
- package/dist/config/define-config.d.ts +9 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +44 -0
- package/dist/config/types.d.ts +299 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +1 -0
- package/dist/generated/plugin-manifest.d.ts +48 -0
- package/dist/generated/plugin-manifest.d.ts.map +1 -0
- package/dist/generated/plugin-manifest.js +20 -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 +137 -0
- package/dist/hooks/checkout.d.ts +99 -0
- package/dist/hooks/checkout.d.ts.map +1 -0
- package/dist/hooks/checkout.js +317 -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 +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13381 -0
- package/dist/index.js.map +156 -0
- package/dist/interfaces/graphql/index.d.ts +4 -0
- package/dist/interfaces/graphql/index.d.ts.map +1 -0
- package/dist/interfaces/graphql/index.js +415 -0
- package/dist/interfaces/mcp/agent-prompt.d.ts +16 -0
- package/dist/interfaces/mcp/agent-prompt.d.ts.map +1 -0
- package/dist/interfaces/mcp/agent-prompt.js +172 -0
- package/dist/interfaces/mcp/context-enrichment.d.ts +39 -0
- package/dist/interfaces/mcp/context-enrichment.d.ts.map +1 -0
- package/dist/interfaces/mcp/context-enrichment.js +119 -0
- package/dist/interfaces/mcp/server.d.ts +7 -0
- package/dist/interfaces/mcp/server.d.ts.map +1 -0
- package/dist/interfaces/mcp/server.js +515 -0
- package/dist/interfaces/mcp/transport.d.ts +5 -0
- package/dist/interfaces/mcp/transport.d.ts.map +1 -0
- package/dist/interfaces/mcp/transport.js +52 -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 +68 -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-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 +55 -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 +256 -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 +216 -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 +59 -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 +65 -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 +48 -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 +75 -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 +60 -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/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 +1446 -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 +5416 -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/customer-portal.d.ts +2197 -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/inventory.d.ts +469 -0
- package/dist/interfaces/rest/schemas/inventory.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/inventory.js +128 -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 +1782 -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 +363 -0
- package/dist/interfaces/rest/schemas/promotions.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/promotions.js +98 -0
- package/dist/interfaces/rest/schemas/responses.d.ts +4062 -0
- package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/responses.js +63 -0
- package/dist/interfaces/rest/schemas/search.d.ts +245 -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 +36 -0
- package/dist/kernel/compensation/types.d.ts +25 -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 +10 -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-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 +24 -0
- package/dist/kernel/database/schema.d.ts.map +1 -0
- package/dist/kernel/database/schema.js +36 -0
- package/dist/kernel/database/scoped-db.d.ts +20 -0
- package/dist/kernel/database/scoped-db.d.ts.map +1 -0
- package/dist/kernel/database/scoped-db.js +62 -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 +3 -0
- package/dist/kernel/error-mapper.d.ts.map +1 -0
- package/dist/kernel/error-mapper.js +12 -0
- package/dist/kernel/errors.d.ts +38 -0
- package/dist/kernel/errors.d.ts.map +1 -0
- package/dist/kernel/errors.js +69 -0
- package/dist/kernel/factory/in-memory-repository-factory.d.ts +20 -0
- package/dist/kernel/factory/in-memory-repository-factory.d.ts.map +1 -0
- package/dist/kernel/factory/in-memory-repository-factory.js +83 -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 +136 -0
- package/dist/kernel/hooks/create-context.d.ts +25 -0
- package/dist/kernel/hooks/create-context.d.ts.map +1 -0
- package/dist/kernel/hooks/create-context.js +22 -0
- package/dist/kernel/hooks/executor.d.ts +12 -0
- package/dist/kernel/hooks/executor.d.ts.map +1 -0
- package/dist/kernel/hooks/executor.js +50 -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 +37 -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/drizzle-adapter.d.ts +15 -0
- package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -0
- package/dist/kernel/jobs/drizzle-adapter.js +42 -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 +114 -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 +30 -0
- package/dist/kernel/jobs/types.d.ts.map +1 -0
- package/dist/kernel/jobs/types.js +1 -0
- package/dist/kernel/local-api.d.ts +103 -0
- package/dist/kernel/local-api.d.ts.map +1 -0
- package/dist/kernel/local-api.js +87 -0
- package/dist/kernel/plugin/capability-registry.d.ts +9 -0
- package/dist/kernel/plugin/capability-registry.d.ts.map +1 -0
- package/dist/kernel/plugin/capability-registry.js +28 -0
- package/dist/kernel/plugin/dependency-graph.d.ts +6 -0
- package/dist/kernel/plugin/dependency-graph.d.ts.map +1 -0
- package/dist/kernel/plugin/dependency-graph.js +55 -0
- package/dist/kernel/plugin/manifest.d.ts +90 -0
- package/dist/kernel/plugin/manifest.d.ts.map +1 -0
- package/dist/kernel/plugin/manifest.js +140 -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/schema/extra-columns.d.ts +23 -0
- package/dist/kernel/schema/extra-columns.d.ts.map +1 -0
- package/dist/kernel/schema/extra-columns.js +10 -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/cubes.d.ts +19 -0
- package/dist/modules/analytics/cubes.d.ts.map +1 -0
- package/dist/modules/analytics/cubes.js +187 -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/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/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/repository/in-memory.d.ts +30 -0
- package/dist/modules/cart/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/cart/repository/in-memory.js +159 -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 +63 -0
- package/dist/modules/cart/service.d.ts.map +1 -0
- package/dist/modules/cart/service.js +339 -0
- package/dist/modules/catalog/repository/in-memory.d.ts +82 -0
- package/dist/modules/catalog/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/catalog/repository/in-memory.js +444 -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 +455 -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 +160 -0
- package/dist/modules/catalog/service.d.ts.map +1 -0
- package/dist/modules/catalog/service.js +759 -0
- package/dist/modules/customers/repository/in-memory.d.ts +37 -0
- package/dist/modules/customers/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/customers/repository/in-memory.js +278 -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 +25 -0
- package/dist/modules/customers/service.d.ts.map +1 -0
- package/dist/modules/customers/service.js +91 -0
- package/dist/modules/fulfillment/repository/in-memory.d.ts +53 -0
- package/dist/modules/fulfillment/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/fulfillment/repository/in-memory.js +327 -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 +58 -0
- package/dist/modules/fulfillment/service.d.ts.map +1 -0
- package/dist/modules/fulfillment/service.js +338 -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/repository/in-memory.d.ts +51 -0
- package/dist/modules/inventory/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/inventory/repository/in-memory.js +281 -0
- package/dist/modules/inventory/repository/index.d.ts +81 -0
- package/dist/modules/inventory/repository/index.d.ts.map +1 -0
- package/dist/modules/inventory/repository/index.js +310 -0
- package/dist/modules/inventory/schema.d.ts +570 -0
- package/dist/modules/inventory/schema.d.ts.map +1 -0
- package/dist/modules/inventory/schema.js +69 -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 +65 -0
- package/dist/modules/inventory/service.d.ts.map +1 -0
- package/dist/modules/inventory/service.js +271 -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/repository/in-memory.d.ts +26 -0
- package/dist/modules/media/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/media/repository/in-memory.js +145 -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 +42 -0
- package/dist/modules/media/service.d.ts.map +1 -0
- package/dist/modules/media/service.js +89 -0
- package/dist/modules/orders/repository/in-memory.d.ts +40 -0
- package/dist/modules/orders/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/orders/repository/in-memory.js +245 -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 +199 -0
- package/dist/modules/orders/schema.d.ts +672 -0
- package/dist/modules/orders/schema.d.ts.map +1 -0
- package/dist/modules/orders/schema.js +63 -0
- package/dist/modules/orders/service.d.ts +85 -0
- package/dist/modules/orders/service.d.ts.map +1 -0
- package/dist/modules/orders/service.js +313 -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/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 +42 -0
- package/dist/modules/payments/adapter.d.ts.map +1 -0
- package/dist/modules/payments/adapter.js +1 -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/repository/in-memory.d.ts +25 -0
- package/dist/modules/pricing/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/pricing/repository/in-memory.js +288 -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 +176 -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 +62 -0
- package/dist/modules/pricing/service.d.ts.map +1 -0
- package/dist/modules/pricing/service.js +308 -0
- package/dist/modules/promotions/repository/in-memory.d.ts +32 -0
- package/dist/modules/promotions/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/promotions/repository/in-memory.js +227 -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 +80 -0
- package/dist/modules/promotions/service.d.ts.map +1 -0
- package/dist/modules/promotions/service.js +347 -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/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 +217 -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/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/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 +29 -0
- package/dist/modules/webhooks/repository/in-memory.d.ts +31 -0
- package/dist/modules/webhooks/repository/in-memory.d.ts.map +1 -0
- package/dist/modules/webhooks/repository/in-memory.js +187 -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 +175 -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 +92 -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 +35 -0
- package/dist/modules/webhooks/worker.d.ts +21 -0
- package/dist/modules/webhooks/worker.d.ts.map +1 -0
- package/dist/modules/webhooks/worker.js +113 -0
- package/dist/runtime/commerce.d.ts +110 -0
- package/dist/runtime/commerce.d.ts.map +1 -0
- package/dist/runtime/commerce.js +37 -0
- package/dist/runtime/kernel.d.ts +72 -0
- package/dist/runtime/kernel.d.ts.map +1 -0
- package/dist/runtime/kernel.js +298 -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 +28 -0
- package/dist/runtime/server.d.ts.map +1 -0
- package/dist/runtime/server.js +277 -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/state-manager.d.ts +14 -0
- package/dist/runtime/state-manager.d.ts.map +1 -0
- package/dist/runtime/state-manager.js +84 -0
- package/dist/runtime/state-repository.d.ts +13 -0
- package/dist/runtime/state-repository.d.ts.map +1 -0
- package/dist/runtime/state-repository.js +160 -0
- package/dist/runtime/state.d.ts +382 -0
- package/dist/runtime/state.d.ts.map +1 -0
- package/dist/runtime/state.js +37 -0
- package/dist/runtime/store.d.ts +382 -0
- package/dist/runtime/store.d.ts.map +1 -0
- package/dist/runtime/store.js +37 -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 +106 -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 +74 -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 +174 -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 +42 -0
- package/dist/test-utils/create-test-plugin-context.d.ts.map +1 -0
- package/dist/test-utils/create-test-plugin-context.js +46 -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 +207 -0
- package/dist/test-utils/test-actors.d.ts +15 -0
- package/dist/test-utils/test-actors.d.ts.map +1 -0
- package/dist/test-utils/test-actors.js +57 -0
- package/dist/test-utils/typed-hooks.d.ts +43 -0
- package/dist/test-utils/typed-hooks.d.ts.map +1 -0
- package/dist/test-utils/typed-hooks.js +35 -0
- package/dist/tsconfig.tsbuildinfo +1 -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/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 +63 -0
- package/src/adapters/console-email.ts +43 -0
- package/src/auth/access.ts +187 -0
- package/src/auth/auth-schema.ts +131 -0
- package/src/auth/middleware.ts +115 -0
- package/src/auth/org.ts +41 -0
- package/src/auth/permissions.ts +28 -0
- package/src/auth/setup.ts +160 -0
- package/src/auth/system-actor.ts +19 -0
- package/src/auth/types.ts +10 -0
- package/src/config/defaults.ts +82 -0
- package/src/config/define-config.ts +53 -0
- package/src/config/types.ts +299 -0
- package/src/generated/plugin-capabilities.d.ts +20 -0
- package/src/generated/plugin-manifest.ts +23 -0
- package/src/generated/plugin-repositories.d.ts +20 -0
- package/src/hooks/checkout-completion.ts +262 -0
- package/src/hooks/checkout.ts +677 -0
- package/src/hooks/order-emails.ts +62 -0
- package/src/index.ts +214 -0
- package/src/interfaces/mcp/agent-prompt.ts +174 -0
- package/src/interfaces/mcp/context-enrichment.ts +177 -0
- package/src/interfaces/mcp/server.ts +617 -0
- package/src/interfaces/mcp/transport.ts +68 -0
- package/src/interfaces/rest/customer-portal.ts +299 -0
- package/src/interfaces/rest/index.ts +74 -0
- package/src/interfaces/rest/router.ts +334 -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 +89 -0
- package/src/interfaces/rest/routes/catalog.ts +493 -0
- package/src/interfaces/rest/routes/checkout.ts +283 -0
- package/src/interfaces/rest/routes/inventory.ts +70 -0
- package/src/interfaces/rest/routes/media.ts +86 -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 +57 -0
- package/src/interfaces/rest/routes/promotions.ts +92 -0
- package/src/interfaces/rest/routes/search.ts +71 -0
- package/src/interfaces/rest/routes/webhooks.ts +46 -0
- package/src/interfaces/rest/schemas/admin-jobs.ts +40 -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/customer-portal.ts +195 -0
- package/src/interfaces/rest/schemas/inventory.ts +138 -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 +110 -0
- package/src/interfaces/rest/schemas/responses.ts +85 -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 +61 -0
- package/src/kernel/compensation/types.ts +26 -0
- package/src/kernel/database/adapter.ts +13 -0
- package/src/kernel/database/drizzle-db.ts +56 -0
- package/src/kernel/database/migrate.ts +76 -0
- package/src/kernel/database/plugin-types.ts +34 -0
- package/src/kernel/database/schema.ts +49 -0
- package/src/kernel/database/scoped-db.ts +68 -0
- package/src/kernel/database/tx-context.ts +46 -0
- package/src/kernel/error-mapper.ts +15 -0
- package/src/kernel/errors.ts +89 -0
- package/src/kernel/factory/repository-factory.ts +242 -0
- package/src/kernel/hooks/create-context.ts +43 -0
- package/src/kernel/hooks/executor.ts +88 -0
- package/src/kernel/hooks/registry.ts +74 -0
- package/src/kernel/hooks/types.ts +52 -0
- package/src/kernel/http-error.ts +44 -0
- package/src/kernel/jobs/adapter.ts +36 -0
- package/src/kernel/jobs/drizzle-adapter.ts +58 -0
- package/src/kernel/jobs/runner.ts +153 -0
- package/src/kernel/jobs/schema.ts +46 -0
- package/src/kernel/jobs/types.ts +30 -0
- package/src/kernel/local-api.ts +185 -0
- package/src/kernel/plugin/manifest.ts +253 -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/schema/extra-columns.ts +37 -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/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/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/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 +541 -0
- package/src/modules/catalog/repository/index.ts +772 -0
- package/src/modules/catalog/schema.ts +203 -0
- package/src/modules/catalog/schemas.ts +104 -0
- package/src/modules/catalog/service.ts +1544 -0
- package/src/modules/customers/repository/index.ts +327 -0
- package/src/modules/customers/schema.ts +64 -0
- package/src/modules/customers/service.ts +171 -0
- package/src/modules/fulfillment/repository/index.ts +426 -0
- package/src/modules/fulfillment/schema.ts +101 -0
- package/src/modules/fulfillment/service.ts +555 -0
- package/src/modules/fulfillment/types.ts +59 -0
- package/src/modules/inventory/repository/index.ts +509 -0
- package/src/modules/inventory/schema.ts +94 -0
- package/src/modules/inventory/schemas.ts +38 -0
- package/src/modules/inventory/service.ts +490 -0
- package/src/modules/media/adapter.ts +17 -0
- package/src/modules/media/repository/index.ts +274 -0
- package/src/modules/media/schema.ts +41 -0
- package/src/modules/media/service.ts +151 -0
- package/src/modules/orders/repository/index.ts +287 -0
- package/src/modules/orders/schema.ts +66 -0
- package/src/modules/orders/service.ts +619 -0
- package/src/modules/orders/stale-order-cleanup.ts +76 -0
- package/src/modules/organization/service.ts +191 -0
- package/src/modules/payments/adapter.ts +47 -0
- package/src/modules/payments/repository/index.ts +6 -0
- package/src/modules/payments/service.ts +107 -0
- package/src/modules/pricing/repository/index.ts +291 -0
- package/src/modules/pricing/schema.ts +71 -0
- package/src/modules/pricing/schemas.ts +38 -0
- package/src/modules/pricing/service.ts +494 -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 +598 -0
- package/src/modules/search/adapter.ts +57 -0
- package/src/modules/search/hooks.ts +12 -0
- package/src/modules/search/repository/index.ts +6 -0
- package/src/modules/search/service.ts +315 -0
- package/src/modules/shipping/calculator.ts +188 -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/repository/index.ts +6 -0
- package/src/modules/tax/service.ts +53 -0
- package/src/modules/webhooks/hook.ts +34 -0
- package/src/modules/webhooks/repository/index.ts +278 -0
- package/src/modules/webhooks/schema.ts +56 -0
- package/src/modules/webhooks/service.ts +117 -0
- package/src/modules/webhooks/signing.ts +6 -0
- package/src/modules/webhooks/ssrf-guard.ts +71 -0
- package/src/modules/webhooks/tasks.ts +52 -0
- package/src/modules/webhooks/worker.ts +134 -0
- package/src/runtime/commerce.ts +145 -0
- package/src/runtime/kernel.ts +419 -0
- package/src/runtime/logger.ts +36 -0
- package/src/runtime/server.ts +345 -0
- package/src/runtime/shutdown.ts +43 -0
- package/src/test-utils/create-pglite-adapter.ts +129 -0
- package/src/test-utils/create-plugin-test-app.ts +128 -0
- package/src/test-utils/create-repository-test-harness.ts +16 -0
- package/src/test-utils/create-test-config.ts +190 -0
- package/src/test-utils/create-test-kernel.ts +7 -0
- package/src/test-utils/create-test-plugin-context.ts +75 -0
- package/src/test-utils/rest-api-test-utils.ts +265 -0
- package/src/test-utils/test-actors.ts +62 -0
- package/src/test-utils/typed-hooks.ts +54 -0
- package/src/types/commerce-types.ts +34 -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,298 @@
|
|
|
1
|
+
import { HookRegistry } from "../kernel/hooks/registry";
|
|
2
|
+
import { createDatabaseConnection, } from "../kernel/database/adapter";
|
|
3
|
+
import { CatalogServiceImpl } from "../modules/catalog/service";
|
|
4
|
+
import { CatalogRepository } from "../modules/catalog/repository";
|
|
5
|
+
import { InventoryRepository } from "../modules/inventory/repository";
|
|
6
|
+
import { CartRepository } from "../modules/cart/repository";
|
|
7
|
+
import { OrdersRepository } from "../modules/orders/repository";
|
|
8
|
+
import { CustomersRepository } from "../modules/customers/repository";
|
|
9
|
+
import { PricingRepository } from "../modules/pricing/repository";
|
|
10
|
+
import { PromotionsRepository } from "../modules/promotions/repository";
|
|
11
|
+
import { FulfillmentRepository } from "../modules/fulfillment/repository";
|
|
12
|
+
import { WebhooksRepository } from "../modules/webhooks/repository";
|
|
13
|
+
import { MediaRepository } from "../modules/media/repository";
|
|
14
|
+
import { InventoryService } from "../modules/inventory/service";
|
|
15
|
+
import { MediaService } from "../modules/media/service";
|
|
16
|
+
import { CartService } from "../modules/cart/service";
|
|
17
|
+
import { OrderService } from "../modules/orders/service";
|
|
18
|
+
import { PaymentsService } from "../modules/payments/service";
|
|
19
|
+
import { FulfillmentService } from "../modules/fulfillment/service";
|
|
20
|
+
import { CustomerService } from "../modules/customers/service";
|
|
21
|
+
import { WebhookService } from "../modules/webhooks/service";
|
|
22
|
+
import { AnalyticsService } from "../modules/analytics/service";
|
|
23
|
+
import { DrizzleAnalyticsAdapter } from "../modules/analytics/drizzle-adapter";
|
|
24
|
+
import { BUILTIN_ANALYTICS_MODELS } from "../modules/analytics/models";
|
|
25
|
+
import { PricingService } from "../modules/pricing/service";
|
|
26
|
+
import { PromotionService } from "../modules/promotions/service";
|
|
27
|
+
import { TaxService } from "../modules/tax/service";
|
|
28
|
+
import { ShippingService } from "../modules/shipping/service";
|
|
29
|
+
import { SearchService } from "../modules/search/service";
|
|
30
|
+
import { WebhookDeliveryWorker } from "../modules/webhooks/worker";
|
|
31
|
+
import { createAuditService, } from "../modules/audit/service";
|
|
32
|
+
import { OrganizationService } from "../modules/organization/service";
|
|
33
|
+
import { createLogger } from "../utils/logger";
|
|
34
|
+
import { withTiming } from "../kernel/service-timing";
|
|
35
|
+
import { extendOrderStateMachine } from "../kernel/state-machine/machine";
|
|
36
|
+
import { DEFAULT_ORG_ID } from "../auth/org";
|
|
37
|
+
import { deliverWebhooks } from "../modules/webhooks/hook";
|
|
38
|
+
// Analytics event recording hooks removed (RFC-006): source tables ARE the events.
|
|
39
|
+
// The DrizzleAnalyticsAdapter queries orders/inventory directly via SQL.
|
|
40
|
+
import { syncToSearchIndex } from "../modules/search/hooks";
|
|
41
|
+
import { auditHooks } from "../modules/audit/hooks";
|
|
42
|
+
import { sendOrderStatusEmail } from "../hooks/order-emails";
|
|
43
|
+
import { DrizzleJobsAdapter } from "../kernel/jobs/drizzle-adapter";
|
|
44
|
+
const requiredServiceKeys = [
|
|
45
|
+
"catalog",
|
|
46
|
+
"inventory",
|
|
47
|
+
"media",
|
|
48
|
+
"cart",
|
|
49
|
+
"orders",
|
|
50
|
+
"payments",
|
|
51
|
+
"fulfillment",
|
|
52
|
+
"customers",
|
|
53
|
+
"webhooks",
|
|
54
|
+
"analytics",
|
|
55
|
+
"pricing",
|
|
56
|
+
"promotions",
|
|
57
|
+
"tax",
|
|
58
|
+
"shipping",
|
|
59
|
+
"search",
|
|
60
|
+
"audit",
|
|
61
|
+
];
|
|
62
|
+
function assertServicesReady(services) {
|
|
63
|
+
for (const key of requiredServiceKeys) {
|
|
64
|
+
if (services[key] === undefined) {
|
|
65
|
+
throw new Error(`Kernel service "${String(key)}" was not initialized.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function registerConfiguredHooks(config, hooks) {
|
|
70
|
+
for (const [entityType, entityConfig] of Object.entries(config.entities ?? {})) {
|
|
71
|
+
const entityHooks = entityConfig.hooks ?? {};
|
|
72
|
+
for (const [hookName, handlers] of Object.entries(entityHooks)) {
|
|
73
|
+
hooks.registerConfigHooks(`catalog.${entityType}.${hookName}`, handlers ?? []);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const [moduleName, moduleConfig] of [
|
|
77
|
+
["cart", config.cart],
|
|
78
|
+
["checkout", config.checkout],
|
|
79
|
+
["orders", config.orders],
|
|
80
|
+
["inventory", config.inventory],
|
|
81
|
+
]) {
|
|
82
|
+
const hooksObject = moduleConfig?.hooks;
|
|
83
|
+
if (!hooksObject)
|
|
84
|
+
continue;
|
|
85
|
+
for (const [hookName, handlers] of Object.entries(hooksObject)) {
|
|
86
|
+
const normalizedHandlers = Array.isArray(handlers)
|
|
87
|
+
? handlers
|
|
88
|
+
: [];
|
|
89
|
+
hooks.registerConfigHooks(`${moduleName}.${hookName}`, normalizedHandlers);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Webhook delivery (async via job queue) — 14 event types
|
|
93
|
+
hooks.append("orders.afterCreate", deliverWebhooks);
|
|
94
|
+
hooks.append("orders.afterStatusChange", deliverWebhooks);
|
|
95
|
+
hooks.append("orders.afterStatusChange", sendOrderStatusEmail);
|
|
96
|
+
hooks.append("catalog.afterCreate", deliverWebhooks);
|
|
97
|
+
hooks.append("catalog.afterUpdate", deliverWebhooks);
|
|
98
|
+
hooks.append("catalog.afterDelete", deliverWebhooks);
|
|
99
|
+
hooks.append("inventory.afterAdjust", deliverWebhooks);
|
|
100
|
+
hooks.append("customers.afterCreate", deliverWebhooks);
|
|
101
|
+
hooks.append("customers.afterUpdate", deliverWebhooks);
|
|
102
|
+
hooks.append("pricing.afterCreate", deliverWebhooks);
|
|
103
|
+
hooks.append("pricing.afterUpdate", deliverWebhooks);
|
|
104
|
+
hooks.append("promotions.afterCreate", deliverWebhooks);
|
|
105
|
+
hooks.append("promotions.afterUpdate", deliverWebhooks);
|
|
106
|
+
hooks.append("fulfillment.afterCreate", deliverWebhooks);
|
|
107
|
+
hooks.append("cart.afterAddItem", deliverWebhooks);
|
|
108
|
+
// Analytics: no event recording hooks needed (RFC-006).
|
|
109
|
+
// The DrizzleAnalyticsAdapter queries source tables directly via SQL.
|
|
110
|
+
// Search index sync
|
|
111
|
+
hooks.append("catalog.afterCreate", syncToSearchIndex);
|
|
112
|
+
hooks.append("catalog.afterUpdate", syncToSearchIndex);
|
|
113
|
+
// Auto-audit — records every create/update/delete across all modules
|
|
114
|
+
for (const [key, handler] of Object.entries(auditHooks)) {
|
|
115
|
+
hooks.append(key, handler);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function createKernel(config) {
|
|
119
|
+
const hooks = new HookRegistry();
|
|
120
|
+
const logger = createLogger("kernel");
|
|
121
|
+
hooks.setLogger(logger);
|
|
122
|
+
if (!config.storage) {
|
|
123
|
+
throw new Error("Storage adapter is required. Configure `storage` in defineConfig (for example: localStorageAdapter for development, or s3StorageAdapter/r2StorageAdapter for object storage).");
|
|
124
|
+
}
|
|
125
|
+
const database = createDatabaseConnection({
|
|
126
|
+
adapter: config.databaseAdapter ?? {
|
|
127
|
+
provider: config.database.provider,
|
|
128
|
+
db: {},
|
|
129
|
+
async transaction(fn) {
|
|
130
|
+
return fn({});
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
const mcpTools = [];
|
|
135
|
+
const mcpResources = [];
|
|
136
|
+
const services = {
|
|
137
|
+
email: config.email,
|
|
138
|
+
organization: new OrganizationService(database.db),
|
|
139
|
+
};
|
|
140
|
+
const serviceContainer = services;
|
|
141
|
+
// Expose database on service container so plugin hooks can access it
|
|
142
|
+
serviceContainer.database = database;
|
|
143
|
+
const db = database.db;
|
|
144
|
+
// Expose jobs adapter on service container so plugins can enqueue background work
|
|
145
|
+
const jobsAdapter = new DrizzleJobsAdapter(db, new Map());
|
|
146
|
+
serviceContainer.jobs = jobsAdapter;
|
|
147
|
+
const pricingRepository = new PricingRepository(db);
|
|
148
|
+
const promotionsRepository = new PromotionsRepository(db);
|
|
149
|
+
services.tax = new TaxService({ adapter: config.tax?.adapter });
|
|
150
|
+
services.payments = new PaymentsService(config.payments);
|
|
151
|
+
const customersRepository = new CustomersRepository(db);
|
|
152
|
+
services.customers = new CustomerService({
|
|
153
|
+
repository: customersRepository,
|
|
154
|
+
});
|
|
155
|
+
const webhooksRepository = new WebhooksRepository(db);
|
|
156
|
+
const webhookWorker = new WebhookDeliveryWorker({
|
|
157
|
+
repository: webhooksRepository,
|
|
158
|
+
});
|
|
159
|
+
services.webhooks = Object.assign(new WebhookService({
|
|
160
|
+
repository: webhooksRepository,
|
|
161
|
+
}), {
|
|
162
|
+
async enqueueDelivery(payload) {
|
|
163
|
+
await webhookWorker.deliver(payload);
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
const inventoryRepository = new InventoryRepository(db);
|
|
167
|
+
services.inventory = new InventoryService({
|
|
168
|
+
repository: inventoryRepository,
|
|
169
|
+
hooks,
|
|
170
|
+
config,
|
|
171
|
+
services: serviceContainer,
|
|
172
|
+
database,
|
|
173
|
+
});
|
|
174
|
+
const catalogRepository = new CatalogRepository(db);
|
|
175
|
+
services.catalog = new CatalogServiceImpl({
|
|
176
|
+
repository: catalogRepository,
|
|
177
|
+
hooks,
|
|
178
|
+
config,
|
|
179
|
+
services: serviceContainer,
|
|
180
|
+
});
|
|
181
|
+
services.search = new SearchService({
|
|
182
|
+
catalogRepository: catalogRepository,
|
|
183
|
+
...(config.search?.adapter ? { adapter: config.search.adapter } : {}),
|
|
184
|
+
...(config.search?.defaultFacets
|
|
185
|
+
? { defaultFacets: config.search.defaultFacets }
|
|
186
|
+
: {}),
|
|
187
|
+
});
|
|
188
|
+
const cartRepository = new CartRepository(db);
|
|
189
|
+
services.cart = new CartService({
|
|
190
|
+
repository: cartRepository,
|
|
191
|
+
catalogRepository: catalogRepository,
|
|
192
|
+
hooks,
|
|
193
|
+
config,
|
|
194
|
+
services: serviceContainer,
|
|
195
|
+
});
|
|
196
|
+
const ordersRepository = new OrdersRepository(db);
|
|
197
|
+
services.orders = new OrderService({
|
|
198
|
+
repository: ordersRepository,
|
|
199
|
+
hooks,
|
|
200
|
+
services: serviceContainer,
|
|
201
|
+
kernel: { database: database },
|
|
202
|
+
...(config.orders?.customTransitions
|
|
203
|
+
? { stateMachine: extendOrderStateMachine(config.orders.customTransitions) }
|
|
204
|
+
: {}),
|
|
205
|
+
});
|
|
206
|
+
const fulfillmentRepository = new FulfillmentRepository(db);
|
|
207
|
+
services.fulfillment = new FulfillmentService({
|
|
208
|
+
repository: fulfillmentRepository,
|
|
209
|
+
ordersRepository: ordersRepository,
|
|
210
|
+
inventoryService: services.inventory,
|
|
211
|
+
});
|
|
212
|
+
services.pricing = new PricingService({
|
|
213
|
+
repository: pricingRepository,
|
|
214
|
+
catalogRepository: catalogRepository,
|
|
215
|
+
});
|
|
216
|
+
services.promotions = new PromotionService({
|
|
217
|
+
repository: promotionsRepository,
|
|
218
|
+
catalogRepository: catalogRepository,
|
|
219
|
+
ordersRepository: ordersRepository,
|
|
220
|
+
});
|
|
221
|
+
// AnalyticsService — always uses DrizzleAnalyticsAdapter (direct SQL).
|
|
222
|
+
// Plugins add their own models via the analyticsModels manifest slot.
|
|
223
|
+
const analyticsAdapter = new DrizzleAnalyticsAdapter(db);
|
|
224
|
+
for (const model of BUILTIN_ANALYTICS_MODELS) {
|
|
225
|
+
analyticsAdapter.registerModel(model);
|
|
226
|
+
}
|
|
227
|
+
services.analytics = new AnalyticsService({
|
|
228
|
+
adapter: analyticsAdapter,
|
|
229
|
+
config,
|
|
230
|
+
});
|
|
231
|
+
services.shipping = new ShippingService({
|
|
232
|
+
config,
|
|
233
|
+
catalogRepository: catalogRepository,
|
|
234
|
+
});
|
|
235
|
+
const mediaRepository = new MediaRepository(db);
|
|
236
|
+
services.media = new MediaService({
|
|
237
|
+
repository: mediaRepository,
|
|
238
|
+
catalogRepository: catalogRepository,
|
|
239
|
+
storage: config.storage,
|
|
240
|
+
});
|
|
241
|
+
services.audit = createAuditService(db);
|
|
242
|
+
assertServicesReady(services);
|
|
243
|
+
// Service method observability: wrap each service in a timing proxy
|
|
244
|
+
// that logs slow calls (>100ms) and failed calls with duration.
|
|
245
|
+
// Disabled in test environment to avoid noisy logs.
|
|
246
|
+
if (process.env.NODE_ENV !== "test") {
|
|
247
|
+
const timedLogger = logger;
|
|
248
|
+
const serviceKeys = Object.keys(services);
|
|
249
|
+
for (const key of serviceKeys) {
|
|
250
|
+
const svc = services[key];
|
|
251
|
+
if (svc && typeof svc === "object" && key !== "email") {
|
|
252
|
+
services[key] = withTiming(svc, key, timedLogger);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
registerConfiguredHooks(config, hooks);
|
|
257
|
+
const kernel = {
|
|
258
|
+
config,
|
|
259
|
+
hooks,
|
|
260
|
+
database,
|
|
261
|
+
services,
|
|
262
|
+
mcpTools,
|
|
263
|
+
mcpResources,
|
|
264
|
+
logger,
|
|
265
|
+
getMCPActor() {
|
|
266
|
+
return {
|
|
267
|
+
type: "api_key",
|
|
268
|
+
userId: "mcp-agent",
|
|
269
|
+
email: null,
|
|
270
|
+
name: "MCP Agent",
|
|
271
|
+
vendorId: null,
|
|
272
|
+
organizationId: DEFAULT_ORG_ID,
|
|
273
|
+
role: "ai_agent",
|
|
274
|
+
permissions: config.auth?.roles?.ai_agent?.permissions ?? [
|
|
275
|
+
"catalog:read",
|
|
276
|
+
"catalog:create",
|
|
277
|
+
"inventory:read",
|
|
278
|
+
"inventory:adjust",
|
|
279
|
+
"orders:read",
|
|
280
|
+
"cart:create",
|
|
281
|
+
"cart:update",
|
|
282
|
+
"mcp:access",
|
|
283
|
+
],
|
|
284
|
+
};
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
// Register plugin hooks from config.hooks flat map
|
|
288
|
+
for (const [key, handlers] of Object.entries(config.hooks ?? {})) {
|
|
289
|
+
for (const handler of handlers) {
|
|
290
|
+
hooks.append(key, handler);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Register plugin analytics models from config.analytics.models
|
|
294
|
+
for (const model of config.analytics?.models ?? []) {
|
|
295
|
+
services.analytics.registerModel(model);
|
|
296
|
+
}
|
|
297
|
+
return kernel;
|
|
298
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import pino from "pino";
|
|
2
|
+
import type { CommerceConfig } from "../config/types";
|
|
3
|
+
export type Logger = pino.Logger;
|
|
4
|
+
/**
|
|
5
|
+
* Create a structured JSON logger for the commerce engine.
|
|
6
|
+
*
|
|
7
|
+
* Automatically redacts sensitive fields (authorization, password, token, etc.)
|
|
8
|
+
* from all log output. Uses Pino for high-performance, newline-delimited JSON.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createLogger(config: CommerceConfig): Logger;
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/runtime/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAwB3D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import pino from "pino";
|
|
2
|
+
/**
|
|
3
|
+
* Create a structured JSON logger for the commerce engine.
|
|
4
|
+
*
|
|
5
|
+
* Automatically redacts sensitive fields (authorization, password, token, etc.)
|
|
6
|
+
* from all log output. Uses Pino for high-performance, newline-delimited JSON.
|
|
7
|
+
*/
|
|
8
|
+
export function createLogger(config) {
|
|
9
|
+
return pino({
|
|
10
|
+
level: config.logLevel ?? "info",
|
|
11
|
+
redact: {
|
|
12
|
+
paths: [
|
|
13
|
+
"req.headers.authorization",
|
|
14
|
+
"req.headers.cookie",
|
|
15
|
+
"*.password",
|
|
16
|
+
"*.secret",
|
|
17
|
+
"*.apiKey",
|
|
18
|
+
"*.creditCard",
|
|
19
|
+
"*.token",
|
|
20
|
+
"*.apiToken",
|
|
21
|
+
],
|
|
22
|
+
censor: "[REDACTED]",
|
|
23
|
+
},
|
|
24
|
+
serializers: {
|
|
25
|
+
req: pino.stdSerializers.req,
|
|
26
|
+
err: pino.stdSerializers.err,
|
|
27
|
+
},
|
|
28
|
+
formatters: {
|
|
29
|
+
level: (label) => ({ level: label }),
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
+
import type { Actor } from "../auth/types";
|
|
3
|
+
import type { AuthInstance } from "../auth/setup";
|
|
4
|
+
import type { CommerceConfig } from "../config/types";
|
|
5
|
+
import { type Logger } from "./logger";
|
|
6
|
+
import { type CommerceInstance } from "./commerce";
|
|
7
|
+
type ServerEnv = {
|
|
8
|
+
Variables: {
|
|
9
|
+
auth: AuthInstance;
|
|
10
|
+
actor: Actor | null;
|
|
11
|
+
requestId: string;
|
|
12
|
+
logger: Logger;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Create a full HTTP server (Hono) with all REST routes, auth, and middleware.
|
|
17
|
+
*
|
|
18
|
+
* For server-side frameworks (Next.js, TanStack Start, SvelteKit), use
|
|
19
|
+
* `createCommerce()` instead — it gives you a local API without HTTP overhead.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createServer(config: CommerceConfig): Promise<{
|
|
22
|
+
app: OpenAPIHono<ServerEnv, {}, "/">;
|
|
23
|
+
kernel: import("./kernel").Kernel;
|
|
24
|
+
logger: Logger;
|
|
25
|
+
commerce: CommerceInstance;
|
|
26
|
+
}>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAQtD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnE,KAAK,SAAS,GAAG;IACf,SAAS,EAAE;QACT,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc;;;;;GAsTxD"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
3
|
+
import { csrf } from "hono/csrf";
|
|
4
|
+
import { bodyLimit } from "hono/body-limit";
|
|
5
|
+
import { rateLimiter } from "hono-rate-limiter";
|
|
6
|
+
import { authMiddleware } from "../auth/middleware";
|
|
7
|
+
import { createMCPHandler } from "../interfaces/mcp/transport";
|
|
8
|
+
import { createRestRoutes } from "../interfaces/rest";
|
|
9
|
+
import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal";
|
|
10
|
+
import { createCommerce } from "./commerce";
|
|
11
|
+
/**
|
|
12
|
+
* Create a full HTTP server (Hono) with all REST routes, auth, and middleware.
|
|
13
|
+
*
|
|
14
|
+
* For server-side frameworks (Next.js, TanStack Start, SvelteKit), use
|
|
15
|
+
* `createCommerce()` instead — it gives you a local API without HTTP overhead.
|
|
16
|
+
*/
|
|
17
|
+
export async function createServer(config) {
|
|
18
|
+
const commerce = await createCommerce(config);
|
|
19
|
+
const { kernel, auth, logger } = commerce;
|
|
20
|
+
const isProdEnv = process.env.NODE_ENV === "production";
|
|
21
|
+
const app = new OpenAPIHono({
|
|
22
|
+
defaultHook: (result, c) => {
|
|
23
|
+
if (!result.success) {
|
|
24
|
+
return c.json({
|
|
25
|
+
error: {
|
|
26
|
+
code: "VALIDATION_FAILED",
|
|
27
|
+
message: isProdEnv
|
|
28
|
+
? "Invalid input."
|
|
29
|
+
: result.error.issues
|
|
30
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
31
|
+
.join("; "),
|
|
32
|
+
},
|
|
33
|
+
}, 422);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
// ─── Security Guards ──────────────────────────────────────────────
|
|
38
|
+
if (config.auth?.enableDevKey && process.env.NODE_ENV === "production") {
|
|
39
|
+
throw new Error("FATAL: Dev key MUST NOT be enabled in production. " +
|
|
40
|
+
"Set auth.enableDevKey: false in production config.");
|
|
41
|
+
}
|
|
42
|
+
if (config.auth?.enableDevKey && process.env.NODE_ENV !== "development") {
|
|
43
|
+
logger.warn("Dev key is enabled outside NODE_ENV=development. " +
|
|
44
|
+
"Set auth.enableDevKey: false in production config to disable the dev backdoor.");
|
|
45
|
+
}
|
|
46
|
+
// ─── Process Crash Handlers (F4) ─────────────────────────────────────
|
|
47
|
+
process.on("unhandledRejection", (reason) => {
|
|
48
|
+
logger.fatal({ err: reason }, "unhandled promise rejection -- exiting");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
process.on("uncaughtException", (err) => {
|
|
52
|
+
logger.fatal({ err }, "uncaught exception -- exiting");
|
|
53
|
+
process.exit(1);
|
|
54
|
+
});
|
|
55
|
+
// ─── Security Response Headers ──────────────────────────────────────
|
|
56
|
+
app.use("*", async (c, next) => {
|
|
57
|
+
c.header("X-Content-Type-Options", "nosniff");
|
|
58
|
+
c.header("X-Frame-Options", "DENY");
|
|
59
|
+
c.header("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
60
|
+
c.header("Permissions-Policy", "camera=(), microphone=(), geolocation=()");
|
|
61
|
+
if (isProdEnv) {
|
|
62
|
+
c.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
|
|
63
|
+
}
|
|
64
|
+
await next();
|
|
65
|
+
});
|
|
66
|
+
// ─── Request ID + Logging (F2, F12) ──────────────────────────────────
|
|
67
|
+
app.use("*", async (c, next) => {
|
|
68
|
+
const requestId = c.req.header("x-request-id") ?? crypto.randomUUID();
|
|
69
|
+
c.header("x-request-id", requestId);
|
|
70
|
+
c.set("requestId", requestId);
|
|
71
|
+
const child = logger.child({ requestId, method: c.req.method, path: c.req.path });
|
|
72
|
+
c.set("logger", child);
|
|
73
|
+
const start = performance.now();
|
|
74
|
+
await next();
|
|
75
|
+
// Sanitize ZodError responses in production.
|
|
76
|
+
// @hono/zod-openapi returns { success: false, error: { name: "ZodError" } }
|
|
77
|
+
// which leaks schema details. The library does not respect defaultHook for
|
|
78
|
+
// this format, so we intercept at the response level.
|
|
79
|
+
if (isProdEnv && c.res.status >= 400 && c.res.status < 500) {
|
|
80
|
+
const ct = c.res.headers.get("content-type");
|
|
81
|
+
if (ct?.includes("json")) {
|
|
82
|
+
try {
|
|
83
|
+
const body = await c.res.clone().json();
|
|
84
|
+
if (body?.error?.name === "ZodError") {
|
|
85
|
+
c.res = new Response(JSON.stringify({ error: { code: "VALIDATION_FAILED", message: "Invalid input." } }), { status: 422, headers: { "content-type": "application/json" } });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch { /* non-parseable, skip */ }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const duration = Math.round(performance.now() - start);
|
|
92
|
+
child.info({ status: c.res.status, durationMs: duration }, "request completed");
|
|
93
|
+
});
|
|
94
|
+
// ─── CORS (hardened by default) ──────────────────────────────────────
|
|
95
|
+
const trustedOrigins = config.auth?.trustedOrigins ?? [];
|
|
96
|
+
app.use("*", cors({
|
|
97
|
+
origin: trustedOrigins.length > 0
|
|
98
|
+
? trustedOrigins
|
|
99
|
+
: (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
|
|
100
|
+
credentials: true,
|
|
101
|
+
allowMethods: ["GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"],
|
|
102
|
+
allowHeaders: ["Content-Type", "Authorization", "x-api-key", "x-request-id"],
|
|
103
|
+
maxAge: 86400,
|
|
104
|
+
}));
|
|
105
|
+
// ─── CSRF Protection (F14) ──────────────────────────────────────────
|
|
106
|
+
app.use("/api/*", csrf({
|
|
107
|
+
origin: trustedOrigins.length > 0
|
|
108
|
+
? trustedOrigins
|
|
109
|
+
: (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
|
|
110
|
+
}));
|
|
111
|
+
// ─── Body Size Limit (F6) ──────────────────────────────────────────
|
|
112
|
+
app.use("*", bodyLimit({
|
|
113
|
+
maxSize: 1024 * 1024, // 1 MB default
|
|
114
|
+
onError: (c) => c.json({
|
|
115
|
+
error: { code: "PAYLOAD_TOO_LARGE", message: "Request body exceeds 1MB limit." },
|
|
116
|
+
}, 413),
|
|
117
|
+
}));
|
|
118
|
+
// ─── Rate Limiting (F1) ──────────────────────────────────────────────
|
|
119
|
+
// Trust X-Forwarded-For ONLY from a known reverse proxy IP.
|
|
120
|
+
// Set TRUSTED_PROXY_IP env var to the proxy's IP (e.g., "127.0.0.1").
|
|
121
|
+
const trustedProxyIp = process.env.TRUSTED_PROXY_IP;
|
|
122
|
+
const getClientIp = (c) => {
|
|
123
|
+
const raw = c.req.raw;
|
|
124
|
+
const remoteAddress = raw.socket?.remoteAddress;
|
|
125
|
+
// Only trust X-Forwarded-For when the direct connection is from a trusted proxy
|
|
126
|
+
if (trustedProxyIp && remoteAddress === trustedProxyIp) {
|
|
127
|
+
const xff = c.req.header("x-forwarded-for")?.split(",")[0]?.trim();
|
|
128
|
+
if (xff)
|
|
129
|
+
return xff;
|
|
130
|
+
}
|
|
131
|
+
return remoteAddress ?? "unknown";
|
|
132
|
+
};
|
|
133
|
+
const keyGenerator = getClientIp;
|
|
134
|
+
app.use("/api/auth/*", rateLimiter({
|
|
135
|
+
windowMs: 60 * 1000,
|
|
136
|
+
limit: config.rateLimits?.auth ?? 10,
|
|
137
|
+
keyGenerator,
|
|
138
|
+
}));
|
|
139
|
+
app.use("/api/checkout", rateLimiter({
|
|
140
|
+
windowMs: 60 * 1000,
|
|
141
|
+
limit: config.rateLimits?.checkout ?? 5,
|
|
142
|
+
keyGenerator,
|
|
143
|
+
}));
|
|
144
|
+
app.use("/api/*", rateLimiter({
|
|
145
|
+
windowMs: 60 * 1000,
|
|
146
|
+
limit: config.rateLimits?.api ?? 100,
|
|
147
|
+
keyGenerator,
|
|
148
|
+
}));
|
|
149
|
+
// ─── Custom Middleware ──────────────────────────────────────────────
|
|
150
|
+
if (config.middleware) {
|
|
151
|
+
for (const middleware of config.middleware) {
|
|
152
|
+
app.use("*", middleware);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ─── Auth ──────────────────────────────────────────────────────────
|
|
156
|
+
app.use("/api/auth/*", async (c, next) => {
|
|
157
|
+
if (c.req.path.startsWith("/api/auth/pos/")) {
|
|
158
|
+
await next();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
return auth.handler(c.req.raw);
|
|
162
|
+
});
|
|
163
|
+
app.use("*", authMiddleware(auth, config));
|
|
164
|
+
app.use("*", async (c, next) => {
|
|
165
|
+
c.set("auth", auth);
|
|
166
|
+
await next();
|
|
167
|
+
});
|
|
168
|
+
// ─── Global Error Handler ─────────────────────────────────────────
|
|
169
|
+
// Sanitize errors in production — no stack traces, no class names, no schema details
|
|
170
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
171
|
+
app.onError((err, c) => {
|
|
172
|
+
// Catch ZodError from @hono/zod-openapi validation (bypasses defaultHook)
|
|
173
|
+
if (err.constructor?.name === "ZodError" || "issues" in err) {
|
|
174
|
+
if (isProd) {
|
|
175
|
+
return c.json({ error: { code: "VALIDATION_FAILED", message: "Invalid input." } }, 422);
|
|
176
|
+
}
|
|
177
|
+
const issues = err.issues ?? [];
|
|
178
|
+
return c.json({
|
|
179
|
+
error: {
|
|
180
|
+
code: "VALIDATION_FAILED",
|
|
181
|
+
message: issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "),
|
|
182
|
+
},
|
|
183
|
+
}, 422);
|
|
184
|
+
}
|
|
185
|
+
if (isProd) {
|
|
186
|
+
logger.error({ err }, "unhandled request error");
|
|
187
|
+
return c.json({ error: { code: "INTERNAL_ERROR", message: "An unexpected error occurred." } }, 500);
|
|
188
|
+
}
|
|
189
|
+
return c.json({ error: { code: "INTERNAL_ERROR", message: err.message } }, 500);
|
|
190
|
+
});
|
|
191
|
+
// ─── Routes ──────────────────────────────────────────────────────────
|
|
192
|
+
app.route("/api", createRestRoutes(kernel));
|
|
193
|
+
app.route("/mcp", createMCPHandler(kernel, config.mcpTools));
|
|
194
|
+
app.route("/api/me", createCustomerPortalRoutes(kernel));
|
|
195
|
+
if (config.routes) {
|
|
196
|
+
config.routes(app, kernel);
|
|
197
|
+
}
|
|
198
|
+
// OpenAPI spec — disabled in production unless explicitly enabled
|
|
199
|
+
const exposeSpec = config.exposeOpenApiSpec ?? !isProd;
|
|
200
|
+
if (exposeSpec) {
|
|
201
|
+
app.doc("/api/doc", {
|
|
202
|
+
openapi: "3.0.0",
|
|
203
|
+
info: {
|
|
204
|
+
title: "UnifiedCommerce API",
|
|
205
|
+
version: config.version ?? "0.0.1",
|
|
206
|
+
description: "Headless commerce engine REST API. Includes core and plugin endpoints.",
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
app.get("/api/doc", (c) => c.json({ error: { code: "NOT_FOUND", message: "Not found." } }, 404));
|
|
212
|
+
}
|
|
213
|
+
// ─── Job Queue ───────────────────────────────────────────────────────
|
|
214
|
+
// Background job processing: webhook delivery, scheduled orders, email tasks.
|
|
215
|
+
//
|
|
216
|
+
// Three runner strategies (inspired by Payload CMS):
|
|
217
|
+
// 1. autorun: in-process polling (long-running servers)
|
|
218
|
+
// 2. GET /api/jobs/run: cron endpoint (serverless — Vercel, Cloudflare)
|
|
219
|
+
// 3. runPendingJobs() export (custom worker process)
|
|
220
|
+
const { runPendingJobs } = await import("../kernel/jobs/runner");
|
|
221
|
+
const taskMap = new Map();
|
|
222
|
+
for (const task of config.jobs?.tasks ?? []) {
|
|
223
|
+
taskMap.set(task.slug ?? task.name, task);
|
|
224
|
+
}
|
|
225
|
+
const runJobs = async (queue, limit) => {
|
|
226
|
+
return runPendingJobs({
|
|
227
|
+
db: kernel.database.db,
|
|
228
|
+
tasks: taskMap,
|
|
229
|
+
queue: queue ?? "default",
|
|
230
|
+
limit: limit ?? 10,
|
|
231
|
+
logger: logger,
|
|
232
|
+
services: kernel.services,
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
// Strategy 1: Built-in cron endpoint for serverless deployments.
|
|
236
|
+
// Point Vercel Cron or Cloudflare Cron Trigger at GET /api/jobs/run
|
|
237
|
+
// Optional query params: ?queue=emails&limit=20
|
|
238
|
+
app.get("/api/jobs/run", async (c) => {
|
|
239
|
+
// Always require admin — cron triggers must authenticate
|
|
240
|
+
const actor = c.get("actor");
|
|
241
|
+
if (!actor?.permissions?.includes("*:*")) {
|
|
242
|
+
return c.json({ error: { code: "FORBIDDEN", message: "Job runner requires admin access" } }, 403);
|
|
243
|
+
}
|
|
244
|
+
const queue = c.req.query("queue") ?? "default";
|
|
245
|
+
const limit = parseInt(c.req.query("limit") ?? "10", 10);
|
|
246
|
+
try {
|
|
247
|
+
const result = await runJobs(queue, limit);
|
|
248
|
+
return c.json({ data: result });
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
logger.error({ err }, "Job runner endpoint failed");
|
|
252
|
+
return c.json({ error: { code: "INTERNAL_ERROR", message: "Job processing failed" } }, 500);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
// Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
|
|
256
|
+
// Enable via config.jobs.autorun.enabled = true
|
|
257
|
+
if (config.jobs?.autorun?.enabled) {
|
|
258
|
+
const intervalMs = config.jobs.autorun.intervalMs ?? 10_000;
|
|
259
|
+
const jobInterval = setInterval(async () => {
|
|
260
|
+
try {
|
|
261
|
+
await runJobs();
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
logger.error({ err }, "Job runner iteration failed");
|
|
265
|
+
}
|
|
266
|
+
}, intervalMs);
|
|
267
|
+
const cleanup = () => clearInterval(jobInterval);
|
|
268
|
+
process.on("SIGTERM", cleanup);
|
|
269
|
+
process.on("SIGINT", cleanup);
|
|
270
|
+
logger.info({ intervalMs }, "Job queue autorun started (in-process polling)");
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
logger.info("Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
|
|
274
|
+
"or set config.jobs.autorun.enabled = true for in-process polling.");
|
|
275
|
+
}
|
|
276
|
+
return { app, kernel, logger, commerce };
|
|
277
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Logger } from "./logger";
|
|
2
|
+
/**
|
|
3
|
+
* Sets up graceful shutdown handlers for SIGTERM and SIGINT.
|
|
4
|
+
*
|
|
5
|
+
* On signal:
|
|
6
|
+
* 1. Stops accepting new connections
|
|
7
|
+
* 2. Runs cleanup (close DB pool, flush logs)
|
|
8
|
+
* 3. Force-exits after timeout if cleanup hangs
|
|
9
|
+
*/
|
|
10
|
+
export declare function setupGracefulShutdown(opts: {
|
|
11
|
+
cleanup: () => Promise<void>;
|
|
12
|
+
logger: Logger;
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
}): void;
|
|
15
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/runtime/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CA4BP"}
|