@delmaredigital/payload-puck 0.1.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.
- package/LICENSE +73 -0
- package/README.md +1580 -0
- package/dist/AccordionClient.d.mts +24 -0
- package/dist/AccordionClient.d.ts +24 -0
- package/dist/AccordionClient.js +786 -0
- package/dist/AccordionClient.js.map +1 -0
- package/dist/AccordionClient.mjs +784 -0
- package/dist/AccordionClient.mjs.map +1 -0
- package/dist/AnimatedWrapper.d.mts +30 -0
- package/dist/AnimatedWrapper.d.ts +30 -0
- package/dist/AnimatedWrapper.js +379 -0
- package/dist/AnimatedWrapper.js.map +1 -0
- package/dist/AnimatedWrapper.mjs +377 -0
- package/dist/AnimatedWrapper.mjs.map +1 -0
- package/dist/admin/client.d.mts +108 -0
- package/dist/admin/client.d.ts +108 -0
- package/dist/admin/client.js +177 -0
- package/dist/admin/client.js.map +1 -0
- package/dist/admin/client.mjs +173 -0
- package/dist/admin/client.mjs.map +1 -0
- package/dist/admin/index.d.mts +157 -0
- package/dist/admin/index.d.ts +157 -0
- package/dist/admin/index.js +31 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/index.mjs +29 -0
- package/dist/admin/index.mjs.map +1 -0
- package/dist/api/index.d.mts +460 -0
- package/dist/api/index.d.ts +460 -0
- package/dist/api/index.js +588 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +578 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/components/index.css +339 -0
- package/dist/components/index.css.map +1 -0
- package/dist/components/index.d.mts +222 -0
- package/dist/components/index.d.ts +222 -0
- package/dist/components/index.js +9177 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +9130 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/config.editor.css +339 -0
- package/dist/config/config.editor.css.map +1 -0
- package/dist/config/config.editor.d.mts +153 -0
- package/dist/config/config.editor.d.ts +153 -0
- package/dist/config/config.editor.js +9400 -0
- package/dist/config/config.editor.js.map +1 -0
- package/dist/config/config.editor.mjs +9368 -0
- package/dist/config/config.editor.mjs.map +1 -0
- package/dist/config/index.d.mts +68 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.js +2017 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +1991 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/editor/index.d.mts +784 -0
- package/dist/editor/index.d.ts +784 -0
- package/dist/editor/index.js +4517 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/editor/index.mjs +4483 -0
- package/dist/editor/index.mjs.map +1 -0
- package/dist/fields/index.css +339 -0
- package/dist/fields/index.css.map +1 -0
- package/dist/fields/index.d.mts +600 -0
- package/dist/fields/index.d.ts +600 -0
- package/dist/fields/index.js +7739 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +7590 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/index-CQu6SzDg.d.mts +327 -0
- package/dist/index-CoUQnyC3.d.ts +327 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +569 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +555 -0
- package/dist/index.mjs.map +1 -0
- package/dist/layouts/index.d.mts +96 -0
- package/dist/layouts/index.d.ts +96 -0
- package/dist/layouts/index.js +394 -0
- package/dist/layouts/index.js.map +1 -0
- package/dist/layouts/index.mjs +378 -0
- package/dist/layouts/index.mjs.map +1 -0
- package/dist/plugin/index.d.mts +289 -0
- package/dist/plugin/index.d.ts +289 -0
- package/dist/plugin/index.js +569 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/index.mjs +555 -0
- package/dist/plugin/index.mjs.map +1 -0
- package/dist/render/index.d.mts +109 -0
- package/dist/render/index.d.ts +109 -0
- package/dist/render/index.js +2146 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/index.mjs +2123 -0
- package/dist/render/index.mjs.map +1 -0
- package/dist/shared-DMAF1AcH.d.mts +545 -0
- package/dist/shared-DMAF1AcH.d.ts +545 -0
- package/dist/theme/index.d.mts +155 -0
- package/dist/theme/index.d.ts +155 -0
- package/dist/theme/index.js +201 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +186 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/types-D7D3rZ1J.d.mts +116 -0
- package/dist/types-D7D3rZ1J.d.ts +116 -0
- package/dist/types-_6MvjyKv.d.mts +104 -0
- package/dist/types-_6MvjyKv.d.ts +104 -0
- package/dist/utils/index.d.mts +267 -0
- package/dist/utils/index.d.ts +267 -0
- package/dist/utils/index.js +426 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +412 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils-DaRs9t0J.d.mts +85 -0
- package/dist/utils-gAvt0Vhw.d.ts +85 -0
- package/examples/README.md +240 -0
- package/examples/api/puck/pages/[id]/route.ts +64 -0
- package/examples/api/puck/pages/[id]/versions/route.ts +47 -0
- package/examples/api/puck/pages/route.ts +45 -0
- package/examples/app/(frontend)/page.tsx +94 -0
- package/examples/app/[...slug]/page.tsx +101 -0
- package/examples/app/pages/[id]/edit/page.tsx +148 -0
- package/examples/components/CustomBanner.tsx +368 -0
- package/examples/config/custom-config.ts +223 -0
- package/examples/config/payload.config.example.ts +64 -0
- package/examples/lib/puck-layouts.ts +258 -0
- package/examples/lib/puck-theme.ts +94 -0
- package/examples/styles/puck-theme.css +171 -0
- package/package.json +157 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('next/server');
|
|
4
|
+
var payload = require('payload');
|
|
5
|
+
|
|
6
|
+
// src/api/createPuckApiRoutes.ts
|
|
7
|
+
var DEFAULT_PUCK_DATA = {
|
|
8
|
+
root: {
|
|
9
|
+
props: {
|
|
10
|
+
title: ""
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
content: [],
|
|
14
|
+
zones: {}
|
|
15
|
+
};
|
|
16
|
+
function createPuckApiRoutes(routeConfig) {
|
|
17
|
+
const {
|
|
18
|
+
collection = "pages",
|
|
19
|
+
payloadConfig,
|
|
20
|
+
auth,
|
|
21
|
+
defaultPuckData = DEFAULT_PUCK_DATA,
|
|
22
|
+
enableDrafts = true,
|
|
23
|
+
onError
|
|
24
|
+
} = routeConfig;
|
|
25
|
+
async function GET(request, _context) {
|
|
26
|
+
try {
|
|
27
|
+
const authResult = await auth.authenticate(request);
|
|
28
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
29
|
+
return server.NextResponse.json(
|
|
30
|
+
{ error: authResult.error || "Unauthorized" },
|
|
31
|
+
{ status: 401 }
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
if (auth.canList) {
|
|
35
|
+
const permission = await auth.canList(authResult.user);
|
|
36
|
+
if (!permission.allowed) {
|
|
37
|
+
return server.NextResponse.json(
|
|
38
|
+
{ error: permission.error || "Forbidden" },
|
|
39
|
+
{ status: 403 }
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const { searchParams } = new URL(request.url);
|
|
44
|
+
const page = parseInt(searchParams.get("page") || "1", 10);
|
|
45
|
+
const limit = Math.min(parseInt(searchParams.get("limit") || "10", 10), 100);
|
|
46
|
+
const search = searchParams.get("search") || "";
|
|
47
|
+
const status = searchParams.get("status");
|
|
48
|
+
const editorVersion = searchParams.get("editorVersion");
|
|
49
|
+
const sort = searchParams.get("sort") || "-updatedAt";
|
|
50
|
+
const config = await payloadConfig;
|
|
51
|
+
const payload$1 = await payload.getPayload({ config });
|
|
52
|
+
const conditions = [];
|
|
53
|
+
if (search) {
|
|
54
|
+
conditions.push({ title: { contains: search } });
|
|
55
|
+
}
|
|
56
|
+
if (status && status !== "all") {
|
|
57
|
+
conditions.push({ _status: { equals: status } });
|
|
58
|
+
}
|
|
59
|
+
if (editorVersion && editorVersion !== "all") {
|
|
60
|
+
conditions.push({ editorVersion: { equals: editorVersion } });
|
|
61
|
+
}
|
|
62
|
+
const where = conditions.length > 0 ? conditions.length === 1 ? conditions[0] : { and: conditions } : void 0;
|
|
63
|
+
const result = await payload$1.find({
|
|
64
|
+
collection,
|
|
65
|
+
page,
|
|
66
|
+
limit,
|
|
67
|
+
sort,
|
|
68
|
+
where
|
|
69
|
+
});
|
|
70
|
+
return server.NextResponse.json(result);
|
|
71
|
+
} catch (error) {
|
|
72
|
+
if (onError) {
|
|
73
|
+
onError(error, { operation: "list", request });
|
|
74
|
+
}
|
|
75
|
+
console.error("Error listing pages:", error);
|
|
76
|
+
return server.NextResponse.json(
|
|
77
|
+
{ error: "Failed to list pages" },
|
|
78
|
+
{ status: 500 }
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function POST(request, _context) {
|
|
83
|
+
try {
|
|
84
|
+
const authResult = await auth.authenticate(request);
|
|
85
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
86
|
+
return server.NextResponse.json(
|
|
87
|
+
{ error: authResult.error || "Unauthorized" },
|
|
88
|
+
{ status: 401 }
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
if (auth.canCreate) {
|
|
92
|
+
const permission = await auth.canCreate(authResult.user);
|
|
93
|
+
if (!permission.allowed) {
|
|
94
|
+
return server.NextResponse.json(
|
|
95
|
+
{ error: permission.error || "Forbidden" },
|
|
96
|
+
{ status: 403 }
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const body = await request.json();
|
|
101
|
+
const { title, slug, puckData, status = "draft" } = body;
|
|
102
|
+
if (!title || !slug) {
|
|
103
|
+
return server.NextResponse.json(
|
|
104
|
+
{ error: "Title and slug are required" },
|
|
105
|
+
{ status: 400 }
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
const config = await payloadConfig;
|
|
109
|
+
const payload$1 = await payload.getPayload({ config });
|
|
110
|
+
const existing = await payload$1.find({
|
|
111
|
+
collection,
|
|
112
|
+
where: { slug: { equals: slug } },
|
|
113
|
+
limit: 1
|
|
114
|
+
});
|
|
115
|
+
if (existing.docs.length > 0) {
|
|
116
|
+
return server.NextResponse.json(
|
|
117
|
+
{ error: "A page with this slug already exists" },
|
|
118
|
+
{ status: 409 }
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const initialPuckData = puckData || {
|
|
122
|
+
...defaultPuckData,
|
|
123
|
+
root: {
|
|
124
|
+
...defaultPuckData.root,
|
|
125
|
+
props: {
|
|
126
|
+
...defaultPuckData.root?.props,
|
|
127
|
+
title
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const newPage = await payload$1.create({
|
|
132
|
+
collection,
|
|
133
|
+
draft: enableDrafts,
|
|
134
|
+
data: {
|
|
135
|
+
title,
|
|
136
|
+
slug,
|
|
137
|
+
editorVersion: "puck",
|
|
138
|
+
puckData: initialPuckData,
|
|
139
|
+
_status: status
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return server.NextResponse.json({ doc: newPage }, { status: 201 });
|
|
143
|
+
} catch (error) {
|
|
144
|
+
if (onError) {
|
|
145
|
+
onError(error, { operation: "create", request });
|
|
146
|
+
}
|
|
147
|
+
console.error("Error creating page:", error);
|
|
148
|
+
return server.NextResponse.json(
|
|
149
|
+
{ error: "Failed to create page" },
|
|
150
|
+
{ status: 500 }
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { GET, POST };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/api/utils/mapRootProps.ts
|
|
158
|
+
var DEFAULT_ROOT_PROPS_MAPPINGS = [
|
|
159
|
+
// Core page fields
|
|
160
|
+
{ from: "title", to: "title" },
|
|
161
|
+
{ from: "slug", to: "slug" },
|
|
162
|
+
{ from: "pageLayout", to: "pageLayout" },
|
|
163
|
+
{ from: "pageType", to: "pageType" },
|
|
164
|
+
{ from: "isHomepage", to: "isHomepage" },
|
|
165
|
+
// SEO/Meta fields (uses official @payloadcms/plugin-seo convention)
|
|
166
|
+
{ from: "metaTitle", to: "meta.title" },
|
|
167
|
+
{ from: "metaDescription", to: "meta.description" },
|
|
168
|
+
{ from: "noindex", to: "meta.noindex" },
|
|
169
|
+
{ from: "nofollow", to: "meta.nofollow" },
|
|
170
|
+
{ from: "excludeFromSitemap", to: "meta.excludeFromSitemap" },
|
|
171
|
+
// Conversion tracking fields
|
|
172
|
+
{ from: "isConversionPage", to: "conversionTracking.isConversionPage" },
|
|
173
|
+
{ from: "conversionType", to: "conversionTracking.conversionType" },
|
|
174
|
+
{ from: "conversionValue", to: "conversionTracking.conversionValue" }
|
|
175
|
+
];
|
|
176
|
+
function setNestedValue(obj, path, value) {
|
|
177
|
+
const keys = path.split(".");
|
|
178
|
+
let current = obj;
|
|
179
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
180
|
+
const key = keys[i];
|
|
181
|
+
if (!(key in current) || typeof current[key] !== "object") {
|
|
182
|
+
current[key] = {};
|
|
183
|
+
}
|
|
184
|
+
current = current[key];
|
|
185
|
+
}
|
|
186
|
+
const finalKey = keys[keys.length - 1];
|
|
187
|
+
current[finalKey] = value;
|
|
188
|
+
}
|
|
189
|
+
function getNestedValue(obj, path) {
|
|
190
|
+
const keys = path.split(".");
|
|
191
|
+
let current = obj;
|
|
192
|
+
for (const key of keys) {
|
|
193
|
+
if (current === null || current === void 0) {
|
|
194
|
+
return void 0;
|
|
195
|
+
}
|
|
196
|
+
if (typeof current !== "object") {
|
|
197
|
+
return void 0;
|
|
198
|
+
}
|
|
199
|
+
current = current[key];
|
|
200
|
+
}
|
|
201
|
+
return current;
|
|
202
|
+
}
|
|
203
|
+
function mergeMappings(customMappings) {
|
|
204
|
+
if (!customMappings || customMappings.length === 0) {
|
|
205
|
+
return DEFAULT_ROOT_PROPS_MAPPINGS;
|
|
206
|
+
}
|
|
207
|
+
const mappingMap = /* @__PURE__ */ new Map();
|
|
208
|
+
for (const mapping of DEFAULT_ROOT_PROPS_MAPPINGS) {
|
|
209
|
+
mappingMap.set(mapping.from, mapping);
|
|
210
|
+
}
|
|
211
|
+
for (const mapping of customMappings) {
|
|
212
|
+
mappingMap.set(mapping.from, mapping);
|
|
213
|
+
}
|
|
214
|
+
return Array.from(mappingMap.values());
|
|
215
|
+
}
|
|
216
|
+
function mapRootPropsToPayloadFields(rootProps, customMappings) {
|
|
217
|
+
const mappings = mergeMappings(customMappings);
|
|
218
|
+
const result = {};
|
|
219
|
+
for (const mapping of mappings) {
|
|
220
|
+
const value = rootProps[mapping.from];
|
|
221
|
+
if (value === void 0) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const transformedValue = mapping.transform ? mapping.transform(value) : value;
|
|
225
|
+
setNestedValue(result, mapping.to, transformedValue);
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
function deepMerge(target, source) {
|
|
230
|
+
for (const key of Object.keys(source)) {
|
|
231
|
+
const sourceValue = source[key];
|
|
232
|
+
const targetValue = target[key];
|
|
233
|
+
if (sourceValue !== null && typeof sourceValue === "object" && !Array.isArray(sourceValue) && targetValue !== null && typeof targetValue === "object" && !Array.isArray(targetValue)) {
|
|
234
|
+
target[key] = deepMerge(
|
|
235
|
+
targetValue,
|
|
236
|
+
sourceValue
|
|
237
|
+
);
|
|
238
|
+
} else {
|
|
239
|
+
target[key] = sourceValue;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return target;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// src/api/createPuckApiRoutesWithId.ts
|
|
246
|
+
function createPuckApiRoutesWithId(routeConfig) {
|
|
247
|
+
const {
|
|
248
|
+
collection = "pages",
|
|
249
|
+
payloadConfig,
|
|
250
|
+
auth,
|
|
251
|
+
rootPropsMapping,
|
|
252
|
+
onError
|
|
253
|
+
} = routeConfig;
|
|
254
|
+
async function GET(request, context) {
|
|
255
|
+
try {
|
|
256
|
+
const params = await context.params;
|
|
257
|
+
const id = params.id;
|
|
258
|
+
if (!id) {
|
|
259
|
+
return server.NextResponse.json(
|
|
260
|
+
{ error: "Page ID is required" },
|
|
261
|
+
{ status: 400 }
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
const authResult = await auth.authenticate(request);
|
|
265
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
266
|
+
return server.NextResponse.json(
|
|
267
|
+
{ error: authResult.error || "Unauthorized" },
|
|
268
|
+
{ status: 401 }
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
if (auth.canView) {
|
|
272
|
+
const permission = await auth.canView(authResult.user, id);
|
|
273
|
+
if (!permission.allowed) {
|
|
274
|
+
return server.NextResponse.json(
|
|
275
|
+
{ error: permission.error || "Forbidden" },
|
|
276
|
+
{ status: 403 }
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const config = await payloadConfig;
|
|
281
|
+
const payload$1 = await payload.getPayload({ config });
|
|
282
|
+
const url = new URL(request.url);
|
|
283
|
+
const wantsDraft = url.searchParams.get("draft") !== "false";
|
|
284
|
+
const page = await payload$1.findByID({
|
|
285
|
+
collection,
|
|
286
|
+
id,
|
|
287
|
+
draft: wantsDraft
|
|
288
|
+
// Load draft version by default for editing
|
|
289
|
+
});
|
|
290
|
+
if (!page) {
|
|
291
|
+
return server.NextResponse.json({ error: "Page not found" }, { status: 404 });
|
|
292
|
+
}
|
|
293
|
+
return server.NextResponse.json({ doc: page });
|
|
294
|
+
} catch (error) {
|
|
295
|
+
const params = await context.params;
|
|
296
|
+
if (onError) {
|
|
297
|
+
onError(error, { operation: "read", request, pageId: params.id });
|
|
298
|
+
}
|
|
299
|
+
console.error("Error fetching page:", error);
|
|
300
|
+
return server.NextResponse.json(
|
|
301
|
+
{ error: "Failed to fetch page" },
|
|
302
|
+
{ status: 500 }
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async function PATCH(request, context) {
|
|
307
|
+
try {
|
|
308
|
+
const params = await context.params;
|
|
309
|
+
const id = params.id;
|
|
310
|
+
if (!id) {
|
|
311
|
+
return server.NextResponse.json(
|
|
312
|
+
{ error: "Page ID is required" },
|
|
313
|
+
{ status: 400 }
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
const authResult = await auth.authenticate(request);
|
|
317
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
318
|
+
return server.NextResponse.json(
|
|
319
|
+
{ error: authResult.error || "Unauthorized" },
|
|
320
|
+
{ status: 401 }
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
if (auth.canEdit) {
|
|
324
|
+
const permission = await auth.canEdit(authResult.user, id);
|
|
325
|
+
if (!permission.allowed) {
|
|
326
|
+
return server.NextResponse.json(
|
|
327
|
+
{ error: permission.error || "Forbidden" },
|
|
328
|
+
{ status: 403 }
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const body = await request.json();
|
|
333
|
+
const { puckData, title, slug, status, draft } = body;
|
|
334
|
+
if (status === "published") {
|
|
335
|
+
const canPublish = auth.canPublish || auth.canEdit;
|
|
336
|
+
if (canPublish) {
|
|
337
|
+
const permission = await canPublish(authResult.user, id);
|
|
338
|
+
if (!permission.allowed) {
|
|
339
|
+
return server.NextResponse.json(
|
|
340
|
+
{ error: permission.error || "Not authorized to publish pages" },
|
|
341
|
+
{ status: 403 }
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const config = await payloadConfig;
|
|
347
|
+
const payload$1 = await payload.getPayload({ config });
|
|
348
|
+
const rootProps = puckData?.root?.props || {};
|
|
349
|
+
const updateData = {
|
|
350
|
+
editorVersion: "puck"
|
|
351
|
+
};
|
|
352
|
+
if (puckData) {
|
|
353
|
+
updateData.puckData = puckData;
|
|
354
|
+
}
|
|
355
|
+
const mappedFields = mapRootPropsToPayloadFields(rootProps, rootPropsMapping);
|
|
356
|
+
deepMerge(updateData, mappedFields);
|
|
357
|
+
if (title !== void 0) {
|
|
358
|
+
updateData.title = title;
|
|
359
|
+
}
|
|
360
|
+
if (slug !== void 0) {
|
|
361
|
+
updateData.slug = slug;
|
|
362
|
+
}
|
|
363
|
+
if (status) {
|
|
364
|
+
updateData._status = status;
|
|
365
|
+
}
|
|
366
|
+
const updatedPage = await payload$1.update({
|
|
367
|
+
collection,
|
|
368
|
+
id,
|
|
369
|
+
data: updateData,
|
|
370
|
+
draft: draft === true
|
|
371
|
+
});
|
|
372
|
+
return server.NextResponse.json({ doc: updatedPage });
|
|
373
|
+
} catch (error) {
|
|
374
|
+
const params = await context.params;
|
|
375
|
+
if (onError) {
|
|
376
|
+
onError(error, { operation: "update", request, pageId: params.id });
|
|
377
|
+
}
|
|
378
|
+
console.error("Error updating page:", error);
|
|
379
|
+
if (error instanceof Error && error.name === "ValidationError") {
|
|
380
|
+
const validationError = error;
|
|
381
|
+
const fieldErrors = validationError.data?.errors || [];
|
|
382
|
+
const slugError = fieldErrors.find((e) => e.field === "slug");
|
|
383
|
+
if (slugError) {
|
|
384
|
+
return server.NextResponse.json(
|
|
385
|
+
{
|
|
386
|
+
error: "A page with this slug already exists. Please choose a different slug.",
|
|
387
|
+
field: "slug",
|
|
388
|
+
details: fieldErrors
|
|
389
|
+
},
|
|
390
|
+
{ status: 400 }
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
return server.NextResponse.json(
|
|
394
|
+
{
|
|
395
|
+
error: `Validation failed: ${fieldErrors.map((e) => e.message || e.field).join(", ")}`,
|
|
396
|
+
details: fieldErrors
|
|
397
|
+
},
|
|
398
|
+
{ status: 400 }
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
return server.NextResponse.json(
|
|
402
|
+
{ error: "Failed to update page" },
|
|
403
|
+
{ status: 500 }
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
async function DELETE(request, context) {
|
|
408
|
+
try {
|
|
409
|
+
const params = await context.params;
|
|
410
|
+
const id = params.id;
|
|
411
|
+
if (!id) {
|
|
412
|
+
return server.NextResponse.json(
|
|
413
|
+
{ error: "Page ID is required" },
|
|
414
|
+
{ status: 400 }
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
const authResult = await auth.authenticate(request);
|
|
418
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
419
|
+
return server.NextResponse.json(
|
|
420
|
+
{ error: authResult.error || "Unauthorized" },
|
|
421
|
+
{ status: 401 }
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
if (auth.canDelete) {
|
|
425
|
+
const permission = await auth.canDelete(authResult.user, id);
|
|
426
|
+
if (!permission.allowed) {
|
|
427
|
+
return server.NextResponse.json(
|
|
428
|
+
{ error: permission.error || "Forbidden" },
|
|
429
|
+
{ status: 403 }
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
const config = await payloadConfig;
|
|
434
|
+
const payload$1 = await payload.getPayload({ config });
|
|
435
|
+
await payload$1.delete({
|
|
436
|
+
collection,
|
|
437
|
+
id
|
|
438
|
+
});
|
|
439
|
+
return server.NextResponse.json({ success: true });
|
|
440
|
+
} catch (error) {
|
|
441
|
+
const params = await context.params;
|
|
442
|
+
if (onError) {
|
|
443
|
+
onError(error, { operation: "delete", request, pageId: params.id });
|
|
444
|
+
}
|
|
445
|
+
console.error("Error deleting page:", error);
|
|
446
|
+
return server.NextResponse.json(
|
|
447
|
+
{ error: "Failed to delete page" },
|
|
448
|
+
{ status: 500 }
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return { GET, PATCH, DELETE };
|
|
453
|
+
}
|
|
454
|
+
function createPuckApiRoutesVersions(routeConfig) {
|
|
455
|
+
const {
|
|
456
|
+
collection = "pages",
|
|
457
|
+
payloadConfig,
|
|
458
|
+
auth,
|
|
459
|
+
onError
|
|
460
|
+
} = routeConfig;
|
|
461
|
+
async function GET(request, context) {
|
|
462
|
+
try {
|
|
463
|
+
const params = await context.params;
|
|
464
|
+
const id = params.id;
|
|
465
|
+
if (!id) {
|
|
466
|
+
return server.NextResponse.json(
|
|
467
|
+
{ error: "Page ID is required" },
|
|
468
|
+
{ status: 400 }
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
const authResult = await auth.authenticate(request);
|
|
472
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
473
|
+
return server.NextResponse.json(
|
|
474
|
+
{ error: authResult.error || "Unauthorized" },
|
|
475
|
+
{ status: 401 }
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
if (auth.canView) {
|
|
479
|
+
const permission = await auth.canView(authResult.user, id);
|
|
480
|
+
if (!permission.allowed) {
|
|
481
|
+
return server.NextResponse.json(
|
|
482
|
+
{ error: permission.error || "Forbidden" },
|
|
483
|
+
{ status: 403 }
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
const config = await payloadConfig;
|
|
488
|
+
const payload$1 = await payload.getPayload({ config });
|
|
489
|
+
const url = new URL(request.url);
|
|
490
|
+
const limit = parseInt(url.searchParams.get("limit") || "20", 10);
|
|
491
|
+
const page = parseInt(url.searchParams.get("page") || "1", 10);
|
|
492
|
+
const versions = await payload$1.findVersions({
|
|
493
|
+
collection,
|
|
494
|
+
where: {
|
|
495
|
+
parent: { equals: id }
|
|
496
|
+
},
|
|
497
|
+
sort: "-updatedAt",
|
|
498
|
+
limit,
|
|
499
|
+
page
|
|
500
|
+
});
|
|
501
|
+
return server.NextResponse.json({
|
|
502
|
+
docs: versions.docs,
|
|
503
|
+
totalDocs: versions.totalDocs,
|
|
504
|
+
totalPages: versions.totalPages,
|
|
505
|
+
page: versions.page,
|
|
506
|
+
limit: versions.limit,
|
|
507
|
+
hasPrevPage: versions.hasPrevPage,
|
|
508
|
+
hasNextPage: versions.hasNextPage
|
|
509
|
+
});
|
|
510
|
+
} catch (error) {
|
|
511
|
+
const params = await context.params;
|
|
512
|
+
if (onError) {
|
|
513
|
+
onError(error, { operation: "listVersions", request, pageId: params.id });
|
|
514
|
+
}
|
|
515
|
+
console.error("Error fetching versions:", error);
|
|
516
|
+
return server.NextResponse.json(
|
|
517
|
+
{ error: "Failed to fetch versions" },
|
|
518
|
+
{ status: 500 }
|
|
519
|
+
);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
async function POST(request, context) {
|
|
523
|
+
try {
|
|
524
|
+
const params = await context.params;
|
|
525
|
+
const id = params.id;
|
|
526
|
+
if (!id) {
|
|
527
|
+
return server.NextResponse.json(
|
|
528
|
+
{ error: "Page ID is required" },
|
|
529
|
+
{ status: 400 }
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
const authResult = await auth.authenticate(request);
|
|
533
|
+
if (!authResult.authenticated || !authResult.user) {
|
|
534
|
+
return server.NextResponse.json(
|
|
535
|
+
{ error: authResult.error || "Unauthorized" },
|
|
536
|
+
{ status: 401 }
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
if (auth.canEdit) {
|
|
540
|
+
const permission = await auth.canEdit(authResult.user, id);
|
|
541
|
+
if (!permission.allowed) {
|
|
542
|
+
return server.NextResponse.json(
|
|
543
|
+
{ error: permission.error || "Forbidden" },
|
|
544
|
+
{ status: 403 }
|
|
545
|
+
);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
const body = await request.json();
|
|
549
|
+
const { versionId } = body;
|
|
550
|
+
if (!versionId) {
|
|
551
|
+
return server.NextResponse.json(
|
|
552
|
+
{ error: "Version ID is required" },
|
|
553
|
+
{ status: 400 }
|
|
554
|
+
);
|
|
555
|
+
}
|
|
556
|
+
const config = await payloadConfig;
|
|
557
|
+
const payload$1 = await payload.getPayload({ config });
|
|
558
|
+
const restoredDoc = await payload$1.restoreVersion({
|
|
559
|
+
collection,
|
|
560
|
+
id: versionId
|
|
561
|
+
});
|
|
562
|
+
return server.NextResponse.json({ doc: restoredDoc });
|
|
563
|
+
} catch (error) {
|
|
564
|
+
const params = await context.params;
|
|
565
|
+
if (onError) {
|
|
566
|
+
onError(error, { operation: "restoreVersion", request, pageId: params.id });
|
|
567
|
+
}
|
|
568
|
+
console.error("Error restoring version:", error);
|
|
569
|
+
return server.NextResponse.json(
|
|
570
|
+
{ error: "Failed to restore version" },
|
|
571
|
+
{ status: 500 }
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return { GET, POST };
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
exports.DEFAULT_ROOT_PROPS_MAPPINGS = DEFAULT_ROOT_PROPS_MAPPINGS;
|
|
579
|
+
exports.createPuckApiRoutes = createPuckApiRoutes;
|
|
580
|
+
exports.createPuckApiRoutesVersions = createPuckApiRoutesVersions;
|
|
581
|
+
exports.createPuckApiRoutesWithId = createPuckApiRoutesWithId;
|
|
582
|
+
exports.deepMerge = deepMerge;
|
|
583
|
+
exports.getNestedValue = getNestedValue;
|
|
584
|
+
exports.mapRootPropsToPayloadFields = mapRootPropsToPayloadFields;
|
|
585
|
+
exports.mergeMappings = mergeMappings;
|
|
586
|
+
exports.setNestedValue = setNestedValue;
|
|
587
|
+
//# sourceMappingURL=index.js.map
|
|
588
|
+
//# sourceMappingURL=index.js.map
|