@medusajs/search 0.0.1 → 2.18.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.
Files changed (102) hide show
  1. package/README.md +4 -1
  2. package/dist/index.d.ts +7 -8
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +11 -21
  5. package/dist/index.js.map +1 -0
  6. package/dist/joiner-config.d.ts +8 -2
  7. package/dist/joiner-config.d.ts.map +1 -0
  8. package/dist/joiner-config.js +9 -1
  9. package/dist/joiner-config.js.map +1 -0
  10. package/dist/loaders/{container.d.ts → providers.d.ts} +2 -1
  11. package/dist/loaders/providers.d.ts.map +1 -0
  12. package/dist/loaders/providers.js +23 -0
  13. package/dist/loaders/providers.js.map +1 -0
  14. package/dist/migrations/Migration20260805085626.d.ts +6 -0
  15. package/dist/migrations/Migration20260805085626.d.ts.map +1 -0
  16. package/dist/migrations/Migration20260805085626.js +23 -0
  17. package/dist/migrations/Migration20260805085626.js.map +1 -0
  18. package/dist/models/index.d.ts +3 -2
  19. package/dist/models/index.d.ts.map +1 -0
  20. package/dist/models/index.js +6 -16
  21. package/dist/models/index.js.map +1 -0
  22. package/dist/models/search-index-sync.d.ts +25 -0
  23. package/dist/models/search-index-sync.d.ts.map +1 -0
  24. package/dist/models/search-index-sync.js +42 -0
  25. package/dist/models/search-index-sync.js.map +1 -0
  26. package/dist/models/search-index.d.ts +21 -0
  27. package/dist/models/search-index.d.ts.map +1 -0
  28. package/dist/models/search-index.js +29 -0
  29. package/dist/models/search-index.js.map +1 -0
  30. package/dist/services/index.d.ts +2 -0
  31. package/dist/services/index.d.ts.map +1 -0
  32. package/dist/services/index.js +4 -1
  33. package/dist/services/index.js.map +1 -0
  34. package/dist/services/search-module-service.d.ts +45 -22
  35. package/dist/services/search-module-service.d.ts.map +1 -0
  36. package/dist/services/search-module-service.js +160 -45
  37. package/dist/services/search-module-service.js.map +1 -0
  38. package/dist/services/search-provider.d.ts +23 -0
  39. package/dist/services/search-provider.d.ts.map +1 -0
  40. package/dist/services/search-provider.js +64 -0
  41. package/dist/services/search-provider.js.map +1 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -0
  43. package/dist/types/index.d.ts +80 -110
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +5 -5
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/utils/index.d.ts +63 -3
  48. package/dist/utils/index.d.ts.map +1 -0
  49. package/dist/utils/index.js +384 -17
  50. package/dist/utils/index.js.map +1 -0
  51. package/dist/utils/ingestion.d.ts +12 -0
  52. package/dist/utils/ingestion.d.ts.map +1 -0
  53. package/dist/utils/ingestion.js +69 -0
  54. package/dist/utils/ingestion.js.map +1 -0
  55. package/dist/utils/migrations.d.ts +11 -0
  56. package/dist/utils/migrations.d.ts.map +1 -0
  57. package/dist/utils/migrations.js +98 -0
  58. package/dist/utils/migrations.js.map +1 -0
  59. package/dist/utils/seeding.d.ts +14 -0
  60. package/dist/utils/seeding.d.ts.map +1 -0
  61. package/dist/utils/seeding.js +343 -0
  62. package/dist/utils/seeding.js.map +1 -0
  63. package/package.json +26 -45
  64. package/dist/initialize/index.d.ts +0 -8
  65. package/dist/initialize/index.js +0 -17
  66. package/dist/loaders/connection.d.ts +0 -4
  67. package/dist/loaders/connection.js +0 -41
  68. package/dist/loaders/container.js +0 -21
  69. package/dist/loaders/index.d.ts +0 -2
  70. package/dist/loaders/index.js +0 -10
  71. package/dist/migrations/Migration20231019174230.d.ts +0 -4
  72. package/dist/migrations/Migration20231019174230.js +0 -18
  73. package/dist/models/catalog-relation.d.ts +0 -15
  74. package/dist/models/catalog-relation.js +0 -72
  75. package/dist/models/catalog.d.ts +0 -11
  76. package/dist/models/catalog.js +0 -55
  77. package/dist/module-definition.d.ts +0 -2
  78. package/dist/module-definition.js +0 -15
  79. package/dist/scripts/bin/run-migration-down.d.ts +0 -3
  80. package/dist/scripts/bin/run-migration-down.js +0 -32
  81. package/dist/scripts/bin/run-migration-up.d.ts +0 -3
  82. package/dist/scripts/bin/run-migration-up.js +0 -32
  83. package/dist/scripts/bin/run-seed.d.ts +0 -3
  84. package/dist/scripts/bin/run-seed.js +0 -38
  85. package/dist/scripts/index.d.ts +0 -2
  86. package/dist/scripts/index.js +0 -18
  87. package/dist/scripts/migration-down.d.ts +0 -10
  88. package/dist/scripts/migration-down.js +0 -52
  89. package/dist/scripts/migration-up.d.ts +0 -10
  90. package/dist/scripts/migration-up.js +0 -56
  91. package/dist/scripts/seed-data/index.d.ts +0 -8
  92. package/dist/scripts/seed-data/index.js +0 -138
  93. package/dist/scripts/seed.d.ts +0 -5
  94. package/dist/scripts/seed.js +0 -65
  95. package/dist/services/postgres-provider.d.ts +0 -126
  96. package/dist/services/postgres-provider.js +0 -441
  97. package/dist/utils/build-config.d.ts +0 -21
  98. package/dist/utils/build-config.js +0 -437
  99. package/dist/utils/create-partitions.d.ts +0 -3
  100. package/dist/utils/create-partitions.js +0 -27
  101. package/dist/utils/query-builder.d.ts +0 -28
  102. package/dist/utils/query-builder.js +0 -375
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAGtC,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB;AAGD,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAI7C,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,WAAW,CAAC,qBAAqB,CAAA;CACzC,CAAA;AAID,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,qBAAqB,CAAC,EACzD,MAAM,SAAK,GACV,eAAe,EAAE,CAanB;AAQD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,WAAW,CAAC,qBAAqB,GACvC,OAAO,CAET;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,CAAC,qBAAqB,EACxC,IAAI,EAAE,WAAW,CAAC,eAAe,GAChC,OAAO,CAQT;AAiBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,qBAAqB,CAAC,GACxD,MAAM,EAAE,CAMV;AA2DD,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,WAAW,CAAC,WAAW,CAAA;IAC9B,KAAK,EAAE,WAAW,CAAC,6BAA6B,CAAA;CACjD,GAAG,WAAW,CAAC,mBAAmB,CAiClC;AA+CD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,CAAC,mBAAmB,GACrC;IACD,IAAI,EAAE,WAAW,CAAC,mBAAmB,CAAA;IACrC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAA;CACxD,CA6BA;AAED,wBAAgB,4BAA4B,CAAC,EAC3C,IAAI,EACJ,SAAS,GACV,EAAE;IACD,IAAI,EAAE,WAAW,CAAC,YAAY,CAAA;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;CACjD,GAAG,WAAW,CAAC,YAAY,CAe3B;AAsBD,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,WAAW,CAAC,6BAA6B,CAAA;IAGhD,KAAK,EAAE,IAAI,CACT,WAAW,CAAC,WAAW,EACvB,SAAS,GAAG,YAAY,GAAG,gBAAgB,CAC5C,CAAA;CACF,GAAG,IAAI,CA8DP;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,EAAE;IACD,WAAW,EAAE,WAAW,CAAC,qBAAqB,EAAE,CAAA;IAChD,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,aAAa,CAoDhB;AAgED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,GACX,WAAW,CAAC,6BAA6B,CAa3C;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,CAAC,UAAU,EAC5B,KAAK,EAAE,MAAM,GACZ,WAAW,CAAC,UAAU,CAWxB"}
@@ -1,19 +1,386 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./query-builder"), exports);
18
- __exportStar(require("./create-partitions"), exports);
19
- __exportStar(require("./build-config"), exports);
3
+ exports.DEFAULT_REINDEX_BATCH_SIZE = exports.SearchSyncStatus = exports.SearchIndexState = void 0;
4
+ exports.flattenFields = flattenFields;
5
+ exports.isSearchable = isSearchable;
6
+ exports.isFacetable = isFacetable;
7
+ exports.listRetrievablePaths = listRetrievablePaths;
8
+ exports.normalizeSearchQuery = normalizeSearchQuery;
9
+ exports.buildDisjunctiveFacetQueries = buildDisjunctiveFacetQueries;
10
+ exports.mergeDisjunctiveFacetResults = mergeDisjunctiveFacetResults;
11
+ exports.validateFieldUsage = validateFieldUsage;
12
+ exports.resolveIndexDefinitions = resolveIndexDefinitions;
13
+ exports.retrieveIndexDefinition = retrieveIndexDefinition;
14
+ exports.assertTaskAccepted = assertTaskAccepted;
15
+ const utils_1 = require("@medusajs/framework/utils");
16
+ const crypto_1 = require("crypto");
17
+ var SearchIndexState;
18
+ (function (SearchIndexState) {
19
+ SearchIndexState["PENDING"] = "pending";
20
+ SearchIndexState["BUILDING"] = "building";
21
+ SearchIndexState["READY"] = "ready";
22
+ SearchIndexState["ERROR"] = "error";
23
+ })(SearchIndexState || (exports.SearchIndexState = SearchIndexState = {}));
24
+ var SearchSyncStatus;
25
+ (function (SearchSyncStatus) {
26
+ SearchSyncStatus["PENDING"] = "pending";
27
+ SearchSyncStatus["PROCESSING"] = "processing";
28
+ SearchSyncStatus["DONE"] = "done";
29
+ SearchSyncStatus["FAILED"] = "failed";
30
+ SearchSyncStatus["CANCELED"] = "canceled";
31
+ })(SearchSyncStatus || (exports.SearchSyncStatus = SearchSyncStatus = {}));
32
+ const DEFAULT_TAKE = 20;
33
+ exports.DEFAULT_REINDEX_BATCH_SIZE = 100;
34
+ // Walks fields into dotted paths. Object fields yield themselves and their
35
+ // descendants, so `retrievable` can be asked about either.
36
+ function flattenFields(fields, prefix = "") {
37
+ const flat = [];
38
+ for (const [name, field] of Object.entries(fields)) {
39
+ const path = prefix ? `${prefix}.${name}` : name;
40
+ flat.push({ path, field });
41
+ if (field.type === "object" && field.fields) {
42
+ flat.push(...flattenFields(field.fields, path));
43
+ }
44
+ }
45
+ return flat;
46
+ }
47
+ function buildFieldMap(definition) {
48
+ return new Map(flattenFields(definition.fields).map((f) => [f.path, f]));
49
+ }
50
+ function isSearchable(field) {
51
+ return field.searchable === true || typeof field.searchable === "object";
52
+ }
53
+ function isFacetable(field, kind) {
54
+ if (field.facetable === true) {
55
+ return defaultFacetKinds(field).includes(kind);
56
+ }
57
+ if (typeof field.facetable === "object") {
58
+ return (field.facetable.types ?? defaultFacetKinds(field)).includes(kind);
59
+ }
60
+ return false;
61
+ }
62
+ // `stats` is opt-in: it is the least widely supported facet kind, so implying
63
+ // it would make numeric fields unusable on providers that lack aggregations.
64
+ function defaultFacetKinds(field) {
65
+ switch (field.type) {
66
+ case "integer":
67
+ case "float":
68
+ case "date":
69
+ return ["range"];
70
+ default:
71
+ return ["value"];
72
+ }
73
+ }
74
+ /**
75
+ * The dotted paths an index can hand back on hits. Object containers are
76
+ * excluded — only their declared leaves are stored, so returning the container
77
+ * would silently hand back a partial object.
78
+ */
79
+ function listRetrievablePaths(fields) {
80
+ return flattenFields(fields)
81
+ .filter(({ field }) => field.type !== "object" && field.retrievable !== false)
82
+ .map(({ path }) => path);
83
+ }
84
+ // Key order must not change the hash, so object keys are emitted sorted.
85
+ function stableStringify(value) {
86
+ if (value === null || typeof value !== "object") {
87
+ return JSON.stringify(value) ?? "null";
88
+ }
89
+ if (Array.isArray(value)) {
90
+ return `[${value.map(stableStringify).join(",")}]`;
91
+ }
92
+ const entries = Object.entries(value)
93
+ .filter(([, v]) => v !== undefined)
94
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
95
+ .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`);
96
+ return `{${entries.join(",")}}`;
97
+ }
98
+ /**
99
+ * Stable hash over what affects the physical index. `events`, `consume` and
100
+ * `seed` are excluded: how documents are produced is not the index' shape.
101
+ * `primary_key` and `physical_name` are included even though they are not
102
+ * strictly shape, because changing either strands the index the record points
103
+ * at — the mismatch is what makes `db:migrate` rebuild.
104
+ */
105
+ function buildDefinitionHash(definition) {
106
+ return (0, crypto_1.createHash)("sha256")
107
+ .update(stableStringify({
108
+ fields: definition.fields,
109
+ settings: definition.settings ?? {},
110
+ primary_key: definition.primary_key,
111
+ physical_name: definition.physical_name,
112
+ }))
113
+ .digest("hex")
114
+ .slice(0, 32);
115
+ }
116
+ // Accounts for `index_prefix` and, for a shadow index, the schema suffix.
117
+ function buildPhysicalIndexName({ name, prefix, suffix, }) {
118
+ return [prefix, name, suffix].filter(Boolean).join("_");
119
+ }
120
+ // Lifts `q` out of the filters, applies pagination defaults, and expands
121
+ // shorthand facets. When `attributes_to_search_on` is omitted the provider
122
+ // matches on every field marked `searchable`.
123
+ function normalizeSearchQuery({ query, index, }) {
124
+ const filters = { ...(query.filters ?? {}) };
125
+ // `q` travels with the filters so that a `query.graph` call converts to a
126
+ // `query.search` one unchanged, but it is not a field — lift it out before the
127
+ // rest is compiled into a provider filter DSL.
128
+ const q = filters.q;
129
+ delete filters.q;
130
+ const searchOptions = { ...(query.search_options ?? {}) };
131
+ searchOptions.facets = searchOptions.facets?.map((facet) => typeof facet === "string" ? { field: facet, type: "value" } : facet);
132
+ return {
133
+ index,
134
+ // Taken as given when set: `query.search` has already dropped anything the
135
+ // index cannot return and left only what the provider should project. A
136
+ // direct caller that names no fields gets everything retrievable.
137
+ attributes_to_retrieve: query.fields ?? listRetrievablePaths(index.fields),
138
+ q,
139
+ filters: Object.keys(filters).length
140
+ ? filters
141
+ : undefined,
142
+ pagination: {
143
+ skip: query.pagination?.skip ?? 0,
144
+ take: query.pagination?.take ?? DEFAULT_TAKE,
145
+ order: query.pagination?.order,
146
+ cursor: query.pagination?.cursor,
147
+ },
148
+ search_options: searchOptions,
149
+ };
150
+ }
151
+ // Drops every predicate on `field`, including inside `$and` / `$or` / `$not`.
152
+ function withoutFieldFilter(filters, field) {
153
+ if (!filters) {
154
+ return undefined;
155
+ }
156
+ const next = {};
157
+ for (const [key, value] of Object.entries(filters)) {
158
+ if (key === field) {
159
+ continue;
160
+ }
161
+ if ((key === "$and" || key === "$or") && Array.isArray(value)) {
162
+ const branches = value
163
+ .map((branch) => withoutFieldFilter(branch, field))
164
+ .filter((branch) => branch && Object.keys(branch).length);
165
+ if (branches.length) {
166
+ next[key] = branches;
167
+ }
168
+ continue;
169
+ }
170
+ if (key === "$not") {
171
+ const stripped = withoutFieldFilter(value, field);
172
+ if (stripped && Object.keys(stripped).length) {
173
+ next.$not = stripped;
174
+ }
175
+ continue;
176
+ }
177
+ next[key] = value;
178
+ }
179
+ return Object.keys(next).length
180
+ ? next
181
+ : undefined;
182
+ }
183
+ /**
184
+ * The base query plus one per faceted field with that field's own filter dropped.
185
+ * Every engine reviewed needs a query per facet, so the fan-out lives here rather
186
+ * than in each provider. `disjunctive_facets` is stripped from what is handed on —
187
+ * a provider should never see an option it is not expected to act on.
188
+ */
189
+ function buildDisjunctiveFacetQueries(query) {
190
+ const perFacet = new Map();
191
+ const facets = (query.search_options?.facets ??
192
+ []);
193
+ const { disjunctive_facets: _, ...searchOptions } = query.search_options ?? {};
194
+ const base = {
195
+ ...query,
196
+ search_options: searchOptions,
197
+ };
198
+ for (const facet of facets) {
199
+ const relaxed = withoutFieldFilter(query.filters, facet.field);
200
+ // Nothing filters this field, so the base result's facet is already right.
201
+ if (stableStringify(relaxed) === stableStringify(query.filters)) {
202
+ continue;
203
+ }
204
+ perFacet.set(facet.field, {
205
+ ...base,
206
+ filters: relaxed,
207
+ // Only the facet is wanted; skip the hits.
208
+ pagination: { ...query.pagination, skip: 0, take: 0 },
209
+ search_options: { ...searchOptions, facets: [facet] },
210
+ });
211
+ }
212
+ return { base, per_facet: perFacet };
213
+ }
214
+ function mergeDisjunctiveFacetResults({ base, per_facet, }) {
215
+ if (!per_facet.size) {
216
+ return base;
217
+ }
218
+ const facets = { ...(base.facets ?? {}) };
219
+ for (const [field, result] of per_facet) {
220
+ const relaxed = result.facets?.[field];
221
+ if (relaxed) {
222
+ facets[field] = relaxed;
223
+ }
224
+ }
225
+ return { ...base, facets };
226
+ }
227
+ function collectFilterPaths(filters, into = new Set()) {
228
+ for (const [key, value] of Object.entries(filters)) {
229
+ if (key === "$and" || key === "$or") {
230
+ for (const branch of (value ?? [])) {
231
+ collectFilterPaths(branch, into);
232
+ }
233
+ }
234
+ else if (key === "$not") {
235
+ collectFilterPaths(value, into);
236
+ }
237
+ else {
238
+ into.add(key);
239
+ }
240
+ }
241
+ return into;
242
+ }
243
+ // Checks a field is declared for the use the query puts it to. Engines reject
244
+ // these too, but with errors that do not name the definition to fix.
245
+ function validateFieldUsage({ index, query, }) {
246
+ const fieldMap = buildFieldMap(index);
247
+ const fail = (message) => {
248
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, message);
249
+ };
250
+ const lookup = (path, usage) => {
251
+ const known = fieldMap.get(path);
252
+ if (!known) {
253
+ fail(`Unknown field "${path}" used in ${usage} on search index "${index.name}"`);
254
+ }
255
+ return known.field;
256
+ };
257
+ if (query.filters) {
258
+ for (const path of collectFilterPaths(query.filters)) {
259
+ const field = lookup(path, "filters");
260
+ if (!field.filterable) {
261
+ fail(`Field "${path}" is not filterable on search index "${index.name}"`);
262
+ }
263
+ }
264
+ }
265
+ for (const path of Object.keys(query.pagination?.order ?? {})) {
266
+ if (path === "_score") {
267
+ continue;
268
+ }
269
+ const field = lookup(path, "pagination.order");
270
+ if (!field.sortable) {
271
+ fail(`Field "${path}" is not sortable on search index "${index.name}"`);
272
+ }
273
+ }
274
+ for (const facet of query.search_options?.facets ?? []) {
275
+ const request = typeof facet === "string"
276
+ ? { field: facet, type: "value" }
277
+ : facet;
278
+ const field = lookup(request.field, "search_options.facets");
279
+ const kind = request.type ?? "value";
280
+ if (!isFacetable(field, kind)) {
281
+ fail(`Field "${request.field}" does not support "${kind}" facets on search index "${index.name}"`);
282
+ }
283
+ }
284
+ for (const path of query.search_options?.attributes_to_search_on ?? []) {
285
+ const field = lookup(path, "search_options.attributes_to_search_on");
286
+ if (!isSearchable(field)) {
287
+ fail(`Field "${path}" is not searchable on search index "${index.name}"`);
288
+ }
289
+ }
290
+ if (query.search_options?.distinct) {
291
+ lookup(query.search_options.distinct, "search_options.distinct");
292
+ }
293
+ }
294
+ /**
295
+ * Resolves every definition once, at construction. Duplicates and incoherent
296
+ * definitions fail here, so everything downstream can treat the result as given.
297
+ */
298
+ function resolveIndexDefinitions({ definitions, default_provider, index_prefix, }) {
299
+ const resolved = new Map();
300
+ for (const definition of definitions) {
301
+ const primaryKey = definition.primary_key ?? "id";
302
+ if (!definition.name) {
303
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "A search index definition requires a name");
304
+ }
305
+ if (resolved.has(definition.name)) {
306
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Duplicate search index definition for "${definition.name}"`);
307
+ }
308
+ if (!definition.fields?.[primaryKey]) {
309
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Search index "${definition.name}" must declare its primary key field "${primaryKey}"`);
310
+ }
311
+ const physicalName = buildPhysicalIndexName({
312
+ name: definition.name,
313
+ prefix: index_prefix,
314
+ });
315
+ const entry = {
316
+ ...definition,
317
+ primary_key: primaryKey,
318
+ provider: definition.provider ?? default_provider,
319
+ settings: definition.settings ?? {},
320
+ definition_hash: buildDefinitionHash({
321
+ fields: definition.fields,
322
+ settings: definition.settings,
323
+ primary_key: primaryKey,
324
+ physical_name: physicalName,
325
+ }),
326
+ physical_name: physicalName,
327
+ };
328
+ validateIndexDefinition({ definition: entry });
329
+ resolved.set(entry.name, entry);
330
+ }
331
+ return resolved;
332
+ }
333
+ /**
334
+ * Checks a definition is internally coherent regardless of provider — a field
335
+ * asking for something that makes no sense for its type. Whether a *particular*
336
+ * provider can serve it is settled in `upsertIndex`, which runs for every
337
+ * definition at startup, so it still fails at boot but with a better error.
338
+ */
339
+ function validateIndexDefinition({ definition, }) {
340
+ const fail = (message) => {
341
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid search index definition "${definition.name}": ${message}`);
342
+ };
343
+ const hasEvents = !!definition.events?.length;
344
+ const hasConsume = !!definition.consume;
345
+ if (hasEvents && !hasConsume) {
346
+ fail(`declares "events" but no "consume" to turn them into documents`);
347
+ }
348
+ if (hasConsume && !hasEvents) {
349
+ fail(`declares "consume" but no "events" for it to be called on`);
350
+ }
351
+ for (const { path, field } of flattenFields(definition.fields)) {
352
+ if (field.correlated && !(field.type === "object" && field.array)) {
353
+ fail(`field "${path}" sets "correlated", which only applies to an array of objects`);
354
+ }
355
+ if (field.type === "vector" && !field.dimensions) {
356
+ fail(`vector field "${path}" must declare its "dimensions"`);
357
+ }
358
+ if (field.type === "object" && !field.fields) {
359
+ fail(`object field "${path}" must declare its "fields"`);
360
+ }
361
+ const numeric = ["integer", "float", "date"].includes(field.type);
362
+ if (isFacetable(field, "range") && !numeric) {
363
+ fail(`field "${path}" is not numeric, so it cannot have range facets`);
364
+ }
365
+ if (isFacetable(field, "stats") && !numeric) {
366
+ fail(`field "${path}" is not numeric, so it cannot have stats facets`);
367
+ }
368
+ if (isSearchable(field) && !["text", "keyword"].includes(field.type)) {
369
+ fail(`field "${path}" is of type "${field.type}", which cannot be searched as free text`);
370
+ }
371
+ }
372
+ }
373
+ function retrieveIndexDefinition(indexes, name) {
374
+ const definition = indexes.get(name);
375
+ if (!definition) {
376
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No search index registered for "${name}". Registered indexes: ${[...indexes.keys()].join(", ") || "(none)"}`);
377
+ }
378
+ return definition;
379
+ }
380
+ function assertTaskAccepted(task, index) {
381
+ if (task.status === "failed") {
382
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Search write failed on index "${index}": ${task.error?.message ?? "unknown error"}`);
383
+ }
384
+ return task;
385
+ }
386
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Event, SearchTypes } from "@medusajs/framework/types";
2
+ import { SearchEventRoutes, SearchIndexes, SearchIngestionRuntime } from "../types";
3
+ export declare function buildEventRoutes(indexes: SearchIndexes): SearchEventRoutes;
4
+ /**
5
+ * Turns one event into writes. Every write is waited on as far as its provider allows,
6
+ * so awaiting this is an acknowledgement.
7
+ */
8
+ export declare function ingestEvent(context: SearchIngestionRuntime, { event, routes }: {
9
+ event: Event<any>;
10
+ routes: SearchEventRoutes;
11
+ }): Promise<SearchTypes.SearchTask[]>;
12
+ //# sourceMappingURL=ingestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion.d.ts","sourceRoot":"","sources":["../../src/utils/ingestion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACvB,MAAM,QAAQ,CAAA;AAIf,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,CAgB1E;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,sBAAsB,EAC/B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAClE,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CA2CnC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildEventRoutes = buildEventRoutes;
4
+ exports.ingestEvent = ingestEvent;
5
+ const index_1 = require("./index");
6
+ // Built once so routing a delivered event is a lookup, not a scan.
7
+ function buildEventRoutes(indexes) {
8
+ const routes = new Map();
9
+ for (const definition of indexes.values()) {
10
+ for (const event of definition.events ?? []) {
11
+ const names = routes.get(event);
12
+ if (names) {
13
+ names.push(definition.name);
14
+ }
15
+ else {
16
+ routes.set(event, [definition.name]);
17
+ }
18
+ }
19
+ }
20
+ return routes;
21
+ }
22
+ /**
23
+ * Turns one event into writes. Every write is waited on as far as its provider allows,
24
+ * so awaiting this is an acknowledgement.
25
+ */
26
+ async function ingestEvent(context, { event, routes }) {
27
+ const names = routes.get(event.name);
28
+ // Only reachable by a direct call — the subscriber enrolls in declared events.
29
+ if (!names?.length) {
30
+ return [];
31
+ }
32
+ const tasks = [];
33
+ for (const name of names) {
34
+ const definition = (0, index_1.retrieveIndexDefinition)(context.indexes, name);
35
+ const provider = context.providers.retrieve(definition.provider);
36
+ // Resolving a definition rejects `events` without `consume`, so there is one.
37
+ const mutations = await definition.consume(event, {
38
+ container: context.container,
39
+ index: definition,
40
+ });
41
+ for (const mutation of mutations) {
42
+ if (mutation.action === "upsert" && !mutation.documents.length) {
43
+ continue;
44
+ }
45
+ const task = mutation.action === "upsert"
46
+ ? await provider.upsertDocuments({
47
+ index: definition.physical_name,
48
+ documents: mutation.documents,
49
+ })
50
+ : await provider.deleteDocuments({
51
+ index: definition.physical_name,
52
+ filters: mutation.filters,
53
+ });
54
+ tasks.push(await settleTask(provider, (0, index_1.assertTaskAccepted)(task, name), name));
55
+ }
56
+ }
57
+ return tasks;
58
+ }
59
+ /**
60
+ * A deferred write is not in the index yet, so waiting is what makes the result an
61
+ * acknowledgement. Inline providers come back `succeeded` with nothing to wait for.
62
+ */
63
+ async function settleTask(provider, task, index) {
64
+ if (task.status === "succeeded" || !provider.waitForTask) {
65
+ return task;
66
+ }
67
+ return (0, index_1.assertTaskAccepted)(await provider.waitForTask(task), index);
68
+ }
69
+ //# sourceMappingURL=ingestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion.js","sourceRoot":"","sources":["../../src/utils/ingestion.ts"],"names":[],"mappings":";;AASA,4CAgBC;AAMD,kCA8CC;AAvED,mCAAqE;AAErE,mEAAmE;AACnE,SAAgB,gBAAgB,CAAC,OAAsB;IACrD,MAAM,MAAM,GAAsB,IAAI,GAAG,EAAE,CAAA;IAE3C,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAE/B,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAC/B,OAA+B,EAC/B,EAAE,KAAK,EAAE,MAAM,EAAoD;IAEnE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAEpC,+EAA+E;IAC/E,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAA6B,EAAE,CAAA;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAA,+BAAuB,EAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAEhE,8EAA8E;QAC9E,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAQ,CAAC,KAAK,EAAE;YACjD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,UAAU;SAClB,CAAC,CAAA;QAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC/D,SAAQ;YACV,CAAC;YAED,MAAM,IAAI,GACR,QAAQ,CAAC,MAAM,KAAK,QAAQ;gBAC1B,CAAC,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC;oBAC7B,KAAK,EAAE,UAAU,CAAC,aAAa;oBAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC;gBACJ,CAAC,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC;oBAC7B,KAAK,EAAE,UAAU,CAAC,aAAa;oBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B,CAAC,CAAA;YAER,KAAK,CAAC,IAAI,CACR,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAA,0BAAkB,EAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CACjE,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CACvB,QAAqC,EACrC,IAA4B,EAC5B,KAAa;IAEb,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,IAAA,0BAAkB,EAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;AACpE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { SearchTypes } from "@medusajs/framework/types";
2
+ import { SearchIndexRegistry } from "../types";
3
+ /**
4
+ * The index a schema change is built into. Derived from the definition hash rather
5
+ * than a job id, so a migration and the boot that finishes it agree on the name
6
+ * without persisting it, and an interrupted build is resumed rather than orphaned.
7
+ */
8
+ export declare function shadowIndexName(definition: SearchTypes.ResolvedSearchIndexDefinition): string;
9
+ export declare function createIndexMigrationPlan(context: SearchIndexRegistry): Promise<SearchTypes.SearchIndexMigrationAction[]>;
10
+ export declare function executeIndexMigrationPlan(context: SearchIndexRegistry, actions: SearchTypes.SearchIndexMigrationAction[]): Promise<void>;
11
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/utils/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAG5C;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,WAAW,CAAC,6BAA6B,GACpD,MAAM,CAIR;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,0BAA0B,EAAE,CAAC,CAyDnD;AAGD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,WAAW,CAAC,0BAA0B,EAAE,GAChD,OAAO,CAAC,IAAI,CAAC,CAwCf"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shadowIndexName = shadowIndexName;
4
+ exports.createIndexMigrationPlan = createIndexMigrationPlan;
5
+ exports.executeIndexMigrationPlan = executeIndexMigrationPlan;
6
+ const index_1 = require("./index");
7
+ /**
8
+ * The index a schema change is built into. Derived from the definition hash rather
9
+ * than a job id, so a migration and the boot that finishes it agree on the name
10
+ * without persisting it, and an interrupted build is resumed rather than orphaned.
11
+ */
12
+ function shadowIndexName(definition) {
13
+ // `physical_name` already carries the module's index prefix, so appending the
14
+ // schema fingerprint is enough — the prefix never has to be passed in.
15
+ return `${definition.physical_name}_${definition.definition_hash.slice(0, 8)}`;
16
+ }
17
+ async function createIndexMigrationPlan(context) {
18
+ const definitions = [...context.indexes.values()];
19
+ if (!definitions.length) {
20
+ return [];
21
+ }
22
+ const records = await context.indexService.list({ name: definitions.map((definition) => definition.name) }, { take: null });
23
+ const byName = new Map(records.map((record) => [record.name, record]));
24
+ return definitions.map((definition) => {
25
+ const record = byName.get(definition.name);
26
+ const shared = {
27
+ index: definition.name,
28
+ definition_hash: definition.definition_hash,
29
+ };
30
+ if (!record) {
31
+ return {
32
+ ...shared,
33
+ action: "create",
34
+ physical_name: definition.physical_name,
35
+ };
36
+ }
37
+ // A provider change with an untouched schema drifts too: the hash still
38
+ // matches, but no physical index exists on the new provider yet.
39
+ if (record.definition_hash === definition.definition_hash &&
40
+ record.provider === definition.provider) {
41
+ return {
42
+ ...shared,
43
+ action: "noop",
44
+ physical_name: definition.physical_name,
45
+ };
46
+ }
47
+ const provider = context.providers.retrieve(definition.provider);
48
+ return {
49
+ ...shared,
50
+ action: "migrate",
51
+ // With an alias, build the new schema alongside and swap it in once
52
+ // seeded. Without one there is nowhere to build, so the live index is
53
+ // replaced and stays empty until the seed at application start.
54
+ physical_name: provider.swapIndex
55
+ ? shadowIndexName(definition)
56
+ : definition.physical_name,
57
+ live_physical_name: definition.physical_name,
58
+ live_definition_hash: record.definition_hash,
59
+ };
60
+ });
61
+ }
62
+ // Note: Seeding data is done by the application start hook, migrations are reserved for schema changes.
63
+ async function executeIndexMigrationPlan(context, actions) {
64
+ for (const action of actions) {
65
+ if (action.action === "noop") {
66
+ continue;
67
+ }
68
+ const definition = (0, index_1.retrieveIndexDefinition)(context.indexes, action.index);
69
+ const provider = context.providers.retrieve(definition.provider);
70
+ if (action.action === "create") {
71
+ await provider.upsertIndex({ index: definition });
72
+ await context.indexService.create([
73
+ {
74
+ name: definition.name,
75
+ provider: definition.provider,
76
+ // Created but not filled; the seed at startup makes it ready.
77
+ status: index_1.SearchIndexState.PENDING,
78
+ definition_hash: definition.definition_hash,
79
+ },
80
+ ]);
81
+ continue;
82
+ }
83
+ await provider.upsertIndex({
84
+ index: { ...definition, physical_name: action.physical_name },
85
+ });
86
+ // The record deliberately keeps the old hash — that mismatch is what tells
87
+ // application start there is a seed to finish. But when the build replaced
88
+ // the live index rather than standing beside it, the index now holds
89
+ // nothing, so the record should stop claiming it is ready.
90
+ if (action.physical_name === action.live_physical_name) {
91
+ await context.indexService.update({
92
+ selector: { name: definition.name },
93
+ data: { status: index_1.SearchIndexState.PENDING },
94
+ });
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/utils/migrations.ts"],"names":[],"mappings":"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"}