@unchainedshop/platform 3.1.15 → 4.0.0-rc.11

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 (60) hide show
  1. package/lib/bulk-importer/createBulkImporter.d.ts +3 -5
  2. package/lib/bulk-importer/createBulkImporter.d.ts.map +1 -1
  3. package/lib/bulk-importer/createBulkImporter.js.map +1 -1
  4. package/lib/platform-index.d.ts +1 -0
  5. package/lib/platform-index.d.ts.map +1 -1
  6. package/lib/platform-index.js +1 -0
  7. package/lib/platform-index.js.map +1 -1
  8. package/lib/setup/setupWorkqueue.d.ts +16 -12
  9. package/lib/setup/setupWorkqueue.d.ts.map +1 -1
  10. package/lib/setup/setupWorkqueue.js +50 -12
  11. package/lib/setup/setupWorkqueue.js.map +1 -1
  12. package/lib/startPlatform.d.ts +1 -5
  13. package/lib/startPlatform.d.ts.map +1 -1
  14. package/lib/startPlatform.js +20 -33
  15. package/lib/startPlatform.js.map +1 -1
  16. package/lib/templates/order-parser/getOrderPositionsData.d.ts +4 -4
  17. package/lib/templates/order-parser/getOrderPositionsData.d.ts.map +1 -1
  18. package/lib/templates/order-parser/getOrderPositionsData.js +1 -1
  19. package/lib/templates/order-parser/getOrderPositionsData.js.map +1 -1
  20. package/lib/templates/order-parser/getOrderSummaryData.d.ts +8 -8
  21. package/lib/templates/order-parser/getOrderSummaryData.d.ts.map +1 -1
  22. package/lib/templates/order-parser/getOrderSummaryData.js +1 -1
  23. package/lib/templates/order-parser/getOrderSummaryData.js.map +1 -1
  24. package/lib/templates/order-parser/index.d.ts +1 -1
  25. package/lib/templates/order-parser/index.d.ts.map +1 -1
  26. package/lib/templates/order-parser/index.js.map +1 -1
  27. package/lib/templates/resolveForwardDeliveryTemplate.js +1 -1
  28. package/lib/templates/resolveForwardDeliveryTemplate.js.map +1 -1
  29. package/lib/templates/resolveOrderConfirmationTemplate.js +1 -1
  30. package/lib/templates/resolveOrderConfirmationTemplate.js.map +1 -1
  31. package/lib/templates/resolveOrderRejectionTemplate.js +1 -1
  32. package/lib/templates/resolveOrderRejectionTemplate.js.map +1 -1
  33. package/package.json +11 -11
  34. package/src/bulk-importer/createBulkImporter.ts +3 -5
  35. package/src/platform-index.ts +1 -0
  36. package/src/setup/setupWorkqueue.ts +94 -26
  37. package/src/startPlatform.ts +23 -39
  38. package/src/templates/order-parser/getOrderPositionsData.ts +3 -3
  39. package/src/templates/order-parser/getOrderSummaryData.ts +3 -3
  40. package/src/templates/order-parser/index.ts +1 -1
  41. package/src/templates/resolveForwardDeliveryTemplate.ts +1 -1
  42. package/src/templates/resolveOrderConfirmationTemplate.ts +1 -1
  43. package/src/templates/resolveOrderRejectionTemplate.ts +1 -1
  44. package/lib/context/withAccessToken.d.ts +0 -4
  45. package/lib/context/withAccessToken.d.ts.map +0 -1
  46. package/lib/context/withAccessToken.js +0 -42
  47. package/lib/context/withAccessToken.js.map +0 -1
  48. package/lib/setup/setupCarts.d.ts +0 -8
  49. package/lib/setup/setupCarts.d.ts.map +0 -1
  50. package/lib/setup/setupCarts.js +0 -20
  51. package/lib/setup/setupCarts.js.map +0 -1
  52. package/lib/templates/order-parser/formatAddress.d.ts +0 -3
  53. package/lib/templates/order-parser/formatAddress.d.ts.map +0 -1
  54. package/lib/templates/order-parser/formatAddress.js +0 -14
  55. package/lib/templates/order-parser/formatAddress.js.map +0 -1
  56. package/lib/templates/order-parser/formatPrice.d.ts +0 -6
  57. package/lib/templates/order-parser/formatPrice.d.ts.map +0 -1
  58. package/lib/templates/order-parser/formatPrice.js +0 -6
  59. package/lib/templates/order-parser/formatPrice.js.map +0 -1
  60. package/src/setup/setupCarts.ts +0 -35
@@ -7,11 +7,11 @@ import { createLogger } from '@unchainedshop/logger';
7
7
 
8
8
  const logger = createLogger('unchained:bulk-import');
9
9
 
10
- export type BulkImportOperationResult = {
10
+ export interface BulkImportOperationResult {
11
11
  entity: string;
12
12
  operation: string;
13
13
  success: boolean;
14
- };
14
+ }
15
15
  export type BulkImportOperation = (
16
16
  payload: any,
17
17
  options: {
@@ -23,9 +23,7 @@ export type BulkImportOperation = (
23
23
  unchainedAPI: UnchainedCore,
24
24
  ) => Promise<BulkImportOperationResult>;
25
25
 
26
- export type BulkImportHandler = {
27
- [x: string]: BulkImportOperation;
28
- };
26
+ export type BulkImportHandler = Record<string, BulkImportOperation>;
29
27
 
30
28
  let bulkOperationHandlers: Record<string, BulkImportHandler> = {};
31
29
 
@@ -2,6 +2,7 @@ export * from './startPlatform.js';
2
2
  export * from './context/index.js';
3
3
  export * from './bulk-importer/createBulkImporter.js';
4
4
  export * from './templates/index.js';
5
+ export * from './migrations/runMigrations.js';
5
6
 
6
7
  import { MessagingDirector, getAllAdapters } from '@unchainedshop/core';
7
8
  import { getRegisteredEvents } from '@unchainedshop/events';
@@ -1,29 +1,97 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
- import { EventListenerWorker } from '@unchainedshop/plugins/worker/EventListenerWorker.js';
3
- import { IntervalWorker, IntervalWorkerParams } from '@unchainedshop/plugins/worker/IntervalWorker.js';
4
- import { FailedRescheduler } from '@unchainedshop/plugins/worker/FailedRescheduler.js';
5
- import { WorkData } from '@unchainedshop/core-worker';
6
- export interface SetupWorkqueueOptions {
7
- batchCount?: number;
1
+ import {
2
+ EventListenerWorker,
3
+ FailedRescheduler,
4
+ FailedReschedulerParams,
5
+ IntervalWorker,
6
+ IntervalWorkerParams,
7
+ IScheduler,
8
+ IWorker,
9
+ UnchainedCore,
10
+ } from '@unchainedshop/core';
11
+ import { runMigrations } from '../migrations/runMigrations.js';
12
+ import { MigrationRepository } from '@unchainedshop/mongodb';
13
+ import { setImmediate } from 'node:timers/promises';
14
+
15
+ export type WorkQueueQueueManager = IWorker<any> | IScheduler<any>;
16
+ export interface SetupWorkqueueOptions extends IntervalWorkerParams, FailedReschedulerParams {
17
+ enabledQueueManagers?: WorkQueueQueueManager[];
18
+ invalidateProviders?: boolean;
19
+ providerInvalidationMaxAgeDays?: number;
20
+ assignCartForUsers?: boolean;
8
21
  disableWorker?: boolean;
9
- schedule?: IntervalWorkerParams['schedule'];
10
- workerId?: string;
11
- retryInput?: (
12
- workData: WorkData,
13
- priorInput: Record<string, any>,
14
- ) => Promise<Record<string, any> | null>;
22
+ skipInvalidationOnStartup?: boolean;
15
23
  }
16
24
 
17
- export const setupWorkqueue = (
18
- unchainedAPI: UnchainedCore,
19
- workQueueOptions: SetupWorkqueueOptions = {},
20
- ) => {
21
- const handlers = [
22
- FailedRescheduler.actions(workQueueOptions, unchainedAPI),
23
- EventListenerWorker.actions(workQueueOptions, unchainedAPI),
24
- IntervalWorker.actions(workQueueOptions, unchainedAPI),
25
- ];
26
-
27
- handlers.forEach((handler) => handler.start());
28
- return handlers;
29
- };
25
+ const {
26
+ UNCHAINED_DISABLE_PROVIDER_INVALIDATION,
27
+ UNCHAINED_DISABLE_WORKER,
28
+ UNCHAINED_ASSIGN_CART_FOR_USERS,
29
+ } = process.env;
30
+
31
+ export const defaultQueueManagers: WorkQueueQueueManager[] = [
32
+ FailedRescheduler,
33
+ EventListenerWorker,
34
+ IntervalWorker,
35
+ ];
36
+
37
+ export const queueWorkers: any[] = [];
38
+
39
+ export async function setupWorkqueue({
40
+ unchainedAPI,
41
+ migrationRepository,
42
+ ...workQueueOptions
43
+ }: {
44
+ unchainedAPI: UnchainedCore;
45
+ migrationRepository: MigrationRepository<UnchainedCore>;
46
+ } & SetupWorkqueueOptions) {
47
+ if (workQueueOptions.disableWorker || UNCHAINED_DISABLE_WORKER) return;
48
+
49
+ // Run migrations
50
+ await runMigrations({ migrationRepository, unchainedAPI });
51
+
52
+ // Start queue managers
53
+ (workQueueOptions?.enabledQueueManagers || defaultQueueManagers).forEach((f) => {
54
+ const handler = f.actions(workQueueOptions, unchainedAPI);
55
+ queueWorkers.push(handler);
56
+ handler.start();
57
+ });
58
+
59
+ // Invalidate providers on carts
60
+ if (workQueueOptions.invalidateProviders ?? !UNCHAINED_DISABLE_PROVIDER_INVALIDATION) {
61
+ const orders = await unchainedAPI.modules.orders.findCartsToInvalidate(
62
+ workQueueOptions.providerInvalidationMaxAgeDays,
63
+ );
64
+ await Promise.allSettled(
65
+ orders.map(async (order) => {
66
+ await unchainedAPI.services.orders.updateCalculation(order._id);
67
+ }),
68
+ );
69
+ }
70
+
71
+ // Ensure users have carts
72
+ if (workQueueOptions.assignCartForUsers ?? Boolean(UNCHAINED_ASSIGN_CART_FOR_USERS)) {
73
+ const users = await unchainedAPI.modules.users.findUsers({});
74
+
75
+ await Promise.all(
76
+ users.map((user) => {
77
+ const locale = unchainedAPI.modules.users.userLocale(user);
78
+ return unchainedAPI.services.orders.nextUserCart({
79
+ user,
80
+ countryCode: locale.region,
81
+ });
82
+ }),
83
+ );
84
+ }
85
+
86
+ // Setup filter cache
87
+ if (!workQueueOptions?.skipInvalidationOnStartup) {
88
+ await setImmediate(async () => unchainedAPI.services.filters.invalidateFilterCache());
89
+ }
90
+ }
91
+
92
+ export function stopWorkqueue() {
93
+ queueWorkers.forEach((worker) => {
94
+ worker?.stop();
95
+ });
96
+ queueWorkers.length = 0;
97
+ }
@@ -4,14 +4,13 @@ import { initDb, mongodb, stopDb } from '@unchainedshop/mongodb';
4
4
  import { defaultLogger } from '@unchainedshop/logger';
5
5
  import { UnchainedCore } from '@unchainedshop/core';
6
6
  import { BulkImportHandler, createBulkImporterFactory } from './bulk-importer/createBulkImporter.js';
7
- import { runMigrations } from './migrations/runMigrations.js';
8
7
  import { setupAccounts } from './setup/setupAccounts.js';
9
8
  import { setupUploadHandlers } from './setup/setupUploadHandlers.js';
10
- import { SetupCartsOptions, setupCarts } from './setup/setupCarts.js';
11
9
  import { setupTemplates, MessageTypes } from './setup/setupTemplates.js';
12
- import { SetupWorkqueueOptions, setupWorkqueue } from './setup/setupWorkqueue.js';
10
+ import { SetupWorkqueueOptions, stopWorkqueue, setupWorkqueue } from './setup/setupWorkqueue.js';
13
11
  import { createMigrationRepository } from './migrations/migrationRepository.js';
14
12
  import { IRoleOptionConfig } from '@unchainedshop/roles';
13
+
15
14
  export { MessageTypes };
16
15
 
17
16
  export type PlatformOptions = {
@@ -19,7 +18,7 @@ export type PlatformOptions = {
19
18
  handlers?: Record<string, BulkImportHandler>;
20
19
  };
21
20
  rolesOptions?: IRoleOptionConfig;
22
- workQueueOptions?: SetupWorkqueueOptions & SetupCartsOptions & { skipInvalidationOnStartup?: boolean };
21
+ workQueueOptions?: SetupWorkqueueOptions;
23
22
  } & Omit<UnchainedCoreOptions, 'bulkImporter' | 'migrationRepository' | 'db'> &
24
23
  Omit<UnchainedServerOptions, 'roles' | 'unchainedAPI'>;
25
24
 
@@ -31,8 +30,6 @@ const REQUIRED_ENV_VARIABLES = [
31
30
  'UNCHAINED_TOKEN_SECRET',
32
31
  ];
33
32
 
34
- const { UNCHAINED_DISABLE_WORKER } = process.env;
35
-
36
33
  const exitOnMissingEnvironmentVariables = () => {
37
34
  const failedEnv = REQUIRED_ENV_VARIABLES.filter((key) => !process.env[key]);
38
35
  if (failedEnv.length > 0) {
@@ -50,13 +47,6 @@ const existOnInvalidEnvironmentVariables = () => {
50
47
  }
51
48
  };
52
49
 
53
- const checkWorkQueueEnabled = (options: SetupWorkqueueOptions) => {
54
- if (options?.disableWorker) return false;
55
- return !UNCHAINED_DISABLE_WORKER;
56
- };
57
-
58
- export const queueWorkers: Array<any> = [];
59
-
60
50
  export const startPlatform = async ({
61
51
  modules,
62
52
  services,
@@ -73,8 +63,6 @@ export const startPlatform = async ({
73
63
  exitOnMissingEnvironmentVariables();
74
64
  existOnInvalidEnvironmentVariables();
75
65
 
76
- const isWorkQueueEnabled = checkWorkQueueEnabled(workQueueOptions);
77
-
78
66
  const configuredRoles = roles.configureRoles(rolesOptions);
79
67
 
80
68
  // Configure database
@@ -94,51 +82,47 @@ export const startPlatform = async ({
94
82
  options,
95
83
  });
96
84
 
97
- if (isWorkQueueEnabled) {
98
- await runMigrations({ migrationRepository, unchainedAPI });
99
- }
100
-
101
- // Setup accountsjs specific extensions and event handlers
85
+ // Setup Accounts specific extensions and event handlers
102
86
  setupAccounts(unchainedAPI);
103
87
 
104
- // Setup email templates
88
+ // Setup Messaging Templates
105
89
  setupTemplates(unchainedAPI);
106
90
 
107
- // Setup file upload handlers
91
+ // Setup File Upload Handlers
108
92
  setupUploadHandlers(unchainedAPI);
109
93
 
110
- // Start the graphQL server
94
+ // Start GraphQL Server
111
95
  const graphqlHandler = await startAPIServer({
112
96
  unchainedAPI,
113
97
  roles: configuredRoles,
114
98
  ...arbitraryAPIServerConfiguration,
115
99
  });
116
100
 
117
- // Setup work queues for scheduled work
118
- if (isWorkQueueEnabled) {
119
- const handlers = setupWorkqueue(unchainedAPI, workQueueOptions);
120
- handlers.forEach((handler) => queueWorkers.push(handler));
121
- await setupCarts(unchainedAPI, workQueueOptions);
122
- }
123
-
124
- // Setup filter cache
125
- if (!workQueueOptions?.skipInvalidationOnStartup) {
126
- setImmediate(() => unchainedAPI.services.filters.invalidateFilterCache());
127
- }
101
+ // Setup Work Queue
102
+ await setupWorkqueue({
103
+ unchainedAPI,
104
+ migrationRepository,
105
+ ...workQueueOptions,
106
+ });
128
107
 
129
108
  const { default: packageJson } = await import(`${import.meta.dirname}/../package.json`, {
130
109
  with: { type: 'json' },
131
110
  });
132
111
  defaultLogger.info(`Unchained Engine running`, { version: packageJson.version });
133
112
 
134
- process.on('SIGTERM', async () => {
135
- defaultLogger.info('Stopping GraphQL server (SIGTERM)');
113
+ const cleanup = (signal) => async () => {
114
+ defaultLogger.debug('Stopping Workqueue', { signal });
115
+ stopWorkqueue();
116
+ defaultLogger.debug('Stopping GraphQL server', { signal });
136
117
  await graphqlHandler.dispose();
137
- defaultLogger.info('Stopping DB Connection (SIGTERM)');
118
+ defaultLogger.debug('Stopping DB Connection', { signal });
138
119
  await stopDb();
139
- defaultLogger.info(`Unchained Engine stopped`, { version: packageJson.version });
120
+ defaultLogger.info(`Unchained Engine stopped`, { signal, version: packageJson.version });
140
121
  process.exit(0);
141
- });
122
+ };
123
+
124
+ process.on('SIGTERM', cleanup('SIGTERM'));
125
+ process.on('SIGINT', cleanup('SIGINT'));
142
126
 
143
127
  return { unchainedAPI, graphqlHandler, db };
144
128
  };
@@ -3,11 +3,11 @@ import { Order } from '@unchainedshop/core-orders';
3
3
  import { ProductPricingSheet } from '@unchainedshop/core';
4
4
  import { ch } from '@unchainedshop/utils';
5
5
 
6
- type PriceFormatter = ({ amount, currency }: { amount: number; currency: string }) => string;
6
+ type PriceFormatter = ({ amount, currencyCode }: { amount: number; currencyCode: string }) => string;
7
7
 
8
8
  export const getOrderPositionsData = async (
9
9
  order: Order,
10
- params: { locale: string; useNetPrice?: boolean; format?: PriceFormatter },
10
+ params: { locale: Intl.Locale; useNetPrice?: boolean; format?: PriceFormatter },
11
11
  context: UnchainedCore,
12
12
  ) => {
13
13
  const { modules } = context;
@@ -25,7 +25,7 @@ export const getOrderPositionsData = async (
25
25
 
26
26
  const positionPricing = ProductPricingSheet({
27
27
  calculation: orderPosition.calculation,
28
- currency: order.currency,
28
+ currencyCode: order.currencyCode,
29
29
  quantity: orderPosition.quantity,
30
30
  });
31
31
 
@@ -2,11 +2,11 @@ import { Order } from '@unchainedshop/core-orders';
2
2
  import { UnchainedCore, OrderPricingSheet, OrderPricingRowCategory } from '@unchainedshop/core';
3
3
  import { ch } from '@unchainedshop/utils';
4
4
 
5
- type PriceFormatter = ({ amount, currency }: { amount: number; currency: string }) => string;
5
+ type PriceFormatter = ({ amount, currencyCode }: { amount: number; currencyCode: string }) => string;
6
6
 
7
7
  export const getOrderSummaryData = async (
8
8
  order: Order,
9
- params: { locale?: string; useNetPrice?: boolean; format?: PriceFormatter },
9
+ params: { locale: Intl.Locale; useNetPrice?: boolean; format?: PriceFormatter },
10
10
  context: UnchainedCore,
11
11
  ) => {
12
12
  const { modules } = context;
@@ -30,7 +30,7 @@ export const getOrderSummaryData = async (
30
30
  const billingAddress = ch.addressToString(order.billingAddress);
31
31
  const orderPricing = OrderPricingSheet({
32
32
  calculation: order.calculation,
33
- currency: order.currency,
33
+ currencyCode: order.currencyCode,
34
34
  });
35
35
 
36
36
  const paymentTotal = orderPricing.total({
@@ -36,7 +36,7 @@ Total: {{summary.prices.gross}}
36
36
  `;
37
37
 
38
38
  export const transformOrderToText = async (
39
- { order, locale }: { order: Order; locale: string },
39
+ { order, locale }: { order: Order; locale: Intl.Locale },
40
40
  context: UnchainedCore,
41
41
  ) => {
42
42
  return mustache.render(
@@ -31,7 +31,7 @@ export const resolveForwardDeliveryTemplate: TemplateResolver = async ({ config,
31
31
  {
32
32
  shopName: EMAIL_WEBSITE_NAME,
33
33
  shopUrl: EMAIL_WEBSITE_URL,
34
- orderDetails: await transformOrderToText({ order, locale: systemLocale.baseName }, context),
34
+ orderDetails: await transformOrderToText({ order, locale: systemLocale }, context),
35
35
  },
36
36
  undefined,
37
37
  { escape: (t) => t },
@@ -30,7 +30,7 @@ export const resolveOrderConfirmationTemplate: TemplateResolver<{
30
30
  {
31
31
  shopName: EMAIL_WEBSITE_NAME,
32
32
  shopUrl: EMAIL_WEBSITE_URL,
33
- orderDetails: await transformOrderToText({ order, locale }, context),
33
+ orderDetails: await transformOrderToText({ order, locale: new Intl.Locale(locale) }, context),
34
34
  },
35
35
  undefined,
36
36
  { escape: (t) => t },
@@ -31,7 +31,7 @@ export const resolveOrderRejectionTemplate: TemplateResolver = async ({ orderId,
31
31
  {
32
32
  shopName: EMAIL_WEBSITE_NAME,
33
33
  shopUrl: EMAIL_WEBSITE_URL,
34
- orderDetails: await transformOrderToText({ order, locale }, context),
34
+ orderDetails: await transformOrderToText({ order, locale: new Intl.Locale(locale) }, context),
35
35
  },
36
36
  undefined,
37
37
  { escape: (t) => t },
@@ -1,4 +0,0 @@
1
- import { Context } from '@unchainedshop/types/api.js';
2
- declare const _default: (fn?: (context: Context) => any) => any;
3
- export default _default;
4
- //# sourceMappingURL=withAccessToken.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"withAccessToken.d.ts","sourceRoot":"","sources":["../../src/context/withAccessToken.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;8BAOlC,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,KAAqB,GAAG;AAArE,wBAmCE"}
@@ -1,42 +0,0 @@
1
- import { createLogger } from '@unchainedshop/logger';
2
- import { timingSafeEqual } from 'crypto';
3
- const logger = createLogger('unchained:platform');
4
- const contextIdentity = (params) => params;
5
- export default (fn = contextIdentity) => {
6
- return async (params, unchainedContextFn) => {
7
- const unchainedContext = await unchainedContextFn(params);
8
- const newContext = {
9
- userId: unchainedContext.userId,
10
- user: unchainedContext.user,
11
- };
12
- if (!unchainedContext.userId && params.req.headers.authorization) {
13
- const [type, userToken] = params.req.headers.authorization.split(' ');
14
- if (type === 'Bearer' && userToken) {
15
- const [username, secret] = userToken.split(':');
16
- const user = await unchainedContext.modules.users.findUser({
17
- username,
18
- });
19
- if (secret && user?.services.token?.secret) {
20
- try {
21
- if (timingSafeEqual(Buffer.from(secret), Buffer.from(user?.services.token?.secret))) {
22
- newContext.userId = user._id;
23
- newContext.user = user;
24
- logger.debug('Token login success');
25
- }
26
- else {
27
- throw new Error('Access Token not valid');
28
- }
29
- }
30
- catch (e) {
31
- logger.warn(`Token login failed: ${e.message}`);
32
- }
33
- }
34
- }
35
- }
36
- return fn({
37
- ...unchainedContext,
38
- ...newContext,
39
- });
40
- };
41
- };
42
- //# sourceMappingURL=withAccessToken.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"withAccessToken.js","sourceRoot":"","sources":["../../src/context/withAccessToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;AAE3C,eAAe,CAAC,KAAgC,eAAe,EAAO,EAAE;IACtE,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE;QAC1C,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG;YACjB,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,IAAI,EAAE,gBAAgB,CAAC,IAAI;SAC5B,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,IAAI,KAAK,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACzD,QAAQ;iBACT,CAAC,CAAC;gBAEH,IAAI,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;oBAC3C,IAAI,CAAC;wBACH,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;4BACpF,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;4BAC7B,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;4BACvB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;wBACtC,CAAC;6BAAM,CAAC;4BACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;wBAC5C,CAAC;oBACH,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;YACR,GAAG,gBAAgB;YACnB,GAAG,UAAU;SACd,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,8 +0,0 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
- export interface SetupCartsOptions {
3
- invalidateProviders?: boolean;
4
- providerInvalidationMaxAgeDays?: number;
5
- assignCartForUsers?: boolean;
6
- }
7
- export declare const setupCarts: (unchainedAPI: UnchainedCore, options?: SetupCartsOptions) => Promise<void>;
8
- //# sourceMappingURL=setupCarts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupCarts.d.ts","sourceRoot":"","sources":["../../src/setup/setupCarts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAGD,eAAO,MAAM,UAAU,GAAU,cAAc,aAAa,EAAE,UAAS,iBAAsB,kBAyB5F,CAAC"}
@@ -1,20 +0,0 @@
1
- const { UNCHAINED_DISABLE_PROVIDER_INVALIDATION, UNCHAINED_ASSIGN_CART_FOR_USERS } = process.env;
2
- export const setupCarts = async (unchainedAPI, options = {}) => {
3
- if (options.invalidateProviders ?? !UNCHAINED_DISABLE_PROVIDER_INVALIDATION) {
4
- const orders = await unchainedAPI.modules.orders.findCartsToInvalidate(options.providerInvalidationMaxAgeDays);
5
- await Promise.allSettled(orders.map(async (order) => {
6
- await unchainedAPI.services.orders.updateCalculation(order._id);
7
- }));
8
- }
9
- if (options.assignCartForUsers ?? Boolean(UNCHAINED_ASSIGN_CART_FOR_USERS)) {
10
- const users = await unchainedAPI.modules.users.findUsers({});
11
- await Promise.all(users.map((user) => {
12
- const locale = unchainedAPI.modules.users.userLocale(user);
13
- return unchainedAPI.services.orders.nextUserCart({
14
- user,
15
- countryCode: locale.region,
16
- });
17
- }));
18
- }
19
- };
20
- //# sourceMappingURL=setupCarts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupCarts.js","sourceRoot":"","sources":["../../src/setup/setupCarts.ts"],"names":[],"mappings":"AAOA,MAAM,EAAE,uCAAuC,EAAE,+BAA+B,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAEjG,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,YAA2B,EAAE,UAA6B,EAAE,EAAE,EAAE;IAC/F,IAAI,OAAO,CAAC,mBAAmB,IAAI,CAAC,uCAAuC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CACpE,OAAO,CAAC,8BAA8B,CACvC,CAAC;QACF,MAAM,OAAO,CAAC,UAAU,CACtB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACzB,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC,+BAA+B,CAAC,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE7D,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC/C,IAAI;gBACJ,WAAW,EAAE,MAAM,CAAC,MAAM;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Address } from '@unchainedshop/types/common.js';
2
- export declare const formatAddress: (address: Address) => string;
3
- //# sourceMappingURL=formatAddress.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatAddress.d.ts","sourceRoot":"","sources":["../../../src/templates/order-parser/formatAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAEzD,eAAO,MAAM,aAAa,YAAa,OAAO,WAY7C,CAAC"}
@@ -1,14 +0,0 @@
1
- export const formatAddress = (address) => {
2
- return [
3
- [address.firstName, address.lastName].filter(Boolean).join(' '),
4
- address.company,
5
- address.addressLine,
6
- address.addressLine2,
7
- [address.postalCode, address.city].filter(Boolean).join(' '),
8
- address.regionCode,
9
- [address.countryCode].filter(Boolean).join(''),
10
- ]
11
- .filter(Boolean)
12
- .join('\n');
13
- };
14
- //# sourceMappingURL=formatAddress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatAddress.js","sourceRoot":"","sources":["../../../src/templates/order-parser/formatAddress.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,EAAE;IAChD,OAAO;QACL,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC/D,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,YAAY;QACpB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5D,OAAO,CAAC,UAAU;QAClB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;KAC/C;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC"}
@@ -1,6 +0,0 @@
1
- export declare const formatPrice: ({ amount, currency }: {
2
- amount: number;
3
- currency: string;
4
- }) => string;
5
- export default formatPrice;
6
- //# sourceMappingURL=formatPrice.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatPrice.d.ts","sourceRoot":"","sources":["../../../src/templates/order-parser/formatPrice.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,yBAA0B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,WAGrF,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,6 +0,0 @@
1
- export const formatPrice = ({ amount, currency }) => {
2
- const fixedPrice = amount / 100;
3
- return `${currency} ${fixedPrice}`;
4
- };
5
- export default formatPrice;
6
- //# sourceMappingURL=formatPrice.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatPrice.js","sourceRoot":"","sources":["../../../src/templates/order-parser/formatPrice.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAwC,EAAE,EAAE;IACxF,MAAM,UAAU,GAAG,MAAM,GAAG,GAAG,CAAC;IAChC,OAAO,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,35 +0,0 @@
1
- import { UnchainedCore } from '@unchainedshop/core';
2
-
3
- export interface SetupCartsOptions {
4
- invalidateProviders?: boolean;
5
- providerInvalidationMaxAgeDays?: number;
6
- assignCartForUsers?: boolean;
7
- }
8
- const { UNCHAINED_DISABLE_PROVIDER_INVALIDATION, UNCHAINED_ASSIGN_CART_FOR_USERS } = process.env;
9
-
10
- export const setupCarts = async (unchainedAPI: UnchainedCore, options: SetupCartsOptions = {}) => {
11
- if (options.invalidateProviders ?? !UNCHAINED_DISABLE_PROVIDER_INVALIDATION) {
12
- const orders = await unchainedAPI.modules.orders.findCartsToInvalidate(
13
- options.providerInvalidationMaxAgeDays,
14
- );
15
- await Promise.allSettled(
16
- orders.map(async (order) => {
17
- await unchainedAPI.services.orders.updateCalculation(order._id);
18
- }),
19
- );
20
- }
21
-
22
- if (options.assignCartForUsers ?? Boolean(UNCHAINED_ASSIGN_CART_FOR_USERS)) {
23
- const users = await unchainedAPI.modules.users.findUsers({});
24
-
25
- await Promise.all(
26
- users.map((user) => {
27
- const locale = unchainedAPI.modules.users.userLocale(user);
28
- return unchainedAPI.services.orders.nextUserCart({
29
- user,
30
- countryCode: locale.region,
31
- });
32
- }),
33
- );
34
- }
35
- };