@justanarthur/payload-www 0.3.4 → 1.0.1

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 (62) hide show
  1. package/README.md +317 -307
  2. package/dist/access.d.ts +2 -2
  3. package/dist/access.js +6 -30
  4. package/dist/blocks.d.ts +0 -10
  5. package/dist/blocks.js +8 -33
  6. package/dist/collections.d.ts +33 -225
  7. package/dist/collections.js +186 -661
  8. package/dist/config.d.ts +19 -105
  9. package/dist/config.js +263 -868
  10. package/dist/fields.d.ts +4 -46
  11. package/dist/fields.js +183 -73
  12. package/dist/imagehash.js +0 -15
  13. package/dist/import-map-provider.d.ts +0 -16
  14. package/dist/import-map-provider.js +0 -15
  15. package/dist/metadata.d.ts +24 -89
  16. package/dist/metadata.js +123 -258
  17. package/dist/pages.d.ts +37 -319
  18. package/dist/pages.js +355 -973
  19. package/dist/render-pages.d.ts +69 -564
  20. package/dist/render-pages.js +476 -1502
  21. package/dist/sitemap.d.ts +10 -0
  22. package/dist/sitemap.js +324 -0
  23. package/dist/translator.js +0 -15
  24. package/dist/utils.d.ts +4 -12
  25. package/dist/utils.js +10 -56
  26. package/package.json +75 -178
  27. package/dist/components.d.ts +0 -6
  28. package/dist/components.js +0 -39
  29. package/dist/core-access.d.ts +0 -11
  30. package/dist/core-access.js +0 -44
  31. package/dist/core-blocks.d.ts +0 -24
  32. package/dist/core-blocks.js +0 -89
  33. package/dist/core-fields.d.ts +0 -73
  34. package/dist/core-fields.js +0 -181
  35. package/dist/core-utils.d.ts +0 -16
  36. package/dist/core-utils.js +0 -73
  37. package/dist/data-collections.d.ts +0 -229
  38. package/dist/data-collections.js +0 -697
  39. package/dist/data-seed.d.ts +0 -76
  40. package/dist/data-seed.js +0 -212
  41. package/dist/data-test.d.ts +0 -30
  42. package/dist/data-test.js +0 -1134
  43. package/dist/globals.d.ts +0 -69
  44. package/dist/globals.js +0 -259
  45. package/dist/hooks.d.ts +0 -108
  46. package/dist/hooks.js +0 -228
  47. package/dist/index.d.ts +0 -6
  48. package/dist/index.js +0 -39
  49. package/dist/render-components.d.ts +0 -42
  50. package/dist/render-components.js +0 -154
  51. package/dist/render-metadata.d.ts +0 -122
  52. package/dist/render-metadata.js +0 -393
  53. package/dist/render-utils.d.ts +0 -166
  54. package/dist/render-utils.js +0 -401
  55. package/dist/seed.d.ts +0 -76
  56. package/dist/seed.js +0 -212
  57. package/dist/server.d.ts +0 -980
  58. package/dist/server.js +0 -2265
  59. package/dist/test.d.ts +0 -30
  60. package/dist/test.js +0 -1134
  61. package/dist/with-www-config.d.ts +0 -108
  62. package/dist/with-www-config.js +0 -1030
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,127 +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
- const resolvedKey = key.includes("#") ? key : key + "#default";
228
- const value = importMap[resolvedKey];
229
- console.log("[WWW] core/utils:getFromImportMap key=", key, "resolved=", resolvedKey, "hit=", Boolean(value));
230
- return value;
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}`;
231
141
  }
232
142
 
233
143
  // src/render/metadata/query.ts
234
- 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({
235
157
  collectionSlug,
236
158
  slug,
237
159
  slugField = "slug",
@@ -239,155 +161,98 @@ var queryDocBySlug = cache(async function queryDocBySlug2({
239
161
  draft = false,
240
162
  config
241
163
  }) {
242
- console.log("[WWW] render/metadata:queryDocBySlug collection=", collectionSlug, "slug=", slug, "slugField=", slugField, "locale=", locale, "draft=", draft);
243
- const payload = await getPayload({ config });
244
- const result = await payload.find({
245
- collection: collectionSlug,
246
- draft,
247
- limit: 1,
248
- pagination: false,
249
- overrideAccess: draft,
250
- where: { [slugField]: { equals: slug } },
251
- 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;
252
176
  });
253
- const doc = result.docs?.[0] ?? null;
254
- console.log("[WWW] render/metadata:queryDocBySlug ->", doc ? "hit" : "miss");
255
- return doc;
256
- });
257
- var queryAllDocs = cache(async function queryAllDocs2({
258
- collectionSlug,
259
- slugField = "slug",
177
+ }
178
+ async function queryGlobal({
179
+ globalSlug,
260
180
  locale,
181
+ draft = false,
261
182
  config
262
183
  }) {
263
- console.log("[WWW] render/metadata:queryAllDocs collection=", collectionSlug, "locale=", locale);
264
- const payload = await getPayload({ config });
265
- const result = await payload.find({
266
- collection: collectionSlug,
267
- draft: false,
268
- limit: 1000,
269
- pagination: false,
270
- overrideAccess: false,
271
- select: { [slugField]: true },
272
- 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
+ }
273
192
  });
274
- const docs = result.docs ?? [];
275
- console.log("[WWW] render/metadata:queryAllDocs -> count=", docs.length);
276
- return docs;
277
- });
278
- var queryAllLocaleSlugs = cache(async function queryAllLocaleSlugs2({
193
+ }
194
+ async function queryAllDocs({
279
195
  collectionSlug,
280
- slug,
281
196
  slugField = "slug",
282
197
  locale,
283
198
  config
284
199
  }) {
285
- console.log("[WWW] render/metadata:queryAllLocaleSlugs collection=", collectionSlug, "slug=", slug, "locale=", locale);
286
- const payload = await getPayload({ config });
287
- const result = await payload.find({
288
- collection: collectionSlug,
289
- draft: false,
290
- limit: 1,
291
- pagination: false,
292
- overrideAccess: false,
293
- locale,
294
- where: { [slugField]: { equals: slug } },
295
- select: { [slugField]: true }
296
- });
297
- const doc = result.docs?.[0];
298
- if (!doc) {
299
- console.log("[WWW] render/metadata:queryAllLocaleSlugs -> undefined (no doc)");
300
- return;
301
- }
302
- let fieldValue = doc[slugField];
303
- if (doc.id != null) {
304
- 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({
305
203
  collection: collectionSlug,
306
- id: doc.id,
307
- locale: "all",
308
204
  draft: false,
205
+ limit: 1000,
206
+ pagination: false,
309
207
  overrideAccess: false,
310
- select: { [slugField]: true }
311
- }).catch(() => null);
312
- if (allLocales)
313
- fieldValue = allLocales[slugField];
314
- }
315
- if (fieldValue && typeof fieldValue === "object") {
316
- console.log("[WWW] render/metadata:queryAllLocaleSlugs -> localized map=", JSON.stringify(fieldValue));
317
- return fieldValue;
318
- }
319
- const resolved = await config;
320
- const rawLocales = Array.isArray(resolved?.localization?.localeCodes) ? resolved.localization.localeCodes : resolved?.localization?.locales?.map((l) => l.code) ?? [];
321
- const out = {};
322
- for (const l of rawLocales)
323
- out[l] = String(fieldValue ?? slug);
324
- console.log("[WWW] render/metadata:queryAllLocaleSlugs -> flat-fanout locales=", rawLocales.length, "slug=", JSON.stringify(fieldValue ?? slug));
325
- return out;
326
- });
327
- var queryGlobal = cache(async function queryGlobal2({
328
- globalSlug,
329
- locale,
330
- depth = 0,
331
- 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",
332
218
  config
333
219
  }) {
334
- console.log("[WWW] render/metadata:queryGlobal global=", globalSlug, "locale=", locale, "depth=", depth, "draft=", draft);
335
220
  const payload = await getPayload({ config });
336
- try {
337
- const global = await payload.findGlobal({
338
- slug: globalSlug,
339
- depth,
340
- draft,
341
- locale
342
- });
343
- console.log("[WWW] render/metadata:queryGlobal -> hit");
344
- return global;
345
- } catch (error) {
346
- console.warn("[WWW] render/metadata:queryGlobal failed for slug=", globalSlug, "err=", String(error));
347
- return null;
348
- }
349
- });
350
- function getRenderModuleExports(exportName, collection, importMap) {
351
- const path = collection?.custom?.path;
352
- if (!path) {
353
- console.log("[WWW] render/metadata:getRenderModuleExports no custom.path exportName=", exportName);
354
- return;
355
- }
356
- const mod = getFromImportMap(path, importMap);
357
- const value = mod?.[exportName];
358
- console.log("[WWW] render/metadata:getRenderModuleExports exportName=", exportName, "path=", path, "hit=", Boolean(value));
359
- 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];
360
228
  }
361
229
 
362
230
  // src/exports/metadata.ts
363
- var metadata_default = {
231
+ var metadata = {
364
232
  buildArticleLd,
365
233
  buildBreadcrumbsLd,
366
234
  buildOrganizationLd,
367
- buildHreflangAlternates,
235
+ buildWebSiteLd,
236
+ buildProductLd,
237
+ buildRootJsonLd,
368
238
  queryDocBySlug,
369
239
  queryAllDocs,
370
240
  queryAllLocaleSlugs,
371
- getUrlPath,
372
- segmentsToStoredSlug,
373
- segmentsToUrlPath,
374
- storedSlugToSegments,
375
- buildCanonicalUrl,
376
- getRenderModuleExports
241
+ paramsSlugToSlug,
242
+ slugToParamsSlug
377
243
  };
244
+ var metadata_default = metadata;
378
245
  export {
379
- storedSlugToSegments,
380
- segmentsToUrlPath,
381
- segmentsToStoredSlug,
246
+ slugToParamsSlug,
382
247
  queryDocBySlug,
383
248
  queryAllLocaleSlugs,
384
249
  queryAllDocs,
385
- getUrlPath,
386
- getRenderModuleExports,
250
+ paramsSlugToSlug,
387
251
  metadata_default as default,
252
+ buildWebSiteLd,
253
+ buildRootJsonLd,
254
+ buildProductLd,
388
255
  buildOrganizationLd,
389
- buildHreflangAlternates,
390
- buildCanonicalUrl,
391
256
  buildBreadcrumbsLd,
392
257
  buildArticleLd
393
258
  };