@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;
|
package/dist/indexCollections.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { consolidateHTMLConverters, convertLexicalToHTML } from '@payloadcms/richtext-lexical';
|
|
2
2
|
import { compile } from 'html-to-text';
|
|
3
|
-
import {
|
|
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
|
-
|
|
22
|
-
previousDoc: null,
|
|
23
|
-
req,
|
|
21
|
+
collection,
|
|
24
22
|
context: req.context,
|
|
23
|
+
doc: entry,
|
|
25
24
|
operation: "update",
|
|
26
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
60
|
+
collection: collection.slug,
|
|
62
61
|
draft: false,
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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":"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;YACxBe,QAAQC,GAAG,CAAC,+BAA+BnB,UAAUG,MAAM;YAC3D,MAAMzB,MAAM0C,YAAY,CAACpB;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,MAAM0C,YAAY,CAAC;gBAACL;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,CAACqD,MAAM,CAACC,IAAI,CAAC,CAAC,gCAAgC,EAAE3D,WAAWO,IAAI,CAAC,UAAU,EAAEa,IAAIV,EAAE,EAAE;QAE/F,IAAIU,KAAKwC,YAAY,WAAWvC,aAAauC,YAAY,SAAS;YAChE3D,IAAII,OAAO,CAACqD,MAAM,CAACC,IAAI,CAAC,CAAC,gCAAgC,EAAE3D,WAAWO,IAAI,CAAC,UAAU,EAAEa,IAAIV,EAAE,CAAC,oCAAoC,CAAC;YACnI;QACF;QACA,IAAI;YAEFmB,gBAAgBT,KAAKC,aAAarB,YAAYJ,QAAQK;QAExD,EAAE,OAAO4D,OAAO;YACdN,QAAQM,KAAK,CAAC,+BAA+BA;QAC/C;IACF;AACF;AAEA,MAAMjC,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,OAAOmD,OAAO;YACdN,QAAQM,KAAK,CAAC,+BAA+BA;QAC/C;IACF;AACF;AAEA,IAAIC;AAEJ,SAASjD,qBAAqBjB,MAAyB;IACrD,IAAI,CAACkE,aAAa;QAChBA,cAAc,IAAIvE,YAAY;YAC5BwE,MAAMnE,OAAOmE,IAAI;YACjBC,QAAQpE,OAAOoE,MAAM;QACvB;IAEF;IACA,OAAOF;AACT;AAEA,eAAehD,YAAYF,MAAmB,EAAEqD,QAAgB;IAC9D,IAAI;QACF,gCAAgC;QAChC,MAAMrD,OAAOsD,QAAQ,CAACD;IACxB,EAAE,OAAOJ,OAAO;QACd,wDAAwD;QACxD,aAAa;QACb,IAAIA,OAAOM,OAAOrB,SAAS,mBAAmB;YAC5C,iCAAiC;YACjC,MAAMlC,OAAOwD,WAAW,CAACH,UAAU;gBACjCI,YAAY;YACd;YACAd,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAES,SAAS,mBAAmB,CAAC;QACrD,OAAO;YACL,2BAA2B;YAC3B,MAAMJ;QACR;IACF;AACF;AAGA,MAAMS,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;gBACZ1C,QAAQC,GAAG,CAACyC,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.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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"}
|