@extravirgin/payload-plugin-meilisearch 0.0.7 → 0.0.9

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.
@@ -1,4 +1,4 @@
1
- import { CollectionConfig, PayloadRequest, SanitizedCollectionConfig } from "payload";
2
- import { MeilisearchConfig } from "./index.js";
1
+ import type { CollectionConfig, PayloadRequest, SanitizedCollectionConfig } from "payload";
2
+ import type { 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;
@@ -1,16 +1,16 @@
1
- import { MeiliSearch } from 'meilisearch';
1
+ import { consolidateHTMLConverters, convertLexicalToHTML } from '@payloadcms/richtext-lexical';
2
2
  import { compile } from 'html-to-text';
3
- import { convertLexicalToHTML, consolidateHTMLConverters } from '@payloadcms/richtext-lexical';
3
+ import { MeiliSearch } from 'meilisearch';
4
4
  const getIndexName = (config, collectionSlug)=>`${config?.indexPrefix ?? ''}${collectionSlug}`;
5
5
  export const reindexCollection = async (collection, config, req)=>{
6
6
  req.context.meiliSkipDelay = true;
7
7
  const entries = await req.payload.find({
8
8
  collection: collection.slug,
9
+ draft: false,
9
10
  pagination: false,
10
11
  select: {
11
12
  id: true
12
- },
13
- draft: false
13
+ }
14
14
  });
15
15
  const client = getMeilisearchClient(config);
16
16
  await upsertIndex(client, getIndexName(config, collection.slug));
@@ -18,12 +18,12 @@ export const reindexCollection = async (collection, config, req)=>{
18
18
  await index.deleteAllDocuments();
19
19
  for (const entry of entries.docs){
20
20
  await handleAfterChange(config)({
21
- doc: entry,
22
- previousDoc: null,
23
- req,
21
+ collection,
24
22
  context: req.context,
23
+ doc: entry,
25
24
  operation: "update",
26
- collection
25
+ previousDoc: null,
26
+ req
27
27
  });
28
28
  }
29
29
  };
@@ -45,7 +45,7 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
45
45
  if (!req.context?.meiliSkipDelay) {
46
46
  await new Promise((resolve)=>setTimeout(resolve, 50));
47
47
  }
48
- let baseDoc = doc;
48
+ const baseDoc = doc;
49
49
  const collectionConfig = config.collections && config?.collections.find((c)=>c.slug === collection.slug);
50
50
  const payload = req.payload;
51
51
  const client = getMeilisearchClient(config);
@@ -53,15 +53,15 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
53
53
  const index = client.index(getIndexName(config, collection.slug));
54
54
  const documents = [];
55
55
  if (payload.config?.localization && payload.config.localization.locales?.length > 0) {
56
- const { locales, defaultLocale, fallback } = payload.config.localization;
56
+ const { defaultLocale, fallback, locales } = payload.config.localization;
57
57
  for (const locale of locales){
58
58
  const localizedDoc = await req.payload.findByID({
59
- collection: collection.slug,
60
59
  id: doc.id,
61
- locale: locale.code,
60
+ collection: collection.slug,
62
61
  draft: false,
63
- overrideAccess: true,
64
- fallbackLocale: locale.fallbackLocale || defaultLocale
62
+ fallbackLocale: locale.fallbackLocale || defaultLocale,
63
+ locale: locale.code,
64
+ overrideAccess: true
65
65
  });
66
66
  const documentId = doc.id + `_${locale.code}`;
67
67
  if (!localizedDoc) {
@@ -102,21 +102,23 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
102
102
  }
103
103
  };
104
104
  const handleAfterChange = (config)=>{
105
- return async function({ doc, previousDoc, req, collection }) {
105
+ return async function({ collection, doc, previousDoc, req }) {
106
106
  req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id}`);
107
107
  if (doc?._status === 'draft' && previousDoc?._status === 'draft') {
108
108
  req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id} - skipping consecutive draft change`);
109
109
  return;
110
110
  }
111
111
  try {
112
- processDocument(doc, previousDoc, collection, config, req);
112
+ processDocument(doc, previousDoc, collection, config, req).catch((error)=>{
113
+ console.error('Meilisearch indexing error:', error);
114
+ });
113
115
  } catch (error) {
114
116
  console.error('Meilisearch indexing error:', error);
115
117
  }
116
118
  };
117
119
  };
118
120
  const afterDeleteHook = (config)=>{
119
- return async ({ doc, req, collection })=>{
121
+ return async ({ collection, doc, req })=>{
120
122
  try {
121
123
  const payload = req.payload;
122
124
  const localization = payload.config?.localization;
@@ -141,8 +143,8 @@ let meilisearch;
141
143
  function getMeilisearchClient(config) {
142
144
  if (!meilisearch) {
143
145
  meilisearch = new MeiliSearch({
144
- host: config.host,
145
- apiKey: config.apiKey
146
+ apiKey: config.apiKey,
147
+ host: config.host
146
148
  });
147
149
  }
148
150
  return meilisearch;
@@ -178,54 +180,78 @@ function extractTextFromHTML(html) {
178
180
  async function transformDocumentForMeilisearch(doc, fields, req) {
179
181
  const transformedDoc = {};
180
182
  await Promise.all(fields.map(async (field)=>{
181
- if (field.type === 'richText') {
182
- // For rich text fields, convert Lexical to HTML, then extract text
183
- const lexicalAdapter = field.editor;
184
- const sanitizedServerEditorConfig = lexicalAdapter.editorConfig;
185
- const html = await convertLexicalToHTML({
186
- converters: consolidateHTMLConverters({
187
- editorConfig: sanitizedServerEditorConfig
188
- }),
189
- data: doc[field.name]
190
- });
191
- transformedDoc[field.name] = extractTextFromHTML(html);
192
- } else if (field.type === 'array' && field.fields) {
193
- // For array fields, transform each item
194
- transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map((item)=>transformDocumentForMeilisearch(item, field.fields, req)));
195
- } else if (field.type === 'tabs') {
196
- // For tab fields, transform each tab
197
- (await Promise.all(field.tabs.map(async (tab)=>{
198
- return await transformDocumentForMeilisearch(doc, tab.fields, req);
199
- }))).forEach((t)=>Object.assign(transformedDoc, t));
200
- } else if (field.type === 'blocks') {
201
- // For block fields, transform each block
202
- transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map(async (block)=>{
203
- const fields = field.blocks.find((b)=>b.slug === block.blockType)?.fields;
204
- if (!fields) {
183
+ try {
184
+ if (field.type === 'richText') {
185
+ // For rich text fields, convert Lexical to HTML, then extract text
186
+ const lexicalAdapter = field.editor;
187
+ const sanitizedServerEditorConfig = lexicalAdapter.editorConfig;
188
+ const html = await convertLexicalToHTML({
189
+ converters: consolidateHTMLConverters({
190
+ editorConfig: sanitizedServerEditorConfig
191
+ }),
192
+ data: doc[field.name]
193
+ });
194
+ transformedDoc[field.name] = extractTextFromHTML(html);
195
+ } else if (field.type === 'array' && field.fields) {
196
+ // For array fields, transform each item
197
+ transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map((item)=>transformDocumentForMeilisearch(item, field.fields, req)));
198
+ } else if (field.type === 'tabs') {
199
+ // For tab fields, transform each tab
200
+ (await Promise.all(field.tabs.map(async (tab)=>{
201
+ return await transformDocumentForMeilisearch(doc, tab.fields, req);
202
+ }))).forEach((t)=>Object.assign(transformedDoc, t));
203
+ } else if (field.type === 'blocks') {
204
+ // For block fields, transform each block
205
+ transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map(async (block)=>{
206
+ const fields = field.blocks.find((b)=>b.slug === block.blockType)?.fields;
207
+ if (!fields) {
208
+ return {
209
+ type: block.blockType,
210
+ data: ""
211
+ };
212
+ }
205
213
  return {
206
214
  type: block.blockType,
207
- data: ""
215
+ data: await transformDocumentForMeilisearch(block, fields, req)
208
216
  };
209
- }
210
- return {
211
- type: block.blockType,
212
- data: await transformDocumentForMeilisearch(block, fields, req)
217
+ }));
218
+ } else if (field.type === 'radio') {
219
+ transformedDoc[field.name] = doc[field.name];
220
+ } else if (field.type === 'group' && field.name && field.fields) {
221
+ // For group fields, transform the nested fields
222
+ transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req);
223
+ } else if (field.type === 'group' && !field.name && field.fields) {
224
+ Object.assign(transformedDoc, await transformDocumentForMeilisearch(doc, field.fields, req));
225
+ } else if (field.type === 'row' && field.fields) {
226
+ Object.assign(transformedDoc, await transformDocumentForMeilisearch(doc, field.fields, req));
227
+ } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && field.hasMany) {
228
+ transformedDoc[field.name] = {
229
+ id: doc?.[field.name]?.value?.id ?? doc?.[field.name]?.value ?? '',
230
+ relationTo: doc?.[field.name]?.relationTo ?? ''
213
231
  };
214
- }));
215
- } else if (field.type === 'group' && field.fields) {
216
- // For group fields, transform the nested fields
217
- transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req);
218
- } else if (field.type === 'relationship' || field.type === 'upload') {
219
- // For relationship and upload fields, just include the ID
220
- transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];
221
- } else {
222
- // For other field types, include as-is
223
- try {
232
+ } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && !field.hasMany) {
233
+ transformedDoc[field.name] = doc[field.name]?.map((relatedDoc)=>{
234
+ return {
235
+ id: relatedDoc?.value?.id ?? relatedDoc?.value ?? '',
236
+ relationTo: relatedDoc?.relationTo ?? ''
237
+ };
238
+ }) ?? [];
239
+ } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && field.hasMany) {
240
+ transformedDoc[field.name] = doc[field.name]?.map((relatedDoc)=>{
241
+ return relatedDoc?.id ?? relatedDoc?.value ?? '';
242
+ }) ?? [];
243
+ } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && !field.hasMany) {
244
+ transformedDoc[field.name] = doc?.[field.name]?.id ?? doc?.[field.name] ?? '';
245
+ } else if (field.type === 'relationship' || field.type === 'upload') {
246
+ // For relationship and upload fields, just include the ID
247
+ transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];
248
+ } else {
249
+ // For other field types, include as-is
224
250
  // @ts-ignore
225
251
  transformedDoc[field.name] = doc[field.name];
226
- } catch (err) {
227
- console.log(err, field, doc);
228
252
  }
253
+ } catch (err) {
254
+ console.log(err, field, doc);
229
255
  }
230
256
  }));
231
257
  return transformedDoc;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/indexCollections.ts"],"sourcesContent":["import { CollectionConfig, Field, PayloadRequest, SanitizedCollectionConfig } from \"payload\";\nimport { MeiliSearch } from 'meilisearch';\nimport { compile } from 'html-to-text';\nimport {\n LexicalRichTextAdapter,\n convertLexicalToHTML,\n consolidateHTMLConverters,\n} from '@payloadcms/richtext-lexical';\nimport { CollectionAfterDeleteHook, CollectionAfterChangeHook, Payload, Tab, Block } from \"payload\";\nimport { 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 pagination: false,\n select: {\n id: true,\n },\n draft: false,\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 doc: entry,\n previousDoc: null,\n req,\n context: req.context,\n operation: \"update\",\n collection,\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 let 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 locales,\n defaultLocale,\n fallback,\n } = payload.config.localization;\n\n for (const locale of locales) {\n\n const localizedDoc = await req.payload.findByID({\n collection: collection.slug,\n id: doc.id,\n locale: locale.code,\n draft: false,\n overrideAccess: true,\n fallbackLocale: locale.fallbackLocale || defaultLocale,\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 ({ doc, previousDoc, req, collection }) {\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 processDocument(doc, previousDoc, collection, config, req);\n\n } catch (error) {\n console.error('Meilisearch indexing error:', error);\n }\n }\n}\n\nconst afterDeleteHook: (config: MeilisearchConfig) => CollectionAfterDeleteHook = (config) => {\n return async ({ doc, req, collection }) => {\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 host: config.host,\n apiKey: config.apiKey,\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 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: any = 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 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\n } else if (field.type === 'group' && 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 === 'relationship' || field.type === 'upload') {\n // For relationship and upload fields, just include the ID\n transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];\n } else {\n // For other field types, include as-is\n try {\n // @ts-ignore\n transformedDoc[field.name] = doc[field.name];\n } catch (err) {\n console.log(err, field, doc)\n }\n }\n }));\n\n return transformedDoc;\n}"],"names":["MeiliSearch","compile","convertLexicalToHTML","consolidateHTMLConverters","getIndexName","config","collectionSlug","indexPrefix","reindexCollection","collection","req","context","meiliSkipDelay","entries","payload","find","slug","pagination","select","id","draft","client","getMeilisearchClient","upsertIndex","index","deleteAllDocuments","entry","docs","handleAfterChange","doc","previousDoc","operation","indexCollection","hooks","afterChange","push","afterDelete","afterDeleteHook","processDocument","Promise","resolve","setTimeout","baseDoc","collectionConfig","collections","c","documents","localization","locales","length","defaultLocale","fallback","locale","localizedDoc","findByID","code","overrideAccess","fallbackLocale","documentId","deleteDocument","shouldIndex","transformedDoc","transformDocumentForMeilisearch","fields","addDocuments","logger","info","_status","error","console","meilisearch","host","apiKey","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","err"],"mappings":"AACA,SAASA,WAAW,QAAQ,cAAc;AAC1C,SAASC,OAAO,QAAQ,eAAe;AACvC,SAEEC,oBAAoB,EACpBC,yBAAyB,QACpB,+BAA+B;AAKtC,MAAMC,eAAe,CAACC,QAA2BC,iBAA2B,GAAGD,QAAQE,eAAe,KAAKD,gBAAgB;AAE3H,OAAO,MAAME,oBAAoB,OAAOC,YAAuCJ,QAA2BK;IAExGA,IAAIC,OAAO,CAACC,cAAc,GAAG;IAE7B,MAAMC,UAAU,MAAMH,IAAII,OAAO,CAACC,IAAI,CAAC;QACrCN,YAAYA,WAAWO,IAAI;QAC3BC,YAAY;QACZC,QAAQ;YACNC,IAAI;QACN;QACAC,OAAO;IACT;IAEA,MAAMC,SAASC,qBAAqBjB;IACpC,MAAMkB,YAAYF,QAAQjB,aAAaC,QAAQI,WAAWO,IAAI;IAC9D,MAAMQ,QAAQH,OAAOG,KAAK,CAACpB,aAAaC,QAAQI,WAAWO,IAAI;IAE/D,MAAMQ,MAAMC,kBAAkB;IAG9B,KAAK,MAAMC,SAASb,QAAQc,IAAI,CAAE;QAChC,MAAMC,kBAAkBvB,QAAQ;YAC9BwB,KAAKH;YACLI,aAAa;YACbpB;YACAC,SAASD,IAAIC,OAAO;YACpBoB,WAAW;YACXtB;QACF;IACF;AACF,EAAC;AAED,OAAO,MAAMuB,kBAAkB,CAACvB,YAA8BJ;IAE5D,IAAI,CAACI,WAAWwB,KAAK,EAAE;QACrBxB,WAAWwB,KAAK,GAAG,CAAC;IACtB;IAEA,IAAI,CAACxB,WAAWwB,KAAK,CAACC,WAAW,EAAE;QACjCzB,WAAWwB,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IAEAzB,WAAWwB,KAAK,CAACC,WAAW,CAACC,IAAI,CAACP,kBAAkBvB;IAEpD,IAAI,CAACI,WAAWwB,KAAK,CAACG,WAAW,EAAE;QACjC3B,WAAWwB,KAAK,CAACG,WAAW,GAAG,EAAE;IACnC;IAEA3B,WAAWwB,KAAK,CAACG,WAAW,CAACD,IAAI,CAACE,gBAAgBhC;AACpD,EAAC;AAED,MAAMiC,kBAAkB,OAAOT,KAAUC,aAAkBrB,YAA8BJ,QAA2BK;IAElH,mGAAmG;IACnG,IAAI,CAACA,IAAIC,OAAO,EAAEC,gBAAgB;QAChC,MAAM,IAAI2B,QAAQ,CAACC,UAAYC,WAAWD,SAAS;IACrD;IAEA,IAAIE,UAAUb;IACd,MAAMc,mBAAmBtC,OAAOuC,WAAW,IAAIvC,QAAQuC,YAAY7B,KAAK8B,CAAAA,IAAKA,EAAE7B,IAAI,KAAKP,WAAWO,IAAI;IAEvG,MAAMF,UAAmBJ,IAAII,OAAO;IAEpC,MAAMO,SAASC,qBAAqBjB;IACpC,MAAMkB,YAAYF,QAAQjB,aAAaC,QAAQI,WAAWO,IAAI;IAC9D,MAAMQ,QAAQH,OAAOG,KAAK,CAACpB,aAAaC,QAAQI,WAAWO,IAAI;IAE/D,MAAM8B,YAAY,EAAE;IAEpB,IAAIhC,QAAQT,MAAM,EAAE0C,gBAAgBjC,QAAQT,MAAM,CAAC0C,YAAY,CAACC,OAAO,EAAEC,SAAS,GAAG;QAEnF,MAAM,EACJD,OAAO,EACPE,aAAa,EACbC,QAAQ,EACT,GAAGrC,QAAQT,MAAM,CAAC0C,YAAY;QAE/B,KAAK,MAAMK,UAAUJ,QAAS;YAE5B,MAAMK,eAAe,MAAM3C,IAAII,OAAO,CAACwC,QAAQ,CAAC;gBAC9C7C,YAAYA,WAAWO,IAAI;gBAC3BG,IAAIU,IAAIV,EAAE;gBACViC,QAAQA,OAAOG,IAAI;gBACnBnC,OAAO;gBACPoC,gBAAgB;gBAChBC,gBAAgBL,OAAOK,cAAc,IAAIP;YAC3C;YAEA,MAAMQ,aAAa7B,IAAIV,EAAE,GAAG,CAAC,CAAC,EAAEiC,OAAOG,IAAI,EAAE;YAE7C,IAAI,CAACF,cAAc;gBACjB,MAAM7B,MAAMmC,cAAc,CAACD;gBAC3B;YACF;YACA,MAAME,cAAcjB,kBAAkBiB,cAAcP,cAAcvB,aAAasB,OAAOG,IAAI,KAAK;YAC/F,IAAIK,gBAAgB,SAAS;gBAC3B,MAAMC,iBAAiB;oBACrB,GAAG,MAAMC,gCAAgCT,cAAc5C,WAAWsD,MAAM,EAAErD,IAAI;oBAC9ES,IAAIuC;oBACJA,YAAY7B,IAAIV,EAAE;oBAClBiC,QAAQA,OAAOG,IAAI;gBACrB;gBACAT,UAAUX,IAAI,CAAC0B;YACjB,OAAO,IAAID,gBAAgB,UAAU;gBACnC,MAAMpC,MAAMmC,cAAc,CAACD;YAC7B;QAEF;QAEA,IAAIZ,UAAUG,MAAM,GAAG,GAAG;YACxB,MAAMzB,MAAMwC,YAAY,CAAClB;QAC3B;IACF,OAAO;QACL,MAAMY,aAAa7B,IAAIV,EAAE;QACzB,MAAMyC,cAAcjB,kBAAkBiB,cAAc/B,KAAKC,gBAAgB;QACzE,IAAI8B,gBAAgB,SAAS;YAC3B,MAAMC,iBAAiB;gBACrB,GAAG,MAAMC,gCAAgCjC,KAAKpB,WAAWsD,MAAM,EAAErD,IAAI;gBACrES,IAAIuC;gBACJA,YAAY7B,IAAIV,EAAE;YACpB;YACA,MAAMK,MAAMwC,YAAY,CAAC;gBAACH;aAAe;QAC3C,OAAO,IAAID,gBAAgB,UAAU;YACnC,MAAMpC,MAAMmC,cAAc,CAACD;QAC7B;IACF;AACF;AAEA,MAAM9B,oBAA8E,CAACvB;IACnF,OAAO,eAAgB,EAAEwB,GAAG,EAAEC,WAAW,EAAEpB,GAAG,EAAED,UAAU,EAAE;QAE1DC,IAAII,OAAO,CAACmD,MAAM,CAACC,IAAI,CAAC,CAAC,gCAAgC,EAAEzD,WAAWO,IAAI,CAAC,UAAU,EAAEa,IAAIV,EAAE,EAAE;QAE/F,IAAIU,KAAKsC,YAAY,WAAWrC,aAAaqC,YAAY,SAAS;YAChEzD,IAAII,OAAO,CAACmD,MAAM,CAACC,IAAI,CAAC,CAAC,gCAAgC,EAAEzD,WAAWO,IAAI,CAAC,UAAU,EAAEa,IAAIV,EAAE,CAAC,oCAAoC,CAAC;YACnI;QACF;QACA,IAAI;YAEFmB,gBAAgBT,KAAKC,aAAarB,YAAYJ,QAAQK;QAExD,EAAE,OAAO0D,OAAO;YACdC,QAAQD,KAAK,CAAC,+BAA+BA;QAC/C;IACF;AACF;AAEA,MAAM/B,kBAA4E,CAAChC;IACjF,OAAO,OAAO,EAAEwB,GAAG,EAAEnB,GAAG,EAAED,UAAU,EAAE;QACpC,IAAI;YAEF,MAAMK,UAAmBJ,IAAII,OAAO;YAEpC,MAAMiC,eAAejC,QAAQT,MAAM,EAAE0C;YAErC,MAAM1B,SAASC,qBAAqBjB;YACpC,MAAMkB,YAAYF,QAAQjB,aAAaC,QAAQI,WAAWO,IAAI;YAC9D,MAAMQ,QAAQH,OAAOG,KAAK,CAACpB,aAAaC,QAAQI,WAAWO,IAAI;YAE/D,IAAI+B,gBAAgBA,aAAaC,OAAO,EAAEC,SAAS,GAAG;gBAEpD,MAAM,EACJD,OAAO,EACR,GAAGD;gBAEJ,KAAK,MAAMK,UAAUJ,QAAS;oBAE5B,MAAMU,aAAa7B,IAAIV,EAAE,GAAG,CAAC,CAAC,EAAEiC,OAAOG,IAAI,EAAE;oBAC7C,MAAM/B,MAAMmC,cAAc,CAACD;gBAE7B;YACF,OAAO;gBACL,MAAMlC,MAAMmC,cAAc,CAAC9B,IAAIV,EAAE;YACnC;QAEF,EAAE,OAAOiD,OAAO;YACdC,QAAQD,KAAK,CAAC,+BAA+BA;QAC/C;IACF;AACF;AAEA,IAAIE;AAEJ,SAAShD,qBAAqBjB,MAAyB;IACrD,IAAI,CAACiE,aAAa;QAChBA,cAAc,IAAItE,YAAY;YAC5BuE,MAAMlE,OAAOkE,IAAI;YACjBC,QAAQnE,OAAOmE,MAAM;QACvB;IAEF;IACA,OAAOF;AACT;AAEA,eAAe/C,YAAYF,MAAmB,EAAEoD,QAAgB;IAC9D,IAAI;QACF,gCAAgC;QAChC,MAAMpD,OAAOqD,QAAQ,CAACD;IACxB,EAAE,OAAOL,OAAO;QACd,wDAAwD;QACxD,aAAa;QACb,IAAIA,OAAOO,OAAOpB,SAAS,mBAAmB;YAC5C,iCAAiC;YACjC,MAAMlC,OAAOuD,WAAW,CAACH,UAAU;gBACjCI,YAAY;YACd;YACAR,QAAQS,GAAG,CAAC,CAAC,OAAO,EAAEL,SAAS,mBAAmB,CAAC;QACrD,OAAO;YACL,2BAA2B;YAC3B,MAAML;QACR;IACF;AACF;AAGA,MAAMW,UAAU;IACdC,UAAU;AAEZ;AAEA,MAAMC,kBAAkBhF,QAAQ8E;AAEhC,sDAAsD;AACtD,SAASG,oBAAoBC,IAAY;IACvC,OAAOF,gBAAgBE;AACzB;AAEA,mEAAmE;AACnE,eAAerB,gCAAgCjC,GAAQ,EAAEkC,MAAe,EAAErD,GAAmB;IAE3F,MAAMmD,iBAAsB,CAAC;IAE7B,MAAMtB,QAAQ6C,GAAG,CAACrB,OAAOsB,GAAG,CAAC,OAAOC;QAClC,IAAIA,MAAMC,IAAI,KAAK,YAAY;YAC7B,mEAAmE;YAEnE,MAAMC,iBACJF,MAAMG,MAAM;YAEd,MAAMC,8BAAmCF,eAAeG,YAAY;YAEpE,MAAMR,OAAO,MAAMjF,qBAAqB;gBACtC0F,YAAYzF,0BAA0B;oBAAEwF,cAAcD;gBAA4B;gBAClFG,MAAMhE,GAAG,CAACyD,MAAMQ,IAAI,CAAC;YACvB;YAEAjC,cAAc,CAACyB,MAAMQ,IAAI,CAAC,GAAGZ,oBAAoBC;QAEnD,OAAO,IAAIG,MAAMC,IAAI,KAAK,WAAWD,MAAMvB,MAAM,EAAE;YACjD,wCAAwC;YACxCF,cAAc,CAACyB,MAAMQ,IAAI,CAAC,GAAG,MAAMvD,QAAQ6C,GAAG,CAC5C,AAACvD,CAAAA,GAAG,CAACyD,MAAMQ,IAAI,CAAC,IAAI,EAAE,AAAD,EAAGT,GAAG,CAAC,CAACU,OAC3BjC,gCAAgCiC,MAAMT,MAAMvB,MAAM,EAAErD;QAG1D,OAAO,IAAI4E,MAAMC,IAAI,KAAK,QAAQ;YAChC,qCAAqC;YACpC,CAAA,MAAMhD,QAAQ6C,GAAG,CAChBE,MAAMU,IAAI,CAACX,GAAG,CAAC,OAAOY;gBACpB,OAAO,MAAMnC,gCAAgCjC,KAAKoE,IAAIlC,MAAM,EAAErD;YAChE,GACF,EAAGwF,OAAO,CAAC,CAACC,IAAWC,OAAOC,MAAM,CAACxC,gBAAgBsC;QACvD,OAAO,IAAIb,MAAMC,IAAI,KAAK,UAAU;YAElC,yCAAyC;YACzC1B,cAAc,CAACyB,MAAMQ,IAAI,CAAC,GAAG,MAAMvD,QAAQ6C,GAAG,CAC5C,AAACvD,CAAAA,GAAG,CAACyD,MAAMQ,IAAI,CAAC,IAAI,EAAE,AAAD,EAAGT,GAAG,CAAC,OAAOiB;gBACjC,MAAMvC,SAASuB,MAAMiB,MAAM,CAACxF,IAAI,CAAC,CAACyF,IAAaA,EAAExF,IAAI,KAAKsF,MAAMG,SAAS,GAAG1C;gBAE5E,IAAI,CAACA,QAAQ;oBACX,OAAO;wBACLwB,MAAMe,MAAMG,SAAS;wBACrBZ,MAAM;oBACR;gBACF;gBAEA,OAAO;oBACLN,MAAMe,MAAMG,SAAS;oBACrBZ,MAAM,MAAM/B,gCAAgCwC,OAAOvC,QAAQrD;gBAC7D;YACF;QAGJ,OAAO,IAAI4E,MAAMC,IAAI,KAAK,WAAWD,MAAMvB,MAAM,EAAE;YACjD,gDAAgD;YAChDF,cAAc,CAACyB,MAAMQ,IAAI,CAAC,GAAG,MAAMhC,gCAAgCjC,GAAG,CAACyD,MAAMQ,IAAI,CAAC,EAAER,MAAMvB,MAAM,EAAErD;QACpG,OAAO,IAAI4E,MAAMC,IAAI,KAAK,kBAAkBD,MAAMC,IAAI,KAAK,UAAU;YACnE,0DAA0D;YAC1D1B,cAAc,CAACyB,MAAMQ,IAAI,CAAC,GAAGjE,GAAG,CAACyD,MAAMQ,IAAI,CAAC,EAAE3E,MAAMU,GAAG,CAACyD,MAAMQ,IAAI,CAAC;QACrE,OAAO;YACL,uCAAuC;YACvC,IAAI;gBACF,aAAa;gBACbjC,cAAc,CAACyB,MAAMQ,IAAI,CAAC,GAAGjE,GAAG,CAACyD,MAAMQ,IAAI,CAAC;YAC9C,EAAE,OAAOY,KAAK;gBACZrC,QAAQS,GAAG,CAAC4B,KAAKpB,OAAOzD;YAC1B;QACF;IACF;IAEA,OAAOgC;AACT"}
1
+ {"version":3,"sources":["../src/indexCollections.ts"],"sourcesContent":["import type {\n LexicalRichTextAdapter\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 processDocument(doc, previousDoc, collection, config, req).catch((error) => {\n console.error('Meilisearch indexing error:', error);\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: any = 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 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] = {\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 {\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] = 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","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","value","relatedDoc","err"],"mappings":"AAKA,SACEA,yBAAyB,EACzBC,oBAAoB,QACf,+BAA+B;AACtC,SAASC,OAAO,QAAQ,eAAe;AACvC,SAASC,WAAW,QAAQ,cAAc;AAK1C,MAAMC,eAAe,CAACC,QAA2BC,iBAA2B,GAAGD,QAAQE,eAAe,KAAKD,gBAAgB;AAE3H,OAAO,MAAME,oBAAoB,OAAOC,YAAuCJ,QAA2BK;IAExGA,IAAIC,OAAO,CAACC,cAAc,GAAG;IAE7B,MAAMC,UAAU,MAAMH,IAAII,OAAO,CAACC,IAAI,CAAC;QACrCN,YAAYA,WAAWO,IAAI;QAC3BC,OAAO;QACPC,YAAY;QACZC,QAAQ;YACNC,IAAI;QACN;IACF;IAEA,MAAMC,SAASC,qBAAqBjB;IACpC,MAAMkB,YAAYF,QAAQjB,aAAaC,QAAQI,WAAWO,IAAI;IAC9D,MAAMQ,QAAQH,OAAOG,KAAK,CAACpB,aAAaC,QAAQI,WAAWO,IAAI;IAE/D,MAAMQ,MAAMC,kBAAkB;IAG9B,KAAK,MAAMC,SAASb,QAAQc,IAAI,CAAE;QAChC,MAAMC,kBAAkBvB,QAAQ;YAC9BI;YACAE,SAASD,IAAIC,OAAO;YACpBkB,KAAKH;YACLI,WAAW;YACXC,aAAa;YACbrB;QACF;IACF;AACF,EAAC;AAED,OAAO,MAAMsB,kBAAkB,CAACvB,YAA8BJ;IAE5D,IAAI,CAACI,WAAWwB,KAAK,EAAE;QACrBxB,WAAWwB,KAAK,GAAG,CAAC;IACtB;IAEA,IAAI,CAACxB,WAAWwB,KAAK,CAACC,WAAW,EAAE;QACjCzB,WAAWwB,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IAEAzB,WAAWwB,KAAK,CAACC,WAAW,CAACC,IAAI,CAACP,kBAAkBvB;IAEpD,IAAI,CAACI,WAAWwB,KAAK,CAACG,WAAW,EAAE;QACjC3B,WAAWwB,KAAK,CAACG,WAAW,GAAG,EAAE;IACnC;IAEA3B,WAAWwB,KAAK,CAACG,WAAW,CAACD,IAAI,CAACE,gBAAgBhC;AACpD,EAAC;AAED,MAAMiC,kBAAkB,OAAOT,KAAUE,aAAkBtB,YAA8BJ,QAA2BK;IAElH,mGAAmG;IACnG,IAAI,CAACA,IAAIC,OAAO,EAAEC,gBAAgB;QAChC,MAAM,IAAI2B,QAAQ,CAACC,UAAYC,WAAWD,SAAS;IACrD;IAEA,MAAME,UAAUb;IAChB,MAAMc,mBAAmBtC,OAAOuC,WAAW,IAAIvC,QAAQuC,YAAY7B,KAAK8B,CAAAA,IAAKA,EAAE7B,IAAI,KAAKP,WAAWO,IAAI;IAEvG,MAAMF,UAAmBJ,IAAII,OAAO;IAEpC,MAAMO,SAASC,qBAAqBjB;IACpC,MAAMkB,YAAYF,QAAQjB,aAAaC,QAAQI,WAAWO,IAAI;IAC9D,MAAMQ,QAAQH,OAAOG,KAAK,CAACpB,aAAaC,QAAQI,WAAWO,IAAI;IAE/D,MAAM8B,YAAY,EAAE;IAEpB,IAAIhC,QAAQT,MAAM,EAAE0C,gBAAgBjC,QAAQT,MAAM,CAAC0C,YAAY,CAACC,OAAO,EAAEC,SAAS,GAAG;QAEnF,MAAM,EACJC,aAAa,EACbC,QAAQ,EACRH,OAAO,EACR,GAAGlC,QAAQT,MAAM,CAAC0C,YAAY;QAE/B,KAAK,MAAMK,UAAUJ,QAAS;YAE5B,MAAMK,eAAe,MAAM3C,IAAII,OAAO,CAACwC,QAAQ,CAAC;gBAC9ClC,IAAIS,IAAIT,EAAE;gBACVX,YAAYA,WAAWO,IAAI;gBAC3BC,OAAO;gBACPsC,gBAAgBH,OAAOG,cAAc,IAAIL;gBACzCE,QAAQA,OAAOI,IAAI;gBACnBC,gBAAgB;YAClB;YAEA,MAAMC,aAAa7B,IAAIT,EAAE,GAAG,CAAC,CAAC,EAAEgC,OAAOI,IAAI,EAAE;YAE7C,IAAI,CAACH,cAAc;gBACjB,MAAM7B,MAAMmC,cAAc,CAACD;gBAC3B;YACF;YACA,MAAME,cAAcjB,kBAAkBiB,cAAcP,cAActB,aAAaqB,OAAOI,IAAI,KAAK;YAC/F,IAAII,gBAAgB,SAAS;gBAC3B,MAAMC,iBAAiB;oBACrB,GAAG,MAAMC,gCAAgCT,cAAc5C,WAAWsD,MAAM,EAAErD,IAAI;oBAC9EU,IAAIsC;oBACJA,YAAY7B,IAAIT,EAAE;oBAClBgC,QAAQA,OAAOI,IAAI;gBACrB;gBACAV,UAAUX,IAAI,CAAC0B;YACjB,OAAO,IAAID,gBAAgB,UAAU;gBACnC,MAAMpC,MAAMmC,cAAc,CAACD;YAC7B;QAEF;QAEA,IAAIZ,UAAUG,MAAM,GAAG,GAAG;YACxB,MAAMzB,MAAMwC,YAAY,CAAClB;QAC3B;IACF,OAAO;QACL,MAAMY,aAAa7B,IAAIT,EAAE;QACzB,MAAMwC,cAAcjB,kBAAkBiB,cAAc/B,KAAKE,gBAAgB;QACzE,IAAI6B,gBAAgB,SAAS;YAC3B,MAAMC,iBAAiB;gBACrB,GAAG,MAAMC,gCAAgCjC,KAAKpB,WAAWsD,MAAM,EAAErD,IAAI;gBACrEU,IAAIsC;gBACJA,YAAY7B,IAAIT,EAAE;YACpB;YACA,MAAMI,MAAMwC,YAAY,CAAC;gBAACH;aAAe;QAC3C,OAAO,IAAID,gBAAgB,UAAU;YACnC,MAAMpC,MAAMmC,cAAc,CAACD;QAC7B;IACF;AACF;AAEA,MAAM9B,oBAA8E,CAACvB;IACnF,OAAO,eAAgB,EAAEI,UAAU,EAAEoB,GAAG,EAAEE,WAAW,EAAErB,GAAG,EAAE;QAE1DA,IAAII,OAAO,CAACmD,MAAM,CAACC,IAAI,CAAC,CAAC,gCAAgC,EAAEzD,WAAWO,IAAI,CAAC,UAAU,EAAEa,IAAIT,EAAE,EAAE;QAE/F,IAAIS,KAAKsC,YAAY,WAAWpC,aAAaoC,YAAY,SAAS;YAChEzD,IAAII,OAAO,CAACmD,MAAM,CAACC,IAAI,CAAC,CAAC,gCAAgC,EAAEzD,WAAWO,IAAI,CAAC,UAAU,EAAEa,IAAIT,EAAE,CAAC,oCAAoC,CAAC;YACnI;QACF;QACA,IAAI;YAEFkB,gBAAgBT,KAAKE,aAAatB,YAAYJ,QAAQK,KAAK0D,KAAK,CAAC,CAACC;gBAChEC,QAAQD,KAAK,CAAC,+BAA+BA;YAC/C;QAEF,EAAE,OAAOA,OAAO;YACdC,QAAQD,KAAK,CAAC,+BAA+BA;QAC/C;IACF;AACF;AAEA,MAAMhC,kBAA4E,CAAChC;IACjF,OAAO,OAAO,EAAEI,UAAU,EAAEoB,GAAG,EAAEnB,GAAG,EAAE;QACpC,IAAI;YAEF,MAAMI,UAAmBJ,IAAII,OAAO;YAEpC,MAAMiC,eAAejC,QAAQT,MAAM,EAAE0C;YAErC,MAAM1B,SAASC,qBAAqBjB;YACpC,MAAMkB,YAAYF,QAAQjB,aAAaC,QAAQI,WAAWO,IAAI;YAC9D,MAAMQ,QAAQH,OAAOG,KAAK,CAACpB,aAAaC,QAAQI,WAAWO,IAAI;YAE/D,IAAI+B,gBAAgBA,aAAaC,OAAO,EAAEC,SAAS,GAAG;gBAEpD,MAAM,EACJD,OAAO,EACR,GAAGD;gBAEJ,KAAK,MAAMK,UAAUJ,QAAS;oBAE5B,MAAMU,aAAa7B,IAAIT,EAAE,GAAG,CAAC,CAAC,EAAEgC,OAAOI,IAAI,EAAE;oBAC7C,MAAMhC,MAAMmC,cAAc,CAACD;gBAE7B;YACF,OAAO;gBACL,MAAMlC,MAAMmC,cAAc,CAAC9B,IAAIT,EAAE;YACnC;QAEF,EAAE,OAAOiD,OAAO;YACdC,QAAQD,KAAK,CAAC,+BAA+BA;QAC/C;IACF;AACF;AAEA,IAAIE;AAEJ,SAASjD,qBAAqBjB,MAAyB;IACrD,IAAI,CAACkE,aAAa;QAChBA,cAAc,IAAIpE,YAAY;YAC5BqE,QAAQnE,OAAOmE,MAAM;YACrBC,MAAMpE,OAAOoE,IAAI;QACnB;IAEF;IACA,OAAOF;AACT;AAEA,eAAehD,YAAYF,MAAmB,EAAEqD,QAAgB;IAC9D,IAAI;QACF,gCAAgC;QAChC,MAAMrD,OAAOsD,QAAQ,CAACD;IACxB,EAAE,OAAOL,OAAO;QACd,wDAAwD;QACxD,aAAa;QACb,IAAIA,OAAOO,OAAOpB,SAAS,mBAAmB;YAC5C,iCAAiC;YACjC,MAAMnC,OAAOwD,WAAW,CAACH,UAAU;gBACjCI,YAAY;YACd;YACAR,QAAQS,GAAG,CAAC,CAAC,OAAO,EAAEL,SAAS,mBAAmB,CAAC;QACrD,OAAO;YACL,2BAA2B;YAC3B,MAAML;QACR;IACF;AACF;AAGA,MAAMW,UAAU;IACdC,UAAU;AAEZ;AAEA,MAAMC,kBAAkBhF,QAAQ8E;AAEhC,sDAAsD;AACtD,SAASG,oBAAoBC,IAAY;IACvC,OAAOF,gBAAgBE;AACzB;AAEA,mEAAmE;AACnE,eAAetB,gCAAgCjC,GAAQ,EAAEkC,MAAe,EAAErD,GAAmB;IAE3F,MAAMmD,iBAAsB,CAAC;IAE7B,MAAMtB,QAAQ8C,GAAG,CAACtB,OAAOuB,GAAG,CAAC,OAAOC;QAClC,IAAI;YAEF,IAAIA,MAAMC,IAAI,KAAK,YAAY;gBAC7B,mEAAmE;gBAEnE,MAAMC,iBACJF,MAAMG,MAAM;gBAEd,MAAMC,8BAAmCF,eAAeG,YAAY;gBAEpE,MAAMR,OAAO,MAAMnF,qBAAqB;oBACtC4F,YAAY7F,0BAA0B;wBAAE4F,cAAcD;oBAA4B;oBAClFG,MAAMjE,GAAG,CAAC0D,MAAMQ,IAAI,CAAC;gBACvB;gBAEAlC,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGZ,oBAAoBC;YAEnD,OAAO,IAAIG,MAAMC,IAAI,KAAK,WAAWD,MAAMxB,MAAM,EAAE;gBACjD,wCAAwC;gBACxCF,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAG,MAAMxD,QAAQ8C,GAAG,CAC5C,AAACxD,CAAAA,GAAG,CAAC0D,MAAMQ,IAAI,CAAC,IAAI,EAAE,AAAD,EAAGT,GAAG,CAAC,CAACU,OAC3BlC,gCAAgCkC,MAAMT,MAAMxB,MAAM,EAAErD;YAG1D,OAAO,IAAI6E,MAAMC,IAAI,KAAK,QAAQ;gBAChC,qCAAqC;gBACpC,CAAA,MAAMjD,QAAQ8C,GAAG,CAChBE,MAAMU,IAAI,CAACX,GAAG,CAAC,OAAOY;oBACpB,OAAO,MAAMpC,gCAAgCjC,KAAKqE,IAAInC,MAAM,EAAErD;gBAChE,GACF,EAAGyF,OAAO,CAAC,CAACC,IAAWC,OAAOC,MAAM,CAACzC,gBAAgBuC;YACvD,OAAO,IAAIb,MAAMC,IAAI,KAAK,UAAU;gBAElC,yCAAyC;gBACzC3B,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAG,MAAMxD,QAAQ8C,GAAG,CAC5C,AAACxD,CAAAA,GAAG,CAAC0D,MAAMQ,IAAI,CAAC,IAAI,EAAE,AAAD,EAAGT,GAAG,CAAC,OAAOiB;oBACjC,MAAMxC,SAASwB,MAAMiB,MAAM,CAACzF,IAAI,CAAC,CAAC0F,IAAaA,EAAEzF,IAAI,KAAKuF,MAAMG,SAAS,GAAG3C;oBAE5E,IAAI,CAACA,QAAQ;wBACX,OAAO;4BACLyB,MAAMe,MAAMG,SAAS;4BACrBZ,MAAM;wBACR;oBACF;oBAEA,OAAO;wBACLN,MAAMe,MAAMG,SAAS;wBACrBZ,MAAM,MAAMhC,gCAAgCyC,OAAOxC,QAAQrD;oBAC7D;gBACF;YAEJ,OAAO,IAAI6E,MAAMC,IAAI,KAAK,SAAS;gBACjC3B,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGlE,GAAG,CAAC0D,MAAMQ,IAAI,CAAC;YAE9C,OAAO,IAAIR,MAAMC,IAAI,KAAK,WAAWD,MAAMQ,IAAI,IAAIR,MAAMxB,MAAM,EAAE;gBAC/D,gDAAgD;gBAChDF,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAG,MAAMjC,gCAAgCjC,GAAG,CAAC0D,MAAMQ,IAAI,CAAC,EAAER,MAAMxB,MAAM,EAAErD;YACpG,OAAO,IAAI6E,MAAMC,IAAI,KAAK,WAAW,CAACD,MAAMQ,IAAI,IAAIR,MAAMxB,MAAM,EAAE;gBAChEsC,OAAOC,MAAM,CACXzC,gBACA,MAAMC,gCAAgCjC,KAAK0D,MAAMxB,MAAM,EAAErD;YAE7D,OAAO,IAAI6E,MAAMC,IAAI,KAAK,SAASD,MAAMxB,MAAM,EAAE;gBAC/CsC,OAAOC,MAAM,CACXzC,gBACA,MAAMC,gCAAgCjC,KAAK0D,MAAMxB,MAAM,EAAErD;YAE7D,OAAO,IAAI6E,MAAMC,IAAI,KAAK,kBAAkBmB,MAAMC,OAAO,CAACrB,MAAMsB,UAAU,KAAKtB,MAAMuB,OAAO,EAAE;gBAC5FjD,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAG;oBAC3B3E,IAAIS,KAAK,CAAC0D,MAAMQ,IAAI,CAAC,EAAEgB,OAAO3F,MAAMS,KAAK,CAAC0D,MAAMQ,IAAI,CAAC,EAAEgB,SAAS;oBAChEF,YAAYhF,KAAK,CAAC0D,MAAMQ,IAAI,CAAC,EAAEc,cAAc;gBAC/C;YACF,OAAO,IAAItB,MAAMC,IAAI,KAAK,kBAAkBmB,MAAMC,OAAO,CAACrB,MAAMsB,UAAU,KAAK,CAACtB,MAAMuB,OAAO,EAAE;gBAC7FjD,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGlE,GAAG,CAAC0D,MAAMQ,IAAI,CAAC,EAAET,IAAI,CAAC0B;oBACjD,OAAO;wBACL5F,IAAI4F,YAAYD,OAAO3F,MAAM4F,YAAYD,SAAS;wBAClDF,YAAYG,YAAYH,cAAc;oBACxC;gBACF,MAAM,EAAE;YACV,OAAO,IAAItB,MAAMC,IAAI,KAAK,kBAAkB,CAACmB,MAAMC,OAAO,CAACrB,MAAMsB,UAAU,KAAKtB,MAAMuB,OAAO,EAAE;gBAC7FjD,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGlE,GAAG,CAAC0D,MAAMQ,IAAI,CAAC,EAAET,IAAI,CAAC0B;oBACjD,OAAOA,YAAY5F,MAAM4F,YAAYD,SAAS;gBAChD,MAAM,EAAE;YACV,OAAO,IAAIxB,MAAMC,IAAI,KAAK,kBAAkB,CAACmB,MAAMC,OAAO,CAACrB,MAAMsB,UAAU,KAAK,CAACtB,MAAMuB,OAAO,EAAE;gBAC9FjD,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGlE,KAAK,CAAC0D,MAAMQ,IAAI,CAAC,EAAE3E,MAAMS,KAAK,CAAC0D,MAAMQ,IAAI,CAAC,IAAI;YAC7E,OAAO,IAAIR,MAAMC,IAAI,KAAK,kBAAkBD,MAAMC,IAAI,KAAK,UAAU;gBACnE,0DAA0D;gBAE1D3B,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGlE,GAAG,CAAC0D,MAAMQ,IAAI,CAAC,EAAE3E,MAAMS,GAAG,CAAC0D,MAAMQ,IAAI,CAAC;YACrE,OAAO;gBACL,uCAAuC;gBACvC,aAAa;gBACblC,cAAc,CAAC0B,MAAMQ,IAAI,CAAC,GAAGlE,GAAG,CAAC0D,MAAMQ,IAAI,CAAC;YAC9C;QACF,EAAE,OAAOkB,KAAK;YACZ3C,QAAQS,GAAG,CAACkC,KAAK1B,OAAO1D;QAC1B;IACF;IAEA,OAAOgC;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@extravirgin/payload-plugin-meilisearch",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "homepage:": "https://extravirgin.ch",
5
5
  "description": "Index your payload collections to meilisearch",
6
6
  "license": "MIT",