@porulle/core 0.9.0 → 0.10.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.
Files changed (113) hide show
  1. package/dist/config/defaults.js +1 -1
  2. package/dist/config/types.d.ts +4 -3
  3. package/dist/config/types.d.ts.map +1 -1
  4. package/dist/generated/plugin-manifest.d.ts +3 -0
  5. package/dist/generated/plugin-manifest.d.ts.map +1 -1
  6. package/dist/generated/plugin-manifest.js +1 -0
  7. package/dist/index.d.ts +5 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -0
  10. package/dist/interfaces/rest/router.d.ts.map +1 -1
  11. package/dist/interfaces/rest/router.js +2 -0
  12. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
  13. package/dist/interfaces/rest/routes/checkout.js +1 -0
  14. package/dist/interfaces/rest/schemas/catalog.d.ts +391 -0
  15. package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -1
  16. package/dist/interfaces/rest/schemas/responses.d.ts +51 -0
  17. package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
  18. package/dist/interfaces/rest/schemas/search.d.ts +17 -0
  19. package/dist/interfaces/rest/schemas/search.d.ts.map +1 -1
  20. package/dist/kernel/database/adapter.d.ts +8 -0
  21. package/dist/kernel/database/adapter.d.ts.map +1 -1
  22. package/dist/kernel/database/migrate.d.ts +1 -1
  23. package/dist/kernel/database/migrate.d.ts.map +1 -1
  24. package/dist/kernel/database/migrate.js +5 -2
  25. package/dist/kernel/database/scoped-db.d.ts.map +1 -1
  26. package/dist/kernel/database/scoped-db.js +21 -23
  27. package/dist/kernel/errors.d.ts +12 -0
  28. package/dist/kernel/errors.d.ts.map +1 -1
  29. package/dist/kernel/errors.js +16 -0
  30. package/dist/kernel/jobs/adapter.d.ts +27 -8
  31. package/dist/kernel/jobs/adapter.d.ts.map +1 -1
  32. package/dist/kernel/jobs/adapter.js +1 -2
  33. package/dist/kernel/jobs/drizzle-adapter.d.ts +13 -3
  34. package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -1
  35. package/dist/kernel/jobs/drizzle-adapter.js +46 -5
  36. package/dist/kernel/jobs/runner.d.ts +2 -1
  37. package/dist/kernel/jobs/runner.d.ts.map +1 -1
  38. package/dist/kernel/jobs/runner.js +100 -15
  39. package/dist/kernel/jobs/types.d.ts +13 -0
  40. package/dist/kernel/jobs/types.d.ts.map +1 -1
  41. package/dist/kernel/plugin/manifest.d.ts +2 -0
  42. package/dist/kernel/plugin/manifest.d.ts.map +1 -1
  43. package/dist/kernel/plugin/manifest.js +9 -0
  44. package/dist/modules/catalog/entity-service.d.ts +1 -0
  45. package/dist/modules/catalog/entity-service.d.ts.map +1 -1
  46. package/dist/modules/catalog/entity-service.js +15 -1
  47. package/dist/modules/catalog/repository/index.d.ts +2 -2
  48. package/dist/modules/catalog/repository/index.d.ts.map +1 -1
  49. package/dist/modules/catalog/repository/index.js +9 -1
  50. package/dist/modules/catalog/schema.d.ts +51 -0
  51. package/dist/modules/catalog/schema.d.ts.map +1 -1
  52. package/dist/modules/catalog/schema.js +12 -1
  53. package/dist/modules/catalog/schemas.d.ts +3 -1
  54. package/dist/modules/catalog/schemas.d.ts.map +1 -1
  55. package/dist/modules/channels/adapter.d.ts +117 -0
  56. package/dist/modules/channels/adapter.d.ts.map +1 -0
  57. package/dist/modules/channels/adapter.js +3 -0
  58. package/dist/modules/inventory/repository/index.js +4 -4
  59. package/dist/modules/inventory/service.d.ts.map +1 -1
  60. package/dist/modules/inventory/service.js +7 -3
  61. package/dist/modules/orders/service.d.ts.map +1 -1
  62. package/dist/modules/orders/service.js +7 -4
  63. package/dist/modules/orders/stale-order-cleanup.d.ts.map +1 -1
  64. package/dist/modules/orders/stale-order-cleanup.js +25 -16
  65. package/dist/modules/promotions/repository/index.d.ts +1 -1
  66. package/dist/modules/promotions/repository/index.d.ts.map +1 -1
  67. package/dist/modules/promotions/repository/index.js +6 -3
  68. package/dist/modules/promotions/service.d.ts +1 -0
  69. package/dist/modules/promotions/service.d.ts.map +1 -1
  70. package/dist/modules/promotions/service.js +1 -1
  71. package/dist/modules/webhooks/repository/index.d.ts +1 -1
  72. package/dist/modules/webhooks/repository/index.d.ts.map +1 -1
  73. package/dist/modules/webhooks/repository/index.js +16 -10
  74. package/dist/runtime/commerce.d.ts.map +1 -1
  75. package/dist/runtime/commerce.js +9 -0
  76. package/dist/runtime/kernel.d.ts.map +1 -1
  77. package/dist/runtime/kernel.js +14 -2
  78. package/dist/runtime/server.d.ts +1 -4
  79. package/dist/runtime/server.d.ts.map +1 -1
  80. package/dist/runtime/server.js +16 -34
  81. package/package.json +3 -3
  82. package/src/config/defaults.ts +1 -1
  83. package/src/config/types.ts +7 -3
  84. package/src/generated/plugin-capabilities.d.ts +1 -0
  85. package/src/generated/plugin-manifest.ts +1 -0
  86. package/src/generated/plugin-repositories.d.ts +1 -0
  87. package/src/index.ts +31 -1
  88. package/src/interfaces/rest/router.ts +2 -0
  89. package/src/interfaces/rest/routes/checkout.ts +1 -0
  90. package/src/kernel/database/adapter.ts +8 -0
  91. package/src/kernel/database/migrate.ts +8 -2
  92. package/src/kernel/database/scoped-db.ts +25 -26
  93. package/src/kernel/errors.ts +20 -0
  94. package/src/kernel/jobs/adapter.ts +39 -8
  95. package/src/kernel/jobs/drizzle-adapter.ts +72 -9
  96. package/src/kernel/jobs/runner.ts +194 -72
  97. package/src/kernel/jobs/types.ts +25 -0
  98. package/src/kernel/plugin/manifest.ts +12 -0
  99. package/src/modules/catalog/entity-service.ts +9 -1
  100. package/src/modules/catalog/repository/index.ts +13 -3
  101. package/src/modules/catalog/schema.ts +33 -18
  102. package/src/modules/catalog/schemas.ts +3 -1
  103. package/src/modules/channels/adapter.ts +139 -0
  104. package/src/modules/inventory/repository/index.ts +4 -4
  105. package/src/modules/inventory/service.ts +12 -2
  106. package/src/modules/orders/service.ts +8 -12
  107. package/src/modules/orders/stale-order-cleanup.ts +35 -24
  108. package/src/modules/promotions/repository/index.ts +6 -2
  109. package/src/modules/promotions/service.ts +2 -0
  110. package/src/modules/webhooks/repository/index.ts +16 -14
  111. package/src/runtime/commerce.ts +10 -0
  112. package/src/runtime/kernel.ts +16 -2
  113. package/src/runtime/server.ts +22 -42
@@ -11,6 +11,7 @@ import { withTiming } from "../kernel/service-timing.js";
11
11
  import { setBootDefaultOrgId } from "../auth/org.js";
12
12
  import { setBootStrictOrgResolution } from "../auth/strict-org-resolution.js";
13
13
  import { DrizzleJobsAdapter } from "../kernel/jobs/drizzle-adapter.js";
14
+ import type { ExecutionEngine } from "../kernel/jobs/adapter.js";
14
15
  import { CompensationFailuresRepository } from "../kernel/compensation/repository.js";
15
16
 
16
17
  import {
@@ -72,8 +73,21 @@ export function createKernel(config: CommerceConfig): Kernel {
72
73
  const jobsTaskMap = new Map(
73
74
  (config.jobs?.tasks ?? []).map((t) => [t.slug, t]),
74
75
  );
75
- const jobsAdapter = new DrizzleJobsAdapter(db, jobsTaskMap);
76
- serviceContainer.jobs = jobsAdapter;
76
+ const jobsEngine: ExecutionEngine =
77
+ config.jobs?.adapter ?? new DrizzleJobsAdapter(db);
78
+ const jobLogger = {
79
+ info: (message: string, data?: unknown) => logger.info(message, data),
80
+ warn: (message: string, data?: unknown) => logger.warn(message, data),
81
+ error: (message: string, data?: unknown) => logger.error(message, data),
82
+ };
83
+ jobsEngine.register({
84
+ tasks: jobsTaskMap,
85
+ context: { logger: jobLogger, db, services: serviceContainer },
86
+ ...(config.jobs?.processingOrder !== undefined
87
+ ? { processingOrder: config.jobs.processingOrder }
88
+ : {}),
89
+ });
90
+ serviceContainer.jobs = jobsEngine;
77
91
 
78
92
  const topoGraph = kernelModulesForTopoSort();
79
93
  const order = topoSortModules(topoGraph);
@@ -17,7 +17,6 @@ import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.j
17
17
  import { createKernel } from "./kernel.js";
18
18
  import { ensureDefaultOrg } from "../auth/org.js";
19
19
  import { createLogger, type Logger } from "./logger.js";
20
- import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
21
20
  import { createCommerce, type CommerceInstance } from "./commerce.js";
22
21
  import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
23
22
  import { mapErrorToResponse } from "../kernel/error-mapper.js";
@@ -408,48 +407,18 @@ export async function createServer(config: CommerceConfig) {
408
407
  // 2. GET /api/jobs/run: cron endpoint (serverless — Vercel, Cloudflare)
409
408
  // 3. runPendingJobs() export (custom worker process)
410
409
 
411
- const { runPendingJobs } = await import("../kernel/jobs/runner.js");
412
- const { runStaleJobReaper, getJobReapThresholdMs, getJobsReaperIntervalMs } =
413
- await import("../kernel/jobs/reaper.js");
414
- const taskMap = new Map<string, unknown>();
415
- for (const task of config.jobs?.tasks ?? []) {
416
- const t = task as { slug?: string; name?: string };
417
- taskMap.set(t.slug ?? t.name ?? "", task);
418
- }
419
-
420
- const jobLogger = {
421
- info: (msg: string, data?: unknown) => logger.info(data != null ? { data } : {}, msg),
422
- warn: (msg: string, data?: unknown) => logger.warn(data != null ? { data } : {}, msg),
423
- error: (msg: string, data?: unknown) => logger.error(data != null ? { data } : {}, msg),
424
- };
425
-
426
- let lastStaleJobReaperAt = 0;
410
+ const jobsEngine = (kernel.services as Record<string, unknown>)
411
+ .jobs as import("../kernel/jobs/adapter.js").ExecutionEngine;
427
412
 
428
- const maybeRunStaleJobReaper = async () => {
429
- const interval = getJobsReaperIntervalMs();
430
- const now = Date.now();
431
- if (now - lastStaleJobReaperAt < interval) return;
432
- lastStaleJobReaperAt = now;
433
- try {
434
- await runStaleJobReaper(
435
- kernel.database.db as DrizzleDatabase,
436
- getJobReapThresholdMs(),
437
- jobLogger,
413
+ const runJobs = async (queue?: string, limit?: number) => {
414
+ if (jobsEngine.execution.mode !== "pull") {
415
+ throw new Error(
416
+ "The configured push execution engine is driven by its native runtime and cannot be polled with runJobs().",
438
417
  );
439
- } catch (err) {
440
- logger.error({ err }, "Stale job reaper failed");
441
418
  }
442
- };
443
-
444
- const runJobs = async (queue?: string, limit?: number) => {
445
- await maybeRunStaleJobReaper();
446
- return runPendingJobs({
447
- db: kernel.database.db as DrizzleDatabase,
448
- tasks: taskMap as Parameters<typeof runPendingJobs>[0]["tasks"],
419
+ return jobsEngine.execution.run({
449
420
  queue: queue ?? "default",
450
421
  limit: limit ?? 10,
451
- logger: jobLogger,
452
- services: kernel.services as Parameters<typeof runPendingJobs>[0]["services"],
453
422
  });
454
423
  };
455
424
 
@@ -478,6 +447,11 @@ export async function createServer(config: CommerceConfig) {
478
447
  // Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
479
448
  // Enable via config.jobs.autorun.enabled = true
480
449
  if (config.jobs?.autorun?.enabled) {
450
+ if (jobsEngine.execution.mode !== "pull") {
451
+ throw new Error(
452
+ "jobs.autorun is only valid for pull execution engines. Serve the configured push engine through its native runtime.",
453
+ );
454
+ }
481
455
  const intervalMs = config.jobs.autorun.intervalMs ?? 10_000;
482
456
 
483
457
  const jobInterval = setInterval(async () => {
@@ -494,10 +468,16 @@ export async function createServer(config: CommerceConfig) {
494
468
 
495
469
  logger.info({ intervalMs }, "Job queue autorun started (in-process polling)");
496
470
  } else {
497
- logger.info(
498
- "Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
499
- "or set config.jobs.autorun.enabled = true for in-process polling.",
500
- );
471
+ if (jobsEngine.execution.mode === "push") {
472
+ logger.info(
473
+ "Push job engine registered. Serve it through its native runtime.",
474
+ );
475
+ } else {
476
+ logger.info(
477
+ "Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
478
+ "or set config.jobs.autorun.enabled = true for in-process polling.",
479
+ );
480
+ }
501
481
  }
502
482
 
503
483
  const dispatchFetch = app.fetch.bind(app);