@payloadcms/plugin-seo 4.0.0-internal.d28e9fb → 4.0.0-internal.d7d662c
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.
- package/LICENSE.md +1 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/fields/MetaDescription/MetaDescriptionComponent.d.ts +1 -0
- package/dist/fields/MetaDescription/MetaDescriptionComponent.d.ts.map +1 -1
- package/dist/fields/MetaDescription/MetaDescriptionComponent.js +3 -2
- package/dist/fields/MetaDescription/MetaDescriptionComponent.js.map +1 -1
- package/dist/fields/MetaImage/MetaImageComponent.d.ts +1 -0
- package/dist/fields/MetaImage/MetaImageComponent.d.ts.map +1 -1
- package/dist/fields/MetaImage/MetaImageComponent.js +3 -2
- package/dist/fields/MetaImage/MetaImageComponent.js.map +1 -1
- package/dist/fields/MetaTitle/MetaTitleComponent.d.ts +2 -1
- package/dist/fields/MetaTitle/MetaTitleComponent.d.ts.map +1 -1
- package/dist/fields/MetaTitle/MetaTitleComponent.js +4 -3
- package/dist/fields/MetaTitle/MetaTitleComponent.js.map +1 -1
- package/dist/fields/Overview/OverviewComponent.d.ts.map +1 -1
- package/dist/fields/Overview/OverviewComponent.js +4 -1
- package/dist/fields/Overview/OverviewComponent.js.map +1 -1
- package/dist/fields/Preview/PreviewComponent.d.ts +1 -0
- package/dist/fields/Preview/PreviewComponent.d.ts.map +1 -1
- package/dist/fields/Preview/PreviewComponent.js +9 -20
- package/dist/fields/Preview/PreviewComponent.js.map +1 -1
- package/dist/fields/colors.css +27 -0
- package/dist/fields/{index.scss → index.css} +2 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +177 -10
- package/dist/index.js.map +1 -1
- package/dist/translations/my.d.ts.map +1 -1
- package/dist/translations/my.js.map +1 -1
- package/dist/translations/ta.d.ts.map +1 -1
- package/dist/translations/ta.js.map +1 -1
- package/dist/translations/th.d.ts.map +1 -1
- package/dist/translations/th.js.map +1 -1
- package/dist/ui/LengthIndicator.d.ts +1 -0
- package/dist/ui/LengthIndicator.d.ts.map +1 -1
- package/dist/ui/LengthIndicator.js +12 -11
- package/dist/ui/LengthIndicator.js.map +1 -1
- package/package.json +26 -30
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { canAccessAdmin, definePlugin, executeAccess, Forbidden, traverseFields, UnauthorizedError } from 'payload';
|
|
1
2
|
import { deepMergeSimple } from 'payload/shared';
|
|
2
3
|
import { MetaDescriptionField } from './fields/MetaDescription/index.js';
|
|
3
4
|
import { MetaImageField } from './fields/MetaImage/index.js';
|
|
@@ -5,7 +6,9 @@ import { MetaTitleField } from './fields/MetaTitle/index.js';
|
|
|
5
6
|
import { OverviewField } from './fields/Overview/index.js';
|
|
6
7
|
import { PreviewField } from './fields/Preview/index.js';
|
|
7
8
|
import { translations } from './translations/index.js';
|
|
8
|
-
export const seoPlugin = (
|
|
9
|
+
export const seoPlugin = definePlugin({
|
|
10
|
+
slug: '@payloadcms/plugin-seo',
|
|
11
|
+
plugin: ({ config, options: pluginConfig })=>{
|
|
9
12
|
const defaultFields = [
|
|
10
13
|
OverviewField({}),
|
|
11
14
|
MetaTitleField({
|
|
@@ -37,6 +40,108 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
37
40
|
label: 'SEO'
|
|
38
41
|
}
|
|
39
42
|
];
|
|
43
|
+
const collectionConfigBySlug = new Map();
|
|
44
|
+
const collectionGenerationTargetSlugs = new Set(pluginConfig.collections ?? []);
|
|
45
|
+
for (const c of config.collections ?? []){
|
|
46
|
+
collectionConfigBySlug.set(c.slug, c);
|
|
47
|
+
if (hasSEOGenerationField({
|
|
48
|
+
config,
|
|
49
|
+
fields: c.fields
|
|
50
|
+
})) {
|
|
51
|
+
collectionGenerationTargetSlugs.add(c.slug);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const globalConfigBySlug = new Map();
|
|
55
|
+
for (const g of config.globals ?? []){
|
|
56
|
+
globalConfigBySlug.set(g.slug, g);
|
|
57
|
+
}
|
|
58
|
+
const authorizeGenerateTarget = async ({ data, req })=>{
|
|
59
|
+
if (!data || typeof data !== 'object') {
|
|
60
|
+
throw new Forbidden(req.t);
|
|
61
|
+
}
|
|
62
|
+
const collectionConfig = data.collectionSlug && collectionGenerationTargetSlugs.has(data.collectionSlug) ? collectionConfigBySlug.get(data.collectionSlug) : undefined;
|
|
63
|
+
const globalConfig = data.globalSlug && pluginConfig.globals?.includes(data.globalSlug) ? globalConfigBySlug.get(data.globalSlug) : undefined;
|
|
64
|
+
if (collectionConfig && !data.globalSlug) {
|
|
65
|
+
const dataDocumentID = data.doc && typeof data.doc === 'object' && 'id' in data.doc ? data.doc.id : undefined;
|
|
66
|
+
const documentIDs = [
|
|
67
|
+
data.id,
|
|
68
|
+
dataDocumentID
|
|
69
|
+
].filter((id)=>id !== null && id !== undefined);
|
|
70
|
+
if (documentIDs.some((id)=>typeof id !== 'string' && typeof id !== 'number')) {
|
|
71
|
+
throw new Forbidden(req.t);
|
|
72
|
+
}
|
|
73
|
+
if (documentIDs.length === 2 && String(documentIDs[0]) !== String(documentIDs[1])) {
|
|
74
|
+
throw new Forbidden(req.t);
|
|
75
|
+
}
|
|
76
|
+
const documentID = documentIDs[0];
|
|
77
|
+
if (documentID !== undefined) {
|
|
78
|
+
const accessibleDoc = await req.payload.findByID({
|
|
79
|
+
id: documentID,
|
|
80
|
+
collection: collectionConfig.slug,
|
|
81
|
+
depth: 0,
|
|
82
|
+
disableErrors: true,
|
|
83
|
+
draft: true,
|
|
84
|
+
overrideAccess: false,
|
|
85
|
+
req,
|
|
86
|
+
trash: true,
|
|
87
|
+
user: req.user
|
|
88
|
+
});
|
|
89
|
+
if (!accessibleDoc) {
|
|
90
|
+
const { totalDocs } = await req.payload.count({
|
|
91
|
+
collection: collectionConfig.slug,
|
|
92
|
+
disableErrors: true,
|
|
93
|
+
overrideAccess: true,
|
|
94
|
+
req,
|
|
95
|
+
trash: true,
|
|
96
|
+
where: {
|
|
97
|
+
id: {
|
|
98
|
+
equals: documentID
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
if (totalDocs > 0) {
|
|
103
|
+
throw new Forbidden(req.t);
|
|
104
|
+
}
|
|
105
|
+
if (collectionConfig.access?.create) {
|
|
106
|
+
await executeAccess({
|
|
107
|
+
slug: collectionConfig.slug,
|
|
108
|
+
data: data.doc,
|
|
109
|
+
req
|
|
110
|
+
}, collectionConfig.access.create);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
} else if (collectionConfig.access?.create) {
|
|
114
|
+
await executeAccess({
|
|
115
|
+
slug: collectionConfig.slug,
|
|
116
|
+
data: data.doc,
|
|
117
|
+
req
|
|
118
|
+
}, collectionConfig.access.create);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
collectionConfig,
|
|
122
|
+
globalConfig: undefined
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (globalConfig && !data.collectionSlug) {
|
|
126
|
+
const doc = await req.payload.findGlobal({
|
|
127
|
+
slug: globalConfig.slug,
|
|
128
|
+
depth: 0,
|
|
129
|
+
disableErrors: true,
|
|
130
|
+
draft: true,
|
|
131
|
+
overrideAccess: false,
|
|
132
|
+
req,
|
|
133
|
+
user: req.user
|
|
134
|
+
});
|
|
135
|
+
if (!doc) {
|
|
136
|
+
throw new Forbidden(req.t);
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
collectionConfig: undefined,
|
|
140
|
+
globalConfig
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
throw new Forbidden(req.t);
|
|
144
|
+
};
|
|
40
145
|
return {
|
|
41
146
|
...config,
|
|
42
147
|
collections: config.collections?.map((collection)=>{
|
|
@@ -103,12 +208,19 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
103
208
|
...config.endpoints ?? [],
|
|
104
209
|
{
|
|
105
210
|
handler: async (req)=>{
|
|
211
|
+
await authorizeGenerate({
|
|
212
|
+
req
|
|
213
|
+
});
|
|
106
214
|
const data = await req.json?.();
|
|
107
215
|
const reqData = data ?? req.data;
|
|
216
|
+
const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
|
|
217
|
+
data: reqData,
|
|
218
|
+
req
|
|
219
|
+
});
|
|
108
220
|
const result = pluginConfig.generateTitle ? await pluginConfig.generateTitle({
|
|
109
221
|
...data,
|
|
110
|
-
collectionConfig
|
|
111
|
-
globalConfig
|
|
222
|
+
collectionConfig,
|
|
223
|
+
globalConfig,
|
|
112
224
|
req
|
|
113
225
|
}) : '';
|
|
114
226
|
return new Response(JSON.stringify({
|
|
@@ -122,12 +234,19 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
122
234
|
},
|
|
123
235
|
{
|
|
124
236
|
handler: async (req)=>{
|
|
237
|
+
await authorizeGenerate({
|
|
238
|
+
req
|
|
239
|
+
});
|
|
125
240
|
const data = await req.json?.();
|
|
126
241
|
const reqData = data ?? req.data;
|
|
242
|
+
const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
|
|
243
|
+
data: reqData,
|
|
244
|
+
req
|
|
245
|
+
});
|
|
127
246
|
const result = pluginConfig.generateDescription ? await pluginConfig.generateDescription({
|
|
128
247
|
...data,
|
|
129
|
-
collectionConfig
|
|
130
|
-
globalConfig
|
|
248
|
+
collectionConfig,
|
|
249
|
+
globalConfig,
|
|
131
250
|
req
|
|
132
251
|
}) : '';
|
|
133
252
|
return new Response(JSON.stringify({
|
|
@@ -141,12 +260,19 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
141
260
|
},
|
|
142
261
|
{
|
|
143
262
|
handler: async (req)=>{
|
|
263
|
+
await authorizeGenerate({
|
|
264
|
+
req
|
|
265
|
+
});
|
|
144
266
|
const data = await req.json?.();
|
|
145
267
|
const reqData = data ?? req.data;
|
|
268
|
+
const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
|
|
269
|
+
data: reqData,
|
|
270
|
+
req
|
|
271
|
+
});
|
|
146
272
|
const result = pluginConfig.generateURL ? await pluginConfig.generateURL({
|
|
147
273
|
...data,
|
|
148
|
-
collectionConfig
|
|
149
|
-
globalConfig
|
|
274
|
+
collectionConfig,
|
|
275
|
+
globalConfig,
|
|
150
276
|
req
|
|
151
277
|
}) : '';
|
|
152
278
|
return new Response(JSON.stringify({
|
|
@@ -160,12 +286,19 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
160
286
|
},
|
|
161
287
|
{
|
|
162
288
|
handler: async (req)=>{
|
|
289
|
+
await authorizeGenerate({
|
|
290
|
+
req
|
|
291
|
+
});
|
|
163
292
|
const data = await req.json?.();
|
|
164
293
|
const reqData = data ?? req.data;
|
|
294
|
+
const { collectionConfig, globalConfig } = await authorizeGenerateTarget({
|
|
295
|
+
data: reqData,
|
|
296
|
+
req
|
|
297
|
+
});
|
|
165
298
|
const result = pluginConfig.generateImage ? await pluginConfig.generateImage({
|
|
166
299
|
...data,
|
|
167
|
-
collectionConfig
|
|
168
|
-
globalConfig
|
|
300
|
+
collectionConfig,
|
|
301
|
+
globalConfig,
|
|
169
302
|
req
|
|
170
303
|
}) : '';
|
|
171
304
|
return new Response(JSON.stringify({
|
|
@@ -227,6 +360,40 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
227
360
|
translations: deepMergeSimple(translations, config.i18n?.translations ?? {})
|
|
228
361
|
}
|
|
229
362
|
};
|
|
230
|
-
}
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
const hasSEOGenerationField = ({ config, fields })=>{
|
|
366
|
+
let hasGenerationField = false;
|
|
367
|
+
traverseFields({
|
|
368
|
+
callback: ({ field })=>{
|
|
369
|
+
if (!('admin' in field)) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const fieldComponent = field.admin?.components?.Field;
|
|
373
|
+
const generationProp = fieldComponent && typeof fieldComponent === 'object' ? seoGenerationComponentProps[fieldComponent.path] : undefined;
|
|
374
|
+
if (generationProp && fieldComponent.clientProps?.[generationProp] === true) {
|
|
375
|
+
hasGenerationField = true;
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
config,
|
|
380
|
+
fields
|
|
381
|
+
});
|
|
382
|
+
return hasGenerationField;
|
|
383
|
+
};
|
|
384
|
+
const seoGenerationComponentProps = {
|
|
385
|
+
'@payloadcms/plugin-seo/client#MetaDescriptionComponent': 'hasGenerateDescriptionFn',
|
|
386
|
+
'@payloadcms/plugin-seo/client#MetaImageComponent': 'hasGenerateImageFn',
|
|
387
|
+
'@payloadcms/plugin-seo/client#MetaTitleComponent': 'hasGenerateTitleFn',
|
|
388
|
+
'@payloadcms/plugin-seo/client#PreviewComponent': 'hasGenerateURLFn'
|
|
389
|
+
};
|
|
390
|
+
const authorizeGenerate = async ({ req })=>{
|
|
391
|
+
if (!req.user) {
|
|
392
|
+
throw new UnauthorizedError(req.t);
|
|
393
|
+
}
|
|
394
|
+
await canAccessAdmin({
|
|
395
|
+
req
|
|
396
|
+
});
|
|
397
|
+
};
|
|
231
398
|
|
|
232
399
|
//# 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 { 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 =\n (pluginConfig: SEOPluginConfig) =>\n (config: Config): Config => {\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 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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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"],"names":["deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","translations","seoPlugin","pluginConfig","config","defaultFields","hasGenerateFn","generateTitle","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","name","type","fields","interfaceName","label","collections","map","collection","slug","isEnabled","includes","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","length","seoTabs","tabs","filter","labels","singular","slice","endpoints","handler","req","data","json","reqData","result","collectionConfig","c","collectionSlug","globalConfig","globals","g","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 {\n canAccessAdmin,\n definePlugin,\n executeAccess,\n Forbidden,\n traverseFields,\n UnauthorizedError,\n} 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 const collectionGenerationTargetSlugs = new Set(pluginConfig.collections ?? [])\n for (const c of config.collections ?? []) {\n collectionConfigBySlug.set(c.slug, c)\n\n if (hasSEOGenerationField({ config, fields: c.fields })) {\n collectionGenerationTargetSlugs.add(c.slug)\n }\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 && collectionGenerationTargetSlugs.has(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 hasSEOGenerationField = ({\n config,\n fields,\n}: {\n config: Config\n fields: Field[]\n}): boolean => {\n let hasGenerationField = false\n\n traverseFields({\n callback: ({ field }) => {\n if (!('admin' in field)) {\n return\n }\n\n const fieldComponent = field.admin?.components?.Field\n const generationProp =\n fieldComponent && typeof fieldComponent === 'object'\n ? seoGenerationComponentProps[\n fieldComponent.path as keyof typeof seoGenerationComponentProps\n ]\n : undefined\n\n if (\n generationProp &&\n (fieldComponent as { clientProps?: Record<string, unknown> }).clientProps?.[\n generationProp\n ] === true\n ) {\n hasGenerationField = true\n\n return true\n }\n },\n config,\n fields,\n })\n\n return hasGenerationField\n}\n\nconst seoGenerationComponentProps = {\n '@payloadcms/plugin-seo/client#MetaDescriptionComponent': 'hasGenerateDescriptionFn',\n '@payloadcms/plugin-seo/client#MetaImageComponent': 'hasGenerateImageFn',\n '@payloadcms/plugin-seo/client#MetaTitleComponent': 'hasGenerateTitleFn',\n '@payloadcms/plugin-seo/client#PreviewComponent': 'hasGenerateURLFn',\n} as const\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","traverseFields","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","collectionGenerationTargetSlugs","Set","collections","c","set","hasSEOGenerationField","add","globalConfigBySlug","g","globals","authorizeGenerateTarget","data","req","t","collectionConfig","collectionSlug","has","get","undefined","globalConfig","globalSlug","includes","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","hasGenerationField","callback","fieldComponent","admin","components","Field","generationProp","seoGenerationComponentProps","clientProps"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"my.d.ts","sourceRoot":"","sources":["../../src/translations/my.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,eAAO,MAAM,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"my.d.ts","sourceRoot":"","sources":["../../src/translations/my.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,eAAO,MAAM,EAAE,EAAE,yBAwBhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/my.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const my: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'နည်းနည်းပဲကျန်သေးသည်',\n autoGenerate: 'အလိုအလျောက်ထုတ်လုပ်မည်',\n bestPractices: 'အကောင်းဆုံးအကဲဖြတ်မှုများ',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} လုံး, ',\n charactersLeftOver: '{{characters}} လုံးကျော်နေသည်',\n charactersToGo: '{{characters}} လုံးလိုသေးသည်',\n charactersTooMany: '{{characters}} လုံးများသွားသည်',\n checksPassing: '{{current}}/{{max}} စစ်ဆေးမှုအောင်မြင်ခဲ့သည်',\n good: 'ကောင်းမွန်သည်',\n imageAutoGenerationTip: 'အလိုအလျောက်ထုတ်လုပ်မှုသည် ရွေးချယ်ထားသော ဟီးရိုးပုံကိုယူမည်။',\n lengthTipDescription:\n 'ဤအကြောင်းအရာသည် {{minLength}} နှင့် {{maxLength}} အကြားရှိသင့်သည်။ အရည်အသွေးမြင့် meta ဖော်ပြချက်ရေးသားရန်အတွက်အကြံဉာဏ်များကို ကြည့်ရန် ',\n lengthTipTitle:\n 'ဤအကြောင်းအရာသည် {{minLength}} နှင့် {{maxLength}} အကြားရှိသင့်သည်။ အရည်အသွေးမြင့် meta ခေါင်းစဉ်ရေးသားရန်အတွက်အကြံဉာဏ်များကို ကြည့်ရန် ',\n missing: 'ပျောက်နေသည်',\n noImage: 'ပုံမရှိပါ',\n preview: 'မကြိုတင်ကြည့်ရှုနိုင်ပါ',\n previewDescription
|
|
1
|
+
{"version":3,"sources":["../../src/translations/my.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const my: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'နည်းနည်းပဲကျန်သေးသည်',\n autoGenerate: 'အလိုအလျောက်ထုတ်လုပ်မည်',\n bestPractices: 'အကောင်းဆုံးအကဲဖြတ်မှုများ',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} လုံး, ',\n charactersLeftOver: '{{characters}} လုံးကျော်နေသည်',\n charactersToGo: '{{characters}} လုံးလိုသေးသည်',\n charactersTooMany: '{{characters}} လုံးများသွားသည်',\n checksPassing: '{{current}}/{{max}} စစ်ဆေးမှုအောင်မြင်ခဲ့သည်',\n good: 'ကောင်းမွန်သည်',\n imageAutoGenerationTip: 'အလိုအလျောက်ထုတ်လုပ်မှုသည် ရွေးချယ်ထားသော ဟီးရိုးပုံကိုယူမည်။',\n lengthTipDescription:\n 'ဤအကြောင်းအရာသည် {{minLength}} နှင့် {{maxLength}} အကြားရှိသင့်သည်။ အရည်အသွေးမြင့် meta ဖော်ပြချက်ရေးသားရန်အတွက်အကြံဉာဏ်များကို ကြည့်ရန် ',\n lengthTipTitle:\n 'ဤအကြောင်းအရာသည် {{minLength}} နှင့် {{maxLength}} အကြားရှိသင့်သည်။ အရည်အသွေးမြင့် meta ခေါင်းစဉ်ရေးသားရန်အတွက်အကြံဉာဏ်များကို ကြည့်ရန် ',\n missing: 'ပျောက်နေသည်',\n noImage: 'ပုံမရှိပါ',\n preview: 'မကြိုတင်ကြည့်ရှုနိုင်ပါ',\n previewDescription: 'တိကျသော ရှာဖွေမှုရလဒ်များသည် အကြောင်းအရာနှင့် ရှာဖွေရေးအသင့်တော်မှုပေါ်မူတည်၍ မတူကွဲပြားနိုင်သည်။',\n tooLong: 'တော်တော်ကြာသည်',\n tooShort: 'တော်တော်တိုသည်',\n },\n}\n"],"names":["my","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ta.d.ts","sourceRoot":"","sources":["../../src/translations/ta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,eAAO,MAAM,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"ta.d.ts","sourceRoot":"","sources":["../../src/translations/ta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,eAAO,MAAM,EAAE,EAAE,yBAwBhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/ta.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const ta: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'கிட்டத்தட்ட முடிந்துவிட்டது',\n autoGenerate: 'தானாக உருவாக்கு',\n bestPractices: 'சிறந்த நடைமுறைகள்',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} எழுத்துகள், ',\n charactersLeftOver: '{{characters}} மீதம் உள்ளது',\n charactersToGo: '{{characters}} எழுத வேண்டும்',\n charactersTooMany: '{{characters}} அதிகமாக உள்ளது',\n checksPassing: '{{current}}/{{max}} சோதனைகள் வெற்றி',\n good: 'நன்று',\n imageAutoGenerationTip: 'தானியங்கு உருவாக்கம் தேர்ந்தெடுக்கப்பட்ட முக்கியப் படத்தை எடுக்கும்.',\n lengthTipDescription:\n 'இது {{minLength}} மற்றும் {{maxLength}} எழுத்துகளுக்கு இடையில் இருக்க வேண்டும். தரமான மெட்டா விளக்கங்களை எழுத உதவிக்கு பார்க்கவும் ',\n lengthTipTitle:\n 'இது {{minLength}} மற்றும் {{maxLength}} எழுத்துகளுக்கு இடையில் இருக்க வேண்டும். தரமான மெட்டா தலைப்புகளை எழுத உதவிக்கு பார்க்கவும் ',\n missing: 'இல்லை',\n noImage: 'படம் இல்லை',\n preview: 'முன்னோட்டம்',\n previewDescription
|
|
1
|
+
{"version":3,"sources":["../../src/translations/ta.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const ta: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'கிட்டத்தட்ட முடிந்துவிட்டது',\n autoGenerate: 'தானாக உருவாக்கு',\n bestPractices: 'சிறந்த நடைமுறைகள்',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} எழுத்துகள், ',\n charactersLeftOver: '{{characters}} மீதம் உள்ளது',\n charactersToGo: '{{characters}} எழுத வேண்டும்',\n charactersTooMany: '{{characters}} அதிகமாக உள்ளது',\n checksPassing: '{{current}}/{{max}} சோதனைகள் வெற்றி',\n good: 'நன்று',\n imageAutoGenerationTip: 'தானியங்கு உருவாக்கம் தேர்ந்தெடுக்கப்பட்ட முக்கியப் படத்தை எடுக்கும்.',\n lengthTipDescription:\n 'இது {{minLength}} மற்றும் {{maxLength}} எழுத்துகளுக்கு இடையில் இருக்க வேண்டும். தரமான மெட்டா விளக்கங்களை எழுத உதவிக்கு பார்க்கவும் ',\n lengthTipTitle:\n 'இது {{minLength}} மற்றும் {{maxLength}} எழுத்துகளுக்கு இடையில் இருக்க வேண்டும். தரமான மெட்டா தலைப்புகளை எழுத உதவிக்கு பார்க்கவும் ',\n missing: 'இல்லை',\n noImage: 'படம் இல்லை',\n preview: 'முன்னோட்டம்',\n previewDescription: 'சரியான முடிவு பட்டியல்கள் உள்ளடக்கம் மற்றும் தேடல் தொடர்புக்கு ஏற்ப மாறலாம்.',\n tooLong: 'மிக நீளம்',\n tooShort: 'மிகக் குறைவு',\n },\n}\n"],"names":["ta","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"th.d.ts","sourceRoot":"","sources":["../../src/translations/th.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,eAAO,MAAM,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"th.d.ts","sourceRoot":"","sources":["../../src/translations/th.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,eAAO,MAAM,EAAE,EAAE,yBAwBhB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/th.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const th: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'เกือบเสร็จแล้ว',\n autoGenerate: 'สร้างอัตโนมัติ',\n bestPractices: 'แนวปฏิบัติที่ดีที่สุด',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} ตัวอักษร, ',\n charactersLeftOver: '{{characters}} ตัวอักษรที่เหลือ',\n charactersToGo: '{{characters}} ตัวอักษรที่ต้องการ',\n charactersTooMany: '{{characters}} ตัวอักษรเกินไป',\n checksPassing: '{{current}}/{{max}} การตรวจสอบสำเร็จ',\n good: 'ดี',\n imageAutoGenerationTip: 'การสร้างอัตโนมัติจะดึงภาพหลักที่เลือก',\n lengthTipDescription:\n 'ข้อความนี้ควรมีระหว่าง {{minLength}} และ {{maxLength}} ตัวอักษร สำหรับคำแนะนำในการเขียนคำอธิบายเมตาคุณภาพสูง โปรดดูที่ ',\n lengthTipTitle:\n 'ข้อความนี้ควรมีระหว่าง {{minLength}} และ {{maxLength}} ตัวอักษร สำหรับคำแนะนำในการเขียนหัวข้อเมตาคุณภาพสูง โปรดดูที่ ',\n missing: 'ขาดหายไป',\n noImage: 'ไม่มีภาพ',\n preview: 'ตัวอย่าง',\n previewDescription
|
|
1
|
+
{"version":3,"sources":["../../src/translations/th.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const th: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'เกือบเสร็จแล้ว',\n autoGenerate: 'สร้างอัตโนมัติ',\n bestPractices: 'แนวปฏิบัติที่ดีที่สุด',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} ตัวอักษร, ',\n charactersLeftOver: '{{characters}} ตัวอักษรที่เหลือ',\n charactersToGo: '{{characters}} ตัวอักษรที่ต้องการ',\n charactersTooMany: '{{characters}} ตัวอักษรเกินไป',\n checksPassing: '{{current}}/{{max}} การตรวจสอบสำเร็จ',\n good: 'ดี',\n imageAutoGenerationTip: 'การสร้างอัตโนมัติจะดึงภาพหลักที่เลือก',\n lengthTipDescription:\n 'ข้อความนี้ควรมีระหว่าง {{minLength}} และ {{maxLength}} ตัวอักษร สำหรับคำแนะนำในการเขียนคำอธิบายเมตาคุณภาพสูง โปรดดูที่ ',\n lengthTipTitle:\n 'ข้อความนี้ควรมีระหว่าง {{minLength}} และ {{maxLength}} ตัวอักษร สำหรับคำแนะนำในการเขียนหัวข้อเมตาคุณภาพสูง โปรดดูที่ ',\n missing: 'ขาดหายไป',\n noImage: 'ไม่มีภาพ',\n preview: 'ตัวอย่าง',\n previewDescription: 'ผลลัพธ์การค้นหาที่แท้จริงอาจแตกต่างกันไปตามเนื้อหาและความเกี่ยวข้องของการค้นหา',\n tooLong: 'ยาวเกินไป',\n tooShort: 'สั้นเกินไป',\n },\n}\n"],"names":["th","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LengthIndicator.d.ts","sourceRoot":"","sources":["../../src/ui/LengthIndicator.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAwC,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"LengthIndicator.d.ts","sourceRoot":"","sources":["../../src/ui/LengthIndicator.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAI5D,OAAO,sBAAsB,CAAA;AAG7B,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CA2HA,CAAA"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslation } from '@payloadcms/ui';
|
|
4
4
|
import React, { Fragment, useEffect, useState } from 'react';
|
|
5
|
+
import '../fields/colors.css';
|
|
5
6
|
import { Pill } from './Pill.js';
|
|
6
7
|
export const LengthIndicator = (props)=>{
|
|
7
8
|
const { maxLength = 0, minLength = 0, text } = props;
|
|
@@ -17,8 +18,8 @@ export const LengthIndicator = (props)=>{
|
|
|
17
18
|
if (textLength === 0) {
|
|
18
19
|
setLabel(t('plugin-seo:missing'));
|
|
19
20
|
setLabelStyle({
|
|
20
|
-
backgroundColor: '
|
|
21
|
-
color: '
|
|
21
|
+
backgroundColor: 'var(--seo-danger-bg)',
|
|
22
|
+
color: 'var(--seo-danger-text)'
|
|
22
23
|
});
|
|
23
24
|
setBarWidth(0);
|
|
24
25
|
} else {
|
|
@@ -28,14 +29,14 @@ export const LengthIndicator = (props)=>{
|
|
|
28
29
|
if (ratioUntilMin > 0.9) {
|
|
29
30
|
setLabel(t('plugin-seo:almostThere'));
|
|
30
31
|
setLabelStyle({
|
|
31
|
-
backgroundColor: '
|
|
32
|
-
color: '
|
|
32
|
+
backgroundColor: 'var(--seo-warning-bg)',
|
|
33
|
+
color: 'var(--seo-warning-text)'
|
|
33
34
|
});
|
|
34
35
|
} else {
|
|
35
36
|
setLabel(t('plugin-seo:tooShort'));
|
|
36
37
|
setLabelStyle({
|
|
37
|
-
backgroundColor: '
|
|
38
|
-
color: '
|
|
38
|
+
backgroundColor: 'var(--seo-short-bg)',
|
|
39
|
+
color: 'var(--seo-danger-text)'
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
setBarWidth(ratioUntilMin);
|
|
@@ -43,16 +44,16 @@ export const LengthIndicator = (props)=>{
|
|
|
43
44
|
if (progress >= 0 && progress <= 1) {
|
|
44
45
|
setLabel(t('plugin-seo:good'));
|
|
45
46
|
setLabelStyle({
|
|
46
|
-
backgroundColor: '
|
|
47
|
-
color: '
|
|
47
|
+
backgroundColor: 'var(--seo-success-bg)',
|
|
48
|
+
color: 'var(--seo-success-text)'
|
|
48
49
|
});
|
|
49
50
|
setBarWidth(progress);
|
|
50
51
|
}
|
|
51
52
|
if (progress > 1) {
|
|
52
53
|
setLabel(t('plugin-seo:tooLong'));
|
|
53
54
|
setLabelStyle({
|
|
54
|
-
backgroundColor: '
|
|
55
|
-
color: '
|
|
55
|
+
backgroundColor: 'var(--seo-danger-bg)',
|
|
56
|
+
color: 'var(--seo-danger-text)'
|
|
56
57
|
});
|
|
57
58
|
setBarWidth(1);
|
|
58
59
|
}
|
|
@@ -112,7 +113,7 @@ export const LengthIndicator = (props)=>{
|
|
|
112
113
|
}),
|
|
113
114
|
/*#__PURE__*/ _jsx("div", {
|
|
114
115
|
style: {
|
|
115
|
-
backgroundColor: '
|
|
116
|
+
backgroundColor: 'var(--seo-track-bg)',
|
|
116
117
|
height: '2px',
|
|
117
118
|
position: 'relative',
|
|
118
119
|
width: '100%'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/LengthIndicator.tsx"],"sourcesContent":["'use client'\n\nimport { useTranslation } from '@payloadcms/ui'\nimport React, { Fragment, useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../translations/index.js'\n\nimport { Pill } from './Pill.js'\n\nexport const LengthIndicator: React.FC<{\n maxLength?: number\n minLength?: number\n text?: string\n}> = (props) => {\n const { maxLength = 0, minLength = 0, text } = props\n\n const [labelStyle, setLabelStyle] = useState({\n backgroundColor: '',\n color: '',\n })\n\n const [label, setLabel] = useState('')\n const [barWidth, setBarWidth] = useState<number>(0)\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n useEffect(() => {\n const textLength = text?.length || 0\n\n if (textLength === 0) {\n setLabel(t('plugin-seo:missing'))\n setLabelStyle({\n backgroundColor: '
|
|
1
|
+
{"version":3,"sources":["../../src/ui/LengthIndicator.tsx"],"sourcesContent":["'use client'\n\nimport { useTranslation } from '@payloadcms/ui'\nimport React, { Fragment, useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../translations/index.js'\n\nimport '../fields/colors.css'\nimport { Pill } from './Pill.js'\n\nexport const LengthIndicator: React.FC<{\n maxLength?: number\n minLength?: number\n text?: string\n}> = (props) => {\n const { maxLength = 0, minLength = 0, text } = props\n\n const [labelStyle, setLabelStyle] = useState({\n backgroundColor: '',\n color: '',\n })\n\n const [label, setLabel] = useState('')\n const [barWidth, setBarWidth] = useState<number>(0)\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n useEffect(() => {\n const textLength = text?.length || 0\n\n if (textLength === 0) {\n setLabel(t('plugin-seo:missing'))\n setLabelStyle({\n backgroundColor: 'var(--seo-danger-bg)',\n color: 'var(--seo-danger-text)',\n })\n setBarWidth(0)\n } else {\n const progress = (textLength - minLength) / (maxLength - minLength)\n\n if (progress < 0) {\n const ratioUntilMin = textLength / minLength\n\n if (ratioUntilMin > 0.9) {\n setLabel(t('plugin-seo:almostThere'))\n setLabelStyle({\n backgroundColor: 'var(--seo-warning-bg)',\n color: 'var(--seo-warning-text)',\n })\n } else {\n setLabel(t('plugin-seo:tooShort'))\n setLabelStyle({\n backgroundColor: 'var(--seo-short-bg)',\n color: 'var(--seo-danger-text)',\n })\n }\n\n setBarWidth(ratioUntilMin)\n }\n\n if (progress >= 0 && progress <= 1) {\n setLabel(t('plugin-seo:good'))\n setLabelStyle({\n backgroundColor: 'var(--seo-success-bg)',\n color: 'var(--seo-success-text)',\n })\n setBarWidth(progress)\n }\n\n if (progress > 1) {\n setLabel(t('plugin-seo:tooLong'))\n setLabelStyle({\n backgroundColor: 'var(--seo-danger-bg)',\n color: 'var(--seo-danger-text)',\n })\n setBarWidth(1)\n }\n }\n }, [minLength, maxLength, text, t])\n\n const textLength = text?.length || 0\n\n const charsUntilMax = maxLength - textLength\n const charsUntilMin = minLength - textLength\n\n return (\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n }}\n >\n <Pill backgroundColor={labelStyle.backgroundColor} color={labelStyle.color} label={label} />\n <div\n style={{\n flexShrink: 0,\n lineHeight: 1,\n marginRight: '10px',\n whiteSpace: 'nowrap',\n }}\n >\n <small>\n {t('plugin-seo:characterCount', { current: text?.length || 0, maxLength, minLength })}\n {(textLength === 0 || charsUntilMin > 0) && (\n <Fragment>{t('plugin-seo:charactersToGo', { characters: charsUntilMin })}</Fragment>\n )}\n {charsUntilMin <= 0 && charsUntilMax >= 0 && (\n <Fragment>{t('plugin-seo:charactersLeftOver', { characters: charsUntilMax })}</Fragment>\n )}\n {charsUntilMax < 0 && (\n <Fragment>\n {t('plugin-seo:charactersTooMany', { characters: charsUntilMax * -1 })}\n </Fragment>\n )}\n </small>\n </div>\n <div\n style={{\n backgroundColor: 'var(--seo-track-bg)',\n height: '2px',\n position: 'relative',\n width: '100%',\n }}\n >\n <div\n style={{\n backgroundColor: labelStyle.backgroundColor,\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: `${barWidth * 100}%`,\n }}\n />\n </div>\n </div>\n )\n}\n"],"names":["useTranslation","React","Fragment","useEffect","useState","Pill","LengthIndicator","props","maxLength","minLength","text","labelStyle","setLabelStyle","backgroundColor","color","label","setLabel","barWidth","setBarWidth","t","textLength","length","progress","ratioUntilMin","charsUntilMax","charsUntilMin","div","style","alignItems","display","width","flexShrink","lineHeight","marginRight","whiteSpace","small","current","characters","height","position","left","top"],"mappings":"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"}
|