@endora-commerce/platform 0.100.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.
Files changed (657) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/cli/dispatch.d.ts +146 -0
  4. package/dist/cli/dispatch.d.ts.map +1 -0
  5. package/dist/cli/dispatch.js +259 -0
  6. package/dist/cli/dispatch.js.map +1 -0
  7. package/dist/cli/index.d.ts +58 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +58 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/module-commands.d.ts +118 -0
  12. package/dist/cli/module-commands.d.ts.map +1 -0
  13. package/dist/cli/module-commands.js +120 -0
  14. package/dist/cli/module-commands.js.map +1 -0
  15. package/dist/commands/actor.d.ts +19 -0
  16. package/dist/commands/actor.d.ts.map +1 -0
  17. package/dist/commands/actor.js +45 -0
  18. package/dist/commands/actor.js.map +1 -0
  19. package/dist/commands/audit-from-context.d.ts +24 -0
  20. package/dist/commands/audit-from-context.d.ts.map +1 -0
  21. package/dist/commands/audit-from-context.js +28 -0
  22. package/dist/commands/audit-from-context.js.map +1 -0
  23. package/dist/commands/command-bus.d.ts +40 -0
  24. package/dist/commands/command-bus.d.ts.map +1 -0
  25. package/dist/commands/command-bus.js +46 -0
  26. package/dist/commands/command-bus.js.map +1 -0
  27. package/dist/commands/command.d.ts +76 -0
  28. package/dist/commands/command.d.ts.map +1 -0
  29. package/dist/commands/command.js +2 -0
  30. package/dist/commands/command.js.map +1 -0
  31. package/dist/commands/index.d.ts +65 -0
  32. package/dist/commands/index.d.ts.map +1 -0
  33. package/dist/commands/index.js +57 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/reversible.d.ts +66 -0
  36. package/dist/commands/reversible.d.ts.map +1 -0
  37. package/dist/commands/reversible.js +41 -0
  38. package/dist/commands/reversible.js.map +1 -0
  39. package/dist/composition/compose-app.d.ts +305 -0
  40. package/dist/composition/compose-app.d.ts.map +1 -0
  41. package/dist/composition/compose-app.js +939 -0
  42. package/dist/composition/compose-app.js.map +1 -0
  43. package/dist/composition/index.d.ts +92 -0
  44. package/dist/composition/index.d.ts.map +1 -0
  45. package/dist/composition/index.js +175 -0
  46. package/dist/composition/index.js.map +1 -0
  47. package/dist/composition/newsletter-token-secret.d.ts +19 -0
  48. package/dist/composition/newsletter-token-secret.d.ts.map +1 -0
  49. package/dist/composition/newsletter-token-secret.js +24 -0
  50. package/dist/composition/newsletter-token-secret.js.map +1 -0
  51. package/dist/composition/process-runs-workers.d.ts +17 -0
  52. package/dist/composition/process-runs-workers.d.ts.map +1 -0
  53. package/dist/composition/process-runs-workers.js +19 -0
  54. package/dist/composition/process-runs-workers.js.map +1 -0
  55. package/dist/db/baseline-migration-inventory.d.ts +15 -0
  56. package/dist/db/baseline-migration-inventory.d.ts.map +1 -0
  57. package/dist/db/baseline-migration-inventory.js +115 -0
  58. package/dist/db/baseline-migration-inventory.js.map +1 -0
  59. package/dist/db/configured-entities.d.ts +74 -0
  60. package/dist/db/configured-entities.d.ts.map +1 -0
  61. package/dist/db/configured-entities.js +20 -0
  62. package/dist/db/configured-entities.js.map +1 -0
  63. package/dist/db/configured-migrations.d.ts +199 -0
  64. package/dist/db/configured-migrations.d.ts.map +1 -0
  65. package/dist/db/configured-migrations.js +181 -0
  66. package/dist/db/configured-migrations.js.map +1 -0
  67. package/dist/db/index.d.ts +54 -0
  68. package/dist/db/index.d.ts.map +1 -0
  69. package/dist/db/index.js +54 -0
  70. package/dist/db/index.js.map +1 -0
  71. package/dist/db/migrate.d.ts +21 -0
  72. package/dist/db/migrate.d.ts.map +1 -0
  73. package/dist/db/migrate.js +48 -0
  74. package/dist/db/migrate.js.map +1 -0
  75. package/dist/db/migration-order.d.ts +159 -0
  76. package/dist/db/migration-order.d.ts.map +1 -0
  77. package/dist/db/migration-order.js +273 -0
  78. package/dist/db/migration-order.js.map +1 -0
  79. package/dist/db/mikro-orm.config.d.ts +51 -0
  80. package/dist/db/mikro-orm.config.d.ts.map +1 -0
  81. package/dist/db/mikro-orm.config.js +64 -0
  82. package/dist/db/mikro-orm.config.js.map +1 -0
  83. package/dist/db/orm.d.ts +40 -0
  84. package/dist/db/orm.d.ts.map +1 -0
  85. package/dist/db/orm.js +25 -0
  86. package/dist/db/orm.js.map +1 -0
  87. package/dist/db/platform-schema.d.ts +102 -0
  88. package/dist/db/platform-schema.d.ts.map +1 -0
  89. package/dist/db/platform-schema.js +79 -0
  90. package/dist/db/platform-schema.js.map +1 -0
  91. package/dist/db/pluralizing-naming-strategy.d.ts +16 -0
  92. package/dist/db/pluralizing-naming-strategy.d.ts.map +1 -0
  93. package/dist/db/pluralizing-naming-strategy.js +66 -0
  94. package/dist/db/pluralizing-naming-strategy.js.map +1 -0
  95. package/dist/demo/guard.d.ts +101 -0
  96. package/dist/demo/guard.d.ts.map +1 -0
  97. package/dist/demo/guard.js +168 -0
  98. package/dist/demo/guard.js.map +1 -0
  99. package/dist/demo/host-command.d.ts +133 -0
  100. package/dist/demo/host-command.d.ts.map +1 -0
  101. package/dist/demo/host-command.js +113 -0
  102. package/dist/demo/host-command.js.map +1 -0
  103. package/dist/demo/index.d.ts +82 -0
  104. package/dist/demo/index.d.ts.map +1 -0
  105. package/dist/demo/index.js +82 -0
  106. package/dist/demo/index.js.map +1 -0
  107. package/dist/demo/packages.d.ts +67 -0
  108. package/dist/demo/packages.d.ts.map +1 -0
  109. package/dist/demo/packages.js +132 -0
  110. package/dist/demo/packages.js.map +1 -0
  111. package/dist/demo/plan.d.ts +111 -0
  112. package/dist/demo/plan.d.ts.map +1 -0
  113. package/dist/demo/plan.js +74 -0
  114. package/dist/demo/plan.js.map +1 -0
  115. package/dist/demo/report.d.ts +17 -0
  116. package/dist/demo/report.d.ts.map +1 -0
  117. package/dist/demo/report.js +85 -0
  118. package/dist/demo/report.js.map +1 -0
  119. package/dist/demo/runner.d.ts +207 -0
  120. package/dist/demo/runner.d.ts.map +1 -0
  121. package/dist/demo/runner.js +169 -0
  122. package/dist/demo/runner.js.map +1 -0
  123. package/dist/demo/scope.d.ts +44 -0
  124. package/dist/demo/scope.d.ts.map +1 -0
  125. package/dist/demo/scope.js +44 -0
  126. package/dist/demo/scope.js.map +1 -0
  127. package/dist/env/index.d.ts +68 -0
  128. package/dist/env/index.d.ts.map +1 -0
  129. package/dist/env/index.js +427 -0
  130. package/dist/env/index.js.map +1 -0
  131. package/dist/events/bus.d.ts +29 -0
  132. package/dist/events/bus.d.ts.map +1 -0
  133. package/dist/events/bus.js +67 -0
  134. package/dist/events/bus.js.map +1 -0
  135. package/dist/events/index.d.ts +19 -0
  136. package/dist/events/index.d.ts.map +1 -0
  137. package/dist/events/index.js +19 -0
  138. package/dist/events/index.js.map +1 -0
  139. package/dist/http/cursor.d.ts +10 -0
  140. package/dist/http/cursor.d.ts.map +1 -0
  141. package/dist/http/cursor.js +20 -0
  142. package/dist/http/cursor.js.map +1 -0
  143. package/dist/http/error-envelope.d.ts +127 -0
  144. package/dist/http/error-envelope.d.ts.map +1 -0
  145. package/dist/http/error-envelope.js +402 -0
  146. package/dist/http/error-envelope.js.map +1 -0
  147. package/dist/http/health.d.ts +88 -0
  148. package/dist/http/health.d.ts.map +1 -0
  149. package/dist/http/health.js +77 -0
  150. package/dist/http/health.js.map +1 -0
  151. package/dist/http/index.d.ts +50 -0
  152. package/dist/http/index.d.ts.map +1 -0
  153. package/dist/http/index.js +50 -0
  154. package/dist/http/index.js.map +1 -0
  155. package/dist/http/interceptors/dispatch.d.ts +14 -0
  156. package/dist/http/interceptors/dispatch.d.ts.map +1 -0
  157. package/dist/http/interceptors/dispatch.js +113 -0
  158. package/dist/http/interceptors/dispatch.js.map +1 -0
  159. package/dist/http/interceptors/index.d.ts +6 -0
  160. package/dist/http/interceptors/index.d.ts.map +1 -0
  161. package/dist/http/interceptors/index.js +5 -0
  162. package/dist/http/interceptors/index.js.map +1 -0
  163. package/dist/http/interceptors/registry.d.ts +44 -0
  164. package/dist/http/interceptors/registry.d.ts.map +1 -0
  165. package/dist/http/interceptors/registry.js +123 -0
  166. package/dist/http/interceptors/registry.js.map +1 -0
  167. package/dist/http/interceptors/route-table.d.ts +33 -0
  168. package/dist/http/interceptors/route-table.d.ts.map +1 -0
  169. package/dist/http/interceptors/route-table.js +39 -0
  170. package/dist/http/interceptors/route-table.js.map +1 -0
  171. package/dist/http/interceptors/types.d.ts +101 -0
  172. package/dist/http/interceptors/types.d.ts.map +1 -0
  173. package/dist/http/interceptors/types.js +2 -0
  174. package/dist/http/interceptors/types.js.map +1 -0
  175. package/dist/http/interceptors/validation.d.ts +22 -0
  176. package/dist/http/interceptors/validation.d.ts.map +1 -0
  177. package/dist/http/interceptors/validation.js +39 -0
  178. package/dist/http/interceptors/validation.js.map +1 -0
  179. package/dist/http/logger.d.ts +9 -0
  180. package/dist/http/logger.d.ts.map +1 -0
  181. package/dist/http/logger.js +25 -0
  182. package/dist/http/logger.js.map +1 -0
  183. package/dist/http/openapi.d.ts +21 -0
  184. package/dist/http/openapi.d.ts.map +1 -0
  185. package/dist/http/openapi.js +114 -0
  186. package/dist/http/openapi.js.map +1 -0
  187. package/dist/http/product-audience.d.ts +78 -0
  188. package/dist/http/product-audience.d.ts.map +1 -0
  189. package/dist/http/product-audience.js +92 -0
  190. package/dist/http/product-audience.js.map +1 -0
  191. package/dist/http/request-actor.d.ts +82 -0
  192. package/dist/http/request-actor.d.ts.map +1 -0
  193. package/dist/http/request-actor.js +2 -0
  194. package/dist/http/request-actor.js.map +1 -0
  195. package/dist/http/server.d.ts +60 -0
  196. package/dist/http/server.d.ts.map +1 -0
  197. package/dist/http/server.js +117 -0
  198. package/dist/http/server.js.map +1 -0
  199. package/dist/http/storefront-revalidator.d.ts +29 -0
  200. package/dist/http/storefront-revalidator.d.ts.map +1 -0
  201. package/dist/http/storefront-revalidator.js +34 -0
  202. package/dist/http/storefront-revalidator.js.map +1 -0
  203. package/dist/http/test-actor-carrier.d.ts +28 -0
  204. package/dist/http/test-actor-carrier.d.ts.map +1 -0
  205. package/dist/http/test-actor-carrier.js +10 -0
  206. package/dist/http/test-actor-carrier.js.map +1 -0
  207. package/dist/http/trusted-proxy.d.ts +48 -0
  208. package/dist/http/trusted-proxy.d.ts.map +1 -0
  209. package/dist/http/trusted-proxy.js +136 -0
  210. package/dist/http/trusted-proxy.js.map +1 -0
  211. package/dist/kernel/audit/audit-log-entry.entity.d.ts +33 -0
  212. package/dist/kernel/audit/audit-log-entry.entity.d.ts.map +1 -0
  213. package/dist/kernel/audit/audit-log-entry.entity.js +102 -0
  214. package/dist/kernel/audit/audit-log-entry.entity.js.map +1 -0
  215. package/dist/kernel/audit/audit-log-service.d.ts +63 -0
  216. package/dist/kernel/audit/audit-log-service.d.ts.map +1 -0
  217. package/dist/kernel/audit/audit-log-service.js +107 -0
  218. package/dist/kernel/audit/audit-log-service.js.map +1 -0
  219. package/dist/kernel/cache/in-process-cache-registry.d.ts +93 -0
  220. package/dist/kernel/cache/in-process-cache-registry.d.ts.map +1 -0
  221. package/dist/kernel/cache/in-process-cache-registry.js +78 -0
  222. package/dist/kernel/cache/in-process-cache-registry.js.map +1 -0
  223. package/dist/kernel/cache/shared-drop-marks.d.ts +39 -0
  224. package/dist/kernel/cache/shared-drop-marks.d.ts.map +1 -0
  225. package/dist/kernel/cache/shared-drop-marks.js +68 -0
  226. package/dist/kernel/cache/shared-drop-marks.js.map +1 -0
  227. package/dist/kernel/compose.d.ts +234 -0
  228. package/dist/kernel/compose.d.ts.map +1 -0
  229. package/dist/kernel/compose.js +279 -0
  230. package/dist/kernel/compose.js.map +1 -0
  231. package/dist/kernel/container.d.ts +95 -0
  232. package/dist/kernel/container.d.ts.map +1 -0
  233. package/dist/kernel/container.js +90 -0
  234. package/dist/kernel/container.js.map +1 -0
  235. package/dist/kernel/contribution-sinks.d.ts +106 -0
  236. package/dist/kernel/contribution-sinks.d.ts.map +1 -0
  237. package/dist/kernel/contribution-sinks.js +153 -0
  238. package/dist/kernel/contribution-sinks.js.map +1 -0
  239. package/dist/kernel/crypto/password-hasher.d.ts +3 -0
  240. package/dist/kernel/crypto/password-hasher.d.ts.map +1 -0
  241. package/dist/kernel/crypto/password-hasher.js +44 -0
  242. package/dist/kernel/crypto/password-hasher.js.map +1 -0
  243. package/dist/kernel/i18n/error-envelope-options.d.ts +56 -0
  244. package/dist/kernel/i18n/error-envelope-options.d.ts.map +1 -0
  245. package/dist/kernel/i18n/error-envelope-options.js +46 -0
  246. package/dist/kernel/i18n/error-envelope-options.js.map +1 -0
  247. package/dist/kernel/i18n/error-translation.d.ts +144 -0
  248. package/dist/kernel/i18n/error-translation.d.ts.map +1 -0
  249. package/dist/kernel/i18n/error-translation.js +84 -0
  250. package/dist/kernel/i18n/error-translation.js.map +1 -0
  251. package/dist/kernel/i18n/request-language.d.ts +80 -0
  252. package/dist/kernel/i18n/request-language.d.ts.map +1 -0
  253. package/dist/kernel/i18n/request-language.js +168 -0
  254. package/dist/kernel/i18n/request-language.js.map +1 -0
  255. package/dist/kernel/index.d.ts +142 -0
  256. package/dist/kernel/index.d.ts.map +1 -0
  257. package/dist/kernel/index.js +160 -0
  258. package/dist/kernel/index.js.map +1 -0
  259. package/dist/kernel/lazy-port.d.ts +59 -0
  260. package/dist/kernel/lazy-port.d.ts.map +1 -0
  261. package/dist/kernel/lazy-port.js +78 -0
  262. package/dist/kernel/lazy-port.js.map +1 -0
  263. package/dist/kernel/lifecycle/activation-resolver.d.ts +63 -0
  264. package/dist/kernel/lifecycle/activation-resolver.d.ts.map +1 -0
  265. package/dist/kernel/lifecycle/activation-resolver.js +70 -0
  266. package/dist/kernel/lifecycle/activation-resolver.js.map +1 -0
  267. package/dist/kernel/lifecycle/capability-registry.d.ts +145 -0
  268. package/dist/kernel/lifecycle/capability-registry.d.ts.map +1 -0
  269. package/dist/kernel/lifecycle/capability-registry.js +170 -0
  270. package/dist/kernel/lifecycle/capability-registry.js.map +1 -0
  271. package/dist/kernel/lifecycle/effective-state.d.ts +126 -0
  272. package/dist/kernel/lifecycle/effective-state.d.ts.map +1 -0
  273. package/dist/kernel/lifecycle/effective-state.js +111 -0
  274. package/dist/kernel/lifecycle/effective-state.js.map +1 -0
  275. package/dist/kernel/lifecycle/module-registration.entity.d.ts +57 -0
  276. package/dist/kernel/lifecycle/module-registration.entity.d.ts.map +1 -0
  277. package/dist/kernel/lifecycle/module-registration.entity.js +111 -0
  278. package/dist/kernel/lifecycle/module-registration.entity.js.map +1 -0
  279. package/dist/kernel/lifecycle/plugin-helpers.d.ts +165 -0
  280. package/dist/kernel/lifecycle/plugin-helpers.d.ts.map +1 -0
  281. package/dist/kernel/lifecycle/plugin-helpers.js +395 -0
  282. package/dist/kernel/lifecycle/plugin-helpers.js.map +1 -0
  283. package/dist/kernel/lifecycle/registry-cache.d.ts +318 -0
  284. package/dist/kernel/lifecycle/registry-cache.d.ts.map +1 -0
  285. package/dist/kernel/lifecycle/registry-cache.js +509 -0
  286. package/dist/kernel/lifecycle/registry-cache.js.map +1 -0
  287. package/dist/kernel/lifecycle/required-modules.d.ts +137 -0
  288. package/dist/kernel/lifecycle/required-modules.d.ts.map +1 -0
  289. package/dist/kernel/lifecycle/required-modules.js +80 -0
  290. package/dist/kernel/lifecycle/required-modules.js.map +1 -0
  291. package/dist/kernel/lifecycle/unique-module-ids.d.ts +58 -0
  292. package/dist/kernel/lifecycle/unique-module-ids.d.ts.map +1 -0
  293. package/dist/kernel/lifecycle/unique-module-ids.js +82 -0
  294. package/dist/kernel/lifecycle/unique-module-ids.js.map +1 -0
  295. package/dist/kernel/logging.d.ts +116 -0
  296. package/dist/kernel/logging.d.ts.map +1 -0
  297. package/dist/kernel/logging.js +71 -0
  298. package/dist/kernel/logging.js.map +1 -0
  299. package/dist/kernel/module-context.d.ts +563 -0
  300. package/dist/kernel/module-context.d.ts.map +1 -0
  301. package/dist/kernel/module-context.js +670 -0
  302. package/dist/kernel/module-context.js.map +1 -0
  303. package/dist/kernel/ports/audit.d.ts +115 -0
  304. package/dist/kernel/ports/audit.d.ts.map +1 -0
  305. package/dist/kernel/ports/audit.js +2 -0
  306. package/dist/kernel/ports/audit.js.map +1 -0
  307. package/dist/kernel/ports/organizations.d.ts +56 -0
  308. package/dist/kernel/ports/organizations.d.ts.map +1 -0
  309. package/dist/kernel/ports/organizations.js +2 -0
  310. package/dist/kernel/ports/organizations.js.map +1 -0
  311. package/dist/kernel/ports/provide.d.ts +14 -0
  312. package/dist/kernel/ports/provide.d.ts.map +1 -0
  313. package/dist/kernel/ports/provide.js +50 -0
  314. package/dist/kernel/ports/provide.js.map +1 -0
  315. package/dist/kernel/ports/require-admin.d.ts +61 -0
  316. package/dist/kernel/ports/require-admin.d.ts.map +1 -0
  317. package/dist/kernel/ports/require-admin.js +2 -0
  318. package/dist/kernel/ports/require-admin.js.map +1 -0
  319. package/dist/kernel/ports/require-customer.d.ts +17 -0
  320. package/dist/kernel/ports/require-customer.d.ts.map +1 -0
  321. package/dist/kernel/ports/require-customer.js +2 -0
  322. package/dist/kernel/ports/require-customer.js.map +1 -0
  323. package/dist/kernel/ports/sales-channel.d.ts +84 -0
  324. package/dist/kernel/ports/sales-channel.d.ts.map +1 -0
  325. package/dist/kernel/ports/sales-channel.js +2 -0
  326. package/dist/kernel/ports/sales-channel.js.map +1 -0
  327. package/dist/kernel/ports/settings.d.ts +59 -0
  328. package/dist/kernel/ports/settings.d.ts.map +1 -0
  329. package/dist/kernel/ports/settings.js +2 -0
  330. package/dist/kernel/ports/settings.js.map +1 -0
  331. package/dist/kernel/public-api-base-url.d.ts +98 -0
  332. package/dist/kernel/public-api-base-url.d.ts.map +1 -0
  333. package/dist/kernel/public-api-base-url.js +144 -0
  334. package/dist/kernel/public-api-base-url.js.map +1 -0
  335. package/dist/kernel/request-scope-hook.d.ts +63 -0
  336. package/dist/kernel/request-scope-hook.d.ts.map +1 -0
  337. package/dist/kernel/request-scope-hook.js +67 -0
  338. package/dist/kernel/request-scope-hook.js.map +1 -0
  339. package/dist/kernel/sales-channels/channel-bridge-registry.d.ts +109 -0
  340. package/dist/kernel/sales-channels/channel-bridge-registry.d.ts.map +1 -0
  341. package/dist/kernel/sales-channels/channel-bridge-registry.js +75 -0
  342. package/dist/kernel/sales-channels/channel-bridge-registry.js.map +1 -0
  343. package/dist/kernel/sales-channels/compose.d.ts +69 -0
  344. package/dist/kernel/sales-channels/compose.d.ts.map +1 -0
  345. package/dist/kernel/sales-channels/compose.js +43 -0
  346. package/dist/kernel/sales-channels/compose.js.map +1 -0
  347. package/dist/kernel/sales-channels/default-channel-reconciler.d.ts +66 -0
  348. package/dist/kernel/sales-channels/default-channel-reconciler.d.ts.map +1 -0
  349. package/dist/kernel/sales-channels/default-channel-reconciler.js +91 -0
  350. package/dist/kernel/sales-channels/default-channel-reconciler.js.map +1 -0
  351. package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts +28 -0
  352. package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts.map +1 -0
  353. package/dist/kernel/sales-channels/no-system-default-channel.error.js +33 -0
  354. package/dist/kernel/sales-channels/no-system-default-channel.error.js.map +1 -0
  355. package/dist/kernel/sales-channels/request-channel-assortment.d.ts +72 -0
  356. package/dist/kernel/sales-channels/request-channel-assortment.d.ts.map +1 -0
  357. package/dist/kernel/sales-channels/request-channel-assortment.js +83 -0
  358. package/dist/kernel/sales-channels/request-channel-assortment.js.map +1 -0
  359. package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts +157 -0
  360. package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts.map +1 -0
  361. package/dist/kernel/sales-channels/sales-channel-membership.service.js +302 -0
  362. package/dist/kernel/sales-channels/sales-channel-membership.service.js.map +1 -0
  363. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts +76 -0
  364. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts.map +1 -0
  365. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js +184 -0
  366. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js.map +1 -0
  367. package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts +82 -0
  368. package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts.map +1 -0
  369. package/dist/kernel/sales-channels/sales-channel-resolver.service.js +126 -0
  370. package/dist/kernel/sales-channels/sales-channel-resolver.service.js.map +1 -0
  371. package/dist/kernel/sales-channels/sales-channel.entity.d.ts +50 -0
  372. package/dist/kernel/sales-channels/sales-channel.entity.d.ts.map +1 -0
  373. package/dist/kernel/sales-channels/sales-channel.entity.js +132 -0
  374. package/dist/kernel/sales-channels/sales-channel.entity.js.map +1 -0
  375. package/dist/kernel/sales-channels/sales-channels-cache.d.ts +170 -0
  376. package/dist/kernel/sales-channels/sales-channels-cache.d.ts.map +1 -0
  377. package/dist/kernel/sales-channels/sales-channels-cache.js +243 -0
  378. package/dist/kernel/sales-channels/sales-channels-cache.js.map +1 -0
  379. package/dist/kernel/scope.d.ts +153 -0
  380. package/dist/kernel/scope.d.ts.map +1 -0
  381. package/dist/kernel/scope.js +172 -0
  382. package/dist/kernel/scope.js.map +1 -0
  383. package/dist/kernel/settings/compose.d.ts +49 -0
  384. package/dist/kernel/settings/compose.d.ts.map +1 -0
  385. package/dist/kernel/settings/compose.js +21 -0
  386. package/dist/kernel/settings/compose.js.map +1 -0
  387. package/dist/kernel/settings/manifest-reconciler.d.ts +78 -0
  388. package/dist/kernel/settings/manifest-reconciler.d.ts.map +1 -0
  389. package/dist/kernel/settings/manifest-reconciler.js +343 -0
  390. package/dist/kernel/settings/manifest-reconciler.js.map +1 -0
  391. package/dist/kernel/settings/secret-value-codec.d.ts +52 -0
  392. package/dist/kernel/settings/secret-value-codec.d.ts.map +1 -0
  393. package/dist/kernel/settings/secret-value-codec.js +102 -0
  394. package/dist/kernel/settings/secret-value-codec.js.map +1 -0
  395. package/dist/kernel/settings/setting-group.entity.d.ts +25 -0
  396. package/dist/kernel/settings/setting-group.entity.d.ts.map +1 -0
  397. package/dist/kernel/settings/setting-group.entity.js +79 -0
  398. package/dist/kernel/settings/setting-group.entity.js.map +1 -0
  399. package/dist/kernel/settings/setting-value.entity.d.ts +23 -0
  400. package/dist/kernel/settings/setting-value.entity.d.ts.map +1 -0
  401. package/dist/kernel/settings/setting-value.entity.js +66 -0
  402. package/dist/kernel/settings/setting-value.entity.js.map +1 -0
  403. package/dist/kernel/settings/setting.entity.d.ts +56 -0
  404. package/dist/kernel/settings/setting.entity.d.ts.map +1 -0
  405. package/dist/kernel/settings/setting.entity.js +147 -0
  406. package/dist/kernel/settings/setting.entity.js.map +1 -0
  407. package/dist/kernel/settings/settings-cache.d.ts +158 -0
  408. package/dist/kernel/settings/settings-cache.d.ts.map +1 -0
  409. package/dist/kernel/settings/settings-cache.js +253 -0
  410. package/dist/kernel/settings/settings-cache.js.map +1 -0
  411. package/dist/kernel/settings/settings.service.d.ts +142 -0
  412. package/dist/kernel/settings/settings.service.d.ts.map +1 -0
  413. package/dist/kernel/settings/settings.service.js +294 -0
  414. package/dist/kernel/settings/settings.service.js.map +1 -0
  415. package/dist/lifecycle/backend.d.ts +51 -0
  416. package/dist/lifecycle/backend.d.ts.map +1 -0
  417. package/dist/lifecycle/backend.js +40 -0
  418. package/dist/lifecycle/backend.js.map +1 -0
  419. package/dist/lifecycle/commands/activation.commands.d.ts +97 -0
  420. package/dist/lifecycle/commands/activation.commands.d.ts.map +1 -0
  421. package/dist/lifecycle/commands/activation.commands.js +142 -0
  422. package/dist/lifecycle/commands/activation.commands.js.map +1 -0
  423. package/dist/lifecycle/commands/disable.d.ts +3 -0
  424. package/dist/lifecycle/commands/disable.d.ts.map +1 -0
  425. package/dist/lifecycle/commands/disable.js +126 -0
  426. package/dist/lifecycle/commands/disable.js.map +1 -0
  427. package/dist/lifecycle/commands/enable.d.ts +3 -0
  428. package/dist/lifecycle/commands/enable.d.ts.map +1 -0
  429. package/dist/lifecycle/commands/enable.js +102 -0
  430. package/dist/lifecycle/commands/enable.js.map +1 -0
  431. package/dist/lifecycle/commands/install.d.ts +3 -0
  432. package/dist/lifecycle/commands/install.d.ts.map +1 -0
  433. package/dist/lifecycle/commands/install.js +263 -0
  434. package/dist/lifecycle/commands/install.js.map +1 -0
  435. package/dist/lifecycle/commands/operator-entry.d.ts +104 -0
  436. package/dist/lifecycle/commands/operator-entry.d.ts.map +1 -0
  437. package/dist/lifecycle/commands/operator-entry.js +127 -0
  438. package/dist/lifecycle/commands/operator-entry.js.map +1 -0
  439. package/dist/lifecycle/commands/operator-runtime.d.ts +147 -0
  440. package/dist/lifecycle/commands/operator-runtime.d.ts.map +1 -0
  441. package/dist/lifecycle/commands/operator-runtime.js +40 -0
  442. package/dist/lifecycle/commands/operator-runtime.js.map +1 -0
  443. package/dist/lifecycle/commands/status.d.ts +3 -0
  444. package/dist/lifecycle/commands/status.d.ts.map +1 -0
  445. package/dist/lifecycle/commands/status.js +108 -0
  446. package/dist/lifecycle/commands/status.js.map +1 -0
  447. package/dist/lifecycle/commands/uninstall.d.ts +3 -0
  448. package/dist/lifecycle/commands/uninstall.d.ts.map +1 -0
  449. package/dist/lifecycle/commands/uninstall.js +223 -0
  450. package/dist/lifecycle/commands/uninstall.js.map +1 -0
  451. package/dist/lifecycle/divergence-declaration.d.ts +74 -0
  452. package/dist/lifecycle/divergence-declaration.d.ts.map +1 -0
  453. package/dist/lifecycle/divergence-declaration.js +92 -0
  454. package/dist/lifecycle/divergence-declaration.js.map +1 -0
  455. package/dist/lifecycle/i18n/en.json +4 -0
  456. package/dist/lifecycle/i18n/pl.json +4 -0
  457. package/dist/lifecycle/index.d.ts +110 -0
  458. package/dist/lifecycle/index.d.ts.map +1 -0
  459. package/dist/lifecycle/index.js +189 -0
  460. package/dist/lifecycle/index.js.map +1 -0
  461. package/dist/lifecycle/manifest-registry.d.ts +244 -0
  462. package/dist/lifecycle/manifest-registry.d.ts.map +1 -0
  463. package/dist/lifecycle/manifest-registry.js +223 -0
  464. package/dist/lifecycle/manifest-registry.js.map +1 -0
  465. package/dist/lifecycle/manifest.d.ts +166 -0
  466. package/dist/lifecycle/manifest.d.ts.map +1 -0
  467. package/dist/lifecycle/manifest.js +121 -0
  468. package/dist/lifecycle/manifest.js.map +1 -0
  469. package/dist/lifecycle/plugin.d.ts +56 -0
  470. package/dist/lifecycle/plugin.d.ts.map +1 -0
  471. package/dist/lifecycle/plugin.js +59 -0
  472. package/dist/lifecycle/plugin.js.map +1 -0
  473. package/dist/lifecycle/resident.d.ts +16 -0
  474. package/dist/lifecycle/resident.d.ts.map +1 -0
  475. package/dist/lifecycle/resident.js +59 -0
  476. package/dist/lifecycle/resident.js.map +1 -0
  477. package/dist/lifecycle/routes.admin.d.ts +57 -0
  478. package/dist/lifecycle/routes.admin.d.ts.map +1 -0
  479. package/dist/lifecycle/routes.admin.js +162 -0
  480. package/dist/lifecycle/routes.admin.js.map +1 -0
  481. package/dist/lifecycle/routes.storefront.d.ts +26 -0
  482. package/dist/lifecycle/routes.storefront.d.ts.map +1 -0
  483. package/dist/lifecycle/routes.storefront.js +36 -0
  484. package/dist/lifecycle/routes.storefront.js.map +1 -0
  485. package/dist/lifecycle/services/deactivation-ledger.d.ts +216 -0
  486. package/dist/lifecycle/services/deactivation-ledger.d.ts.map +1 -0
  487. package/dist/lifecycle/services/deactivation-ledger.js +171 -0
  488. package/dist/lifecycle/services/deactivation-ledger.js.map +1 -0
  489. package/dist/lifecycle/services/dep-graph.d.ts +119 -0
  490. package/dist/lifecycle/services/dep-graph.d.ts.map +1 -0
  491. package/dist/lifecycle/services/dep-graph.js +334 -0
  492. package/dist/lifecycle/services/dep-graph.js.map +1 -0
  493. package/dist/lifecycle/services/gating-graph.d.ts +164 -0
  494. package/dist/lifecycle/services/gating-graph.d.ts.map +1 -0
  495. package/dist/lifecycle/services/gating-graph.js +203 -0
  496. package/dist/lifecycle/services/gating-graph.js.map +1 -0
  497. package/dist/lifecycle/services/lock.d.ts +27 -0
  498. package/dist/lifecycle/services/lock.d.ts.map +1 -0
  499. package/dist/lifecycle/services/lock.js +82 -0
  500. package/dist/lifecycle/services/lock.js.map +1 -0
  501. package/dist/lifecycle/services/manifest-loader.d.ts +125 -0
  502. package/dist/lifecycle/services/manifest-loader.d.ts.map +1 -0
  503. package/dist/lifecycle/services/manifest-loader.js +210 -0
  504. package/dist/lifecycle/services/manifest-loader.js.map +1 -0
  505. package/dist/lifecycle/services/migration-ownership.d.ts +36 -0
  506. package/dist/lifecycle/services/migration-ownership.d.ts.map +1 -0
  507. package/dist/lifecycle/services/migration-ownership.js +15 -0
  508. package/dist/lifecycle/services/migration-ownership.js.map +1 -0
  509. package/dist/lifecycle/services/module-id-claims.d.ts +38 -0
  510. package/dist/lifecycle/services/module-id-claims.d.ts.map +1 -0
  511. package/dist/lifecycle/services/module-id-claims.js +123 -0
  512. package/dist/lifecycle/services/module-id-claims.js.map +1 -0
  513. package/dist/lifecycle/services/module-origin.d.ts +55 -0
  514. package/dist/lifecycle/services/module-origin.d.ts.map +1 -0
  515. package/dist/lifecycle/services/module-origin.js +47 -0
  516. package/dist/lifecycle/services/module-origin.js.map +1 -0
  517. package/dist/lifecycle/services/orchestrator.d.ts +235 -0
  518. package/dist/lifecycle/services/orchestrator.d.ts.map +1 -0
  519. package/dist/lifecycle/services/orchestrator.js +954 -0
  520. package/dist/lifecycle/services/orchestrator.js.map +1 -0
  521. package/dist/lifecycle/services/presence-load.d.ts +281 -0
  522. package/dist/lifecycle/services/presence-load.d.ts.map +1 -0
  523. package/dist/lifecycle/services/presence-load.js +437 -0
  524. package/dist/lifecycle/services/presence-load.js.map +1 -0
  525. package/dist/lifecycle/services/static-registry.d.ts +47 -0
  526. package/dist/lifecycle/services/static-registry.d.ts.map +1 -0
  527. package/dist/lifecycle/services/static-registry.js +41 -0
  528. package/dist/lifecycle/services/static-registry.js.map +1 -0
  529. package/dist/migrations/20260424T165847_core_foundation_init.d.ts +25 -0
  530. package/dist/migrations/20260424T165847_core_foundation_init.d.ts.map +1 -0
  531. package/dist/migrations/20260424T165847_core_foundation_init.js +238 -0
  532. package/dist/migrations/20260424T165847_core_foundation_init.js.map +1 -0
  533. package/dist/migrations/20260425T050720_core_commerce_init.d.ts +19 -0
  534. package/dist/migrations/20260425T050720_core_commerce_init.d.ts.map +1 -0
  535. package/dist/migrations/20260425T050720_core_commerce_init.js +200 -0
  536. package/dist/migrations/20260425T050720_core_commerce_init.js.map +1 -0
  537. package/dist/migrations/20260430T101450_core_settings_init.d.ts +25 -0
  538. package/dist/migrations/20260430T101450_core_settings_init.d.ts.map +1 -0
  539. package/dist/migrations/20260430T101450_core_settings_init.js +113 -0
  540. package/dist/migrations/20260430T101450_core_settings_init.js.map +1 -0
  541. package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts +67 -0
  542. package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts.map +1 -0
  543. package/dist/migrations/20260430T170044_core_sales_channels_promote.js +101 -0
  544. package/dist/migrations/20260430T170044_core_sales_channels_promote.js.map +1 -0
  545. package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts +21 -0
  546. package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts.map +1 -0
  547. package/dist/migrations/20260506T200657_core_module_lifecycle_init.js +41 -0
  548. package/dist/migrations/20260506T200657_core_module_lifecycle_init.js.map +1 -0
  549. package/dist/migrations/20260514T111329_core_settings_global_value.d.ts +30 -0
  550. package/dist/migrations/20260514T111329_core_settings_global_value.d.ts.map +1 -0
  551. package/dist/migrations/20260514T111329_core_settings_global_value.js +34 -0
  552. package/dist/migrations/20260514T111329_core_settings_global_value.js.map +1 -0
  553. package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts +26 -0
  554. package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts.map +1 -0
  555. package/dist/migrations/20260611T140411_core_settings_secret_value_type.js +63 -0
  556. package/dist/migrations/20260611T140411_core_settings_secret_value_type.js.map +1 -0
  557. package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts +19 -0
  558. package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts.map +1 -0
  559. package/dist/migrations/20260611T140419_core_settings_enum_options.js +23 -0
  560. package/dist/migrations/20260611T140419_core_settings_enum_options.js.map +1 -0
  561. package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts +20 -0
  562. package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts.map +1 -0
  563. package/dist/migrations/20260629T090100_core_settings_hidden_flag.js +24 -0
  564. package/dist/migrations/20260629T090100_core_settings_hidden_flag.js.map +1 -0
  565. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts +27 -0
  566. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts.map +1 -0
  567. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js +32 -0
  568. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js.map +1 -0
  569. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts +24 -0
  570. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts.map +1 -0
  571. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js +57 -0
  572. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js.map +1 -0
  573. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts +39 -0
  574. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts.map +1 -0
  575. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js +59 -0
  576. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js.map +1 -0
  577. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts +34 -0
  578. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts.map +1 -0
  579. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js +38 -0
  580. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js.map +1 -0
  581. package/dist/migrations/baseline-migrations.generated.d.ts +2 -0
  582. package/dist/migrations/baseline-migrations.generated.d.ts.map +1 -0
  583. package/dist/migrations/baseline-migrations.generated.js +136 -0
  584. package/dist/migrations/baseline-migrations.generated.js.map +1 -0
  585. package/dist/migrations/index.d.ts +62 -0
  586. package/dist/migrations/index.d.ts.map +1 -0
  587. package/dist/migrations/index.js +75 -0
  588. package/dist/migrations/index.js.map +1 -0
  589. package/dist/overlay/deployment-roots.d.ts +37 -0
  590. package/dist/overlay/deployment-roots.d.ts.map +1 -0
  591. package/dist/overlay/deployment-roots.js +90 -0
  592. package/dist/overlay/deployment-roots.js.map +1 -0
  593. package/dist/overlay/index.d.ts +62 -0
  594. package/dist/overlay/index.d.ts.map +1 -0
  595. package/dist/overlay/index.js +62 -0
  596. package/dist/overlay/index.js.map +1 -0
  597. package/dist/overlay/overlay-runtime.d.ts +173 -0
  598. package/dist/overlay/overlay-runtime.d.ts.map +1 -0
  599. package/dist/overlay/overlay-runtime.js +281 -0
  600. package/dist/overlay/overlay-runtime.js.map +1 -0
  601. package/dist/overlay/resolve-overlay.d.ts +41 -0
  602. package/dist/overlay/resolve-overlay.d.ts.map +1 -0
  603. package/dist/overlay/resolve-overlay.js +72 -0
  604. package/dist/overlay/resolve-overlay.js.map +1 -0
  605. package/dist/packages/index.d.ts +57 -0
  606. package/dist/packages/index.d.ts.map +1 -0
  607. package/dist/packages/index.js +57 -0
  608. package/dist/packages/index.js.map +1 -0
  609. package/dist/packages/installed-packages.d.ts +79 -0
  610. package/dist/packages/installed-packages.d.ts.map +1 -0
  611. package/dist/packages/installed-packages.js +312 -0
  612. package/dist/packages/installed-packages.js.map +1 -0
  613. package/dist/packages/package-entity-lookup.d.ts +120 -0
  614. package/dist/packages/package-entity-lookup.d.ts.map +1 -0
  615. package/dist/packages/package-entity-lookup.js +17 -0
  616. package/dist/packages/package-entity-lookup.js.map +1 -0
  617. package/dist/packages/package-runtime.d.ts +177 -0
  618. package/dist/packages/package-runtime.d.ts.map +1 -0
  619. package/dist/packages/package-runtime.js +386 -0
  620. package/dist/packages/package-runtime.js.map +1 -0
  621. package/dist/tenancy/derived-scope.d.ts +43 -0
  622. package/dist/tenancy/derived-scope.d.ts.map +1 -0
  623. package/dist/tenancy/derived-scope.js +76 -0
  624. package/dist/tenancy/derived-scope.js.map +1 -0
  625. package/dist/tenancy/escape-hatch.d.ts +30 -0
  626. package/dist/tenancy/escape-hatch.d.ts.map +1 -0
  627. package/dist/tenancy/escape-hatch.js +50 -0
  628. package/dist/tenancy/escape-hatch.js.map +1 -0
  629. package/dist/tenancy/filters.d.ts +87 -0
  630. package/dist/tenancy/filters.d.ts.map +1 -0
  631. package/dist/tenancy/filters.js +126 -0
  632. package/dist/tenancy/filters.js.map +1 -0
  633. package/dist/tenancy/index.d.ts +63 -0
  634. package/dist/tenancy/index.d.ts.map +1 -0
  635. package/dist/tenancy/index.js +61 -0
  636. package/dist/tenancy/index.js.map +1 -0
  637. package/dist/tenancy/org-scoped.decorator.d.ts +150 -0
  638. package/dist/tenancy/org-scoped.decorator.d.ts.map +1 -0
  639. package/dist/tenancy/org-scoped.decorator.js +339 -0
  640. package/dist/tenancy/org-scoped.decorator.js.map +1 -0
  641. package/dist/tenancy/org-write-guard.d.ts +106 -0
  642. package/dist/tenancy/org-write-guard.d.ts.map +1 -0
  643. package/dist/tenancy/org-write-guard.js +141 -0
  644. package/dist/tenancy/org-write-guard.js.map +1 -0
  645. package/dist/tenancy/resolve-tenant-context.d.ts +91 -0
  646. package/dist/tenancy/resolve-tenant-context.d.ts.map +1 -0
  647. package/dist/tenancy/resolve-tenant-context.js +85 -0
  648. package/dist/tenancy/resolve-tenant-context.js.map +1 -0
  649. package/dist/tenancy/scoped-em.d.ts +10 -0
  650. package/dist/tenancy/scoped-em.d.ts.map +1 -0
  651. package/dist/tenancy/scoped-em.js +11 -0
  652. package/dist/tenancy/scoped-em.js.map +1 -0
  653. package/dist/tenancy/tenant-context.d.ts +154 -0
  654. package/dist/tenancy/tenant-context.d.ts.map +1 -0
  655. package/dist/tenancy/tenant-context.js +109 -0
  656. package/dist/tenancy/tenant-context.js.map +1 -0
  657. package/package.json +123 -0
@@ -0,0 +1,157 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type ChannelMemberEntityType } from '@endora-commerce/contracts';
3
+ import type { AuditPort } from '../ports/audit.js';
4
+ import type { EventBus } from '../../events/bus.js';
5
+ import { SalesChannel } from './sales-channel.entity.js';
6
+ import { type ChannelBridgeRegistry } from './channel-bridge-registry.js';
7
+ /**
8
+ * SalesChannelMembershipService — feature 005 / T016.
9
+ *
10
+ * Single mutator for every M:N bridge between Sales Channels and the
11
+ * channel-scoped entity types (FR-009). Going through this service is
12
+ * mandatory: `check:module-boundary`'s `sql` predicate resolves every
13
+ * `sales_channel_*` table to its owner out of the DDL, so an owning module
14
+ * reaching for a bridge table in raw SQL is a ledgered finding (D-87). Until
15
+ * then this clause was credited to `no-unscoped-channel-query`, an ESLint rule
16
+ * wired into no config that never looked at a bridge table.
17
+ *
18
+ * Responsibilities:
19
+ *
20
+ * - {@link addToChannel} / {@link removeFromChannel} — idempotent
21
+ * mutations against the right bridge table.
22
+ * - The "at-least-one-channel" invariant (FR-008) — `removeFromChannel`
23
+ * refuses when it would leave an entity with zero channels, unless
24
+ * the caller passes `fallbackToDefault: true`, in which case the
25
+ * entity is re-bound to the system-default channel inside the
26
+ * same transaction.
27
+ * - {@link bindToDefaultIfEmpty} — wired into every owning module's
28
+ * create-path so entities created without explicit channels land
29
+ * in Default automatically (FR-011).
30
+ * - {@link listChannelsForEntity} / {@link listEntityIdsForChannel}
31
+ * — symmetric reads from either side of the relationship.
32
+ *
33
+ * Bridges are resolved through {@link ChannelBridgeRegistry}, which the
34
+ * module owning each entity type contributes to at compose time (feature 120,
35
+ * FR-015). This service used to hold the map itself, **total** over
36
+ * `ChannelMemberEntityTypeSchema` — nine module-owned tables named from inside
37
+ * the platform, which is D-52/D-53's prohibition expressed in a contract
38
+ * instead of an import, and which meant a membership call for an entity type
39
+ * whose module an instance never installed ran SQL against a relation that is
40
+ * not there. A member nothing registered now refuses before the database is
41
+ * touched (FR-017). The service uses `em.getConnection().execute()` (which
42
+ * honours the EM's active transaction — knex's `getKnex()` would bypass it via
43
+ * its own connection pool, breaking transactional integration tests).
44
+ *
45
+ * Every successful add / remove writes one audit row through
46
+ * {@link AuditPort} and emits one EventBus event. Idempotent
47
+ * no-ops (adding an existing membership / removing a missing one) are
48
+ * NOT audited because they did not change state.
49
+ */
50
+ export interface MembershipMutationOptions {
51
+ /** When true, falling to zero channels triggers automatic rebind to Default instead of refusal. */
52
+ fallbackToDefault?: boolean;
53
+ /** Optional admin actor for the audit row. */
54
+ actorAdminUserId?: string | null;
55
+ }
56
+ export interface MembershipMutationResult {
57
+ /** True if the mutation actually changed state (false for idempotent no-ops). */
58
+ changed: boolean;
59
+ /** Set when the FR-008 fallback was applied. */
60
+ fallbackAppliedToDefault?: boolean;
61
+ }
62
+ export declare class SalesChannelMembershipService {
63
+ private readonly emFactory;
64
+ private readonly eventBus;
65
+ private readonly auditLogService?;
66
+ private readonly bridges;
67
+ /**
68
+ * `bridges` defaults to the process-level registry the composition roots
69
+ * contribute into, so every existing construction site keeps working
70
+ * unchanged. Pass one explicitly to compose an isolated platform — or, in a
71
+ * test, to drive the FR-017 refusal without a database in reach.
72
+ */
73
+ constructor(emFactory: () => EntityManager, eventBus: EventBus, auditLogService?: AuditPort | undefined, bridges?: ChannelBridgeRegistry);
74
+ /**
75
+ * Add `entityId` to `channelId`'s member set for `entityType`. Idempotent —
76
+ * adding an existing membership returns `{ changed: false }` without
77
+ * touching the database.
78
+ */
79
+ addToChannel(channelId: string, entityType: ChannelMemberEntityType, entityId: string, options?: MembershipMutationOptions): Promise<MembershipMutationResult>;
80
+ /**
81
+ * Remove `entityId` from `channelId`'s member set for `entityType`. If the
82
+ * removal would leave the entity with zero channel bindings:
83
+ * - when `fallbackToDefault = true`: re-bind to the system-default
84
+ * channel inside the same transaction; mark the result with
85
+ * `fallbackAppliedToDefault: true`.
86
+ * - otherwise: throw `ENTITY_WOULD_HAVE_ZERO_CHANNELS` (HTTP 422).
87
+ *
88
+ * Idempotent on the row itself: removing a missing membership returns
89
+ * `{ changed: false }`.
90
+ */
91
+ removeFromChannel(channelId: string, entityType: ChannelMemberEntityType, entityId: string, options?: MembershipMutationOptions): Promise<MembershipMutationResult>;
92
+ /**
93
+ * If the entity has no memberships in any channel, bind it to the
94
+ * system-default channel. Wired into every owning module's create
95
+ * transaction (FR-011 / T027).
96
+ */
97
+ bindToDefaultIfEmpty(entityType: ChannelMemberEntityType, entityId: string): Promise<MembershipMutationResult>;
98
+ /**
99
+ * Give `targetEntityId` every channel `sourceEntityId` belongs to (issue #185).
100
+ *
101
+ * `catalog` duplicates a product and copies the source's whole channel
102
+ * assortment. It did that with one `insert … select` against
103
+ * `sales_channel_products` — Principle XII's accessor clause and Principle
104
+ * XIII in a single statement, because the bridge was written directly and not
105
+ * one of the memberships it created was audited.
106
+ *
107
+ * Implemented over {@link addToChannel} rather than as a set-based insert on
108
+ * purpose: that is what makes each new membership carry its audit row and its
109
+ * `sales_channel_membership_changed` event, which is the entire reason the
110
+ * copy moved here. An assortment is tens of channels at the very most, so the
111
+ * per-row round trip costs nothing worth the divergence.
112
+ *
113
+ * Memberships the target already holds are skipped by `addToChannel`'s own
114
+ * idempotency and are not counted.
115
+ */
116
+ copyMemberships(entityType: ChannelMemberEntityType, sourceEntityId: string, targetEntityId: string, options?: MembershipMutationOptions): Promise<{
117
+ copied: number;
118
+ }>;
119
+ /**
120
+ * Replace an entity's complete channel membership set atomically.
121
+ *
122
+ * Complete-record integrations use this instead of composing add/remove:
123
+ * product creation initially binds the system default, while the delivered
124
+ * record names the exact channel that must remain. A delete-then-add sequence
125
+ * through the public methods would either trip the zero-channel invariant or
126
+ * retain the unrelated default.
127
+ */
128
+ replaceChannelsForEntity(entityType: ChannelMemberEntityType, entityId: string, channelIds: readonly [string, ...string[]], options?: MembershipMutationOptions): Promise<MembershipMutationResult>;
129
+ /**
130
+ * Narrow a **known** set of entity ids to those bound to `channelId`
131
+ * (issue #185).
132
+ *
133
+ * The read half of the same finding. Three `catalog` services asked
134
+ * `select <entity>_id from sales_channel_<type> where sales_channel_id = ?
135
+ * and <entity>_id in (…)` by hand, one per channel-scoped listing, and every
136
+ * one of them fails closed to the empty set — which is the right behaviour
137
+ * and the wrong place to spell it.
138
+ *
139
+ * Not {@link listEntityIdsForChannel}: that one enumerates a channel's whole
140
+ * membership a page at a time, and a caller holding a page of ids wants the
141
+ * intersection rather than the enumeration. Using it here would mean pulling
142
+ * every product in the channel to filter twenty.
143
+ */
144
+ filterEntityIdsInChannel(channelId: string, entityType: ChannelMemberEntityType, entityIds: readonly string[]): Promise<string[]>;
145
+ /** Channels an entity currently belongs to. */
146
+ listChannelsForEntity(entityType: ChannelMemberEntityType, entityId: string): Promise<SalesChannel[]>;
147
+ /** Entity ids of `entityType` that currently belong to `channelId`. */
148
+ listEntityIdsForChannel(channelId: string, entityType: ChannelMemberEntityType, page?: number, pageSize?: number): Promise<{
149
+ entityIds: string[];
150
+ total: number;
151
+ }>;
152
+ private countMembershipsForEntity;
153
+ private requireSystemDefaultId;
154
+ private auditMembership;
155
+ private emitMembershipChanged;
156
+ }
157
+ //# sourceMappingURL=sales-channel-membership.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channel-membership.service.d.ts","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel-membership.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ import { ERROR_CODES, SALES_CHANNEL_AUDIT_ACTIONS, } from '@endora-commerce/contracts';
2
+ import { HttpError } from '../../http/error-envelope.js';
3
+ import { SalesChannel } from './sales-channel.entity.js';
4
+ import { channelBridges, } from './channel-bridge-registry.js';
5
+ export class SalesChannelMembershipService {
6
+ emFactory;
7
+ eventBus;
8
+ auditLogService;
9
+ bridges;
10
+ /**
11
+ * `bridges` defaults to the process-level registry the composition roots
12
+ * contribute into, so every existing construction site keeps working
13
+ * unchanged. Pass one explicitly to compose an isolated platform — or, in a
14
+ * test, to drive the FR-017 refusal without a database in reach.
15
+ */
16
+ constructor(emFactory, eventBus, auditLogService, bridges = channelBridges) {
17
+ this.emFactory = emFactory;
18
+ this.eventBus = eventBus;
19
+ this.auditLogService = auditLogService;
20
+ this.bridges = bridges;
21
+ }
22
+ /**
23
+ * Add `entityId` to `channelId`'s member set for `entityType`. Idempotent —
24
+ * adding an existing membership returns `{ changed: false }` without
25
+ * touching the database.
26
+ */
27
+ async addToChannel(channelId, entityType, entityId, options = {}) {
28
+ const bridge = this.bridges.require(entityType);
29
+ const em = this.emFactory();
30
+ const inserted = await em
31
+ .getConnection()
32
+ .execute(`insert into "${bridge.table}" ("sales_channel_id", "${bridge.entityIdColumn}") ` +
33
+ `values (?, ?) ` +
34
+ `on conflict ("sales_channel_id", "${bridge.entityIdColumn}") do nothing ` +
35
+ `returning "${bridge.entityIdColumn}"`, [channelId, entityId], 'all', em.getTransactionContext());
36
+ if (inserted.length === 0) {
37
+ return { changed: false };
38
+ }
39
+ await this.auditMembership(channelId, entityType, entityId, 'add', options);
40
+ this.emitMembershipChanged(channelId, entityType, entityId, 'add');
41
+ return { changed: true };
42
+ }
43
+ /**
44
+ * Remove `entityId` from `channelId`'s member set for `entityType`. If the
45
+ * removal would leave the entity with zero channel bindings:
46
+ * - when `fallbackToDefault = true`: re-bind to the system-default
47
+ * channel inside the same transaction; mark the result with
48
+ * `fallbackAppliedToDefault: true`.
49
+ * - otherwise: throw `ENTITY_WOULD_HAVE_ZERO_CHANNELS` (HTTP 422).
50
+ *
51
+ * Idempotent on the row itself: removing a missing membership returns
52
+ * `{ changed: false }`.
53
+ */
54
+ async removeFromChannel(channelId, entityType, entityId, options = {}) {
55
+ const bridge = this.bridges.require(entityType);
56
+ const em = this.emFactory();
57
+ // Step 1: check existence so the no-op path is idempotent and so FR-008
58
+ // can be evaluated BEFORE we delete anything.
59
+ const existing = await em
60
+ .getConnection()
61
+ .execute(`select 1 as present from "${bridge.table}" ` +
62
+ `where "sales_channel_id" = ? and "${bridge.entityIdColumn}" = ? limit 1`, [channelId, entityId], 'all', em.getTransactionContext());
63
+ if (existing.length === 0) {
64
+ return { changed: false };
65
+ }
66
+ // Step 2: count total memberships for the entity. If this is the last
67
+ // one, FR-008 either refuses (default) or rebinds to Default (when the
68
+ // caller opted in).
69
+ const totalChannels = await this.countMembershipsForEntity(em, bridge, entityId);
70
+ const wouldOrphan = totalChannels === 1;
71
+ if (wouldOrphan && !options.fallbackToDefault) {
72
+ throw new HttpError(422, ERROR_CODES.ENTITY_WOULD_HAVE_ZERO_CHANNELS, `Removing this membership would leave the ${entityType} with zero sales channels. ` +
73
+ `Pass fallbackToDefault=true to rebind it to the system default instead.`, [{ path: 'entityId', issue: entityId }]);
74
+ }
75
+ // Step 3: when we get here either the entity has another channel left or
76
+ // the caller asked for the rebind. The actual DELETE is now safe.
77
+ await em
78
+ .getConnection()
79
+ .execute(`delete from "${bridge.table}" ` +
80
+ `where "sales_channel_id" = ? and "${bridge.entityIdColumn}" = ?`, [channelId, entityId], 'run', em.getTransactionContext());
81
+ if (!wouldOrphan) {
82
+ await this.auditMembership(channelId, entityType, entityId, 'remove', options);
83
+ this.emitMembershipChanged(channelId, entityType, entityId, 'remove');
84
+ return { changed: true };
85
+ }
86
+ // wouldOrphan && fallbackToDefault — rebind in the same transaction.
87
+ const defaultId = await this.requireSystemDefaultId(em);
88
+ await em
89
+ .getConnection()
90
+ .execute(`insert into "${bridge.table}" ("sales_channel_id", "${bridge.entityIdColumn}") ` +
91
+ `values (?, ?) ` +
92
+ `on conflict ("sales_channel_id", "${bridge.entityIdColumn}") do nothing`, [defaultId, entityId], 'run', em.getTransactionContext());
93
+ await this.auditMembership(channelId, entityType, entityId, 'remove', options, true);
94
+ this.emitMembershipChanged(channelId, entityType, entityId, 'remove');
95
+ return { changed: true, fallbackAppliedToDefault: true };
96
+ }
97
+ /**
98
+ * If the entity has no memberships in any channel, bind it to the
99
+ * system-default channel. Wired into every owning module's create
100
+ * transaction (FR-011 / T027).
101
+ */
102
+ async bindToDefaultIfEmpty(entityType, entityId) {
103
+ const bridge = this.bridges.require(entityType);
104
+ const em = this.emFactory();
105
+ const remaining = await this.countMembershipsForEntity(em, bridge, entityId);
106
+ if (remaining > 0)
107
+ return { changed: false };
108
+ const defaultId = await this.requireSystemDefaultId(em);
109
+ await em
110
+ .getConnection()
111
+ .execute(`insert into "${bridge.table}" ("sales_channel_id", "${bridge.entityIdColumn}") ` +
112
+ `values (?, ?) ` +
113
+ `on conflict ("sales_channel_id", "${bridge.entityIdColumn}") do nothing`, [defaultId, entityId], 'run', em.getTransactionContext());
114
+ await this.auditMembership(defaultId, entityType, entityId, 'add', {});
115
+ this.emitMembershipChanged(defaultId, entityType, entityId, 'add');
116
+ return { changed: true };
117
+ }
118
+ /**
119
+ * Give `targetEntityId` every channel `sourceEntityId` belongs to (issue #185).
120
+ *
121
+ * `catalog` duplicates a product and copies the source's whole channel
122
+ * assortment. It did that with one `insert … select` against
123
+ * `sales_channel_products` — Principle XII's accessor clause and Principle
124
+ * XIII in a single statement, because the bridge was written directly and not
125
+ * one of the memberships it created was audited.
126
+ *
127
+ * Implemented over {@link addToChannel} rather than as a set-based insert on
128
+ * purpose: that is what makes each new membership carry its audit row and its
129
+ * `sales_channel_membership_changed` event, which is the entire reason the
130
+ * copy moved here. An assortment is tens of channels at the very most, so the
131
+ * per-row round trip costs nothing worth the divergence.
132
+ *
133
+ * Memberships the target already holds are skipped by `addToChannel`'s own
134
+ * idempotency and are not counted.
135
+ */
136
+ async copyMemberships(entityType, sourceEntityId, targetEntityId, options = {}) {
137
+ const bridge = this.bridges.require(entityType);
138
+ const em = this.emFactory();
139
+ const rows = await em
140
+ .getConnection()
141
+ .execute(`select "sales_channel_id" from "${bridge.table}" where "${bridge.entityIdColumn}" = ?`, [sourceEntityId], 'all', em.getTransactionContext());
142
+ let copied = 0;
143
+ for (const row of rows) {
144
+ const result = await this.addToChannel(row.sales_channel_id, entityType, targetEntityId, options);
145
+ if (result.changed)
146
+ copied += 1;
147
+ }
148
+ return { copied };
149
+ }
150
+ /**
151
+ * Replace an entity's complete channel membership set atomically.
152
+ *
153
+ * Complete-record integrations use this instead of composing add/remove:
154
+ * product creation initially binds the system default, while the delivered
155
+ * record names the exact channel that must remain. A delete-then-add sequence
156
+ * through the public methods would either trip the zero-channel invariant or
157
+ * retain the unrelated default.
158
+ */
159
+ async replaceChannelsForEntity(entityType, entityId, channelIds, options = {}) {
160
+ const bridge = this.bridges.require(entityType);
161
+ const desiredIds = [...new Set(channelIds)];
162
+ const em = this.emFactory();
163
+ const existingRows = await em
164
+ .getConnection()
165
+ .execute(`select "sales_channel_id" from "${bridge.table}" ` +
166
+ `where "${bridge.entityIdColumn}" = ? order by "sales_channel_id" asc`, [entityId], 'all', em.getTransactionContext());
167
+ const existingIds = existingRows.map((row) => row.sales_channel_id);
168
+ const desiredSorted = [...desiredIds].sort();
169
+ if (existingIds.length === desiredSorted.length &&
170
+ existingIds.every((id, index) => id === desiredSorted[index])) {
171
+ return { changed: false };
172
+ }
173
+ await em.transactional(async (tx) => {
174
+ await tx
175
+ .getConnection()
176
+ .execute(`delete from "${bridge.table}" where "${bridge.entityIdColumn}" = ?`, [entityId], 'run', tx.getTransactionContext());
177
+ for (const channelId of desiredIds) {
178
+ await tx
179
+ .getConnection()
180
+ .execute(`insert into "${bridge.table}" ("sales_channel_id", "${bridge.entityIdColumn}") ` +
181
+ `values (?, ?)`, [channelId, entityId], 'run', tx.getTransactionContext());
182
+ }
183
+ });
184
+ const desiredSet = new Set(desiredIds);
185
+ const existingSet = new Set(existingIds);
186
+ for (const channelId of existingIds) {
187
+ if (desiredSet.has(channelId))
188
+ continue;
189
+ await this.auditMembership(channelId, entityType, entityId, 'remove', options);
190
+ this.emitMembershipChanged(channelId, entityType, entityId, 'remove');
191
+ }
192
+ for (const channelId of desiredIds) {
193
+ if (existingSet.has(channelId))
194
+ continue;
195
+ await this.auditMembership(channelId, entityType, entityId, 'add', options);
196
+ this.emitMembershipChanged(channelId, entityType, entityId, 'add');
197
+ }
198
+ return { changed: true };
199
+ }
200
+ /**
201
+ * Narrow a **known** set of entity ids to those bound to `channelId`
202
+ * (issue #185).
203
+ *
204
+ * The read half of the same finding. Three `catalog` services asked
205
+ * `select <entity>_id from sales_channel_<type> where sales_channel_id = ?
206
+ * and <entity>_id in (…)` by hand, one per channel-scoped listing, and every
207
+ * one of them fails closed to the empty set — which is the right behaviour
208
+ * and the wrong place to spell it.
209
+ *
210
+ * Not {@link listEntityIdsForChannel}: that one enumerates a channel's whole
211
+ * membership a page at a time, and a caller holding a page of ids wants the
212
+ * intersection rather than the enumeration. Using it here would mean pulling
213
+ * every product in the channel to filter twenty.
214
+ */
215
+ async filterEntityIdsInChannel(channelId, entityType, entityIds) {
216
+ if (entityIds.length === 0)
217
+ return [];
218
+ const bridge = this.bridges.require(entityType);
219
+ const em = this.emFactory();
220
+ const placeholders = entityIds.map(() => '?').join(',');
221
+ const rows = await em
222
+ .getConnection()
223
+ .execute(`select "${bridge.entityIdColumn}" from "${bridge.table}" ` +
224
+ `where "sales_channel_id" = ? and "${bridge.entityIdColumn}" in (${placeholders})`, [channelId, ...entityIds], 'all', em.getTransactionContext());
225
+ return rows.map((row) => row[bridge.entityIdColumn]);
226
+ }
227
+ /** Channels an entity currently belongs to. */
228
+ async listChannelsForEntity(entityType, entityId) {
229
+ const bridge = this.bridges.require(entityType);
230
+ const em = this.emFactory();
231
+ const rows = await em
232
+ .getConnection()
233
+ .execute(`select "sales_channel_id" from "${bridge.table}" where "${bridge.entityIdColumn}" = ?`, [entityId], 'all', em.getTransactionContext());
234
+ const ids = rows.map((r) => r.sales_channel_id);
235
+ if (ids.length === 0)
236
+ return [];
237
+ return em.find(SalesChannel, { id: { $in: ids } });
238
+ }
239
+ /** Entity ids of `entityType` that currently belong to `channelId`. */
240
+ async listEntityIdsForChannel(channelId, entityType, page = 0, pageSize = 100) {
241
+ const bridge = this.bridges.require(entityType);
242
+ const em = this.emFactory();
243
+ const totalRows = await em
244
+ .getConnection()
245
+ .execute(`select count(*)::text as count from "${bridge.table}" where "sales_channel_id" = ?`, [channelId], 'all', em.getTransactionContext());
246
+ const total = Number(totalRows[0]?.count ?? '0');
247
+ const rows = await em
248
+ .getConnection()
249
+ .execute(`select "${bridge.entityIdColumn}" from "${bridge.table}" ` +
250
+ `where "sales_channel_id" = ? order by "${bridge.entityIdColumn}" asc ` +
251
+ `offset ? limit ?`, [channelId, page * pageSize, pageSize], 'all', em.getTransactionContext());
252
+ const entityIds = rows.map((r) => r[bridge.entityIdColumn]);
253
+ return { entityIds, total };
254
+ }
255
+ // -------------------------------------------------------------------------
256
+ // Internals
257
+ // -------------------------------------------------------------------------
258
+ async countMembershipsForEntity(em, bridge, entityId) {
259
+ const rows = await em
260
+ .getConnection()
261
+ .execute(`select count(*)::text as count from "${bridge.table}" where "${bridge.entityIdColumn}" = ?`, [entityId], 'all', em.getTransactionContext());
262
+ return Number(rows[0]?.count ?? '0');
263
+ }
264
+ async requireSystemDefaultId(em) {
265
+ const rows = await em
266
+ .getConnection()
267
+ .execute(`select "id" from "sales_channels" where "system_default" = true limit 1`, [], 'all', em.getTransactionContext());
268
+ const id = rows[0]?.id;
269
+ if (!id) {
270
+ throw new HttpError(500, ERROR_CODES.INTERNAL, 'No system-default sales channel found; cannot apply fallback.');
271
+ }
272
+ return id;
273
+ }
274
+ async auditMembership(channelId, entityType, entityId, op, options, fallbackAppliedToDefault) {
275
+ if (!this.auditLogService)
276
+ return;
277
+ await this.auditLogService.record({
278
+ actorAdminUserId: options.actorAdminUserId ?? null,
279
+ action: SALES_CHANNEL_AUDIT_ACTIONS.MEMBERSHIP_CHANGED,
280
+ objectType: 'sales_channel_membership',
281
+ objectId: `${channelId}:${entityType}:${entityId}`,
282
+ stateAfter: {
283
+ channelId,
284
+ entityType,
285
+ entityId,
286
+ op,
287
+ ...(fallbackAppliedToDefault ? { fallbackAppliedToDefault: true } : {}),
288
+ },
289
+ });
290
+ }
291
+ emitMembershipChanged(channelId, entityType, entityId, op) {
292
+ this.eventBus.emit('sales_channels.membership_changed', {
293
+ eventId: `sales_channels.membership_changed:${channelId}:${entityType}:${entityId}:${op}:${Date.now()}`,
294
+ occurredAt: new Date().toISOString(),
295
+ channelId,
296
+ entityType,
297
+ entityId,
298
+ op,
299
+ });
300
+ }
301
+ }
302
+ //# sourceMappingURL=sales-channel-membership.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channel-membership.service.js","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel-membership.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { FastifyInstance, FastifyRequest } from 'fastify';
2
+ import type { CachedChannel } from './sales-channels-cache.js';
3
+ import type { SalesChannelResolverService } from './sales-channel-resolver.service.js';
4
+ import type { AuditPort } from '../ports/audit.js';
5
+ /**
6
+ * Sales-channel resolver middleware — feature 005 / T015.
7
+ *
8
+ * Runs as a Fastify `onRequest` hook on every `/api/v1/*` request and fills the
9
+ * request scope's channel slot with the resolved channel (research R-5;
10
+ * feature 072 T028 moved it off the `request.salesChannel` property, so a
11
+ * consumer no longer has to be handed the request to know its channel).
12
+ *
13
+ * Resolution order:
14
+ *
15
+ * 0. Bound api-key actor (feature 062) — the channel derives from the
16
+ * key's binding. An explicit header/query signal naming a DIFFERENT
17
+ * channel refuses with 403 `API_KEY_CHANNEL_MISMATCH` (audited); an
18
+ * unknown/inactive bound channel refuses with the standard
19
+ * `UNKNOWN_/INACTIVE_SALES_CHANNEL` — never a fallback.
20
+ * 1. `X-Sales-Channel: <code>` header
21
+ * 2. `?salesChannel=<code>` query parameter — IGNORED on
22
+ * `/api/v1/admin/*` paths to prevent cross-channel admin bleed.
23
+ * 3. Host-based mapping (env-configured `SALES_CHANNEL_HOST_MAP`).
24
+ * 4. System-default fallback — ONLY on storefront / integration
25
+ * paths. Admin paths refuse with `MISSING_SALES_CHANNEL_CONTEXT`.
26
+ *
27
+ * If a step matches a code that does not exist or is inactive, the
28
+ * middleware refuses with `UNKNOWN_SALES_CHANNEL` /
29
+ * `INACTIVE_SALES_CHANNEL`. The fallback NEVER applies in those cases
30
+ * (FR-014).
31
+ *
32
+ * Every response carries `X-Sales-Channel: <resolvedCode>` so HTTP
33
+ * caches and dev tools can see the effective channel.
34
+ *
35
+ * Paths that should bypass resolution entirely (e.g. health checks)
36
+ * are excluded by the {@link SHOULD_RESOLVE} predicate so liveness
37
+ * probes do not depend on the channel registry being available.
38
+ */
39
+ export interface SalesChannelResolverPluginOptions {
40
+ resolver: SalesChannelResolverService;
41
+ /**
42
+ * When true, admin paths refuse with `MISSING_SALES_CHANNEL_CONTEXT`
43
+ * if no signal resolves to a channel (FR-014 spirit). When false
44
+ * (default), admin paths fall back to the system default just like
45
+ * storefront paths so the existing admin UI keeps working until it
46
+ * is updated to send `X-Sales-Channel` (T034+). The US3 resolver
47
+ * contract tests (T046) construct a server with `strictAdmin: true`
48
+ * to exercise the production behaviour.
49
+ */
50
+ strictAdmin?: boolean;
51
+ /**
52
+ * Feature 062 — sink for the `api_key.channel_mismatch` refusal audit
53
+ * (bound key named a channel other than its bound one). Optional so
54
+ * minimal test composition roots keep working.
55
+ */
56
+ auditLogService?: AuditPort;
57
+ }
58
+ export declare function registerSalesChannelResolverMiddleware(app: FastifyInstance, options: SalesChannelResolverPluginOptions): Promise<void>;
59
+ /**
60
+ * The resolved channel for the current execution, or `null` when the resolver
61
+ * did not run on this path (`/api/v1/_health`, non-API routes) or there is no
62
+ * request scope at all.
63
+ *
64
+ * Takes no argument on purpose: the channel lives on the scope now, so a caller
65
+ * deep in a service no longer has to be threaded a `FastifyRequest` to read it.
66
+ */
67
+ export declare function currentSalesChannel(): CachedChannel | null;
68
+ /**
69
+ * Helper used by route handlers downstream. Throws if not resolved.
70
+ *
71
+ * The `request` parameter is retained so the 49 existing call sites keep
72
+ * compiling unchanged; it is no longer read. New code calls
73
+ * `getResolvedChannel()` or `currentSalesChannel()`.
74
+ */
75
+ export declare function getResolvedChannel(_request?: FastifyRequest): CachedChannel;
76
+ //# sourceMappingURL=sales-channel-resolver.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channel-resolver.middleware.d.ts","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel-resolver.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAI7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,2BAA2B,CAAC;IACtC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,SAAS,CAAC;CAC7B;AAsCD,wBAAsB,sCAAsC,CAC1D,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,IAAI,CAAC,CA4Gf;AAgDD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,GAAG,IAAI,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAU3E"}