@extravirgin/payload-plugin-meilisearch 0.0.12 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1 +1,42 @@
1
- # Plugin
1
+ # Payload Meilisearch plugin
2
+
3
+ ## Indexing localized select labels
4
+
5
+ Select values remain unchanged and can still be used for filtering. To also make
6
+ their option labels searchable, enable `indexSelectLabels`. The label is added
7
+ to a sibling field with the `_label` suffix.
8
+
9
+ ```ts
10
+ meilisearch({
11
+ apiKey: process.env.MEILISEARCH_API_KEY,
12
+ host: process.env.MEILISEARCH_HOST,
13
+ collections: [{ slug: 'products' }],
14
+ indexSelectLabels: true,
15
+ })
16
+ ```
17
+
18
+ For a document locale such as `en-US`, labels are tried in this order:
19
+ `en-US`, `en`, then Payload's i18n fallback language. The behavior can be
20
+ configured globally or overridden per collection:
21
+
22
+ ```ts
23
+ meilisearch({
24
+ // ...
25
+ collections: [
26
+ {
27
+ slug: 'products',
28
+ indexSelectLabels: {
29
+ defaultLocale: 'de',
30
+ fieldSuffix: '_optionLabel',
31
+ resolveLabel: ({ defaultLabel, option, localeFallbacks }) => {
32
+ // Useful for function labels or application-specific translations.
33
+ return defaultLabel
34
+ },
35
+ },
36
+ },
37
+ ],
38
+ })
39
+ ```
40
+
41
+ Returning `undefined` from `resolveLabel` keeps the built-in result. Returning
42
+ `null` omits the label.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,43 @@
1
- import type { Config, PayloadRequest } from 'payload';
1
+ import type { Config, Option, PayloadRequest, SelectField } from 'payload';
2
+ export type ResolveSelectLabelArgs = {
3
+ /**
4
+ * Label resolved by the plugin. This is undefined for label functions and
5
+ * when none of the configured locale fallbacks matched.
6
+ */
7
+ defaultLabel?: string;
8
+ field: SelectField;
9
+ locale?: string;
10
+ localeFallbacks: string[];
11
+ option: Option;
12
+ req: PayloadRequest;
13
+ value: string;
14
+ };
15
+ export type IndexSelectLabelsConfig = {
16
+ /**
17
+ * Locale used after progressively less-specific variants of the document
18
+ * locale have been tried. Defaults to Payload's i18n fallback language.
19
+ */
20
+ defaultLocale?: string;
21
+ /**
22
+ * The indexed label is stored in a sibling field named
23
+ * `${field.name}${fieldSuffix}`.
24
+ *
25
+ * @default '_label'
26
+ */
27
+ fieldSuffix?: string;
28
+ /**
29
+ * Override or provide a label. Returning undefined uses defaultLabel;
30
+ * returning null omits the label from the index.
31
+ */
32
+ resolveLabel?: (args: ResolveSelectLabelArgs) => null | Promise<null | string | undefined> | string | undefined;
33
+ };
34
+ export type IndexSelectLabels = boolean | IndexSelectLabelsConfig;
2
35
  export interface PluginCollectionConfig {
36
+ /**
37
+ * Overrides the plugin-level select label indexing setting for this
38
+ * collection.
39
+ */
40
+ indexSelectLabels?: IndexSelectLabels;
3
41
  shouldIndex?: (doc: object, previousDoc: object, locale?: string) => 'delete' | 'ignore' | 'index';
4
42
  slug: string;
5
43
  }
@@ -12,6 +50,13 @@ export type MeilisearchConfig = {
12
50
  disabled?: boolean;
13
51
  host: string;
14
52
  indexPrefix?: string;
53
+ /**
54
+ * Index select option labels in addition to their stored values.
55
+ *
56
+ * Set to true to use the defaults, or pass an object to configure locale
57
+ * fallback, the label field suffix, or a custom label resolver.
58
+ */
59
+ indexSelectLabels?: IndexSelectLabels;
15
60
  reindexPermissionCallback?: (req: PayloadRequest) => boolean;
16
61
  };
17
62
  export declare const meilisearch: (pluginOptions: MeilisearchConfig) => (config: Config) => Config;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, PayloadRequest } from 'payload'\n\nimport { indexCollection, reindexCollection } from './indexCollections.js'\n//test\nexport interface PluginCollectionConfig {\n shouldIndex?: (doc: object, previousDoc: object, locale?: string) => 'delete' | 'ignore' | 'index';\n slug: string;\n}\n\nexport type MeilisearchConfig = {\n apiKey: string\n /**\n * List of collections to add a custom field\n */\n collections?: PluginCollectionConfig[]\n disabled?: boolean\n host: string\n indexPrefix?: string\n reindexPermissionCallback?: (req: PayloadRequest) => boolean\n}\n\nexport const meilisearch =\n (pluginOptions: MeilisearchConfig) =>\n (config: Config): Config => {\n if (!config.collections) {\n config.collections = []\n }\n\n\n if (pluginOptions.disabled) {\n return config\n }\n\n if (pluginOptions.collections) {\n\n for (const { slug } of pluginOptions.collections) {\n const collection = config.collections.find(\n (collection) => collection.slug === slug,\n )\n\n if (collection) {\n indexCollection(collection, pluginOptions)\n }\n }\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n config.endpoints.push({\n handler: async (req) => {\n\n if (!pluginOptions.reindexPermissionCallback || pluginOptions.reindexPermissionCallback(req)) {\n for (const c of pluginOptions.collections ?? []) {\n const collection = req.payload.config.collections.find(\n (collection) => collection.slug === c.slug,\n )\n if (collection) {\n await reindexCollection(collection, pluginOptions, req)\n }\n }\n return Response.json({ message: 'sucessfully started indexing' })\n } else {\n return Response.json({ message: 'not allowed' }, {\n status: 403\n })\n\n }\n\n },\n method: 'get',\n path: '/reindex-meilisearch',\n })\n\n\n return config\n }\n"],"names":["indexCollection","reindexCollection","meilisearch","pluginOptions","config","collections","disabled","slug","collection","find","endpoints","push","handler","req","reindexPermissionCallback","c","payload","Response","json","message","status","method","path"],"mappings":"AAEA,SAASA,eAAe,EAAEC,iBAAiB,QAAQ,wBAAuB;AAmB1E,OAAO,MAAMC,cACX,CAACC,gBACC,CAACC;QACC,IAAI,CAACA,OAAOC,WAAW,EAAE;YACvBD,OAAOC,WAAW,GAAG,EAAE;QACzB;QAGA,IAAIF,cAAcG,QAAQ,EAAE;YAC1B,OAAOF;QACT;QAEA,IAAID,cAAcE,WAAW,EAAE;YAE7B,KAAK,MAAM,EAAEE,IAAI,EAAE,IAAIJ,cAAcE,WAAW,CAAE;gBAChD,MAAMG,aAAaJ,OAAOC,WAAW,CAACI,IAAI,CACxC,CAACD,aAAeA,WAAWD,IAAI,KAAKA;gBAGtC,IAAIC,YAAY;oBACdR,gBAAgBQ,YAAYL;gBAC9B;YACF;QACF;QAEA,IAAI,CAACC,OAAOM,SAAS,EAAE;YACrBN,OAAOM,SAAS,GAAG,EAAE;QACvB;QAEAN,OAAOM,SAAS,CAACC,IAAI,CAAC;YACpBC,SAAS,OAAOC;gBAEd,IAAI,CAACV,cAAcW,yBAAyB,IAAIX,cAAcW,yBAAyB,CAACD,MAAM;oBAC5F,KAAK,MAAME,KAAKZ,cAAcE,WAAW,IAAI,EAAE,CAAE;wBAC/C,MAAMG,aAAaK,IAAIG,OAAO,CAACZ,MAAM,CAACC,WAAW,CAACI,IAAI,CACpD,CAACD,aAAeA,WAAWD,IAAI,KAAKQ,EAAER,IAAI;wBAE5C,IAAIC,YAAY;4BACd,MAAMP,kBAAkBO,YAAYL,eAAeU;wBACrD;oBACF;oBACA,OAAOI,SAASC,IAAI,CAAC;wBAAEC,SAAS;oBAA+B;gBACjE,OAAO;oBACL,OAAOF,SAASC,IAAI,CAAC;wBAAEC,SAAS;oBAAc,GAAG;wBAC/CC,QAAQ;oBACV;gBAEF;YAEF;YACAC,QAAQ;YACRC,MAAM;QACR;QAGA,OAAOlB;IACT,EAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, Option, PayloadRequest, SelectField } from 'payload'\n\nimport { indexCollection, reindexCollection } from './indexCollections.js'\n\nexport type ResolveSelectLabelArgs = {\n /**\n * Label resolved by the plugin. This is undefined for label functions and\n * when none of the configured locale fallbacks matched.\n */\n defaultLabel?: string\n field: SelectField\n locale?: string\n localeFallbacks: string[]\n option: Option\n req: PayloadRequest\n value: string\n}\n\nexport type IndexSelectLabelsConfig = {\n /**\n * Locale used after progressively less-specific variants of the document\n * locale have been tried. Defaults to Payload's i18n fallback language.\n */\n defaultLocale?: string\n /**\n * The indexed label is stored in a sibling field named\n * `${field.name}${fieldSuffix}`.\n *\n * @default '_label'\n */\n fieldSuffix?: string\n /**\n * Override or provide a label. Returning undefined uses defaultLabel;\n * returning null omits the label from the index.\n */\n resolveLabel?: (\n args: ResolveSelectLabelArgs,\n ) => null | Promise<null | string | undefined> | string | undefined\n}\n\nexport type IndexSelectLabels = boolean | IndexSelectLabelsConfig\n\nexport interface PluginCollectionConfig {\n /**\n * Overrides the plugin-level select label indexing setting for this\n * collection.\n */\n indexSelectLabels?: IndexSelectLabels\n shouldIndex?: (\n doc: object,\n previousDoc: object,\n locale?: string,\n ) => 'delete' | 'ignore' | 'index'\n slug: string\n}\n\nexport type MeilisearchConfig = {\n apiKey: string\n /**\n * List of collections to add a custom field\n */\n collections?: PluginCollectionConfig[]\n disabled?: boolean\n host: string\n indexPrefix?: string\n /**\n * Index select option labels in addition to their stored values.\n *\n * Set to true to use the defaults, or pass an object to configure locale\n * fallback, the label field suffix, or a custom label resolver.\n */\n indexSelectLabels?: IndexSelectLabels\n reindexPermissionCallback?: (req: PayloadRequest) => boolean\n}\n\nexport const meilisearch =\n (pluginOptions: MeilisearchConfig) =>\n (config: Config): Config => {\n if (!config.collections) {\n config.collections = []\n }\n\n\n if (pluginOptions.disabled) {\n return config\n }\n\n if (pluginOptions.collections) {\n\n for (const { slug } of pluginOptions.collections) {\n const collection = config.collections.find(\n (collection) => collection.slug === slug,\n )\n\n if (collection) {\n indexCollection(collection, pluginOptions)\n }\n }\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n config.endpoints.push({\n handler: async (req) => {\n\n if (!pluginOptions.reindexPermissionCallback || pluginOptions.reindexPermissionCallback(req)) {\n for (const c of pluginOptions.collections ?? []) {\n const collection = req.payload.config.collections.find(\n (collection) => collection.slug === c.slug,\n )\n if (collection) {\n await reindexCollection(collection, pluginOptions, req)\n }\n }\n return Response.json({ message: 'sucessfully started indexing' })\n } else {\n return Response.json({ message: 'not allowed' }, {\n status: 403\n })\n\n }\n\n },\n method: 'get',\n path: '/reindex-meilisearch',\n })\n\n\n return config\n }\n"],"names":["indexCollection","reindexCollection","meilisearch","pluginOptions","config","collections","disabled","slug","collection","find","endpoints","push","handler","req","reindexPermissionCallback","c","payload","Response","json","message","status","method","path"],"mappings":"AAEA,SAASA,eAAe,EAAEC,iBAAiB,QAAQ,wBAAuB;AAyE1E,OAAO,MAAMC,cACX,CAACC,gBACC,CAACC;QACC,IAAI,CAACA,OAAOC,WAAW,EAAE;YACvBD,OAAOC,WAAW,GAAG,EAAE;QACzB;QAGA,IAAIF,cAAcG,QAAQ,EAAE;YAC1B,OAAOF;QACT;QAEA,IAAID,cAAcE,WAAW,EAAE;YAE7B,KAAK,MAAM,EAAEE,IAAI,EAAE,IAAIJ,cAAcE,WAAW,CAAE;gBAChD,MAAMG,aAAaJ,OAAOC,WAAW,CAACI,IAAI,CACxC,CAACD,aAAeA,WAAWD,IAAI,KAAKA;gBAGtC,IAAIC,YAAY;oBACdR,gBAAgBQ,YAAYL;gBAC9B;YACF;QACF;QAEA,IAAI,CAACC,OAAOM,SAAS,EAAE;YACrBN,OAAOM,SAAS,GAAG,EAAE;QACvB;QAEAN,OAAOM,SAAS,CAACC,IAAI,CAAC;YACpBC,SAAS,OAAOC;gBAEd,IAAI,CAACV,cAAcW,yBAAyB,IAAIX,cAAcW,yBAAyB,CAACD,MAAM;oBAC5F,KAAK,MAAME,KAAKZ,cAAcE,WAAW,IAAI,EAAE,CAAE;wBAC/C,MAAMG,aAAaK,IAAIG,OAAO,CAACZ,MAAM,CAACC,WAAW,CAACI,IAAI,CACpD,CAACD,aAAeA,WAAWD,IAAI,KAAKQ,EAAER,IAAI;wBAE5C,IAAIC,YAAY;4BACd,MAAMP,kBAAkBO,YAAYL,eAAeU;wBACrD;oBACF;oBACA,OAAOI,SAASC,IAAI,CAAC;wBAAEC,SAAS;oBAA+B;gBACjE,OAAO;oBACL,OAAOF,SAASC,IAAI,CAAC;wBAAEC,SAAS;oBAAc,GAAG;wBAC/CC,QAAQ;oBACV;gBAEF;YAEF;YACAC,QAAQ;YACRC,MAAM;QACR;QAGA,OAAOlB;IACT,EAAC"}
@@ -1,4 +1,10 @@
1
- import type { CollectionConfig, PayloadRequest, SanitizedCollectionConfig } from "payload";
2
- import type { MeilisearchConfig } from "./index.js";
1
+ import type { CollectionConfig, Field, PayloadRequest, SanitizedCollectionConfig } from "payload";
2
+ import type { IndexSelectLabels, MeilisearchConfig } from "./index.js";
3
3
  export declare const reindexCollection: (collection: SanitizedCollectionConfig, config: MeilisearchConfig, req: PayloadRequest) => Promise<void>;
4
4
  export declare const indexCollection: (collection: CollectionConfig, config: MeilisearchConfig) => void;
5
+ export type TransformOptions = {
6
+ indexSelectLabels?: IndexSelectLabels;
7
+ locale?: string;
8
+ };
9
+ export declare const getSelectLabelLocaleFallbacks: (locale: string | undefined, defaultLocale: string | undefined) => string[];
10
+ export declare function transformDocumentForMeilisearch(doc: any, fields: Field[], req: PayloadRequest, options?: TransformOptions): Promise<any>;
@@ -71,7 +71,10 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
71
71
  const shouldIndex = collectionConfig?.shouldIndex?.(localizedDoc, previousDoc, locale.code) ?? 'index';
72
72
  if (shouldIndex === 'index') {
73
73
  const transformedDoc = {
74
- ...await transformDocumentForMeilisearch(localizedDoc, collection.fields, req),
74
+ ...await transformDocumentForMeilisearch(localizedDoc, collection.fields, req, {
75
+ indexSelectLabels: collectionConfig?.indexSelectLabels ?? config.indexSelectLabels,
76
+ locale: locale.code
77
+ }),
75
78
  id: documentId,
76
79
  documentId: doc.id,
77
80
  locale: locale.code
@@ -89,7 +92,9 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
89
92
  const shouldIndex = collectionConfig?.shouldIndex?.(doc, previousDoc) ?? 'index';
90
93
  if (shouldIndex === 'index') {
91
94
  const transformedDoc = {
92
- ...await transformDocumentForMeilisearch(doc, collection.fields, req),
95
+ ...await transformDocumentForMeilisearch(doc, collection.fields, req, {
96
+ indexSelectLabels: collectionConfig?.indexSelectLabels ?? config.indexSelectLabels
97
+ }),
93
98
  id: documentId,
94
99
  documentId: doc.id
95
100
  };
@@ -179,8 +184,79 @@ const compiledConvert = compile(options);
179
184
  function extractTextFromHTML(html) {
180
185
  return compiledConvert(html);
181
186
  }
187
+ const normalizeLocale = (locale)=>locale.replaceAll('_', '-').toLowerCase();
188
+ export const getSelectLabelLocaleFallbacks = (locale, defaultLocale)=>{
189
+ const fallbacks = [];
190
+ const addLocaleAndParents = (value)=>{
191
+ if (!value) {
192
+ return;
193
+ }
194
+ const parts = value.replaceAll('_', '-').split('-').filter(Boolean);
195
+ while(parts.length > 0){
196
+ const candidate = parts.join('-');
197
+ if (!fallbacks.some((item)=>normalizeLocale(item) === normalizeLocale(candidate))) {
198
+ fallbacks.push(candidate);
199
+ }
200
+ parts.pop();
201
+ }
202
+ };
203
+ addLocaleAndParents(locale);
204
+ addLocaleAndParents(defaultLocale);
205
+ return fallbacks;
206
+ };
207
+ const getDefaultSelectLabel = (option, localeFallbacks)=>{
208
+ if (typeof option === 'string') {
209
+ return option;
210
+ }
211
+ if (typeof option.label === 'string') {
212
+ return option.label;
213
+ }
214
+ if (typeof option.label === 'function') {
215
+ return undefined;
216
+ }
217
+ for (const locale of localeFallbacks){
218
+ const matchingKey = Object.keys(option.label).find((key)=>normalizeLocale(key) === normalizeLocale(locale));
219
+ if (matchingKey && option.label[matchingKey]) {
220
+ return option.label[matchingKey];
221
+ }
222
+ }
223
+ return undefined;
224
+ };
225
+ const getSelectedOption = (field, value)=>field.options.find((option)=>typeof option === 'string' ? option === value : option.value === value);
226
+ const transformSelectLabels = async ({ field, locale, options, req, value })=>{
227
+ const defaultLocale = options.defaultLocale ?? req.payload.config.i18n.fallbackLanguage;
228
+ const localeFallbacks = getSelectLabelLocaleFallbacks(locale, defaultLocale);
229
+ const resolveValue = async (selectedValue)=>{
230
+ if (typeof selectedValue !== 'string') {
231
+ return undefined;
232
+ }
233
+ const option = getSelectedOption(field, selectedValue);
234
+ if (!option) {
235
+ return undefined;
236
+ }
237
+ const defaultLabel = getDefaultSelectLabel(option, localeFallbacks);
238
+ if (!options.resolveLabel) {
239
+ return defaultLabel;
240
+ }
241
+ const resolvedLabel = await options.resolveLabel({
242
+ defaultLabel,
243
+ field,
244
+ locale,
245
+ localeFallbacks,
246
+ option,
247
+ req,
248
+ value: selectedValue
249
+ });
250
+ return resolvedLabel === undefined ? defaultLabel : resolvedLabel ?? undefined;
251
+ };
252
+ if (Array.isArray(value)) {
253
+ const labels = (await Promise.all(value.map(resolveValue))).filter((label)=>typeof label === 'string');
254
+ return labels.length > 0 ? labels : undefined;
255
+ }
256
+ return resolveValue(value);
257
+ };
182
258
  // Helper function to transform a document for Meilisearch indexing
183
- async function transformDocumentForMeilisearch(doc, fields, req) {
259
+ export async function transformDocumentForMeilisearch(doc, fields, req, options = {}) {
184
260
  const transformedDoc = {};
185
261
  await Promise.all(fields.map(async (field)=>{
186
262
  try {
@@ -197,16 +273,16 @@ async function transformDocumentForMeilisearch(doc, fields, req) {
197
273
  transformedDoc[field.name] = extractTextFromHTML(html);
198
274
  } else if (field.type === 'array' && field.fields) {
199
275
  // For array fields, transform each item
200
- transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map((item)=>transformDocumentForMeilisearch(item, field.fields, req)));
276
+ transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map((item)=>transformDocumentForMeilisearch(item, field.fields, req, options)));
201
277
  } else if (field.type === 'tabs') {
202
278
  // For tab fields, transform each tab
203
279
  (await Promise.all(field.tabs.map(async (tab)=>{
204
280
  if ('name' in tab && tab.name) {
205
281
  return {
206
- [tab.name]: await transformDocumentForMeilisearch(doc?.[tab.name] ?? {}, tab.fields, req)
282
+ [tab.name]: await transformDocumentForMeilisearch(doc?.[tab.name] ?? {}, tab.fields, req, options)
207
283
  };
208
284
  }
209
- return await transformDocumentForMeilisearch(doc, tab.fields, req);
285
+ return await transformDocumentForMeilisearch(doc, tab.fields, req, options);
210
286
  }))).forEach((t)=>Object.assign(transformedDoc, t));
211
287
  } else if (field.type === 'blocks') {
212
288
  // For block fields, transform each block
@@ -220,18 +296,33 @@ async function transformDocumentForMeilisearch(doc, fields, req) {
220
296
  }
221
297
  return {
222
298
  type: block.blockType,
223
- data: await transformDocumentForMeilisearch(block, fields, req)
299
+ data: await transformDocumentForMeilisearch(block, fields, req, options)
224
300
  };
225
301
  }));
302
+ } else if (field.type === 'select') {
303
+ transformedDoc[field.name] = doc[field.name];
304
+ if (options.indexSelectLabels) {
305
+ const selectLabelOptions = options.indexSelectLabels === true ? {} : options.indexSelectLabels;
306
+ const label = await transformSelectLabels({
307
+ field,
308
+ locale: options.locale,
309
+ options: selectLabelOptions,
310
+ req,
311
+ value: doc[field.name]
312
+ });
313
+ if (label !== undefined) {
314
+ transformedDoc[`${field.name}${selectLabelOptions.fieldSuffix ?? '_label'}`] = label;
315
+ }
316
+ }
226
317
  } else if (field.type === 'radio') {
227
318
  transformedDoc[field.name] = doc[field.name];
228
319
  } else if (field.type === 'group' && field.name && field.fields) {
229
320
  // For group fields, transform the nested fields
230
- transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req);
321
+ transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req, options);
231
322
  } else if (field.type === 'group' && !field.name && field.fields) {
232
- Object.assign(transformedDoc, await transformDocumentForMeilisearch(doc, field.fields, req));
233
- } else if (field.type === 'row' && field.fields) {
234
- Object.assign(transformedDoc, await transformDocumentForMeilisearch(doc, field.fields, req));
323
+ Object.assign(transformedDoc, await transformDocumentForMeilisearch(doc, field.fields, req, options));
324
+ } else if ((field.type === 'row' || field.type === 'collapsible') && field.fields) {
325
+ Object.assign(transformedDoc, await transformDocumentForMeilisearch(doc, field.fields, req, options));
235
326
  } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && field.hasMany) {
236
327
  transformedDoc[field.name] = doc[field.name]?.map((relatedDoc)=>{
237
328
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/indexCollections.ts"],"sourcesContent":["import type {\n LexicalRichTextAdapter,\n SanitizedServerEditorConfig\n} from '@payloadcms/richtext-lexical';\nimport type { Block, CollectionAfterChangeHook, CollectionAfterDeleteHook, CollectionConfig, Field, Payload, PayloadRequest, SanitizedCollectionConfig, Tab } from \"payload\";\n\nimport {\n consolidateHTMLConverters,\n convertLexicalToHTML,\n} from '@payloadcms/richtext-lexical';\nimport { compile } from 'html-to-text';\nimport { MeiliSearch } from 'meilisearch';\n\nimport type { MeilisearchConfig } from \"./index.js\";\n\n\nconst getIndexName = (config: MeilisearchConfig, collectionSlug: string) => `${config?.indexPrefix ?? ''}${collectionSlug}`;\n\nexport const reindexCollection = async (collection: SanitizedCollectionConfig, config: MeilisearchConfig, req: PayloadRequest) => {\n\n req.context.meiliSkipDelay = true;\n\n const entries = await req.payload.find({\n collection: collection.slug,\n draft: false,\n pagination: false,\n select: {\n id: true,\n },\n });\n\n const client = getMeilisearchClient(config);\n await upsertIndex(client, getIndexName(config, collection.slug));\n const index = client.index(getIndexName(config, collection.slug));\n\n await index.deleteAllDocuments();\n\n\n for (const entry of entries.docs) {\n await handleAfterChange(config)({\n collection,\n context: req.context,\n doc: entry,\n operation: \"update\",\n previousDoc: null,\n req,\n })\n }\n}\n\nexport const indexCollection = (collection: CollectionConfig, config: MeilisearchConfig) => {\n\n if (!collection.hooks) {\n collection.hooks = {};\n }\n\n if (!collection.hooks.afterChange) {\n collection.hooks.afterChange = [];\n }\n\n collection.hooks.afterChange.push(handleAfterChange(config));\n\n if (!collection.hooks.afterDelete) {\n collection.hooks.afterDelete = [];\n }\n\n collection.hooks.afterDelete.push(afterDeleteHook(config));\n}\n\nconst processDocument = async (doc: any, previousDoc: any, collection: CollectionConfig, config: MeilisearchConfig, req: PayloadRequest) => {\n\n // wait for 50ms to allow for the document to be saved to the database to make things more reliable\n if (!req.context?.meiliSkipDelay) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n const baseDoc = doc;\n const collectionConfig = config.collections && config?.collections.find(c => c.slug === collection.slug);\n\n const payload: Payload = req.payload;\n\n const client = getMeilisearchClient(config);\n await upsertIndex(client, getIndexName(config, collection.slug));\n const index = client.index(getIndexName(config, collection.slug));\n\n const documents = [];\n\n if (payload.config?.localization && payload.config.localization.locales?.length > 0) {\n\n const {\n defaultLocale,\n fallback,\n locales,\n } = payload.config.localization;\n\n for (const locale of locales) {\n\n const localizedDoc = await req.payload.findByID({\n id: doc.id,\n collection: collection.slug,\n draft: false,\n fallbackLocale: locale.fallbackLocale || defaultLocale,\n locale: locale.code,\n overrideAccess: true,\n });\n\n const documentId = doc.id + `_${locale.code}`;\n\n if (!localizedDoc) {\n await index.deleteDocument(documentId);\n continue;\n }\n const shouldIndex = collectionConfig?.shouldIndex?.(localizedDoc, previousDoc, locale.code) ?? 'index'\n if (shouldIndex === 'index') {\n const transformedDoc = {\n ...await transformDocumentForMeilisearch(localizedDoc, collection.fields, req),\n id: documentId,\n documentId: doc.id,\n locale: locale.code,\n };\n documents.push(transformedDoc);\n } else if (shouldIndex === 'delete') {\n await index.deleteDocument(documentId);\n }\n\n }\n\n if (documents.length > 0) {\n await index.addDocuments(documents);\n }\n } else {\n const documentId = doc.id;\n const shouldIndex = collectionConfig?.shouldIndex?.(doc, previousDoc) ?? 'index'\n if (shouldIndex === 'index') {\n const transformedDoc = {\n ...await transformDocumentForMeilisearch(doc, collection.fields, req),\n id: documentId,\n documentId: doc.id,\n };\n await index.addDocuments([transformedDoc]);\n } else if (shouldIndex === 'delete') {\n await index.deleteDocument(documentId);\n }\n }\n}\n\nconst handleAfterChange: (config: MeilisearchConfig) => CollectionAfterChangeHook = (config) => {\n return async function ({ collection, doc, previousDoc, req }) {\n\n req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id}`);\n\n if (doc?._status === 'draft' && previousDoc?._status === 'draft') {\n req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id} - skipping consecutive draft change`);\n return;\n }\n try {\n\n await Promise.any([\n processDocument(doc, previousDoc, collection, config, req).catch((error) => {\n console.error('Meilisearch indexing error:', error);\n }),\n new Promise((resolve) => setTimeout(resolve, 500)),\n ]);\n\n } catch (error) {\n console.error('Meilisearch indexing error:', error);\n }\n }\n}\n\nconst afterDeleteHook: (config: MeilisearchConfig) => CollectionAfterDeleteHook = (config) => {\n return async ({ collection, doc, req }) => {\n try {\n\n const payload: Payload = req.payload;\n\n const localization = payload.config?.localization;\n\n const client = getMeilisearchClient(config);\n await upsertIndex(client, getIndexName(config, collection.slug));\n const index = client.index(getIndexName(config, collection.slug));\n\n if (localization && localization.locales?.length > 0) {\n\n const {\n locales,\n } = localization;\n\n for (const locale of locales) {\n\n const documentId = doc.id + `_${locale.code}`;\n await index.deleteDocument(documentId);\n\n }\n } else {\n await index.deleteDocument(doc.id);\n }\n\n } catch (error) {\n console.error('Meilisearch indexing error:', error);\n }\n }\n}\n\nlet meilisearch: MeiliSearch;\n\nfunction getMeilisearchClient(config: MeilisearchConfig) {\n if (!meilisearch) {\n meilisearch = new MeiliSearch({\n apiKey: config.apiKey,\n host: config.host,\n });\n\n }\n return meilisearch;\n}\n\nasync function upsertIndex(client: MeiliSearch, indexUID: string) {\n try {\n // Attempt to retrieve the index\n await client.getIndex(indexUID)\n } catch (error) {\n // Check if the error is because the index was not found\n // @ts-ignore\n if (error?.cause?.code === 'index_not_found') {\n // Index doesn't exist; create it\n await client.createIndex(indexUID, {\n primaryKey: 'id',\n })\n console.log(`Index '${indexUID}' has been created.`)\n } else {\n // Rethrow any other errors\n throw error\n }\n }\n}\n\n\nconst options = {\n wordwrap: 130,\n // ...\n};\n\nconst compiledConvert = compile(options);\n\n// Helper function to extract text from HTML in nodejs\nfunction extractTextFromHTML(html: string): string {\n return compiledConvert(html);\n}\n\n// Helper function to transform a document for Meilisearch indexing\nasync function transformDocumentForMeilisearch(doc: any, fields: Field[], req: PayloadRequest): Promise<any> {\n\n const transformedDoc: any = {};\n\n await Promise.all(fields.map(async (field) => {\n try {\n\n if (field.type === 'richText') {\n // For rich text fields, convert Lexical to HTML, then extract text\n\n const lexicalAdapter: LexicalRichTextAdapter =\n field.editor as LexicalRichTextAdapter\n\n const sanitizedServerEditorConfig: SanitizedServerEditorConfig = lexicalAdapter.editorConfig\n\n const html = await convertLexicalToHTML({\n converters: consolidateHTMLConverters({ editorConfig: sanitizedServerEditorConfig }),\n data: doc[field.name],\n });\n\n transformedDoc[field.name] = extractTextFromHTML(html);\n\n } else if (field.type === 'array' && field.fields) {\n // For array fields, transform each item\n transformedDoc[field.name] = await Promise.all(\n (doc[field.name] || []).map((item: any) =>\n transformDocumentForMeilisearch(item, field.fields, req)\n )\n );\n } else if (field.type === 'tabs') {\n // For tab fields, transform each tab\n (await Promise.all(\n field.tabs.map(async (tab: Tab) => {\n if ('name' in tab && tab.name) {\n return {\n [tab.name]: await transformDocumentForMeilisearch(doc?.[tab.name] ?? {}, tab.fields, req),\n }\n }\n return await transformDocumentForMeilisearch(doc, tab.fields, req)\n })\n )).forEach((t: any) => Object.assign(transformedDoc, t));\n } else if (field.type === 'blocks') {\n\n // For block fields, transform each block\n transformedDoc[field.name] = await Promise.all(\n (doc[field.name] || []).map(async (block: any) => {\n const fields = field.blocks.find((b: Block) => b.slug === block.blockType)?.fields\n\n if (!fields) {\n return {\n type: block.blockType,\n data: \"\",\n }\n }\n\n return {\n type: block.blockType,\n data: await transformDocumentForMeilisearch(block, fields, req),\n };\n })\n );\n } else if (field.type === 'radio') {\n transformedDoc[field.name] = doc[field.name]\n\n } else if (field.type === 'group' && field.name && field.fields) {\n // For group fields, transform the nested fields\n transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req);\n } else if (field.type === 'group' && !field.name && field.fields) {\n Object.assign(\n transformedDoc,\n await transformDocumentForMeilisearch(doc, field.fields, req)\n );\n } else if (field.type === 'row' && field.fields) {\n Object.assign(\n transformedDoc,\n await transformDocumentForMeilisearch(doc, field.fields, req)\n );\n } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && field.hasMany) {\n transformedDoc[field.name] = doc[field.name]?.map((relatedDoc: any) => {\n return {\n id: relatedDoc?.value?.id ?? relatedDoc?.value ?? '',\n relationTo: relatedDoc?.relationTo ?? '',\n }\n }) ?? [];\n } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && !field.hasMany) {\n transformedDoc[field.name] = {\n id: doc?.[field.name]?.value?.id ?? doc?.[field.name]?.value ?? '',\n relationTo: doc?.[field.name]?.relationTo ?? '',\n }\n } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && field.hasMany) {\n transformedDoc[field.name] = doc[field.name]?.map((relatedDoc: any) => {\n return relatedDoc?.id ?? relatedDoc?.value ?? '';\n }) ?? [];\n } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && !field.hasMany) {\n transformedDoc[field.name] = doc?.[field.name]?.id ?? doc?.[field.name] ?? '';\n } else if (field.type === 'relationship' || field.type === 'upload') {\n // For relationship and upload fields, just include the ID\n\n transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];\n } else {\n // For other field types, include as-is\n // @ts-ignore\n transformedDoc[field.name] = doc[field.name];\n }\n } catch (err) {\n console.log(err, field, doc)\n }\n }));\n\n return transformedDoc;\n}"],"names":["consolidateHTMLConverters","convertLexicalToHTML","compile","MeiliSearch","getIndexName","config","collectionSlug","indexPrefix","reindexCollection","collection","req","context","meiliSkipDelay","entries","payload","find","slug","draft","pagination","select","id","client","getMeilisearchClient","upsertIndex","index","deleteAllDocuments","entry","docs","handleAfterChange","doc","operation","previousDoc","indexCollection","hooks","afterChange","push","afterDelete","afterDeleteHook","processDocument","Promise","resolve","setTimeout","baseDoc","collectionConfig","collections","c","documents","localization","locales","length","defaultLocale","fallback","locale","localizedDoc","findByID","fallbackLocale","code","overrideAccess","documentId","deleteDocument","shouldIndex","transformedDoc","transformDocumentForMeilisearch","fields","addDocuments","logger","info","_status","any","catch","error","console","meilisearch","apiKey","host","indexUID","getIndex","cause","createIndex","primaryKey","log","options","wordwrap","compiledConvert","extractTextFromHTML","html","all","map","field","type","lexicalAdapter","editor","sanitizedServerEditorConfig","editorConfig","converters","data","name","item","tabs","tab","forEach","t","Object","assign","block","blocks","b","blockType","Array","isArray","relationTo","hasMany","relatedDoc","value","err"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/indexCollections.ts"],"sourcesContent":["import type {\n LexicalRichTextAdapter,\n SanitizedServerEditorConfig\n} from '@payloadcms/richtext-lexical';\nimport type { Block, CollectionAfterChangeHook, CollectionAfterDeleteHook, CollectionConfig, Field, Option, Payload, PayloadRequest, SanitizedCollectionConfig, SelectField, Tab } from \"payload\";\n\nimport {\n consolidateHTMLConverters,\n convertLexicalToHTML,\n} from '@payloadcms/richtext-lexical';\nimport { compile } from 'html-to-text';\nimport { MeiliSearch } from 'meilisearch';\n\nimport type { IndexSelectLabels, IndexSelectLabelsConfig, MeilisearchConfig } from \"./index.js\";\n\n\nconst getIndexName = (config: MeilisearchConfig, collectionSlug: string) => `${config?.indexPrefix ?? ''}${collectionSlug}`;\n\nexport const reindexCollection = async (collection: SanitizedCollectionConfig, config: MeilisearchConfig, req: PayloadRequest) => {\n\n req.context.meiliSkipDelay = true;\n\n const entries = await req.payload.find({\n collection: collection.slug,\n draft: false,\n pagination: false,\n select: {\n id: true,\n },\n });\n\n const client = getMeilisearchClient(config);\n await upsertIndex(client, getIndexName(config, collection.slug));\n const index = client.index(getIndexName(config, collection.slug));\n\n await index.deleteAllDocuments();\n\n\n for (const entry of entries.docs) {\n await handleAfterChange(config)({\n collection,\n context: req.context,\n doc: entry,\n operation: \"update\",\n previousDoc: null,\n req,\n })\n }\n}\n\nexport const indexCollection = (collection: CollectionConfig, config: MeilisearchConfig) => {\n\n if (!collection.hooks) {\n collection.hooks = {};\n }\n\n if (!collection.hooks.afterChange) {\n collection.hooks.afterChange = [];\n }\n\n collection.hooks.afterChange.push(handleAfterChange(config));\n\n if (!collection.hooks.afterDelete) {\n collection.hooks.afterDelete = [];\n }\n\n collection.hooks.afterDelete.push(afterDeleteHook(config));\n}\n\nconst processDocument = async (doc: any, previousDoc: any, collection: CollectionConfig, config: MeilisearchConfig, req: PayloadRequest) => {\n\n // wait for 50ms to allow for the document to be saved to the database to make things more reliable\n if (!req.context?.meiliSkipDelay) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n const baseDoc = doc;\n const collectionConfig = config.collections && config?.collections.find(c => c.slug === collection.slug);\n\n const payload: Payload = req.payload;\n\n const client = getMeilisearchClient(config);\n await upsertIndex(client, getIndexName(config, collection.slug));\n const index = client.index(getIndexName(config, collection.slug));\n\n const documents = [];\n\n if (payload.config?.localization && payload.config.localization.locales?.length > 0) {\n\n const {\n defaultLocale,\n fallback,\n locales,\n } = payload.config.localization;\n\n for (const locale of locales) {\n\n const localizedDoc = await req.payload.findByID({\n id: doc.id,\n collection: collection.slug,\n draft: false,\n fallbackLocale: locale.fallbackLocale || defaultLocale,\n locale: locale.code,\n overrideAccess: true,\n });\n\n const documentId = doc.id + `_${locale.code}`;\n\n if (!localizedDoc) {\n await index.deleteDocument(documentId);\n continue;\n }\n const shouldIndex = collectionConfig?.shouldIndex?.(localizedDoc, previousDoc, locale.code) ?? 'index'\n if (shouldIndex === 'index') {\n const transformedDoc = {\n ...await transformDocumentForMeilisearch(localizedDoc, collection.fields, req, {\n indexSelectLabels: collectionConfig?.indexSelectLabels ?? config.indexSelectLabels,\n locale: locale.code,\n }),\n id: documentId,\n documentId: doc.id,\n locale: locale.code,\n };\n documents.push(transformedDoc);\n } else if (shouldIndex === 'delete') {\n await index.deleteDocument(documentId);\n }\n\n }\n\n if (documents.length > 0) {\n await index.addDocuments(documents);\n }\n } else {\n const documentId = doc.id;\n const shouldIndex = collectionConfig?.shouldIndex?.(doc, previousDoc) ?? 'index'\n if (shouldIndex === 'index') {\n const transformedDoc = {\n ...await transformDocumentForMeilisearch(doc, collection.fields, req, {\n indexSelectLabels: collectionConfig?.indexSelectLabels ?? config.indexSelectLabels,\n }),\n id: documentId,\n documentId: doc.id,\n };\n await index.addDocuments([transformedDoc]);\n } else if (shouldIndex === 'delete') {\n await index.deleteDocument(documentId);\n }\n }\n}\n\nconst handleAfterChange: (config: MeilisearchConfig) => CollectionAfterChangeHook = (config) => {\n return async function ({ collection, doc, previousDoc, req }) {\n\n req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id}`);\n\n if (doc?._status === 'draft' && previousDoc?._status === 'draft') {\n req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id} - skipping consecutive draft change`);\n return;\n }\n try {\n\n await Promise.any([\n processDocument(doc, previousDoc, collection, config, req).catch((error) => {\n console.error('Meilisearch indexing error:', error);\n }),\n new Promise((resolve) => setTimeout(resolve, 500)),\n ]);\n\n } catch (error) {\n console.error('Meilisearch indexing error:', error);\n }\n }\n}\n\nconst afterDeleteHook: (config: MeilisearchConfig) => CollectionAfterDeleteHook = (config) => {\n return async ({ collection, doc, req }) => {\n try {\n\n const payload: Payload = req.payload;\n\n const localization = payload.config?.localization;\n\n const client = getMeilisearchClient(config);\n await upsertIndex(client, getIndexName(config, collection.slug));\n const index = client.index(getIndexName(config, collection.slug));\n\n if (localization && localization.locales?.length > 0) {\n\n const {\n locales,\n } = localization;\n\n for (const locale of locales) {\n\n const documentId = doc.id + `_${locale.code}`;\n await index.deleteDocument(documentId);\n\n }\n } else {\n await index.deleteDocument(doc.id);\n }\n\n } catch (error) {\n console.error('Meilisearch indexing error:', error);\n }\n }\n}\n\nlet meilisearch: MeiliSearch;\n\nfunction getMeilisearchClient(config: MeilisearchConfig) {\n if (!meilisearch) {\n meilisearch = new MeiliSearch({\n apiKey: config.apiKey,\n host: config.host,\n });\n\n }\n return meilisearch;\n}\n\nasync function upsertIndex(client: MeiliSearch, indexUID: string) {\n try {\n // Attempt to retrieve the index\n await client.getIndex(indexUID)\n } catch (error) {\n // Check if the error is because the index was not found\n // @ts-ignore\n if (error?.cause?.code === 'index_not_found') {\n // Index doesn't exist; create it\n await client.createIndex(indexUID, {\n primaryKey: 'id',\n })\n console.log(`Index '${indexUID}' has been created.`)\n } else {\n // Rethrow any other errors\n throw error\n }\n }\n}\n\n\nconst options = {\n wordwrap: 130,\n // ...\n};\n\nconst compiledConvert = compile(options);\n\n// Helper function to extract text from HTML in nodejs\nfunction extractTextFromHTML(html: string): string {\n return compiledConvert(html);\n}\n\nexport type TransformOptions = {\n indexSelectLabels?: IndexSelectLabels\n locale?: string\n}\n\nconst normalizeLocale = (locale: string) => locale.replaceAll('_', '-').toLowerCase()\n\nexport const getSelectLabelLocaleFallbacks = (\n locale: string | undefined,\n defaultLocale: string | undefined,\n): string[] => {\n const fallbacks: string[] = []\n\n const addLocaleAndParents = (value: string | undefined) => {\n if (!value) {\n return\n }\n\n const parts = value.replaceAll('_', '-').split('-').filter(Boolean)\n while (parts.length > 0) {\n const candidate = parts.join('-')\n if (!fallbacks.some((item) => normalizeLocale(item) === normalizeLocale(candidate))) {\n fallbacks.push(candidate)\n }\n parts.pop()\n }\n }\n\n addLocaleAndParents(locale)\n addLocaleAndParents(defaultLocale)\n\n return fallbacks\n}\n\nconst getDefaultSelectLabel = (\n option: Option,\n localeFallbacks: string[],\n): string | undefined => {\n if (typeof option === 'string') {\n return option\n }\n\n if (typeof option.label === 'string') {\n return option.label\n }\n\n if (typeof option.label === 'function') {\n return undefined\n }\n\n for (const locale of localeFallbacks) {\n const matchingKey = Object.keys(option.label).find(\n (key) => normalizeLocale(key) === normalizeLocale(locale),\n )\n if (matchingKey && option.label[matchingKey]) {\n return option.label[matchingKey]\n }\n }\n\n return undefined\n}\n\nconst getSelectedOption = (field: SelectField, value: string): Option | undefined =>\n field.options.find((option) => (\n typeof option === 'string' ? option === value : option.value === value\n ))\n\nconst transformSelectLabels = async ({\n field,\n locale,\n options,\n req,\n value,\n}: {\n field: SelectField\n locale?: string\n options: IndexSelectLabelsConfig\n req: PayloadRequest\n value: unknown\n}): Promise<string | string[] | undefined> => {\n const defaultLocale = options.defaultLocale ?? req.payload.config.i18n.fallbackLanguage\n const localeFallbacks = getSelectLabelLocaleFallbacks(locale, defaultLocale)\n\n const resolveValue = async (selectedValue: unknown): Promise<string | undefined> => {\n if (typeof selectedValue !== 'string') {\n return undefined\n }\n\n const option = getSelectedOption(field, selectedValue)\n if (!option) {\n return undefined\n }\n\n const defaultLabel = getDefaultSelectLabel(option, localeFallbacks)\n if (!options.resolveLabel) {\n return defaultLabel\n }\n\n const resolvedLabel = await options.resolveLabel({\n defaultLabel,\n field,\n locale,\n localeFallbacks,\n option,\n req,\n value: selectedValue,\n })\n\n return resolvedLabel === undefined ? defaultLabel : resolvedLabel ?? undefined\n }\n\n if (Array.isArray(value)) {\n const labels = (await Promise.all(value.map(resolveValue))).filter(\n (label): label is string => typeof label === 'string',\n )\n return labels.length > 0 ? labels : undefined\n }\n\n return resolveValue(value)\n}\n\n// Helper function to transform a document for Meilisearch indexing\nexport async function transformDocumentForMeilisearch(\n doc: any,\n fields: Field[],\n req: PayloadRequest,\n options: TransformOptions = {},\n): Promise<any> {\n\n const transformedDoc: any = {};\n\n await Promise.all(fields.map(async (field) => {\n try {\n\n if (field.type === 'richText') {\n // For rich text fields, convert Lexical to HTML, then extract text\n\n const lexicalAdapter: LexicalRichTextAdapter =\n field.editor as LexicalRichTextAdapter\n\n const sanitizedServerEditorConfig: SanitizedServerEditorConfig = lexicalAdapter.editorConfig\n\n const html = await convertLexicalToHTML({\n converters: consolidateHTMLConverters({ editorConfig: sanitizedServerEditorConfig }),\n data: doc[field.name],\n });\n\n transformedDoc[field.name] = extractTextFromHTML(html);\n\n } else if (field.type === 'array' && field.fields) {\n // For array fields, transform each item\n transformedDoc[field.name] = await Promise.all(\n (doc[field.name] || []).map((item: any) =>\n transformDocumentForMeilisearch(item, field.fields, req, options)\n )\n );\n } else if (field.type === 'tabs') {\n // For tab fields, transform each tab\n (await Promise.all(\n field.tabs.map(async (tab: Tab) => {\n if ('name' in tab && tab.name) {\n return {\n [tab.name]: await transformDocumentForMeilisearch(doc?.[tab.name] ?? {}, tab.fields, req, options),\n }\n }\n return await transformDocumentForMeilisearch(doc, tab.fields, req, options)\n })\n )).forEach((t: any) => Object.assign(transformedDoc, t));\n } else if (field.type === 'blocks') {\n\n // For block fields, transform each block\n transformedDoc[field.name] = await Promise.all(\n (doc[field.name] || []).map(async (block: any) => {\n const fields = field.blocks.find((b: Block) => b.slug === block.blockType)?.fields\n\n if (!fields) {\n return {\n type: block.blockType,\n data: \"\",\n }\n }\n\n return {\n type: block.blockType,\n data: await transformDocumentForMeilisearch(block, fields, req, options),\n };\n })\n );\n } else if (field.type === 'select') {\n transformedDoc[field.name] = doc[field.name]\n\n if (options.indexSelectLabels) {\n const selectLabelOptions = options.indexSelectLabels === true\n ? {}\n : options.indexSelectLabels\n const label = await transformSelectLabels({\n field,\n locale: options.locale,\n options: selectLabelOptions,\n req,\n value: doc[field.name],\n })\n\n if (label !== undefined) {\n transformedDoc[`${field.name}${selectLabelOptions.fieldSuffix ?? '_label'}`] = label\n }\n }\n } else if (field.type === 'radio') {\n transformedDoc[field.name] = doc[field.name]\n\n } else if (field.type === 'group' && field.name && field.fields) {\n // For group fields, transform the nested fields\n transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req, options);\n } else if (field.type === 'group' && !field.name && field.fields) {\n Object.assign(\n transformedDoc,\n await transformDocumentForMeilisearch(doc, field.fields, req, options)\n );\n } else if ((field.type === 'row' || field.type === 'collapsible') && field.fields) {\n Object.assign(\n transformedDoc,\n await transformDocumentForMeilisearch(doc, field.fields, req, options)\n );\n } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && field.hasMany) {\n transformedDoc[field.name] = doc[field.name]?.map((relatedDoc: any) => {\n return {\n id: relatedDoc?.value?.id ?? relatedDoc?.value ?? '',\n relationTo: relatedDoc?.relationTo ?? '',\n }\n }) ?? [];\n } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && !field.hasMany) {\n transformedDoc[field.name] = {\n id: doc?.[field.name]?.value?.id ?? doc?.[field.name]?.value ?? '',\n relationTo: doc?.[field.name]?.relationTo ?? '',\n }\n } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && field.hasMany) {\n transformedDoc[field.name] = doc[field.name]?.map((relatedDoc: any) => {\n return relatedDoc?.id ?? relatedDoc?.value ?? '';\n }) ?? [];\n } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && !field.hasMany) {\n transformedDoc[field.name] = doc?.[field.name]?.id ?? doc?.[field.name] ?? '';\n } else if (field.type === 'relationship' || field.type === 'upload') {\n // For relationship and upload fields, just include the ID\n\n transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];\n } else {\n // For other field types, include as-is\n // @ts-ignore\n transformedDoc[field.name] = doc[field.name];\n }\n } catch (err) {\n console.log(err, field, doc)\n }\n }));\n\n return transformedDoc;\n}\n"],"names":["consolidateHTMLConverters","convertLexicalToHTML","compile","MeiliSearch","getIndexName","config","collectionSlug","indexPrefix","reindexCollection","collection","req","context","meiliSkipDelay","entries","payload","find","slug","draft","pagination","select","id","client","getMeilisearchClient","upsertIndex","index","deleteAllDocuments","entry","docs","handleAfterChange","doc","operation","previousDoc","indexCollection","hooks","afterChange","push","afterDelete","afterDeleteHook","processDocument","Promise","resolve","setTimeout","baseDoc","collectionConfig","collections","c","documents","localization","locales","length","defaultLocale","fallback","locale","localizedDoc","findByID","fallbackLocale","code","overrideAccess","documentId","deleteDocument","shouldIndex","transformedDoc","transformDocumentForMeilisearch","fields","indexSelectLabels","addDocuments","logger","info","_status","any","catch","error","console","meilisearch","apiKey","host","indexUID","getIndex","cause","createIndex","primaryKey","log","options","wordwrap","compiledConvert","extractTextFromHTML","html","normalizeLocale","replaceAll","toLowerCase","getSelectLabelLocaleFallbacks","fallbacks","addLocaleAndParents","value","parts","split","filter","Boolean","candidate","join","some","item","pop","getDefaultSelectLabel","option","localeFallbacks","label","undefined","matchingKey","Object","keys","key","getSelectedOption","field","transformSelectLabels","i18n","fallbackLanguage","resolveValue","selectedValue","defaultLabel","resolveLabel","resolvedLabel","Array","isArray","labels","all","map","type","lexicalAdapter","editor","sanitizedServerEditorConfig","editorConfig","converters","data","name","tabs","tab","forEach","t","assign","block","blocks","b","blockType","selectLabelOptions","fieldSuffix","relationTo","hasMany","relatedDoc","err"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@extravirgin/payload-plugin-meilisearch",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "homepage:": "https://extravirgin.ch",
5
5
  "description": "Index your payload collections to meilisearch",
6
6
  "license": "MIT",