@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.
Files changed (84) hide show
  1. package/README.md +198 -6
  2. package/dist/admin.css +97 -1
  3. package/dist/client-config/registry.d.ts +7 -0
  4. package/dist/client-config/registry.d.ts.map +1 -0
  5. package/dist/client-config/registry.js +16 -0
  6. package/dist/client-config/registry.js.map +1 -0
  7. package/dist/components/SeoField/Meter.d.ts +10 -0
  8. package/dist/components/SeoField/Meter.d.ts.map +1 -0
  9. package/dist/components/SeoField/Meter.js +59 -0
  10. package/dist/components/SeoField/Meter.js.map +1 -0
  11. package/dist/components/SeoField/icons.d.ts +5 -0
  12. package/dist/components/SeoField/icons.d.ts.map +1 -0
  13. package/dist/components/SeoField/icons.js +12 -0
  14. package/dist/components/SeoField/icons.js.map +1 -0
  15. package/dist/components/SeoField/index.d.ts +20 -0
  16. package/dist/components/SeoField/index.d.ts.map +1 -0
  17. package/dist/components/SeoField/index.js +118 -0
  18. package/dist/components/SeoField/index.js.map +1 -0
  19. package/dist/components/SeoField/useGenerate.d.ts +15 -0
  20. package/dist/components/SeoField/useGenerate.d.ts.map +1 -0
  21. package/dist/components/SeoField/useGenerate.js +102 -0
  22. package/dist/components/SeoField/useGenerate.js.map +1 -0
  23. package/dist/constants/generation.d.ts +13 -0
  24. package/dist/constants/generation.d.ts.map +1 -0
  25. package/dist/constants/generation.js +21 -0
  26. package/dist/constants/generation.js.map +1 -0
  27. package/dist/engine/helpers/title-progress.d.ts +2 -1
  28. package/dist/engine/helpers/title-progress.d.ts.map +1 -1
  29. package/dist/engine/helpers/title-progress.js +1 -1
  30. package/dist/engine/helpers/title-progress.js.map +1 -1
  31. package/dist/fields/index.d.ts +3 -0
  32. package/dist/fields/index.d.ts.map +1 -0
  33. package/dist/fields/index.js +5 -0
  34. package/dist/fields/index.js.map +1 -0
  35. package/dist/fields/onPublishHook.d.ts +8 -0
  36. package/dist/fields/onPublishHook.d.ts.map +1 -0
  37. package/dist/fields/onPublishHook.js +95 -0
  38. package/dist/fields/onPublishHook.js.map +1 -0
  39. package/dist/fields/seoTextField.d.ts +23 -0
  40. package/dist/fields/seoTextField.d.ts.map +1 -0
  41. package/dist/fields/seoTextField.js +43 -0
  42. package/dist/fields/seoTextField.js.map +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +3 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/measure/measure.d.ts +16 -0
  48. package/dist/measure/measure.d.ts.map +1 -0
  49. package/dist/measure/measure.js +38 -0
  50. package/dist/measure/measure.js.map +1 -0
  51. package/dist/providers/SeoClientConfigProvider.d.ts +8 -0
  52. package/dist/providers/SeoClientConfigProvider.d.ts.map +1 -0
  53. package/dist/providers/SeoClientConfigProvider.js +16 -0
  54. package/dist/providers/SeoClientConfigProvider.js.map +1 -0
  55. package/dist/server/generate/apiKey.d.ts +3 -0
  56. package/dist/server/generate/apiKey.d.ts.map +1 -0
  57. package/dist/server/generate/apiKey.js +11 -0
  58. package/dist/server/generate/apiKey.js.map +1 -0
  59. package/dist/server/generate/endpoint.d.ts +3 -0
  60. package/dist/server/generate/endpoint.d.ts.map +1 -0
  61. package/dist/server/generate/endpoint.js +47 -0
  62. package/dist/server/generate/endpoint.js.map +1 -0
  63. package/dist/server/generate/generateForField.d.ts +18 -0
  64. package/dist/server/generate/generateForField.d.ts.map +1 -0
  65. package/dist/server/generate/generateForField.js +41 -0
  66. package/dist/server/generate/generateForField.js.map +1 -0
  67. package/dist/server/generate/openai.d.ts +9 -0
  68. package/dist/server/generate/openai.d.ts.map +1 -0
  69. package/dist/server/generate/openai.js +43 -0
  70. package/dist/server/generate/openai.js.map +1 -0
  71. package/dist/server/generate/prompts.d.ts +19 -0
  72. package/dist/server/generate/prompts.d.ts.map +1 -0
  73. package/dist/server/generate/prompts.js +32 -0
  74. package/dist/server/generate/prompts.js.map +1 -0
  75. package/dist/server/generate/serverResolveDocs.d.ts +4 -0
  76. package/dist/server/generate/serverResolveDocs.d.ts.map +1 -0
  77. package/dist/server/generate/serverResolveDocs.js +38 -0
  78. package/dist/server/generate/serverResolveDocs.js.map +1 -0
  79. package/dist/types/config.d.ts +26 -0
  80. package/dist/types/config.d.ts.map +1 -1
  81. package/dist/utils/config/overrideAdmin.d.ts.map +1 -1
  82. package/dist/utils/config/overrideAdmin.js +27 -1
  83. package/dist/utils/config/overrideAdmin.js.map +1 -1
  84. 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":[]}
@@ -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":"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"}
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;AAEtC,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAEzE,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAyCrF"}
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
- return { ...incomingConfig, collections };
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 return { ...incomingConfig, collections };\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AAG1B,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,SAAO,EAAE,GAAG,gBAAgB,YAAY;AAC1C;","names":[]}
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.5.0",
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": {