@justanarthur/payload-www 0.1.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.
- package/README.md +381 -0
- package/dist/access.d.ts +11 -0
- package/dist/access.js +34 -0
- package/dist/blocks.d.ts +24 -0
- package/dist/blocks.js +75 -0
- package/dist/collections.d.ts +200 -0
- package/dist/collections.js +625 -0
- package/dist/components.d.ts +6 -0
- package/dist/components.js +38 -0
- package/dist/config.d.ts +100 -0
- package/dist/config.js +914 -0
- package/dist/core-access.d.ts +11 -0
- package/dist/core-access.js +34 -0
- package/dist/core-blocks.d.ts +24 -0
- package/dist/core-blocks.js +75 -0
- package/dist/core-fields.d.ts +36 -0
- package/dist/core-fields.js +134 -0
- package/dist/core-utils.d.ts +16 -0
- package/dist/core-utils.js +59 -0
- package/dist/data-collections.d.ts +200 -0
- package/dist/data-collections.js +625 -0
- package/dist/data-seed.d.ts +76 -0
- package/dist/data-seed.js +212 -0
- package/dist/data-test.d.ts +30 -0
- package/dist/data-test.js +1018 -0
- package/dist/fields.d.ts +36 -0
- package/dist/fields.js +134 -0
- package/dist/globals.d.ts +48 -0
- package/dist/globals.js +228 -0
- package/dist/hooks.d.ts +108 -0
- package/dist/hooks.js +196 -0
- package/dist/imagehash.d.ts +3 -0
- package/dist/imagehash.js +24 -0
- package/dist/import-map-provider.d.ts +20 -0
- package/dist/import-map-provider.js +26 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +38 -0
- package/dist/metadata.d.ts +122 -0
- package/dist/metadata.js +335 -0
- package/dist/pages.d.ts +323 -0
- package/dist/pages.js +1016 -0
- package/dist/render-components.d.ts +42 -0
- package/dist/render-components.js +144 -0
- package/dist/render-metadata.d.ts +122 -0
- package/dist/render-metadata.js +335 -0
- package/dist/render-pages.d.ts +574 -0
- package/dist/render-pages.js +1450 -0
- package/dist/render-utils.d.ts +158 -0
- package/dist/render-utils.js +341 -0
- package/dist/seed.d.ts +76 -0
- package/dist/seed.js +212 -0
- package/dist/server.d.ts +922 -0
- package/dist/server.js +2055 -0
- package/dist/test.d.ts +30 -0
- package/dist/test.js +1018 -0
- package/dist/translator.d.ts +2 -0
- package/dist/translator.js +24 -0
- package/dist/utils.d.ts +16 -0
- package/dist/utils.js +59 -0
- package/dist/with-www-config.d.ts +100 -0
- package/dist/with-www-config.js +914 -0
- package/package.json +246 -0
|
@@ -0,0 +1,625 @@
|
|
|
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/access/index.ts
|
|
19
|
+
var anyone = () => true;
|
|
20
|
+
var authenticated = ({ req: { user } }) => Boolean(user);
|
|
21
|
+
var authenticatedOrPublished = ({ req: { user } }) => {
|
|
22
|
+
if (user)
|
|
23
|
+
return true;
|
|
24
|
+
return { _status: { equals: "published" } };
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// src/render/_locale.ts
|
|
28
|
+
function prefixFor(locale, defaultLocale, mode) {
|
|
29
|
+
if (mode === "never")
|
|
30
|
+
return "";
|
|
31
|
+
if (mode === "as-needed" && locale === defaultLocale)
|
|
32
|
+
return "";
|
|
33
|
+
return `/${locale}`;
|
|
34
|
+
}
|
|
35
|
+
function resolveLocale(req) {
|
|
36
|
+
if (!req || typeof req !== "object")
|
|
37
|
+
return "";
|
|
38
|
+
const r = req;
|
|
39
|
+
if (typeof r.locale === "string" && r.locale.length > 0)
|
|
40
|
+
return r.locale;
|
|
41
|
+
const fallback = r.payload?.config?.localization?.defaultLocale;
|
|
42
|
+
if (typeof fallback === "string" && fallback.length > 0)
|
|
43
|
+
return fallback;
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
function allLocales(req) {
|
|
47
|
+
if (!req || typeof req !== "object")
|
|
48
|
+
return [];
|
|
49
|
+
const r = req;
|
|
50
|
+
const list = r.payload?.config?.localization?.locales;
|
|
51
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const out = [];
|
|
54
|
+
for (const entry of list) {
|
|
55
|
+
if (typeof entry === "string" && entry.length > 0) {
|
|
56
|
+
out.push(entry);
|
|
57
|
+
} else if (entry && typeof entry === "object" && "code" in entry) {
|
|
58
|
+
const code = entry.code;
|
|
59
|
+
if (typeof code === "string" && code.length > 0)
|
|
60
|
+
out.push(code);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src/render/hooks/_shared.ts
|
|
67
|
+
var cachePromise = null;
|
|
68
|
+
function nextCacheImport() {
|
|
69
|
+
return cachePromise ??= import("next/cache");
|
|
70
|
+
}
|
|
71
|
+
function shouldSkipRevalidate(context) {
|
|
72
|
+
return Boolean(context?.disableRevalidate);
|
|
73
|
+
}
|
|
74
|
+
async function safeRevalidatePath(payload, path) {
|
|
75
|
+
try {
|
|
76
|
+
const { revalidatePath } = await nextCacheImport();
|
|
77
|
+
revalidatePath(path);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
payload.logger.error(`revalidatePath("${path}") failed: ${String(error)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function safeRevalidateTag(payload, tag, profile = "max") {
|
|
83
|
+
try {
|
|
84
|
+
const { revalidateTag } = await nextCacheImport();
|
|
85
|
+
revalidateTag(tag, profile);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
payload.logger.error(`revalidateTag("${tag}") failed: ${String(error)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/render/hooks/revalidateCollection.ts
|
|
92
|
+
function createRevalidateCollectionHook(options) {
|
|
93
|
+
const {
|
|
94
|
+
collectionSlug,
|
|
95
|
+
urlPathPrefix = "",
|
|
96
|
+
sitemapTag,
|
|
97
|
+
localePrefix: modeOption,
|
|
98
|
+
defaultLocale: defaultLocaleOption,
|
|
99
|
+
pathMode = "url"
|
|
100
|
+
} = options;
|
|
101
|
+
const resolvedSitemapTag = sitemapTag === false ? false : sitemapTag ?? `${collectionSlug}-sitemap`;
|
|
102
|
+
const resolveDefaults = (req) => {
|
|
103
|
+
const mode = modeOption ?? "always";
|
|
104
|
+
const defaultLocale = defaultLocaleOption ?? req?.payload?.config?.localization?.defaultLocale ?? "";
|
|
105
|
+
return { mode, defaultLocale };
|
|
106
|
+
};
|
|
107
|
+
const localesToFanOut = (req) => {
|
|
108
|
+
const all = allLocales(req);
|
|
109
|
+
if (all.length > 0)
|
|
110
|
+
return all;
|
|
111
|
+
const single = resolveLocale(req);
|
|
112
|
+
return single ? [single] : [];
|
|
113
|
+
};
|
|
114
|
+
const collectionPath = (slug, locale, mode, defaultLocale) => {
|
|
115
|
+
const prefix = prefixFor(locale, defaultLocale, mode);
|
|
116
|
+
if (!slug)
|
|
117
|
+
return `${prefix}${urlPathPrefix}` || "/";
|
|
118
|
+
return `${prefix}${urlPathPrefix}/${slug}`;
|
|
119
|
+
};
|
|
120
|
+
const fanOutPaths = async (payload, req, slug, label) => {
|
|
121
|
+
const { mode, defaultLocale } = resolveDefaults(req);
|
|
122
|
+
const locales = localesToFanOut(req);
|
|
123
|
+
for (const locale of locales) {
|
|
124
|
+
const path = collectionPath(slug, locale, mode, defaultLocale);
|
|
125
|
+
payload.logger.info?.(`${label} ${path}`);
|
|
126
|
+
await safeRevalidatePath(payload, path);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const fireCollectionTags = async (payload, docId, req) => {
|
|
130
|
+
if (typeof docId === "string" || typeof docId === "number") {
|
|
131
|
+
await safeRevalidateTag(payload, `collection_${collectionSlug}_${docId}`);
|
|
132
|
+
}
|
|
133
|
+
if (resolvedSitemapTag !== false) {
|
|
134
|
+
await safeRevalidateTag(payload, resolvedSitemapTag);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const afterChange = async ({ doc, previousDoc, req }) => {
|
|
138
|
+
if (shouldSkipRevalidate(req.context))
|
|
139
|
+
return doc;
|
|
140
|
+
const { payload } = req;
|
|
141
|
+
const typed = doc;
|
|
142
|
+
const prev = previousDoc;
|
|
143
|
+
const isPublished = typed._status === "published";
|
|
144
|
+
const wasPublished = prev?._status === "published";
|
|
145
|
+
const prevSlugIsString = typeof prev?.slug === "string";
|
|
146
|
+
const slugChanged = prevSlugIsString && prev?.slug !== typed.slug;
|
|
147
|
+
if (isPublished) {
|
|
148
|
+
if (pathMode !== "tag-only") {
|
|
149
|
+
await fanOutPaths(payload, req, typed.slug, `Revalidating ${collectionSlug} at path:`);
|
|
150
|
+
}
|
|
151
|
+
await fireCollectionTags(payload, typed.id, req);
|
|
152
|
+
}
|
|
153
|
+
if (wasPublished && (!isPublished || slugChanged)) {
|
|
154
|
+
if (pathMode !== "tag-only") {
|
|
155
|
+
await fanOutPaths(payload, req, prev?.slug, `Revalidating old ${collectionSlug} at path:`);
|
|
156
|
+
}
|
|
157
|
+
await fireCollectionTags(payload, typed.id, req);
|
|
158
|
+
}
|
|
159
|
+
return doc;
|
|
160
|
+
};
|
|
161
|
+
const afterDelete = async ({ doc, req }) => {
|
|
162
|
+
if (shouldSkipRevalidate(req.context))
|
|
163
|
+
return doc ?? null;
|
|
164
|
+
const { payload } = req;
|
|
165
|
+
const typed = doc;
|
|
166
|
+
if (pathMode !== "tag-only") {
|
|
167
|
+
await fanOutPaths(payload, req, typed?.slug, `Revalidating deleted ${collectionSlug} at path:`);
|
|
168
|
+
}
|
|
169
|
+
await fireCollectionTags(payload, typed?.id, req);
|
|
170
|
+
return doc ?? null;
|
|
171
|
+
};
|
|
172
|
+
return { afterChange, afterDelete };
|
|
173
|
+
}
|
|
174
|
+
var createRevalidatePageHooks = (opts = {}) => createRevalidateCollectionHook({
|
|
175
|
+
collectionSlug: "pages",
|
|
176
|
+
urlPathPrefix: "",
|
|
177
|
+
...opts
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// src/config/constants.ts
|
|
181
|
+
var PAGES_RENDER_PATH = "@justanarthur/payload-www/render-pages#PagesPage";
|
|
182
|
+
var POSTS_RENDER_PATH = "@justanarthur/payload-www/render-pages#PostsPage";
|
|
183
|
+
var HEADER_RENDER_PATH = "@justanarthur/payload-www/render-pages#HeaderPage";
|
|
184
|
+
var FOOTER_RENDER_PATH = "@justanarthur/payload-www/render-pages#FooterPage";
|
|
185
|
+
var LIVE_PREVIEW_LISTENER_PATH = "@justanarthur/payload-www/render-components#LivePreviewListener";
|
|
186
|
+
var PAGES_SLUG = "pages";
|
|
187
|
+
var POSTS_SLUG = "posts";
|
|
188
|
+
var STATIC_PAGES_SLUG = "staticPages";
|
|
189
|
+
|
|
190
|
+
// src/data/collections/Pages/index.ts
|
|
191
|
+
var HOME_PAGE_SLUG = "";
|
|
192
|
+
var PAGES_SLUG2 = PAGES_SLUG;
|
|
193
|
+
var createPagesCollection = (blocks, options = {}) => {
|
|
194
|
+
const {
|
|
195
|
+
renderPath = PAGES_RENDER_PATH,
|
|
196
|
+
slug: collectionSlug = PAGES_SLUG2,
|
|
197
|
+
localePrefix,
|
|
198
|
+
defaultLocale
|
|
199
|
+
} = options;
|
|
200
|
+
const slugField = {
|
|
201
|
+
name: "slug",
|
|
202
|
+
type: "text",
|
|
203
|
+
required: true,
|
|
204
|
+
unique: true,
|
|
205
|
+
index: true,
|
|
206
|
+
admin: { position: "sidebar" },
|
|
207
|
+
validate: (value) => {
|
|
208
|
+
if (typeof value !== "string")
|
|
209
|
+
return "Slug must be a string";
|
|
210
|
+
if (value !== "" && !/^[a-z0-9-]+$/.test(value)) {
|
|
211
|
+
return "Slug must be lowercase, with hyphens (no spaces or special characters)";
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const baseFields = [
|
|
217
|
+
{
|
|
218
|
+
name: "title",
|
|
219
|
+
type: "text",
|
|
220
|
+
required: true,
|
|
221
|
+
localized: true
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
type: "tabs",
|
|
225
|
+
tabs: [
|
|
226
|
+
{
|
|
227
|
+
fields: [
|
|
228
|
+
{
|
|
229
|
+
name: "blocks",
|
|
230
|
+
type: "blocks",
|
|
231
|
+
blocks,
|
|
232
|
+
required: true,
|
|
233
|
+
admin: { initCollapsed: true }
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
label: "Content"
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: "publishedAt",
|
|
242
|
+
type: "date",
|
|
243
|
+
admin: { position: "sidebar" }
|
|
244
|
+
},
|
|
245
|
+
slugField
|
|
246
|
+
];
|
|
247
|
+
const { afterChange: revalidateAfterChange, afterDelete: revalidateAfterDelete } = createRevalidateCollectionHook({
|
|
248
|
+
collectionSlug,
|
|
249
|
+
urlPathPrefix: "",
|
|
250
|
+
localePrefix,
|
|
251
|
+
defaultLocale
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
slug: collectionSlug,
|
|
255
|
+
custom: { path: renderPath },
|
|
256
|
+
access: {
|
|
257
|
+
create: authenticated,
|
|
258
|
+
delete: authenticated,
|
|
259
|
+
read: authenticatedOrPublished,
|
|
260
|
+
update: authenticated
|
|
261
|
+
},
|
|
262
|
+
fields: baseFields,
|
|
263
|
+
hooks: {
|
|
264
|
+
afterChange: [revalidateAfterChange],
|
|
265
|
+
afterDelete: [revalidateAfterDelete]
|
|
266
|
+
},
|
|
267
|
+
versions: { drafts: { autosave: { interval: 1000 } } }
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
// src/data/collections/Posts/index.ts
|
|
272
|
+
var POSTS_SLUG2 = "posts";
|
|
273
|
+
var createPostsCollection = (options = {}) => {
|
|
274
|
+
const {
|
|
275
|
+
renderPath = POSTS_RENDER_PATH,
|
|
276
|
+
slug: collectionSlug = POSTS_SLUG2,
|
|
277
|
+
localePrefix,
|
|
278
|
+
defaultLocale
|
|
279
|
+
} = options;
|
|
280
|
+
const slugField = {
|
|
281
|
+
name: "slug",
|
|
282
|
+
type: "text",
|
|
283
|
+
required: true,
|
|
284
|
+
unique: true,
|
|
285
|
+
index: true,
|
|
286
|
+
admin: { position: "sidebar" }
|
|
287
|
+
};
|
|
288
|
+
const baseFields = [
|
|
289
|
+
{
|
|
290
|
+
name: "title",
|
|
291
|
+
type: "text",
|
|
292
|
+
required: true,
|
|
293
|
+
localized: true
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
name: "excerpt",
|
|
297
|
+
type: "text",
|
|
298
|
+
required: false,
|
|
299
|
+
localized: true
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
name: "content",
|
|
303
|
+
type: "richText",
|
|
304
|
+
required: false,
|
|
305
|
+
localized: true
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
name: "publishedAt",
|
|
309
|
+
type: "date",
|
|
310
|
+
admin: { position: "sidebar" }
|
|
311
|
+
},
|
|
312
|
+
slugField
|
|
313
|
+
];
|
|
314
|
+
const { afterChange, afterDelete } = createRevalidateCollectionHook({
|
|
315
|
+
collectionSlug,
|
|
316
|
+
urlPathPrefix: "/posts",
|
|
317
|
+
localePrefix,
|
|
318
|
+
defaultLocale
|
|
319
|
+
});
|
|
320
|
+
return {
|
|
321
|
+
slug: collectionSlug,
|
|
322
|
+
custom: { path: renderPath },
|
|
323
|
+
access: {
|
|
324
|
+
create: authenticated,
|
|
325
|
+
delete: authenticated,
|
|
326
|
+
read: authenticatedOrPublished,
|
|
327
|
+
update: authenticated
|
|
328
|
+
},
|
|
329
|
+
fields: baseFields,
|
|
330
|
+
hooks: {
|
|
331
|
+
afterChange: [afterChange],
|
|
332
|
+
afterDelete: [afterDelete]
|
|
333
|
+
},
|
|
334
|
+
versions: { drafts: { autosave: { interval: 1000 } } }
|
|
335
|
+
};
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// src/data/collections/StaticPages/index.ts
|
|
339
|
+
var createStaticPagesCollection = (blocks) => {
|
|
340
|
+
const { afterChange, afterDelete } = createRevalidateCollectionHook({
|
|
341
|
+
collectionSlug: STATIC_PAGES_SLUG,
|
|
342
|
+
pathMode: "tag-only",
|
|
343
|
+
sitemapTag: "static-pages"
|
|
344
|
+
});
|
|
345
|
+
return {
|
|
346
|
+
slug: STATIC_PAGES_SLUG,
|
|
347
|
+
dbName: "sp",
|
|
348
|
+
admin: { group: "System", useAsTitle: "title" },
|
|
349
|
+
access: {
|
|
350
|
+
create: authenticated,
|
|
351
|
+
delete: authenticated,
|
|
352
|
+
read: authenticatedOrPublished,
|
|
353
|
+
update: authenticated
|
|
354
|
+
},
|
|
355
|
+
fields: [
|
|
356
|
+
{
|
|
357
|
+
name: "kind",
|
|
358
|
+
type: "select",
|
|
359
|
+
required: true,
|
|
360
|
+
unique: true,
|
|
361
|
+
index: true,
|
|
362
|
+
options: [
|
|
363
|
+
{ label: "Not found (404)", value: "not-found" },
|
|
364
|
+
{ label: "Server error (500)", value: "server-error" },
|
|
365
|
+
{ label: "Search empty", value: "search-empty" },
|
|
366
|
+
{ label: "Offline", value: "offline" }
|
|
367
|
+
],
|
|
368
|
+
admin: {
|
|
369
|
+
position: "sidebar",
|
|
370
|
+
description: "Which system page this row powers. One row per kind."
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: "title",
|
|
375
|
+
type: "text",
|
|
376
|
+
required: true,
|
|
377
|
+
localized: true,
|
|
378
|
+
admin: { description: "Admin-only label. Not rendered." }
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
type: "tabs",
|
|
382
|
+
tabs: [
|
|
383
|
+
{
|
|
384
|
+
fields: [
|
|
385
|
+
{
|
|
386
|
+
name: "blocks",
|
|
387
|
+
type: "blocks",
|
|
388
|
+
localized: true,
|
|
389
|
+
blocks,
|
|
390
|
+
admin: { initCollapsed: true },
|
|
391
|
+
dbName: "b"
|
|
392
|
+
}
|
|
393
|
+
],
|
|
394
|
+
label: "Content"
|
|
395
|
+
}
|
|
396
|
+
]
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
name: "publishedAt",
|
|
400
|
+
type: "date",
|
|
401
|
+
admin: { position: "sidebar" }
|
|
402
|
+
}
|
|
403
|
+
],
|
|
404
|
+
hooks: {
|
|
405
|
+
afterChange: [afterChange],
|
|
406
|
+
afterDelete: [afterDelete]
|
|
407
|
+
},
|
|
408
|
+
versions: { drafts: { autosave: { interval: 1000 } } }
|
|
409
|
+
};
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
// src/core/fields/link.ts
|
|
413
|
+
var appearanceOptions = {
|
|
414
|
+
default: { label: "Default", value: "default" },
|
|
415
|
+
outline: { label: "Outline", value: "outline" }
|
|
416
|
+
};
|
|
417
|
+
var link = (options = {}) => {
|
|
418
|
+
const {
|
|
419
|
+
appearances,
|
|
420
|
+
disableLabel = false,
|
|
421
|
+
relationTo = [PAGES_SLUG],
|
|
422
|
+
localized = false,
|
|
423
|
+
overrides = {}
|
|
424
|
+
} = options;
|
|
425
|
+
const result = {
|
|
426
|
+
name: "link",
|
|
427
|
+
type: "group",
|
|
428
|
+
admin: { hideGutter: true },
|
|
429
|
+
fields: [
|
|
430
|
+
{
|
|
431
|
+
type: "row",
|
|
432
|
+
fields: [
|
|
433
|
+
{
|
|
434
|
+
name: "type",
|
|
435
|
+
type: "radio",
|
|
436
|
+
admin: { layout: "horizontal", width: "50%" },
|
|
437
|
+
defaultValue: "reference",
|
|
438
|
+
options: [
|
|
439
|
+
{ label: "Internal link", value: "reference" },
|
|
440
|
+
{ label: "Custom URL", value: "custom" }
|
|
441
|
+
]
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
name: "newTab",
|
|
445
|
+
type: "checkbox",
|
|
446
|
+
admin: { style: { alignSelf: "flex-end" }, width: "50%" },
|
|
447
|
+
label: "Open in new tab"
|
|
448
|
+
}
|
|
449
|
+
]
|
|
450
|
+
}
|
|
451
|
+
]
|
|
452
|
+
};
|
|
453
|
+
const linkTypes = [
|
|
454
|
+
{
|
|
455
|
+
name: "reference",
|
|
456
|
+
type: "relationship",
|
|
457
|
+
admin: { condition: (_, siblingData) => siblingData?.type === "reference" },
|
|
458
|
+
label: "Document to link to",
|
|
459
|
+
relationTo,
|
|
460
|
+
required: true,
|
|
461
|
+
localized
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
name: "url",
|
|
465
|
+
type: "text",
|
|
466
|
+
admin: { condition: (_, siblingData) => siblingData?.type === "custom" },
|
|
467
|
+
label: "Custom URL",
|
|
468
|
+
required: true,
|
|
469
|
+
localized
|
|
470
|
+
}
|
|
471
|
+
];
|
|
472
|
+
if (!disableLabel) {
|
|
473
|
+
result.fields.push({
|
|
474
|
+
type: "row",
|
|
475
|
+
fields: [
|
|
476
|
+
...linkTypes,
|
|
477
|
+
{
|
|
478
|
+
name: "label",
|
|
479
|
+
type: "text",
|
|
480
|
+
admin: { width: "50%" },
|
|
481
|
+
label: "Label",
|
|
482
|
+
required: true,
|
|
483
|
+
localized
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
});
|
|
487
|
+
} else {
|
|
488
|
+
result.fields = [...result.fields, ...linkTypes];
|
|
489
|
+
}
|
|
490
|
+
if (appearances !== false) {
|
|
491
|
+
const opts = appearances ? appearances.map((a) => appearanceOptions[a]) : [appearanceOptions.default, appearanceOptions.outline];
|
|
492
|
+
result.fields.push({
|
|
493
|
+
name: "appearance",
|
|
494
|
+
type: "select",
|
|
495
|
+
admin: { description: "Choose how the link should be rendered." },
|
|
496
|
+
defaultValue: "default",
|
|
497
|
+
options: opts
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
return { ...result, ...overrides };
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
// src/render/hooks/revalidateGlobal.ts
|
|
504
|
+
function createRevalidateGlobalHook(slug) {
|
|
505
|
+
return async ({ doc, req: { payload, context, locale } }) => {
|
|
506
|
+
if (shouldSkipRevalidate(context))
|
|
507
|
+
return doc;
|
|
508
|
+
const tags = [`global_${slug}`, `global_${slug}_${locale}`];
|
|
509
|
+
payload.logger.info?.(`Revalidating global: ${tags.join(", ")}`);
|
|
510
|
+
for (const tag of tags) {
|
|
511
|
+
await safeRevalidateTag(payload, tag);
|
|
512
|
+
}
|
|
513
|
+
return doc;
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// src/data/collections/globals/Header/config.ts
|
|
518
|
+
var createHeaderGlobal = (options = {}) => {
|
|
519
|
+
const { renderPath = HEADER_RENDER_PATH, linkRelationTo = [PAGES_SLUG] } = options;
|
|
520
|
+
const navColumnBlock = {
|
|
521
|
+
slug: "navColumn",
|
|
522
|
+
fields: [
|
|
523
|
+
{ name: "title", type: "text", required: true, localized: true },
|
|
524
|
+
{ name: "links", type: "array", fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })] }
|
|
525
|
+
]
|
|
526
|
+
};
|
|
527
|
+
const navItemBlock = {
|
|
528
|
+
slug: "navItem",
|
|
529
|
+
fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })]
|
|
530
|
+
};
|
|
531
|
+
return {
|
|
532
|
+
slug: "header",
|
|
533
|
+
custom: { path: renderPath },
|
|
534
|
+
access: { read: () => true },
|
|
535
|
+
fields: [
|
|
536
|
+
{
|
|
537
|
+
name: "nav",
|
|
538
|
+
type: "blocks",
|
|
539
|
+
required: true,
|
|
540
|
+
blocks: [navColumnBlock, navItemBlock]
|
|
541
|
+
}
|
|
542
|
+
],
|
|
543
|
+
hooks: {
|
|
544
|
+
afterChange: [createRevalidateGlobalHook("header")]
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
// src/data/collections/globals/Footer/config.ts
|
|
550
|
+
var createFooterGlobal = (options = {}) => {
|
|
551
|
+
const { renderPath = FOOTER_RENDER_PATH, linkRelationTo = [PAGES_SLUG] } = options;
|
|
552
|
+
const navColumnBlock = {
|
|
553
|
+
slug: "navColumn",
|
|
554
|
+
fields: [
|
|
555
|
+
{ name: "title", type: "text", required: true, localized: true },
|
|
556
|
+
{ name: "links", type: "array", fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })] }
|
|
557
|
+
]
|
|
558
|
+
};
|
|
559
|
+
const navItemBlock = {
|
|
560
|
+
slug: "navItem",
|
|
561
|
+
fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })]
|
|
562
|
+
};
|
|
563
|
+
return {
|
|
564
|
+
slug: "footer",
|
|
565
|
+
custom: { path: renderPath },
|
|
566
|
+
access: { read: () => true },
|
|
567
|
+
fields: [
|
|
568
|
+
{
|
|
569
|
+
name: "nav",
|
|
570
|
+
type: "blocks",
|
|
571
|
+
required: true,
|
|
572
|
+
blocks: [navColumnBlock, navItemBlock]
|
|
573
|
+
}
|
|
574
|
+
],
|
|
575
|
+
hooks: {
|
|
576
|
+
afterChange: [createRevalidateGlobalHook("footer")]
|
|
577
|
+
}
|
|
578
|
+
};
|
|
579
|
+
};
|
|
580
|
+
|
|
581
|
+
// src/data/collections/previewPath.ts
|
|
582
|
+
var collectionPrefixMap = {
|
|
583
|
+
posts: "/posts",
|
|
584
|
+
pages: ""
|
|
585
|
+
};
|
|
586
|
+
function generatePreviewPath({
|
|
587
|
+
collection,
|
|
588
|
+
slug
|
|
589
|
+
}) {
|
|
590
|
+
if (slug === undefined || slug === null)
|
|
591
|
+
return null;
|
|
592
|
+
const encodedSlug = encodeURIComponent(slug);
|
|
593
|
+
const params = new URLSearchParams({
|
|
594
|
+
path: `${collectionPrefixMap[collection] ?? ""}/${encodedSlug}`,
|
|
595
|
+
previewSecret: process.env.PREVIEW_SECRET || ""
|
|
596
|
+
});
|
|
597
|
+
return `/next/preview?${params.toString()}`;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// src/exports/collections.ts
|
|
601
|
+
var collections_default = {
|
|
602
|
+
createPagesCollection,
|
|
603
|
+
createPostsCollection,
|
|
604
|
+
createStaticPagesCollection,
|
|
605
|
+
createHeaderGlobal,
|
|
606
|
+
createFooterGlobal,
|
|
607
|
+
generatePreviewPath,
|
|
608
|
+
HOME_PAGE_SLUG,
|
|
609
|
+
PAGES_SLUG: PAGES_SLUG2,
|
|
610
|
+
POSTS_SLUG: POSTS_SLUG2,
|
|
611
|
+
STATIC_PAGES_SLUG
|
|
612
|
+
};
|
|
613
|
+
export {
|
|
614
|
+
generatePreviewPath,
|
|
615
|
+
collections_default as default,
|
|
616
|
+
createStaticPagesCollection,
|
|
617
|
+
createPostsCollection,
|
|
618
|
+
createPagesCollection,
|
|
619
|
+
createHeaderGlobal,
|
|
620
|
+
createFooterGlobal,
|
|
621
|
+
STATIC_PAGES_SLUG,
|
|
622
|
+
POSTS_SLUG2 as POSTS_SLUG,
|
|
623
|
+
PAGES_SLUG2 as PAGES_SLUG,
|
|
624
|
+
HOME_PAGE_SLUG
|
|
625
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __returnValue = (v) => v;
|
|
5
|
+
function __exportSetter(name, newValue) {
|
|
6
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
7
|
+
}
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, {
|
|
11
|
+
get: all[name],
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
set: __exportSetter.bind(all, name)
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
18
|
+
|
|
19
|
+
// src/render/components/LivePreviewListener.tsx
|
|
20
|
+
import { RefreshRouteOnSave as PayloadLivePreview } from "@payloadcms/live-preview-react";
|
|
21
|
+
import { useRouter } from "next/navigation";
|
|
22
|
+
import { jsx } from "react/jsx-runtime";
|
|
23
|
+
|
|
24
|
+
var LivePreviewListener = ({ serverURL }) => {
|
|
25
|
+
const router = useRouter();
|
|
26
|
+
const url = serverURL ?? process.env.NEXT_PUBLIC_SERVER_URL ?? (typeof window !== "undefined" ? window.location.origin : "");
|
|
27
|
+
return /* @__PURE__ */ jsx(PayloadLivePreview, {
|
|
28
|
+
refresh: router.refresh,
|
|
29
|
+
serverURL: url
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/exports/components.ts
|
|
34
|
+
var components_default = LivePreviewListener;
|
|
35
|
+
export {
|
|
36
|
+
components_default as default,
|
|
37
|
+
LivePreviewListener
|
|
38
|
+
};
|