@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
@@ -0,0 +1,10 @@
1
+ type CreateCollectionPageExportsDeps<S extends string> = {
2
+ getServerSideURL: () => string;
3
+ pagePathPrefix?: string;
4
+ };
5
+ type GenerateSitemapPageExportsArgs = CreateCollectionPageExportsDeps<any>;
6
+ declare function createSitemapFromCollections(...args: GenerateSitemapPageExportsArgs[]): () => Response;
7
+ declare const _default: {
8
+ createSitemapFromCollections: typeof createSitemapFromCollections;
9
+ };
10
+ export { _default as default, createSitemapFromCollections };
@@ -0,0 +1,324 @@
1
+
2
+
3
+ // src/render/pages/createCollectionPageExports.tsx
4
+ import"server-only";
5
+
6
+ // src/render/metadata/slug.ts
7
+ var SLUG_NESTED_DIVIDER = "_";
8
+ function paramsSlugToSlug(slug, _shape) {
9
+ if (!slug)
10
+ return "";
11
+ return (Array.isArray(slug) ? slug : [slug]).join(SLUG_NESTED_DIVIDER);
12
+ }
13
+ function slugToParamsSlug(slug, shape) {
14
+ if (!slug)
15
+ return shape === "catch-all" ? [] : "";
16
+ return shape === "catch-all" ? slug.split(SLUG_NESTED_DIVIDER) : slug;
17
+ }
18
+
19
+ // src/render/metadata/query.ts
20
+ import { getPayload } from "payload";
21
+
22
+ // src/collections/hooks/createRevalidateCollectionGlobalHook.ts
23
+ import { revalidateTag } from "next/cache";
24
+ function createRevalidateCollectionGlobalHook() {
25
+ const afterChangeDeleteHook = async ({ doc, req, ...args }) => {
26
+ const previousDoc = "previousDoc" in args ? args.previousDoc : null, locale = req.locale;
27
+ function revalidate(args2) {
28
+ try {
29
+ revalidateTag(createCollectionCacheKey({ ...args2, locale }), "max");
30
+ } catch (error) {
31
+ const msg = error instanceof Error ? error.message : String(error);
32
+ if (msg.includes("static generation store missing"))
33
+ return;
34
+ console.error(error);
35
+ }
36
+ }
37
+ if ("collection" in args) {
38
+ [
39
+ doc && doc._status !== "draft" && doc.slug,
40
+ previousDoc && previousDoc._status === "published" && previousDoc.slug
41
+ ].filter((slug) => slug !== undefined && slug !== false).map((slug) => revalidate({ collectionSlug: args.collection.slug, slug }));
42
+ } else {
43
+ revalidate({ globalSlug: args.global.slug });
44
+ }
45
+ return doc;
46
+ };
47
+ return { afterChange: afterChangeDeleteHook, afterDelete: afterChangeDeleteHook };
48
+ }
49
+ function createCollectionCacheKey(args) {
50
+ return `${"globalSlug" in args ? args.globalSlug : args.collectionSlug + args.slug}_${args.locale}`;
51
+ }
52
+
53
+ // src/render/metadata/query.ts
54
+ async function withUnstableCache(keyParts, tags, fn) {
55
+ const { unstable_cache } = await import("next/cache");
56
+ return unstable_cache(fn, keyParts.map(String), { tags })();
57
+ }
58
+ async function queryDoc(args, { config: configPromise }) {
59
+ return withUnstableCache(Object.values(args), [createCollectionCacheKey(args)], async () => {
60
+ if ("globalSlug" in args)
61
+ return queryGlobal({ ...args, config: configPromise });
62
+ else
63
+ return queryDocBySlug({ ...args, config: configPromise });
64
+ });
65
+ }
66
+ async function queryDocBySlug({
67
+ collectionSlug,
68
+ slug,
69
+ slugField = "slug",
70
+ locale,
71
+ draft = false,
72
+ config
73
+ }) {
74
+ return withUnstableCache([collectionSlug, slug, locale, draft], [createCollectionCacheKey({ collectionSlug, slug, locale })], async () => {
75
+ const payload = await getPayload({ config });
76
+ const result = await payload.find({
77
+ collection: collectionSlug,
78
+ draft,
79
+ limit: 1,
80
+ pagination: false,
81
+ overrideAccess: draft,
82
+ where: { [slugField]: { equals: slug } },
83
+ locale
84
+ });
85
+ return result.docs?.[0] ?? null;
86
+ });
87
+ }
88
+ async function queryGlobal({
89
+ globalSlug,
90
+ locale,
91
+ draft = false,
92
+ config
93
+ }) {
94
+ return withUnstableCache([globalSlug, locale, draft], [createCollectionCacheKey({ globalSlug, locale })], async () => {
95
+ const payload = await getPayload({ config });
96
+ try {
97
+ return await payload.findGlobal({ slug: globalSlug, draft, locale });
98
+ } catch (error) {
99
+ console.warn("[WWW] queryGlobal failed", { globalSlug, locale, error: String(error) });
100
+ return null;
101
+ }
102
+ });
103
+ }
104
+ async function queryAllDocs({
105
+ collectionSlug,
106
+ slugField = "slug",
107
+ locale,
108
+ config
109
+ }) {
110
+ return withUnstableCache([collectionSlug, slugField, locale], [createCollectionCacheKey({ collectionSlug, slug: "__all__", locale })], async () => {
111
+ const payload = await getPayload({ config });
112
+ const result = await payload.find({
113
+ collection: collectionSlug,
114
+ draft: false,
115
+ limit: 1000,
116
+ pagination: false,
117
+ overrideAccess: false,
118
+ select: { [slugField]: true },
119
+ locale
120
+ });
121
+ return result.docs ?? [];
122
+ });
123
+ }
124
+ async function queryAllLocaleSlugs({
125
+ collectionSlug,
126
+ id,
127
+ slugField = "slug",
128
+ config
129
+ }) {
130
+ const payload = await getPayload({ config });
131
+ const doc = await payload.findByID({
132
+ collection: collectionSlug,
133
+ id,
134
+ locale: "all",
135
+ select: { [slugField]: true }
136
+ });
137
+ return doc?.[slugField];
138
+ }
139
+
140
+ // src/render/pages/createCollectionPageExports.tsx
141
+ import { setRequestLocale } from "next-intl/server";
142
+
143
+ // src/render/pages/utils/buildLocalizedPath.ts
144
+ function buildLocalizedPath(locale, prefix, slug, { routing }) {
145
+ return `${routing.localePrefix === "never" ? "" : routing.localePrefix === "always" ? locale : routing.localePrefix === "as-needed" ? locale === routing.defaultLocale ? "" : "/" + locale : (() => {
146
+ throw new Error("Unsupported locale prefix");
147
+ })()}${prefix ? "/" + prefix : ""}${slug ? "/" + slug : ""}`;
148
+ }
149
+ function buildLocalizedPaths(localesSlug, pagePathPrefix, { routing }) {
150
+ return routing.locales.reduce((paths, locale) => {
151
+ const slug = localesSlug[locale];
152
+ paths[locale] = buildLocalizedPath(locale, pagePathPrefix, slug, { routing });
153
+ return paths;
154
+ }, {});
155
+ }
156
+ function buildAlternates(locale, ...args) {
157
+ const siteUrl = args[2].siteUrl;
158
+ let localizedPaths = buildLocalizedPaths(...args);
159
+ localizedPaths["x-default"] = localizedPaths[args[2].routing.defaultLocale];
160
+ localizedPaths = Object.fromEntries(Object.entries(localizedPaths).map(([key, value]) => [key, siteUrl + localizedPaths[key]]));
161
+ return {
162
+ languages: localizedPaths,
163
+ canonical: localizedPaths[locale]
164
+ };
165
+ }
166
+
167
+ // src/render/pages/createCollectionPageExports.tsx
168
+ import { createSiteDefaults, generateMeta } from "@justanarthur/payload-plugin-seo/next-metadata";
169
+
170
+ // package.json
171
+ var name = "@justanarthur/payload-www";
172
+
173
+ // src/render/getFromImportMap.ts
174
+ function getFromImportMap(key, importMap) {
175
+ return key && importMap[key.includes("#") ? key : key + "#default"];
176
+ }
177
+
178
+ // src/render/renderWWWModule.tsx
179
+ import { jsx } from "react/jsx-runtime";
180
+ async function renderWWWDataModule(data, {
181
+ collectionSlug,
182
+ configPath = "collections",
183
+ config: configPromise,
184
+ importMap
185
+ }, props) {
186
+ const config = await configPromise;
187
+ const renderPath = config[configPath]?.find((c) => c.slug === collectionSlug)?.custom?.[name]?.path;
188
+ const RenderModule = getFromImportMap(renderPath, importMap);
189
+ if (!RenderModule) {
190
+ if (false) {}
191
+ return null;
192
+ }
193
+ return /* @__PURE__ */ jsx(RenderModule, {
194
+ data,
195
+ config,
196
+ importMap,
197
+ ...props
198
+ });
199
+ }
200
+
201
+ // src/render/pages/createCollectionPageExports.tsx
202
+ import { jsx as jsx2, Fragment } from "react/jsx-runtime";
203
+ function createCollectionPageExports({
204
+ slug: collectionSlug = "pages",
205
+ config: configPromise,
206
+ importMap,
207
+ routing,
208
+ slugShape = "single"
209
+ }, {
210
+ getServerSideURL,
211
+ pagePathPrefix
212
+ }) {
213
+ const siteUrl = getServerSideURL();
214
+ async function fetchDoc(locale, slug) {
215
+ return queryDoc({
216
+ slug,
217
+ locale,
218
+ collectionSlug
219
+ }, {
220
+ config: configPromise
221
+ });
222
+ }
223
+ const default_ = async (props) => {
224
+ const params = await props.params;
225
+ const locale = params.locale;
226
+ if (!routing.locales.includes(locale)) {
227
+ const { notFound } = await import("next/navigation");
228
+ return notFound();
229
+ } else
230
+ setRequestLocale(locale);
231
+ const slug = paramsSlugToSlug(params.slug, slugShape);
232
+ const doc = await fetchDoc(locale, slug);
233
+ if (!doc) {
234
+ const { notFound } = await import("next/navigation");
235
+ notFound();
236
+ }
237
+ const rendered = renderWWWDataModule(doc, { collectionSlug, config: configPromise, importMap }, { ...props, locale });
238
+ return /* @__PURE__ */ jsx2(Fragment, {
239
+ children: rendered
240
+ });
241
+ };
242
+ async function generateMetadata(props) {
243
+ const params = await props.params;
244
+ const locale = params.locale, slug = paramsSlugToSlug(params.slug, slugShape);
245
+ const doc = await fetchDoc(locale, slug);
246
+ const [localesSlug, siteDefaults] = await Promise.all([
247
+ doc ? queryAllLocaleSlugs({
248
+ id: doc.id,
249
+ collectionSlug,
250
+ config: configPromise
251
+ }) : Promise.resolve({}),
252
+ createSiteDefaults({ config: configPromise, locale })
253
+ ]);
254
+ if (!doc)
255
+ return {};
256
+ const alternates = buildAlternates(locale, localesSlug ?? {}, pagePathPrefix, { routing, siteUrl });
257
+ const meta = await generateMeta({
258
+ meta: doc.meta,
259
+ url: alternates.canonical,
260
+ type: "website",
261
+ locale,
262
+ availableLocales: routing.locales,
263
+ fallback: doc,
264
+ siteDefaults
265
+ });
266
+ console.log("[www#generateMetadata]", { alternates, meta, locale, localesSlug, doc });
267
+ return { ...meta, alternates };
268
+ }
269
+ async function generateStaticParams(props) {
270
+ const locale = (await props.params).locale;
271
+ const docs = await queryAllDocs({ locale, collectionSlug, config: configPromise });
272
+ return docs.filter((doc) => typeof doc.slug === "string" && doc.slug.length > 0).map((doc) => ({ slug: slugToParamsSlug(doc.slug, slugShape) }));
273
+ }
274
+ async function generateSitemap() {
275
+ const locale = routing.defaultLocale;
276
+ const docs = await queryAllDocs({
277
+ collectionSlug,
278
+ locale,
279
+ config: configPromise
280
+ });
281
+ return await Promise.all(docs.map(async (doc) => {
282
+ const localesSlug = await queryAllLocaleSlugs({
283
+ id: doc.id,
284
+ collectionSlug,
285
+ config: configPromise
286
+ }) ?? {};
287
+ const alternates = buildAlternates(locale, localesSlug, pagePathPrefix, { routing, siteUrl });
288
+ return {
289
+ url: alternates.canonical,
290
+ alternates,
291
+ lastModified: doc.updatedAt || new Date
292
+ };
293
+ }));
294
+ }
295
+ generateSitemap.getServerSideURL = getServerSideURL;
296
+ generateSitemap.pagePathPrefix = pagePathPrefix;
297
+ return {
298
+ default: default_,
299
+ generateMetadata,
300
+ generateStaticParams,
301
+ generateSitemap
302
+ };
303
+ }
304
+ function createSitemapFromCollections(...args) {
305
+ const baseUrl = args[0].getServerSideURL();
306
+ return function sitemap() {
307
+ const sitemaps = args.map((arg) => `${baseUrl}/${arg.pagePathPrefix}/sitemap.xml`);
308
+ const xml = `<?xml version="1.0" encoding="UTF-8"?>
309
+ <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
310
+ ${sitemaps.map((url) => ` <sitemap><loc>${url}</loc></sitemap>`).join(`
311
+ `)}
312
+ </sitemapindex>`;
313
+ return new Response(xml, {
314
+ headers: { "Content-Type": "application/xml" }
315
+ });
316
+ };
317
+ }
318
+
319
+ // src/exports/sitemap.ts
320
+ var sitemap_default = { createSitemapFromCollections };
321
+ export {
322
+ sitemap_default as default,
323
+ createSitemapFromCollections
324
+ };
@@ -1,19 +1,4 @@
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
3
  // src/exports/translator.ts
19
4
  import { translator } from "@justanarthur/payload-plugin-translator";
package/dist/utils.d.ts CHANGED
@@ -1,16 +1,8 @@
1
- import { ImportMap } from "payload";
2
- declare function getFromImportMap(key: string, importMap: ImportMap): any;
3
1
  declare function generateImportName(type: "block" | "page", slug: string): string;
4
- import { ImportMap as ImportMap2 } from "payload";
5
- import { JSX as JSX_1kxb } from "react/jsx-runtime";
6
- type Element_12xgc = JSX_1kxb["Element"];
7
- declare function renderCollectionModule(collection: {
8
- slug: string;
9
- custom?: Record<string, any>;
10
- }[] | undefined, slug: string, importMap: ImportMap2, props?: Record<string, any>): Element_12xgc | null;
11
- declare const _default: {
2
+ import { ImportMap } from "payload";
3
+ declare function getFromImportMap(key: string | undefined, importMap: ImportMap): any;
4
+ declare const utils: {
12
5
  getFromImportMap: typeof getFromImportMap;
13
6
  generateImportName: typeof generateImportName;
14
- renderCollectionModule: typeof renderCollectionModule;
15
7
  };
16
- export { renderCollectionModule, getFromImportMap, generateImportName, _default as default };
8
+ export { getFromImportMap, generateImportName, utils as default };
package/dist/utils.js CHANGED
@@ -1,72 +1,26 @@
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
-
18
- // src/core/utils/getFromImportMap.ts
19
- function getFromImportMap(key, importMap) {
20
- const resolvedKey = key.includes("#") ? key : key + "#default";
21
- const value = importMap[resolvedKey];
22
- console.log("[WWW] core/utils:getFromImportMap key=", key, "resolved=", resolvedKey, "hit=", Boolean(value));
23
- return value;
24
- }
25
2
 
26
- // src/core/utils/generateImportName.ts
3
+ // src/render/generateImportName.ts
27
4
  function generateImportName(type, slug) {
28
5
  switch (type) {
29
- case "block": {
30
- const name = `Block${slug.replace(/(^\w|-\w)/g, (m) => m.replace("-", "").toUpperCase())}#default`;
31
- console.log("[WWW] core/utils:generateImportName type=block slug=", slug, "->", name);
32
- return name;
33
- }
34
- case "page": {
35
- const name = `Page${slug.replace(/(^\w|-\w)/g, (m) => m.replace("-", "").toUpperCase())}#default`;
36
- console.log("[WWW] core/utils:generateImportName type=page slug=", slug, "->", name);
37
- return name;
38
- }
6
+ case "block":
7
+ return `Block${slug.replace(/(^\w|-\w)/g, (m) => m.replace("-", "").toUpperCase())}#default`;
8
+ case "page":
9
+ return `Page${slug.replace(/(^\w|-\w)/g, (m) => m.replace("-", "").toUpperCase())}#default`;
39
10
  default:
40
- console.error("[WWW] core/utils:generateImportName unknown type:", type);
41
11
  throw new Error(`Unknown type: ${type}`);
42
12
  }
43
13
  }
44
14
 
45
- // src/render/utils/renderCollectionModule.tsx
46
- import { jsx } from "react/jsx-runtime";
47
- function renderCollectionModule(collection = [], slug, importMap, props) {
48
- const renderPath = collection?.find((c) => c.slug === slug)?.custom?.path;
49
- if (!renderPath) {
50
- console.log("[WWW] render/utils:renderCollectionModule no custom.path slug=", slug);
51
- return null;
52
- }
53
- const CollectionRenderModule = getFromImportMap(renderPath, importMap);
54
- if (!CollectionRenderModule) {
55
- console.error("[WWW] render/utils:renderCollectionModule not found slug=", slug, "path=", renderPath);
56
- if (false) {}
57
- return null;
58
- }
59
- console.log("[WWW] render/utils:renderCollectionModule rendering slug=", slug, "path=", renderPath);
60
- return /* @__PURE__ */ jsx(CollectionRenderModule, {
61
- importMap,
62
- ...props
63
- });
15
+ // src/render/getFromImportMap.ts
16
+ function getFromImportMap(key, importMap) {
17
+ return key && importMap[key.includes("#") ? key : key + "#default"];
64
18
  }
65
19
 
66
20
  // src/exports/utils.ts
67
- var utils_default = { getFromImportMap, generateImportName, renderCollectionModule };
21
+ var utils = { getFromImportMap, generateImportName };
22
+ var utils_default = utils;
68
23
  export {
69
- renderCollectionModule,
70
24
  getFromImportMap,
71
25
  generateImportName,
72
26
  utils_default as default