@extravirgin/payload-plugin-meilisearch 0.0.6 → 0.0.8

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) {
@@ -82,7 +82,6 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
82
82
  }
83
83
  }
84
84
  if (documents.length > 0) {
85
- console.log('[afterChange] add documents', documents.length);
86
85
  await index.addDocuments(documents);
87
86
  }
88
87
  } else {
@@ -103,21 +102,23 @@ const processDocument = async (doc, previousDoc, collection, config, req)=>{
103
102
  }
104
103
  };
105
104
  const handleAfterChange = (config)=>{
106
- return async function({ doc, previousDoc, req, collection }) {
105
+ return async function({ collection, doc, previousDoc, req }) {
107
106
  req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id}`);
108
107
  if (doc?._status === 'draft' && previousDoc?._status === 'draft') {
109
108
  req.payload.logger.info(`Meilisearch [handleAfterChange] ${collection.slug} document ${doc.id} - skipping consecutive draft change`);
110
109
  return;
111
110
  }
112
111
  try {
113
- processDocument(doc, previousDoc, collection, config, req);
112
+ processDocument(doc, previousDoc, collection, config, req).catch((error)=>{
113
+ console.error('Meilisearch indexing error:', error);
114
+ });
114
115
  } catch (error) {
115
116
  console.error('Meilisearch indexing error:', error);
116
117
  }
117
118
  };
118
119
  };
119
120
  const afterDeleteHook = (config)=>{
120
- return async ({ doc, req, collection })=>{
121
+ return async ({ collection, doc, req })=>{
121
122
  try {
122
123
  const payload = req.payload;
123
124
  const localization = payload.config?.localization;
@@ -142,8 +143,8 @@ let meilisearch;
142
143
  function getMeilisearchClient(config) {
143
144
  if (!meilisearch) {
144
145
  meilisearch = new MeiliSearch({
145
- host: config.host,
146
- apiKey: config.apiKey
146
+ apiKey: config.apiKey,
147
+ host: config.host
147
148
  });
148
149
  }
149
150
  return meilisearch;
@@ -179,54 +180,74 @@ function extractTextFromHTML(html) {
179
180
  async function transformDocumentForMeilisearch(doc, fields, req) {
180
181
  const transformedDoc = {};
181
182
  await Promise.all(fields.map(async (field)=>{
182
- if (field.type === 'richText') {
183
- // For rich text fields, convert Lexical to HTML, then extract text
184
- const lexicalAdapter = field.editor;
185
- const sanitizedServerEditorConfig = lexicalAdapter.editorConfig;
186
- const html = await convertLexicalToHTML({
187
- converters: consolidateHTMLConverters({
188
- editorConfig: sanitizedServerEditorConfig
189
- }),
190
- data: doc[field.name]
191
- });
192
- transformedDoc[field.name] = extractTextFromHTML(html);
193
- } else if (field.type === 'array' && field.fields) {
194
- // For array fields, transform each item
195
- transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map((item)=>transformDocumentForMeilisearch(item, field.fields, req)));
196
- } else if (field.type === 'tabs') {
197
- // For tab fields, transform each tab
198
- (await Promise.all(field.tabs.map(async (tab)=>{
199
- return await transformDocumentForMeilisearch(doc, tab.fields, req);
200
- }))).forEach((t)=>Object.assign(transformedDoc, t));
201
- } else if (field.type === 'blocks') {
202
- // For block fields, transform each block
203
- transformedDoc[field.name] = await Promise.all((doc[field.name] || []).map(async (block)=>{
204
- const fields = field.blocks.find((b)=>b.slug === block.blockType)?.fields;
205
- 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
+ }
206
213
  return {
207
214
  type: block.blockType,
208
- data: ""
215
+ data: await transformDocumentForMeilisearch(block, fields, req)
209
216
  };
210
- }
211
- return {
212
- type: block.blockType,
213
- 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.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 === 'relationship' && Array.isArray(field.relationTo) && field.hasMany) {
224
+ transformedDoc[field.name] = {
225
+ id: doc?.[field.name]?.value?.id ?? doc?.[field.name]?.value ?? '',
226
+ relationTo: doc?.[field.name]?.relationTo ?? ''
214
227
  };
215
- }));
216
- } else if (field.type === 'group' && field.fields) {
217
- // For group fields, transform the nested fields
218
- transformedDoc[field.name] = await transformDocumentForMeilisearch(doc[field.name], field.fields, req);
219
- } else if (field.type === 'relationship' || field.type === 'upload') {
220
- // For relationship and upload fields, just include the ID
221
- transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];
222
- } else {
223
- // For other field types, include as-is
224
- try {
228
+ } else if (field.type === 'relationship' && Array.isArray(field.relationTo) && !field.hasMany) {
229
+ transformedDoc[field.name] = doc[field.name]?.map((relatedDoc)=>{
230
+ return {
231
+ id: relatedDoc?.value?.id ?? relatedDoc?.value ?? '',
232
+ relationTo: relatedDoc?.relationTo ?? ''
233
+ };
234
+ }) ?? [];
235
+ } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && field.hasMany) {
236
+ transformedDoc[field.name] = doc[field.name]?.map((relatedDoc)=>{
237
+ return relatedDoc?.id ?? relatedDoc?.value ?? '';
238
+ }) ?? [];
239
+ } else if (field.type === 'relationship' && !Array.isArray(field.relationTo) && !field.hasMany) {
240
+ transformedDoc[field.name] = doc?.[field.name]?.id ?? doc?.[field.name] ?? '';
241
+ } else if (field.type === 'relationship' || field.type === 'upload') {
242
+ // For relationship and upload fields, just include the ID
243
+ transformedDoc[field.name] = doc[field.name]?.id || doc[field.name];
244
+ } else {
245
+ // For other field types, include as-is
225
246
  // @ts-ignore
226
247
  transformedDoc[field.name] = doc[field.name];
227
- } catch (err) {
228
- console.log(err, field, doc);
229
248
  }
249
+ } catch (err) {
250
+ console.log(err, field, doc);
230
251
  }
231
252
  }));
232
253
  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 console.log('[afterChange] add documents', documents.length)\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","console","log","addDocuments","logger","info","_status","error","meilisearch","host","apiKey","indexUID","getIndex","cause","createIndex","primaryKey","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":"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"}
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.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' && 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":"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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.6",
3
+ "version": "0.0.8",
4
4
  "homepage:": "https://extravirgin.ch",
5
5
  "description": "Index your payload collections to meilisearch",
6
6
  "license": "MIT",