medusa-product-helper 0.0.13 → 0.0.18
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/.medusa/server/src/admin/index.js +59 -117
- package/.medusa/server/src/admin/index.mjs +59 -117
- package/.medusa/server/src/api/store/product-helper/products/route.js +112 -0
- package/.medusa/server/src/api/store/product-helper/products/validators.js +3 -1
- package/.medusa/server/src/config/product-helper-options.js +15 -1
- package/.medusa/server/src/index.js +101 -0
- package/.medusa/server/src/providers/filter-providers/availability-provider.js +82 -0
- package/.medusa/server/src/providers/filter-providers/base-filter-provider.js +14 -0
- package/.medusa/server/src/providers/filter-providers/base-product-provider.js +59 -0
- package/.medusa/server/src/providers/filter-providers/category-provider.js +36 -0
- package/.medusa/server/src/providers/filter-providers/collection-provider.js +36 -0
- package/.medusa/server/src/providers/filter-providers/index.js +58 -0
- package/.medusa/server/src/providers/filter-providers/metadata-provider.js +69 -0
- package/.medusa/server/src/providers/filter-providers/price-range-provider.js +95 -0
- package/.medusa/server/src/providers/filter-providers/promotion-provider.js +134 -0
- package/.medusa/server/src/providers/filter-providers/promotion-window-provider.js +85 -0
- package/.medusa/server/src/providers/filter-providers/rating-provider.js +69 -0
- package/.medusa/server/src/services/dynamic-filter-service.js +525 -0
- package/.medusa/server/src/services/filter-provider-loader.js +107 -0
- package/.medusa/server/src/services/filter-provider-registry.js +43 -0
- package/.medusa/server/src/services/product-filter-service.js +183 -0
- package/.medusa/server/src/shared/product-metadata/utils.js +66 -116
- package/.medusa/server/src/utils/query-builders/product-filters.js +89 -111
- package/.medusa/server/src/utils/query-parser.js +51 -0
- package/.medusa/server/src/workflows/add-to-wishlist.js +12 -26
- package/.medusa/server/src/workflows/get-wishlist.js +53 -51
- package/.medusa/server/src/workflows/remove-from-wishlist.js +3 -8
- package/README.md +89 -0
- package/package.json +3 -3
|
@@ -82,6 +82,13 @@ const RatingSchema = zod_1.z.object({
|
|
|
82
82
|
max: zod_1.z.number({ coerce: true }).min(0).max(5).default(5),
|
|
83
83
|
require_reviews: zod_1.z.boolean().default(false),
|
|
84
84
|
});
|
|
85
|
+
const FilterProviderConfigSchema = zod_1.z.union([
|
|
86
|
+
zod_1.z.string(), // File path or module name
|
|
87
|
+
zod_1.z.object({
|
|
88
|
+
path: zod_1.z.string(),
|
|
89
|
+
options: zod_1.z.record(zod_1.z.unknown()).optional(),
|
|
90
|
+
}),
|
|
91
|
+
]);
|
|
85
92
|
const ProductHelperOptionsSchema = zod_1.z.object({
|
|
86
93
|
metadata: MetadataSchema.default({
|
|
87
94
|
products: {
|
|
@@ -115,6 +122,11 @@ const ProductHelperOptionsSchema = zod_1.z.object({
|
|
|
115
122
|
max: 5,
|
|
116
123
|
require_reviews: false,
|
|
117
124
|
}),
|
|
125
|
+
filterProviders: zod_1.z
|
|
126
|
+
.array(FilterProviderConfigSchema)
|
|
127
|
+
.optional()
|
|
128
|
+
.default([]),
|
|
129
|
+
disableBuiltInProviders: zod_1.z.array(zod_1.z.string()).optional().default([]),
|
|
118
130
|
});
|
|
119
131
|
exports.DEFAULT_PRODUCT_HELPER_OPTIONS = normalizeProductHelperOptions({});
|
|
120
132
|
const PLUGIN_NAME = "medusa-product-helper";
|
|
@@ -132,6 +144,8 @@ function normalizeProductHelperOptions(input) {
|
|
|
132
144
|
descriptors: (0, utils_2.normalizeMetadataDescriptors)(parsed.metadata.categories.descriptors),
|
|
133
145
|
},
|
|
134
146
|
},
|
|
147
|
+
filterProviders: parsed.filterProviders ?? [],
|
|
148
|
+
disableBuiltInProviders: parsed.disableBuiltInProviders ?? [],
|
|
135
149
|
};
|
|
136
150
|
}
|
|
137
151
|
function resolveProductHelperOptions(configModule) {
|
|
@@ -149,4 +163,4 @@ function resolveProductHelperOptions(configModule) {
|
|
|
149
163
|
}
|
|
150
164
|
return exports.DEFAULT_PRODUCT_HELPER_OPTIONS;
|
|
151
165
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1oZWxwZXItb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb25maWcvcHJvZHVjdC1oZWxwZXItb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzTEEsc0VBd0JDO0FBRUQsa0VBbUJDO0FBbk9ELHFEQUFvRDtBQUNwRCw2QkFBdUI7QUFFdkIsNERBR3lDO0FBQ3pDLDREQUErRTtBQUUvRSxNQUFNLGdCQUFnQixHQUFHLE9BQUM7S0FDdkIsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDbEQsYUFBYSxFQUFFLE9BQUM7U0FDYixNQUFNLEVBQUU7U0FDUixJQUFJLEVBQUU7U0FDTixNQUFNLENBQUMsQ0FBQyxFQUFFLG1DQUFtQyxDQUFDO1NBQzlDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3pDLFFBQVEsRUFBRTtJQUNiLEdBQUcsRUFBRSxPQUFDO1NBQ0gsTUFBTSxDQUFDO1FBQ04sTUFBTSxFQUFFLElBQUk7UUFDWixrQkFBa0IsRUFBRSw0QkFBNEI7S0FDakQsQ0FBQztTQUNELFdBQVcsRUFBRTtTQUNiLFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDaEIsR0FBRyxFQUFFLE9BQUM7U0FDSCxNQUFNLENBQUM7UUFDTixNQUFNLEVBQUUsSUFBSTtRQUNaLGtCQUFrQixFQUFFLDRCQUE0QjtLQUNqRCxDQUFDO1NBQ0QsV0FBVyxFQUFFO1NBQ2IsUUFBUSxFQUFFO1NBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQztDQUNqQixDQUFDO0tBQ0QsTUFBTSxDQUNMLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixLQUFL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
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Medusa Product Helper Plugin Entry Point
|
|
4
|
+
*
|
|
5
|
+
* This file exports all plugin resources including modules, helpers, workflows,
|
|
6
|
+
* and filter provider infrastructure.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DYNAMIC_FILTER_SERVICE = exports.FILTER_PROVIDER_REGISTRY = exports.DEFAULT_PRODUCT_HELPER_OPTIONS = exports.normalizeProductHelperOptions = exports.resolveProductHelperOptions = exports.BUILT_IN_PROVIDERS = exports.getBuiltInProviderIdentifiers = exports.registerBuiltInProviders = exports.BaseProductFilterProvider = exports.RatingFilterProvider = exports.AvailabilityFilterProvider = exports.PromotionFilterProvider = exports.PromotionWindowFilterProvider = exports.PriceRangeFilterProvider = exports.MetadataFilterProvider = exports.CollectionFilterProvider = exports.CategoryFilterProvider = exports.BaseFilterProvider = exports.loadFilterProviders = exports.ProductFilterService = exports.DynamicFilterService = exports.FilterProviderRegistry = exports.WISHLIST_MODULE = exports.WishlistModule = void 0;
|
|
13
|
+
exports.initializeFilterProviders = initializeFilterProviders;
|
|
14
|
+
// Export modules
|
|
15
|
+
var wishlist_1 = require("./modules/wishlist");
|
|
16
|
+
Object.defineProperty(exports, "WishlistModule", { enumerable: true, get: function () { return __importDefault(wishlist_1).default; } });
|
|
17
|
+
var wishlist_2 = require("./modules/wishlist");
|
|
18
|
+
Object.defineProperty(exports, "WISHLIST_MODULE", { enumerable: true, get: function () { return wishlist_2.WISHLIST_MODULE; } });
|
|
19
|
+
// Export filter provider infrastructure
|
|
20
|
+
var filter_provider_registry_1 = require("./services/filter-provider-registry");
|
|
21
|
+
Object.defineProperty(exports, "FilterProviderRegistry", { enumerable: true, get: function () { return filter_provider_registry_1.FilterProviderRegistry; } });
|
|
22
|
+
var dynamic_filter_service_1 = require("./services/dynamic-filter-service");
|
|
23
|
+
Object.defineProperty(exports, "DynamicFilterService", { enumerable: true, get: function () { return dynamic_filter_service_1.DynamicFilterService; } });
|
|
24
|
+
var product_filter_service_1 = require("./services/product-filter-service");
|
|
25
|
+
Object.defineProperty(exports, "ProductFilterService", { enumerable: true, get: function () { return product_filter_service_1.ProductFilterService; } });
|
|
26
|
+
var filter_provider_loader_1 = require("./services/filter-provider-loader");
|
|
27
|
+
Object.defineProperty(exports, "loadFilterProviders", { enumerable: true, get: function () { return filter_provider_loader_1.loadFilterProviders; } });
|
|
28
|
+
// Export filter providers
|
|
29
|
+
var filter_providers_1 = require("./providers/filter-providers");
|
|
30
|
+
Object.defineProperty(exports, "BaseFilterProvider", { enumerable: true, get: function () { return filter_providers_1.BaseFilterProvider; } });
|
|
31
|
+
Object.defineProperty(exports, "CategoryFilterProvider", { enumerable: true, get: function () { return filter_providers_1.CategoryFilterProvider; } });
|
|
32
|
+
Object.defineProperty(exports, "CollectionFilterProvider", { enumerable: true, get: function () { return filter_providers_1.CollectionFilterProvider; } });
|
|
33
|
+
Object.defineProperty(exports, "MetadataFilterProvider", { enumerable: true, get: function () { return filter_providers_1.MetadataFilterProvider; } });
|
|
34
|
+
Object.defineProperty(exports, "PriceRangeFilterProvider", { enumerable: true, get: function () { return filter_providers_1.PriceRangeFilterProvider; } });
|
|
35
|
+
Object.defineProperty(exports, "PromotionWindowFilterProvider", { enumerable: true, get: function () { return filter_providers_1.PromotionWindowFilterProvider; } });
|
|
36
|
+
Object.defineProperty(exports, "PromotionFilterProvider", { enumerable: true, get: function () { return filter_providers_1.PromotionFilterProvider; } });
|
|
37
|
+
Object.defineProperty(exports, "AvailabilityFilterProvider", { enumerable: true, get: function () { return filter_providers_1.AvailabilityFilterProvider; } });
|
|
38
|
+
Object.defineProperty(exports, "RatingFilterProvider", { enumerable: true, get: function () { return filter_providers_1.RatingFilterProvider; } });
|
|
39
|
+
Object.defineProperty(exports, "BaseProductFilterProvider", { enumerable: true, get: function () { return filter_providers_1.BaseProductFilterProvider; } });
|
|
40
|
+
Object.defineProperty(exports, "registerBuiltInProviders", { enumerable: true, get: function () { return filter_providers_1.registerBuiltInProviders; } });
|
|
41
|
+
Object.defineProperty(exports, "getBuiltInProviderIdentifiers", { enumerable: true, get: function () { return filter_providers_1.getBuiltInProviderIdentifiers; } });
|
|
42
|
+
Object.defineProperty(exports, "BUILT_IN_PROVIDERS", { enumerable: true, get: function () { return filter_providers_1.BUILT_IN_PROVIDERS; } });
|
|
43
|
+
// Export configuration utilities
|
|
44
|
+
var product_helper_options_1 = require("./config/product-helper-options");
|
|
45
|
+
Object.defineProperty(exports, "resolveProductHelperOptions", { enumerable: true, get: function () { return product_helper_options_1.resolveProductHelperOptions; } });
|
|
46
|
+
Object.defineProperty(exports, "normalizeProductHelperOptions", { enumerable: true, get: function () { return product_helper_options_1.normalizeProductHelperOptions; } });
|
|
47
|
+
Object.defineProperty(exports, "DEFAULT_PRODUCT_HELPER_OPTIONS", { enumerable: true, get: function () { return product_helper_options_1.DEFAULT_PRODUCT_HELPER_OPTIONS; } });
|
|
48
|
+
// Service registration keys
|
|
49
|
+
exports.FILTER_PROVIDER_REGISTRY = "filterProviderRegistry";
|
|
50
|
+
exports.DYNAMIC_FILTER_SERVICE = "dynamicFilterService";
|
|
51
|
+
/**
|
|
52
|
+
* Initialize filter provider system.
|
|
53
|
+
*
|
|
54
|
+
* This function should be called during plugin initialization to:
|
|
55
|
+
* 1. Register FilterProviderRegistry and DynamicFilterService in the container
|
|
56
|
+
* 2. Register all built-in providers
|
|
57
|
+
* 3. Load and register custom providers from configuration
|
|
58
|
+
*
|
|
59
|
+
* Note: In Medusa v2, this should be called from a service initialization point
|
|
60
|
+
* or when the DynamicFilterService is first used. The service will auto-initialize
|
|
61
|
+
* if the registry is not pre-registered.
|
|
62
|
+
*
|
|
63
|
+
* @param container - Medusa container instance (must have register method)
|
|
64
|
+
* @param options - Plugin options containing filter provider configuration
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { initializeFilterProviders } from "medusa-product-helper"
|
|
69
|
+
*
|
|
70
|
+
* // In plugin initialization or service setup
|
|
71
|
+
* await initializeFilterProviders(container, pluginOptions)
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
async function initializeFilterProviders(container, options) {
|
|
75
|
+
const { FilterProviderRegistry } = await import("./services/filter-provider-registry.js");
|
|
76
|
+
const { DynamicFilterService } = await import("./services/dynamic-filter-service.js");
|
|
77
|
+
const { registerBuiltInProviders } = await import("./providers/filter-providers/index.js");
|
|
78
|
+
const { loadFilterProviders } = await import("./services/filter-provider-loader.js");
|
|
79
|
+
// Create and register registry
|
|
80
|
+
const registry = new FilterProviderRegistry();
|
|
81
|
+
container.register(exports.FILTER_PROVIDER_REGISTRY, registry);
|
|
82
|
+
// Register built-in providers
|
|
83
|
+
registerBuiltInProviders(registry, options.disableBuiltInProviders || []);
|
|
84
|
+
// Load and register custom providers
|
|
85
|
+
if (options.filterProviders && options.filterProviders.length > 0) {
|
|
86
|
+
try {
|
|
87
|
+
const customProviders = await loadFilterProviders(options.filterProviders);
|
|
88
|
+
for (const provider of customProviders) {
|
|
89
|
+
registry.register(provider);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
94
|
+
console.error(`[medusa-product-helper] Failed to load custom filter providers: ${errorMessage}`);
|
|
95
|
+
// Don't throw - allow plugin to continue with built-in providers only
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const dynamicFilterService = new DynamicFilterService(container);
|
|
99
|
+
container.register(exports.DYNAMIC_FILTER_SERVICE, dynamicFilterService);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7Ozs7QUE0RUgsOERBOERDO0FBeElELGlCQUFpQjtBQUNqQiwrQ0FBOEQ7QUFBckQsMkhBQUEsT0FBTyxPQUFrQjtBQUNsQywrQ0FBb0Q7QUFBM0MsMkdBQUEsZUFBZSxPQUFBO0FBR3hCLHdDQUF3QztBQUN4QyxnRkFBNEU7QUFBbkUsa0lBQUEsc0JBQXNCLE9BQUE7QUFDL0IsNEVBQXdFO0FBQS9ELDhIQUFBLG9CQUFvQixPQUFBO0FBQzdCLDRFQUF3RTtBQUEvRCw4SEFBQSxvQkFBb0IsT0FBQTtBQUM3Qiw0RUFBdUU7QUFBOUQsNkhBQUEsbUJBQW1CLE9BQUE7QUFHNUIsMEJBQTBCO0FBQzFCLGlFQWdCcUM7QUFmbkMsc0hBQUEsa0JBQWtCLE9BQUE7QUFHbEIsMEhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsNEhBQUEsd0JBQXdCLE9BQUE7QUFDeEIsMEhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsNEhBQUEsd0JBQXdCLE9BQUE7QUFDeEIsaUlBQUEsNkJBQTZCLE9BQUE7QUFDN0IsMkhBQUEsdUJBQXVCLE9BQUE7QUFDdkIsOEhBQUEsMEJBQTBCLE9BQUE7QUFDMUIsd0hBQUEsb0JBQW9CLE9BQUE7QUFDcEIsNkhBQUEseUJBQXlCLE9BQUE7QUFDekIsNEhBQUEsd0JBQXdCLE9BQUE7QUFDeEIsaUlBQUEsNkJBQTZCLE9BQUE7QUFDN0Isc0hBQUEsa0JBQWtCLE9BQUE7QUFHcEIsaUNBQWlDO0FBQ2pDLDBFQU93QztBQU50QyxxSUFBQSwyQkFBMkIsT0FBQTtBQUMzQix1SUFBQSw2QkFBNkIsT0FBQTtBQUM3Qix3SUFBQSw4QkFBOEIsT0FBQTtBQVloQyw0QkFBNEI7QUFDZixRQUFBLHdCQUF3QixHQUFHLHdCQUF3QixDQUFBO0FBQ25ELFFBQUEsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUE7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSSxLQUFLLFVBQVUseUJBQXlCLENBQzdDLFNBR0MsRUFDRCxPQUdDO0lBRUQsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQzdDLHdDQUF3QyxDQUN6QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQzNDLHNDQUFzQyxDQUN2QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQy9DLHVDQUF1QyxDQUN4QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQzFDLHNDQUFzQyxDQUN2QyxDQUFBO0lBRUQsK0JBQStCO0lBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQTtJQUM3QyxTQUFTLENBQUMsUUFBUSxDQUFDLGdDQUF3QixFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBRXRELDhCQUE4QjtJQUM5Qix3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRXpFLHFDQUFxQztJQUNyQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxtQkFBbUIsQ0FDL0MsT0FBTyxDQUFDLGVBQW1GLENBQzVGLENBQUE7WUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUN2QyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUNoQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEQsT0FBTyxDQUFDLEtBQUssQ0FDWCxtRUFBbUUsWUFBWSxFQUFFLENBQ2xGLENBQUE7WUFDRCxzRUFBc0U7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFVRCxNQUFNLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLENBQ25ELFNBQTJDLENBQzVDLENBQUE7SUFDRCxTQUFTLENBQUMsUUFBUSxDQUFDLDhCQUFzQixFQUFFLG9CQUFvQixDQUFDLENBQUE7QUFDbEUsQ0FBQyJ9
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AvailabilityFilterProvider = void 0;
|
|
4
|
+
const base_filter_provider_1 = require("./base-filter-provider");
|
|
5
|
+
class AvailabilityFilterProvider extends base_filter_provider_1.BaseFilterProvider {
|
|
6
|
+
apply(filters, value, context) {
|
|
7
|
+
if (!this.isValidConfig(value)) {
|
|
8
|
+
return filters;
|
|
9
|
+
}
|
|
10
|
+
const config = value;
|
|
11
|
+
const result = { ...filters };
|
|
12
|
+
// Get values from config or context options with defaults
|
|
13
|
+
const publishable_only = this.getBooleanValue(config, context, "publishable_only", true);
|
|
14
|
+
const include_preorder = this.getBooleanValue(config, context, "include_preorder", true);
|
|
15
|
+
const include_backorder = this.getBooleanValue(config, context, "include_backorder", true);
|
|
16
|
+
const include_gift_cards = this.getBooleanValue(config, context, "include_gift_cards", false);
|
|
17
|
+
if (config.statuses?.length) {
|
|
18
|
+
result.status = config.statuses;
|
|
19
|
+
}
|
|
20
|
+
if (publishable_only) {
|
|
21
|
+
result.status = this.mergeStatus(result.status, "published");
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
isValidConfig(value) {
|
|
26
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
getBooleanValue(config, context, key, defaultValue) {
|
|
29
|
+
// First check config value
|
|
30
|
+
if (config[key] !== undefined) {
|
|
31
|
+
return config[key];
|
|
32
|
+
}
|
|
33
|
+
// Then check context options with proper type narrowing
|
|
34
|
+
const availabilityOptions = context?.options?.availability;
|
|
35
|
+
if (availabilityOptions && typeof availabilityOptions === "object") {
|
|
36
|
+
const value = availabilityOptions[key];
|
|
37
|
+
if (typeof value === "boolean") {
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Return default
|
|
42
|
+
return defaultValue;
|
|
43
|
+
}
|
|
44
|
+
mergeStatus(current, newStatus) {
|
|
45
|
+
if (Array.isArray(current)) {
|
|
46
|
+
return current.includes(newStatus) ? current : [...current, newStatus];
|
|
47
|
+
}
|
|
48
|
+
return [newStatus];
|
|
49
|
+
}
|
|
50
|
+
validate(value) {
|
|
51
|
+
if (value == null)
|
|
52
|
+
return;
|
|
53
|
+
if (!this.isValidConfig(value)) {
|
|
54
|
+
throw new Error("availability must be an object");
|
|
55
|
+
}
|
|
56
|
+
const config = value;
|
|
57
|
+
if (config.statuses !== undefined) {
|
|
58
|
+
if (!Array.isArray(config.statuses)) {
|
|
59
|
+
throw new Error("availability.statuses must be an array");
|
|
60
|
+
}
|
|
61
|
+
if (!config.statuses.every(s => typeof s === "string" && s.trim())) {
|
|
62
|
+
throw new Error("availability.statuses must be an array of non-empty strings");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const booleanFields = [
|
|
66
|
+
"include_preorder",
|
|
67
|
+
"include_backorder",
|
|
68
|
+
"include_gift_cards",
|
|
69
|
+
"publishable_only"
|
|
70
|
+
];
|
|
71
|
+
booleanFields.forEach(field => {
|
|
72
|
+
if (config[field] !== undefined && typeof config[field] !== "boolean") {
|
|
73
|
+
throw new Error(`availability.${field} must be a boolean`);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.AvailabilityFilterProvider = AvailabilityFilterProvider;
|
|
79
|
+
AvailabilityFilterProvider.identifier = "availability";
|
|
80
|
+
AvailabilityFilterProvider.displayName = "Availability Filter";
|
|
81
|
+
AvailabilityFilterProvider.description = "Filters products by availability status and options";
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhaWxhYmlsaXR5LXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9maWx0ZXItcHJvdmlkZXJzL2F2YWlsYWJpbGl0eS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRUFBK0U7QUFXL0UsTUFBYSwwQkFBMkIsU0FBUSx5Q0FBa0I7SUFLaEUsS0FBSyxDQUFDLE9BQWdDLEVBQUUsS0FBYyxFQUFFLE9BQXVCO1FBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxPQUFPLENBQUE7UUFDaEIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLEtBQTJCLENBQUE7UUFDMUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFBO1FBRTdCLDBEQUEwRDtRQUMxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN4RixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN4RixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMxRixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUU3RixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO1FBQ2pDLENBQUM7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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseFilterProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base class for all filter providers.
|
|
6
|
+
*
|
|
7
|
+
* Filter providers extend this class to implement custom filtering logic
|
|
8
|
+
* for product queries. Each provider handles a specific filter type identified
|
|
9
|
+
* by its unique identifier.
|
|
10
|
+
*/
|
|
11
|
+
class BaseFilterProvider {
|
|
12
|
+
}
|
|
13
|
+
exports.BaseFilterProvider = BaseFilterProvider;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWx0ZXItcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2ZpbHRlci1wcm92aWRlcnMvYmFzZS1maWx0ZXItcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBb0NBOzs7Ozs7R0FNRztBQUNILE1BQXNCLGtCQUFrQjtDQWdDdkM7QUFoQ0QsZ0RBZ0NDIn0=
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseProductFilterProvider = void 0;
|
|
4
|
+
const base_filter_provider_1 = require("./base-filter-provider");
|
|
5
|
+
class BaseProductFilterProvider extends base_filter_provider_1.BaseFilterProvider {
|
|
6
|
+
apply(filters, value) {
|
|
7
|
+
if (!this.isValidFilters(value))
|
|
8
|
+
return filters;
|
|
9
|
+
const baseFilters = value;
|
|
10
|
+
const result = { ...filters };
|
|
11
|
+
this.processFilter(baseFilters.id, 'id', result, 'id');
|
|
12
|
+
this.processFilter(baseFilters.handle, 'handle', result, 'handle');
|
|
13
|
+
this.processFilter(baseFilters.tags, 'tags', result, 'tags', (values) => ({ value: values }));
|
|
14
|
+
this.processFilter(baseFilters.sales_channel_id, 'sales_channel_id', result, 'sales_channels', (values) => ({ id: values }));
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
isValidFilters(value) {
|
|
18
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
19
|
+
}
|
|
20
|
+
processFilter(input, filterKey, result, outputKey, transform) {
|
|
21
|
+
if (input == null)
|
|
22
|
+
return;
|
|
23
|
+
const values = (Array.isArray(input) ? input : [input])
|
|
24
|
+
.filter((v) => typeof v === 'string' && v.trim() !== '');
|
|
25
|
+
if (values.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
result[outputKey] = transform ? transform(values) : values;
|
|
28
|
+
}
|
|
29
|
+
validate(value) {
|
|
30
|
+
if (value == null)
|
|
31
|
+
return;
|
|
32
|
+
if (!this.isValidFilters(value)) {
|
|
33
|
+
throw new Error("base_product must be an object");
|
|
34
|
+
}
|
|
35
|
+
const baseFilters = value;
|
|
36
|
+
const validations = [
|
|
37
|
+
['id', 'id'],
|
|
38
|
+
['handle', 'handle'],
|
|
39
|
+
['tags', 'tags'],
|
|
40
|
+
['sales_channel_id', 'sales_channel_id']
|
|
41
|
+
];
|
|
42
|
+
validations.forEach(([key, name]) => {
|
|
43
|
+
this.validateStringArray(baseFilters[key], name);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
validateStringArray(value, fieldName) {
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return;
|
|
49
|
+
const values = Array.isArray(value) ? value : [value];
|
|
50
|
+
if (!values.every(v => typeof v === "string" && v.trim().length > 0)) {
|
|
51
|
+
throw new Error(`base_product.${fieldName} must be a string or array of non-empty strings`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.BaseProductFilterProvider = BaseProductFilterProvider;
|
|
56
|
+
BaseProductFilterProvider.identifier = "base_product";
|
|
57
|
+
BaseProductFilterProvider.displayName = "Base Product Filters";
|
|
58
|
+
BaseProductFilterProvider.description = "Filters products by ID, handle, tags, and sales channel";
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wcm9kdWN0LXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9maWx0ZXItcHJvdmlkZXJzL2Jhc2UtcHJvZHVjdC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRUFBK0U7QUFXL0UsTUFBYSx5QkFBMEIsU0FBUSx5Q0FBa0I7SUFLL0QsS0FBSyxDQUFDLE9BQWdDLEVBQUUsS0FBYztRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQTtRQUUvQyxNQUFNLFdBQVcsR0FBRyxLQUEyQixDQUFBO1FBQy9DLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQTtRQUU3QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzdGLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFNUgsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRU8sY0FBYyxDQUFDLEtB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
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CategoryFilterProvider = void 0;
|
|
4
|
+
const base_filter_provider_1 = require("./base-filter-provider");
|
|
5
|
+
class CategoryFilterProvider extends base_filter_provider_1.BaseFilterProvider {
|
|
6
|
+
apply(filters, value) {
|
|
7
|
+
const categoryIds = this.normalizeAndValidate(value);
|
|
8
|
+
if (categoryIds.length === 0) {
|
|
9
|
+
return filters;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
...filters,
|
|
13
|
+
categories: { id: categoryIds }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
validate(value) {
|
|
17
|
+
if (value == null)
|
|
18
|
+
return;
|
|
19
|
+
const ids = this.normalizeAndValidate(value);
|
|
20
|
+
if (ids.length === 0) {
|
|
21
|
+
throw new Error("category_id must be a string or array of non-empty strings");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
normalizeAndValidate(value) {
|
|
25
|
+
if (value == null)
|
|
26
|
+
return [];
|
|
27
|
+
const ids = Array.isArray(value) ? value : [value];
|
|
28
|
+
return ids
|
|
29
|
+
.filter((id) => typeof id === "string" && id.trim().length > 0);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.CategoryFilterProvider = CategoryFilterProvider;
|
|
33
|
+
CategoryFilterProvider.identifier = "category_id";
|
|
34
|
+
CategoryFilterProvider.displayName = "Category Filter";
|
|
35
|
+
CategoryFilterProvider.description = "Filters products by category IDs";
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2ZpbHRlci1wcm92aWRlcnMvY2F0ZWdvcnktcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUVBQStFO0FBRS9FLE1BQWEsc0JBQXVCLFNBQVEseUNBQWtCO0lBSzVELEtBQUssQ0FBQyxPQUFnQyxFQUFFLEtBQWM7UUFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLE9BQU8sQ0FBQTtRQUNoQixDQUFDO1FBRUQsT0FBTztZQUNMLEdBQUcsT0FBTztZQUNWLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUU7U0FDaEMsQ0FBQTtJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYztRQUNyQixJQUFJLEtBQUssSUFBSSxJQUFJO1lBQUUsT0FBTTtRQUV6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFNUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQTtRQUMvRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQWM7UUFDekMsSUFBSSxLQUFLLElBQUksSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFBO1FBRTVCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVsRCxPQUFPLEdBQUc7YUFDUCxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQWdCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNqRixDQUFDOztBQW5DSCx3REFvQ0M7QUFuQ2lCLGlDQUFVLEdBQUcsYUFBYSxDQUFBO0FBQzFCLGtDQUFXLEdBQUcsaUJBQWlCLENBQUE7QUFDL0Isa0NBQVcsR0FBRyxrQ0FBa0MsQ0FBQSJ9
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CollectionFilterProvider = void 0;
|
|
4
|
+
const base_filter_provider_1 = require("./base-filter-provider");
|
|
5
|
+
class CollectionFilterProvider extends base_filter_provider_1.BaseFilterProvider {
|
|
6
|
+
apply(filters, value) {
|
|
7
|
+
const collectionIds = this.normalizeAndValidate(value);
|
|
8
|
+
if (collectionIds.length === 0) {
|
|
9
|
+
return filters;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
...filters,
|
|
13
|
+
collection_id: collectionIds
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
validate(value) {
|
|
17
|
+
if (value == null)
|
|
18
|
+
return;
|
|
19
|
+
const ids = this.normalizeAndValidate(value);
|
|
20
|
+
if (ids.length === 0) {
|
|
21
|
+
throw new Error("collection_id must be a string or array of non-empty strings");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
normalizeAndValidate(value) {
|
|
25
|
+
if (value == null)
|
|
26
|
+
return [];
|
|
27
|
+
const ids = Array.isArray(value) ? value : [value];
|
|
28
|
+
return ids
|
|
29
|
+
.filter((id) => typeof id === "string" && id.trim().length > 0);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.CollectionFilterProvider = CollectionFilterProvider;
|
|
33
|
+
CollectionFilterProvider.identifier = "collection_id";
|
|
34
|
+
CollectionFilterProvider.displayName = "Collection Filter";
|
|
35
|
+
CollectionFilterProvider.description = "Filters products by collection IDs";
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvZmlsdGVyLXByb3ZpZGVycy9jb2xsZWN0aW9uLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlFQUErRTtBQUUvRSxNQUFhLHdCQUF5QixTQUFRLHlDQUFrQjtJQUs5RCxLQUFLLENBQUMsT0FBZ0MsRUFBRSxLQUFjO1FBQ3BELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV0RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxPQUFPLENBQUE7UUFDaEIsQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLE9BQU87WUFDVixhQUFhLEVBQUUsYUFBYTtTQUM3QixDQUFBO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFjO1FBQ3JCLElBQUksS0FBSyxJQUFJLElBQUk7WUFBRSxPQUFNO1FBRXpCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU1QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBYztRQUN6QyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUE7UUFFNUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWxELE9BQU8sR0FBRzthQUNQLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ2pGLENBQUM7O0FBbkNILDREQW9DQztBQW5DaUIsbUNBQVUsR0FBRyxlQUFlLENBQUE7QUFDNUIsb0NBQVcsR0FBRyxtQkFBbUIsQ0FBQTtBQUNqQyxvQ0FBVyxHQUFHLG9DQUFvQyxDQUFBIn0=
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Filter Providers Module
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getBuiltInProviderIdentifiers = exports.registerBuiltInProviders = exports.BUILT_IN_PROVIDERS = exports.BaseProductFilterProvider = exports.RatingFilterProvider = exports.AvailabilityFilterProvider = exports.PromotionFilterProvider = exports.PromotionWindowFilterProvider = exports.PriceRangeFilterProvider = exports.MetadataFilterProvider = exports.CollectionFilterProvider = exports.CategoryFilterProvider = exports.BaseFilterProvider = void 0;
|
|
7
|
+
var base_filter_provider_1 = require("./base-filter-provider");
|
|
8
|
+
Object.defineProperty(exports, "BaseFilterProvider", { enumerable: true, get: function () { return base_filter_provider_1.BaseFilterProvider; } });
|
|
9
|
+
var category_provider_1 = require("./category-provider");
|
|
10
|
+
Object.defineProperty(exports, "CategoryFilterProvider", { enumerable: true, get: function () { return category_provider_1.CategoryFilterProvider; } });
|
|
11
|
+
var collection_provider_1 = require("./collection-provider");
|
|
12
|
+
Object.defineProperty(exports, "CollectionFilterProvider", { enumerable: true, get: function () { return collection_provider_1.CollectionFilterProvider; } });
|
|
13
|
+
var metadata_provider_1 = require("./metadata-provider");
|
|
14
|
+
Object.defineProperty(exports, "MetadataFilterProvider", { enumerable: true, get: function () { return metadata_provider_1.MetadataFilterProvider; } });
|
|
15
|
+
var price_range_provider_1 = require("./price-range-provider");
|
|
16
|
+
Object.defineProperty(exports, "PriceRangeFilterProvider", { enumerable: true, get: function () { return price_range_provider_1.PriceRangeFilterProvider; } });
|
|
17
|
+
var promotion_window_provider_1 = require("./promotion-window-provider");
|
|
18
|
+
Object.defineProperty(exports, "PromotionWindowFilterProvider", { enumerable: true, get: function () { return promotion_window_provider_1.PromotionWindowFilterProvider; } });
|
|
19
|
+
var promotion_provider_1 = require("./promotion-provider");
|
|
20
|
+
Object.defineProperty(exports, "PromotionFilterProvider", { enumerable: true, get: function () { return promotion_provider_1.PromotionFilterProvider; } });
|
|
21
|
+
var availability_provider_1 = require("./availability-provider");
|
|
22
|
+
Object.defineProperty(exports, "AvailabilityFilterProvider", { enumerable: true, get: function () { return availability_provider_1.AvailabilityFilterProvider; } });
|
|
23
|
+
var rating_provider_1 = require("./rating-provider");
|
|
24
|
+
Object.defineProperty(exports, "RatingFilterProvider", { enumerable: true, get: function () { return rating_provider_1.RatingFilterProvider; } });
|
|
25
|
+
var base_product_provider_1 = require("./base-product-provider");
|
|
26
|
+
Object.defineProperty(exports, "BaseProductFilterProvider", { enumerable: true, get: function () { return base_product_provider_1.BaseProductFilterProvider; } });
|
|
27
|
+
const category_provider_2 = require("./category-provider");
|
|
28
|
+
const collection_provider_2 = require("./collection-provider");
|
|
29
|
+
const metadata_provider_2 = require("./metadata-provider");
|
|
30
|
+
const price_range_provider_2 = require("./price-range-provider");
|
|
31
|
+
const promotion_window_provider_2 = require("./promotion-window-provider");
|
|
32
|
+
const promotion_provider_2 = require("./promotion-provider");
|
|
33
|
+
const availability_provider_2 = require("./availability-provider");
|
|
34
|
+
const rating_provider_2 = require("./rating-provider");
|
|
35
|
+
const base_product_provider_2 = require("./base-product-provider");
|
|
36
|
+
const PROVIDERS = [
|
|
37
|
+
category_provider_2.CategoryFilterProvider,
|
|
38
|
+
collection_provider_2.CollectionFilterProvider,
|
|
39
|
+
metadata_provider_2.MetadataFilterProvider,
|
|
40
|
+
price_range_provider_2.PriceRangeFilterProvider,
|
|
41
|
+
promotion_window_provider_2.PromotionWindowFilterProvider,
|
|
42
|
+
promotion_provider_2.PromotionFilterProvider,
|
|
43
|
+
availability_provider_2.AvailabilityFilterProvider,
|
|
44
|
+
rating_provider_2.RatingFilterProvider,
|
|
45
|
+
base_product_provider_2.BaseProductFilterProvider,
|
|
46
|
+
];
|
|
47
|
+
exports.BUILT_IN_PROVIDERS = PROVIDERS;
|
|
48
|
+
const registerBuiltInProviders = (registry, disabledProviders = []) => {
|
|
49
|
+
PROVIDERS.forEach(P => {
|
|
50
|
+
if (!disabledProviders.includes(P.identifier)) {
|
|
51
|
+
registry.register(new P());
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
exports.registerBuiltInProviders = registerBuiltInProviders;
|
|
56
|
+
const getBuiltInProviderIdentifiers = () => PROVIDERS.map(p => p.identifier);
|
|
57
|
+
exports.getBuiltInProviderIdentifiers = getBuiltInProviderIdentifiers;
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2ZpbHRlci1wcm92aWRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCwrREFBcUc7QUFBNUYsMEhBQUEsa0JBQWtCLE9BQUE7QUFDM0IseURBQTREO0FBQW5ELDJIQUFBLHNCQUFzQixPQUFBO0FBQy9CLDZEQUFnRTtBQUF2RCwrSEFBQSx3QkFBd0IsT0FBQTtBQUNqQyx5REFBNEQ7QUFBbkQsMkhBQUEsc0JBQXNCLE9BQUE7QUFDL0IsK0RBQWlFO0FBQXhELGdJQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHlFQUEyRTtBQUFsRSwwSUFBQSw2QkFBNkIsT0FBQTtBQUN0QywyREFBOEQ7QUFBckQsNkhBQUEsdUJBQXVCLE9BQUE7QUFDaEMsaUVBQW9FO0FBQTNELG1JQUFBLDBCQUEwQixPQUFBO0FBQ25DLHFEQUF3RDtBQUEvQyx1SEFBQSxvQkFBb0IsT0FBQTtBQUM3QixpRUFBbUU7QUFBMUQsa0lBQUEseUJBQXlCLE9BQUE7QUFHbEMsMkRBQTREO0FBQzVELCtEQUFnRTtBQUNoRSwyREFBNEQ7QUFDNUQsaUVBQWlFO0FBQ2pFLDJFQUEyRTtBQUMzRSw2REFBOEQ7QUFDOUQsbUVBQW9FO0FBQ3BFLHVEQUF3RDtBQUN4RCxtRUFBbUU7QUFFbkUsTUFBTSxTQUFTLEdBQUc7SUFDaEIsMENBQXNCO0lBQ3RCLDhDQUF3QjtJQUN4QiwwQ0FBc0I7SUFDdEIsK0NBQXdCO0lBQ3hCLHlEQUE2QjtJQUM3Qiw0Q0FBdUI7SUFDdkIsa0RBQTBCO0lBQzFCLHNDQUFvQjtJQUNwQixpREFBeUI7Q0FDakIsQ0FBQTtBQUVHLFFBQUEsa0JBQWtCLEdBQUcsU0FBUyxDQUFBO0FBRXBDLE1BQU0sd0JBQXdCLEdBQUcsQ0FDdEMsUUFBZ0MsRUFDaEMsb0JBQThCLEVBQUUsRUFDMUIsRUFBRTtJQUNSLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1QixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUFUWSxRQUFBLHdCQUF3Qiw0QkFTcEM7QUFFTSxNQUFNLDZCQUE2QixHQUFHLEdBQWEsRUFBRSxDQUMxRCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBRHJCLFFBQUEsNkJBQTZCLGlDQUNSIn0=
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetadataFilterProvider = void 0;
|
|
4
|
+
const base_filter_provider_1 = require("./base-filter-provider");
|
|
5
|
+
class MetadataFilterProvider extends base_filter_provider_1.BaseFilterProvider {
|
|
6
|
+
apply(filters, value, context) {
|
|
7
|
+
if (!this.isValidMetadata(value))
|
|
8
|
+
return filters;
|
|
9
|
+
const metadataFilters = value;
|
|
10
|
+
const allowlist = this.getAllowlist(context);
|
|
11
|
+
if (allowlist.size === 0)
|
|
12
|
+
return filters;
|
|
13
|
+
const allowedMetadata = this.filterByAllowlist(metadataFilters, allowlist);
|
|
14
|
+
if (Object.keys(allowedMetadata).length === 0) {
|
|
15
|
+
return filters;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
...filters,
|
|
19
|
+
metadata: allowedMetadata
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
validate(value) {
|
|
23
|
+
if (value == null)
|
|
24
|
+
return;
|
|
25
|
+
if (!this.isValidMetadata(value)) {
|
|
26
|
+
throw new Error("metadata must be an object");
|
|
27
|
+
}
|
|
28
|
+
const metadata = value;
|
|
29
|
+
Object.entries(metadata).forEach(([key, val]) => {
|
|
30
|
+
if (!this.isValidKey(key)) {
|
|
31
|
+
throw new Error("metadata keys must be non-empty strings");
|
|
32
|
+
}
|
|
33
|
+
if (!this.isValidValue(val)) {
|
|
34
|
+
throw new Error(`metadata.${key} must be a string, number, boolean, or array of these types`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
isValidMetadata(value) {
|
|
39
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
40
|
+
}
|
|
41
|
+
isValidKey(key) {
|
|
42
|
+
return typeof key === "string" && key.trim().length > 0;
|
|
43
|
+
}
|
|
44
|
+
isValidValue(value) {
|
|
45
|
+
const isValidPrimitive = (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean";
|
|
46
|
+
if (Array.isArray(value)) {
|
|
47
|
+
return value.every(isValidPrimitive);
|
|
48
|
+
}
|
|
49
|
+
return isValidPrimitive(value);
|
|
50
|
+
}
|
|
51
|
+
getAllowlist(context) {
|
|
52
|
+
const descriptors = context?.options?.metadata?.products?.descriptors || [];
|
|
53
|
+
return new Set(descriptors.filter(d => d.filterable).map(d => d.key));
|
|
54
|
+
}
|
|
55
|
+
filterByAllowlist(metadata, allowlist) {
|
|
56
|
+
const result = {};
|
|
57
|
+
Object.entries(metadata).forEach(([key, val]) => {
|
|
58
|
+
if (allowlist.has(key)) {
|
|
59
|
+
result[key] = val;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.MetadataFilterProvider = MetadataFilterProvider;
|
|
66
|
+
MetadataFilterProvider.identifier = "metadata";
|
|
67
|
+
MetadataFilterProvider.displayName = "Metadata Filter";
|
|
68
|
+
MetadataFilterProvider.description = "Filters products by metadata with allowlist validation";
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2ZpbHRlci1wcm92aWRlcnMvbWV0YWRhdGEtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUVBQStFO0FBSy9FLE1BQWEsc0JBQXVCLFNBQVEseUNBQWtCO0lBSzVELEtBQUssQ0FBQyxPQUFnQyxFQUFFLEtBQWMsRUFBRSxPQUF1QjtRQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQTtRQUVoRCxNQUFNLGVBQWUsR0FBRyxLQUFzQyxDQUFBO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFNUMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQTtRQUV4QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBRTFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTyxPQUFPLENBQUE7UUFDaEIsQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLE9BQU87WUFDVixRQUFRLEVBQUUsZUFBZTtTQUMxQixDQUFBO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFjO1FBQ3JCLElBQUksS0FBSyxJQUFJLElBQUk7WUFBRSxPQUFNO1FBRXpCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFzQyxDQUFBO1FBRXZE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
|