@unchainedshop/core-assortments 1.1.3 → 1.1.4

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 (63) hide show
  1. package/lib/assortments-index.d.ts +2 -0
  2. package/lib/assortments-index.js +3 -0
  3. package/lib/assortments-index.js.map +1 -0
  4. package/lib/assortments-settings.d.ts +9 -0
  5. package/lib/assortments-settings.js +17 -0
  6. package/lib/assortments-settings.js.map +1 -0
  7. package/lib/db/AssortmentMediasCollection.d.ts +6 -0
  8. package/lib/db/AssortmentMediasCollection.js +21 -0
  9. package/lib/db/AssortmentMediasCollection.js.map +1 -0
  10. package/lib/db/AssortmentMediasSchema.d.ts +2 -0
  11. package/lib/db/AssortmentMediasSchema.js +24 -0
  12. package/lib/db/AssortmentMediasSchema.js.map +1 -0
  13. package/lib/db/AssortmentsCollection.d.ts +10 -0
  14. package/lib/db/AssortmentsCollection.js +67 -0
  15. package/lib/db/AssortmentsCollection.js.map +1 -0
  16. package/lib/db/AssortmentsSchema.d.ts +5 -0
  17. package/lib/db/AssortmentsSchema.js +56 -0
  18. package/lib/db/AssortmentsSchema.js.map +1 -0
  19. package/lib/migrations/addMigrations.d.ts +3 -0
  20. package/lib/migrations/addMigrations.js +24 -0
  21. package/lib/migrations/addMigrations.js.map +1 -0
  22. package/lib/module/configureAssortmentFiltersModule.d.ts +5 -0
  23. package/lib/module/configureAssortmentFiltersModule.js +109 -0
  24. package/lib/module/configureAssortmentFiltersModule.js.map +1 -0
  25. package/lib/module/configureAssortmentLinksModule.d.ts +6 -0
  26. package/lib/module/configureAssortmentLinksModule.js +146 -0
  27. package/lib/module/configureAssortmentLinksModule.js.map +1 -0
  28. package/lib/module/configureAssortmentMediaModule.d.ts +3 -0
  29. package/lib/module/configureAssortmentMediaModule.js +166 -0
  30. package/lib/module/configureAssortmentMediaModule.js.map +1 -0
  31. package/lib/module/configureAssortmentProductsModule.d.ts +6 -0
  32. package/lib/module/configureAssortmentProductsModule.js +171 -0
  33. package/lib/module/configureAssortmentProductsModule.js.map +1 -0
  34. package/lib/module/configureAssortmentTextsModule.d.ts +6 -0
  35. package/lib/module/configureAssortmentTextsModule.js +116 -0
  36. package/lib/module/configureAssortmentTextsModule.js.map +1 -0
  37. package/lib/module/configureAssortmentsModule.d.ts +3 -0
  38. package/lib/module/configureAssortmentsModule.js +293 -0
  39. package/lib/module/configureAssortmentsModule.js.map +1 -0
  40. package/lib/product-cache/mongodb.d.ts +5 -0
  41. package/lib/product-cache/mongodb.js +31 -0
  42. package/lib/product-cache/mongodb.js.map +1 -0
  43. package/lib/utils/breadcrumbs/build-paths.d.ts +11 -0
  44. package/lib/utils/breadcrumbs/build-paths.js +46 -0
  45. package/lib/utils/breadcrumbs/build-paths.js.map +1 -0
  46. package/lib/utils/breadcrumbs/makeAssortmentBreadcrumbsBuilder.d.ts +8 -0
  47. package/lib/utils/breadcrumbs/makeAssortmentBreadcrumbsBuilder.js +16 -0
  48. package/lib/utils/breadcrumbs/makeAssortmentBreadcrumbsBuilder.js.map +1 -0
  49. package/lib/utils/breadcrumbs/resolveAssortmentLinkFromDatabase.d.ts +7 -0
  50. package/lib/utils/breadcrumbs/resolveAssortmentLinkFromDatabase.js +15 -0
  51. package/lib/utils/breadcrumbs/resolveAssortmentLinkFromDatabase.js.map +1 -0
  52. package/lib/utils/breadcrumbs/resolveAssortmentProductFromDatabase.d.ts +3 -0
  53. package/lib/utils/breadcrumbs/resolveAssortmentProductFromDatabase.js +10 -0
  54. package/lib/utils/breadcrumbs/resolveAssortmentProductFromDatabase.js.map +1 -0
  55. package/lib/utils/tree-zipper/zipTreeByDeepness.d.ts +3 -0
  56. package/lib/utils/tree-zipper/zipTreeByDeepness.js +46 -0
  57. package/lib/utils/tree-zipper/zipTreeByDeepness.js.map +1 -0
  58. package/lib/utils/tree-zipper/zipTreeBySimplyFlattening.d.ts +3 -0
  59. package/lib/utils/tree-zipper/zipTreeBySimplyFlattening.js +6 -0
  60. package/lib/utils/tree-zipper/zipTreeBySimplyFlattening.js.map +1 -0
  61. package/package.js +1 -1
  62. package/package.json +3 -2
  63. package/tests/assortments-index.test.ts +1 -1
@@ -0,0 +1,2 @@
1
+ export { configureAssortmentsModule } from './module/configureAssortmentsModule';
2
+ export { assortmentsSettings } from './assortments-settings';
@@ -0,0 +1,3 @@
1
+ export { configureAssortmentsModule } from './module/configureAssortmentsModule';
2
+ export { assortmentsSettings } from './assortments-settings';
3
+ //# sourceMappingURL=assortments-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assortments-index.js","sourceRoot":"","sources":["../src/assortments-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { AssortmentsSettingsOptions } from '@unchainedshop/types/assortments';
2
+ import { Db } from '@unchainedshop/types/common';
3
+ export declare const assortmentsSettings: {
4
+ zipTree: any;
5
+ slugify: any;
6
+ setCachedProductIds: any;
7
+ getCachedProductIds: any;
8
+ configureSettings: ({ setCachedProductIds, getCachedProductIds, zipTree, slugify, }: AssortmentsSettingsOptions, db: Db) => Promise<void>;
9
+ };
@@ -0,0 +1,17 @@
1
+ import { slugify as defaultSlugify } from '@unchainedshop/utils';
2
+ import zipTreeByDeepness from './utils/tree-zipper/zipTreeByDeepness';
3
+ import makeMongoDBCache from './product-cache/mongodb';
4
+ export const assortmentsSettings = {
5
+ zipTree: null,
6
+ slugify: null,
7
+ setCachedProductIds: null,
8
+ getCachedProductIds: null,
9
+ configureSettings: async ({ setCachedProductIds, getCachedProductIds, zipTree = zipTreeByDeepness, slugify = defaultSlugify, }, db) => {
10
+ const defaultCache = await makeMongoDBCache(db);
11
+ assortmentsSettings.zipTree = zipTree;
12
+ assortmentsSettings.slugify = slugify;
13
+ assortmentsSettings.setCachedProductIds = setCachedProductIds || defaultCache.setCachedProductIds;
14
+ assortmentsSettings.getCachedProductIds = getCachedProductIds || defaultCache.getCachedProductIds;
15
+ },
16
+ };
17
+ //# sourceMappingURL=assortments-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assortments-settings.js","sourceRoot":"","sources":["../src/assortments-settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,gBAAgB,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,iBAAiB,EAAE,KAAK,EACtB,EACE,mBAAmB,EACnB,mBAAmB,EACnB,OAAO,GAAG,iBAAiB,EAC3B,OAAO,GAAG,cAAc,GACG,EAC7B,EAAM,EACN,EAAE;QACF,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAChD,mBAAmB,CAAC,OAAO,GAAG,OAAO,CAAC;QACtC,mBAAmB,CAAC,OAAO,GAAG,OAAO,CAAC;QACtC,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,IAAI,YAAY,CAAC,mBAAmB,CAAC;QAClG,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,IAAI,YAAY,CAAC,mBAAmB,CAAC;IACpG,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { AssortmentMedia, AssortmentMediaText } from '@unchainedshop/types/assortments.media';
2
+ import { Db } from '@unchainedshop/types/common';
3
+ export declare const AssortmentMediaCollection: (db: Db) => Promise<{
4
+ AssortmentMedias: import("mongodb").Collection<AssortmentMedia>;
5
+ AssortmentMediaTexts: import("mongodb").Collection<AssortmentMediaText>;
6
+ }>;
@@ -0,0 +1,21 @@
1
+ import { buildDbIndexes } from '@unchainedshop/utils';
2
+ export const AssortmentMediaCollection = async (db) => {
3
+ const AssortmentMedias = db.collection('assortment_media');
4
+ const AssortmentMediaTexts = db.collection('assortment_media_texts');
5
+ // Assortment Indexes
6
+ await buildDbIndexes(AssortmentMedias, [
7
+ { index: { mediaId: 1 } },
8
+ { index: { assortmentId: 1 } },
9
+ { index: { tags: 1 } },
10
+ ]);
11
+ // AssortmentTexts indexes
12
+ await buildDbIndexes(AssortmentMediaTexts, [
13
+ { index: { assortmentMediaId: 1 } },
14
+ { index: { locale: 1 } },
15
+ ]);
16
+ return {
17
+ AssortmentMedias,
18
+ AssortmentMediaTexts,
19
+ };
20
+ };
21
+ //# sourceMappingURL=AssortmentMediasCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssortmentMediasCollection.js","sourceRoot":"","sources":["../../src/db/AssortmentMediasCollection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAAE,EAAM,EAAE,EAAE;IACxD,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAkB,kBAAkB,CAAC,CAAC;IAC5E,MAAM,oBAAoB,GAAG,EAAE,CAAC,UAAU,CAAsB,wBAAwB,CAAC,CAAC;IAE1F,qBAAqB;IACrB,MAAM,cAAc,CAAC,gBAAgB,EAAE;QACrC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;QACzB,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;QAC9B,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;KACvB,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,cAAc,CAAC,oBAAoB,EAAE;QACzC,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,EAAE;QACnC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;KACzB,CAAC,CAAC;IAEH,OAAO;QACL,gBAAgB;QAChB,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const AssortmentMediasSchema: any;
2
+ export const AssortmentMediaTextsSchema: any;
@@ -0,0 +1,24 @@
1
+ import { Schemas } from '@unchainedshop/utils';
2
+ import SimpleSchema from 'simpl-schema';
3
+ export const AssortmentMediasSchema = new SimpleSchema({
4
+ mediaId: { type: String, required: true },
5
+ assortmentId: { type: String, required: true },
6
+ sortKey: { type: Number, required: true },
7
+ tags: Array,
8
+ 'tags.$': String,
9
+ meta: { type: Object, blackbox: true },
10
+ authorId: { type: String, required: true },
11
+ ...Schemas.timestampFields,
12
+ }, { requiredByDefault: false });
13
+ export const AssortmentMediaTextsSchema = new SimpleSchema({
14
+ assortmentMediaId: {
15
+ type: String,
16
+ required: true,
17
+ },
18
+ locale: String,
19
+ authorId: { type: String, required: true },
20
+ title: String,
21
+ subtitle: String,
22
+ ...Schemas.timestampFields,
23
+ }, { requiredByDefault: false });
24
+ //# sourceMappingURL=AssortmentMediasSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssortmentMediasSchema.js","sourceRoot":"","sources":["../../src/db/AssortmentMediasSchema.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,YAAY,CACpD;IACE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzC,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzC,IAAI,EAAE,KAAK;IACX,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1C,GAAG,OAAO,CAAC,eAAe;CAC3B,EACD,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,YAAY,CACxD;IACE,iBAAiB,EAAE;QACjB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1C,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,MAAM;IAChB,GAAG,OAAO,CAAC,eAAe;CAC3B,EACD,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Db } from '@unchainedshop/types/common';
2
+ import { Assortment, AssortmentText, AssortmentProduct, AssortmentLink, AssortmentFilter, AssortmentProductIdCacheRecord } from '@unchainedshop/types/assortments';
3
+ export declare const AssortmentsCollection: (db: Db) => Promise<{
4
+ Assortments: import("mongodb").Collection<Assortment>;
5
+ AssortmentTexts: import("mongodb").Collection<AssortmentText>;
6
+ AssortmentProducts: import("mongodb").Collection<AssortmentProduct>;
7
+ AssortmentLinks: import("mongodb").Collection<AssortmentLink>;
8
+ AssortmentFilters: import("mongodb").Collection<AssortmentFilter>;
9
+ AssortmentProductIdCache: import("mongodb").Collection<AssortmentProductIdCacheRecord>;
10
+ }>;
@@ -0,0 +1,67 @@
1
+ import { buildDbIndexes } from '@unchainedshop/utils';
2
+ export const AssortmentsCollection = async (db) => {
3
+ const Assortments = db.collection('assortments');
4
+ const AssortmentTexts = db.collection('assortment_texts');
5
+ const AssortmentProducts = db.collection('assortment_products');
6
+ const AssortmentLinks = db.collection('assortment_links');
7
+ const AssortmentFilters = db.collection('assortment_filters');
8
+ const AssortmentProductIdCache = db.collection('assortment_productId_cache');
9
+ // Assortment Indexes
10
+ await buildDbIndexes(Assortments, [
11
+ { index: { isActive: 1 } },
12
+ { index: { isRoot: 1 } },
13
+ { index: { sequence: 1 } },
14
+ { index: { slugs: 1 } },
15
+ { index: { tags: 1 } },
16
+ {
17
+ index: { slugs: 'text' },
18
+ options: {
19
+ name: 'assortments_fulltext_search',
20
+ },
21
+ },
22
+ ]);
23
+ // AssortmentTexts indexes
24
+ await buildDbIndexes(AssortmentTexts, [
25
+ { index: { assortmentId: 1 } },
26
+ { index: { locale: 1 } },
27
+ { index: { slug: 1 } },
28
+ { index: { locale: 1, assortmentId: 1 } },
29
+ {
30
+ index: { title: 'text', subtitle: 'text' },
31
+ options: {
32
+ weights: {
33
+ title: 8,
34
+ subtitle: 6,
35
+ },
36
+ name: 'assortments_texts_fulltext_search',
37
+ },
38
+ },
39
+ ]);
40
+ // AssortmentProducts indexes
41
+ await buildDbIndexes(AssortmentProducts, [
42
+ { index: { assortmentId: 1 } },
43
+ { index: { productId: 1 } },
44
+ { index: { tags: 1 } },
45
+ ]);
46
+ // AssortmentLinks indices
47
+ await buildDbIndexes(AssortmentLinks, [
48
+ { index: { parentAssortmentId: 1 } },
49
+ { index: { childAssortmentId: 1 } },
50
+ { index: { tags: 1 } },
51
+ ]);
52
+ // AssortmentFilter indices
53
+ await buildDbIndexes(AssortmentFilters, [
54
+ { index: { assortmentId: 1 } },
55
+ { index: { filterId: 1 } },
56
+ { index: { tags: 1 } },
57
+ ]);
58
+ return {
59
+ Assortments,
60
+ AssortmentTexts,
61
+ AssortmentProducts,
62
+ AssortmentLinks,
63
+ AssortmentFilters,
64
+ AssortmentProductIdCache,
65
+ };
66
+ };
67
+ //# sourceMappingURL=AssortmentsCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssortmentsCollection.js","sourceRoot":"","sources":["../../src/db/AssortmentsCollection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export const AssortmentsSchema: any;
2
+ export const AssortmentTextsSchema: any;
3
+ export const AssortmentProductsSchema: any;
4
+ export const AssortmentLinksSchema: any;
5
+ export const AssortmentFiltersSchema: any;
@@ -0,0 +1,56 @@
1
+ import { Schemas } from '@unchainedshop/utils';
2
+ import SimpleSchema from 'simpl-schema';
3
+ export const AssortmentsSchema = new SimpleSchema({
4
+ authorId: { type: String, required: true },
5
+ isActive: Boolean,
6
+ isBase: Boolean,
7
+ isRoot: Boolean,
8
+ meta: { type: Object, blackbox: true },
9
+ sequence: { type: Number, required: true },
10
+ slugs: Array,
11
+ 'slugs.$': String,
12
+ tags: Array,
13
+ 'tags.$': String,
14
+ ...Schemas.timestampFields,
15
+ }, { requiredByDefault: false });
16
+ export const AssortmentTextsSchema = new SimpleSchema({
17
+ assortmentId: { type: String, required: true },
18
+ authorId: { type: String, required: true },
19
+ description: String,
20
+ locale: { type: String, required: true },
21
+ slug: String,
22
+ subtitle: String,
23
+ title: String,
24
+ ...Schemas.timestampFields,
25
+ }, { requiredByDefault: false });
26
+ export const AssortmentProductsSchema = new SimpleSchema({
27
+ assortmentId: { type: String, required: true },
28
+ authorId: { type: String, required: true },
29
+ meta: { type: Object, blackbox: true },
30
+ productId: { type: String, required: true },
31
+ sortKey: { type: Number, required: true },
32
+ tags: Array,
33
+ 'tags.$': String,
34
+ ...Schemas.timestampFields,
35
+ }, { requiredByDefault: false });
36
+ export const AssortmentLinksSchema = new SimpleSchema({
37
+ authorId: { type: String, required: true },
38
+ childAssortmentId: { type: String, required: true },
39
+ meta: { type: Object, blackbox: true },
40
+ parentAssortmentId: { type: String, required: true },
41
+ sortKey: { type: Number, required: true },
42
+ tags: Array,
43
+ 'tags.$': String,
44
+ ...Schemas.timestampFields,
45
+ }, { requiredByDefault: false });
46
+ export const AssortmentFiltersSchema = new SimpleSchema({
47
+ assortmentId: { type: String, required: true },
48
+ authorId: { type: String, required: true },
49
+ filterId: { type: String, required: true },
50
+ meta: { type: Object, blackbox: true },
51
+ sortKey: { type: Number, required: true },
52
+ tags: Array,
53
+ 'tags.$': String,
54
+ ...Schemas.timestampFields,
55
+ }, { requiredByDefault: false });
56
+ //# sourceMappingURL=AssortmentsSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssortmentsSchema.js","sourceRoot":"","sources":["../../src/db/AssortmentsSchema.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Migration } from '@unchainedshop/types/api';
2
+ import { MigrationRepository } from '@unchainedshop/types/common';
3
+ export default function addMigrations(repository: MigrationRepository<Migration>): void;
@@ -0,0 +1,24 @@
1
+ import { AssortmentsCollection } from '../db/AssortmentsCollection';
2
+ export default function addMigrations(repository) {
3
+ repository?.register({
4
+ id: 20220216000000,
5
+ name: 'Move _cachedProductIds cache to own collection in order to save a lot of bandwidth',
6
+ up: async () => {
7
+ const { Assortments, AssortmentProductIdCache } = await AssortmentsCollection(repository.db);
8
+ const assortments = await Assortments.find({}, { projection: { _id: true, _cachedProductIds: true } }).toArray();
9
+ await Promise.all(assortments.map(async (assortment) => {
10
+ await AssortmentProductIdCache.updateOne({
11
+ _id: assortment._id,
12
+ }, {
13
+ $set: { productIds: assortment._cachedProductIds }, // eslint-disable-line
14
+ }, {
15
+ upsert: true,
16
+ });
17
+ }));
18
+ await Assortments.updateMany({}, {
19
+ $unset: { _cachedProductIds: 1 },
20
+ });
21
+ },
22
+ });
23
+ }
24
+ //# sourceMappingURL=addMigrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMigrations.js","sourceRoot":"","sources":["../../src/migrations/addMigrations.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,UAA0C;IAC9E,UAAU,EAAE,QAAQ,CAAC;QACnB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,oFAAoF;QAC1F,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7F,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,CACxC,EAAE,EACF,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,CACvD,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,OAAO,CAAC,GAAG,CACf,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBACnC,MAAM,wBAAwB,CAAC,SAAS,CACtC;oBACE,GAAG,EAAE,UAAU,CAAC,GAAU;iBAC3B,EACD;oBACE,IAAI,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,iBAAiB,EAAE,EAAE,sBAAsB;iBAC3E,EACD;oBACE,MAAM,EAAE,IAAI;iBACb,CACF,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,WAAW,CAAC,UAAU,CAC1B,EAAE,EACF;gBACE,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE;aACjC,CACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { AssortmentFilter, AssortmentsModule } from '@unchainedshop/types/assortments';
2
+ import { Collection } from '@unchainedshop/types/common';
3
+ export declare const configureAssortmentFiltersModule: ({ AssortmentFilters, }: {
4
+ AssortmentFilters: Collection<AssortmentFilter>;
5
+ }) => AssortmentsModule['filters'];
@@ -0,0 +1,109 @@
1
+ import { emit, registerEvents } from '@unchainedshop/events';
2
+ import { generateDbFilterById, generateDbObjectId } from '@unchainedshop/utils';
3
+ const ASSORTMENT_FILTER_EVENTS = [
4
+ 'ASSORTMENT_ADD_FILTER',
5
+ 'ASSORTMENT_REMOVE_FILTER',
6
+ 'ASSORTMENT_REORDER_FILTERS',
7
+ ];
8
+ export const configureAssortmentFiltersModule = ({ AssortmentFilters, }) => {
9
+ registerEvents(ASSORTMENT_FILTER_EVENTS);
10
+ return {
11
+ findFilter: async ({ assortmentFilterId }) => {
12
+ return AssortmentFilters.findOne(generateDbFilterById(assortmentFilterId), {});
13
+ },
14
+ findFilters: async ({ assortmentId }, options) => {
15
+ const filters = AssortmentFilters.find({ assortmentId }, options);
16
+ return filters.toArray();
17
+ },
18
+ findFilterIds: async ({ assortmentId }) => {
19
+ const filters = AssortmentFilters.find({ assortmentId }, {
20
+ sort: { sortKey: 1 },
21
+ projection: { filterId: 1 },
22
+ }).map((filter) => filter.filterId);
23
+ return filters.toArray();
24
+ },
25
+ create: async (doc, userId) => {
26
+ const { _id, assortmentId, filterId, sortKey, ...rest } = doc;
27
+ const selector = {
28
+ ...(_id ? generateDbFilterById(_id) : {}),
29
+ filterId,
30
+ assortmentId,
31
+ };
32
+ const $set = {
33
+ updated: new Date(),
34
+ updatedBy: userId,
35
+ ...rest,
36
+ };
37
+ const $setOnInsert = {
38
+ _id: _id || generateDbObjectId(),
39
+ filterId,
40
+ assortmentId,
41
+ created: new Date(),
42
+ createdBy: userId,
43
+ };
44
+ if (!doc.sortKey) {
45
+ // Get next sort key
46
+ const lastAssortmentFilter = (await AssortmentFilters.findOne({ assortmentId }, { sort: { sortKey: -1 } })) || { sortKey: 0 };
47
+ $setOnInsert.sortKey = lastAssortmentFilter.sortKey + 1;
48
+ }
49
+ else {
50
+ $set.sortKey = sortKey;
51
+ }
52
+ await AssortmentFilters.updateOne(selector, {
53
+ $set,
54
+ $setOnInsert,
55
+ }, { upsert: true });
56
+ const assortmentFilter = await AssortmentFilters.findOne(selector, {});
57
+ emit('ASSORTMENT_ADD_FILTER', { assortmentFilter });
58
+ return assortmentFilter;
59
+ },
60
+ delete: async (assortmentFilterId) => {
61
+ const selector = generateDbFilterById(assortmentFilterId);
62
+ const assortmentFilter = await AssortmentFilters.findOne(selector, {
63
+ projection: { _id: 1 },
64
+ });
65
+ await AssortmentFilters.deleteOne(selector);
66
+ emit('ASSORTMENT_REMOVE_FILTER', {
67
+ assortmentFilterId: assortmentFilter._id,
68
+ });
69
+ return [assortmentFilter];
70
+ },
71
+ deleteMany: async (selector) => {
72
+ const assortmentFilters = await AssortmentFilters.find(selector, {
73
+ projection: { _id: 1 },
74
+ }).toArray();
75
+ await AssortmentFilters.deleteMany(selector);
76
+ assortmentFilters.forEach((assortmentFilter) => {
77
+ emit('ASSORTMENT_REMOVE_FILTER', {
78
+ assortmentFilterId: assortmentFilter._id,
79
+ });
80
+ });
81
+ return assortmentFilters;
82
+ },
83
+ // This action is specifically used for the bulk migration scripts in the platform package
84
+ update: async (assortmentFilterId, doc) => {
85
+ const selector = generateDbFilterById(assortmentFilterId);
86
+ const modifier = { $set: doc };
87
+ await AssortmentFilters.updateOne(selector, modifier);
88
+ return AssortmentFilters.findOne(selector, {});
89
+ },
90
+ updateManualOrder: async ({ sortKeys }, userId) => {
91
+ const changedAssortmentFilterIds = await Promise.all(sortKeys.map(async ({ assortmentFilterId, sortKey }) => {
92
+ await AssortmentFilters.updateOne(generateDbFilterById(assortmentFilterId), {
93
+ $set: {
94
+ sortKey: sortKey + 1,
95
+ updated: new Date(),
96
+ updatedBy: userId,
97
+ },
98
+ });
99
+ return assortmentFilterId;
100
+ }));
101
+ const assortmentFilters = await AssortmentFilters.find({
102
+ _id: { $in: changedAssortmentFilterIds },
103
+ }).toArray();
104
+ emit('ASSORTMENT_REORDER_FILTERS', { assortmentFilters });
105
+ return assortmentFilters;
106
+ },
107
+ };
108
+ };
109
+ //# sourceMappingURL=configureAssortmentFiltersModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureAssortmentFiltersModule.js","sourceRoot":"","sources":["../../src/module/configureAssortmentFiltersModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AssortmentLink, AssortmentsModule } from '@unchainedshop/types/assortments';
2
+ import { Collection } from '@unchainedshop/types/common';
3
+ export declare const configureAssortmentLinksModule: ({ AssortmentLinks, invalidateCache, }: {
4
+ AssortmentLinks: Collection<AssortmentLink>;
5
+ invalidateCache: AssortmentsModule['invalidateCache'];
6
+ }) => AssortmentsModule['links'];
@@ -0,0 +1,146 @@
1
+ import { emit, registerEvents } from '@unchainedshop/events';
2
+ import { generateDbFilterById, generateDbObjectId } from '@unchainedshop/utils';
3
+ const ASSORTMENT_LINK_EVENTS = [
4
+ 'ASSORTMENT_ADD_LINK',
5
+ 'ASSORTMENT_REMOVE_LINK',
6
+ 'ASSORTMENT_REORDER_LINKS',
7
+ ];
8
+ export const configureAssortmentLinksModule = ({ AssortmentLinks, invalidateCache, }) => {
9
+ registerEvents(ASSORTMENT_LINK_EVENTS);
10
+ return {
11
+ // Queries
12
+ findLink: async ({ assortmentLinkId, parentAssortmentId, childAssortmentId }) => {
13
+ return AssortmentLinks.findOne(assortmentLinkId
14
+ ? generateDbFilterById(assortmentLinkId)
15
+ : { parentAssortmentId, childAssortmentId }, {});
16
+ },
17
+ findLinks: async ({ assortmentId, parentAssortmentId }, options) => {
18
+ const selector = parentAssortmentId
19
+ ? {
20
+ parentAssortmentId,
21
+ }
22
+ : {
23
+ $or: [{ parentAssortmentId: assortmentId }, { childAssortmentId: assortmentId }],
24
+ };
25
+ const links = AssortmentLinks.find(selector, options || {
26
+ sort: { sortKey: 1 },
27
+ });
28
+ return links.toArray();
29
+ },
30
+ // Mutations
31
+ create: async (doc, options, userId) => {
32
+ const { _id: assortmentLinkId, parentAssortmentId, childAssortmentId, sortKey, ...rest } = doc;
33
+ const selector = {
34
+ ...(assortmentLinkId ? generateDbFilterById(assortmentLinkId) : {}),
35
+ parentAssortmentId,
36
+ childAssortmentId,
37
+ };
38
+ const $set = {
39
+ updated: new Date(),
40
+ updatedBy: userId,
41
+ ...rest,
42
+ };
43
+ const $setOnInsert = {
44
+ _id: assortmentLinkId || generateDbObjectId(),
45
+ parentAssortmentId,
46
+ childAssortmentId,
47
+ created: new Date(),
48
+ createdBy: userId,
49
+ };
50
+ if (!sortKey) {
51
+ // Get next sort key
52
+ const lastAssortmentLink = (await AssortmentLinks.findOne({ parentAssortmentId }, { sort: { sortKey: -1 } })) || { sortKey: 0 };
53
+ $setOnInsert.sortKey = lastAssortmentLink.sortKey + 1;
54
+ }
55
+ else {
56
+ $set.sortKey = sortKey;
57
+ }
58
+ await AssortmentLinks.updateOne(selector, {
59
+ $set,
60
+ $setOnInsert,
61
+ }, {
62
+ upsert: true,
63
+ });
64
+ const assortmentLink = await AssortmentLinks.findOne(selector, {});
65
+ emit('ASSORTMENT_ADD_LINK', { assortmentLink });
66
+ if (!options.skipInvalidation) {
67
+ await invalidateCache({ assortmentIds: [parentAssortmentId] });
68
+ }
69
+ return assortmentLink;
70
+ },
71
+ // This action is specifically used for the bulk migration scripts in the platform package
72
+ update: async (assortmentLinkId, doc, options, userId) => {
73
+ const selector = generateDbFilterById(assortmentLinkId);
74
+ const modifier = {
75
+ $set: {
76
+ ...doc,
77
+ updated: new Date(),
78
+ updatedBy: userId,
79
+ },
80
+ };
81
+ await AssortmentLinks.updateOne(selector, modifier);
82
+ const assortmentLink = await AssortmentLinks.findOne(selector, {});
83
+ if (!options.skipInvalidation) {
84
+ await invalidateCache({ assortmentIds: [assortmentLink.childAssortmentId] }, {
85
+ skipUpstreamTraversal: false,
86
+ });
87
+ }
88
+ return assortmentLink;
89
+ },
90
+ delete: async (assortmentLinkId, options) => {
91
+ const selector = generateDbFilterById(assortmentLinkId);
92
+ const assortmentLink = await AssortmentLinks.findOne(selector, {});
93
+ await AssortmentLinks.deleteOne(selector);
94
+ emit('ASSORTMENT_REMOVE_LINK', {
95
+ assortmentLinkId: assortmentLink._id,
96
+ });
97
+ if (!options.skipInvalidation) {
98
+ await invalidateCache({
99
+ assortmentIds: [assortmentLink.childAssortmentId, assortmentLink.parentAssortmentId],
100
+ }, { skipUpstreamTraversal: false });
101
+ }
102
+ return assortmentLink;
103
+ },
104
+ deleteMany: async (selector, options) => {
105
+ const assortmentLinks = await AssortmentLinks.find(selector, {}).toArray();
106
+ await AssortmentLinks.deleteMany(selector);
107
+ assortmentLinks.forEach((assortmentLink) => {
108
+ emit('ASSORTMENT_REMOVE_LINK', {
109
+ assortmentLinkId: assortmentLink._id,
110
+ });
111
+ });
112
+ if (!options.skipInvalidation && assortmentLinks.length) {
113
+ await invalidateCache({
114
+ assortmentIds: assortmentLinks.flatMap((link) => [
115
+ link.childAssortmentId,
116
+ link.parentAssortmentId,
117
+ ]),
118
+ }, { skipUpstreamTraversal: false });
119
+ }
120
+ return assortmentLinks;
121
+ },
122
+ updateManualOrder: async ({ sortKeys }, options, userId) => {
123
+ const changedAssortmentLinkIds = await Promise.all(sortKeys.map(async ({ assortmentLinkId, sortKey }) => {
124
+ await AssortmentLinks.updateOne(generateDbFilterById(assortmentLinkId), {
125
+ $set: {
126
+ sortKey: sortKey + 1,
127
+ updated: new Date(),
128
+ updatedBy: userId,
129
+ },
130
+ });
131
+ return assortmentLinkId;
132
+ }));
133
+ const assortmentLinks = await AssortmentLinks.find({
134
+ _id: { $in: changedAssortmentLinkIds },
135
+ }).toArray();
136
+ if (!options.skipInvalidation && assortmentLinks.length) {
137
+ await invalidateCache({ assortmentIds: assortmentLinks.map((link) => link.childAssortmentId) }, {
138
+ skipUpstreamTraversal: false,
139
+ });
140
+ }
141
+ emit('ASSORTMENT_REORDER_LINKS', { assortmentLinks });
142
+ return assortmentLinks;
143
+ },
144
+ };
145
+ };
146
+ //# sourceMappingURL=configureAssortmentLinksModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureAssortmentLinksModule.js","sourceRoot":"","sources":["../../src/module/configureAssortmentLinksModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,sBAAsB,GAAG;IAC7B,qBAAqB;IACrB,wBAAwB;IACxB,0BAA0B;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,EAC7C,eAAe,EACf,eAAe,GAIhB,EAA8B,EAAE;IAC/B,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAEvC,OAAO;QACL,UAAU;QACV,QAAQ,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,EAAE,EAAE;YAC9E,OAAO,eAAe,CAAC,OAAO,CAC5B,gBAAgB;gBACd,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;gBACxC,CAAC,CAAC,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,EAC7C,EAAE,CACH,CAAC;QACJ,CAAC;QAED,SAAS,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,EAAE;YACjE,MAAM,QAAQ,GAAG,kBAAkB;gBACjC,CAAC,CAAC;oBACA,kBAAkB;iBACnB;gBACD,CAAC,CAAC;oBACA,GAAG,EAAE,CAAC,EAAE,kBAAkB,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;iBACjF,CAAC;YAEJ,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAChC,QAAQ,EACR,OAAO,IAAI;gBACT,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;aACrB,CACF,CAAC;YAEF,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAED,YAAY;QACZ,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;YAE/F,MAAM,QAAQ,GAAG;gBACf,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,kBAAkB;gBAClB,iBAAiB;aAClB,CAAC;YAEF,MAAM,IAAI,GAAQ;gBAChB,OAAO,EAAE,IAAI,IAAI,EAAE;gBACnB,SAAS,EAAE,MAAM;gBACjB,GAAG,IAAI;aACR,CAAC;YACF,MAAM,YAAY,GAAQ;gBACxB,GAAG,EAAE,gBAAgB,IAAI,kBAAkB,EAAE;gBAC7C,kBAAkB;gBAClB,iBAAiB;gBACjB,OAAO,EAAE,IAAI,IAAI,EAAE;gBACnB,SAAS,EAAE,MAAM;aAClB,CAAC;YAEF,IAAI,CAAC,OAAO,EAAE;gBACZ,oBAAoB;gBACpB,MAAM,kBAAkB,GAAG,CAAC,MAAM,eAAe,CAAC,OAAO,CACvD,EAAE,kBAAkB,EAAE,EACtB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAC1B,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gBACrB,YAAY,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,GAAG,CAAC,CAAC;aACvD;iBAAM;gBACL,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;aACxB;YAED,MAAM,eAAe,CAAC,SAAS,CAC7B,QAAQ,EACR;gBACE,IAAI;gBACJ,YAAY;aACb,EACD;gBACE,MAAM,EAAE,IAAI;aACb,CACF,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAEnE,IAAI,CAAC,qBAAqB,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAEhD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC7B,MAAM,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;aAChE;YAED,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,0FAA0F;QAC1F,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,GAAG,GAAG;oBACN,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,SAAS,EAAE,MAAM;iBAClB;aACF,CAAC;YACF,MAAM,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEpD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC7B,MAAM,eAAe,CACnB,EAAE,aAAa,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,EACrD;oBACE,qBAAqB,EAAE,KAAK;iBAC7B,CACF,CAAC;aACH;YACD,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE;YAC1C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;YAExD,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAEnE,MAAM,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE1C,IAAI,CAAC,wBAAwB,EAAE;gBAC7B,gBAAgB,EAAE,cAAc,CAAC,GAAG;aACrC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC7B,MAAM,eAAe,CACnB;oBACE,aAAa,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,cAAc,CAAC,kBAAkB,CAAC;iBACrF,EACD,EAAE,qBAAqB,EAAE,KAAK,EAAE,CACjC,CAAC;aACH;YAED,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACtC,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAE3E,MAAM,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC3C,eAAe,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;gBACzC,IAAI,CAAC,wBAAwB,EAAE;oBAC7B,gBAAgB,EAAE,cAAc,CAAC,GAAG;iBACrC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,eAAe,CAAC,MAAM,EAAE;gBACvD,MAAM,eAAe,CACnB;oBACE,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC/C,IAAI,CAAC,iBAAiB;wBACtB,IAAI,CAAC,kBAAkB;qBACxB,CAAC;iBACH,EACD,EAAE,qBAAqB,EAAE,KAAK,EAAE,CACjC,CAAC;aACH;YAED,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,iBAAiB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,GAAG,CAChD,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE;gBACnD,MAAM,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,EAAE;oBACtE,IAAI,EAAE;wBACJ,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,OAAO,EAAE,IAAI,IAAI,EAAE;wBACnB,SAAS,EAAE,MAAM;qBAClB;iBACF,CAAC,CAAC;gBAEH,OAAO,gBAAgB,CAAC;YAC1B,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC;gBACjD,GAAG,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE;aACvC,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,eAAe,CAAC,MAAM,EAAE;gBACvD,MAAM,eAAe,CACnB,EAAE,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EACxE;oBACE,qBAAqB,EAAE,KAAK;iBAC7B,CACF,CAAC;aACH;YAED,IAAI,CAAC,0BAA0B,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YAEtD,OAAO,eAAe,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { AssortmentMediaModule } from '@unchainedshop/types/assortments.media';
2
+ import { ModuleInput } from '@unchainedshop/types/common';
3
+ export declare const configureAssortmentMediaModule: ({ db, }: ModuleInput<Record<string, never>>) => Promise<AssortmentMediaModule>;