@payloadcms/plugin-search 3.0.0-beta.12 → 3.0.0-beta.120

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/Search/hooks/deleteFromSearch.d.ts +2 -3
  2. package/dist/Search/hooks/deleteFromSearch.d.ts.map +1 -1
  3. package/dist/Search/hooks/deleteFromSearch.js +6 -5
  4. package/dist/Search/hooks/deleteFromSearch.js.map +1 -1
  5. package/dist/Search/hooks/syncWithSearch.d.ts +1 -2
  6. package/dist/Search/hooks/syncWithSearch.d.ts.map +1 -1
  7. package/dist/Search/hooks/syncWithSearch.js +42 -20
  8. package/dist/Search/hooks/syncWithSearch.js.map +1 -1
  9. package/dist/Search/index.d.ts +3 -3
  10. package/dist/Search/index.d.ts.map +1 -1
  11. package/dist/Search/index.js +58 -47
  12. package/dist/Search/index.js.map +1 -1
  13. package/dist/Search/ui/index.client.d.ts +3 -0
  14. package/dist/Search/ui/index.client.d.ts.map +1 -0
  15. package/dist/Search/ui/index.client.js +51 -0
  16. package/dist/Search/ui/index.client.js.map +1 -0
  17. package/dist/Search/ui/index.d.ts +1 -1
  18. package/dist/Search/ui/index.d.ts.map +1 -1
  19. package/dist/Search/ui/index.js +3 -22
  20. package/dist/Search/ui/index.js.map +1 -1
  21. package/dist/exports/client.d.ts +2 -0
  22. package/dist/exports/client.d.ts.map +1 -0
  23. package/dist/exports/client.js +3 -0
  24. package/dist/exports/client.js.map +1 -0
  25. package/dist/exports/types.d.ts +2 -0
  26. package/dist/exports/types.d.ts.map +1 -0
  27. package/dist/exports/types.js +3 -0
  28. package/dist/exports/types.js.map +1 -0
  29. package/dist/index.d.ts +3 -4
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +16 -11
  32. package/dist/index.js.map +1 -1
  33. package/dist/types.d.ts +18 -10
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js +0 -2
  36. package/dist/types.js.map +1 -1
  37. package/package.json +47 -34
  38. package/types.d.ts +0 -1
  39. package/types.js +0 -1
@@ -1,4 +1,3 @@
1
- import type { CollectionAfterDeleteHook } from 'payload/types';
2
- declare const deleteFromSearch: CollectionAfterDeleteHook;
3
- export default deleteFromSearch;
1
+ import type { DeleteFromSearch } from '../../types.js';
2
+ export declare const deleteFromSearch: DeleteFromSearch;
4
3
  //# sourceMappingURL=deleteFromSearch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deleteFromSearch.d.ts","sourceRoot":"","sources":["../../../src/Search/hooks/deleteFromSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAE9D,QAAA,MAAM,gBAAgB,EAAE,yBA2BvB,CAAA;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"deleteFromSearch.d.ts","sourceRoot":"","sources":["../../../src/Search/hooks/deleteFromSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,eAAO,MAAM,gBAAgB,EAAE,gBAkC9B,CAAA"}
@@ -1,7 +1,8 @@
1
- const deleteFromSearch = async ({ doc, req: { payload }, req })=>{
1
+ export const deleteFromSearch = async ({ doc, pluginConfig, req: { payload }, req })=>{
2
+ const searchSlug = pluginConfig?.searchOverrides?.slug || 'search';
2
3
  try {
3
4
  const searchDocQuery = await payload.find({
4
- collection: 'search',
5
+ collection: searchSlug,
5
6
  depth: 0,
6
7
  req,
7
8
  where: {
@@ -13,17 +14,17 @@ const deleteFromSearch = async ({ doc, req: { payload }, req })=>{
13
14
  if (searchDocQuery?.docs?.[0]) {
14
15
  await payload.delete({
15
16
  id: searchDocQuery?.docs?.[0]?.id,
16
- collection: 'search',
17
+ collection: searchSlug,
17
18
  req
18
19
  });
19
20
  }
20
21
  } catch (err) {
21
22
  payload.logger.error({
22
- err: `Error deleting search doc: ${err}`
23
+ err,
24
+ msg: `Error deleting ${searchSlug} doc.`
23
25
  });
24
26
  }
25
27
  return doc;
26
28
  };
27
- export default deleteFromSearch;
28
29
 
29
30
  //# sourceMappingURL=deleteFromSearch.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/Search/hooks/deleteFromSearch.ts"],"sourcesContent":["import type { CollectionAfterDeleteHook } from 'payload/types'\n\nconst deleteFromSearch: CollectionAfterDeleteHook = async ({ doc, req: { payload }, req }) => {\n try {\n const searchDocQuery = await payload.find({\n collection: 'search',\n depth: 0,\n req,\n where: {\n 'doc.value': {\n equals: doc.id,\n },\n },\n })\n\n if (searchDocQuery?.docs?.[0]) {\n await payload.delete({\n id: searchDocQuery?.docs?.[0]?.id,\n collection: 'search',\n req,\n })\n }\n } catch (err: unknown) {\n payload.logger.error({\n err: `Error deleting search doc: ${err}`,\n })\n }\n\n return doc\n}\n\nexport default deleteFromSearch\n"],"names":["deleteFromSearch","doc","req","payload","searchDocQuery","find","collection","depth","where","equals","id","docs","delete","err","logger","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,MAAMA,mBAA8C,OAAO,EAAEC,GAAG,EAAEC,KAAK,EAAEC,OAAO,EAAE,EAAED,GAAG,EAAE;IACvF,IAAI;QACF,MAAME,iBAAiB,MAAMD,QAAQE,IAAI,CAAC;YACxCC,YAAY;YACZC,OAAO;YACPL;YACAM,OAAO;gBACL,aAAa;oBACXC,QAAQR,IAAIS,EAAE;gBAChB;YACF;QACF;QAEA,IAAIN,gBAAgBO,MAAM,CAAC,EAAE,EAAE;YAC7B,MAAMR,QAAQS,MAAM,CAAC;gBACnBF,IAAIN,gBAAgBO,MAAM,CAAC,EAAE,EAAED;gBAC/BJ,YAAY;gBACZJ;YACF;QACF;IACF,EAAE,OAAOW,KAAc;QACrBV,QAAQW,MAAM,CAACC,KAAK,CAAC;YACnBF,KAAK,CAAC,2BAA2B,EAAEA,IAAI,CAAC;QAC1C;IACF;IAEA,OAAOZ;AACT;AAEA,eAAeD,iBAAgB"}
1
+ {"version":3,"sources":["../../../src/Search/hooks/deleteFromSearch.ts"],"sourcesContent":["import type { DeleteFromSearch } from '../../types.js'\n\nexport const deleteFromSearch: DeleteFromSearch = async ({\n doc,\n pluginConfig,\n req: { payload },\n req,\n}) => {\n const searchSlug = pluginConfig?.searchOverrides?.slug || 'search'\n try {\n const searchDocQuery = await payload.find({\n collection: searchSlug,\n depth: 0,\n req,\n where: {\n 'doc.value': {\n equals: doc.id,\n },\n },\n })\n\n if (searchDocQuery?.docs?.[0]) {\n await payload.delete({\n id: searchDocQuery?.docs?.[0]?.id,\n collection: searchSlug,\n req,\n })\n }\n } catch (err: unknown) {\n payload.logger.error({\n err,\n msg: `Error deleting ${searchSlug} doc.`,\n })\n }\n\n return doc\n}\n"],"names":["deleteFromSearch","doc","pluginConfig","req","payload","searchSlug","searchOverrides","slug","searchDocQuery","find","collection","depth","where","equals","id","docs","delete","err","logger","error","msg"],"mappings":"AAEA,OAAO,MAAMA,mBAAqC,OAAO,EACvDC,GAAG,EACHC,YAAY,EACZC,KAAK,EAAEC,OAAO,EAAE,EAChBD,GAAG,EACJ;IACC,MAAME,aAAaH,cAAcI,iBAAiBC,QAAQ;IAC1D,IAAI;QACF,MAAMC,iBAAiB,MAAMJ,QAAQK,IAAI,CAAC;YACxCC,YAAYL;YACZM,OAAO;YACPR;YACAS,OAAO;gBACL,aAAa;oBACXC,QAAQZ,IAAIa,EAAE;gBAChB;YACF;QACF;QAEA,IAAIN,gBAAgBO,MAAM,CAAC,EAAE,EAAE;YAC7B,MAAMX,QAAQY,MAAM,CAAC;gBACnBF,IAAIN,gBAAgBO,MAAM,CAAC,EAAE,EAAED;gBAC/BJ,YAAYL;gBACZF;YACF;QACF;IACF,EAAE,OAAOc,KAAc;QACrBb,QAAQc,MAAM,CAACC,KAAK,CAAC;YACnBF;YACAG,KAAK,CAAC,eAAe,EAAEf,WAAW,KAAK,CAAC;QAC1C;IACF;IAEA,OAAOJ;AACT,EAAC"}
@@ -1,4 +1,3 @@
1
1
  import type { SyncWithSearch } from '../../types.js';
2
- declare const syncWithSearch: SyncWithSearch;
3
- export default syncWithSearch;
2
+ export declare const syncWithSearch: SyncWithSearch;
4
3
  //# sourceMappingURL=syncWithSearch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncWithSearch.d.ts","sourceRoot":"","sources":["../../../src/Search/hooks/syncWithSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE7E,QAAA,MAAM,cAAc,EAAE,cA8JrB,CAAA;AAED,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"syncWithSearch.d.ts","sourceRoot":"","sources":["../../../src/Search/hooks/syncWithSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/D,eAAO,MAAM,cAAc,EAAE,cA4K5B,CAAA"}
@@ -1,9 +1,8 @@
1
- const syncWithSearch = async (args)=>{
2
- const { collection, doc, operation, req: { payload }, req, // @ts-expect-error
3
- searchConfig } = args;
1
+ export const syncWithSearch = async (args)=>{
2
+ const { collection, doc, operation, pluginConfig, req: { payload }, req } = args;
4
3
  const { id, _status: status, title } = doc || {};
5
- const { beforeSync, defaultPriorities, deleteDrafts, syncDrafts } = searchConfig// todo fix SyncWithSearch type, see note in ./types.ts
6
- ;
4
+ const { beforeSync, defaultPriorities, deleteDrafts, searchOverrides, syncDrafts } = pluginConfig;
5
+ const searchSlug = searchOverrides?.slug || 'search';
7
6
  let dataToSave = {
8
7
  doc: {
9
8
  relationTo: collection,
@@ -12,8 +11,17 @@ const syncWithSearch = async (args)=>{
12
11
  title
13
12
  };
14
13
  if (typeof beforeSync === 'function') {
14
+ let docToSyncWith = doc;
15
+ if (payload.config?.localization) {
16
+ docToSyncWith = await payload.findByID({
17
+ id,
18
+ collection,
19
+ locale: 'all',
20
+ req
21
+ });
22
+ }
15
23
  dataToSave = await beforeSync({
16
- originalDoc: doc,
24
+ originalDoc: docToSyncWith,
17
25
  payload,
18
26
  req,
19
27
  searchDoc: dataToSave
@@ -27,7 +35,7 @@ const syncWithSearch = async (args)=>{
27
35
  defaultPriority = await priority(doc);
28
36
  } catch (err) {
29
37
  payload.logger.error(err);
30
- payload.logger.error(`Error gathering default priority for search documents related to ${collection}`);
38
+ payload.logger.error(`Error gathering default priority for ${searchSlug} documents related to ${collection}`);
31
39
  }
32
40
  } else {
33
41
  defaultPriority = priority;
@@ -38,7 +46,7 @@ const syncWithSearch = async (args)=>{
38
46
  if (operation === 'create') {
39
47
  if (doSync) {
40
48
  await payload.create({
41
- collection: 'search',
49
+ collection: searchSlug,
42
50
  data: {
43
51
  ...dataToSave,
44
52
  priority: defaultPriority
@@ -51,10 +59,13 @@ const syncWithSearch = async (args)=>{
51
59
  try {
52
60
  // find the correct doc to sync with
53
61
  const searchDocQuery = await payload.find({
54
- collection: 'search',
62
+ collection: searchSlug,
55
63
  depth: 0,
56
64
  req,
57
65
  where: {
66
+ 'doc.relationTo': {
67
+ equals: collection
68
+ },
58
69
  'doc.value': {
59
70
  equals: id
60
71
  }
@@ -68,7 +79,7 @@ const syncWithSearch = async (args)=>{
68
79
  try {
69
80
  const duplicativeDocIDs = duplicativeDocs.map(({ id })=>id);
70
81
  await payload.delete({
71
- collection: 'search',
82
+ collection: searchSlug,
72
83
  req,
73
84
  where: {
74
85
  id: {
@@ -77,7 +88,7 @@ const syncWithSearch = async (args)=>{
77
88
  }
78
89
  });
79
90
  } catch (err) {
80
- payload.logger.error(`Error deleting duplicative search documents.`);
91
+ payload.logger.error(`Error deleting duplicative ${searchSlug} documents.`);
81
92
  }
82
93
  }
83
94
  if (foundDoc) {
@@ -87,7 +98,7 @@ const syncWithSearch = async (args)=>{
87
98
  try {
88
99
  await payload.update({
89
100
  id: searchDocID,
90
- collection: 'search',
101
+ collection: searchSlug,
91
102
  data: {
92
103
  ...dataToSave,
93
104
  priority: foundDoc.priority || defaultPriority
@@ -95,7 +106,7 @@ const syncWithSearch = async (args)=>{
95
106
  req
96
107
  });
97
108
  } catch (err) {
98
- payload.logger.error(`Error updating search document.`);
109
+ payload.logger.error(`Error updating ${searchSlug} document.`);
99
110
  }
100
111
  }
101
112
  if (deleteDrafts && status === 'draft') {
@@ -103,17 +114,20 @@ const syncWithSearch = async (args)=>{
103
114
  try {
104
115
  await payload.delete({
105
116
  id: searchDocID,
106
- collection: 'search',
117
+ collection: searchSlug,
107
118
  req
108
119
  });
109
120
  } catch (err) {
110
- payload.logger.error(`Error deleting search document: ${err}`);
121
+ payload.logger.error({
122
+ err,
123
+ msg: `Error deleting ${searchSlug} document.`
124
+ });
111
125
  }
112
126
  }
113
127
  } else if (doSync) {
114
128
  try {
115
129
  await payload.create({
116
- collection: 'search',
130
+ collection: searchSlug,
117
131
  data: {
118
132
  ...dataToSave,
119
133
  priority: defaultPriority
@@ -121,18 +135,26 @@ const syncWithSearch = async (args)=>{
121
135
  req
122
136
  });
123
137
  } catch (err) {
124
- payload.logger.error(`Error creating search document: ${err}`);
138
+ payload.logger.error({
139
+ err,
140
+ msg: `Error creating ${searchSlug} document.`
141
+ });
125
142
  }
126
143
  }
127
144
  } catch (err) {
128
- payload.logger.error(`Error finding search document: ${err}`);
145
+ payload.logger.error({
146
+ err,
147
+ msg: `Error finding ${searchSlug} document.`
148
+ });
129
149
  }
130
150
  }
131
151
  } catch (err) {
132
- payload.logger.error(`Error syncing search document related to ${collection} with id: '${id}': ${err}`);
152
+ payload.logger.error({
153
+ err,
154
+ msg: `Error syncing ${searchSlug} document related to ${collection} with id: '${id}'.`
155
+ });
133
156
  }
134
157
  return doc;
135
158
  };
136
- export default syncWithSearch;
137
159
 
138
160
  //# sourceMappingURL=syncWithSearch.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/Search/hooks/syncWithSearch.ts"],"sourcesContent":["import type { DocToSync, SearchConfig, SyncWithSearch } from '../../types.js'\n\nconst syncWithSearch: SyncWithSearch = async (args) => {\n const {\n collection,\n doc,\n operation,\n req: { payload },\n req,\n // @ts-expect-error\n searchConfig,\n } = args\n\n const { id, _status: status, title } = doc || {}\n\n const { beforeSync, defaultPriorities, deleteDrafts, syncDrafts } = searchConfig as SearchConfig // todo fix SyncWithSearch type, see note in ./types.ts\n\n let dataToSave: DocToSync = {\n doc: {\n relationTo: collection,\n value: id,\n },\n title,\n }\n\n if (typeof beforeSync === 'function') {\n dataToSave = await beforeSync({\n originalDoc: doc,\n payload,\n req,\n searchDoc: dataToSave,\n })\n }\n\n let defaultPriority = 0\n if (defaultPriorities) {\n const { [collection]: priority } = defaultPriorities\n\n if (typeof priority === 'function') {\n try {\n defaultPriority = await priority(doc)\n } catch (err: unknown) {\n payload.logger.error(err)\n payload.logger.error(\n `Error gathering default priority for search documents related to ${collection}`,\n )\n }\n } else {\n defaultPriority = priority\n }\n }\n\n const doSync = syncDrafts || (!syncDrafts && status !== 'draft')\n\n try {\n if (operation === 'create') {\n if (doSync) {\n await payload.create({\n collection: 'search',\n data: {\n ...dataToSave,\n priority: defaultPriority,\n },\n req,\n })\n }\n }\n\n if (operation === 'update') {\n try {\n // find the correct doc to sync with\n const searchDocQuery = await payload.find({\n collection: 'search',\n depth: 0,\n req,\n where: {\n 'doc.value': {\n equals: id,\n },\n },\n })\n\n const docs: Array<{\n id: number | string\n priority?: number\n }> = searchDocQuery?.docs || []\n\n const [foundDoc, ...duplicativeDocs] = docs\n\n // delete all duplicative search docs (docs that reference the same page)\n // to ensure the same, out-of-date result does not appear twice (where only syncing the first found doc)\n if (duplicativeDocs.length > 0) {\n try {\n const duplicativeDocIDs = duplicativeDocs.map(({ id }) => id)\n await payload.delete({\n collection: 'search',\n req,\n where: { id: { in: duplicativeDocIDs } },\n })\n } catch (err: unknown) {\n payload.logger.error(`Error deleting duplicative search documents.`)\n }\n }\n\n if (foundDoc) {\n const { id: searchDocID } = foundDoc\n\n if (doSync) {\n // update the doc normally\n try {\n await payload.update({\n id: searchDocID,\n collection: 'search',\n data: {\n ...dataToSave,\n priority: foundDoc.priority || defaultPriority,\n },\n req,\n })\n } catch (err: unknown) {\n payload.logger.error(`Error updating search document.`)\n }\n }\n if (deleteDrafts && status === 'draft') {\n // do not include draft docs in search results, so delete the record\n try {\n await payload.delete({\n id: searchDocID,\n collection: 'search',\n req,\n })\n } catch (err: unknown) {\n payload.logger.error(`Error deleting search document: ${err}`)\n }\n }\n } else if (doSync) {\n try {\n await payload.create({\n collection: 'search',\n data: {\n ...dataToSave,\n priority: defaultPriority,\n },\n req,\n })\n } catch (err: unknown) {\n payload.logger.error(`Error creating search document: ${err}`)\n }\n }\n } catch (err: unknown) {\n payload.logger.error(`Error finding search document: ${err}`)\n }\n }\n } catch (err: unknown) {\n payload.logger.error(\n `Error syncing search document related to ${collection} with id: '${id}': ${err}`,\n )\n }\n\n return doc\n}\n\nexport default syncWithSearch\n"],"names":["syncWithSearch","args","collection","doc","operation","req","payload","searchConfig","id","_status","status","title","beforeSync","defaultPriorities","deleteDrafts","syncDrafts","dataToSave","relationTo","value","originalDoc","searchDoc","defaultPriority","priority","err","logger","error","doSync","create","data","searchDocQuery","find","depth","where","equals","docs","foundDoc","duplicativeDocs","length","duplicativeDocIDs","map","delete","in","searchDocID","update"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/Search/hooks/syncWithSearch.ts"],"sourcesContent":["import type { DocToSync, SyncWithSearch } from '../../types.js'\n\nexport const syncWithSearch: SyncWithSearch = async (args) => {\n const {\n collection,\n doc,\n operation,\n pluginConfig,\n req: { payload },\n req,\n } = args\n\n const { id, _status: status, title } = doc || {}\n\n const { beforeSync, defaultPriorities, deleteDrafts, searchOverrides, syncDrafts } = pluginConfig\n\n const searchSlug = searchOverrides?.slug || 'search'\n\n let dataToSave: DocToSync = {\n doc: {\n relationTo: collection,\n value: id,\n },\n title,\n }\n\n if (typeof beforeSync === 'function') {\n let docToSyncWith = doc\n if (payload.config?.localization) {\n docToSyncWith = await payload.findByID({\n id,\n collection,\n locale: 'all',\n req,\n })\n }\n dataToSave = await beforeSync({\n originalDoc: docToSyncWith,\n payload,\n req,\n searchDoc: dataToSave,\n })\n }\n\n let defaultPriority = 0\n if (defaultPriorities) {\n const { [collection]: priority } = defaultPriorities\n\n if (typeof priority === 'function') {\n try {\n defaultPriority = await priority(doc)\n } catch (err: unknown) {\n payload.logger.error(err)\n payload.logger.error(\n `Error gathering default priority for ${searchSlug} documents related to ${collection}`,\n )\n }\n } else {\n defaultPriority = priority\n }\n }\n\n const doSync = syncDrafts || (!syncDrafts && status !== 'draft')\n\n try {\n if (operation === 'create') {\n if (doSync) {\n await payload.create({\n collection: searchSlug,\n data: {\n ...dataToSave,\n priority: defaultPriority,\n },\n req,\n })\n }\n }\n\n if (operation === 'update') {\n try {\n // find the correct doc to sync with\n const searchDocQuery = await payload.find({\n collection: searchSlug,\n depth: 0,\n req,\n where: {\n 'doc.relationTo': {\n equals: collection,\n },\n 'doc.value': {\n equals: id,\n },\n },\n })\n\n const docs: Array<{\n id: number | string\n priority?: number\n }> = searchDocQuery?.docs || []\n\n const [foundDoc, ...duplicativeDocs] = docs\n\n // delete all duplicative search docs (docs that reference the same page)\n // to ensure the same, out-of-date result does not appear twice (where only syncing the first found doc)\n if (duplicativeDocs.length > 0) {\n try {\n const duplicativeDocIDs = duplicativeDocs.map(({ id }) => id)\n await payload.delete({\n collection: searchSlug,\n req,\n where: { id: { in: duplicativeDocIDs } },\n })\n } catch (err: unknown) {\n payload.logger.error(`Error deleting duplicative ${searchSlug} documents.`)\n }\n }\n\n if (foundDoc) {\n const { id: searchDocID } = foundDoc\n\n if (doSync) {\n // update the doc normally\n try {\n await payload.update({\n id: searchDocID,\n collection: searchSlug,\n data: {\n ...dataToSave,\n priority: foundDoc.priority || defaultPriority,\n },\n req,\n })\n } catch (err: unknown) {\n payload.logger.error(`Error updating ${searchSlug} document.`)\n }\n }\n if (deleteDrafts && status === 'draft') {\n // do not include draft docs in search results, so delete the record\n try {\n await payload.delete({\n id: searchDocID,\n collection: searchSlug,\n req,\n })\n } catch (err: unknown) {\n payload.logger.error({ err, msg: `Error deleting ${searchSlug} document.` })\n }\n }\n } else if (doSync) {\n try {\n await payload.create({\n collection: searchSlug,\n data: {\n ...dataToSave,\n priority: defaultPriority,\n },\n req,\n })\n } catch (err: unknown) {\n payload.logger.error({ err, msg: `Error creating ${searchSlug} document.` })\n }\n }\n } catch (err: unknown) {\n payload.logger.error({ err, msg: `Error finding ${searchSlug} document.` })\n }\n }\n } catch (err: unknown) {\n payload.logger.error({\n err,\n msg: `Error syncing ${searchSlug} document related to ${collection} with id: '${id}'.`,\n })\n }\n\n return doc\n}\n"],"names":["syncWithSearch","args","collection","doc","operation","pluginConfig","req","payload","id","_status","status","title","beforeSync","defaultPriorities","deleteDrafts","searchOverrides","syncDrafts","searchSlug","slug","dataToSave","relationTo","value","docToSyncWith","config","localization","findByID","locale","originalDoc","searchDoc","defaultPriority","priority","err","logger","error","doSync","create","data","searchDocQuery","find","depth","where","equals","docs","foundDoc","duplicativeDocs","length","duplicativeDocIDs","map","delete","in","searchDocID","update","msg"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CollectionConfig } from 'payload/types';
2
- import type { SearchConfig } from '../types.js';
3
- export declare const generateSearchCollection: (searchConfig: SearchConfig) => CollectionConfig;
1
+ import type { CollectionConfig } from 'payload';
2
+ import type { SearchPluginConfig } from '../types.js';
3
+ export declare const generateSearchCollection: (pluginConfig: SearchPluginConfig) => CollectionConfig;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAIrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK/C,eAAO,MAAM,wBAAwB,iBAAkB,YAAY,KAAG,gBA2DnE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAS,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGrD,eAAO,MAAM,wBAAwB,iBAAkB,kBAAkB,KAAG,gBAwE3E,CAAA"}
@@ -1,11 +1,52 @@
1
- import deepMerge from 'deepmerge';
2
- import { LinkToDoc } from './ui/index.js';
3
1
  // all settings can be overridden by the config
4
- export const generateSearchCollection = (searchConfig)=>deepMerge({
5
- slug: 'search',
2
+ export const generateSearchCollection = (pluginConfig)=>{
3
+ const defaultFields = [
4
+ {
5
+ name: 'title',
6
+ type: 'text',
7
+ admin: {
8
+ readOnly: true
9
+ }
10
+ },
11
+ {
12
+ name: 'priority',
13
+ type: 'number',
14
+ admin: {
15
+ position: 'sidebar'
16
+ }
17
+ },
18
+ {
19
+ name: 'doc',
20
+ type: 'relationship',
21
+ admin: {
22
+ position: 'sidebar',
23
+ readOnly: true
24
+ },
25
+ index: true,
26
+ maxDepth: 0,
27
+ relationTo: pluginConfig?.collections || [],
28
+ required: true
29
+ },
30
+ {
31
+ name: 'docUrl',
32
+ type: 'ui',
33
+ admin: {
34
+ components: {
35
+ Field: {
36
+ path: '@payloadcms/plugin-search/client#LinkToDoc'
37
+ }
38
+ },
39
+ position: 'sidebar'
40
+ }
41
+ }
42
+ ];
43
+ const newConfig = {
44
+ ...pluginConfig?.searchOverrides || {},
45
+ slug: pluginConfig?.searchOverrides?.slug || 'search',
6
46
  access: {
7
47
  create: ()=>false,
8
- read: ()=>true
48
+ read: ()=>true,
49
+ ...pluginConfig?.searchOverrides?.access || {}
9
50
  },
10
51
  admin: {
11
52
  defaultColumns: [
@@ -13,50 +54,20 @@ export const generateSearchCollection = (searchConfig)=>deepMerge({
13
54
  ],
14
55
  description: 'This is a collection of automatically created search results. These results are used by the global site search and will be updated automatically as documents in the CMS are created or updated.',
15
56
  enableRichTextRelationship: false,
16
- useAsTitle: 'title'
57
+ useAsTitle: 'title',
58
+ ...pluginConfig?.searchOverrides?.admin || {}
17
59
  },
18
- fields: [
19
- {
20
- name: 'title',
21
- type: 'text',
22
- admin: {
23
- readOnly: true
24
- }
25
- },
26
- {
27
- name: 'priority',
28
- type: 'number',
29
- admin: {
30
- position: 'sidebar'
31
- }
32
- },
33
- {
34
- name: 'doc',
35
- type: 'relationship',
36
- admin: {
37
- position: 'sidebar',
38
- readOnly: true
39
- },
40
- index: true,
41
- maxDepth: 0,
42
- relationTo: searchConfig?.collections || [],
43
- required: true
44
- },
45
- {
46
- name: 'docUrl',
47
- type: 'ui',
48
- admin: {
49
- components: {
50
- Field: LinkToDoc
51
- },
52
- position: 'sidebar'
53
- }
54
- }
55
- ],
60
+ fields: pluginConfig?.searchOverrides?.fields && typeof pluginConfig?.searchOverrides?.fields === 'function' ? pluginConfig?.searchOverrides.fields({
61
+ defaultFields
62
+ }) : defaultFields,
56
63
  labels: {
57
- plural: 'Search Results',
58
- singular: 'Search Result'
64
+ ...pluginConfig?.searchOverrides?.labels || {
65
+ plural: 'Search Results',
66
+ singular: 'Search Result'
67
+ }
59
68
  }
60
- }, searchConfig?.searchOverrides || {});
69
+ };
70
+ return newConfig;
71
+ };
61
72
 
62
73
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Search/index.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload/types'\n\nimport deepMerge from 'deepmerge'\n\nimport type { SearchConfig } from '../types.js'\n\nimport { LinkToDoc } from './ui/index.js'\n\n// all settings can be overridden by the config\nexport const generateSearchCollection = (searchConfig: SearchConfig): CollectionConfig =>\n deepMerge(\n {\n slug: 'search',\n access: {\n create: (): boolean => false,\n read: (): boolean => true,\n },\n admin: {\n defaultColumns: ['title'],\n description:\n 'This is a collection of automatically created search results. These results are used by the global site search and will be updated automatically as documents in the CMS are created or updated.',\n enableRichTextRelationship: false,\n useAsTitle: 'title',\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'priority',\n type: 'number',\n admin: {\n position: 'sidebar',\n },\n },\n {\n name: 'doc',\n type: 'relationship',\n admin: {\n position: 'sidebar',\n readOnly: true,\n },\n index: true,\n maxDepth: 0,\n relationTo: searchConfig?.collections || [],\n required: true,\n },\n {\n name: 'docUrl',\n type: 'ui',\n admin: {\n components: {\n Field: LinkToDoc,\n },\n position: 'sidebar',\n },\n },\n ],\n labels: {\n plural: 'Search Results',\n singular: 'Search Result',\n },\n },\n searchConfig?.searchOverrides || {},\n )\n"],"names":["deepMerge","LinkToDoc","generateSearchCollection","searchConfig","slug","access","create","read","admin","defaultColumns","description","enableRichTextRelationship","useAsTitle","fields","name","type","readOnly","position","index","maxDepth","relationTo","collections","required","components","Field","labels","plural","singular","searchOverrides"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,OAAOA,eAAe,YAAW;AAIjC,SAASC,SAAS,QAAQ,gBAAe;AAEzC,+CAA+C;AAC/C,OAAO,MAAMC,2BAA2B,CAACC,eACvCH,UACE;QACEI,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAe;YACvBC,MAAM,IAAe;QACvB;QACAC,OAAO;YACLC,gBAAgB;gBAAC;aAAQ;YACzBC,aACE;YACFC,4BAA4B;YAC5BC,YAAY;QACd;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNP,OAAO;oBACLQ,UAAU;gBACZ;YACF;YACA;gBACEF,MAAM;gBACNC,MAAM;gBACNP,OAAO;oBACLS,UAAU;gBACZ;YACF;YACA;gBACEH,MAAM;gBACNC,MAAM;gBACNP,OAAO;oBACLS,UAAU;oBACVD,UAAU;gBACZ;gBACAE,OAAO;gBACPC,UAAU;gBACVC,YAAYjB,cAAckB,eAAe,EAAE;gBAC3CC,UAAU;YACZ;YACA;gBACER,MAAM;gBACNC,MAAM;gBACNP,OAAO;oBACLe,YAAY;wBACVC,OAAOvB;oBACT;oBACAgB,UAAU;gBACZ;YACF;SACD;QACDQ,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,GACAxB,cAAcyB,mBAAmB,CAAC,GACnC"}
1
+ {"version":3,"sources":["../../src/Search/index.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport type { SearchPluginConfig } from '../types.js'\n\n// all settings can be overridden by the config\nexport const generateSearchCollection = (pluginConfig: SearchPluginConfig): CollectionConfig => {\n const defaultFields: Field[] = [\n {\n name: 'title',\n type: 'text',\n admin: {\n readOnly: true,\n },\n },\n {\n name: 'priority',\n type: 'number',\n admin: {\n position: 'sidebar',\n },\n },\n {\n name: 'doc',\n type: 'relationship',\n admin: {\n position: 'sidebar',\n readOnly: true,\n },\n index: true,\n maxDepth: 0,\n relationTo: pluginConfig?.collections || [],\n required: true,\n },\n {\n name: 'docUrl',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-search/client#LinkToDoc',\n },\n },\n position: 'sidebar',\n },\n },\n ]\n\n const newConfig: CollectionConfig = {\n ...(pluginConfig?.searchOverrides || {}),\n slug: pluginConfig?.searchOverrides?.slug || 'search',\n access: {\n create: (): boolean => false,\n read: (): boolean => true,\n ...(pluginConfig?.searchOverrides?.access || {}),\n },\n admin: {\n defaultColumns: ['title'],\n description:\n 'This is a collection of automatically created search results. These results are used by the global site search and will be updated automatically as documents in the CMS are created or updated.',\n enableRichTextRelationship: false,\n useAsTitle: 'title',\n ...(pluginConfig?.searchOverrides?.admin || {}),\n },\n fields:\n pluginConfig?.searchOverrides?.fields &&\n typeof pluginConfig?.searchOverrides?.fields === 'function'\n ? pluginConfig?.searchOverrides.fields({ defaultFields })\n : defaultFields,\n labels: {\n ...(pluginConfig?.searchOverrides?.labels || {\n plural: 'Search Results',\n singular: 'Search Result',\n }),\n },\n }\n\n return newConfig\n}\n"],"names":["generateSearchCollection","pluginConfig","defaultFields","name","type","admin","readOnly","position","index","maxDepth","relationTo","collections","required","components","Field","path","newConfig","searchOverrides","slug","access","create","read","defaultColumns","description","enableRichTextRelationship","useAsTitle","fields","labels","plural","singular"],"mappings":"AAIA,+CAA+C;AAC/C,OAAO,MAAMA,2BAA2B,CAACC;IACvC,MAAMC,gBAAyB;QAC7B;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,UAAU;YACZ;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLE,UAAU;YACZ;QACF;QACA;YACEJ,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLE,UAAU;gBACVD,UAAU;YACZ;YACAE,OAAO;YACPC,UAAU;YACVC,YAAYT,cAAcU,eAAe,EAAE;YAC3CC,UAAU;QACZ;QACA;YACET,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLQ,YAAY;oBACVC,OAAO;wBACLC,MAAM;oBACR;gBACF;gBACAR,UAAU;YACZ;QACF;KACD;IAED,MAAMS,YAA8B;QAClC,GAAIf,cAAcgB,mBAAmB,CAAC,CAAC;QACvCC,MAAMjB,cAAcgB,iBAAiBC,QAAQ;QAC7CC,QAAQ;YACNC,QAAQ,IAAe;YACvBC,MAAM,IAAe;YACrB,GAAIpB,cAAcgB,iBAAiBE,UAAU,CAAC,CAAC;QACjD;QACAd,OAAO;YACLiB,gBAAgB;gBAAC;aAAQ;YACzBC,aACE;YACFC,4BAA4B;YAC5BC,YAAY;YACZ,GAAIxB,cAAcgB,iBAAiBZ,SAAS,CAAC,CAAC;QAChD;QACAqB,QACEzB,cAAcgB,iBAAiBS,UAC/B,OAAOzB,cAAcgB,iBAAiBS,WAAW,aAC7CzB,cAAcgB,gBAAgBS,OAAO;YAAExB;QAAc,KACrDA;QACNyB,QAAQ;YACN,GAAI1B,cAAcgB,iBAAiBU,UAAU;gBAC3CC,QAAQ;gBACRC,UAAU;YACZ,CAAC;QACH;IACF;IAEA,OAAOb;AACT,EAAC"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const LinkToDocClient: React.FC;
3
+ //# sourceMappingURL=index.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/Search/ui/index.client.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EA+CnC,CAAA"}
@@ -0,0 +1,51 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useConfig, useField } from '@payloadcms/ui';
4
+ import { formatAdminURL } from '@payloadcms/ui/shared';
5
+ import React from 'react';
6
+ // TODO: fix this import to work in dev mode within the monorepo in a way that is backwards compatible with 1.x
7
+ // import CopyToClipboard from 'payload/dist/admin/components/elements/CopyToClipboard'
8
+ export const LinkToDocClient = ()=>{
9
+ const { config } = useConfig();
10
+ const { routes: { admin: adminRoute }, serverURL } = config;
11
+ const { value } = useField({
12
+ path: 'doc'
13
+ });
14
+ const href = `${serverURL}${formatAdminURL({
15
+ adminRoute,
16
+ path: `/collections/${value.relationTo || ''}/${value.value || ''}`
17
+ })}`;
18
+ if (!value.relationTo || !value.value) {
19
+ return null;
20
+ }
21
+ return /*#__PURE__*/ _jsxs("div", {
22
+ style: {
23
+ marginBottom: 'var(--spacing-field, 1rem)'
24
+ },
25
+ children: [
26
+ /*#__PURE__*/ _jsx("div", {
27
+ children: /*#__PURE__*/ _jsx("span", {
28
+ className: "label",
29
+ style: {
30
+ color: '#9A9A9A'
31
+ },
32
+ children: "Doc URL"
33
+ })
34
+ }),
35
+ /*#__PURE__*/ _jsx("div", {
36
+ style: {
37
+ fontWeight: '600',
38
+ overflow: 'hidden',
39
+ textOverflow: 'ellipsis'
40
+ },
41
+ children: /*#__PURE__*/ _jsx("a", {
42
+ href: href,
43
+ target: "_blank",
44
+ children: href
45
+ })
46
+ })
47
+ ]
48
+ });
49
+ };
50
+
51
+ //# sourceMappingURL=index.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/Search/ui/index.client.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig, useField } from '@payloadcms/ui'\nimport { formatAdminURL } from '@payloadcms/ui/shared'\nimport React from 'react'\n// TODO: fix this import to work in dev mode within the monorepo in a way that is backwards compatible with 1.x\n// import CopyToClipboard from 'payload/dist/admin/components/elements/CopyToClipboard'\n\nexport const LinkToDocClient: React.FC = () => {\n const { config } = useConfig()\n\n const {\n routes: {\n admin: adminRoute, // already includes leading slash\n },\n serverURL,\n } = config\n\n const { value } = useField<{ relationTo?: string; value?: string }>({ path: 'doc' })\n\n const href = `${serverURL}${formatAdminURL({\n adminRoute,\n path: `/collections/${value.relationTo || ''}/${value.value || ''}`,\n })}`\n\n if (!value.relationTo || !value.value) {\n return null\n }\n\n return (\n <div style={{ marginBottom: 'var(--spacing-field, 1rem)' }}>\n <div>\n <span\n className=\"label\"\n style={{\n color: '#9A9A9A',\n }}\n >\n Doc URL\n </span>\n {/* <CopyToClipboard value={href} /> */}\n </div>\n <div\n style={{\n fontWeight: '600',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n <a href={href} target=\"_blank\">\n {href}\n </a>\n </div>\n </div>\n )\n}\n"],"names":["useConfig","useField","formatAdminURL","React","LinkToDocClient","config","routes","admin","adminRoute","serverURL","value","path","href","relationTo","div","style","marginBottom","span","className","color","fontWeight","overflow","textOverflow","a","target"],"mappings":"AAAA;;AAEA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,iBAAgB;AACpD,SAASC,cAAc,QAAQ,wBAAuB;AACtD,OAAOC,WAAW,QAAO;AACzB,+GAA+G;AAC/G,uFAAuF;AAEvF,OAAO,MAAMC,kBAA4B;IACvC,MAAM,EAAEC,MAAM,EAAE,GAAGL;IAEnB,MAAM,EACJM,QAAQ,EACNC,OAAOC,UAAU,EAClB,EACDC,SAAS,EACV,GAAGJ;IAEJ,MAAM,EAAEK,KAAK,EAAE,GAAGT,SAAkD;QAAEU,MAAM;IAAM;IAElF,MAAMC,OAAO,CAAC,EAAEH,UAAU,EAAEP,eAAe;QACzCM;QACAG,MAAM,CAAC,aAAa,EAAED,MAAMG,UAAU,IAAI,GAAG,CAAC,EAAEH,MAAMA,KAAK,IAAI,GAAG,CAAC;IACrE,GAAG,CAAC;IAEJ,IAAI,CAACA,MAAMG,UAAU,IAAI,CAACH,MAAMA,KAAK,EAAE;QACrC,OAAO;IACT;IAEA,qBACE,MAACI;QAAIC,OAAO;YAAEC,cAAc;QAA6B;;0BACvD,KAACF;0BACC,cAAA,KAACG;oBACCC,WAAU;oBACVH,OAAO;wBACLI,OAAO;oBACT;8BACD;;;0BAKH,KAACL;gBACCC,OAAO;oBACLK,YAAY;oBACZC,UAAU;oBACVC,cAAc;gBAChB;0BAEA,cAAA,KAACC;oBAAEX,MAAMA;oBAAMY,QAAO;8BACnBZ;;;;;AAKX,EAAC"}
@@ -1,4 +1,4 @@
1
- import type { UIField } from 'payload/types';
1
+ import type { UIField } from 'payload';
2
2
  import React from 'react';
3
3
  export declare const LinkToDoc: React.FC<UIField>;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Search/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,OAAO,EAAE,MAAM,eAAe,CAAA;AAIvD,OAAO,KAAK,MAAM,OAAO,CAAA;AAazB,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CA6CvC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Search/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAEvC,CAAA"}
@@ -1,27 +1,8 @@
1
- import { useWatchForm } from '@payloadcms/ui/forms/Form';
2
- import { useConfig } from '@payloadcms/ui/providers/Config';
1
+ import { jsx as _jsx } from "react/jsx-runtime";
3
2
  import React from 'react';
3
+ import { LinkToDocClient } from './index.client.js';
4
4
  export const LinkToDoc = ()=>{
5
- const form = useWatchForm();
6
- const fields = form.fields;
7
- const { doc: { value: { relationTo, value: docId } } } = fields;
8
- const config = useConfig();
9
- const { routes: { admin: adminRoute }, serverURL } = config;
10
- const href = `${serverURL}${adminRoute}/collections/${relationTo}/${docId}`;
11
- return /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("span", {
12
- className: "label",
13
- style: {
14
- color: '#9A9A9A'
15
- }
16
- }, "Doc URL")), /*#__PURE__*/ React.createElement("div", {
17
- style: {
18
- fontWeight: '600',
19
- overflow: 'hidden',
20
- textOverflow: 'ellipsis'
21
- }
22
- }, /*#__PURE__*/ React.createElement("a", {
23
- href: href
24
- }, href)));
5
+ return /*#__PURE__*/ _jsx(LinkToDocClient, {});
25
6
  };
26
7
 
27
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/Search/ui/index.tsx"],"sourcesContent":["import type { FormState, UIField } from 'payload/types'\n\nimport { useWatchForm } from '@payloadcms/ui/forms/Form'\nimport { useConfig } from '@payloadcms/ui/providers/Config'\nimport React from 'react'\n// TODO: fix this import to work in dev mode within the monorepo in a way that is backwards compatible with 1.x\n// import CopyToClipboard from 'payload/dist/admin/components/elements/CopyToClipboard'\n\ntype FieldsWithDoc = FormState & {\n doc: {\n value: {\n relationTo: string\n value: string\n }\n }\n}\n\nexport const LinkToDoc: React.FC<UIField> = () => {\n const form = useWatchForm()\n const fields = form.fields as FieldsWithDoc\n\n const {\n doc: {\n value: { relationTo, value: docId },\n },\n } = fields\n\n const config = useConfig()\n\n const {\n routes: {\n admin: adminRoute, // already includes leading slash\n },\n serverURL,\n } = config\n\n const href = `${serverURL}${adminRoute}/collections/${relationTo}/${docId}`\n\n return (\n <div>\n <div>\n <span\n className=\"label\"\n style={{\n color: '#9A9A9A',\n }}\n >\n Doc URL\n </span>\n {/* <CopyToClipboard value={href} /> */}\n </div>\n <div\n style={{\n fontWeight: '600',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n <a href={href}>{href}</a>\n </div>\n </div>\n )\n}\n"],"names":["useWatchForm","useConfig","React","LinkToDoc","form","fields","doc","value","relationTo","docId","config","routes","admin","adminRoute","serverURL","href","div","span","className","style","color","fontWeight","overflow","textOverflow","a"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,YAAY,QAAQ,4BAA2B;AACxD,SAASC,SAAS,QAAQ,kCAAiC;AAC3D,OAAOC,WAAW,QAAO;AAazB,OAAO,MAAMC,YAA+B;IAC1C,MAAMC,OAAOJ;IACb,MAAMK,SAASD,KAAKC,MAAM;IAE1B,MAAM,EACJC,KAAK,EACHC,OAAO,EAAEC,UAAU,EAAED,OAAOE,KAAK,EAAE,EACpC,EACF,GAAGJ;IAEJ,MAAMK,SAAST;IAEf,MAAM,EACJU,QAAQ,EACNC,OAAOC,UAAU,EAClB,EACDC,SAAS,EACV,GAAGJ;IAEJ,MAAMK,OAAO,CAAC,EAAED,UAAU,EAAED,WAAW,aAAa,EAAEL,WAAW,CAAC,EAAEC,MAAM,CAAC;IAE3E,qBACE,oBAACO,2BACC,oBAACA,2BACC,oBAACC;QACCC,WAAU;QACVC,OAAO;YACLC,OAAO;QACT;OACD,2BAKH,oBAACJ;QACCG,OAAO;YACLE,YAAY;YACZC,UAAU;YACVC,cAAc;QAChB;qBAEA,oBAACC;QAAET,MAAMA;OAAOA;AAIxB,EAAC"}
1
+ {"version":3,"sources":["../../../src/Search/ui/index.tsx"],"sourcesContent":["import type { UIField } from 'payload'\n\nimport React from 'react'\n\nimport { LinkToDocClient } from './index.client.js'\n\nexport const LinkToDoc: React.FC<UIField> = () => {\n return <LinkToDocClient />\n}\n"],"names":["React","LinkToDocClient","LinkToDoc"],"mappings":";AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,eAAe,QAAQ,oBAAmB;AAEnD,OAAO,MAAMC,YAA+B;IAC1C,qBAAO,KAACD;AACV,EAAC"}
@@ -0,0 +1,2 @@
1
+ export { LinkToDoc } from '../Search/ui/index.js';
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { LinkToDoc } from '../Search/ui/index.js';
2
+
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { LinkToDoc } from '../Search/ui/index.js'\n"],"names":["LinkToDoc"],"mappings":"AAAA,SAASA,SAAS,QAAQ,wBAAuB"}
@@ -0,0 +1,2 @@
1
+ export type { BeforeSync, DocToSync, SearchPluginConfig, SyncWithSearch } from '../types.js';
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type { BeforeSync, DocToSync, SearchPluginConfig, SyncWithSearch } from '../types.js'\n"],"names":[],"mappings":"AAAA,WAA4F"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { Config } from 'payload/config';
2
- import type { SearchConfig } from './types.js';
3
- declare const Search: (incomingSearchConfig: SearchConfig) => (config: Config) => Config;
4
- export default Search;
1
+ import type { Config } from 'payload';
2
+ import type { SearchPluginConfig } from './types.js';
3
+ export declare const searchPlugin: (incomingPluginConfig: SearchPluginConfig) => (config: Config) => Config;
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAM9C,QAAA,MAAM,MAAM,yBACa,YAAY,cAC1B,MAAM,KAAG,MAoDjB,CAAA;AAEH,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwD,MAAM,EAAE,MAAM,SAAS,CAAA;AAE3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AASpD,eAAO,MAAM,YAAY,yBACA,kBAAkB,cAChC,MAAM,KAAG,MA4DjB,CAAA"}
package/dist/index.js CHANGED
@@ -1,18 +1,19 @@
1
- import deleteFromSearch from './Search/hooks/deleteFromSearch.js';
2
- import syncWithSearch from './Search/hooks/syncWithSearch.js';
1
+ import { deleteFromSearch } from './Search/hooks/deleteFromSearch.js';
2
+ import { syncWithSearch } from './Search/hooks/syncWithSearch.js';
3
3
  import { generateSearchCollection } from './Search/index.js';
4
- const Search = (incomingSearchConfig)=>(config)=>{
4
+ export const searchPlugin = (incomingPluginConfig)=>(config)=>{
5
5
  const { collections } = config;
6
6
  if (collections) {
7
- const searchConfig = {
8
- ...incomingSearchConfig,
7
+ const pluginConfig = {
8
+ // write any config defaults here
9
9
  deleteDrafts: true,
10
- syncDrafts: false
10
+ syncDrafts: false,
11
+ ...incomingPluginConfig
11
12
  };
12
13
  // add afterChange and afterDelete hooks to every search-enabled collection
13
14
  const collectionsWithSearchHooks = config?.collections?.map((collection)=>{
14
15
  const { hooks: existingHooks } = collection;
15
- const enabledCollections = searchConfig.collections || [];
16
+ const enabledCollections = pluginConfig.collections || [];
16
17
  const isEnabled = enabledCollections.indexOf(collection.slug) > -1;
17
18
  if (isEnabled) {
18
19
  return {
@@ -25,13 +26,18 @@ const Search = (incomingSearchConfig)=>(config)=>{
25
26
  await syncWithSearch({
26
27
  ...args,
27
28
  collection: collection.slug,
28
- searchConfig
29
+ pluginConfig
29
30
  });
30
31
  }
31
32
  ],
32
33
  afterDelete: [
33
34
  ...existingHooks?.afterDelete || [],
34
- deleteFromSearch
35
+ async (args)=>{
36
+ await deleteFromSearch({
37
+ ...args,
38
+ pluginConfig
39
+ });
40
+ }
35
41
  ]
36
42
  }
37
43
  };
@@ -42,12 +48,11 @@ const Search = (incomingSearchConfig)=>(config)=>{
42
48
  ...config,
43
49
  collections: [
44
50
  ...collectionsWithSearchHooks || [],
45
- generateSearchCollection(searchConfig)
51
+ generateSearchCollection(pluginConfig)
46
52
  ]
47
53
  };
48
54
  }
49
55
  return config;
50
56
  };
51
- export default Search;
52
57
 
53
58
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from 'payload/config'\n\nimport type { SearchConfig } from './types.js'\n\nimport deleteFromSearch from './Search/hooks/deleteFromSearch.js'\nimport syncWithSearch from './Search/hooks/syncWithSearch.js'\nimport { generateSearchCollection } from './Search/index.js'\n\nconst Search =\n (incomingSearchConfig: SearchConfig) =>\n (config: Config): Config => {\n const { collections } = config\n\n if (collections) {\n const searchConfig: SearchConfig = {\n ...incomingSearchConfig,\n deleteDrafts: true,\n syncDrafts: false,\n // write any config defaults here\n }\n\n // add afterChange and afterDelete hooks to every search-enabled collection\n const collectionsWithSearchHooks = config?.collections\n ?.map((collection) => {\n const { hooks: existingHooks } = collection\n\n const enabledCollections = searchConfig.collections || []\n const isEnabled = enabledCollections.indexOf(collection.slug) > -1\n if (isEnabled) {\n return {\n ...collection,\n hooks: {\n ...collection.hooks,\n afterChange: [\n ...(existingHooks?.afterChange || []),\n async (args: any) => {\n await syncWithSearch({\n ...args,\n collection: collection.slug,\n searchConfig,\n })\n },\n ],\n afterDelete: [...(existingHooks?.afterDelete || []), deleteFromSearch],\n },\n }\n }\n\n return collection\n })\n .filter(Boolean)\n\n return {\n ...config,\n collections: [\n ...(collectionsWithSearchHooks || []),\n generateSearchCollection(searchConfig),\n ],\n }\n }\n\n return config\n }\n\nexport default Search\n"],"names":["deleteFromSearch","syncWithSearch","generateSearchCollection","Search","incomingSearchConfig","config","collections","searchConfig","deleteDrafts","syncDrafts","collectionsWithSearchHooks","map","collection","hooks","existingHooks","enabledCollections","isEnabled","indexOf","slug","afterChange","args","afterDelete","filter","Boolean"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAIA,OAAOA,sBAAsB,qCAAoC;AACjE,OAAOC,oBAAoB,mCAAkC;AAC7D,SAASC,wBAAwB,QAAQ,oBAAmB;AAE5D,MAAMC,SACJ,CAACC,uBACD,CAACC;QACC,MAAM,EAAEC,WAAW,EAAE,GAAGD;QAExB,IAAIC,aAAa;YACf,MAAMC,eAA6B;gBACjC,GAAGH,oBAAoB;gBACvBI,cAAc;gBACdC,YAAY;YAEd;YAEA,2EAA2E;YAC3E,MAAMC,6BAA6BL,QAAQC,aACvCK,IAAI,CAACC;gBACL,MAAM,EAAEC,OAAOC,aAAa,EAAE,GAAGF;gBAEjC,MAAMG,qBAAqBR,aAAaD,WAAW,IAAI,EAAE;gBACzD,MAAMU,YAAYD,mBAAmBE,OAAO,CAACL,WAAWM,IAAI,IAAI,CAAC;gBACjE,IAAIF,WAAW;oBACb,OAAO;wBACL,GAAGJ,UAAU;wBACbC,OAAO;4BACL,GAAGD,WAAWC,KAAK;4BACnBM,aAAa;mCACPL,eAAeK,eAAe,EAAE;gCACpC,OAAOC;oCACL,MAAMnB,eAAe;wCACnB,GAAGmB,IAAI;wCACPR,YAAYA,WAAWM,IAAI;wCAC3BX;oCACF;gCACF;6BACD;4BACDc,aAAa;mCAAKP,eAAeO,eAAe,EAAE;gCAAGrB;6BAAiB;wBACxE;oBACF;gBACF;gBAEA,OAAOY;YACT,GACCU,OAAOC;YAEV,OAAO;gBACL,GAAGlB,MAAM;gBACTC,aAAa;uBACPI,8BAA8B,EAAE;oBACpCR,yBAAyBK;iBAC1B;YACH;QACF;QAEA,OAAOF;IACT;AAEF,eAAeF,OAAM"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, Config } from 'payload'\n\nimport type { SearchPluginConfig } from './types.js'\n\nimport { deleteFromSearch } from './Search/hooks/deleteFromSearch.js'\nimport { syncWithSearch } from './Search/hooks/syncWithSearch.js'\nimport { generateSearchCollection } from './Search/index.js'\n\ntype CollectionAfterChangeHookArgs = Parameters<CollectionAfterChangeHook>[0]\ntype CollectionAfterDeleteHookArgs = Parameters<CollectionAfterDeleteHook>[0]\n\nexport const searchPlugin =\n (incomingPluginConfig: SearchPluginConfig) =>\n (config: Config): Config => {\n const { collections } = config\n\n if (collections) {\n const pluginConfig: SearchPluginConfig = {\n // write any config defaults here\n deleteDrafts: true,\n syncDrafts: false,\n ...incomingPluginConfig,\n }\n\n // add afterChange and afterDelete hooks to every search-enabled collection\n const collectionsWithSearchHooks = config?.collections\n ?.map((collection) => {\n const { hooks: existingHooks } = collection\n\n const enabledCollections = pluginConfig.collections || []\n const isEnabled = enabledCollections.indexOf(collection.slug) > -1\n if (isEnabled) {\n return {\n ...collection,\n hooks: {\n ...collection.hooks,\n afterChange: [\n ...(existingHooks?.afterChange || []),\n async (args: CollectionAfterChangeHookArgs) => {\n await syncWithSearch({\n ...args,\n collection: collection.slug,\n pluginConfig,\n })\n },\n ],\n afterDelete: [\n ...(existingHooks?.afterDelete || []),\n async (args: CollectionAfterDeleteHookArgs) => {\n await deleteFromSearch({\n ...args,\n pluginConfig,\n })\n },\n ],\n },\n }\n }\n\n return collection\n })\n .filter(Boolean)\n\n return {\n ...config,\n collections: [\n ...(collectionsWithSearchHooks || []),\n generateSearchCollection(pluginConfig),\n ],\n }\n }\n\n return config\n }\n"],"names":["deleteFromSearch","syncWithSearch","generateSearchCollection","searchPlugin","incomingPluginConfig","config","collections","pluginConfig","deleteDrafts","syncDrafts","collectionsWithSearchHooks","map","collection","hooks","existingHooks","enabledCollections","isEnabled","indexOf","slug","afterChange","args","afterDelete","filter","Boolean"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,qCAAoC;AACrE,SAASC,cAAc,QAAQ,mCAAkC;AACjE,SAASC,wBAAwB,QAAQ,oBAAmB;AAK5D,OAAO,MAAMC,eACX,CAACC,uBACD,CAACC;QACC,MAAM,EAAEC,WAAW,EAAE,GAAGD;QAExB,IAAIC,aAAa;YACf,MAAMC,eAAmC;gBACvC,iCAAiC;gBACjCC,cAAc;gBACdC,YAAY;gBACZ,GAAGL,oBAAoB;YACzB;YAEA,2EAA2E;YAC3E,MAAMM,6BAA6BL,QAAQC,aACvCK,IAAI,CAACC;gBACL,MAAM,EAAEC,OAAOC,aAAa,EAAE,GAAGF;gBAEjC,MAAMG,qBAAqBR,aAAaD,WAAW,IAAI,EAAE;gBACzD,MAAMU,YAAYD,mBAAmBE,OAAO,CAACL,WAAWM,IAAI,IAAI,CAAC;gBACjE,IAAIF,WAAW;oBACb,OAAO;wBACL,GAAGJ,UAAU;wBACbC,OAAO;4BACL,GAAGD,WAAWC,KAAK;4BACnBM,aAAa;mCACPL,eAAeK,eAAe,EAAE;gCACpC,OAAOC;oCACL,MAAMnB,eAAe;wCACnB,GAAGmB,IAAI;wCACPR,YAAYA,WAAWM,IAAI;wCAC3BX;oCACF;gCACF;6BACD;4BACDc,aAAa;mCACPP,eAAeO,eAAe,EAAE;gCACpC,OAAOD;oCACL,MAAMpB,iBAAiB;wCACrB,GAAGoB,IAAI;wCACPb;oCACF;gCACF;6BACD;wBACH;oBACF;gBACF;gBAEA,OAAOK;YACT,GACCU,OAAOC;YAEV,OAAO;gBACL,GAAGlB,MAAM;gBACTC,aAAa;uBACPI,8BAA8B,EAAE;oBACpCR,yBAAyBK;iBAC1B;YACH;QACF;QAEA,OAAOF;IACT,EAAC"}
package/dist/types.d.ts CHANGED
@@ -1,13 +1,12 @@
1
- import type { Payload } from 'payload';
2
- import type { CollectionAfterChangeHook, CollectionConfig, PayloadRequest } from 'payload/types';
3
- export interface DocToSync {
1
+ import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, CollectionConfig, Field, Payload, PayloadRequest } from 'payload';
2
+ export type DocToSync = {
4
3
  [key: string]: any;
5
4
  doc: {
6
5
  relationTo: string;
7
6
  value: string;
8
7
  };
9
8
  title: string;
10
- }
9
+ };
11
10
  export type BeforeSync = (args: {
12
11
  originalDoc: {
13
12
  [key: string]: any;
@@ -16,17 +15,26 @@ export type BeforeSync = (args: {
16
15
  req: PayloadRequest;
17
16
  searchDoc: DocToSync;
18
17
  }) => DocToSync | Promise<DocToSync>;
19
- export interface SearchConfig {
18
+ export type FieldsOverride = (args: {
19
+ defaultFields: Field[];
20
+ }) => Field[];
21
+ export type SearchPluginConfig = {
20
22
  beforeSync?: BeforeSync;
21
23
  collections?: string[];
22
24
  defaultPriorities?: {
23
- [collection: string]: ((doc: any) => Promise<number> | number) | number;
25
+ [collection: string]: ((doc: any) => number | Promise<number>) | number;
24
26
  };
25
27
  deleteDrafts?: boolean;
26
- searchOverrides?: Partial<CollectionConfig>;
28
+ searchOverrides?: {
29
+ fields?: FieldsOverride;
30
+ } & Partial<Omit<CollectionConfig, 'fields'>>;
27
31
  syncDrafts?: boolean;
28
- }
29
- export type SyncWithSearch = (Args: Omit<Parameters<CollectionAfterChangeHook>[0], 'collection'> & {
32
+ };
33
+ export type SyncWithSearch = (Args: {
30
34
  collection: string;
31
- }) => ReturnType<CollectionAfterChangeHook>;
35
+ pluginConfig: SearchPluginConfig;
36
+ } & Omit<Parameters<CollectionAfterChangeHook>[0], 'collection'>) => ReturnType<CollectionAfterChangeHook>;
37
+ export type DeleteFromSearch = (Args: {
38
+ pluginConfig: SearchPluginConfig;
39
+ } & Omit<Parameters<CollectionAfterDeleteHook>[0], 'collection'>) => ReturnType<CollectionAfterDeleteHook>;
32
40
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEhG,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,GAAG,EAAE;QACH,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE;IAC9B,WAAW,EAAE;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AAEpC,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,iBAAiB,CAAC,EAAE;QAClB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAA;KACxE,CAAA;IACD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAID,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG;IACnE,UAAU,EAAE,MAAM,CAAA;CACnB,KACE,UAAU,CAAC,yBAAyB,CAAC,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,cAAc,EACf,MAAM,SAAS,CAAA;AAEhB,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,GAAG,EAAE;QACH,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE;IAC9B,WAAW,EAAE;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAA;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AAEpC,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAAE,aAAa,EAAE,KAAK,EAAE,CAAA;CAAE,KAAK,KAAK,EAAE,CAAA;AAE1E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,iBAAiB,CAAC,EAAE;QAClB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAA;KACxE,CAAA;IACD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzF,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAID,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,kBAAkB,CAAA;CACjC,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAC7D,UAAU,CAAC,yBAAyB,CAAC,CAAA;AAE1C,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE;IACJ,YAAY,EAAE,kBAAkB,CAAA;CACjC,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAC7D,UAAU,CAAC,yBAAyB,CAAC,CAAA"}
package/dist/types.js CHANGED
@@ -1,5 +1,3 @@
1
- // Extend the `CollectionAfterChangeHook` with more function args
2
- // Convert the `collection` arg from `SanitizedCollectionConfig` to a string
3
1
  export { };
4
2
 
5
3
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { Payload } from 'payload'\nimport type { CollectionAfterChangeHook, CollectionConfig, PayloadRequest } from 'payload/types'\n\nexport interface DocToSync {\n [key: string]: any\n doc: {\n relationTo: string\n value: string\n }\n title: string\n}\n\nexport type BeforeSync = (args: {\n originalDoc: {\n [key: string]: any\n }\n payload: Payload\n req: PayloadRequest\n searchDoc: DocToSync\n}) => DocToSync | Promise<DocToSync>\n\nexport interface SearchConfig {\n beforeSync?: BeforeSync\n collections?: string[]\n defaultPriorities?: {\n [collection: string]: ((doc: any) => Promise<number> | number) | number\n }\n deleteDrafts?: boolean\n searchOverrides?: Partial<CollectionConfig>\n syncDrafts?: boolean\n}\n\n// Extend the `CollectionAfterChangeHook` with more function args\n// Convert the `collection` arg from `SanitizedCollectionConfig` to a string\nexport type SyncWithSearch = (\n Args: Omit<Parameters<CollectionAfterChangeHook>[0], 'collection'> & {\n collection: string\n },\n) => ReturnType<CollectionAfterChangeHook>\n"],"names":[],"rangeMappings":";;","mappings":"AAgCA,iEAAiE;AACjE,4EAA4E;AAC5E,WAI0C"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionAfterDeleteHook,\n CollectionConfig,\n Field,\n Payload,\n PayloadRequest,\n} from 'payload'\n\nexport type DocToSync = {\n [key: string]: any\n doc: {\n relationTo: string\n value: string\n }\n title: string\n}\n\nexport type BeforeSync = (args: {\n originalDoc: {\n [key: string]: any\n }\n payload: Payload\n req: PayloadRequest\n searchDoc: DocToSync\n}) => DocToSync | Promise<DocToSync>\n\nexport type FieldsOverride = (args: { defaultFields: Field[] }) => Field[]\n\nexport type SearchPluginConfig = {\n beforeSync?: BeforeSync\n collections?: string[]\n defaultPriorities?: {\n [collection: string]: ((doc: any) => number | Promise<number>) | number\n }\n deleteDrafts?: boolean\n searchOverrides?: { fields?: FieldsOverride } & Partial<Omit<CollectionConfig, 'fields'>>\n syncDrafts?: boolean\n}\n\n// Extend the `CollectionAfterChangeHook` with more function args\n// Convert the `collection` arg from `SanitizedCollectionConfig` to a string\nexport type SyncWithSearch = (\n Args: {\n collection: string\n pluginConfig: SearchPluginConfig\n } & Omit<Parameters<CollectionAfterChangeHook>[0], 'collection'>,\n) => ReturnType<CollectionAfterChangeHook>\n\nexport type DeleteFromSearch = (\n Args: {\n pluginConfig: SearchPluginConfig\n } & Omit<Parameters<CollectionAfterDeleteHook>[0], 'collection'>,\n) => ReturnType<CollectionAfterDeleteHook>\n"],"names":[],"mappings":"AAiDA,WAI0C"}
package/package.json CHANGED
@@ -1,16 +1,7 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-search",
3
- "version": "3.0.0-beta.12",
4
- "homepage:": "https://payloadcms.com",
5
- "repository": {
6
- "type": "git",
7
- "url": "https://github.com/payloadcms/payload.git",
8
- "directory": "packages/plugin-search"
9
- },
3
+ "version": "3.0.0-beta.120",
10
4
  "description": "Search plugin for Payload",
11
- "main": "./dist/index.js",
12
- "types": "./dist/index.d.ts",
13
- "type": "module",
14
5
  "keywords": [
15
6
  "payload",
16
7
  "cms",
@@ -20,43 +11,65 @@
20
11
  "search",
21
12
  "algolia"
22
13
  ],
23
- "author": "dev@trbl.design",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/payloadcms/payload.git",
17
+ "directory": "packages/plugin-search"
18
+ },
24
19
  "license": "MIT",
25
- "peerDependencies": {
26
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
27
- "payload": "3.0.0-beta.12"
20
+ "author": "Payload <dev@payloadcms.com> (https://payloadcms.com)",
21
+ "type": "module",
22
+ "exports": {
23
+ ".": {
24
+ "import": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.js"
27
+ },
28
+ "./types": {
29
+ "import": "./dist/exports/types.js",
30
+ "types": "./dist/exports/types.d.ts",
31
+ "default": "./dist/exports/types.js"
32
+ },
33
+ "./client": {
34
+ "import": "./dist/exports/client.js",
35
+ "types": "./dist/exports/client.d.ts",
36
+ "default": "./dist/exports/client.js"
37
+ }
28
38
  },
39
+ "main": "./dist/index.js",
40
+ "types": "./dist/index.d.ts",
41
+ "files": [
42
+ "dist"
43
+ ],
29
44
  "dependencies": {
30
- "deepmerge": "4.3.1",
31
- "@payloadcms/ui": "3.0.0-beta.12"
45
+ "@payloadcms/ui": "3.0.0-beta.120"
32
46
  },
33
47
  "devDependencies": {
34
- "@types/express": "^4.17.9",
35
- "@types/react": "18.2.74",
36
- "react": "^18.0.0",
37
- "payload": "3.0.0-beta.12",
38
- "@payloadcms/eslint-config": "1.1.1"
48
+ "@types/react": "npm:types-react@19.0.0-rc.1",
49
+ "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
50
+ "@payloadcms/eslint-config": "3.0.0-beta.112",
51
+ "payload": "3.0.0-beta.120"
39
52
  },
40
- "exports": {
41
- ".": {
42
- "import": "./dist/index.js",
43
- "require": "./dist/index.js",
44
- "types": "./dist/index.d.ts"
45
- }
53
+ "peerDependencies": {
54
+ "react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
55
+ "react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
56
+ "payload": "3.0.0-beta.120"
46
57
  },
47
58
  "publishConfig": {
48
59
  "registry": "https://registry.npmjs.org/"
49
60
  },
50
- "files": [
51
- "dist",
52
- "types.js",
53
- "types.d.ts"
54
- ],
61
+ "homepage:": "https://payloadcms.com",
62
+ "overrides": {
63
+ "@types/react": "npm:types-react@19.0.0-rc.1",
64
+ "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
65
+ },
55
66
  "scripts": {
56
- "build": "pnpm build:swc && pnpm build:types",
57
- "build:swc": "swc ./src -d ./dist --config-file .swcrc",
67
+ "build": "pnpm build:types && pnpm build:swc",
68
+ "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
58
69
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
59
70
  "clean": "rimraf {dist,*.tsbuildinfo}",
71
+ "lint": "eslint .",
72
+ "lint:fix": "eslint . --fix",
60
73
  "test": "echo \"Error: no tests specified\""
61
74
  }
62
75
  }
package/types.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from './dist/types'
package/types.js DELETED
@@ -1 +0,0 @@
1
- module.exports = require('./dist/types')