@unchainedshop/core 5.0.0-alpha.7 → 5.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/bulk-importer/handlers/product/create.d.ts +132 -29
- package/lib/bulk-importer/handlers/product/create.js +31 -14
- package/lib/bulk-importer/handlers/product/update.d.ts +60 -30
- package/lib/bulk-importer/handlers/product/update.js +5 -48
- package/lib/core-index.d.ts +1 -2
- package/lib/core-index.js +2 -18
- package/lib/directors/BaseDiscountAdapter.d.ts +3 -0
- package/lib/directors/BaseDiscountDirector.d.ts +2 -2
- package/lib/directors/BaseDiscountDirector.js +3 -6
- package/lib/directors/BasePricingDirector.d.ts +2 -2
- package/lib/directors/BasePricingDirector.js +3 -6
- package/lib/directors/DeliveryDirector.d.ts +1 -1
- package/lib/directors/DeliveryDirector.js +2 -12
- package/lib/directors/DeliveryPricingDirector.js +1 -10
- package/lib/directors/EnrollmentAdapter.js +0 -1
- package/lib/directors/EnrollmentDirector.d.ts +1 -1
- package/lib/directors/EnrollmentDirector.js +3 -15
- package/lib/directors/FileDirector.d.ts +4 -4
- package/lib/directors/FileDirector.js +2 -13
- package/lib/directors/FilterDirector.d.ts +1 -1
- package/lib/directors/FilterDirector.js +2 -14
- package/lib/directors/OrderDiscountDirector.d.ts +1 -15
- package/lib/directors/OrderDiscountDirector.js +1 -13
- package/lib/directors/OrderPricingDirector.js +1 -10
- package/lib/directors/PaymentDirector.d.ts +1 -1
- package/lib/directors/PaymentDirector.js +2 -12
- package/lib/directors/PaymentPricingDirector.js +1 -10
- package/lib/directors/ProductDiscountDirector.d.ts +1 -15
- package/lib/directors/ProductDiscountDirector.js +1 -13
- package/lib/directors/ProductPricingDirector.js +1 -10
- package/lib/directors/QuotationDirector.d.ts +1 -1
- package/lib/directors/QuotationDirector.js +2 -14
- package/lib/directors/WarehousingDirector.js +16 -34
- package/lib/directors/WorkerDirector.d.ts +1 -1
- package/lib/directors/WorkerDirector.js +2 -14
- package/lib/directors/registryDirector.d.ts +2 -0
- package/lib/directors/registryDirector.js +6 -0
- package/lib/factory/registerVirtualWarehousing.js +1 -1
- package/lib/plugins/PluginRegistry.d.ts +1 -0
- package/lib/plugins/PluginRegistry.js +8 -1
- package/lib/services/checkoutOrder.js +4 -0
- package/lib/services/reserveOrderDiscountsForCheckout.d.ts +5 -0
- package/lib/services/reserveOrderDiscountsForCheckout.js +34 -0
- package/lib/services/simulateProductDispatching.d.ts +3 -1
- package/lib/services/simulateProductDispatching.js +3 -3
- package/lib/services/simulateProductInventory.d.ts +3 -1
- package/lib/services/simulateProductInventory.js +3 -3
- package/lib/services/supportedDeliveryProviders.js +9 -0
- package/lib/services/supportedPaymentProviders.js +9 -0
- package/lib/services/supportedWarehousingProviders.js +9 -0
- package/package.json +22 -22
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
2
2
|
import type { DiscountContext, IDiscountAdapter } from './BaseDiscountAdapter.ts';
|
|
3
3
|
import type { Modules } from '../modules.ts';
|
|
4
4
|
export type IDiscountDirector<DiscountConfiguration> = IBaseDirector<IDiscountAdapter<DiscountConfiguration>> & {
|
|
@@ -11,4 +11,4 @@ export type IDiscountDirector<DiscountConfiguration> = IBaseDirector<IDiscountAd
|
|
|
11
11
|
findSystemDiscounts: () => Promise<string[]>;
|
|
12
12
|
}>;
|
|
13
13
|
};
|
|
14
|
-
export declare const BaseDiscountDirector: <DiscountConfigurationType>(
|
|
14
|
+
export declare const BaseDiscountDirector: <DiscountConfigurationType>(adapterType: symbol) => IDiscountDirector<DiscountConfigurationType>;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export const BaseDiscountDirector = (
|
|
3
|
-
const baseDirector = BaseDirector(directorName, {
|
|
4
|
-
adapterSortKey: 'orderIndex',
|
|
5
|
-
});
|
|
1
|
+
import { registryDirector } from "./registryDirector.js";
|
|
2
|
+
export const BaseDiscountDirector = (adapterType) => {
|
|
6
3
|
const director = {
|
|
7
|
-
...
|
|
4
|
+
...registryDirector(adapterType),
|
|
8
5
|
actions: async function (discountContext, unchainedAPI) {
|
|
9
6
|
const context = { ...discountContext, ...unchainedAPI };
|
|
10
7
|
return {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector, PricingCalculation } from '@unchainedshop/utils';
|
|
2
2
|
import type { BasePricingAdapterContext, BasePricingContext, IPricingAdapter } from './BasePricingAdapter.ts';
|
|
3
3
|
import type { IPricingSheet } from './BasePricingSheet.ts';
|
|
4
4
|
import type { Modules } from '../modules.ts';
|
|
@@ -13,4 +13,4 @@ export type IPricingDirector<PricingContext extends BasePricingContext, Calculat
|
|
|
13
13
|
rebuildCalculation: (pricingContext: PricingContext, unchainedAPI: Context) => Promise<Calculation[]>;
|
|
14
14
|
calculationSheet: (pricingContext: PricingContext, calculation: Calculation[]) => PricingAdapterSheet;
|
|
15
15
|
};
|
|
16
|
-
export declare const BasePricingDirector: <DirectorContext extends BasePricingContext, AdapterContext extends BasePricingAdapterContext, Calculation extends PricingCalculation, PricingAdapter extends IPricingAdapter<AdapterContext, Calculation, IPricingSheet<Calculation>>>(
|
|
16
|
+
export declare const BasePricingDirector: <DirectorContext extends BasePricingContext, AdapterContext extends BasePricingAdapterContext, Calculation extends PricingCalculation, PricingAdapter extends IPricingAdapter<AdapterContext, Calculation, IPricingSheet<Calculation>>>(adapterType: symbol) => IPricingDirector<DirectorContext, Calculation, AdapterContext, IPricingSheet<Calculation>, PricingAdapter>;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { OrderDiscountDirector } from "./OrderDiscountDirector.js";
|
|
2
|
+
import { registryDirector } from "./registryDirector.js";
|
|
3
3
|
import { createLogger } from '@unchainedshop/logger';
|
|
4
4
|
const logger = createLogger('unchained:core');
|
|
5
|
-
export const BasePricingDirector = (
|
|
6
|
-
const baseDirector = BaseDirector(directorName, {
|
|
7
|
-
adapterSortKey: 'orderIndex',
|
|
8
|
-
});
|
|
5
|
+
export const BasePricingDirector = (adapterType) => {
|
|
9
6
|
const director = {
|
|
10
|
-
...
|
|
7
|
+
...registryDirector(adapterType),
|
|
11
8
|
buildPricingContext: async () => {
|
|
12
9
|
throw new Error('Method not implemented');
|
|
13
10
|
},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
2
2
|
import { type DeliveryAdapterActions, type DeliveryContext, type IDeliveryAdapter } from './DeliveryAdapter.ts';
|
|
3
3
|
import type { DeliveryProvider } from '@unchainedshop/core-delivery';
|
|
4
4
|
import { type Order } from '@unchainedshop/core-orders';
|
|
@@ -1,20 +1,10 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { DeliveryError, DeliveryAdapter, } from "./DeliveryAdapter.js";
|
|
3
2
|
import { OrderDeliveryStatus } from '@unchainedshop/core-orders';
|
|
4
3
|
import { createLogger } from '@unchainedshop/logger';
|
|
5
|
-
import {
|
|
4
|
+
import { registryDirector } from "./registryDirector.js";
|
|
6
5
|
const logger = createLogger('unchained:core');
|
|
7
|
-
const baseDirector = BaseDirector('DeliveryDirector');
|
|
8
6
|
export const DeliveryDirector = {
|
|
9
|
-
...
|
|
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
|
-
},
|
|
7
|
+
...registryDirector(DeliveryAdapter.adapterType),
|
|
18
8
|
actions: async (deliveryProvider, deliveryContext, unchainedAPI) => {
|
|
19
9
|
const Adapter = DeliveryDirector.getAdapter(deliveryProvider.adapterKey);
|
|
20
10
|
if (!Adapter) {
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { DeliveryPricingSheet } from "./DeliveryPricingSheet.js";
|
|
2
2
|
import { BasePricingDirector } from "./BasePricingDirector.js";
|
|
3
3
|
import { DeliveryPricingAdapter, } from "./DeliveryPricingAdapter.js";
|
|
4
|
-
|
|
5
|
-
const baseDirector = BasePricingDirector('DeliveryPricingDirector');
|
|
4
|
+
const baseDirector = BasePricingDirector(DeliveryPricingAdapter.adapterType);
|
|
6
5
|
export const DeliveryPricingDirector = {
|
|
7
6
|
...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
|
-
},
|
|
16
7
|
async buildPricingContext(context, unchainedAPI) {
|
|
17
8
|
const { modules } = unchainedAPI;
|
|
18
9
|
if ('item' in context) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
2
2
|
import type { EnrollmentAdapterActions, EnrollmentContext, IEnrollmentAdapter } from './EnrollmentAdapter.ts';
|
|
3
3
|
import type { OrderPosition } from '@unchainedshop/core-orders';
|
|
4
4
|
import type { Product } from '@unchainedshop/core-products';
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { EnrollmentAdapter } from "./EnrollmentAdapter.js";
|
|
3
2
|
import { createLogger } from '@unchainedshop/logger';
|
|
4
|
-
import {
|
|
3
|
+
import { registryDirector } from "./registryDirector.js";
|
|
5
4
|
const logger = createLogger('unchained:core');
|
|
6
|
-
const baseDirector = BaseDirector('EnrollmentDirector', {
|
|
7
|
-
adapterSortKey: 'orderIndex',
|
|
8
|
-
});
|
|
9
5
|
const findAppropriateAdapters = (productPlan) => EnrollmentDirector.getAdapters({
|
|
10
6
|
adapterFilter: (Adapter) => {
|
|
11
7
|
const activated = Adapter.isActivatedFor(productPlan);
|
|
@@ -16,15 +12,7 @@ const findAppropriateAdapters = (productPlan) => EnrollmentDirector.getAdapters(
|
|
|
16
12
|
},
|
|
17
13
|
});
|
|
18
14
|
export const EnrollmentDirector = {
|
|
19
|
-
...
|
|
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
|
-
},
|
|
15
|
+
...registryDirector(EnrollmentAdapter.adapterType),
|
|
28
16
|
transformOrderItemToEnrollment: async ({ orderPosition, product }, doc, unchainedAPI) => {
|
|
29
17
|
const Adapter = findAppropriateAdapters(product.plan)?.[0];
|
|
30
18
|
if (!Adapter) {
|
|
@@ -34,7 +22,7 @@ export const EnrollmentDirector = {
|
|
|
34
22
|
return {
|
|
35
23
|
...doc,
|
|
36
24
|
...enrollmentPlan,
|
|
37
|
-
configuration: [],
|
|
25
|
+
configuration: enrollmentPlan.configuration ?? [],
|
|
38
26
|
};
|
|
39
27
|
},
|
|
40
28
|
actions: async (enrollmentContext, unchainedAPI) => {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { IFileAdapter, UploadedFile } from '@unchainedshop/core-files';
|
|
2
2
|
export type UploadFileCallback<UnchainedAPI = unknown> = (file: UploadedFile, unchainedAPI: UnchainedAPI) => Promise<void>;
|
|
3
3
|
export declare const FileDirector: {
|
|
4
|
-
getAdapter: (key: string) => IFileAdapter<unknown> | null;
|
|
5
|
-
getAdapters: (options?: {
|
|
6
|
-
adapterFilter?: (adapter: IFileAdapter) => boolean;
|
|
7
|
-
}) => IFileAdapter<unknown>[];
|
|
8
4
|
registerFileUploadCallback<UnchainedAPI>(directoryName: string, fn: UploadFileCallback<UnchainedAPI>): void;
|
|
9
5
|
getFileUploadCallback(directoryName: string): UploadFileCallback<unknown> | null;
|
|
6
|
+
getAdapters: (options?: {
|
|
7
|
+
adapterFilter?: ((adapter: IFileAdapter<unknown>) => boolean) | undefined;
|
|
8
|
+
} | undefined) => IFileAdapter<unknown>[];
|
|
9
|
+
getAdapter: (key: string) => IFileAdapter<unknown> | null;
|
|
10
10
|
};
|
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { FileAdapter } from '@unchainedshop/core-files';
|
|
3
|
-
import {
|
|
2
|
+
import { registryDirector } from "./registryDirector.js";
|
|
4
3
|
const FileUploadRegistry = new Map();
|
|
5
|
-
const baseDirector = BaseDirector('FileDirector');
|
|
6
4
|
export const FileDirector = {
|
|
7
|
-
...
|
|
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
|
-
},
|
|
5
|
+
...registryDirector(FileAdapter.adapterType),
|
|
17
6
|
registerFileUploadCallback(directoryName, fn) {
|
|
18
7
|
if (!FileUploadRegistry.has(directoryName)) {
|
|
19
8
|
FileUploadRegistry.set(directoryName, fn);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
2
2
|
import type { FilterAdapterActions, FilterContext, IFilterAdapter } from './FilterAdapter.ts';
|
|
3
3
|
import { type Filter, type SearchConfiguration, type SearchFilterQuery, type SearchQuery } from '@unchainedshop/core-filters';
|
|
4
4
|
import type { Modules } from '../modules.ts';
|
|
@@ -1,25 +1,13 @@
|
|
|
1
1
|
import { mongodb } from '@unchainedshop/mongodb';
|
|
2
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
3
2
|
import { filterCacheGeneration, filtersSettings, FilterType, } from '@unchainedshop/core-filters';
|
|
4
|
-
import {
|
|
3
|
+
import { registryDirector } from "./registryDirector.js";
|
|
5
4
|
import { FilterAdapter } from "./FilterAdapter.js";
|
|
6
5
|
export const parseQueryArray = (query) => (query || []).reduce((accumulator, { key, value }) => ({
|
|
7
6
|
...accumulator,
|
|
8
7
|
[key]: accumulator[key] ? accumulator[key].concat(value) : [value],
|
|
9
8
|
}), {});
|
|
10
|
-
const baseDirector = BaseDirector('FilterDirector', {
|
|
11
|
-
adapterSortKey: 'orderIndex',
|
|
12
|
-
});
|
|
13
9
|
export const FilterDirector = {
|
|
14
|
-
...
|
|
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
|
-
},
|
|
10
|
+
...registryDirector(FilterAdapter.adapterType),
|
|
23
11
|
actions: async (filterContext, unchainedAPI) => {
|
|
24
12
|
const context = { ...filterContext, ...unchainedAPI };
|
|
25
13
|
const adapters = FilterDirector.getAdapters().map((Adapter) => Adapter.actions(context));
|
|
@@ -1,16 +1,2 @@
|
|
|
1
|
-
import type { IDiscountAdapter } from './BaseDiscountAdapter.ts';
|
|
2
1
|
import type { OrderDiscountConfiguration } from './OrderDiscountConfiguration.ts';
|
|
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
|
-
};
|
|
2
|
+
export declare const OrderDiscountDirector: import("./BaseDiscountDirector.ts").IDiscountDirector<OrderDiscountConfiguration>;
|
|
@@ -1,15 +1,3 @@
|
|
|
1
1
|
import { BaseDiscountDirector } from "./BaseDiscountDirector.js";
|
|
2
2
|
import { OrderDiscountAdapter } from "./OrderDiscountAdapter.js";
|
|
3
|
-
|
|
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
|
-
};
|
|
3
|
+
export const OrderDiscountDirector = BaseDiscountDirector(OrderDiscountAdapter.adapterType);
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { OrderPricingSheet, } from "./OrderPricingSheet.js";
|
|
2
2
|
import { OrderPricingAdapter, } from "./OrderPricingAdapter.js";
|
|
3
3
|
import { BasePricingDirector } from "./BasePricingDirector.js";
|
|
4
|
-
|
|
5
|
-
const baseDirector = BasePricingDirector('OrderPricingDirector');
|
|
4
|
+
const baseDirector = BasePricingDirector(OrderPricingAdapter.adapterType);
|
|
6
5
|
export const OrderPricingDirector = {
|
|
7
6
|
...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
|
-
},
|
|
16
7
|
buildPricingContext: async (context, unchainedAPI) => {
|
|
17
8
|
const { modules } = unchainedAPI;
|
|
18
9
|
const { order, currencyCode } = context;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
2
2
|
import { type IPaymentActions, type IPaymentAdapter, type PaymentContext } from './PaymentAdapter.ts';
|
|
3
3
|
import type { PaymentProvider } from '@unchainedshop/core-payment';
|
|
4
4
|
import { type Order, type OrderPayment } from '@unchainedshop/core-orders';
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
3
2
|
import { PaymentError, PaymentAdapter, } from "./PaymentAdapter.js";
|
|
4
3
|
import { OrderPaymentStatus } from '@unchainedshop/core-orders';
|
|
5
|
-
import {
|
|
4
|
+
import { registryDirector } from "./registryDirector.js";
|
|
6
5
|
const buildPaymentProviderActionsContext = (orderPayment, { transactionContext, ...rest }) => ({
|
|
7
6
|
...rest,
|
|
8
7
|
orderPayment,
|
|
@@ -12,17 +11,8 @@ const buildPaymentProviderActionsContext = (orderPayment, { transactionContext,
|
|
|
12
11
|
},
|
|
13
12
|
});
|
|
14
13
|
const logger = createLogger('unchained:core:payment');
|
|
15
|
-
const baseDirector = BaseDirector('PaymentDirector');
|
|
16
14
|
export const PaymentDirector = {
|
|
17
|
-
...
|
|
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
|
-
},
|
|
15
|
+
...registryDirector(PaymentAdapter.adapterType),
|
|
26
16
|
actions: async (paymentProvider, paymentContext, unchainedAPI) => {
|
|
27
17
|
const Adapter = PaymentDirector.getAdapter(paymentProvider.adapterKey);
|
|
28
18
|
if (!Adapter) {
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { BasePricingDirector } from "./BasePricingDirector.js";
|
|
2
2
|
import { PaymentPricingAdapter, } from "./PaymentPricingAdapter.js";
|
|
3
3
|
import { PaymentPricingSheet } from "./PaymentPricingSheet.js";
|
|
4
|
-
|
|
5
|
-
const baseDirector = BasePricingDirector('PaymentPricingDirector');
|
|
4
|
+
const baseDirector = BasePricingDirector(PaymentPricingAdapter.adapterType);
|
|
6
5
|
export const PaymentPricingDirector = {
|
|
7
6
|
...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
|
-
},
|
|
16
7
|
async buildPricingContext(context, unchainedAPI) {
|
|
17
8
|
const { modules } = unchainedAPI;
|
|
18
9
|
if ('item' in context) {
|
|
@@ -1,16 +1,2 @@
|
|
|
1
1
|
import type { ProductDiscountConfiguration } from './ProductDiscountConfiguration.ts';
|
|
2
|
-
|
|
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
|
-
};
|
|
2
|
+
export declare const ProductDiscountDirector: import("./BaseDiscountDirector.ts").IDiscountDirector<ProductDiscountConfiguration>;
|
|
@@ -1,15 +1,3 @@
|
|
|
1
1
|
import { BaseDiscountDirector } from "./BaseDiscountDirector.js";
|
|
2
2
|
import { ProductDiscountAdapter } from "./ProductDiscountAdapter.js";
|
|
3
|
-
|
|
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
|
-
};
|
|
3
|
+
export const ProductDiscountDirector = BaseDiscountDirector(ProductDiscountAdapter.adapterType);
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { ProductPricingSheet, } from "./ProductPricingSheet.js";
|
|
2
2
|
import { ProductPricingAdapter, } from "./ProductPricingAdapter.js";
|
|
3
3
|
import { BasePricingDirector } from "./BasePricingDirector.js";
|
|
4
|
-
|
|
5
|
-
const baseDirector = BasePricingDirector('ProductPricingDirector');
|
|
4
|
+
const baseDirector = BasePricingDirector(ProductPricingAdapter.adapterType);
|
|
6
5
|
export const ProductPricingDirector = {
|
|
7
6
|
...baseDirector,
|
|
8
|
-
getAdapter: (key) => {
|
|
9
|
-
const adapters = pluginRegistry.getAdapters(ProductPricingAdapter.adapterType);
|
|
10
|
-
return adapters.find((adapter) => adapter.key === key) || null;
|
|
11
|
-
},
|
|
12
|
-
getAdapters: ({ adapterFilter } = {}) => {
|
|
13
|
-
const adapters = pluginRegistry.getAdapters(ProductPricingAdapter.adapterType);
|
|
14
|
-
return adapters.filter(adapterFilter || (() => true));
|
|
15
|
-
},
|
|
16
7
|
async buildPricingContext(context, unchainedAPI) {
|
|
17
8
|
const { modules } = unchainedAPI;
|
|
18
9
|
const { quantity = 1, currencyCode } = context;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
2
2
|
import { type IQuotationAdapter, type QuotationAdapterActions, type QuotationContext } from './QuotationAdapter.ts';
|
|
3
3
|
export type IQuotationDirector = IBaseDirector<IQuotationAdapter> & {
|
|
4
4
|
actions: (quotationContext: QuotationContext, unchainedAPI: any) => Promise<QuotationAdapterActions>;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { QuotationError, QuotationAdapter, } from "./QuotationAdapter.js";
|
|
3
2
|
import { createLogger } from '@unchainedshop/logger';
|
|
4
|
-
import {
|
|
3
|
+
import { registryDirector } from "./registryDirector.js";
|
|
5
4
|
const logger = createLogger('unchained:core');
|
|
6
|
-
const baseDirector = BaseDirector('QuotationDirector', {
|
|
7
|
-
adapterSortKey: 'orderIndex',
|
|
8
|
-
});
|
|
9
5
|
const findAppropriateAdapters = (quotationContext, unchainedAPI) => QuotationDirector.getAdapters({
|
|
10
6
|
adapterFilter: (Adapter) => {
|
|
11
7
|
const activated = Adapter.isActivatedFor(quotationContext, unchainedAPI);
|
|
@@ -16,15 +12,7 @@ const findAppropriateAdapters = (quotationContext, unchainedAPI) => QuotationDir
|
|
|
16
12
|
},
|
|
17
13
|
});
|
|
18
14
|
export const QuotationDirector = {
|
|
19
|
-
...
|
|
20
|
-
getAdapter: (key) => {
|
|
21
|
-
const adapters = pluginRegistry.getAdapters(QuotationAdapter.adapterType);
|
|
22
|
-
return adapters.find((adapter) => adapter.key === key) || null;
|
|
23
|
-
},
|
|
24
|
-
getAdapters: ({ adapterFilter } = {}) => {
|
|
25
|
-
const adapters = pluginRegistry.getAdapters(QuotationAdapter.adapterType);
|
|
26
|
-
return adapters.filter(adapterFilter || (() => true));
|
|
27
|
-
},
|
|
15
|
+
...registryDirector(QuotationAdapter.adapterType),
|
|
28
16
|
actions: async (quotationContext, unchainedAPI) => {
|
|
29
17
|
const context = { ...quotationContext, ...unchainedAPI };
|
|
30
18
|
const Adapter = findAppropriateAdapters(quotationContext, unchainedAPI)?.shift();
|
|
@@ -1,25 +1,13 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
3
2
|
const logger = createLogger('unchained:core');
|
|
4
3
|
import { DeliveryDirector } from "./DeliveryDirector.js";
|
|
5
4
|
import { WarehousingError, WarehousingAdapter, } from "./WarehousingAdapter.js";
|
|
6
|
-
import {
|
|
5
|
+
import { registryDirector } from "./registryDirector.js";
|
|
7
6
|
const getReferenceDate = (context) => {
|
|
8
7
|
return context && context.referenceDate ? context.referenceDate : new Date();
|
|
9
8
|
};
|
|
10
|
-
const baseDirector = BaseDirector('WarehousingDirector', {
|
|
11
|
-
adapterSortKey: 'orderIndex',
|
|
12
|
-
});
|
|
13
9
|
export const WarehousingDirector = {
|
|
14
|
-
...
|
|
15
|
-
getAdapter: (key) => {
|
|
16
|
-
const adapters = pluginRegistry.getAdapters(WarehousingAdapter.adapterType);
|
|
17
|
-
return adapters.find((adapter) => adapter.key === key) || null;
|
|
18
|
-
},
|
|
19
|
-
getAdapters: ({ adapterFilter } = {}) => {
|
|
20
|
-
const adapters = pluginRegistry.getAdapters(WarehousingAdapter.adapterType);
|
|
21
|
-
return adapters.filter(adapterFilter || (() => true));
|
|
22
|
-
},
|
|
10
|
+
...registryDirector(WarehousingAdapter.adapterType),
|
|
23
11
|
actions: async (warehousingProvider, warehousingContext, unchainedAPI) => {
|
|
24
12
|
const Adapter = WarehousingDirector.getAdapter(warehousingProvider.adapterKey);
|
|
25
13
|
if (!Adapter) {
|
|
@@ -145,29 +133,23 @@ export const WarehousingDirector = {
|
|
|
145
133
|
};
|
|
146
134
|
},
|
|
147
135
|
async tokenMetadata(virtualProviders, warehousingContext, unchainedAPI) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if (last)
|
|
151
|
-
return last;
|
|
152
|
-
const currentDirector = await WarehousingDirector.actions(provider, warehousingContext, unchainedAPI);
|
|
153
|
-
const isActive = await currentDirector.isActive();
|
|
154
|
-
if (isActive) {
|
|
155
|
-
return currentDirector.tokenMetadata(warehousingContext.token.tokenSerialNumber);
|
|
156
|
-
}
|
|
136
|
+
const activeActions = await findFirstActiveActions(virtualProviders, warehousingContext, unchainedAPI);
|
|
137
|
+
if (!activeActions)
|
|
157
138
|
return null;
|
|
158
|
-
|
|
139
|
+
return activeActions.tokenMetadata(warehousingContext.token.tokenSerialNumber);
|
|
159
140
|
},
|
|
160
141
|
async isInvalidateable(virtualProviders, warehousingContext, unchainedAPI) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (last)
|
|
164
|
-
return last;
|
|
165
|
-
const currentDirector = await WarehousingDirector.actions(provider, warehousingContext, unchainedAPI);
|
|
166
|
-
const isActive = await currentDirector.isActive();
|
|
167
|
-
if (isActive) {
|
|
168
|
-
return currentDirector.isInvalidateable(warehousingContext.token.tokenSerialNumber);
|
|
169
|
-
}
|
|
142
|
+
const activeActions = await findFirstActiveActions(virtualProviders, warehousingContext, unchainedAPI);
|
|
143
|
+
if (!activeActions)
|
|
170
144
|
return null;
|
|
171
|
-
|
|
145
|
+
return activeActions.isInvalidateable(warehousingContext.token.tokenSerialNumber);
|
|
172
146
|
},
|
|
173
147
|
};
|
|
148
|
+
async function findFirstActiveActions(virtualProviders, warehousingContext, unchainedAPI) {
|
|
149
|
+
for (const provider of virtualProviders) {
|
|
150
|
+
const currentActions = await WarehousingDirector.actions(provider, warehousingContext, unchainedAPI);
|
|
151
|
+
if (currentActions.isActive())
|
|
152
|
+
return currentActions;
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Work, WorkData, WorkResult } from '@unchainedshop/core-worker';
|
|
2
|
-
import {
|
|
2
|
+
import type { IBaseDirector } from '@unchainedshop/utils';
|
|
3
3
|
import type { ScheduleData } from '../utils/schedule.ts';
|
|
4
4
|
import { type IWorkerAdapter } from './WorkerAdapter.ts';
|
|
5
5
|
import type { Modules } from '../modules.ts';
|
|
@@ -1,22 +1,10 @@
|
|
|
1
|
-
import { BaseDirector } from '@unchainedshop/utils';
|
|
2
1
|
import { WorkerAdapter } from "./WorkerAdapter.js";
|
|
3
2
|
import { createLogger } from '@unchainedshop/logger';
|
|
4
|
-
import {
|
|
3
|
+
import { registryDirector } from "./registryDirector.js";
|
|
5
4
|
const logger = createLogger('unchained:core');
|
|
6
5
|
const AutoScheduleMap = new Map();
|
|
7
|
-
const baseDirector = BaseDirector('WorkerDirector', {
|
|
8
|
-
adapterKeyField: 'key',
|
|
9
|
-
});
|
|
10
6
|
export const WorkerDirector = {
|
|
11
|
-
...
|
|
12
|
-
getAdapter: (key) => {
|
|
13
|
-
const adapters = pluginRegistry.getAdapters(WorkerAdapter.adapterType);
|
|
14
|
-
return adapters.find((adapter) => adapter.key === key) || null;
|
|
15
|
-
},
|
|
16
|
-
getAdapters: ({ adapterFilter } = {}) => {
|
|
17
|
-
const adapters = pluginRegistry.getAdapters(WorkerAdapter.adapterType);
|
|
18
|
-
return adapters.filter(adapterFilter || (() => true));
|
|
19
|
-
},
|
|
7
|
+
...registryDirector(WorkerAdapter.adapterType),
|
|
20
8
|
getActivePluginTypes: ({ external } = {}) => {
|
|
21
9
|
return WorkerDirector.getAdapters()
|
|
22
10
|
.filter((adapter) => {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { pluginRegistry } from "../plugins/PluginRegistry.js";
|
|
2
|
+
export const registryDirector = (adapterType) => ({
|
|
3
|
+
getAdapter: (key) => pluginRegistry.getAdapters(adapterType).find((adapter) => adapter.key === key) ||
|
|
4
|
+
null,
|
|
5
|
+
getAdapters: ({ adapterFilter } = {}) => pluginRegistry.getAdapters(adapterType).filter(adapterFilter || (() => true)),
|
|
6
|
+
});
|
|
@@ -5,7 +5,7 @@ export default function registerVirtualWarehousing({ adapterId, orderIndex = 0,
|
|
|
5
5
|
const adapter = {
|
|
6
6
|
...WarehousingAdapter,
|
|
7
7
|
key: 'shop.unchained.warehousing.virtual.' + adapterId,
|
|
8
|
-
label: 'Virtual
|
|
8
|
+
label: 'Virtual Warehousing: ' + adapterId,
|
|
9
9
|
version: '1.0.0',
|
|
10
10
|
orderIndex,
|
|
11
11
|
initialConfiguration: [{ key: 'shipping-hub', value: 'Shipping Hub' }],
|
|
@@ -5,9 +5,11 @@ class PluginRegistry {
|
|
|
5
5
|
moduleFactories = [];
|
|
6
6
|
skippedPlugins = new Set();
|
|
7
7
|
register(plugin) {
|
|
8
|
-
|
|
8
|
+
const registered = this.plugins.get(plugin.key);
|
|
9
|
+
if (registered) {
|
|
9
10
|
logger.warn(`Plugin ${plugin.key} already registered, skipping`, {
|
|
10
11
|
label: plugin.label,
|
|
12
|
+
registeredLabel: registered.label,
|
|
11
13
|
});
|
|
12
14
|
return;
|
|
13
15
|
}
|
|
@@ -103,6 +105,11 @@ class PluginRegistry {
|
|
|
103
105
|
}
|
|
104
106
|
return result.toSorted((left, right) => (left.orderIndex ?? 0) - (right.orderIndex ?? 0));
|
|
105
107
|
}
|
|
108
|
+
getAllAdapters() {
|
|
109
|
+
return this.getAllPlugins()
|
|
110
|
+
.filter((plugin) => !this.skippedPlugins.has(plugin.key))
|
|
111
|
+
.flatMap((plugin) => plugin.adapters ?? []);
|
|
112
|
+
}
|
|
106
113
|
hasPlugin(key) {
|
|
107
114
|
return this.plugins.has(key);
|
|
108
115
|
}
|