@justanarthur/payload-www 0.3.5 → 1.2.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 (63) hide show
  1. package/README.md +317 -307
  2. package/dist/access.d.ts +2 -2
  3. package/dist/access.js +3 -17
  4. package/dist/blocks.d.ts +7 -12
  5. package/dist/blocks.js +24 -43
  6. package/dist/cli.js +201 -0
  7. package/dist/collections.d.ts +33 -225
  8. package/dist/collections.js +185 -639
  9. package/dist/config.d.ts +19 -105
  10. package/dist/config.js +257 -855
  11. package/dist/fields.d.ts +4 -46
  12. package/dist/fields.js +177 -53
  13. package/dist/imagehash.js +0 -15
  14. package/dist/import-map-provider.d.ts +0 -16
  15. package/dist/import-map-provider.js +0 -15
  16. package/dist/metadata.d.ts +24 -89
  17. package/dist/metadata.js +123 -255
  18. package/dist/pages.d.ts +37 -319
  19. package/dist/pages.js +349 -964
  20. package/dist/render-pages.d.ts +70 -565
  21. package/dist/render-pages.js +464 -1477
  22. package/dist/sitemap.d.ts +10 -0
  23. package/dist/sitemap.js +337 -0
  24. package/dist/translator.js +0 -15
  25. package/dist/utils.d.ts +10 -12
  26. package/dist/utils.js +18 -41
  27. package/package.json +81 -178
  28. package/dist/components.d.ts +0 -6
  29. package/dist/components.js +0 -39
  30. package/dist/core-access.d.ts +0 -11
  31. package/dist/core-access.js +0 -34
  32. package/dist/core-blocks.d.ts +0 -24
  33. package/dist/core-blocks.js +0 -79
  34. package/dist/core-fields.d.ts +0 -73
  35. package/dist/core-fields.js +0 -167
  36. package/dist/core-utils.d.ts +0 -16
  37. package/dist/core-utils.js +0 -63
  38. package/dist/data-collections.d.ts +0 -229
  39. package/dist/data-collections.js +0 -676
  40. package/dist/data-seed.d.ts +0 -76
  41. package/dist/data-seed.js +0 -212
  42. package/dist/data-test.d.ts +0 -30
  43. package/dist/data-test.js +0 -1110
  44. package/dist/globals.d.ts +0 -69
  45. package/dist/globals.js +0 -251
  46. package/dist/hooks.d.ts +0 -108
  47. package/dist/hooks.js +0 -228
  48. package/dist/index.d.ts +0 -6
  49. package/dist/index.js +0 -39
  50. package/dist/render-components.d.ts +0 -42
  51. package/dist/render-components.js +0 -154
  52. package/dist/render-metadata.d.ts +0 -122
  53. package/dist/render-metadata.js +0 -390
  54. package/dist/render-utils.d.ts +0 -166
  55. package/dist/render-utils.js +0 -398
  56. package/dist/seed.d.ts +0 -76
  57. package/dist/seed.js +0 -212
  58. package/dist/server.d.ts +0 -980
  59. package/dist/server.js +0 -2231
  60. package/dist/test.d.ts +0 -30
  61. package/dist/test.js +0 -1110
  62. package/dist/with-www-config.d.ts +0 -108
  63. package/dist/with-www-config.js +0 -1006
package/dist/metadata.js CHANGED
@@ -1,21 +1,6 @@
1
1
 
2
- var __defProp = Object.defineProperty;
3
- var __returnValue = (v) => v;
4
- function __exportSetter(name, newValue) {
5
- this[name] = __returnValue.bind(null, newValue);
6
- }
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true,
12
- configurable: true,
13
- set: __exportSetter.bind(all, name)
14
- });
15
- };
16
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
2
 
18
- // src/render/metadata/jsonld.ts
3
+ // src/render/metadata/jsonld-utils.ts
19
4
  function getImageUrl(doc, siteUrl) {
20
5
  const img = doc?.meta?.image ?? doc?.heroImage ?? doc?.image;
21
6
  if (!img)
@@ -26,11 +11,6 @@ function getImageUrl(doc, siteUrl) {
26
11
  return img.url.startsWith("http") ? img.url : `${siteUrl}${img.url}`;
27
12
  return null;
28
13
  }
29
- function getImageUrlWithLog(doc, siteUrl) {
30
- const result = getImageUrl(doc, siteUrl);
31
- console.log("[WWW] render/metadata:jsonld:getImageUrl ->", result);
32
- return result;
33
- }
34
14
  function resolveLocalizedField(value, locale) {
35
15
  if (value == null)
36
16
  return "";
@@ -52,13 +32,8 @@ function resolveLocalizedField(value, locale) {
52
32
  }
53
33
  return Object.values(obj).filter((v) => typeof v === "string" && v.length > 0).join(" / ");
54
34
  }
55
- function resolveLocalizedFieldWithLog(value, locale) {
56
- const result = resolveLocalizedField(value, locale);
57
- if (value && typeof value === "object") {
58
- console.log("[WWW] render/metadata:jsonld:resolveLocalizedField locale=", locale, "->", JSON.stringify(result));
59
- }
60
- return result;
61
- }
35
+
36
+ // src/render/metadata/jsonld.ts
62
37
  function buildArticleLd({
63
38
  doc,
64
39
  url,
@@ -69,13 +44,12 @@ function buildArticleLd({
69
44
  publisherLogo
70
45
  }) {
71
46
  const name = publisherName ?? new URL(siteUrl).hostname;
72
- console.log("[WWW] render/metadata:buildArticleLd url=", url, "locale=", locale, "type=", type, "publisherName=", name);
73
47
  const ld = {
74
48
  "@context": "https://schema.org",
75
49
  "@type": type,
76
50
  "@id": `${url}#article`,
77
- headline: resolveLocalizedFieldWithLog(doc.title, locale),
78
- description: resolveLocalizedFieldWithLog(doc.meta?.description ?? doc.description ?? doc.excerpt, locale),
51
+ headline: resolveLocalizedField(doc.title, locale),
52
+ description: resolveLocalizedField(doc.meta?.description ?? doc.description ?? doc.excerpt, locale),
79
53
  inLanguage: locale,
80
54
  url,
81
55
  dateModified: doc.updatedAt ? new Date(doc.updatedAt).toISOString() : undefined
@@ -83,7 +57,7 @@ function buildArticleLd({
83
57
  const datePublished = doc.publishedAt ?? doc.createdAt;
84
58
  if (datePublished)
85
59
  ld.datePublished = new Date(datePublished).toISOString();
86
- const imgUrl = getImageUrlWithLog(doc, siteUrl);
60
+ const imgUrl = getImageUrl(doc, siteUrl);
87
61
  if (imgUrl)
88
62
  ld.image = imgUrl;
89
63
  ld.author = { "@type": "Organization", name, url: siteUrl };
@@ -99,7 +73,6 @@ function buildBreadcrumbsLd({
99
73
  items,
100
74
  currentUrl
101
75
  }) {
102
- console.log("[WWW] render/metadata:buildBreadcrumbsLd items=", items.length, "currentUrl=", currentUrl);
103
76
  return {
104
77
  "@context": "https://schema.org",
105
78
  "@type": "BreadcrumbList",
@@ -111,124 +84,76 @@ function buildBreadcrumbsLd({
111
84
  }))
112
85
  };
113
86
  }
114
- function buildOrganizationLd({
115
- siteUrl,
116
- name,
117
- logo,
118
- sameAs
119
- }) {
120
- console.log("[WWW] render/metadata:buildOrganizationLd siteUrl=", siteUrl, "name=", name, "logo?", Boolean(logo), "sameAs?", Boolean(sameAs));
121
- const org = {
122
- "@context": "https://schema.org",
123
- "@type": "Organization",
124
- "@id": `${siteUrl}#organization`,
125
- url: siteUrl,
126
- ...name && { name },
127
- ...logo && { logo: { "@type": "ImageObject", url: logo } },
128
- ...sameAs && sameAs.length > 0 && { sameAs }
129
- };
130
- return org;
131
- }
132
87
 
133
- // src/render/metadata/hreflang.ts
134
- async function buildHreflangAlternates({
135
- siteUrl,
136
- locale,
137
- urlPrefix,
138
- storedSlug,
139
- queryAllLocaleSlugs,
140
- nested,
141
- homeSlug,
142
- defaultLocale,
143
- locales,
144
- localePrefix = "always"
145
- }) {
146
- const allLocaleSlugs = await queryAllLocaleSlugs(storedSlug, locale);
147
- console.log("[WWW] render/metadata:buildHreflangAlternates storedSlug=", storedSlug, "locale=", locale, "allLocaleSlugs=", JSON.stringify(allLocaleSlugs));
148
- const languages = {};
149
- const urlFor = (l, slug) => {
150
- const trimmedPrefix = urlPrefix.replace(/^\/|\/$/g, "");
151
- const prefixSegment = trimmedPrefix ? `/${trimmedPrefix}` : "";
152
- const urlPath = slug === homeSlug ? "/" : nested ? "/" + slug.replaceAll("_", "/") : "/" + slug;
153
- const localeSegment = localePrefix === "never" ? "" : localePrefix === "as-needed" && l === defaultLocale ? "" : `/${l}`;
154
- return `${siteUrl}${localeSegment}${prefixSegment}${urlPath}`;
155
- };
156
- for (const l of locales) {
157
- const slugForLocale = allLocaleSlugs?.[l];
158
- if (!slugForLocale)
159
- continue;
160
- languages[l] = urlFor(l, slugForLocale);
161
- }
162
- if (allLocaleSlugs?.[defaultLocale]) {
163
- languages["x-default"] = urlFor(defaultLocale, allLocaleSlugs[defaultLocale]);
164
- }
165
- console.log("[WWW] render/metadata:buildHreflangAlternates ->", JSON.stringify(languages));
166
- return languages;
167
- }
88
+ // src/exports/metadata.ts
89
+ import {
90
+ buildOrganizationLd,
91
+ buildProductLd,
92
+ buildRootJsonLd,
93
+ buildWebSiteLd
94
+ } from "@justanarthur/payload-plugin-seo/root-jsonld";
168
95
 
169
96
  // src/render/metadata/slug.ts
170
97
  var SLUG_NESTED_DIVIDER = "_";
171
- function segmentsToStoredSlug(segments, nested) {
172
- if (!Array.isArray(segments)) {
173
- console.log("[WWW] render/metadata:segmentsToStoredSlug string passthrough:", JSON.stringify(segments));
174
- return segments;
175
- }
176
- const result = nested ? segments.join(SLUG_NESTED_DIVIDER) : segments[0] ?? "";
177
- console.log("[WWW] render/metadata:segmentsToStoredSlug nested=", nested, "segments=", JSON.stringify(segments), "->", result);
178
- return result;
179
- }
180
- function segmentsToUrlPath(segments, nested) {
181
- let result;
182
- if (!Array.isArray(segments))
183
- result = "/" + segments;
184
- else if (nested)
185
- result = "/" + segments.join("/");
186
- else
187
- result = "/" + (segments[0] ?? "");
188
- console.log("[WWW] render/metadata:segmentsToUrlPath nested=", nested, "segments=", JSON.stringify(segments), "->", result);
189
- return result;
190
- }
191
- function storedSlugToSegments(storedSlug, nested) {
192
- const result = nested ? storedSlug.split(SLUG_NESTED_DIVIDER) : storedSlug;
193
- console.log("[WWW] render/metadata:storedSlugToSegments nested=", nested, "storedSlug=", storedSlug, "->", JSON.stringify(result));
194
- return result;
195
- }
196
- function buildCanonicalUrl({
197
- siteUrl,
198
- locale,
199
- urlPrefix,
200
- urlPath
201
- }) {
202
- const trimmedPrefix = urlPrefix.replace(/^\/|\/$/g, "");
203
- const prefixSegment = trimmedPrefix ? `/${trimmedPrefix}` : "";
204
- const result = `${siteUrl}/${locale}${prefixSegment}${urlPath}`;
205
- console.log("[WWW] render/metadata:buildCanonicalUrl siteUrl=", siteUrl, "locale=", locale, "urlPrefix=", urlPrefix, "urlPath=", urlPath, "->", result);
206
- return result;
98
+ function paramsSlugToSlug(slug, _shape) {
99
+ if (!slug)
100
+ return "";
101
+ return (Array.isArray(slug) ? slug : [slug]).join(SLUG_NESTED_DIVIDER);
207
102
  }
208
- function getUrlPath(segments, nested, homeSlug) {
209
- const urlPath = segmentsToUrlPath(segments, nested);
210
- if (nested && !Array.isArray(segments)) {
211
- if (segments === homeSlug)
212
- return "/";
213
- } else if (nested && Array.isArray(segments)) {
214
- const stored = segments.join(SLUG_NESTED_DIVIDER);
215
- if (stored === homeSlug)
216
- return "/";
217
- }
218
- return urlPath;
103
+ function slugToParamsSlug(slug, shape) {
104
+ if (!slug)
105
+ return shape === "catch-all" ? [] : "";
106
+ return shape === "catch-all" ? slug.split(SLUG_NESTED_DIVIDER) : slug;
219
107
  }
220
108
 
221
109
  // src/render/metadata/query.ts
222
110
  import { getPayload } from "payload";
223
- import { cache } from "react";
224
111
 
225
- // src/core/utils/getFromImportMap.ts
226
- function getFromImportMap(key, importMap) {
227
- return importMap[key.includes("#") ? key : key + "#default"];
112
+ // src/collections/hooks/createRevalidateCollectionGlobalHook.ts
113
+ import { revalidateTag } from "next/cache";
114
+ function createRevalidateCollectionGlobalHook() {
115
+ const afterChangeDeleteHook = async ({ doc, req, ...args }) => {
116
+ const previousDoc = "previousDoc" in args ? args.previousDoc : null, locale = req.locale;
117
+ function revalidate(args2) {
118
+ try {
119
+ revalidateTag(createCollectionCacheKey({ ...args2, locale }), "max");
120
+ } catch (error) {
121
+ const msg = error instanceof Error ? error.message : String(error);
122
+ if (msg.includes("static generation store missing"))
123
+ return;
124
+ console.error(error);
125
+ }
126
+ }
127
+ if ("collection" in args) {
128
+ [
129
+ doc && doc._status !== "draft" && doc.slug,
130
+ previousDoc && previousDoc._status === "published" && previousDoc.slug
131
+ ].filter((slug) => slug !== undefined && slug !== false).map((slug) => revalidate({ collectionSlug: args.collection.slug, slug }));
132
+ } else {
133
+ revalidate({ globalSlug: args.global.slug });
134
+ }
135
+ return doc;
136
+ };
137
+ return { afterChange: afterChangeDeleteHook, afterDelete: afterChangeDeleteHook };
138
+ }
139
+ function createCollectionCacheKey(args) {
140
+ return `${"globalSlug" in args ? args.globalSlug : args.collectionSlug + args.slug}_${args.locale}`;
228
141
  }
229
142
 
230
143
  // src/render/metadata/query.ts
231
- var queryDocBySlug = cache(async function queryDocBySlug2({
144
+ async function withUnstableCache(keyParts, tags, fn) {
145
+ const { unstable_cache } = await import("next/cache");
146
+ return unstable_cache(fn, keyParts.map(String), { tags })();
147
+ }
148
+ async function queryDoc(args, { config: configPromise }) {
149
+ return withUnstableCache(Object.values(args), [createCollectionCacheKey(args)], async () => {
150
+ if ("globalSlug" in args)
151
+ return queryGlobal({ ...args, config: configPromise });
152
+ else
153
+ return queryDocBySlug({ ...args, config: configPromise });
154
+ });
155
+ }
156
+ async function queryDocBySlug({
232
157
  collectionSlug,
233
158
  slug,
234
159
  slugField = "slug",
@@ -236,155 +161,98 @@ var queryDocBySlug = cache(async function queryDocBySlug2({
236
161
  draft = false,
237
162
  config
238
163
  }) {
239
- console.log("[WWW] render/metadata:queryDocBySlug collection=", collectionSlug, "slug=", slug, "slugField=", slugField, "locale=", locale, "draft=", draft);
240
- const payload = await getPayload({ config });
241
- const result = await payload.find({
242
- collection: collectionSlug,
243
- draft,
244
- limit: 1,
245
- pagination: false,
246
- overrideAccess: draft,
247
- where: { [slugField]: { equals: slug } },
248
- locale
164
+ return withUnstableCache([collectionSlug, slug, locale, draft], [createCollectionCacheKey({ collectionSlug, slug, locale })], async () => {
165
+ const payload = await getPayload({ config });
166
+ const result = await payload.find({
167
+ collection: collectionSlug,
168
+ draft,
169
+ limit: 1,
170
+ pagination: false,
171
+ overrideAccess: draft,
172
+ where: { [slugField]: { equals: slug } },
173
+ locale
174
+ });
175
+ return result.docs?.[0] ?? null;
249
176
  });
250
- const doc = result.docs?.[0] ?? null;
251
- console.log("[WWW] render/metadata:queryDocBySlug ->", doc ? "hit" : "miss");
252
- return doc;
253
- });
254
- var queryAllDocs = cache(async function queryAllDocs2({
255
- collectionSlug,
256
- slugField = "slug",
177
+ }
178
+ async function queryGlobal({
179
+ globalSlug,
257
180
  locale,
181
+ draft = false,
258
182
  config
259
183
  }) {
260
- console.log("[WWW] render/metadata:queryAllDocs collection=", collectionSlug, "locale=", locale);
261
- const payload = await getPayload({ config });
262
- const result = await payload.find({
263
- collection: collectionSlug,
264
- draft: false,
265
- limit: 1000,
266
- pagination: false,
267
- overrideAccess: false,
268
- select: { [slugField]: true },
269
- locale
184
+ return withUnstableCache([globalSlug, locale, draft], [createCollectionCacheKey({ globalSlug, locale })], async () => {
185
+ const payload = await getPayload({ config });
186
+ try {
187
+ return await payload.findGlobal({ slug: globalSlug, draft, locale });
188
+ } catch (error) {
189
+ console.warn("[WWW] queryGlobal failed", { globalSlug, locale, error: String(error) });
190
+ return null;
191
+ }
270
192
  });
271
- const docs = result.docs ?? [];
272
- console.log("[WWW] render/metadata:queryAllDocs -> count=", docs.length);
273
- return docs;
274
- });
275
- var queryAllLocaleSlugs = cache(async function queryAllLocaleSlugs2({
193
+ }
194
+ async function queryAllDocs({
276
195
  collectionSlug,
277
- slug,
278
196
  slugField = "slug",
279
197
  locale,
280
198
  config
281
199
  }) {
282
- console.log("[WWW] render/metadata:queryAllLocaleSlugs collection=", collectionSlug, "slug=", slug, "locale=", locale);
283
- const payload = await getPayload({ config });
284
- const result = await payload.find({
285
- collection: collectionSlug,
286
- draft: false,
287
- limit: 1,
288
- pagination: false,
289
- overrideAccess: false,
290
- locale,
291
- where: { [slugField]: { equals: slug } },
292
- select: { [slugField]: true }
293
- });
294
- const doc = result.docs?.[0];
295
- if (!doc) {
296
- console.log("[WWW] render/metadata:queryAllLocaleSlugs -> undefined (no doc)");
297
- return;
298
- }
299
- let fieldValue = doc[slugField];
300
- if (doc.id != null) {
301
- const allLocales = await payload.findByID({
200
+ return withUnstableCache([collectionSlug, slugField, locale], [createCollectionCacheKey({ collectionSlug, slug: "__all__", locale })], async () => {
201
+ const payload = await getPayload({ config });
202
+ const result = await payload.find({
302
203
  collection: collectionSlug,
303
- id: doc.id,
304
- locale: "all",
305
204
  draft: false,
205
+ limit: 1000,
206
+ pagination: false,
306
207
  overrideAccess: false,
307
- select: { [slugField]: true }
308
- }).catch(() => null);
309
- if (allLocales)
310
- fieldValue = allLocales[slugField];
311
- }
312
- if (fieldValue && typeof fieldValue === "object") {
313
- console.log("[WWW] render/metadata:queryAllLocaleSlugs -> localized map=", JSON.stringify(fieldValue));
314
- return fieldValue;
315
- }
316
- const resolved = await config;
317
- const rawLocales = Array.isArray(resolved?.localization?.localeCodes) ? resolved.localization.localeCodes : resolved?.localization?.locales?.map((l) => l.code) ?? [];
318
- const out = {};
319
- for (const l of rawLocales)
320
- out[l] = String(fieldValue ?? slug);
321
- console.log("[WWW] render/metadata:queryAllLocaleSlugs -> flat-fanout locales=", rawLocales.length, "slug=", JSON.stringify(fieldValue ?? slug));
322
- return out;
323
- });
324
- var queryGlobal = cache(async function queryGlobal2({
325
- globalSlug,
326
- locale,
327
- depth = 0,
328
- draft = false,
208
+ select: { [slugField]: true },
209
+ locale
210
+ });
211
+ return result.docs ?? [];
212
+ });
213
+ }
214
+ async function queryAllLocaleSlugs({
215
+ collectionSlug,
216
+ id,
217
+ slugField = "slug",
329
218
  config
330
219
  }) {
331
- console.log("[WWW] render/metadata:queryGlobal global=", globalSlug, "locale=", locale, "depth=", depth, "draft=", draft);
332
220
  const payload = await getPayload({ config });
333
- try {
334
- const global = await payload.findGlobal({
335
- slug: globalSlug,
336
- depth,
337
- draft,
338
- locale
339
- });
340
- console.log("[WWW] render/metadata:queryGlobal -> hit");
341
- return global;
342
- } catch (error) {
343
- console.warn("[WWW] render/metadata:queryGlobal failed for slug=", globalSlug, "err=", String(error));
344
- return null;
345
- }
346
- });
347
- function getRenderModuleExports(exportName, collection, importMap) {
348
- const path = collection?.custom?.path;
349
- if (!path) {
350
- console.log("[WWW] render/metadata:getRenderModuleExports no custom.path exportName=", exportName);
351
- return;
352
- }
353
- const mod = getFromImportMap(path, importMap);
354
- const value = mod?.[exportName];
355
- console.log("[WWW] render/metadata:getRenderModuleExports exportName=", exportName, "path=", path, "hit=", Boolean(value));
356
- return value;
221
+ const doc = await payload.findByID({
222
+ collection: collectionSlug,
223
+ id,
224
+ locale: "all",
225
+ select: { [slugField]: true }
226
+ });
227
+ return doc?.[slugField];
357
228
  }
358
229
 
359
230
  // src/exports/metadata.ts
360
- var metadata_default = {
231
+ var metadata = {
361
232
  buildArticleLd,
362
233
  buildBreadcrumbsLd,
363
234
  buildOrganizationLd,
364
- buildHreflangAlternates,
235
+ buildWebSiteLd,
236
+ buildProductLd,
237
+ buildRootJsonLd,
365
238
  queryDocBySlug,
366
239
  queryAllDocs,
367
240
  queryAllLocaleSlugs,
368
- getUrlPath,
369
- segmentsToStoredSlug,
370
- segmentsToUrlPath,
371
- storedSlugToSegments,
372
- buildCanonicalUrl,
373
- getRenderModuleExports
241
+ paramsSlugToSlug,
242
+ slugToParamsSlug
374
243
  };
244
+ var metadata_default = metadata;
375
245
  export {
376
- storedSlugToSegments,
377
- segmentsToUrlPath,
378
- segmentsToStoredSlug,
246
+ slugToParamsSlug,
379
247
  queryDocBySlug,
380
248
  queryAllLocaleSlugs,
381
249
  queryAllDocs,
382
- getUrlPath,
383
- getRenderModuleExports,
250
+ paramsSlugToSlug,
384
251
  metadata_default as default,
252
+ buildWebSiteLd,
253
+ buildRootJsonLd,
254
+ buildProductLd,
385
255
  buildOrganizationLd,
386
- buildHreflangAlternates,
387
- buildCanonicalUrl,
388
256
  buildBreadcrumbsLd,
389
257
  buildArticleLd
390
258
  };