@focus-reactive/payload-plugin-seo 1.4.0 → 1.5.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 (75) hide show
  1. package/README.md +139 -124
  2. package/dist/components/SeoButton/SeoButtonInner.d.ts +2 -4
  3. package/dist/components/SeoButton/SeoButtonInner.d.ts.map +1 -1
  4. package/dist/components/SeoButton/SeoButtonInner.js +10 -7
  5. package/dist/components/SeoButton/SeoButtonInner.js.map +1 -1
  6. package/dist/components/SeoDrawer/build-analysis-input.d.ts +1 -8
  7. package/dist/components/SeoDrawer/build-analysis-input.d.ts.map +1 -1
  8. package/dist/components/SeoDrawer/build-analysis-input.js +22 -34
  9. package/dist/components/SeoDrawer/build-analysis-input.js.map +1 -1
  10. package/dist/components/SeoDrawer/buildInput.js +1 -1
  11. package/dist/components/SeoDrawer/buildInput.js.map +1 -1
  12. package/dist/components/SeoDrawer/useLiveDocument.d.ts +2 -5
  13. package/dist/components/SeoDrawer/useLiveDocument.d.ts.map +1 -1
  14. package/dist/components/SeoDrawer/useLiveDocument.js +14 -62
  15. package/dist/components/SeoDrawer/useLiveDocument.js.map +1 -1
  16. package/dist/content/index.d.ts +2 -2
  17. package/dist/content/index.d.ts.map +1 -1
  18. package/dist/content/index.js +2 -1
  19. package/dist/content/index.js.map +1 -1
  20. package/dist/content/resolve/resolve-docs.d.ts +3 -0
  21. package/dist/content/resolve/resolve-docs.d.ts.map +1 -0
  22. package/dist/content/resolve/resolve-docs.js +48 -0
  23. package/dist/content/resolve/resolve-docs.js.map +1 -0
  24. package/dist/content/schema/helpers.d.ts +1 -0
  25. package/dist/content/schema/helpers.d.ts.map +1 -1
  26. package/dist/content/schema/helpers.js +4 -0
  27. package/dist/content/schema/helpers.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/plugin.d.ts.map +1 -1
  32. package/dist/plugin.js +18 -3
  33. package/dist/plugin.js.map +1 -1
  34. package/dist/types/config.d.ts +35 -25
  35. package/dist/types/config.d.ts.map +1 -1
  36. package/dist/utils/config/overrideAdmin.d.ts.map +1 -1
  37. package/dist/utils/config/overrideAdmin.js +2 -10
  38. package/dist/utils/config/overrideAdmin.js.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/content/extract/context.d.ts +0 -11
  41. package/dist/content/extract/context.d.ts.map +0 -1
  42. package/dist/content/extract/context.js +0 -1
  43. package/dist/content/extract/context.js.map +0 -1
  44. package/dist/content/extract/extract.d.ts +0 -18
  45. package/dist/content/extract/extract.d.ts.map +0 -1
  46. package/dist/content/extract/extract.js +0 -211
  47. package/dist/content/extract/extract.js.map +0 -1
  48. package/dist/content/extract/selection.d.ts +0 -3
  49. package/dist/content/extract/selection.d.ts.map +0 -1
  50. package/dist/content/extract/selection.js +0 -32
  51. package/dist/content/extract/selection.js.map +0 -1
  52. package/dist/content/lexical/transform.d.ts +0 -5
  53. package/dist/content/lexical/transform.d.ts.map +0 -1
  54. package/dist/content/lexical/transform.js +0 -56
  55. package/dist/content/lexical/transform.js.map +0 -1
  56. package/dist/content/resolve/collect-refs.d.ts +0 -8
  57. package/dist/content/resolve/collect-refs.d.ts.map +0 -1
  58. package/dist/content/resolve/collect-refs.js +0 -79
  59. package/dist/content/resolve/collect-refs.js.map +0 -1
  60. package/dist/content/resolve/hydrate.d.ts +0 -7
  61. package/dist/content/resolve/hydrate.d.ts.map +0 -1
  62. package/dist/content/resolve/hydrate.js +0 -123
  63. package/dist/content/resolve/hydrate.js.map +0 -1
  64. package/dist/content/resolve/resolver.d.ts +0 -7
  65. package/dist/content/resolve/resolver.d.ts.map +0 -1
  66. package/dist/content/resolve/resolver.js +0 -65
  67. package/dist/content/resolve/resolver.js.map +0 -1
  68. package/dist/content/resolve/types.d.ts +0 -12
  69. package/dist/content/resolve/types.d.ts.map +0 -1
  70. package/dist/content/resolve/types.js +0 -7
  71. package/dist/content/resolve/types.js.map +0 -1
  72. package/dist/content/walk/walkFields.d.ts +0 -17
  73. package/dist/content/walk/walkFields.d.ts.map +0 -1
  74. package/dist/content/walk/walkFields.js +0 -88
  75. package/dist/content/walk/walkFields.js.map +0 -1
@@ -1,123 +0,0 @@
1
- import { refKey } from "./types";
2
- function isRecord(v) {
3
- return typeof v === "object" && v !== null && !Array.isArray(v);
4
- }
5
- function isId(v) {
6
- return typeof v === "string" || typeof v === "number";
7
- }
8
- function renderable(doc) {
9
- return typeof doc.url === "string" && typeof doc.mimeType === "string";
10
- }
11
- function pick(collection, id, isUpload, resolved) {
12
- const doc = resolved.get(refKey({ collection, id }));
13
- if (!doc)
14
- return null;
15
- return isUpload ? renderable(doc) ? doc : null : doc;
16
- }
17
- function relationValue(value, relationTo, ctx, resolved) {
18
- if (Array.isArray(value))
19
- return value.map((v) => relationValue(v, relationTo, ctx, resolved));
20
- if (typeof relationTo === "string") {
21
- if (!isId(value))
22
- return value;
23
- return pick(relationTo, value, ctx.isUploadCollection(relationTo), resolved);
24
- }
25
- if (isRecord(value) && typeof value.relationTo === "string" && isId(value.value)) {
26
- return pick(value.relationTo, value.value, ctx.isUploadCollection(value.relationTo), resolved);
27
- }
28
- return value;
29
- }
30
- function hydrateLexical(value, resolved) {
31
- const node = (n) => {
32
- if (!isRecord(n))
33
- return n;
34
- if (n.type === "upload" && typeof n.relationTo === "string" && isId(n.value)) {
35
- const doc = resolved.get(refKey({ collection: n.relationTo, id: n.value }));
36
- return doc ? { ...n, value: doc } : n;
37
- }
38
- if (Array.isArray(n.children))
39
- return { ...n, children: n.children.map(node) };
40
- return n;
41
- };
42
- return { ...value, root: node(value.root) };
43
- }
44
- function blockDef(field, slug, ctx) {
45
- const inline = field.blocks?.find((b) => b.slug === slug);
46
- if (inline)
47
- return inline;
48
- const ref = field.blockReferences?.find((r) => typeof r === "string" ? r === slug : r.slug === slug);
49
- if (ref)
50
- return typeof ref === "string" ? ctx.blocksBySlug[ref] : ref;
51
- return ctx.blocksBySlug[slug];
52
- }
53
- function hydrate(values, fields, ctx, resolved) {
54
- const out = { ...values };
55
- for (const f of fields) {
56
- switch (f.type) {
57
- case "upload":
58
- case "relationship": {
59
- const v = out[f.name];
60
- if (v !== void 0 && v !== null)
61
- out[f.name] = relationValue(v, f.relationTo, ctx, resolved);
62
- break;
63
- }
64
- case "richText": {
65
- const v = out[f.name];
66
- if (isRecord(v) && "root" in v)
67
- out[f.name] = hydrateLexical(v, resolved);
68
- break;
69
- }
70
- case "array": {
71
- const v = out[f.name];
72
- if (Array.isArray(v))
73
- out[f.name] = v.map((item) => isRecord(item) ? hydrate(item, f.fields, ctx, resolved) : item);
74
- break;
75
- }
76
- case "blocks": {
77
- const v = out[f.name];
78
- if (Array.isArray(v)) {
79
- out[f.name] = v.map((item) => {
80
- if (!(isRecord(item) && typeof item.blockType === "string"))
81
- return item;
82
- const def = blockDef(f, item.blockType, ctx);
83
- return def ? hydrate(item, def.fields, ctx, resolved) : item;
84
- });
85
- }
86
- break;
87
- }
88
- case "group": {
89
- if ("name" in f && typeof f.name === "string") {
90
- const v = out[f.name];
91
- if (isRecord(v))
92
- out[f.name] = hydrate(v, f.fields, ctx, resolved);
93
- } else {
94
- Object.assign(out, hydrate(out, f.fields, ctx, resolved));
95
- }
96
- break;
97
- }
98
- case "row":
99
- case "collapsible":
100
- Object.assign(out, hydrate(out, f.fields, ctx, resolved));
101
- break;
102
- case "tabs": {
103
- for (const tab of f.tabs) {
104
- if ("name" in tab && typeof tab.name === "string") {
105
- const v = out[tab.name];
106
- if (isRecord(v))
107
- out[tab.name] = hydrate(v, tab.fields, ctx, resolved);
108
- } else {
109
- Object.assign(out, hydrate(out, tab.fields, ctx, resolved));
110
- }
111
- }
112
- break;
113
- }
114
- default:
115
- break;
116
- }
117
- }
118
- return out;
119
- }
120
- export {
121
- hydrate
122
- };
123
- //# sourceMappingURL=hydrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/resolve/hydrate.ts"],"sourcesContent":["import type { ClientBlock, ClientField } from \"payload\";\nimport type { FieldVisitContext } from \"../walk/walkFields\";\nimport { refKey } from \"./types\";\nimport type { ResolvedDoc } from \"./types\";\n\ntype Values = Record<string, unknown>;\n\nfunction isRecord(v: unknown): v is Values {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\nfunction isId(v: unknown): v is string | number {\n return typeof v === \"string\" || typeof v === \"number\";\n}\nfunction renderable(doc: ResolvedDoc): boolean {\n return typeof doc.url === \"string\" && typeof doc.mimeType === \"string\";\n}\n\nfunction pick(collection: string, id: string | number, isUpload: boolean, resolved: Map<string, ResolvedDoc>): ResolvedDoc | null {\n const doc = resolved.get(refKey({ collection, id }));\n if (!doc) return null;\n return isUpload ? (renderable(doc) ? doc : null) : doc;\n}\n\nfunction relationValue(value: unknown, relationTo: string | string[], ctx: FieldVisitContext, resolved: Map<string, ResolvedDoc>): unknown {\n if (Array.isArray(value)) return value.map((v) => relationValue(v, relationTo, ctx, resolved));\n if (typeof relationTo === \"string\") {\n if (!isId(value)) return value;\n return pick(relationTo, value, ctx.isUploadCollection(relationTo), resolved);\n }\n if (isRecord(value) && typeof value.relationTo === \"string\" && isId(value.value)) {\n return pick(value.relationTo, value.value, ctx.isUploadCollection(value.relationTo), resolved);\n }\n return value;\n}\n\nfunction hydrateLexical(value: Values, resolved: Map<string, ResolvedDoc>): Values {\n const node = (n: unknown): unknown => {\n if (!isRecord(n)) return n;\n if (n.type === \"upload\" && typeof n.relationTo === \"string\" && isId(n.value)) {\n const doc = resolved.get(refKey({ collection: n.relationTo, id: n.value as string | number }));\n return doc ? { ...n, value: doc } : n;\n }\n if (Array.isArray(n.children)) return { ...n, children: (n.children as unknown[]).map(node) };\n return n;\n };\n return { ...value, root: node((value as { root?: unknown }).root) };\n}\n\nfunction blockDef(field: { blocks?: ClientBlock[]; blockReferences?: (ClientBlock | string)[] }, slug: string, ctx: FieldVisitContext): ClientBlock | undefined {\n const inline = field.blocks?.find((b) => b.slug === slug);\n if (inline) return inline;\n const ref = field.blockReferences?.find((r) => (typeof r === \"string\" ? r === slug : r.slug === slug));\n if (ref) return typeof ref === \"string\" ? ctx.blocksBySlug[ref] : ref;\n return ctx.blocksBySlug[slug];\n}\n\nexport function hydrate(values: Values, fields: ClientField[], ctx: FieldVisitContext, resolved: Map<string, ResolvedDoc>): Values {\n const out: Values = { ...values };\n for (const f of fields) {\n switch (f.type) {\n case \"upload\":\n case \"relationship\": {\n const v = out[(f as { name: string }).name];\n if (v !== undefined && v !== null) out[(f as { name: string }).name] = relationValue(v, (f as { relationTo: string | string[] }).relationTo, ctx, resolved);\n break;\n }\n case \"richText\": {\n const v = out[(f as { name: string }).name];\n if (isRecord(v) && \"root\" in v) out[(f as { name: string }).name] = hydrateLexical(v, resolved);\n break;\n }\n case \"array\": {\n const v = out[f.name];\n if (Array.isArray(v)) out[f.name] = v.map((item) => (isRecord(item) ? hydrate(item, f.fields, ctx, resolved) : item));\n break;\n }\n case \"blocks\": {\n const v = out[f.name];\n if (Array.isArray(v)) {\n out[f.name] = v.map((item) => {\n if (!(isRecord(item) && typeof item.blockType === \"string\")) return item;\n const def = blockDef(f, item.blockType, ctx);\n return def ? hydrate(item, def.fields, ctx, resolved) : item;\n });\n }\n break;\n }\n case \"group\": {\n if (\"name\" in f && typeof f.name === \"string\") {\n const v = out[f.name];\n if (isRecord(v)) out[f.name] = hydrate(v, f.fields, ctx, resolved);\n } else {\n Object.assign(out, hydrate(out, f.fields, ctx, resolved));\n }\n break;\n }\n case \"row\":\n case \"collapsible\":\n Object.assign(out, hydrate(out, f.fields, ctx, resolved));\n break;\n case \"tabs\": {\n for (const tab of f.tabs) {\n if (\"name\" in tab && typeof tab.name === \"string\") {\n const v = out[tab.name];\n if (isRecord(v)) out[tab.name] = hydrate(v, tab.fields, ctx, resolved);\n } else {\n Object.assign(out, hydrate(out, tab.fields, ctx, resolved));\n }\n }\n break;\n }\n default:\n break;\n }\n }\n return out;\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +0,0 @@
1
- import type { DocRef, ResolvedDoc } from "./types";
2
- export interface DocResolver {
3
- resolve: (refs: DocRef[], locale: string | undefined, depth: number) => Promise<Map<string, ResolvedDoc>>;
4
- invalidate: () => void;
5
- }
6
- export declare function createDocResolver(apiRoute: string): DocResolver;
7
- //# sourceMappingURL=resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/content/resolve/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAwCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CA4C/D"}
@@ -1,65 +0,0 @@
1
- import { refKey } from "./types";
2
- async function fetchDocs(apiRoute, collection, ids, locale, depth) {
3
- const params = new URLSearchParams({
4
- depth: String(depth),
5
- limit: String(ids.length)
6
- });
7
- if (locale)
8
- params.set("locale", locale);
9
- ids.forEach((id, i) => params.set(`where[id][in][${i}]`, String(id)));
10
- try {
11
- const res = await fetch(`${apiRoute}/${collection}?${params.toString()}`, {
12
- credentials: "include"
13
- });
14
- if (!res.ok)
15
- return /* @__PURE__ */ new Map();
16
- const body = await res.json();
17
- return new Map(
18
- (body.docs ?? []).filter((d) => d.id !== void 0 && d.id !== null).map((d) => [String(d.id), d])
19
- );
20
- } catch {
21
- return /* @__PURE__ */ new Map();
22
- }
23
- }
24
- function createDocResolver(apiRoute) {
25
- const cache = /* @__PURE__ */ new Map();
26
- const cacheKey = (ref, locale, depth) => `${refKey(ref)}:${locale ?? ""}:${depth}`;
27
- return {
28
- async resolve(refs, locale, depth) {
29
- const missing = refs.filter((ref) => !cache.has(cacheKey(ref, locale, depth)));
30
- const byCollection = /* @__PURE__ */ new Map();
31
- for (const ref of missing) {
32
- const group = byCollection.get(ref.collection) ?? [];
33
- group.push(ref);
34
- byCollection.set(ref.collection, group);
35
- }
36
- await Promise.all(
37
- [...byCollection.entries()].map(async ([collection, group]) => {
38
- const docs = await fetchDocs(
39
- apiRoute,
40
- collection,
41
- group.map((r) => r.id),
42
- locale,
43
- depth
44
- );
45
- for (const ref of group)
46
- cache.set(cacheKey(ref, locale, depth), docs.get(String(ref.id)) ?? null);
47
- })
48
- );
49
- const out = /* @__PURE__ */ new Map();
50
- for (const ref of refs) {
51
- const doc = cache.get(cacheKey(ref, locale, depth));
52
- if (doc)
53
- out.set(refKey(ref), doc);
54
- }
55
- return out;
56
- },
57
- invalidate() {
58
- cache.clear();
59
- }
60
- };
61
- }
62
- export {
63
- createDocResolver
64
- };
65
- //# sourceMappingURL=resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/resolve/resolver.ts"],"sourcesContent":["import { refKey } from \"./types\";\nimport type { DocRef, ResolvedDoc } from \"./types\";\n\nexport interface DocResolver {\n resolve: (\n refs: DocRef[],\n locale: string | undefined,\n depth: number\n ) => Promise<Map<string, ResolvedDoc>>;\n invalidate: () => void;\n}\n\ninterface FindResponse {\n docs?: Array<ResolvedDoc & { id?: unknown }>;\n}\n\nasync function fetchDocs(\n apiRoute: string,\n collection: string,\n ids: Array<string | number>,\n locale: string | undefined,\n depth: number\n): Promise<Map<string, ResolvedDoc>> {\n const params = new URLSearchParams({\n depth: String(depth),\n limit: String(ids.length),\n });\n\n if (locale) params.set(\"locale\", locale);\n\n ids.forEach((id, i) => params.set(`where[id][in][${i}]`, String(id)));\n\n try {\n const res = await fetch(`${apiRoute}/${collection}?${params.toString()}`, {\n credentials: \"include\",\n });\n if (!res.ok) return new Map();\n\n const body = (await res.json()) as FindResponse;\n\n return new Map(\n (body.docs ?? [])\n .filter((d) => d.id !== undefined && d.id !== null)\n .map((d) => [String(d.id), d])\n );\n } catch {\n return new Map();\n }\n}\n\nexport function createDocResolver(apiRoute: string): DocResolver {\n const cache = new Map<string, ResolvedDoc | null>();\n const cacheKey = (ref: DocRef, locale: string | undefined, depth: number) =>\n `${refKey(ref)}:${locale ?? \"\"}:${depth}`;\n\n return {\n async resolve(refs, locale, depth) {\n const missing = refs.filter((ref) => !cache.has(cacheKey(ref, locale, depth)));\n\n const byCollection = new Map<string, DocRef[]>();\n for (const ref of missing) {\n const group = byCollection.get(ref.collection) ?? [];\n group.push(ref);\n byCollection.set(ref.collection, group);\n }\n\n await Promise.all(\n [...byCollection.entries()].map(async ([collection, group]) => {\n const docs = await fetchDocs(\n apiRoute,\n collection,\n group.map((r) => r.id),\n locale,\n depth\n );\n\n for (const ref of group)\n cache.set(cacheKey(ref, locale, depth), docs.get(String(ref.id)) ?? null);\n })\n );\n\n const out = new Map<string, ResolvedDoc>();\n\n for (const ref of refs) {\n const doc = cache.get(cacheKey(ref, locale, depth));\n if (doc) out.set(refKey(ref), doc);\n }\n\n return out;\n },\n invalidate() {\n cache.clear();\n },\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc;AAgBvB,eAAe,UACb,UACA,YACA,KACA,QACA,OACmC;AACnC,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,OAAO,OAAO,KAAK;AAAA,IACnB,OAAO,OAAO,IAAI,MAAM;AAAA,EAC1B,CAAC;AAED,MAAI;AAAQ,WAAO,IAAI,UAAU,MAAM;AAEvC,MAAI,QAAQ,CAAC,IAAI,MAAM,OAAO,IAAI,iBAAiB,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AAEpE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,IAAI,UAAU,IAAI,OAAO,SAAS,CAAC,IAAI;AAAA,MACxE,aAAa;AAAA,IACf,CAAC;AACD,QAAI,CAAC,IAAI;AAAI,aAAO,oBAAI,IAAI;AAE5B,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,WAAO,IAAI;AAAA,OACR,KAAK,QAAQ,CAAC,GACZ,OAAO,CAAC,MAAM,EAAE,OAAO,UAAa,EAAE,OAAO,IAAI,EACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACjC;AAAA,EACF,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEO,SAAS,kBAAkB,UAA+B;AAC/D,QAAM,QAAQ,oBAAI,IAAgC;AAClD,QAAM,WAAW,CAAC,KAAa,QAA4B,UACzD,GAAG,OAAO,GAAG,CAAC,IAAI,UAAU,EAAE,IAAI,KAAK;AAEzC,SAAO;AAAA,IACL,MAAM,QAAQ,MAAM,QAAQ,OAAO;AACjC,YAAM,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS,KAAK,QAAQ,KAAK,CAAC,CAAC;AAE7E,YAAM,eAAe,oBAAI,IAAsB;AAC/C,iBAAW,OAAO,SAAS;AACzB,cAAM,QAAQ,aAAa,IAAI,IAAI,UAAU,KAAK,CAAC;AACnD,cAAM,KAAK,GAAG;AACd,qBAAa,IAAI,IAAI,YAAY,KAAK;AAAA,MACxC;AAEA,YAAM,QAAQ;AAAA,QACZ,CAAC,GAAG,aAAa,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM;AAC7D,gBAAM,OAAO,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AAEA,qBAAW,OAAO;AAChB,kBAAM,IAAI,SAAS,KAAK,QAAQ,KAAK,GAAG,KAAK,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,IAAI;AAAA,QAC5E,CAAC;AAAA,MACH;AAEA,YAAM,MAAM,oBAAI,IAAyB;AAEzC,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,MAAM,IAAI,SAAS,KAAK,QAAQ,KAAK,CAAC;AAClD,YAAI;AAAK,cAAI,IAAI,OAAO,GAAG,GAAG,GAAG;AAAA,MACnC;AAEA,aAAO;AAAA,IACT;AAAA,IACA,aAAa;AACX,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;","names":[]}
@@ -1,12 +0,0 @@
1
- export type RefKind = "upload" | "relationship";
2
- export interface DocRef {
3
- collection: string;
4
- id: string | number;
5
- kind: RefKind;
6
- }
7
- export type ResolvedDoc = Record<string, unknown>;
8
- export declare function refKey(ref: {
9
- collection: string;
10
- id: string | number;
11
- }): string;
12
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/content/resolve/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,cAAc,CAAC;AAEhD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,wBAAgB,MAAM,CAAC,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,MAAM,CAE/E"}
@@ -1,7 +0,0 @@
1
- function refKey(ref) {
2
- return `${ref.collection}:${ref.id}`;
3
- }
4
- export {
5
- refKey
6
- };
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/resolve/types.ts"],"sourcesContent":["export type RefKind = \"upload\" | \"relationship\";\n\nexport interface DocRef {\n collection: string;\n id: string | number;\n kind: RefKind;\n}\n\nexport type ResolvedDoc = Record<string, unknown>;\n\nexport function refKey(ref: { collection: string; id: string | number }): string {\n return `${ref.collection}:${ref.id}`;\n}\n"],"mappings":"AAUO,SAAS,OAAO,KAA0D;AAC/E,SAAO,GAAG,IAAI,UAAU,IAAI,IAAI,EAAE;AACpC;","names":[]}
@@ -1,17 +0,0 @@
1
- import type { ClientBlock, ClientField } from "payload";
2
- export interface FieldVisitContext {
3
- isUploadCollection: (slug: string) => boolean;
4
- blocksBySlug: Record<string, ClientBlock>;
5
- }
6
- export interface FieldVisit {
7
- field: ClientField;
8
- value: unknown;
9
- path: string;
10
- }
11
- type Values = Record<string, unknown>;
12
- type Visit = (v: FieldVisit) => void;
13
- export declare function walkFields(values: Values, fields: ClientField[], ctx: FieldVisitContext, visit: Visit, opts?: {
14
- path?: string;
15
- }): void;
16
- export {};
17
- //# sourceMappingURL=walkFields.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"walkFields.d.ts","sourceRoot":"","sources":["../../../src/content/walk/walkFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACtC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;AAkBrC,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAoE1I"}
@@ -1,88 +0,0 @@
1
- function isRecord(v) {
2
- return typeof v === "object" && v !== null && !Array.isArray(v);
3
- }
4
- function join(path, key) {
5
- return path ? `${path}.${key}` : String(key);
6
- }
7
- function blockDef(field, slug, ctx) {
8
- const inline = field.blocks?.find((b) => b.slug === slug);
9
- if (inline)
10
- return inline;
11
- const ref = field.blockReferences?.find((r) => typeof r === "string" ? r === slug : r.slug === slug);
12
- if (ref)
13
- return typeof ref === "string" ? ctx.blocksBySlug[ref] : ref;
14
- return ctx.blocksBySlug[slug];
15
- }
16
- function walkFields(values, fields, ctx, visit, opts = {}) {
17
- const base = opts.path ?? "";
18
- for (const f of fields) {
19
- switch (f.type) {
20
- case "upload":
21
- case "relationship":
22
- case "richText": {
23
- if ("name" in f && typeof f.name === "string")
24
- visit({ field: f, value: values[f.name], path: join(base, f.name) });
25
- break;
26
- }
27
- case "array": {
28
- const v = values[f.name];
29
- if (Array.isArray(v))
30
- v.forEach(
31
- (item, i) => isRecord(item) && walkFields(item, f.fields, ctx, visit, {
32
- path: join(base, `${f.name}.${i}`)
33
- })
34
- );
35
- break;
36
- }
37
- case "blocks": {
38
- const v = values[f.name];
39
- if (Array.isArray(v)) {
40
- v.forEach((item, i) => {
41
- if (!(isRecord(item) && typeof item.blockType === "string"))
42
- return;
43
- const def = blockDef(f, item.blockType, ctx);
44
- if (def)
45
- walkFields(item, def.fields, ctx, visit, {
46
- path: join(base, `${f.name}.${i}`)
47
- });
48
- });
49
- }
50
- break;
51
- }
52
- case "group": {
53
- if ("name" in f && typeof f.name === "string") {
54
- const v = values[f.name];
55
- if (isRecord(v))
56
- walkFields(v, f.fields, ctx, visit, { path: join(base, f.name) });
57
- } else {
58
- walkFields(values, f.fields, ctx, visit, { path: base });
59
- }
60
- break;
61
- }
62
- case "row":
63
- case "collapsible":
64
- walkFields(values, f.fields, ctx, visit, { path: base });
65
- break;
66
- case "tabs": {
67
- for (const tab of f.tabs) {
68
- if ("name" in tab && typeof tab.name === "string") {
69
- const v = values[tab.name];
70
- if (isRecord(v))
71
- walkFields(v, tab.fields, ctx, visit, {
72
- path: join(base, tab.name)
73
- });
74
- } else {
75
- walkFields(values, tab.fields, ctx, visit, { path: base });
76
- }
77
- }
78
- break;
79
- }
80
- default:
81
- break;
82
- }
83
- }
84
- }
85
- export {
86
- walkFields
87
- };
88
- //# sourceMappingURL=walkFields.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/content/walk/walkFields.ts"],"sourcesContent":["import type { ClientBlock, ClientField } from \"payload\";\n\nexport interface FieldVisitContext {\n isUploadCollection: (slug: string) => boolean;\n blocksBySlug: Record<string, ClientBlock>;\n}\n\nexport interface FieldVisit {\n field: ClientField;\n value: unknown;\n path: string;\n}\n\ntype Values = Record<string, unknown>;\ntype Visit = (v: FieldVisit) => void;\n\nfunction isRecord(v: unknown): v is Values {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction join(path: string, key: string | number): string {\n return path ? `${path}.${key}` : String(key);\n}\n\nfunction blockDef(field: { blocks?: ClientBlock[]; blockReferences?: (ClientBlock | string)[] }, slug: string, ctx: FieldVisitContext): ClientBlock | undefined {\n const inline = field.blocks?.find((b) => b.slug === slug);\n if (inline) return inline;\n const ref = field.blockReferences?.find((r) => (typeof r === \"string\" ? r === slug : r.slug === slug));\n if (ref) return typeof ref === \"string\" ? ctx.blocksBySlug[ref] : ref;\n return ctx.blocksBySlug[slug];\n}\n\nexport function walkFields(values: Values, fields: ClientField[], ctx: FieldVisitContext, visit: Visit, opts: { path?: string } = {}): void {\n const base = opts.path ?? \"\";\n\n for (const f of fields) {\n switch (f.type) {\n case \"upload\":\n case \"relationship\":\n case \"richText\": {\n if (\"name\" in f && typeof f.name === \"string\") visit({ field: f, value: values[f.name], path: join(base, f.name) });\n break;\n }\n case \"array\": {\n const v = values[f.name];\n if (Array.isArray(v))\n v.forEach(\n (item, i) =>\n isRecord(item) &&\n walkFields(item, f.fields, ctx, visit, {\n path: join(base, `${f.name}.${i}`),\n })\n );\n break;\n }\n case \"blocks\": {\n const v = values[f.name];\n if (Array.isArray(v)) {\n v.forEach((item, i) => {\n if (!(isRecord(item) && typeof item.blockType === \"string\")) return;\n const def = blockDef(f, item.blockType, ctx);\n if (def)\n walkFields(item, def.fields, ctx, visit, {\n path: join(base, `${f.name}.${i}`),\n });\n });\n }\n break;\n }\n case \"group\": {\n if (\"name\" in f && typeof f.name === \"string\") {\n const v = values[f.name];\n if (isRecord(v)) walkFields(v, f.fields, ctx, visit, { path: join(base, f.name) });\n } else {\n walkFields(values, f.fields, ctx, visit, { path: base });\n }\n break;\n }\n case \"row\":\n case \"collapsible\":\n walkFields(values, f.fields, ctx, visit, { path: base });\n break;\n case \"tabs\": {\n for (const tab of f.tabs) {\n if (\"name\" in tab && typeof tab.name === \"string\") {\n const v = values[tab.name];\n if (isRecord(v))\n walkFields(v, tab.fields, ctx, visit, {\n path: join(base, tab.name),\n });\n } else {\n walkFields(values, tab.fields, ctx, visit, { path: base });\n }\n }\n break;\n }\n default:\n break;\n }\n }\n}\n"],"mappings":"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","names":[]}