@unchainedshop/core-delivery 4.3.4 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,89 @@
1
- # Delivery (Unchained Engine)
1
+ [![npm version](https://img.shields.io/npm/v/@unchainedshop/core-delivery.svg)](https://npmjs.com/package/@unchainedshop/core-delivery)
2
+ [![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](https://opensource.org/licenses/EUPL-1.2)
2
3
 
3
- This package contains business logic and database abstraction for delivery in Unchained.
4
+ # @unchainedshop/core-delivery
5
+
6
+ Delivery provider module for the Unchained Engine. Manages delivery providers, shipping methods, and delivery processing.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install @unchainedshop/core-delivery
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```typescript
17
+ import { configureDeliveryModule, DeliveryProviderType } from '@unchainedshop/core-delivery';
18
+
19
+ const deliveryModule = await configureDeliveryModule({ db });
20
+
21
+ // Create a delivery provider
22
+ const providerId = await deliveryModule.create({
23
+ type: DeliveryProviderType.SHIPPING,
24
+ adapterKey: 'shop.unchained.delivery.post',
25
+ });
26
+
27
+ // Find providers for a context
28
+ const providers = await deliveryModule.findSupported({
29
+ order: orderObject,
30
+ });
31
+ ```
32
+
33
+ ## API Overview
34
+
35
+ ### Module Configuration
36
+
37
+ | Export | Description |
38
+ |--------|-------------|
39
+ | `configureDeliveryModule` | Configure and return the delivery module |
40
+
41
+ ### Queries
42
+
43
+ | Method | Description |
44
+ |--------|-------------|
45
+ | `findProvider` | Find provider by ID |
46
+ | `findProviders` | Find providers with filtering |
47
+ | `count` | Count providers |
48
+ | `providerExists` | Check if provider exists |
49
+ | `findSupported` | Find providers supported for context |
50
+ | `findInterface` | Get provider interface definition |
51
+
52
+ ### Mutations
53
+
54
+ | Method | Description |
55
+ |--------|-------------|
56
+ | `create` | Create a new delivery provider |
57
+ | `update` | Update provider configuration |
58
+ | `delete` | Soft delete a provider |
59
+
60
+ ### Constants
61
+
62
+ | Export | Description |
63
+ |--------|-------------|
64
+ | `DeliveryProviderType` | Provider types (SHIPPING, PICKUP) |
65
+
66
+ ### Settings
67
+
68
+ | Export | Description |
69
+ |--------|-------------|
70
+ | `deliverySettings` | Access delivery module settings |
71
+
72
+ ### Types
73
+
74
+ | Export | Description |
75
+ |--------|-------------|
76
+ | `DeliveryProvider` | Provider document type |
77
+ | `DeliveryModule` | Module interface type |
78
+
79
+ ## Events
80
+
81
+ | Event | Description |
82
+ |-------|-------------|
83
+ | `DELIVERY_PROVIDER_CREATE` | Provider created |
84
+ | `DELIVERY_PROVIDER_UPDATE` | Provider updated |
85
+ | `DELIVERY_PROVIDER_REMOVE` | Provider deleted |
86
+
87
+ ## License
88
+
89
+ EUPL-1.2
@@ -1,8 +1,9 @@
1
- import { mongodb, TimestampFields } from '@unchainedshop/mongodb';
2
- export declare enum DeliveryProviderType {
3
- SHIPPING = "SHIPPING",
4
- PICKUP = "PICKUP"
5
- }
1
+ import { mongodb, type TimestampFields } from '@unchainedshop/mongodb';
2
+ export declare const DeliveryProviderType: {
3
+ readonly SHIPPING: "SHIPPING";
4
+ readonly PICKUP: "PICKUP";
5
+ };
6
+ export type DeliveryProviderType = (typeof DeliveryProviderType)[keyof typeof DeliveryProviderType];
6
7
  export type DeliveryConfiguration = {
7
8
  key: string;
8
9
  value: string;
@@ -29,4 +30,3 @@ export interface DeliveryLocation {
29
30
  };
30
31
  }
31
32
  export declare const DeliveryProvidersCollection: (db: mongodb.Db) => Promise<mongodb.Collection<DeliveryProvider>>;
32
- //# sourceMappingURL=DeliveryProvidersCollection.d.ts.map
@@ -1,9 +1,8 @@
1
- import { buildDbIndexes } from '@unchainedshop/mongodb';
2
- export var DeliveryProviderType;
3
- (function (DeliveryProviderType) {
4
- DeliveryProviderType["SHIPPING"] = "SHIPPING";
5
- DeliveryProviderType["PICKUP"] = "PICKUP";
6
- })(DeliveryProviderType || (DeliveryProviderType = {}));
1
+ import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
2
+ export const DeliveryProviderType = {
3
+ SHIPPING: 'SHIPPING',
4
+ PICKUP: 'PICKUP',
5
+ };
7
6
  export const DeliveryProvidersCollection = async (db) => {
8
7
  const DeliveryProviders = db.collection('delivery-providers');
9
8
  await buildDbIndexes(DeliveryProviders, [
@@ -17,4 +16,3 @@ export const DeliveryProvidersCollection = async (db) => {
17
16
  ]);
18
17
  return DeliveryProviders;
19
18
  };
20
- //# sourceMappingURL=DeliveryProvidersCollection.js.map
@@ -1,4 +1,3 @@
1
- export * from './module/configureDeliveryModule.js';
2
- export * from './db/DeliveryProvidersCollection.js';
3
- export * from './delivery-settings.js';
4
- //# sourceMappingURL=delivery-index.d.ts.map
1
+ export * from './module/configureDeliveryModule.ts';
2
+ export * from './db/DeliveryProvidersCollection.ts';
3
+ export * from './delivery-settings.ts';
@@ -1,4 +1,3 @@
1
- export * from './module/configureDeliveryModule.js';
2
- export * from './db/DeliveryProvidersCollection.js';
3
- export * from './delivery-settings.js';
4
- //# sourceMappingURL=delivery-index.js.map
1
+ export * from "./module/configureDeliveryModule.js";
2
+ export * from "./db/DeliveryProvidersCollection.js";
3
+ export * from "./delivery-settings.js";
@@ -1,4 +1,4 @@
1
- import { DeliveryProvider } from './db/DeliveryProvidersCollection.js';
1
+ import type { DeliveryProvider } from './db/DeliveryProvidersCollection.ts';
2
2
  export type FilterProviders<Order = unknown, UnchainedAPI = unknown> = (params: {
3
3
  providers: DeliveryProvider[];
4
4
  order: Order;
@@ -14,4 +14,3 @@ export interface DeliverySettings {
14
14
  configureSettings: (options?: DeliverySettingsOptions) => void;
15
15
  }
16
16
  export declare const deliverySettings: DeliverySettings;
17
- //# sourceMappingURL=delivery-settings.d.ts.map
@@ -15,4 +15,3 @@ export const deliverySettings = {
15
15
  deliverySettings.determineDefaultProvider = determineDefaultProvider;
16
16
  },
17
17
  };
18
- //# sourceMappingURL=delivery-settings.js.map
@@ -1,41 +1,24 @@
1
- import { mongodb, ModuleInput } from '@unchainedshop/mongodb';
2
- import { DeliveryProvider } from '../db/DeliveryProvidersCollection.js';
3
- import { DeliverySettingsOptions } from '../delivery-settings.js';
1
+ import { mongodb, type ModuleInput } from '@unchainedshop/mongodb';
2
+ import { type DeliveryProvider, type DeliveryProviderType } from '../db/DeliveryProvidersCollection.ts';
3
+ import { type DeliverySettingsOptions } from '../delivery-settings.ts';
4
4
  export interface DeliveryInterface {
5
5
  _id: string;
6
6
  label: string;
7
7
  version: string;
8
8
  }
9
- export declare const buildFindSelector: ({ includeDeleted, ...rest }?: mongodb.Filter<DeliveryProvider> & {
9
+ export interface DeliveryProviderQuery {
10
+ deliveryProviderIds?: string[];
11
+ type?: DeliveryProviderType;
10
12
  includeDeleted?: boolean;
11
- }) => {
12
- type?: mongodb.Condition<import("../db/DeliveryProvidersCollection.js").DeliveryProviderType> | undefined;
13
- created?: mongodb.Condition<Date> | undefined;
14
- deleted?: Date | mongodb.FilterOperators<Date | null | undefined> | null | undefined;
15
- adapterKey?: mongodb.Condition<string> | undefined;
16
- configuration?: mongodb.Condition<import("../db/DeliveryProvidersCollection.js").DeliveryConfiguration> | undefined;
17
- updated?: mongodb.Condition<Date | undefined>;
18
- _id?: mongodb.Condition<string> | undefined;
19
- $and?: mongodb.Filter<mongodb.WithId<DeliveryProvider>>[] | undefined;
20
- $nor?: mongodb.Filter<mongodb.WithId<DeliveryProvider>>[] | undefined;
21
- $or?: mongodb.Filter<mongodb.WithId<DeliveryProvider>>[] | undefined;
22
- $text?: {
23
- $search: string;
24
- $language?: string;
25
- $caseSensitive?: boolean;
26
- $diacriticSensitive?: boolean;
27
- };
28
- $where?: string | ((this: mongodb.WithId<DeliveryProvider>) => boolean) | undefined;
29
- $comment?: string | mongodb.BSON.Document;
30
- };
13
+ queryString?: string;
14
+ }
15
+ export declare const buildFindSelector: ({ includeDeleted, queryString, deliveryProviderIds, type, }?: DeliveryProviderQuery) => mongodb.Filter<DeliveryProvider>;
31
16
  export declare const configureDeliveryModule: ({ db, options: deliveryOptions, }: ModuleInput<DeliverySettingsOptions>) => Promise<{
32
- count: (query: mongodb.Filter<DeliveryProvider>) => Promise<number>;
17
+ count: (query?: DeliveryProviderQuery) => Promise<number>;
33
18
  findProvider: ({ deliveryProviderId, ...query }: {
34
19
  deliveryProviderId: string;
35
20
  } & mongodb.Filter<DeliveryProvider>, options?: mongodb.FindOptions) => Promise<DeliveryProvider | null>;
36
- findProviders: (query: mongodb.Filter<DeliveryProvider> & {
37
- includeDeleted?: boolean;
38
- }, options?: mongodb.FindOptions) => Promise<DeliveryProvider[]>;
21
+ findProviders: (query?: DeliveryProviderQuery, options?: mongodb.FindOptions) => Promise<DeliveryProvider[]>;
39
22
  allProviders: () => Promise<mongodb.WithId<DeliveryProvider>[]>;
40
23
  providerExists: ({ deliveryProviderId }: {
41
24
  deliveryProviderId: string;
@@ -45,4 +28,3 @@ export declare const configureDeliveryModule: ({ db, options: deliveryOptions, }
45
28
  delete: (_id: string) => Promise<mongodb.WithId<DeliveryProvider> | null>;
46
29
  }>;
47
30
  export type DeliveryModule = Awaited<ReturnType<typeof configureDeliveryModule>>;
48
- //# sourceMappingURL=configureDeliveryModule.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { emit, registerEvents } from '@unchainedshop/events';
2
- import { generateDbFilterById, generateDbObjectId } from '@unchainedshop/mongodb';
3
- import { DeliveryProvidersCollection } from '../db/DeliveryProvidersCollection.js';
4
- import { deliverySettings } from '../delivery-settings.js';
2
+ import { mongodb, generateDbFilterById, generateDbObjectId, } from '@unchainedshop/mongodb';
3
+ import { DeliveryProvidersCollection, } from "../db/DeliveryProvidersCollection.js";
4
+ import { deliverySettings } from "../delivery-settings.js";
5
5
  import pMemoize from 'p-memoize';
6
6
  import ExpiryMap from 'expiry-map';
7
7
  const DELIVERY_PROVIDER_EVENTS = [
@@ -9,8 +9,19 @@ const DELIVERY_PROVIDER_EVENTS = [
9
9
  'DELIVERY_PROVIDER_UPDATE',
10
10
  'DELIVERY_PROVIDER_REMOVE',
11
11
  ];
12
- export const buildFindSelector = ({ includeDeleted = false, ...rest } = {}) => {
13
- return { ...(includeDeleted ? {} : { deleted: null }), ...rest };
12
+ export const buildFindSelector = ({ includeDeleted = false, queryString, deliveryProviderIds, type, } = {}) => {
13
+ const selector = includeDeleted ? {} : { deleted: null };
14
+ if (deliveryProviderIds) {
15
+ selector._id = { $in: deliveryProviderIds };
16
+ }
17
+ if (type) {
18
+ selector.type = type;
19
+ }
20
+ if (queryString) {
21
+ const regex = new RegExp(queryString, 'i');
22
+ selector.$or = [{ _id: regex }, { adapterKey: regex }];
23
+ }
24
+ return selector;
14
25
  };
15
26
  const allProvidersCache = new ExpiryMap(process.env.NODE_ENV === 'production' ? 60000 : 1);
16
27
  export const configureDeliveryModule = async ({ db, options: deliveryOptions = {}, }) => {
@@ -18,15 +29,14 @@ export const configureDeliveryModule = async ({ db, options: deliveryOptions = {
18
29
  deliverySettings.configureSettings(deliveryOptions);
19
30
  const DeliveryProviders = await DeliveryProvidersCollection(db);
20
31
  return {
21
- // Queries
22
- count: async (query) => {
32
+ count: async (query = {}) => {
23
33
  const providerCount = await DeliveryProviders.countDocuments(buildFindSelector(query));
24
34
  return providerCount;
25
35
  },
26
36
  findProvider: async ({ deliveryProviderId, ...query }, options) => {
27
37
  return DeliveryProviders.findOne(deliveryProviderId ? generateDbFilterById(deliveryProviderId) : query, options);
28
38
  },
29
- findProviders: async (query, options = { sort: { created: 1 } }) => {
39
+ findProviders: async (query = {}, options = { sort: { created: 1 } }) => {
30
40
  const providers = DeliveryProviders.find(buildFindSelector(query), options);
31
41
  return providers.toArray();
32
42
  },
@@ -39,7 +49,6 @@ export const configureDeliveryModule = async ({ db, options: deliveryOptions = {
39
49
  const providerCount = await DeliveryProviders.countDocuments(generateDbFilterById(deliveryProviderId, { deleted: null }), { limit: 1 });
40
50
  return !!providerCount;
41
51
  },
42
- // Mutations
43
52
  create: async (doc) => {
44
53
  const { insertedId: deliveryProviderId } = await DeliveryProviders.insertOne({
45
54
  _id: generateDbObjectId(),
@@ -78,4 +87,3 @@ export const configureDeliveryModule = async ({ db, options: deliveryOptions = {
78
87
  },
79
88
  };
80
89
  };
81
- //# sourceMappingURL=configureDeliveryModule.js.map
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@unchainedshop/core-delivery",
3
- "version": "4.3.4",
3
+ "version": "4.5.0",
4
4
  "main": "lib/delivery-index.js",
5
5
  "types": "lib/delivery-index.d.ts",
6
6
  "type": "module",
7
+ "sideEffects": false,
7
8
  "scripts": {
8
9
  "clean": "tsc -b --clean",
9
10
  "build": "tsc -b",
10
11
  "prepublishOnly": "npm run clean && npm run build",
11
12
  "watch": "tsc -w",
12
- "test": "tsx --test",
13
- "test:watch": "tsx --test --watch"
13
+ "test": "node --test",
14
+ "test:watch": "node --test --watch"
14
15
  },
15
16
  "repository": {
16
17
  "type": "git",
@@ -22,8 +23,10 @@
22
23
  "core"
23
24
  ],
24
25
  "authors": [
25
- "Joël Meiller",
26
- "Pascal Kaufmann"
26
+ "Pascal Kaufmann",
27
+ "Mikael Araya",
28
+ "Vedran Rudelj",
29
+ "Joël Meiller"
27
30
  ],
28
31
  "license": "EUPL-1.2",
29
32
  "bugs": {
@@ -31,16 +34,15 @@
31
34
  },
32
35
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
36
  "dependencies": {
34
- "@unchainedshop/events": "^4.3.0",
35
- "@unchainedshop/logger": "^4.3.0",
36
- "@unchainedshop/mongodb": "^4.3.0",
37
- "@unchainedshop/utils": "^4.3.0",
37
+ "@unchainedshop/events": "^4.5.0",
38
+ "@unchainedshop/logger": "^4.5.0",
39
+ "@unchainedshop/mongodb": "^4.5.0",
40
+ "@unchainedshop/utils": "^4.5.0",
38
41
  "expiry-map": "^2.0.0",
39
42
  "p-memoize": "^8.0.0"
40
43
  },
41
44
  "devDependencies": {
42
- "@types/node": "^24.0.13",
43
- "tsx": "^4.20.3",
45
+ "@types/node": "^25.0.0",
44
46
  "typescript": "^5.8.3"
45
47
  }
46
48
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeliveryProvidersCollection.d.ts","sourceRoot":"","sources":["../../src/db/DeliveryProvidersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAElF,oBAAY,oBAAoB;IAC9B,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AACD,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,EAAE,CAAC;AAEJ,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,oBAAoB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;CACtC,GAAG,eAAe,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AACD,eAAO,MAAM,2BAA2B,GAAU,IAAI,OAAO,CAAC,EAAE,kDAc/D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeliveryProvidersCollection.js","sourceRoot":"","sources":["../../src/db/DeliveryProvidersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,cAAc,EAAmB,MAAM,wBAAwB,CAAC;AAElF,MAAM,CAAN,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,6CAAqB,CAAA;IACrB,yCAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,KAApB,oBAAoB,QAG/B;AA4BD,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;IAClE,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAmB,oBAAoB,CAAC,CAAC;IAEhF,MAAM,cAAc,CAAmB,iBAAiB,EAAE;QACxD,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QACtB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;QACzB;YACE,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC;aACX;SACF;KACF,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery-index.d.ts","sourceRoot":"","sources":["../src/delivery-index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery-index.js","sourceRoot":"","sources":["../src/delivery-index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery-settings.d.ts","sourceRoot":"","sources":["../src/delivery-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,MAAM,MAAM,eAAe,CAAC,KAAK,GAAG,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,CACrE,MAAM,EAAE;IACN,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,EAAE,KAAK,CAAC;CACd,EACD,YAAY,EAAE,YAAY,KACvB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAEjC,MAAM,MAAM,wBAAwB,CAAC,KAAK,GAAG,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,CAC9E,MAAM,EAAE;IACN,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,EAAE,KAAK,CAAC;CACd,EACD,YAAY,EAAE,YAAY,KACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;AACtC,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB,EAAE,eAAe,CAAC;IAC1C,wBAAwB,EAAE,wBAAwB,CAAC;IACnD,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,uBAAuB,KAAK,IAAI,CAAC;CAChE;AAcD,eAAO,MAAM,gBAAgB,EAAE,gBAU9B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delivery-settings.js","sourceRoot":"","sources":["../src/delivery-settings.ts"],"names":[],"mappings":"AAyBA,MAAM,kBAAkB,GAAG,CAAC,IAAsB,EAAE,KAAuB,EAAE,EAAE;IAC7E,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,YAAY,GAAoB,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC5D,OAAO,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAA6B,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC/E,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,wBAAwB,EAAE,YAAY;IACtC,wBAAwB,EAAE,sBAAsB;IAChD,iBAAiB,CAAC,EAChB,wBAAwB,GAAG,YAAY,EACvC,wBAAwB,GAAG,sBAAsB,GAClD,GAAG,EAAE;QACJ,gBAAgB,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;QACrE,gBAAgB,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;IACvE,CAAC;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configureDeliveryModule.d.ts","sourceRoot":"","sources":["../../src/module/configureDeliveryModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAA4C,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACxG,OAAO,EAA+B,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAoB,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAUpF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,iBAAiB,GAAI,8BAG/B,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO;;;;;;;;;;;;;iBAqHm22S,CAAC;sBAAgC,CAAC;2BAAsC,CAAC;;;;CAnHl/2S,CAAC;AAIF,eAAO,MAAM,uBAAuB,GAAU,mCAG3C,WAAW,CAAC,uBAAuB,CAAC;mBASd,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC;qDASlE;QACD,kBAAkB,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAC1B,OAAO,CAAC,WAAW;2BAStB,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,YAC7D,OAAO,CAAC,WAAW,KAC3B,OAAO,CAAC,gBAAgB,EAAE,CAAC;;6CAciB;QAAE,kBAAkB,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,OAAO,CAAC;kBAUzF,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC;kBAgBrE,MAAM,OAAO,gBAAgB;kBAiB7B,MAAM;EAgB7B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configureDeliveryModule.js","sourceRoot":"","sources":["../../src/module/configureDeliveryModule.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import { mongodb, buildDbIndexes, TimestampFields } from '@unchainedshop/mongodb';
2
-
3
- export enum DeliveryProviderType {
4
- SHIPPING = 'SHIPPING',
5
- PICKUP = 'PICKUP',
6
- }
7
- export type DeliveryConfiguration = {
8
- key: string;
9
- value: string;
10
- }[];
11
-
12
- export type DeliveryProvider = {
13
- _id: string;
14
- type: DeliveryProviderType;
15
- adapterKey: string;
16
- configuration: DeliveryConfiguration;
17
- } & TimestampFields;
18
-
19
- export interface DeliveryLocation {
20
- _id: string;
21
- name: string;
22
- address: {
23
- addressLine: string;
24
- addressLine2?: string;
25
- postalCode: string;
26
- countryCode: string;
27
- city: string;
28
- };
29
- geoPoint: {
30
- latitude: number;
31
- longitude: number;
32
- };
33
- }
34
- export const DeliveryProvidersCollection = async (db: mongodb.Db) => {
35
- const DeliveryProviders = db.collection<DeliveryProvider>('delivery-providers');
36
-
37
- await buildDbIndexes<DeliveryProvider>(DeliveryProviders, [
38
- { index: { type: 1 } },
39
- { index: { created: 1 } },
40
- {
41
- index: {
42
- deleted: 1,
43
- },
44
- },
45
- ]);
46
-
47
- return DeliveryProviders;
48
- };
@@ -1,3 +0,0 @@
1
- export * from './module/configureDeliveryModule.js';
2
- export * from './db/DeliveryProvidersCollection.js';
3
- export * from './delivery-settings.js';
@@ -1,48 +0,0 @@
1
- import { DeliveryProvider } from './db/DeliveryProvidersCollection.js';
2
-
3
- export type FilterProviders<Order = unknown, UnchainedAPI = unknown> = (
4
- params: {
5
- providers: DeliveryProvider[];
6
- order: Order;
7
- },
8
- unchainedAPI: UnchainedAPI,
9
- ) => Promise<DeliveryProvider[]>;
10
-
11
- export type DetermineDefaultProvider<Order = unknown, UnchainedAPI = unknown> = (
12
- params: {
13
- providers: DeliveryProvider[];
14
- order: Order;
15
- },
16
- unchainedAPI: UnchainedAPI,
17
- ) => Promise<DeliveryProvider | null>;
18
- export type DeliverySettingsOptions = Omit<Partial<DeliverySettings>, 'configureSettings'>;
19
-
20
- export interface DeliverySettings {
21
- filterSupportedProviders: FilterProviders;
22
- determineDefaultProvider: DetermineDefaultProvider;
23
- configureSettings: (options?: DeliverySettingsOptions) => void;
24
- }
25
-
26
- const sortByCreationDate = (left: DeliveryProvider, right: DeliveryProvider) => {
27
- return new Date(left.created).getTime() - new Date(right.created).getTime();
28
- };
29
-
30
- const allProviders: FilterProviders = async ({ providers }) => {
31
- return providers.toSorted(sortByCreationDate);
32
- };
33
-
34
- const firstProviderIsDefault: DetermineDefaultProvider = async ({ providers }) => {
35
- return (providers?.length > 0 && providers[0]) || null;
36
- };
37
-
38
- export const deliverySettings: DeliverySettings = {
39
- filterSupportedProviders: allProviders,
40
- determineDefaultProvider: firstProviderIsDefault,
41
- configureSettings({
42
- filterSupportedProviders = allProviders,
43
- determineDefaultProvider = firstProviderIsDefault,
44
- } = {}) {
45
- deliverySettings.filterSupportedProviders = filterSupportedProviders;
46
- deliverySettings.determineDefaultProvider = determineDefaultProvider;
47
- },
48
- };
@@ -1,19 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
- import { DeliveryProviderType } from '../delivery-index.js';
4
- import { buildFindSelector } from './configureDeliveryModule.js';
5
-
6
- describe('Delivery', () => {
7
- describe('buildFindSelector', () => {
8
- it('Return correct filter object when passed no argument', () => {
9
- assert.deepStrictEqual(buildFindSelector({}), { deleted: null });
10
- });
11
-
12
- it('Return correct filter object when passed type', () => {
13
- assert.deepStrictEqual(buildFindSelector({ type: DeliveryProviderType.PICKUP }), {
14
- type: 'PICKUP',
15
- deleted: null,
16
- });
17
- });
18
- });
19
- });
@@ -1,139 +0,0 @@
1
- import { emit, registerEvents } from '@unchainedshop/events';
2
- import { mongodb, generateDbFilterById, generateDbObjectId, ModuleInput } from '@unchainedshop/mongodb';
3
- import { DeliveryProvidersCollection, DeliveryProvider } from '../db/DeliveryProvidersCollection.js';
4
- import { deliverySettings, DeliverySettingsOptions } from '../delivery-settings.js';
5
- import pMemoize from 'p-memoize';
6
- import ExpiryMap from 'expiry-map';
7
-
8
- const DELIVERY_PROVIDER_EVENTS: string[] = [
9
- 'DELIVERY_PROVIDER_CREATE',
10
- 'DELIVERY_PROVIDER_UPDATE',
11
- 'DELIVERY_PROVIDER_REMOVE',
12
- ];
13
-
14
- export interface DeliveryInterface {
15
- _id: string;
16
- label: string;
17
- version: string;
18
- }
19
-
20
- export const buildFindSelector = ({
21
- includeDeleted = false,
22
- ...rest
23
- }: mongodb.Filter<DeliveryProvider> & { includeDeleted?: boolean } = {}) => {
24
- return { ...(includeDeleted ? {} : { deleted: null }), ...rest };
25
- };
26
-
27
- const allProvidersCache = new ExpiryMap(process.env.NODE_ENV === 'production' ? 60000 : 1);
28
-
29
- export const configureDeliveryModule = async ({
30
- db,
31
- options: deliveryOptions = {},
32
- }: ModuleInput<DeliverySettingsOptions>) => {
33
- registerEvents(DELIVERY_PROVIDER_EVENTS);
34
-
35
- deliverySettings.configureSettings(deliveryOptions);
36
-
37
- const DeliveryProviders = await DeliveryProvidersCollection(db);
38
-
39
- return {
40
- // Queries
41
- count: async (query: mongodb.Filter<DeliveryProvider>): Promise<number> => {
42
- const providerCount = await DeliveryProviders.countDocuments(buildFindSelector(query));
43
- return providerCount;
44
- },
45
-
46
- findProvider: async (
47
- {
48
- deliveryProviderId,
49
- ...query
50
- }: {
51
- deliveryProviderId: string;
52
- } & mongodb.Filter<DeliveryProvider>,
53
- options?: mongodb.FindOptions,
54
- ) => {
55
- return DeliveryProviders.findOne(
56
- deliveryProviderId ? generateDbFilterById(deliveryProviderId) : query,
57
- options,
58
- );
59
- },
60
-
61
- findProviders: async (
62
- query: mongodb.Filter<DeliveryProvider> & { includeDeleted?: boolean },
63
- options: mongodb.FindOptions = { sort: { created: 1 } },
64
- ): Promise<DeliveryProvider[]> => {
65
- const providers = DeliveryProviders.find(buildFindSelector(query), options);
66
- return providers.toArray();
67
- },
68
-
69
- allProviders: pMemoize(
70
- async function () {
71
- return DeliveryProviders.find({ deleted: null }, { sort: { created: 1 } }).toArray();
72
- },
73
- {
74
- cache: allProvidersCache,
75
- },
76
- ),
77
-
78
- providerExists: async ({ deliveryProviderId }: { deliveryProviderId: string }): Promise<boolean> => {
79
- const providerCount = await DeliveryProviders.countDocuments(
80
- generateDbFilterById(deliveryProviderId, { deleted: null }),
81
- { limit: 1 },
82
- );
83
- return !!providerCount;
84
- },
85
-
86
- // Mutations
87
- create: async (
88
- doc: Omit<DeliveryProvider, '_id' | 'created'> & Pick<Partial<DeliveryProvider>, '_id'>,
89
- ) => {
90
- const { insertedId: deliveryProviderId } = await DeliveryProviders.insertOne({
91
- _id: generateDbObjectId(),
92
- created: new Date(),
93
- ...doc,
94
- });
95
- const deliveryProvider = (await DeliveryProviders.findOne(
96
- { _id: deliveryProviderId },
97
- {},
98
- )) as DeliveryProvider;
99
- allProvidersCache.clear();
100
- await emit('DELIVERY_PROVIDER_CREATE', { deliveryProvider });
101
- return deliveryProvider;
102
- },
103
-
104
- update: async (_id: string, doc: DeliveryProvider) => {
105
- const deliveryProvider = await DeliveryProviders.findOneAndUpdate(
106
- generateDbFilterById(_id),
107
- {
108
- $set: {
109
- updated: new Date(),
110
- ...doc,
111
- },
112
- },
113
- { returnDocument: 'after' },
114
- );
115
- if (!deliveryProvider) return null;
116
- allProvidersCache.clear();
117
- await emit('DELIVERY_PROVIDER_UPDATE', { deliveryProvider });
118
- return deliveryProvider;
119
- },
120
-
121
- delete: async (_id: string) => {
122
- const deliveryProvider = await DeliveryProviders.findOneAndUpdate(
123
- generateDbFilterById(_id),
124
- {
125
- $set: {
126
- deleted: new Date(),
127
- },
128
- },
129
- { returnDocument: 'after' },
130
- );
131
- if (!deliveryProvider) return null;
132
- allProvidersCache.clear();
133
- await emit('DELIVERY_PROVIDER_REMOVE', { deliveryProvider });
134
- return deliveryProvider;
135
- },
136
- };
137
- };
138
-
139
- export type DeliveryModule = Awaited<ReturnType<typeof configureDeliveryModule>>;
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../shared/base.tsconfig.json",
3
- "compilerOptions": {
4
- "declarationDir": "./lib",
5
- "rootDir": "./src",
6
- "outDir": "./lib",
7
-
8
- },
9
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
10
- }