@unchainedshop/core 4.6.1 → 4.7.2

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 (171) hide show
  1. package/lib/core-index.d.ts +3 -0
  2. package/lib/core-index.js +6 -2
  3. package/lib/directors/BaseDiscountDirector.js +6 -6
  4. package/lib/directors/BasePricingDirector.js +1 -1
  5. package/lib/directors/DeliveryAdapter.js +1 -0
  6. package/lib/directors/DeliveryDirector.js +11 -2
  7. package/lib/directors/DeliveryPricingAdapter.d.ts +2 -1
  8. package/lib/directors/DeliveryPricingAdapter.js +2 -1
  9. package/lib/directors/DeliveryPricingDirector.d.ts +1 -1
  10. package/lib/directors/DeliveryPricingDirector.js +12 -2
  11. package/lib/directors/DeliveryPricingSheet.d.ts +1 -1
  12. package/lib/directors/DeliveryPricingSheet.js +1 -1
  13. package/lib/directors/EnrollmentAdapter.js +1 -0
  14. package/lib/directors/EnrollmentDirector.js +11 -1
  15. package/lib/directors/FileDirector.d.ts +10 -0
  16. package/lib/directors/FileDirector.js +25 -0
  17. package/lib/directors/FilterAdapter.js +1 -0
  18. package/lib/directors/FilterDirector.js +11 -1
  19. package/lib/directors/OrderDiscountAdapter.d.ts +3 -2
  20. package/lib/directors/OrderDiscountAdapter.js +5 -2
  21. package/lib/directors/OrderDiscountDirector.d.ts +15 -1
  22. package/lib/directors/OrderDiscountDirector.js +14 -1
  23. package/lib/directors/OrderPricingAdapter.d.ts +2 -1
  24. package/lib/directors/OrderPricingAdapter.js +3 -1
  25. package/lib/directors/OrderPricingDirector.d.ts +4 -1
  26. package/lib/directors/OrderPricingDirector.js +12 -1
  27. package/lib/directors/OrderPricingSheet.d.ts +1 -1
  28. package/lib/directors/OrderPricingSheet.js +1 -1
  29. package/lib/directors/PaymentAdapter.js +1 -0
  30. package/lib/directors/PaymentDirector.js +11 -2
  31. package/lib/directors/PaymentPricingAdapter.d.ts +2 -1
  32. package/lib/directors/PaymentPricingAdapter.js +2 -1
  33. package/lib/directors/PaymentPricingDirector.d.ts +2 -1
  34. package/lib/directors/PaymentPricingDirector.js +11 -1
  35. package/lib/directors/PaymentPricingSheet.d.ts +2 -1
  36. package/lib/directors/PaymentPricingSheet.js +2 -1
  37. package/lib/directors/ProductDiscountAdapter.d.ts +3 -2
  38. package/lib/directors/ProductDiscountAdapter.js +5 -2
  39. package/lib/directors/ProductDiscountDirector.d.ts +16 -2
  40. package/lib/directors/ProductDiscountDirector.js +15 -2
  41. package/lib/directors/ProductPricingAdapter.d.ts +2 -1
  42. package/lib/directors/ProductPricingAdapter.js +3 -1
  43. package/lib/directors/ProductPricingDirector.d.ts +3 -1
  44. package/lib/directors/ProductPricingDirector.js +12 -1
  45. package/lib/directors/ProductPricingSheet.d.ts +1 -1
  46. package/lib/directors/ProductPricingSheet.js +1 -1
  47. package/lib/directors/QuotationAdapter.js +1 -0
  48. package/lib/directors/QuotationDirector.js +11 -2
  49. package/lib/directors/WarehousingAdapter.js +1 -0
  50. package/lib/directors/WarehousingDirector.d.ts +1 -1
  51. package/lib/directors/WarehousingDirector.js +12 -2
  52. package/lib/directors/WorkerAdapter.js +1 -0
  53. package/lib/directors/WorkerDirector.d.ts +1 -1
  54. package/lib/directors/WorkerDirector.js +10 -17
  55. package/lib/directors/index.d.ts +2 -0
  56. package/lib/directors/index.js +2 -0
  57. package/lib/errors/common.d.ts +568 -0
  58. package/lib/errors/common.js +789 -0
  59. package/lib/errors/index.d.ts +1 -0
  60. package/lib/errors/index.js +1 -0
  61. package/lib/factory/registerAssortmentSearchFilter.d.ts +2 -1
  62. package/lib/factory/registerAssortmentSearchFilter.js +12 -3
  63. package/lib/factory/registerInvoicePayment.d.ts +2 -2
  64. package/lib/factory/registerInvoicePayment.js +12 -3
  65. package/lib/factory/registerPhysicalWarehousing.d.ts +2 -2
  66. package/lib/factory/registerPhysicalWarehousing.js +12 -3
  67. package/lib/factory/registerPickUpDelivery.d.ts +2 -2
  68. package/lib/factory/registerPickUpDelivery.js +12 -3
  69. package/lib/factory/registerProductDiscoverabilityFilter.d.ts +2 -1
  70. package/lib/factory/registerProductDiscoverabilityFilter.js +12 -3
  71. package/lib/factory/registerProductSearchFilter.d.ts +2 -1
  72. package/lib/factory/registerProductSearchFilter.js +12 -3
  73. package/lib/factory/registerShippingDelivery.d.ts +2 -2
  74. package/lib/factory/registerShippingDelivery.js +12 -3
  75. package/lib/factory/registerVirtualWarehousing.d.ts +2 -2
  76. package/lib/factory/registerVirtualWarehousing.js +12 -3
  77. package/lib/factory/registerWorker.d.ts +2 -1
  78. package/lib/factory/registerWorker.js +12 -3
  79. package/lib/plugins/PluginRegistry.d.ts +42 -0
  80. package/lib/plugins/PluginRegistry.js +113 -0
  81. package/lib/services/addCartDiscount.d.ts +10 -0
  82. package/lib/services/addCartDiscount.js +27 -0
  83. package/lib/services/addCartItem.d.ts +15 -0
  84. package/lib/services/addCartItem.js +41 -0
  85. package/lib/services/addCartQuotation.d.ts +16 -0
  86. package/lib/services/addCartQuotation.js +52 -0
  87. package/lib/services/addEmail.d.ts +7 -0
  88. package/lib/services/addEmail.js +17 -0
  89. package/lib/services/addProductAssignment.d.ts +3 -0
  90. package/lib/services/addProductAssignment.js +63 -0
  91. package/lib/services/authenticateWithPassword.d.ts +15 -0
  92. package/lib/services/authenticateWithPassword.js +34 -0
  93. package/lib/services/changePassword.d.ts +10 -0
  94. package/lib/services/changePassword.js +19 -0
  95. package/lib/services/countOrdersWithFilters.d.ts +3 -0
  96. package/lib/services/countOrdersWithFilters.js +25 -0
  97. package/lib/services/createAssortment.d.ts +7 -0
  98. package/lib/services/createAssortment.js +10 -0
  99. package/lib/services/createBookmark.d.ts +8 -0
  100. package/lib/services/createBookmark.js +21 -0
  101. package/lib/services/createDeliveryProvider.d.ts +6 -0
  102. package/lib/services/createDeliveryProvider.js +19 -0
  103. package/lib/services/createDownloadStream.js +1 -1
  104. package/lib/services/createEnrollment.d.ts +17 -0
  105. package/lib/services/createEnrollment.js +33 -0
  106. package/lib/services/createFileDownloadURL.js +2 -1
  107. package/lib/services/createProduct.d.ts +7 -0
  108. package/lib/services/createProduct.js +8 -0
  109. package/lib/services/createProductBundleItem.d.ts +5 -0
  110. package/lib/services/createProductBundleItem.js +25 -0
  111. package/lib/services/createProductReview.d.ts +8 -0
  112. package/lib/services/createProductReview.js +12 -0
  113. package/lib/services/createSignedURL.js +2 -1
  114. package/lib/services/deliverOrder.d.ts +5 -0
  115. package/lib/services/deliverOrder.js +26 -0
  116. package/lib/services/findActiveWorkTypes.d.ts +2 -0
  117. package/lib/services/findActiveWorkTypes.js +6 -0
  118. package/lib/services/findDeliveryInterfaces.d.ts +7 -0
  119. package/lib/services/findDeliveryInterfaces.js +13 -0
  120. package/lib/services/findOrdersWithFilters.d.ts +9 -0
  121. package/lib/services/findOrdersWithFilters.js +25 -0
  122. package/lib/services/findPaymentInterfaces.d.ts +7 -0
  123. package/lib/services/findPaymentInterfaces.js +13 -0
  124. package/lib/services/findWarehousingInterfaces.d.ts +7 -0
  125. package/lib/services/findWarehousingInterfaces.js +13 -0
  126. package/lib/services/getDeliveryDiscounts.d.ts +8 -0
  127. package/lib/services/getDeliveryDiscounts.js +14 -0
  128. package/lib/services/getPaymentDiscounts.d.ts +8 -0
  129. package/lib/services/getPaymentDiscounts.js +14 -0
  130. package/lib/services/getShopInfo.d.ts +25 -0
  131. package/lib/services/getShopInfo.js +47 -0
  132. package/lib/services/impersonateUser.d.ts +8 -0
  133. package/lib/services/impersonateUser.js +20 -0
  134. package/lib/services/linkFileService.js +1 -1
  135. package/lib/services/loginAsGuest.d.ts +10 -0
  136. package/lib/services/loginAsGuest.js +19 -0
  137. package/lib/services/obfuscateWorkerData.d.ts +4 -0
  138. package/lib/services/obfuscateWorkerData.js +4 -0
  139. package/lib/services/orderPricingAccessors.d.ts +18 -0
  140. package/lib/services/orderPricingAccessors.js +29 -0
  141. package/lib/services/payOrder.d.ts +5 -0
  142. package/lib/services/payOrder.js +25 -0
  143. package/lib/services/registerUser.d.ts +14 -0
  144. package/lib/services/registerUser.js +44 -0
  145. package/lib/services/removeBookmark.d.ts +6 -0
  146. package/lib/services/removeBookmark.js +10 -0
  147. package/lib/services/removeCartItem.d.ts +6 -0
  148. package/lib/services/removeCartItem.js +19 -0
  149. package/lib/services/removeFiles.js +1 -1
  150. package/lib/services/resetPasswordWithMigration.d.ts +14 -0
  151. package/lib/services/resetPasswordWithMigration.js +31 -0
  152. package/lib/services/resolveWorkType.d.ts +1 -0
  153. package/lib/services/resolveWorkType.js +7 -0
  154. package/lib/services/searchProductsWithAssortment.d.ts +19 -0
  155. package/lib/services/searchProductsWithAssortment.js +17 -0
  156. package/lib/services/toggleBookmark.d.ts +8 -0
  157. package/lib/services/toggleBookmark.js +33 -0
  158. package/lib/services/updateCart.d.ts +15 -0
  159. package/lib/services/updateCart.js +27 -0
  160. package/lib/services/updateCartItem.d.ts +11 -0
  161. package/lib/services/updateCartItem.js +37 -0
  162. package/lib/services/updateEnrollment.d.ts +13 -0
  163. package/lib/services/updateEnrollment.js +36 -0
  164. package/lib/services/uploadFileFromStream.js +2 -1
  165. package/lib/services/uploadFileFromURL.js +2 -1
  166. package/lib/services/verifyEmailWithMigration.d.ts +15 -0
  167. package/lib/services/verifyEmailWithMigration.js +23 -0
  168. package/lib/utils/getFileAdapter.d.ts +1 -0
  169. package/lib/utils/getFileAdapter.js +7 -0
  170. package/lib/utils/schedule.js +164 -28
  171. package/package.json +1 -1
@@ -9,6 +9,9 @@ export * from './services/index.ts';
9
9
  export * from './directors/index.ts';
10
10
  export * from './factory/index.ts';
11
11
  export * from './bulk-exporter/index.ts';
12
+ export * from './plugins/PluginRegistry.ts';
13
+ export * from './utils/getFileAdapter.ts';
14
+ export { filesSettings } from '@unchainedshop/core-files';
12
15
  export { default as schedule, type ScheduleData } from './utils/schedule.ts';
13
16
  export interface UnchainedCoreOptions {
14
17
  db: mongodb.Db;
package/lib/core-index.js CHANGED
@@ -2,13 +2,16 @@ import {} from '@unchainedshop/mongodb';
2
2
  import initServices, {} from "./services/index.js";
3
3
  import initModules, {} from "./modules.js";
4
4
  import createBulkImporterFactory, {} from "./bulk-importer/index.js";
5
- import { WorkerDirector, DeliveryDirector, DeliveryPricingDirector, EnrollmentDirector, FilterDirector, OrderDiscountDirector, OrderPricingDirector, PaymentDirector, PaymentPricingDirector, ProductDiscountDirector, ProductPricingDirector, QuotationDirector, WarehousingDirector, } from "./directors/index.js";
5
+ import { WorkerDirector, DeliveryDirector, DeliveryPricingDirector, EnrollmentDirector, FileDirector, FilterDirector, OrderDiscountDirector, OrderPricingDirector, PaymentDirector, PaymentPricingDirector, ProductDiscountDirector, ProductPricingDirector, QuotationDirector, WarehousingDirector, } from "./directors/index.js";
6
6
  import createBulkExporterFactory, {} from "./bulk-exporter/index.js";
7
7
  export * from "./bulk-importer/index.js";
8
8
  export * from "./services/index.js";
9
9
  export * from "./directors/index.js";
10
10
  export * from "./factory/index.js";
11
11
  export * from "./bulk-exporter/index.js";
12
+ export * from "./plugins/PluginRegistry.js";
13
+ export * from "./utils/getFileAdapter.js";
14
+ export { filesSettings } from '@unchainedshop/core-files';
12
15
  export { default as schedule } from "./utils/schedule.js";
13
16
  export const initCore = async ({ db, migrationRepository, bulkImporter: bulkImporterOptions = {}, modules: customModules = {}, services: customServices = {}, options = {}, bulkExporter: bulkExporterOptions = {}, }) => {
14
17
  const bulkImporter = createBulkImporterFactory(db, bulkImporterOptions);
@@ -28,6 +31,7 @@ export const getAllAdapters = () => {
28
31
  const delivery = DeliveryDirector.getAdapters();
29
32
  const deliveryPricing = DeliveryPricingDirector.getAdapters();
30
33
  const enrollment = EnrollmentDirector.getAdapters();
34
+ const file = FileDirector.getAdapters();
31
35
  const filter = FilterDirector.getAdapters();
32
36
  const orderDiscount = OrderDiscountDirector.getAdapters();
33
37
  const orderPricing = OrderPricingDirector.getAdapters();
@@ -37,5 +41,5 @@ export const getAllAdapters = () => {
37
41
  const productPricing = ProductPricingDirector.getAdapters();
38
42
  const quotation = QuotationDirector.getAdapters();
39
43
  const warehousing = WarehousingDirector.getAdapters();
40
- return [].concat(worker, delivery, deliveryPricing, enrollment, filter, orderDiscount, orderPricing, payment, paymentPricing, productDiscount, productPricing, quotation, warehousing);
44
+ return [].concat(worker, delivery, deliveryPricing, enrollment, file, filter, orderDiscount, orderPricing, payment, paymentPricing, productDiscount, productPricing, quotation, warehousing);
41
45
  };
@@ -3,16 +3,15 @@ export const BaseDiscountDirector = (directorName) => {
3
3
  const baseDirector = BaseDirector(directorName, {
4
4
  adapterSortKey: 'orderIndex',
5
5
  });
6
- return {
6
+ const director = {
7
7
  ...baseDirector,
8
- actions: async (discountContext, unchainedAPI) => {
8
+ actions: async function (discountContext, unchainedAPI) {
9
9
  const context = { ...discountContext, ...unchainedAPI };
10
10
  return {
11
11
  resolveDiscountAdapterFromStaticCode: async (options) => {
12
12
  if (!context.order)
13
13
  return null;
14
- const discounts = await Promise.all(baseDirector
15
- .getAdapters()
14
+ const discounts = await Promise.all(this.getAdapters()
16
15
  .filter((Adapter) => Adapter.isManualAdditionAllowed(options?.code))
17
16
  .map(async (Adapter) => {
18
17
  const adapter = await Adapter.actions({ context });
@@ -23,10 +22,10 @@ export const BaseDiscountDirector = (directorName) => {
23
22
  }));
24
23
  return discounts.find(({ isValid }) => isValid === true)?.Adapter || null;
25
24
  },
26
- async findSystemDiscounts() {
25
+ findSystemDiscounts: async () => {
27
26
  if (!context.order)
28
27
  return [];
29
- const discounts = await Promise.all(baseDirector.getAdapters().map(async (Adapter) => {
28
+ const discounts = await Promise.all(this.getAdapters().map(async (Adapter) => {
30
29
  const adapter = await Adapter.actions({ context });
31
30
  return {
32
31
  key: Adapter.key,
@@ -41,4 +40,5 @@ export const BaseDiscountDirector = (directorName) => {
41
40
  };
42
41
  },
43
42
  };
43
+ return director;
44
44
  };
@@ -17,7 +17,7 @@ export const BasePricingDirector = (directorName) => {
17
17
  async rebuildCalculation(pricingContext, unchainedAPI) {
18
18
  const context = await this.buildPricingContext(pricingContext, unchainedAPI);
19
19
  let calculation = [];
20
- const Adapters = baseDirector.getAdapters({
20
+ const Adapters = this.getAdapters({
21
21
  adapterFilter: (Adapter) => {
22
22
  return Adapter.isActivatedFor(context);
23
23
  },
@@ -7,6 +7,7 @@ export const DeliveryError = {
7
7
  };
8
8
  export const DeliveryAdapter = {
9
9
  ...BaseAdapter,
10
+ adapterType: Symbol.for('unchained:adapter:delivery'),
10
11
  initialConfiguration: [],
11
12
  typeSupported: () => {
12
13
  return false;
@@ -1,13 +1,22 @@
1
1
  import { BaseDirector } from '@unchainedshop/utils';
2
- import { DeliveryError, } from "./DeliveryAdapter.js";
2
+ import { DeliveryError, DeliveryAdapter, } from "./DeliveryAdapter.js";
3
3
  import { OrderDeliveryStatus } from '@unchainedshop/core-orders';
4
4
  import { createLogger } from '@unchainedshop/logger';
5
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
6
  const logger = createLogger('unchained:core');
6
7
  const baseDirector = BaseDirector('DeliveryDirector');
7
8
  export const DeliveryDirector = {
8
9
  ...baseDirector,
10
+ getAdapter: (key) => {
11
+ const adapters = pluginRegistry.getAdapters(DeliveryAdapter.adapterType);
12
+ return adapters.find((adapter) => adapter.key === key) || null;
13
+ },
14
+ getAdapters: ({ adapterFilter } = {}) => {
15
+ const adapters = pluginRegistry.getAdapters(DeliveryAdapter.adapterType);
16
+ return adapters.filter(adapterFilter || (() => true));
17
+ },
9
18
  actions: async (deliveryProvider, deliveryContext, unchainedAPI) => {
10
- const Adapter = baseDirector.getAdapter(deliveryProvider.adapterKey);
19
+ const Adapter = DeliveryDirector.getAdapter(deliveryProvider.adapterKey);
11
20
  if (!Adapter) {
12
21
  throw new Error(`Delivery Plugin ${deliveryProvider.adapterKey} not available`);
13
22
  }
@@ -1,4 +1,5 @@
1
- import { type BasePricingAdapterContext, type IPricingAdapter, type IPricingSheet } from '../directors/index.ts';
1
+ import { type BasePricingAdapterContext, type IPricingAdapter } from './BasePricingAdapter.ts';
2
+ import type { IPricingSheet } from './BasePricingSheet.ts';
2
3
  import type { DeliveryProvider } from '@unchainedshop/core-delivery';
3
4
  import type { PricingCalculation } from '@unchainedshop/utils';
4
5
  import type { OrderDelivery, OrderDiscount, Order } from '@unchainedshop/core-orders';
@@ -1,8 +1,9 @@
1
1
  import { DeliveryPricingSheet } from "./DeliveryPricingSheet.js";
2
- import { BasePricingAdapter, } from "../directors/index.js";
2
+ import { BasePricingAdapter, } from "./BasePricingAdapter.js";
3
3
  const basePricingAdapter = BasePricingAdapter();
4
4
  export const DeliveryPricingAdapter = {
5
5
  ...basePricingAdapter,
6
+ adapterType: Symbol.for('unchained:adapter:pricing:delivery'),
6
7
  isActivatedFor: () => {
7
8
  return false;
8
9
  },
@@ -1,4 +1,4 @@
1
- import { type IPricingDirector } from '../directors/index.ts';
1
+ import { type IPricingDirector } from './BasePricingDirector.ts';
2
2
  import { type DeliveryPricingAdapterContext, type DeliveryPricingCalculation, type IDeliveryPricingAdapter, type IDeliveryPricingSheet } from './DeliveryPricingAdapter.ts';
3
3
  import type { DeliveryProvider } from '@unchainedshop/core-delivery';
4
4
  import type { Order } from '@unchainedshop/core-orders';
@@ -1,8 +1,18 @@
1
- import { DeliveryPricingSheet, BasePricingDirector } from "../directors/index.js";
2
- import {} from "./DeliveryPricingAdapter.js";
1
+ import { DeliveryPricingSheet } from "./DeliveryPricingSheet.js";
2
+ import { BasePricingDirector } from "./BasePricingDirector.js";
3
+ import { DeliveryPricingAdapter, } from "./DeliveryPricingAdapter.js";
4
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
3
5
  const baseDirector = BasePricingDirector('DeliveryPricingDirector');
4
6
  export const DeliveryPricingDirector = {
5
7
  ...baseDirector,
8
+ getAdapter: (key) => {
9
+ const adapters = pluginRegistry.getAdapters(DeliveryPricingAdapter.adapterType);
10
+ return adapters.find((adapter) => adapter.key === key) || null;
11
+ },
12
+ getAdapters: ({ adapterFilter } = {}) => {
13
+ const adapters = pluginRegistry.getAdapters(DeliveryPricingAdapter.adapterType);
14
+ return adapters.filter(adapterFilter || (() => true));
15
+ },
6
16
  async buildPricingContext(context, unchainedAPI) {
7
17
  const { modules } = unchainedAPI;
8
18
  if ('item' in context) {
@@ -1,4 +1,4 @@
1
- import { type PricingSheetParams } from '../directors/index.ts';
1
+ import { type PricingSheetParams } from './BasePricingSheet.ts';
2
2
  import type { DeliveryPricingCalculation, IDeliveryPricingSheet } from './DeliveryPricingAdapter.ts';
3
3
  export declare const DeliveryPricingRowCategory: {
4
4
  readonly Delivery: "DELIVERY";
@@ -1,4 +1,4 @@
1
- import { BasePricingSheet, } from "../directors/index.js";
1
+ import { BasePricingSheet, } from "./BasePricingSheet.js";
2
2
  export const DeliveryPricingRowCategory = {
3
3
  Delivery: 'DELIVERY',
4
4
  Discount: 'DISCOUNT',
@@ -18,6 +18,7 @@ export const periodForReferenceDate = (referenceDate, intervalCount = 1, interva
18
18
  };
19
19
  export const EnrollmentAdapter = {
20
20
  ...BaseAdapter,
21
+ adapterType: Symbol.for('unchained:adapter:enrollment'),
21
22
  isActivatedFor: () => {
22
23
  return false;
23
24
  },
@@ -1,10 +1,12 @@
1
1
  import { BaseDirector } from '@unchainedshop/utils';
2
+ import { EnrollmentAdapter } from "./EnrollmentAdapter.js";
2
3
  import { createLogger } from '@unchainedshop/logger';
4
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
3
5
  const logger = createLogger('unchained:core');
4
6
  const baseDirector = BaseDirector('EnrollmentDirector', {
5
7
  adapterSortKey: 'orderIndex',
6
8
  });
7
- const findAppropriateAdapters = (productPlan) => baseDirector.getAdapters({
9
+ const findAppropriateAdapters = (productPlan) => EnrollmentDirector.getAdapters({
8
10
  adapterFilter: (Adapter) => {
9
11
  const activated = Adapter.isActivatedFor(productPlan);
10
12
  if (!activated) {
@@ -15,6 +17,14 @@ const findAppropriateAdapters = (productPlan) => baseDirector.getAdapters({
15
17
  });
16
18
  export const EnrollmentDirector = {
17
19
  ...baseDirector,
20
+ getAdapter: (key) => {
21
+ const adapters = pluginRegistry.getAdapters(EnrollmentAdapter.adapterType);
22
+ return adapters.find((adapter) => adapter.key === key) || null;
23
+ },
24
+ getAdapters: ({ adapterFilter } = {}) => {
25
+ const adapters = pluginRegistry.getAdapters(EnrollmentAdapter.adapterType);
26
+ return adapters.filter(adapterFilter || (() => true));
27
+ },
18
28
  transformOrderItemToEnrollment: async ({ orderPosition, product }, doc, unchainedAPI) => {
19
29
  const Adapter = findAppropriateAdapters(product.plan)?.[0];
20
30
  if (!Adapter) {
@@ -0,0 +1,10 @@
1
+ import type { IFileAdapter, UploadedFile } from '@unchainedshop/core-files';
2
+ export type UploadFileCallback<UnchainedAPI = unknown> = (file: UploadedFile, unchainedAPI: UnchainedAPI) => Promise<void>;
3
+ export declare const FileDirector: {
4
+ getAdapter: (key: string) => IFileAdapter<unknown> | null;
5
+ getAdapters: (options?: {
6
+ adapterFilter?: (adapter: IFileAdapter) => boolean;
7
+ }) => IFileAdapter<unknown>[];
8
+ registerFileUploadCallback<UnchainedAPI>(directoryName: string, fn: UploadFileCallback<UnchainedAPI>): void;
9
+ getFileUploadCallback(directoryName: string): UploadFileCallback<unknown> | null;
10
+ };
@@ -0,0 +1,25 @@
1
+ import { BaseDirector } from '@unchainedshop/utils';
2
+ import { FileAdapter } from '@unchainedshop/core-files';
3
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
+ const FileUploadRegistry = new Map();
5
+ const baseDirector = BaseDirector('FileDirector');
6
+ export const FileDirector = {
7
+ ...baseDirector,
8
+ getAdapter: (key) => {
9
+ const adapters = pluginRegistry.getAdapters(FileAdapter.adapterType);
10
+ return adapters.find((adapter) => adapter.key === key) || null;
11
+ },
12
+ getAdapters: (options) => {
13
+ const { adapterFilter } = options || {};
14
+ const adapters = pluginRegistry.getAdapters(FileAdapter.adapterType);
15
+ return adapters.filter(adapterFilter || (() => true));
16
+ },
17
+ registerFileUploadCallback(directoryName, fn) {
18
+ if (!FileUploadRegistry.has(directoryName)) {
19
+ FileUploadRegistry.set(directoryName, fn);
20
+ }
21
+ },
22
+ getFileUploadCallback(directoryName) {
23
+ return FileUploadRegistry.get(directoryName) || null;
24
+ },
25
+ };
@@ -2,6 +2,7 @@ import { mongodb } from '@unchainedshop/mongodb';
2
2
  import { BaseAdapter } from '@unchainedshop/utils';
3
3
  export const FilterAdapter = {
4
4
  ...BaseAdapter,
5
+ adapterType: Symbol.for('unchained:adapter:filter'),
5
6
  orderIndex: 0,
6
7
  actions: () => {
7
8
  return {
@@ -1,6 +1,8 @@
1
1
  import { mongodb } from '@unchainedshop/mongodb';
2
2
  import { BaseDirector } from '@unchainedshop/utils';
3
3
  import { filtersSettings, FilterType, } from '@unchainedshop/core-filters';
4
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
+ import { FilterAdapter } from "./FilterAdapter.js";
4
6
  export const parseQueryArray = (query) => (query || []).reduce((accumulator, { key, value }) => ({
5
7
  ...accumulator,
6
8
  [key]: accumulator[key] ? accumulator[key].concat(value) : [value],
@@ -10,9 +12,17 @@ const baseDirector = BaseDirector('FilterDirector', {
10
12
  });
11
13
  export const FilterDirector = {
12
14
  ...baseDirector,
15
+ getAdapter: (key) => {
16
+ const adapters = pluginRegistry.getAdapters(FilterAdapter.adapterType);
17
+ return adapters.find((adapter) => adapter.key === key) || null;
18
+ },
19
+ getAdapters: ({ adapterFilter } = {}) => {
20
+ const adapters = pluginRegistry.getAdapters(FilterAdapter.adapterType);
21
+ return adapters.filter(adapterFilter || (() => true));
22
+ },
13
23
  actions: async (filterContext, unchainedAPI) => {
14
24
  const context = { ...filterContext, ...unchainedAPI };
15
- const adapters = baseDirector.getAdapters().map((Adapter) => Adapter.actions(context));
25
+ const adapters = FilterDirector.getAdapters().map((Adapter) => Adapter.actions(context));
16
26
  const reduceAdapters = (reducer, initialValue) => {
17
27
  if (adapters.length === 0) {
18
28
  return initialValue;
@@ -1,2 +1,3 @@
1
- import { type IDiscountAdapter, type OrderDiscountConfiguration } from '../directors/index.ts';
2
- export declare const OrderDiscountAdapter: Omit<IDiscountAdapter<OrderDiscountConfiguration>, "key" | "label" | "version">;
1
+ import { type IDiscountAdapter } from './BaseDiscountAdapter.ts';
2
+ import type { OrderDiscountConfiguration } from './OrderDiscountConfiguration.ts';
3
+ export declare const OrderDiscountAdapter: Omit<IDiscountAdapter<OrderDiscountConfiguration>, 'key' | 'label' | 'version'>;
@@ -1,2 +1,5 @@
1
- import { BaseDiscountAdapter, } from "../directors/index.js";
2
- export const OrderDiscountAdapter = BaseDiscountAdapter;
1
+ import { BaseDiscountAdapter } from "./BaseDiscountAdapter.js";
2
+ export const OrderDiscountAdapter = {
3
+ ...BaseDiscountAdapter,
4
+ adapterType: Symbol.for('unchained:adapter:discount:order'),
5
+ };
@@ -1,2 +1,16 @@
1
+ import type { IDiscountAdapter } from './BaseDiscountAdapter.ts';
1
2
  import type { OrderDiscountConfiguration } from './OrderDiscountConfiguration.ts';
2
- export declare const OrderDiscountDirector: import("./BaseDiscountDirector.ts").IDiscountDirector<OrderDiscountConfiguration>;
3
+ export declare const OrderDiscountDirector: {
4
+ getAdapter: (key: string) => IDiscountAdapter<OrderDiscountConfiguration> | null;
5
+ getAdapters: (options?: {
6
+ adapterFilter?: (adapter: any) => boolean;
7
+ }) => IDiscountAdapter<OrderDiscountConfiguration>[];
8
+ actions: (discountContext: import("./BaseDiscountAdapter.ts").DiscountContext, unchainedAPI: {
9
+ modules: import("../modules.ts").Modules;
10
+ }) => Promise<{
11
+ resolveDiscountAdapterFromStaticCode: (params: {
12
+ code: string;
13
+ }) => Promise<IDiscountAdapter<OrderDiscountConfiguration> | null>;
14
+ findSystemDiscounts: () => Promise<string[]>;
15
+ }>;
16
+ };
@@ -1,2 +1,15 @@
1
1
  import { BaseDiscountDirector } from "./BaseDiscountDirector.js";
2
- export const OrderDiscountDirector = BaseDiscountDirector('OrderDiscountDirector');
2
+ import { OrderDiscountAdapter } from "./OrderDiscountAdapter.js";
3
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
+ const baseDirector = BaseDiscountDirector('OrderDiscountDirector');
5
+ export const OrderDiscountDirector = {
6
+ ...baseDirector,
7
+ getAdapter: (key) => {
8
+ const adapters = pluginRegistry.getAdapters(OrderDiscountAdapter.adapterType);
9
+ return adapters.find((adapter) => adapter.key === key) || null;
10
+ },
11
+ getAdapters: (options) => {
12
+ const adapters = pluginRegistry.getAdapters(OrderDiscountAdapter.adapterType);
13
+ return adapters.filter(options?.adapterFilter || (() => true));
14
+ },
15
+ };
@@ -1,4 +1,5 @@
1
- import { type IOrderPricingSheet, type OrderPricingCalculation, type IPricingAdapter, type BasePricingAdapterContext } from '../directors/index.ts';
1
+ import { type IOrderPricingSheet, type OrderPricingCalculation } from './OrderPricingSheet.ts';
2
+ import { type IPricingAdapter, type BasePricingAdapterContext } from './BasePricingAdapter.ts';
2
3
  import type { Order, OrderDelivery, OrderDiscount, OrderPayment, OrderPosition } from '@unchainedshop/core-orders';
3
4
  import type { User } from '@unchainedshop/core-users';
4
5
  import type { Modules } from '../modules.ts';
@@ -1,7 +1,9 @@
1
- import { OrderPricingSheet, BasePricingAdapter, } from "../directors/index.js";
1
+ import { OrderPricingSheet, } from "./OrderPricingSheet.js";
2
+ import { BasePricingAdapter, } from "./BasePricingAdapter.js";
2
3
  const basePricingAdapter = BasePricingAdapter();
3
4
  export const OrderPricingAdapter = {
4
5
  ...basePricingAdapter,
6
+ adapterType: Symbol.for('unchained:adapter:pricing:order'),
5
7
  isActivatedFor: () => {
6
8
  return false;
7
9
  },
@@ -1,4 +1,7 @@
1
- import { type IOrderPricingSheet, type OrderPricingCalculation, type IOrderPricingAdapter, type OrderPricingAdapterContext, type PricingDiscount, type IPricingDirector } from '../directors/index.ts';
1
+ import { type IOrderPricingSheet, type OrderPricingCalculation } from './OrderPricingSheet.ts';
2
+ import { type IOrderPricingAdapter, type OrderPricingAdapterContext } from './OrderPricingAdapter.ts';
3
+ import { type IPricingDirector } from './BasePricingDirector.ts';
4
+ import type { PricingDiscount } from './BasePricingSheet.ts';
2
5
  import type { Order, OrderDelivery, OrderPayment, OrderPosition } from '@unchainedshop/core-orders';
3
6
  export interface OrderPricingContext {
4
7
  currencyCode: string;
@@ -1,7 +1,18 @@
1
- import { OrderPricingSheet, BasePricingDirector, } from "../directors/index.js";
1
+ import { OrderPricingSheet, } from "./OrderPricingSheet.js";
2
+ import { OrderPricingAdapter, } from "./OrderPricingAdapter.js";
3
+ import { BasePricingDirector } from "./BasePricingDirector.js";
4
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
2
5
  const baseDirector = BasePricingDirector('OrderPricingDirector');
3
6
  export const OrderPricingDirector = {
4
7
  ...baseDirector,
8
+ getAdapter: (key) => {
9
+ const adapters = pluginRegistry.getAdapters(OrderPricingAdapter.adapterType);
10
+ return adapters.find((adapter) => adapter.key === key) || null;
11
+ },
12
+ getAdapters: ({ adapterFilter } = {}) => {
13
+ const adapters = pluginRegistry.getAdapters(OrderPricingAdapter.adapterType);
14
+ return adapters.filter(adapterFilter || (() => true));
15
+ },
5
16
  buildPricingContext: async (context, unchainedAPI) => {
6
17
  const { modules } = unchainedAPI;
7
18
  const { order, currencyCode } = context;
@@ -1,5 +1,5 @@
1
1
  import type { PricingCalculation } from '@unchainedshop/utils';
2
- import { type IPricingSheet, type PricingSheetParams } from '../directors/index.ts';
2
+ import { type IPricingSheet, type PricingSheetParams } from './BasePricingSheet.ts';
3
3
  export interface OrderPricingCalculation extends PricingCalculation {
4
4
  discountId?: string;
5
5
  }
@@ -1,4 +1,4 @@
1
- import { BasePricingSheet, } from "../directors/index.js";
1
+ import { BasePricingSheet, } from "./BasePricingSheet.js";
2
2
  export const OrderPricingRowCategory = {
3
3
  Items: 'ITEMS',
4
4
  Discounts: 'DISCOUNTS',
@@ -7,6 +7,7 @@ export const PaymentError = {
7
7
  };
8
8
  export const PaymentAdapter = {
9
9
  ...BaseAdapter,
10
+ adapterType: Symbol.for('unchained:adapter:payment'),
10
11
  initialConfiguration: [],
11
12
  typeSupported: () => {
12
13
  return false;
@@ -1,7 +1,8 @@
1
1
  import { BaseDirector } from '@unchainedshop/utils';
2
2
  import { createLogger } from '@unchainedshop/logger';
3
- import { PaymentError, } from "./PaymentAdapter.js";
3
+ import { PaymentError, PaymentAdapter, } from "./PaymentAdapter.js";
4
4
  import { OrderPaymentStatus } from '@unchainedshop/core-orders';
5
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
5
6
  const buildPaymentProviderActionsContext = (orderPayment, { transactionContext, ...rest }) => ({
6
7
  ...rest,
7
8
  orderPayment,
@@ -14,8 +15,16 @@ const logger = createLogger('unchained:core:payment');
14
15
  const baseDirector = BaseDirector('PaymentDirector');
15
16
  export const PaymentDirector = {
16
17
  ...baseDirector,
18
+ getAdapter: (key) => {
19
+ const adapters = pluginRegistry.getAdapters(PaymentAdapter.adapterType);
20
+ return adapters.find((adapter) => adapter.key === key) || null;
21
+ },
22
+ getAdapters: ({ adapterFilter } = {}) => {
23
+ const adapters = pluginRegistry.getAdapters(PaymentAdapter.adapterType);
24
+ return adapters.filter(adapterFilter || (() => true));
25
+ },
17
26
  actions: async (paymentProvider, paymentContext, unchainedAPI) => {
18
- const Adapter = baseDirector.getAdapter(paymentProvider.adapterKey);
27
+ const Adapter = PaymentDirector.getAdapter(paymentProvider.adapterKey);
19
28
  if (!Adapter) {
20
29
  throw new Error(`Payment Plugin ${paymentProvider.adapterKey} not available`);
21
30
  }
@@ -1,5 +1,6 @@
1
1
  import type { PricingCalculation } from '@unchainedshop/utils';
2
- import { type BasePricingAdapterContext, type IPricingAdapter, type IPricingSheet } from '../directors/index.ts';
2
+ import { type BasePricingAdapterContext, type IPricingAdapter } from './BasePricingAdapter.ts';
3
+ import type { IPricingSheet } from './BasePricingSheet.ts';
3
4
  import type { PaymentProvider } from '@unchainedshop/core-payment';
4
5
  import type { OrderDiscount, OrderPayment, Order } from '@unchainedshop/core-orders';
5
6
  import type { User } from '@unchainedshop/core-users';
@@ -1,8 +1,9 @@
1
- import { BasePricingAdapter, } from "../directors/index.js";
1
+ import { BasePricingAdapter, } from "./BasePricingAdapter.js";
2
2
  import { PaymentPricingSheet } from "./PaymentPricingSheet.js";
3
3
  const basePricingAdapter = BasePricingAdapter();
4
4
  export const PaymentPricingAdapter = {
5
5
  ...basePricingAdapter,
6
+ adapterType: Symbol.for('unchained:adapter:pricing:payment'),
6
7
  isActivatedFor: () => {
7
8
  return false;
8
9
  },
@@ -1,4 +1,5 @@
1
- import { type IPricingDirector, type IPaymentPricingAdapter, type IPaymentPricingSheet, type PaymentPricingAdapterContext, type PaymentPricingCalculation } from '../directors/index.ts';
1
+ import { type IPricingDirector } from './BasePricingDirector.ts';
2
+ import { type IPaymentPricingAdapter, type IPaymentPricingSheet, type PaymentPricingAdapterContext, type PaymentPricingCalculation } from './PaymentPricingAdapter.ts';
2
3
  import type { PaymentProvider } from '@unchainedshop/core-payment';
3
4
  import type { OrderPayment, Order } from '@unchainedshop/core-orders';
4
5
  import type { User } from '@unchainedshop/core-users';
@@ -1,8 +1,18 @@
1
- import { BasePricingDirector, } from "../directors/index.js";
1
+ import { BasePricingDirector } from "./BasePricingDirector.js";
2
+ import { PaymentPricingAdapter, } from "./PaymentPricingAdapter.js";
2
3
  import { PaymentPricingSheet } from "./PaymentPricingSheet.js";
4
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
3
5
  const baseDirector = BasePricingDirector('PaymentPricingDirector');
4
6
  export const PaymentPricingDirector = {
5
7
  ...baseDirector,
8
+ getAdapter: (key) => {
9
+ const adapters = pluginRegistry.getAdapters(PaymentPricingAdapter.adapterType);
10
+ return adapters.find((adapter) => adapter.key === key) || null;
11
+ },
12
+ getAdapters: ({ adapterFilter } = {}) => {
13
+ const adapters = pluginRegistry.getAdapters(PaymentPricingAdapter.adapterType);
14
+ return adapters.filter(adapterFilter || (() => true));
15
+ },
6
16
  async buildPricingContext(context, unchainedAPI) {
7
17
  const { modules } = unchainedAPI;
8
18
  if ('item' in context) {
@@ -1,4 +1,5 @@
1
- import { type PaymentPricingCalculation, type IPaymentPricingSheet, type PricingSheetParams } from '../directors/index.ts';
1
+ import { type PaymentPricingCalculation, type IPaymentPricingSheet } from './PaymentPricingAdapter.ts';
2
+ import { type PricingSheetParams } from './BasePricingSheet.ts';
2
3
  export declare const PaymentPricingRowCategory: {
3
4
  readonly Item: "ITEM";
4
5
  readonly Payment: "PAYMENT";
@@ -1,4 +1,5 @@
1
- import { BasePricingSheet, } from "../directors/index.js";
1
+ import {} from "./PaymentPricingAdapter.js";
2
+ import { BasePricingSheet, } from "./BasePricingSheet.js";
2
3
  export const PaymentPricingRowCategory = {
3
4
  Item: 'ITEM',
4
5
  Payment: 'PAYMENT',
@@ -1,2 +1,3 @@
1
- import { type IDiscountAdapter, type ProductDiscountConfiguration } from '../directors/index.ts';
2
- export declare const ProductDiscountAdapter: Omit<IDiscountAdapter<ProductDiscountConfiguration>, "key" | "label" | "version">;
1
+ import { type IDiscountAdapter } from './BaseDiscountAdapter.ts';
2
+ import type { ProductDiscountConfiguration } from './ProductDiscountConfiguration.ts';
3
+ export declare const ProductDiscountAdapter: Omit<IDiscountAdapter<ProductDiscountConfiguration>, 'key' | 'label' | 'version'>;
@@ -1,2 +1,5 @@
1
- import { BaseDiscountAdapter, } from "../directors/index.js";
2
- export const ProductDiscountAdapter = BaseDiscountAdapter;
1
+ import { BaseDiscountAdapter } from "./BaseDiscountAdapter.js";
2
+ export const ProductDiscountAdapter = {
3
+ ...BaseDiscountAdapter,
4
+ adapterType: Symbol.for('unchained:adapter:discount:product'),
5
+ };
@@ -1,2 +1,16 @@
1
- import { type ProductDiscountConfiguration } from '../directors/index.ts';
2
- export declare const ProductDiscountDirector: import("./BaseDiscountDirector.ts").IDiscountDirector<ProductDiscountConfiguration>;
1
+ import type { ProductDiscountConfiguration } from './ProductDiscountConfiguration.ts';
2
+ import type { IDiscountAdapter } from './BaseDiscountAdapter.ts';
3
+ export declare const ProductDiscountDirector: {
4
+ getAdapter: (key: string) => IDiscountAdapter<ProductDiscountConfiguration> | null;
5
+ getAdapters: (options?: {
6
+ adapterFilter?: (adapter: any) => boolean;
7
+ }) => IDiscountAdapter<ProductDiscountConfiguration>[];
8
+ actions: (discountContext: import("./BaseDiscountAdapter.ts").DiscountContext, unchainedAPI: {
9
+ modules: import("../modules.ts").Modules;
10
+ }) => Promise<{
11
+ resolveDiscountAdapterFromStaticCode: (params: {
12
+ code: string;
13
+ }) => Promise<IDiscountAdapter<ProductDiscountConfiguration> | null>;
14
+ findSystemDiscounts: () => Promise<string[]>;
15
+ }>;
16
+ };
@@ -1,2 +1,15 @@
1
- import { BaseDiscountDirector } from "../directors/index.js";
2
- export const ProductDiscountDirector = BaseDiscountDirector('ProductDiscountDirector');
1
+ import { BaseDiscountDirector } from "./BaseDiscountDirector.js";
2
+ import { ProductDiscountAdapter } from "./ProductDiscountAdapter.js";
3
+ import { pluginRegistry } from "../plugins/PluginRegistry.js";
4
+ const baseDirector = BaseDiscountDirector('ProductDiscountDirector');
5
+ export const ProductDiscountDirector = {
6
+ ...baseDirector,
7
+ getAdapter: (key) => {
8
+ const adapters = pluginRegistry.getAdapters(ProductDiscountAdapter.adapterType);
9
+ return adapters.find((adapter) => adapter.key === key) || null;
10
+ },
11
+ getAdapters: (options) => {
12
+ const adapters = pluginRegistry.getAdapters(ProductDiscountAdapter.adapterType);
13
+ return adapters.filter(options?.adapterFilter || (() => true));
14
+ },
15
+ };
@@ -1,6 +1,7 @@
1
1
  import type { Product, ProductConfiguration } from '@unchainedshop/core-products';
2
2
  import type { Order } from '@unchainedshop/core-orders';
3
- import { type IProductPricingSheet, type ProductPricingCalculation, type BasePricingAdapterContext, type IPricingAdapter } from '../directors/index.ts';
3
+ import { type IProductPricingSheet, type ProductPricingCalculation } from './ProductPricingSheet.ts';
4
+ import { type BasePricingAdapterContext, type IPricingAdapter } from './BasePricingAdapter.ts';
4
5
  import type { Modules } from '../modules.ts';
5
6
  import type { User } from '@unchainedshop/core-users';
6
7
  export interface ProductPricingAdapterContext extends BasePricingAdapterContext {
@@ -1,7 +1,9 @@
1
- import { ProductPricingSheet, BasePricingAdapter, } from "../directors/index.js";
1
+ import { ProductPricingSheet, } from "./ProductPricingSheet.js";
2
+ import { BasePricingAdapter, } from "./BasePricingAdapter.js";
2
3
  const basePricingAdapter = BasePricingAdapter();
3
4
  export const ProductPricingAdapter = {
4
5
  ...basePricingAdapter,
6
+ adapterType: Symbol.for('unchained:adapter:pricing:product'),
5
7
  isActivatedFor: () => {
6
8
  return false;
7
9
  },