@payloadcms/plugin-seo 4.0.0-internal.cc18726 → 4.0.0-internal.cd47d20

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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,SAAS,wDAyRpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,SAAS,wDA8YpB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { definePlugin } from 'payload';
1
+ import { canAccessAdmin, definePlugin, executeAccess, Forbidden, UnauthorizedError } from 'payload';
2
2
  import { deepMergeSimple } from 'payload/shared';
3
3
  import { MetaDescriptionField } from './fields/MetaDescription/index.js';
4
4
  import { MetaImageField } from './fields/MetaImage/index.js';
@@ -48,6 +48,93 @@ export const seoPlugin = definePlugin({
48
48
  for (const g of config.globals ?? []){
49
49
  globalConfigBySlug.set(g.slug, g);
50
50
  }
51
+ const authorizeGenerateTarget = async ({ data, req })=>{
52
+ if (!data || typeof data !== 'object') {
53
+ throw new Forbidden(req.t);
54
+ }
55
+ const collectionConfig = data.collectionSlug && pluginConfig.collections?.includes(data.collectionSlug) ? collectionConfigBySlug.get(data.collectionSlug) : undefined;
56
+ const globalConfig = data.globalSlug && pluginConfig.globals?.includes(data.globalSlug) ? globalConfigBySlug.get(data.globalSlug) : undefined;
57
+ if (collectionConfig && !data.globalSlug) {
58
+ const dataDocumentID = data.doc && typeof data.doc === 'object' && 'id' in data.doc ? data.doc.id : undefined;
59
+ const documentIDs = [
60
+ data.id,
61
+ dataDocumentID
62
+ ].filter((id)=>id !== null && id !== undefined);
63
+ if (documentIDs.some((id)=>typeof id !== 'string' && typeof id !== 'number')) {
64
+ throw new Forbidden(req.t);
65
+ }
66
+ if (documentIDs.length === 2 && String(documentIDs[0]) !== String(documentIDs[1])) {
67
+ throw new Forbidden(req.t);
68
+ }
69
+ const documentID = documentIDs[0];
70
+ if (documentID !== undefined) {
71
+ const accessibleDoc = await req.payload.findByID({
72
+ id: documentID,
73
+ collection: collectionConfig.slug,
74
+ depth: 0,
75
+ disableErrors: true,
76
+ draft: true,
77
+ overrideAccess: false,
78
+ req,
79
+ trash: true,
80
+ user: req.user
81
+ });
82
+ if (!accessibleDoc) {
83
+ const { totalDocs } = await req.payload.count({
84
+ collection: collectionConfig.slug,
85
+ disableErrors: true,
86
+ overrideAccess: true,
87
+ req,
88
+ trash: true,
89
+ where: {
90
+ id: {
91
+ equals: documentID
92
+ }
93
+ }
94
+ });
95
+ if (totalDocs > 0) {
96
+ throw new Forbidden(req.t);
97
+ }
98
+ if (collectionConfig.access?.create) {
99
+ await executeAccess({
100
+ slug: collectionConfig.slug,
101
+ data: data.doc,
102
+ req
103
+ }, collectionConfig.access.create);
104
+ }
105
+ }
106
+ } else if (collectionConfig.access?.create) {
107
+ await executeAccess({
108
+ slug: collectionConfig.slug,
109
+ data: data.doc,
110
+ req
111
+ }, collectionConfig.access.create);
112
+ }
113
+ return {
114
+ collectionConfig,
115
+ globalConfig: undefined
116
+ };
117
+ }
118
+ if (globalConfig && !data.collectionSlug) {
119
+ const doc = await req.payload.findGlobal({
120
+ slug: globalConfig.slug,
121
+ depth: 0,
122
+ disableErrors: true,
123
+ draft: true,
124
+ overrideAccess: false,
125
+ req,
126
+ user: req.user
127
+ });
128
+ if (!doc) {
129
+ throw new Forbidden(req.t);
130
+ }
131
+ return {
132
+ collectionConfig: undefined,
133
+ globalConfig
134
+ };
135
+ }
136
+ throw new Forbidden(req.t);
137
+ };
51
138
  return {
52
139
  ...config,
53
140
  collections: config.collections?.map((collection)=>{
@@ -114,12 +201,19 @@ export const seoPlugin = definePlugin({
114
201
  ...config.endpoints ?? [],
115
202
  {
116
203
  handler: async (req)=>{
204
+ await authorizeGenerate({
205
+ req
206
+ });
117
207
  const data = await req.json?.();
118
208
  const reqData = data ?? req.data;
209
+ const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
210
+ data: reqData,
211
+ req
212
+ });
119
213
  const result = pluginConfig.generateTitle ? await pluginConfig.generateTitle({
120
214
  ...data,
121
- collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
122
- globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
215
+ collectionConfig,
216
+ globalConfig,
123
217
  req
124
218
  }) : '';
125
219
  return new Response(JSON.stringify({
@@ -133,12 +227,19 @@ export const seoPlugin = definePlugin({
133
227
  },
134
228
  {
135
229
  handler: async (req)=>{
230
+ await authorizeGenerate({
231
+ req
232
+ });
136
233
  const data = await req.json?.();
137
234
  const reqData = data ?? req.data;
235
+ const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
236
+ data: reqData,
237
+ req
238
+ });
138
239
  const result = pluginConfig.generateDescription ? await pluginConfig.generateDescription({
139
240
  ...data,
140
- collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
141
- globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
241
+ collectionConfig,
242
+ globalConfig,
142
243
  req
143
244
  }) : '';
144
245
  return new Response(JSON.stringify({
@@ -152,12 +253,19 @@ export const seoPlugin = definePlugin({
152
253
  },
153
254
  {
154
255
  handler: async (req)=>{
256
+ await authorizeGenerate({
257
+ req
258
+ });
155
259
  const data = await req.json?.();
156
260
  const reqData = data ?? req.data;
261
+ const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
262
+ data: reqData,
263
+ req
264
+ });
157
265
  const result = pluginConfig.generateURL ? await pluginConfig.generateURL({
158
266
  ...data,
159
- collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
160
- globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
267
+ collectionConfig,
268
+ globalConfig,
161
269
  req
162
270
  }) : '';
163
271
  return new Response(JSON.stringify({
@@ -171,12 +279,19 @@ export const seoPlugin = definePlugin({
171
279
  },
172
280
  {
173
281
  handler: async (req)=>{
282
+ await authorizeGenerate({
283
+ req
284
+ });
174
285
  const data = await req.json?.();
175
286
  const reqData = data ?? req.data;
287
+ const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
288
+ data: reqData,
289
+ req
290
+ });
176
291
  const result = pluginConfig.generateImage ? await pluginConfig.generateImage({
177
292
  ...data,
178
- collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
179
- globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
293
+ collectionConfig,
294
+ globalConfig,
180
295
  req
181
296
  }) : '';
182
297
  return new Response(JSON.stringify({
@@ -240,5 +355,13 @@ export const seoPlugin = definePlugin({
240
355
  };
241
356
  }
242
357
  });
358
+ const authorizeGenerate = async ({ req })=>{
359
+ if (!req.user) {
360
+ throw new UnauthorizedError(req.t);
361
+ }
362
+ await canAccessAdmin({
363
+ req
364
+ });
365
+ };
243
366
 
244
367
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, Field, GroupField, TabsField } from 'payload'\n\nimport { definePlugin } from 'payload'\nimport { deepMergeSimple } from 'payload/shared'\n\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types.js'\n\nimport { MetaDescriptionField } from './fields/MetaDescription/index.js'\nimport { MetaImageField } from './fields/MetaImage/index.js'\nimport { MetaTitleField } from './fields/MetaTitle/index.js'\nimport { OverviewField } from './fields/Overview/index.js'\nimport { PreviewField } from './fields/Preview/index.js'\nimport { translations } from './translations/index.js'\n\nexport const seoPlugin = definePlugin<SEOPluginConfig>({\n slug: '@payloadcms/plugin-seo',\n plugin: ({ config, options: pluginConfig }) => {\n const defaultFields: Field[] = [\n OverviewField({}),\n MetaTitleField({\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n }),\n MetaDescriptionField({\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n relationTo: pluginConfig.uploadsCollection as string,\n }),\n ]\n : []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\n ]\n\n const seoFields: GroupField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\n ? pluginConfig.fields({ defaultFields })\n : defaultFields),\n ],\n interfaceName: pluginConfig.interfaceName,\n label: 'SEO',\n },\n ]\n\n const collectionConfigBySlug = new Map<string, NonNullable<Config['collections']>[number]>()\n for (const c of config.collections ?? []) {\n collectionConfigBySlug.set(c.slug, c)\n }\n const globalConfigBySlug = new Map<string, NonNullable<Config['globals']>[number]>()\n for (const g of config.globals ?? []) {\n globalConfigBySlug.set(g.slug, g)\n }\n\n return {\n ...config,\n collections:\n config.collections?.map((collection) => {\n const { slug } = collection\n const isEnabled = pluginConfig?.collections?.includes(slug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n // prevent issues with auth enabled collections having an email field that shouldn't be moved to the SEO tab\n const emailField =\n collection.auth &&\n !(typeof collection.auth === 'object' && collection.auth.disableLocalStrategy) &&\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\n\n const seoTabs: TabsField[] = hasOnlyEmailField\n ? [\n {\n type: 'tabs',\n tabs: [\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n : [\n {\n type: 'tabs',\n tabs: [\n // append a new tab onto the end of the tabs array, if there is one at the first index\n // if needed, create a new `Content` tab in the first index for this collection's base fields\n ...(collection?.fields?.[0]?.type === 'tabs' &&\n collection?.fields?.[0]?.tabs\n ? collection.fields[0].tabs\n : [\n {\n fields: [\n ...(emailField\n ? collection.fields.filter(\n (field) => 'name' in field && field.name !== 'email',\n )\n : collection.fields),\n ],\n label: collection?.labels?.singular || 'Content',\n },\n ]),\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n\n return {\n ...collection,\n fields: [\n ...(emailField ? [emailField] : []),\n ...seoTabs,\n ...(collection?.fields?.[0]?.type === 'tabs' ? collection.fields.slice(1) : []),\n ],\n }\n }\n\n return {\n ...collection,\n fields: [...(collection?.fields || []), ...seoFields],\n }\n }\n\n return collection\n }) || [],\n endpoints: [\n ...(config.endpoints ?? []),\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateTitle>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-title',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateDescription>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-description',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateURL>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-url',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateImage>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-image',\n },\n ],\n globals:\n config.globals?.map((global) => {\n const { slug } = global\n const isEnabled = pluginConfig?.globals?.includes(slug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n const seoTabs: TabsField[] = [\n {\n type: 'tabs',\n tabs: [\n // append a new tab onto the end of the tabs array, if there is one at the first index\n // if needed, create a new `Content` tab in the first index for this global's base fields\n ...(global?.fields?.[0]?.type === 'tabs' && global?.fields?.[0].tabs\n ? global.fields[0].tabs\n : [\n {\n fields: [...(global?.fields || [])],\n label: global?.label || 'Content',\n },\n ]),\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n\n return {\n ...global,\n fields: [\n ...seoTabs,\n ...(global?.fields?.[0]?.type === 'tabs' ? global.fields.slice(1) : []),\n ],\n }\n }\n\n return {\n ...global,\n fields: [...(global?.fields || []), ...seoFields],\n }\n }\n\n return global\n }) || [],\n i18n: {\n ...config.i18n,\n translations: deepMergeSimple(translations, config.i18n?.translations ?? {}),\n },\n }\n },\n})\n"],"names":["definePlugin","deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","translations","seoPlugin","slug","plugin","config","options","pluginConfig","defaultFields","hasGenerateFn","generateTitle","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","name","type","fields","interfaceName","label","collectionConfigBySlug","Map","c","collections","set","globalConfigBySlug","g","globals","map","collection","isEnabled","includes","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","length","seoTabs","tabs","filter","labels","singular","slice","endpoints","handler","req","data","json","reqData","result","collectionConfig","collectionSlug","get","undefined","globalConfig","globalSlug","Response","JSON","stringify","status","method","path","global","i18n"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, Field, GroupField, PayloadRequest, TabsField } from 'payload'\n\nimport { canAccessAdmin, definePlugin, executeAccess, Forbidden, UnauthorizedError } from 'payload'\nimport { deepMergeSimple } from 'payload/shared'\n\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types.js'\n\nimport { MetaDescriptionField } from './fields/MetaDescription/index.js'\nimport { MetaImageField } from './fields/MetaImage/index.js'\nimport { MetaTitleField } from './fields/MetaTitle/index.js'\nimport { OverviewField } from './fields/Overview/index.js'\nimport { PreviewField } from './fields/Preview/index.js'\nimport { translations } from './translations/index.js'\n\nexport const seoPlugin = definePlugin<SEOPluginConfig>({\n slug: '@payloadcms/plugin-seo',\n plugin: ({ config, options: pluginConfig }) => {\n const defaultFields: Field[] = [\n OverviewField({}),\n MetaTitleField({\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n }),\n MetaDescriptionField({\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n relationTo: pluginConfig.uploadsCollection as string,\n }),\n ]\n : []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\n ]\n\n const seoFields: GroupField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\n ? pluginConfig.fields({ defaultFields })\n : defaultFields),\n ],\n interfaceName: pluginConfig.interfaceName,\n label: 'SEO',\n },\n ]\n\n const collectionConfigBySlug = new Map<string, NonNullable<Config['collections']>[number]>()\n for (const c of config.collections ?? []) {\n collectionConfigBySlug.set(c.slug, c)\n }\n const globalConfigBySlug = new Map<string, NonNullable<Config['globals']>[number]>()\n for (const g of config.globals ?? []) {\n globalConfigBySlug.set(g.slug, g)\n }\n\n const authorizeGenerateTarget = async ({\n data,\n req,\n }: {\n data:\n | null\n | Omit<Parameters<GenerateTitle>[0], 'collectionConfig' | 'globalConfig' | 'req'>\n | undefined\n req: PayloadRequest\n }) => {\n if (!data || typeof data !== 'object') {\n throw new Forbidden(req.t)\n }\n\n const collectionConfig =\n data.collectionSlug && pluginConfig.collections?.includes(data.collectionSlug)\n ? collectionConfigBySlug.get(data.collectionSlug)\n : undefined\n const globalConfig =\n data.globalSlug && pluginConfig.globals?.includes(data.globalSlug)\n ? globalConfigBySlug.get(data.globalSlug)\n : undefined\n\n if (collectionConfig && !data.globalSlug) {\n const dataDocumentID =\n data.doc && typeof data.doc === 'object' && 'id' in data.doc ? data.doc.id : undefined\n const documentIDs = [data.id, dataDocumentID].filter(\n (id) => id !== null && id !== undefined,\n )\n\n if (documentIDs.some((id) => typeof id !== 'string' && typeof id !== 'number')) {\n throw new Forbidden(req.t)\n }\n\n if (documentIDs.length === 2 && String(documentIDs[0]) !== String(documentIDs[1])) {\n throw new Forbidden(req.t)\n }\n\n const documentID = documentIDs[0] as number | string | undefined\n\n if (documentID !== undefined) {\n const accessibleDoc = await req.payload.findByID({\n id: documentID,\n collection: collectionConfig.slug,\n depth: 0,\n disableErrors: true,\n draft: true,\n overrideAccess: false,\n req,\n trash: true,\n user: req.user,\n })\n\n if (!accessibleDoc) {\n const { totalDocs } = await req.payload.count({\n collection: collectionConfig.slug,\n disableErrors: true,\n overrideAccess: true,\n req,\n trash: true,\n where: {\n id: {\n equals: documentID,\n },\n },\n })\n\n if (totalDocs > 0) {\n throw new Forbidden(req.t)\n }\n\n if (collectionConfig.access?.create) {\n await executeAccess(\n { slug: collectionConfig.slug, data: data.doc, req },\n collectionConfig.access.create,\n )\n }\n }\n } else if (collectionConfig.access?.create) {\n await executeAccess(\n { slug: collectionConfig.slug, data: data.doc, req },\n collectionConfig.access.create,\n )\n }\n\n return { collectionConfig, globalConfig: undefined }\n }\n\n if (globalConfig && !data.collectionSlug) {\n const doc = await req.payload.findGlobal({\n slug: globalConfig.slug,\n depth: 0,\n disableErrors: true,\n draft: true,\n overrideAccess: false,\n req,\n user: req.user,\n })\n\n if (!doc) {\n throw new Forbidden(req.t)\n }\n\n return { collectionConfig: undefined, globalConfig }\n }\n\n throw new Forbidden(req.t)\n }\n\n return {\n ...config,\n collections:\n config.collections?.map((collection) => {\n const { slug } = collection\n const isEnabled = pluginConfig?.collections?.includes(slug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n // prevent issues with auth enabled collections having an email field that shouldn't be moved to the SEO tab\n const emailField =\n collection.auth &&\n !(typeof collection.auth === 'object' && collection.auth.disableLocalStrategy) &&\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\n\n const seoTabs: TabsField[] = hasOnlyEmailField\n ? [\n {\n type: 'tabs',\n tabs: [\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n : [\n {\n type: 'tabs',\n tabs: [\n // append a new tab onto the end of the tabs array, if there is one at the first index\n // if needed, create a new `Content` tab in the first index for this collection's base fields\n ...(collection?.fields?.[0]?.type === 'tabs' &&\n collection?.fields?.[0]?.tabs\n ? collection.fields[0].tabs\n : [\n {\n fields: [\n ...(emailField\n ? collection.fields.filter(\n (field) => 'name' in field && field.name !== 'email',\n )\n : collection.fields),\n ],\n label: collection?.labels?.singular || 'Content',\n },\n ]),\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n\n return {\n ...collection,\n fields: [\n ...(emailField ? [emailField] : []),\n ...seoTabs,\n ...(collection?.fields?.[0]?.type === 'tabs' ? collection.fields.slice(1) : []),\n ],\n }\n }\n\n return {\n ...collection,\n fields: [...(collection?.fields || []), ...seoFields],\n }\n }\n\n return collection\n }) || [],\n endpoints: [\n ...(config.endpoints ?? []),\n {\n handler: async (req) => {\n await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig,\n globalConfig,\n req,\n } satisfies Parameters<GenerateTitle>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-title',\n },\n {\n handler: async (req) => {\n await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig,\n globalConfig,\n req,\n } satisfies Parameters<GenerateDescription>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-description',\n },\n {\n handler: async (req) => {\n await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig,\n globalConfig,\n req,\n } satisfies Parameters<GenerateURL>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-url',\n },\n {\n handler: async (req) => {\n await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig,\n globalConfig,\n req,\n } satisfies Parameters<GenerateImage>[0])\n : ''\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-image',\n },\n ],\n globals:\n config.globals?.map((global) => {\n const { slug } = global\n const isEnabled = pluginConfig?.globals?.includes(slug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n const seoTabs: TabsField[] = [\n {\n type: 'tabs',\n tabs: [\n // append a new tab onto the end of the tabs array, if there is one at the first index\n // if needed, create a new `Content` tab in the first index for this global's base fields\n ...(global?.fields?.[0]?.type === 'tabs' && global?.fields?.[0].tabs\n ? global.fields[0].tabs\n : [\n {\n fields: [...(global?.fields || [])],\n label: global?.label || 'Content',\n },\n ]),\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n\n return {\n ...global,\n fields: [\n ...seoTabs,\n ...(global?.fields?.[0]?.type === 'tabs' ? global.fields.slice(1) : []),\n ],\n }\n }\n\n return {\n ...global,\n fields: [...(global?.fields || []), ...seoFields],\n }\n }\n\n return global\n }) || [],\n i18n: {\n ...config.i18n,\n translations: deepMergeSimple(translations, config.i18n?.translations ?? {}),\n },\n }\n },\n})\n\nconst authorizeGenerate = async ({ req }: { req: PayloadRequest }): Promise<void> => {\n if (!req.user) {\n throw new UnauthorizedError(req.t)\n }\n\n await canAccessAdmin({ req })\n}\n"],"names":["canAccessAdmin","definePlugin","executeAccess","Forbidden","UnauthorizedError","deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","translations","seoPlugin","slug","plugin","config","options","pluginConfig","defaultFields","hasGenerateFn","generateTitle","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","name","type","fields","interfaceName","label","collectionConfigBySlug","Map","c","collections","set","globalConfigBySlug","g","globals","authorizeGenerateTarget","data","req","t","collectionConfig","collectionSlug","includes","get","undefined","globalConfig","globalSlug","dataDocumentID","doc","id","documentIDs","filter","some","length","String","documentID","accessibleDoc","payload","findByID","collection","depth","disableErrors","draft","overrideAccess","trash","user","totalDocs","count","where","equals","access","create","findGlobal","map","isEnabled","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","seoTabs","tabs","labels","singular","slice","endpoints","handler","authorizeGenerate","json","reqData","result","Response","JSON","stringify","status","method","path","global","i18n"],"mappings":"AAEA,SAASA,cAAc,EAAEC,YAAY,EAAEC,aAAa,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,UAAS;AACnG,SAASC,eAAe,QAAQ,iBAAgB;AAUhD,SAASC,oBAAoB,QAAQ,oCAAmC;AACxE,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,aAAa,QAAQ,6BAA4B;AAC1D,SAASC,YAAY,QAAQ,4BAA2B;AACxD,SAASC,YAAY,QAAQ,0BAAyB;AAEtD,OAAO,MAAMC,YAAYX,aAA8B;IACrDY,MAAM;IACNC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,SAASC,YAAY,EAAE;QACxC,MAAMC,gBAAyB;YAC7BT,cAAc,CAAC;YACfD,eAAe;gBACbW,eAAe,OAAOF,cAAcG,kBAAkB;YACxD;YACAd,qBAAqB;gBACnBa,eAAe,OAAOF,cAAcI,wBAAwB;YAC9D;eACIJ,cAAcK,oBACd;gBACEf,eAAe;oBACbY,eAAe,OAAOF,cAAcM,kBAAkB;oBACtDC,YAAYP,aAAaK,iBAAiB;gBAC5C;aACD,GACD,EAAE;YACNZ,aAAa;gBACXS,eAAe,OAAOF,cAAcQ,gBAAgB;YACtD;SACD;QAED,MAAMC,YAA0B;YAC9B;gBACEC,MAAM;gBACNC,MAAM;gBACNC,QAAQ;uBACFZ,cAAcY,UAAU,OAAOZ,aAAaY,MAAM,KAAK,aACvDZ,aAAaY,MAAM,CAAC;wBAAEX;oBAAc,KACpCA;iBACL;gBACDY,eAAeb,aAAaa,aAAa;gBACzCC,OAAO;YACT;SACD;QAED,MAAMC,yBAAyB,IAAIC;QACnC,KAAK,MAAMC,KAAKnB,OAAOoB,WAAW,IAAI,EAAE,CAAE;YACxCH,uBAAuBI,GAAG,CAACF,EAAErB,IAAI,EAAEqB;QACrC;QACA,MAAMG,qBAAqB,IAAIJ;QAC/B,KAAK,MAAMK,KAAKvB,OAAOwB,OAAO,IAAI,EAAE,CAAE;YACpCF,mBAAmBD,GAAG,CAACE,EAAEzB,IAAI,EAAEyB;QACjC;QAEA,MAAME,0BAA0B,OAAO,EACrCC,IAAI,EACJC,GAAG,EAOJ;YACC,IAAI,CAACD,QAAQ,OAAOA,SAAS,UAAU;gBACrC,MAAM,IAAItC,UAAUuC,IAAIC,CAAC;YAC3B;YAEA,MAAMC,mBACJH,KAAKI,cAAc,IAAI5B,aAAakB,WAAW,EAAEW,SAASL,KAAKI,cAAc,IACzEb,uBAAuBe,GAAG,CAACN,KAAKI,cAAc,IAC9CG;YACN,MAAMC,eACJR,KAAKS,UAAU,IAAIjC,aAAasB,OAAO,EAAEO,SAASL,KAAKS,UAAU,IAC7Db,mBAAmBU,GAAG,CAACN,KAAKS,UAAU,IACtCF;YAEN,IAAIJ,oBAAoB,CAACH,KAAKS,UAAU,EAAE;gBACxC,MAAMC,iBACJV,KAAKW,GAAG,IAAI,OAAOX,KAAKW,GAAG,KAAK,YAAY,QAAQX,KAAKW,GAAG,GAAGX,KAAKW,GAAG,CAACC,EAAE,GAAGL;gBAC/E,MAAMM,cAAc;oBAACb,KAAKY,EAAE;oBAAEF;iBAAe,CAACI,MAAM,CAClD,CAACF,KAAOA,OAAO,QAAQA,OAAOL;gBAGhC,IAAIM,YAAYE,IAAI,CAAC,CAACH,KAAO,OAAOA,OAAO,YAAY,OAAOA,OAAO,WAAW;oBAC9E,MAAM,IAAIlD,UAAUuC,IAAIC,CAAC;gBAC3B;gBAEA,IAAIW,YAAYG,MAAM,KAAK,KAAKC,OAAOJ,WAAW,CAAC,EAAE,MAAMI,OAAOJ,WAAW,CAAC,EAAE,GAAG;oBACjF,MAAM,IAAInD,UAAUuC,IAAIC,CAAC;gBAC3B;gBAEA,MAAMgB,aAAaL,WAAW,CAAC,EAAE;gBAEjC,IAAIK,eAAeX,WAAW;oBAC5B,MAAMY,gBAAgB,MAAMlB,IAAImB,OAAO,CAACC,QAAQ,CAAC;wBAC/CT,IAAIM;wBACJI,YAAYnB,iBAAiB/B,IAAI;wBACjCmD,OAAO;wBACPC,eAAe;wBACfC,OAAO;wBACPC,gBAAgB;wBAChBzB;wBACA0B,OAAO;wBACPC,MAAM3B,IAAI2B,IAAI;oBAChB;oBAEA,IAAI,CAACT,eAAe;wBAClB,MAAM,EAAEU,SAAS,EAAE,GAAG,MAAM5B,IAAImB,OAAO,CAACU,KAAK,CAAC;4BAC5CR,YAAYnB,iBAAiB/B,IAAI;4BACjCoD,eAAe;4BACfE,gBAAgB;4BAChBzB;4BACA0B,OAAO;4BACPI,OAAO;gCACLnB,IAAI;oCACFoB,QAAQd;gCACV;4BACF;wBACF;wBAEA,IAAIW,YAAY,GAAG;4BACjB,MAAM,IAAInE,UAAUuC,IAAIC,CAAC;wBAC3B;wBAEA,IAAIC,iBAAiB8B,MAAM,EAAEC,QAAQ;4BACnC,MAAMzE,cACJ;gCAAEW,MAAM+B,iBAAiB/B,IAAI;gCAAE4B,MAAMA,KAAKW,GAAG;gCAAEV;4BAAI,GACnDE,iBAAiB8B,MAAM,CAACC,MAAM;wBAElC;oBACF;gBACF,OAAO,IAAI/B,iBAAiB8B,MAAM,EAAEC,QAAQ;oBAC1C,MAAMzE,cACJ;wBAAEW,MAAM+B,iBAAiB/B,IAAI;wBAAE4B,MAAMA,KAAKW,GAAG;wBAAEV;oBAAI,GACnDE,iBAAiB8B,MAAM,CAACC,MAAM;gBAElC;gBAEA,OAAO;oBAAE/B;oBAAkBK,cAAcD;gBAAU;YACrD;YAEA,IAAIC,gBAAgB,CAACR,KAAKI,cAAc,EAAE;gBACxC,MAAMO,MAAM,MAAMV,IAAImB,OAAO,CAACe,UAAU,CAAC;oBACvC/D,MAAMoC,aAAapC,IAAI;oBACvBmD,OAAO;oBACPC,eAAe;oBACfC,OAAO;oBACPC,gBAAgB;oBAChBzB;oBACA2B,MAAM3B,IAAI2B,IAAI;gBAChB;gBAEA,IAAI,CAACjB,KAAK;oBACR,MAAM,IAAIjD,UAAUuC,IAAIC,CAAC;gBAC3B;gBAEA,OAAO;oBAAEC,kBAAkBI;oBAAWC;gBAAa;YACrD;YAEA,MAAM,IAAI9C,UAAUuC,IAAIC,CAAC;QAC3B;QAEA,OAAO;YACL,GAAG5B,MAAM;YACToB,aACEpB,OAAOoB,WAAW,EAAE0C,IAAI,CAACd;gBACvB,MAAM,EAAElD,IAAI,EAAE,GAAGkD;gBACjB,MAAMe,YAAY7D,cAAckB,aAAaW,SAASjC;gBAEtD,IAAIiE,WAAW;oBACb,IAAI7D,cAAc8D,UAAU;wBAC1B,4GAA4G;wBAC5G,MAAMC,aACJjB,WAAWkB,IAAI,IACf,CAAE,CAAA,OAAOlB,WAAWkB,IAAI,KAAK,YAAYlB,WAAWkB,IAAI,CAACC,oBAAoB,AAAD,KAC5EnB,WAAWlC,MAAM,EAAEsD,KAAK,CAACC,QAAU,UAAUA,SAASA,MAAMzD,IAAI,KAAK;wBACvE,MAAM0D,oBAAoBtB,WAAWlC,MAAM,EAAE4B,WAAW,KAAKuB;wBAE7D,MAAMM,UAAuBD,oBACzB;4BACE;gCACEzD,MAAM;gCACN2D,MAAM;oCACJ;wCACE1D,QAAQH;wCACRK,OAAO;oCACT;iCACD;4BACH;yBACD,GACD;4BACE;gCACEH,MAAM;gCACN2D,MAAM;oCACJ,sFAAsF;oCACtF,6FAA6F;uCACzFxB,YAAYlC,QAAQ,CAAC,EAAE,EAAED,SAAS,UACtCmC,YAAYlC,QAAQ,CAAC,EAAE,EAAE0D,OACrBxB,WAAWlC,MAAM,CAAC,EAAE,CAAC0D,IAAI,GACzB;wCACE;4CACE1D,QAAQ;mDACFmD,aACAjB,WAAWlC,MAAM,CAAC0B,MAAM,CACtB,CAAC6B,QAAU,UAAUA,SAASA,MAAMzD,IAAI,KAAK,WAE/CoC,WAAWlC,MAAM;6CACtB;4CACDE,OAAOgC,YAAYyB,QAAQC,YAAY;wCACzC;qCACD;oCACL;wCACE5D,QAAQH;wCACRK,OAAO;oCACT;iCACD;4BACH;yBACD;wBAEL,OAAO;4BACL,GAAGgC,UAAU;4BACblC,QAAQ;mCACFmD,aAAa;oCAACA;iCAAW,GAAG,EAAE;mCAC/BM;mCACCvB,YAAYlC,QAAQ,CAAC,EAAE,EAAED,SAAS,SAASmC,WAAWlC,MAAM,CAAC6D,KAAK,CAAC,KAAK,EAAE;6BAC/E;wBACH;oBACF;oBAEA,OAAO;wBACL,GAAG3B,UAAU;wBACblC,QAAQ;+BAAKkC,YAAYlC,UAAU,EAAE;+BAAMH;yBAAU;oBACvD;gBACF;gBAEA,OAAOqC;YACT,MAAM,EAAE;YACV4B,WAAW;mBACL5E,OAAO4E,SAAS,IAAI,EAAE;gBAC1B;oBACEC,SAAS,OAAOlD;wBACd,MAAMmD,kBAAkB;4BAAEnD;wBAAI;wBAE9B,MAAMD,OAGF,MAAMC,IAAIoD,IAAI;wBAElB,MAAMC,UAAUtD,QAAQC,IAAID,IAAI;wBAChC,MAAM,EAAEG,gBAAgB,EAAEK,YAAY,EAAE,GAAG,MAAMT,wBAAwB;4BACvEC,MAAMsD;4BACNrD;wBACF;wBAEA,MAAMsD,SAAS/E,aAAaG,aAAa,GACrC,MAAMH,aAAaG,aAAa,CAAC;4BAC/B,GAAGqB,IAAI;4BACPG;4BACAK;4BACAP;wBACF,KACA;wBACJ,OAAO,IAAIuD,SAASC,KAAKC,SAAS,CAAC;4BAAEH;wBAAO,IAAI;4BAAEI,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;gBACA;oBACEV,SAAS,OAAOlD;wBACd,MAAMmD,kBAAkB;4BAAEnD;wBAAI;wBAE9B,MAAMD,OAGF,MAAMC,IAAIoD,IAAI;wBAElB,MAAMC,UAAUtD,QAAQC,IAAID,IAAI;wBAChC,MAAM,EAAEG,gBAAgB,EAAEK,YAAY,EAAE,GAAG,MAAMT,wBAAwB;4BACvEC,MAAMsD;4BACNrD;wBACF;wBAEA,MAAMsD,SAAS/E,aAAaI,mBAAmB,GAC3C,MAAMJ,aAAaI,mBAAmB,CAAC;4BACrC,GAAGoB,IAAI;4BACPG;4BACAK;4BACAP;wBACF,KACA;wBACJ,OAAO,IAAIuD,SAASC,KAAKC,SAAS,CAAC;4BAAEH;wBAAO,IAAI;4BAAEI,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;gBACA;oBACEV,SAAS,OAAOlD;wBACd,MAAMmD,kBAAkB;4BAAEnD;wBAAI;wBAE9B,MAAMD,OAGF,MAAMC,IAAIoD,IAAI;wBAElB,MAAMC,UAAUtD,QAAQC,IAAID,IAAI;wBAChC,MAAM,EAAEG,gBAAgB,EAAEK,YAAY,EAAE,GAAG,MAAMT,wBAAwB;4BACvEC,MAAMsD;4BACNrD;wBACF;wBAEA,MAAMsD,SAAS/E,aAAaQ,WAAW,GACnC,MAAMR,aAAaQ,WAAW,CAAC;4BAC7B,GAAGgB,IAAI;4BACPG;4BACAK;4BACAP;wBACF,KACA;wBACJ,OAAO,IAAIuD,SAASC,KAAKC,SAAS,CAAC;4BAAEH;wBAAO,IAAI;4BAAEI,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;gBACA;oBACEV,SAAS,OAAOlD;wBACd,MAAMmD,kBAAkB;4BAAEnD;wBAAI;wBAE9B,MAAMD,OAGF,MAAMC,IAAIoD,IAAI;wBAElB,MAAMC,UAAUtD,QAAQC,IAAID,IAAI;wBAChC,MAAM,EAAEG,gBAAgB,EAAEK,YAAY,EAAE,GAAG,MAAMT,wBAAwB;4BACvEC,MAAMsD;4BACNrD;wBACF;wBAEA,MAAMsD,SAAS/E,aAAaM,aAAa,GACrC,MAAMN,aAAaM,aAAa,CAAC;4BAC/B,GAAGkB,IAAI;4BACPG;4BACAK;4BACAP;wBACF,KACA;wBACJ,OAAO,IAAIuD,SAASC,KAAKC,SAAS,CAAC;4BAAEH;wBAAO,IAAI;4BAAEI,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;aACD;YACD/D,SACExB,OAAOwB,OAAO,EAAEsC,IAAI,CAAC0B;gBACnB,MAAM,EAAE1F,IAAI,EAAE,GAAG0F;gBACjB,MAAMzB,YAAY7D,cAAcsB,SAASO,SAASjC;gBAElD,IAAIiE,WAAW;oBACb,IAAI7D,cAAc8D,UAAU;wBAC1B,MAAMO,UAAuB;4BAC3B;gCACE1D,MAAM;gCACN2D,MAAM;oCACJ,sFAAsF;oCACtF,yFAAyF;uCACrFgB,QAAQ1E,QAAQ,CAAC,EAAE,EAAED,SAAS,UAAU2E,QAAQ1E,QAAQ,CAAC,EAAE,CAAC0D,OAC5DgB,OAAO1E,MAAM,CAAC,EAAE,CAAC0D,IAAI,GACrB;wCACE;4CACE1D,QAAQ;mDAAK0E,QAAQ1E,UAAU,EAAE;6CAAE;4CACnCE,OAAOwE,QAAQxE,SAAS;wCAC1B;qCACD;oCACL;wCACEF,QAAQH;wCACRK,OAAO;oCACT;iCACD;4BACH;yBACD;wBAED,OAAO;4BACL,GAAGwE,MAAM;4BACT1E,QAAQ;mCACHyD;mCACCiB,QAAQ1E,QAAQ,CAAC,EAAE,EAAED,SAAS,SAAS2E,OAAO1E,MAAM,CAAC6D,KAAK,CAAC,KAAK,EAAE;6BACvE;wBACH;oBACF;oBAEA,OAAO;wBACL,GAAGa,MAAM;wBACT1E,QAAQ;+BAAK0E,QAAQ1E,UAAU,EAAE;+BAAMH;yBAAU;oBACnD;gBACF;gBAEA,OAAO6E;YACT,MAAM,EAAE;YACVC,MAAM;gBACJ,GAAGzF,OAAOyF,IAAI;gBACd7F,cAAcN,gBAAgBM,cAAcI,OAAOyF,IAAI,EAAE7F,gBAAgB,CAAC;YAC5E;QACF;IACF;AACF,GAAE;AAEF,MAAMkF,oBAAoB,OAAO,EAAEnD,GAAG,EAA2B;IAC/D,IAAI,CAACA,IAAI2B,IAAI,EAAE;QACb,MAAM,IAAIjE,kBAAkBsC,IAAIC,CAAC;IACnC;IAEA,MAAM3C,eAAe;QAAE0C;IAAI;AAC7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-seo",
3
- "version": "4.0.0-internal.cc18726",
3
+ "version": "4.0.0-internal.cd47d20",
4
4
  "description": "SEO plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -57,20 +57,20 @@
57
57
  "dist"
58
58
  ],
59
59
  "dependencies": {
60
- "@payloadcms/translations": "4.0.0-internal.cc18726",
61
- "@payloadcms/ui": "4.0.0-internal.cc18726"
60
+ "@payloadcms/ui": "4.0.0-internal.cd47d20",
61
+ "@payloadcms/translations": "4.0.0-internal.cd47d20"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@types/react": "19.2.14",
65
65
  "@types/react-dom": "19.2.3",
66
66
  "@payloadcms/eslint-config": "3.28.0",
67
- "@payloadcms/next": "4.0.0-internal.cc18726",
68
- "payload": "4.0.0-internal.cc18726"
67
+ "@payloadcms/next": "4.0.0-internal.cd47d20",
68
+ "payload": "4.0.0-internal.cd47d20"
69
69
  },
70
70
  "peerDependencies": {
71
71
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
72
72
  "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
73
- "payload": "4.0.0-internal.cc18726"
73
+ "payload": "4.0.0-internal.cd47d20"
74
74
  },
75
75
  "publishConfig": {
76
76
  "registry": "https://registry.npmjs.org/"
@@ -82,7 +82,7 @@
82
82
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
83
83
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
84
84
  "clean": "rimraf -g {dist,*.tsbuildinfo}",
85
- "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
85
+ "copyfiles": "copyfiles -u 1 -e \"**/*.spec.*\" \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
86
86
  "lint": "eslint .",
87
87
  "lint:fix": "eslint . --fix"
88
88
  }