@focus-reactive/payload-plugin-seo 1.5.0 → 1.6.0
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/README.md +198 -6
- package/dist/admin.css +97 -1
- package/dist/client-config/registry.d.ts +7 -0
- package/dist/client-config/registry.d.ts.map +1 -0
- package/dist/client-config/registry.js +16 -0
- package/dist/client-config/registry.js.map +1 -0
- package/dist/components/SeoField/Meter.d.ts +10 -0
- package/dist/components/SeoField/Meter.d.ts.map +1 -0
- package/dist/components/SeoField/Meter.js +59 -0
- package/dist/components/SeoField/Meter.js.map +1 -0
- package/dist/components/SeoField/icons.d.ts +5 -0
- package/dist/components/SeoField/icons.d.ts.map +1 -0
- package/dist/components/SeoField/icons.js +12 -0
- package/dist/components/SeoField/icons.js.map +1 -0
- package/dist/components/SeoField/index.d.ts +20 -0
- package/dist/components/SeoField/index.d.ts.map +1 -0
- package/dist/components/SeoField/index.js +118 -0
- package/dist/components/SeoField/index.js.map +1 -0
- package/dist/components/SeoField/useGenerate.d.ts +15 -0
- package/dist/components/SeoField/useGenerate.d.ts.map +1 -0
- package/dist/components/SeoField/useGenerate.js +102 -0
- package/dist/components/SeoField/useGenerate.js.map +1 -0
- package/dist/constants/generation.d.ts +13 -0
- package/dist/constants/generation.d.ts.map +1 -0
- package/dist/constants/generation.js +21 -0
- package/dist/constants/generation.js.map +1 -0
- package/dist/engine/helpers/title-progress.d.ts +2 -1
- package/dist/engine/helpers/title-progress.d.ts.map +1 -1
- package/dist/engine/helpers/title-progress.js +1 -1
- package/dist/engine/helpers/title-progress.js.map +1 -1
- package/dist/fields/index.d.ts +3 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +5 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/onPublishHook.d.ts +8 -0
- package/dist/fields/onPublishHook.d.ts.map +1 -0
- package/dist/fields/onPublishHook.js +95 -0
- package/dist/fields/onPublishHook.js.map +1 -0
- package/dist/fields/seoTextField.d.ts +23 -0
- package/dist/fields/seoTextField.d.ts.map +1 -0
- package/dist/fields/seoTextField.js +43 -0
- package/dist/fields/seoTextField.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/measure/measure.d.ts +16 -0
- package/dist/measure/measure.d.ts.map +1 -0
- package/dist/measure/measure.js +38 -0
- package/dist/measure/measure.js.map +1 -0
- package/dist/providers/SeoClientConfigProvider.d.ts +8 -0
- package/dist/providers/SeoClientConfigProvider.d.ts.map +1 -0
- package/dist/providers/SeoClientConfigProvider.js +16 -0
- package/dist/providers/SeoClientConfigProvider.js.map +1 -0
- package/dist/server/generate/apiKey.d.ts +3 -0
- package/dist/server/generate/apiKey.d.ts.map +1 -0
- package/dist/server/generate/apiKey.js +11 -0
- package/dist/server/generate/apiKey.js.map +1 -0
- package/dist/server/generate/endpoint.d.ts +3 -0
- package/dist/server/generate/endpoint.d.ts.map +1 -0
- package/dist/server/generate/endpoint.js +47 -0
- package/dist/server/generate/endpoint.js.map +1 -0
- package/dist/server/generate/generateForField.d.ts +18 -0
- package/dist/server/generate/generateForField.d.ts.map +1 -0
- package/dist/server/generate/generateForField.js +41 -0
- package/dist/server/generate/generateForField.js.map +1 -0
- package/dist/server/generate/openai.d.ts +9 -0
- package/dist/server/generate/openai.d.ts.map +1 -0
- package/dist/server/generate/openai.js +43 -0
- package/dist/server/generate/openai.js.map +1 -0
- package/dist/server/generate/prompts.d.ts +19 -0
- package/dist/server/generate/prompts.d.ts.map +1 -0
- package/dist/server/generate/prompts.js +32 -0
- package/dist/server/generate/prompts.js.map +1 -0
- package/dist/server/generate/serverResolveDocs.d.ts +4 -0
- package/dist/server/generate/serverResolveDocs.d.ts.map +1 -0
- package/dist/server/generate/serverResolveDocs.js +38 -0
- package/dist/server/generate/serverResolveDocs.js.map +1 -0
- package/dist/types/config.d.ts +26 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/config/overrideAdmin.d.ts.map +1 -1
- package/dist/utils/config/overrideAdmin.js +27 -1
- package/dist/utils/config/overrideAdmin.js.map +1 -1
- package/package.json +13 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
function key(collection, id) {
|
|
2
|
+
return `${collection}:${id}`;
|
|
3
|
+
}
|
|
4
|
+
async function runQuery(payload, query, locale) {
|
|
5
|
+
const ids = [...new Set(query.ids.map(String))];
|
|
6
|
+
if (ids.length === 0)
|
|
7
|
+
return [];
|
|
8
|
+
const select = query.select ? Object.fromEntries(query.select.map((f) => [f, true])) : void 0;
|
|
9
|
+
const result = await payload.find({
|
|
10
|
+
collection: query.collection,
|
|
11
|
+
where: { id: { in: ids } },
|
|
12
|
+
depth: query.depth ?? 0,
|
|
13
|
+
limit: ids.length,
|
|
14
|
+
pagination: false,
|
|
15
|
+
overrideAccess: true,
|
|
16
|
+
...locale ? { locale } : {},
|
|
17
|
+
...select ? { select } : {}
|
|
18
|
+
});
|
|
19
|
+
return result.docs.filter(
|
|
20
|
+
(d) => typeof d.id === "string" || typeof d.id === "number"
|
|
21
|
+
).map((d) => [key(query.collection, d.id), d]);
|
|
22
|
+
}
|
|
23
|
+
function createServerResolveDocs(payload, locale) {
|
|
24
|
+
return async function resolveDocs(queries) {
|
|
25
|
+
const store = /* @__PURE__ */ new Map();
|
|
26
|
+
const results = await Promise.all(queries.map((q) => runQuery(payload, q, locale)));
|
|
27
|
+
for (const entries of results)
|
|
28
|
+
for (const [k, doc] of entries)
|
|
29
|
+
store.set(k, doc);
|
|
30
|
+
return {
|
|
31
|
+
get: (collection, id) => store.get(key(collection, id))
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
createServerResolveDocs
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=serverResolveDocs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/generate/serverResolveDocs.ts"],"sourcesContent":["import type { Payload } from \"payload\";\nimport type { DocQuery, DocStore } from \"../../types/config\";\n\ntype Doc = Record<string, unknown>;\n\nfunction key(collection: string, id: string | number): string {\n return `${collection}:${id}`;\n}\n\nasync function runQuery(\n payload: Payload,\n query: DocQuery,\n locale: string | undefined\n): Promise<Array<[string, Doc]>> {\n const ids = [...new Set(query.ids.map(String))];\n if (ids.length === 0) return [];\n\n const select = query.select ? Object.fromEntries(query.select.map((f) => [f, true])) : undefined;\n\n const result = await payload.find({\n collection: query.collection as never,\n where: { id: { in: ids } },\n depth: query.depth ?? 0,\n limit: ids.length,\n pagination: false,\n overrideAccess: true,\n ...(locale ? { locale: locale as never } : {}),\n ...(select ? { select: select as never } : {}),\n });\n\n return (result.docs as Array<Doc & { id?: unknown }>)\n .filter(\n (d): d is Doc & { id: string | number } =>\n typeof d.id === \"string\" || typeof d.id === \"number\"\n )\n .map((d) => [key(query.collection, d.id), d] as [string, Doc]);\n}\n\nexport function createServerResolveDocs(\n payload: Payload,\n locale: string | undefined\n): (queries: DocQuery[]) => Promise<DocStore> {\n return async function resolveDocs(queries: DocQuery[]): Promise<DocStore> {\n const store = new Map<string, Doc>();\n const results = await Promise.all(queries.map((q) => runQuery(payload, q, locale)));\n\n for (const entries of results) for (const [k, doc] of entries) store.set(k, doc);\n\n return {\n get: (collection, id) => store.get(key(collection, id)),\n };\n };\n}\n"],"mappings":"AAKA,SAAS,IAAI,YAAoB,IAA6B;AAC5D,SAAO,GAAG,UAAU,IAAI,EAAE;AAC5B;AAEA,eAAe,SACb,SACA,OACA,QAC+B;AAC/B,QAAM,MAAM,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC;AAC9C,MAAI,IAAI,WAAW;AAAG,WAAO,CAAC;AAE9B,QAAM,SAAS,MAAM,SAAS,OAAO,YAAY,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI;AAEvF,QAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,IAChC,YAAY,MAAM;AAAA,IAClB,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;AAAA,IACzB,OAAO,MAAM,SAAS;AAAA,IACtB,OAAO,IAAI;AAAA,IACX,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,GAAI,SAAS,EAAE,OAAwB,IAAI,CAAC;AAAA,IAC5C,GAAI,SAAS,EAAE,OAAwB,IAAI,CAAC;AAAA,EAC9C,CAAC;AAED,SAAQ,OAAO,KACZ;AAAA,IACC,CAAC,MACC,OAAO,EAAE,OAAO,YAAY,OAAO,EAAE,OAAO;AAAA,EAChD,EACC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,YAAY,EAAE,EAAE,GAAG,CAAC,CAAkB;AACjE;AAEO,SAAS,wBACd,SACA,QAC4C;AAC5C,SAAO,eAAe,YAAY,SAAwC;AACxE,UAAM,QAAQ,oBAAI,IAAiB;AACnC,UAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,MAAM,SAAS,SAAS,GAAG,MAAM,CAAC,CAAC;AAElF,eAAW,WAAW;AAAS,iBAAW,CAAC,GAAG,GAAG,KAAK;AAAS,cAAM,IAAI,GAAG,GAAG;AAE/E,WAAO;AAAA,MACL,KAAK,CAAC,YAAY,OAAO,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;AAAA,IACxD;AAAA,EACF;AACF;","names":[]}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -29,18 +29,44 @@ export interface SeoCollectionConfig {
|
|
|
29
29
|
* "@focus-reactive/payload-plugin-seo/content" in an admin-mounted client module.
|
|
30
30
|
*/
|
|
31
31
|
extractContentPath: string;
|
|
32
|
+
/**
|
|
33
|
+
* Server-side content extractor for on-publish generation. Same contract as the
|
|
34
|
+
* client ContentExtractor, but `toolkit.resolveDocs` is backed by the Payload Local API and
|
|
35
|
+
* `values` is the document being saved. May be the SAME function as the client extractor when
|
|
36
|
+
* it only reads ids + injected resolveDocs (it is runtime-agnostic).
|
|
37
|
+
*/
|
|
38
|
+
serverExtractContent?: ContentExtractor;
|
|
32
39
|
}
|
|
33
40
|
export interface SeoSiteConfig {
|
|
34
41
|
name?: string;
|
|
35
42
|
baseUrl?: string;
|
|
36
43
|
faviconUrl?: string;
|
|
37
44
|
}
|
|
45
|
+
export interface SeoGenerationConfig {
|
|
46
|
+
/** OpenAI chat model.
|
|
47
|
+
* @default "gpt-4o-mini"
|
|
48
|
+
*/
|
|
49
|
+
model?: string;
|
|
50
|
+
/** Explicit API key.
|
|
51
|
+
* @default process.env.OPENAI_API_KEY
|
|
52
|
+
*/
|
|
53
|
+
apiKey?: string;
|
|
54
|
+
/** Max chars of serialized page content sent to the model.
|
|
55
|
+
* @default 6000
|
|
56
|
+
*/
|
|
57
|
+
maxContentChars?: number;
|
|
58
|
+
/** Override the system prompt for title generation. */
|
|
59
|
+
titlePrompt?: string;
|
|
60
|
+
/** Override the system prompt for description generation. */
|
|
61
|
+
descriptionPrompt?: string;
|
|
62
|
+
}
|
|
38
63
|
export interface SeoPluginConfig {
|
|
39
64
|
disabled?: boolean;
|
|
40
65
|
collections: SeoCollectionConfig[];
|
|
41
66
|
site?: SeoSiteConfig;
|
|
42
67
|
supportedLocales?: string[];
|
|
43
68
|
translations?: Translations;
|
|
69
|
+
generation?: SeoGenerationConfig;
|
|
44
70
|
}
|
|
45
71
|
export interface DocQuery {
|
|
46
72
|
collection: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,2GAA2G;AAC3G,MAAM,WAAW,cAAc;IAC7B,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qIAAqI;AACrI,MAAM,MAAM,gBAAgB,GAAG,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,cAAc,KACpB,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overrideAdmin.d.ts","sourceRoot":"","sources":["../../../src/utils/config/overrideAdmin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"overrideAdmin.d.ts","sourceRoot":"","sources":["../../../src/utils/config/overrideAdmin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKtC,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAEzE,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAoErF"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { getComponentPath } from "./getComponentPath";
|
|
2
|
+
import { resolveApiKey } from "../../server/generate/apiKey";
|
|
3
|
+
import { createGenerateEndpoint } from "../../server/generate/endpoint";
|
|
2
4
|
function overrideAdmin(incomingConfig, config) {
|
|
3
5
|
const bySlug = new Map(config.collections.map((c) => [c.slug, c]));
|
|
4
6
|
const site = config.site ?? {};
|
|
@@ -35,7 +37,31 @@ function overrideAdmin(incomingConfig, config) {
|
|
|
35
37
|
}
|
|
36
38
|
};
|
|
37
39
|
});
|
|
38
|
-
|
|
40
|
+
const clientConfig = {
|
|
41
|
+
enabled: Boolean(resolveApiKey(config.generation)),
|
|
42
|
+
extractByCollection: Object.fromEntries(
|
|
43
|
+
config.collections.map((c) => [c.slug, c.extractContentPath])
|
|
44
|
+
)
|
|
45
|
+
};
|
|
46
|
+
const providerEntry = {
|
|
47
|
+
path: getComponentPath("providers/SeoClientConfigProvider", "SeoClientConfigProvider"),
|
|
48
|
+
clientProps: {
|
|
49
|
+
config: clientConfig
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const providers = [...incomingConfig.admin?.components?.providers ?? [], providerEntry];
|
|
53
|
+
return {
|
|
54
|
+
...incomingConfig,
|
|
55
|
+
collections,
|
|
56
|
+
endpoints: [...incomingConfig.endpoints ?? [], createGenerateEndpoint()],
|
|
57
|
+
admin: {
|
|
58
|
+
...incomingConfig.admin,
|
|
59
|
+
components: {
|
|
60
|
+
...incomingConfig.admin?.components,
|
|
61
|
+
providers
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
39
65
|
}
|
|
40
66
|
export {
|
|
41
67
|
overrideAdmin
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/config/overrideAdmin.ts"],"sourcesContent":["import type { Config } from \"payload\";\nimport { getComponentPath } from \"./getComponentPath\";\nimport type { SeoPluginConfig, SeoSiteConfig } from \"../../types/config\";\n\nexport function overrideAdmin(incomingConfig: Config, config: SeoPluginConfig): Config {\n const bySlug = new Map(config.collections.map((c) => [c.slug, c]));\n const site: SeoSiteConfig = config.site ?? {};\n\n const collections = (incomingConfig.collections ?? []).map((collection) => {\n const seoCfg = bySlug.get(collection.slug);\n if (!seoCfg) return collection;\n\n const buttonEntry = {\n path: getComponentPath(\"components/SeoButton\"),\n clientProps: {\n collectionSlug: collection.slug,\n fields: seoCfg.fields ?? {},\n extractContentPath: seoCfg.extractContentPath,\n site: {\n name: site.name ?? \"\",\n baseUrl: site.baseUrl ?? \"\",\n faviconUrl: site.faviconUrl ?? \"\",\n },\n supportedLocales: config.supportedLocales ?? [\"en\"],\n },\n };\n\n const existing = collection.admin?.components?.edit?.beforeDocumentControls ?? [];\n\n return {\n ...collection,\n admin: {\n ...collection.admin,\n components: {\n ...collection.admin?.components,\n edit: {\n ...collection.admin?.components?.edit,\n beforeDocumentControls: [...existing, buttonEntry],\n },\n },\n },\n };\n });\n\n
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/config/overrideAdmin.ts"],"sourcesContent":["import type { Config } from \"payload\";\nimport { getComponentPath } from \"./getComponentPath\";\nimport { resolveApiKey } from \"../../server/generate/apiKey\";\nimport { createGenerateEndpoint } from \"../../server/generate/endpoint\";\nimport type { SeoClientConfig } from \"../../client-config/registry\";\nimport type { SeoPluginConfig, SeoSiteConfig } from \"../../types/config\";\n\nexport function overrideAdmin(incomingConfig: Config, config: SeoPluginConfig): Config {\n const bySlug = new Map(config.collections.map((c) => [c.slug, c]));\n const site: SeoSiteConfig = config.site ?? {};\n\n const collections = (incomingConfig.collections ?? []).map((collection) => {\n const seoCfg = bySlug.get(collection.slug);\n if (!seoCfg) return collection;\n\n const buttonEntry = {\n path: getComponentPath(\"components/SeoButton\"),\n clientProps: {\n collectionSlug: collection.slug,\n fields: seoCfg.fields ?? {},\n extractContentPath: seoCfg.extractContentPath,\n site: {\n name: site.name ?? \"\",\n baseUrl: site.baseUrl ?? \"\",\n faviconUrl: site.faviconUrl ?? \"\",\n },\n supportedLocales: config.supportedLocales ?? [\"en\"],\n },\n };\n\n const existing = collection.admin?.components?.edit?.beforeDocumentControls ?? [];\n\n return {\n ...collection,\n admin: {\n ...collection.admin,\n components: {\n ...collection.admin?.components,\n edit: {\n ...collection.admin?.components?.edit,\n beforeDocumentControls: [...existing, buttonEntry],\n },\n },\n },\n };\n });\n\n const clientConfig: SeoClientConfig = {\n enabled: Boolean(resolveApiKey(config.generation)),\n extractByCollection: Object.fromEntries(\n config.collections.map((c) => [c.slug, c.extractContentPath])\n ),\n };\n\n const providerEntry = {\n path: getComponentPath(\"providers/SeoClientConfigProvider\", \"SeoClientConfigProvider\"),\n clientProps: {\n config: clientConfig,\n },\n };\n\n const providers = [...(incomingConfig.admin?.components?.providers ?? []), providerEntry];\n\n return {\n ...incomingConfig,\n collections,\n endpoints: [...(incomingConfig.endpoints ?? []), createGenerateEndpoint()],\n admin: {\n ...incomingConfig.admin,\n components: {\n ...incomingConfig.admin?.components,\n providers,\n },\n },\n };\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,8BAA8B;AAIhC,SAAS,cAAc,gBAAwB,QAAiC;AACrF,QAAM,SAAS,IAAI,IAAI,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACjE,QAAM,OAAsB,OAAO,QAAQ,CAAC;AAE5C,QAAM,eAAe,eAAe,eAAe,CAAC,GAAG,IAAI,CAAC,eAAe;AACzE,UAAM,SAAS,OAAO,IAAI,WAAW,IAAI;AACzC,QAAI,CAAC;AAAQ,aAAO;AAEpB,UAAM,cAAc;AAAA,MAClB,MAAM,iBAAiB,sBAAsB;AAAA,MAC7C,aAAa;AAAA,QACX,gBAAgB,WAAW;AAAA,QAC3B,QAAQ,OAAO,UAAU,CAAC;AAAA,QAC1B,oBAAoB,OAAO;AAAA,QAC3B,MAAM;AAAA,UACJ,MAAM,KAAK,QAAQ;AAAA,UACnB,SAAS,KAAK,WAAW;AAAA,UACzB,YAAY,KAAK,cAAc;AAAA,QACjC;AAAA,QACA,kBAAkB,OAAO,oBAAoB,CAAC,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,WAAW,WAAW,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEhF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,WAAW;AAAA,QACd,YAAY;AAAA,UACV,GAAG,WAAW,OAAO;AAAA,UACrB,MAAM;AAAA,YACJ,GAAG,WAAW,OAAO,YAAY;AAAA,YACjC,wBAAwB,CAAC,GAAG,UAAU,WAAW;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,eAAgC;AAAA,IACpC,SAAS,QAAQ,cAAc,OAAO,UAAU,CAAC;AAAA,IACjD,qBAAqB,OAAO;AAAA,MAC1B,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,kBAAkB,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,MAAM,iBAAiB,qCAAqC,yBAAyB;AAAA,IACrF,aAAa;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,GAAI,eAAe,OAAO,YAAY,aAAa,CAAC,GAAI,aAAa;AAExF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,WAAW,CAAC,GAAI,eAAe,aAAa,CAAC,GAAI,uBAAuB,CAAC;AAAA,IACzE,OAAO;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,YAAY;AAAA,QACV,GAAG,eAAe,OAAO;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@focus-reactive/payload-plugin-seo",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "FocusReactive <ship@focusreactive.com>",
|
|
6
6
|
"keywords": [
|
|
@@ -45,6 +45,18 @@
|
|
|
45
45
|
"./components/SeoButton": {
|
|
46
46
|
"import": "./dist/components/SeoButton/index.js",
|
|
47
47
|
"types": "./dist/components/SeoButton/index.d.ts"
|
|
48
|
+
},
|
|
49
|
+
"./fields": {
|
|
50
|
+
"import": "./dist/fields/index.js",
|
|
51
|
+
"types": "./dist/fields/index.d.ts"
|
|
52
|
+
},
|
|
53
|
+
"./components/SeoField": {
|
|
54
|
+
"import": "./dist/components/SeoField/index.js",
|
|
55
|
+
"types": "./dist/components/SeoField/index.d.ts"
|
|
56
|
+
},
|
|
57
|
+
"./providers/SeoClientConfigProvider": {
|
|
58
|
+
"import": "./dist/providers/SeoClientConfigProvider.js",
|
|
59
|
+
"types": "./dist/providers/SeoClientConfigProvider.d.ts"
|
|
48
60
|
}
|
|
49
61
|
},
|
|
50
62
|
"scripts": {
|