@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.
Files changed (128) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +1580 -0
  3. package/dist/AccordionClient.d.mts +24 -0
  4. package/dist/AccordionClient.d.ts +24 -0
  5. package/dist/AccordionClient.js +786 -0
  6. package/dist/AccordionClient.js.map +1 -0
  7. package/dist/AccordionClient.mjs +784 -0
  8. package/dist/AccordionClient.mjs.map +1 -0
  9. package/dist/AnimatedWrapper.d.mts +30 -0
  10. package/dist/AnimatedWrapper.d.ts +30 -0
  11. package/dist/AnimatedWrapper.js +379 -0
  12. package/dist/AnimatedWrapper.js.map +1 -0
  13. package/dist/AnimatedWrapper.mjs +377 -0
  14. package/dist/AnimatedWrapper.mjs.map +1 -0
  15. package/dist/admin/client.d.mts +108 -0
  16. package/dist/admin/client.d.ts +108 -0
  17. package/dist/admin/client.js +177 -0
  18. package/dist/admin/client.js.map +1 -0
  19. package/dist/admin/client.mjs +173 -0
  20. package/dist/admin/client.mjs.map +1 -0
  21. package/dist/admin/index.d.mts +157 -0
  22. package/dist/admin/index.d.ts +157 -0
  23. package/dist/admin/index.js +31 -0
  24. package/dist/admin/index.js.map +1 -0
  25. package/dist/admin/index.mjs +29 -0
  26. package/dist/admin/index.mjs.map +1 -0
  27. package/dist/api/index.d.mts +460 -0
  28. package/dist/api/index.d.ts +460 -0
  29. package/dist/api/index.js +588 -0
  30. package/dist/api/index.js.map +1 -0
  31. package/dist/api/index.mjs +578 -0
  32. package/dist/api/index.mjs.map +1 -0
  33. package/dist/components/index.css +339 -0
  34. package/dist/components/index.css.map +1 -0
  35. package/dist/components/index.d.mts +222 -0
  36. package/dist/components/index.d.ts +222 -0
  37. package/dist/components/index.js +9177 -0
  38. package/dist/components/index.js.map +1 -0
  39. package/dist/components/index.mjs +9130 -0
  40. package/dist/components/index.mjs.map +1 -0
  41. package/dist/config/config.editor.css +339 -0
  42. package/dist/config/config.editor.css.map +1 -0
  43. package/dist/config/config.editor.d.mts +153 -0
  44. package/dist/config/config.editor.d.ts +153 -0
  45. package/dist/config/config.editor.js +9400 -0
  46. package/dist/config/config.editor.js.map +1 -0
  47. package/dist/config/config.editor.mjs +9368 -0
  48. package/dist/config/config.editor.mjs.map +1 -0
  49. package/dist/config/index.d.mts +68 -0
  50. package/dist/config/index.d.ts +68 -0
  51. package/dist/config/index.js +2017 -0
  52. package/dist/config/index.js.map +1 -0
  53. package/dist/config/index.mjs +1991 -0
  54. package/dist/config/index.mjs.map +1 -0
  55. package/dist/editor/index.d.mts +784 -0
  56. package/dist/editor/index.d.ts +784 -0
  57. package/dist/editor/index.js +4517 -0
  58. package/dist/editor/index.js.map +1 -0
  59. package/dist/editor/index.mjs +4483 -0
  60. package/dist/editor/index.mjs.map +1 -0
  61. package/dist/fields/index.css +339 -0
  62. package/dist/fields/index.css.map +1 -0
  63. package/dist/fields/index.d.mts +600 -0
  64. package/dist/fields/index.d.ts +600 -0
  65. package/dist/fields/index.js +7739 -0
  66. package/dist/fields/index.js.map +1 -0
  67. package/dist/fields/index.mjs +7590 -0
  68. package/dist/fields/index.mjs.map +1 -0
  69. package/dist/index-CQu6SzDg.d.mts +327 -0
  70. package/dist/index-CoUQnyC3.d.ts +327 -0
  71. package/dist/index.d.mts +6 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.js +569 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/index.mjs +555 -0
  76. package/dist/index.mjs.map +1 -0
  77. package/dist/layouts/index.d.mts +96 -0
  78. package/dist/layouts/index.d.ts +96 -0
  79. package/dist/layouts/index.js +394 -0
  80. package/dist/layouts/index.js.map +1 -0
  81. package/dist/layouts/index.mjs +378 -0
  82. package/dist/layouts/index.mjs.map +1 -0
  83. package/dist/plugin/index.d.mts +289 -0
  84. package/dist/plugin/index.d.ts +289 -0
  85. package/dist/plugin/index.js +569 -0
  86. package/dist/plugin/index.js.map +1 -0
  87. package/dist/plugin/index.mjs +555 -0
  88. package/dist/plugin/index.mjs.map +1 -0
  89. package/dist/render/index.d.mts +109 -0
  90. package/dist/render/index.d.ts +109 -0
  91. package/dist/render/index.js +2146 -0
  92. package/dist/render/index.js.map +1 -0
  93. package/dist/render/index.mjs +2123 -0
  94. package/dist/render/index.mjs.map +1 -0
  95. package/dist/shared-DMAF1AcH.d.mts +545 -0
  96. package/dist/shared-DMAF1AcH.d.ts +545 -0
  97. package/dist/theme/index.d.mts +155 -0
  98. package/dist/theme/index.d.ts +155 -0
  99. package/dist/theme/index.js +201 -0
  100. package/dist/theme/index.js.map +1 -0
  101. package/dist/theme/index.mjs +186 -0
  102. package/dist/theme/index.mjs.map +1 -0
  103. package/dist/types-D7D3rZ1J.d.mts +116 -0
  104. package/dist/types-D7D3rZ1J.d.ts +116 -0
  105. package/dist/types-_6MvjyKv.d.mts +104 -0
  106. package/dist/types-_6MvjyKv.d.ts +104 -0
  107. package/dist/utils/index.d.mts +267 -0
  108. package/dist/utils/index.d.ts +267 -0
  109. package/dist/utils/index.js +426 -0
  110. package/dist/utils/index.js.map +1 -0
  111. package/dist/utils/index.mjs +412 -0
  112. package/dist/utils/index.mjs.map +1 -0
  113. package/dist/utils-DaRs9t0J.d.mts +85 -0
  114. package/dist/utils-gAvt0Vhw.d.ts +85 -0
  115. package/examples/README.md +240 -0
  116. package/examples/api/puck/pages/[id]/route.ts +64 -0
  117. package/examples/api/puck/pages/[id]/versions/route.ts +47 -0
  118. package/examples/api/puck/pages/route.ts +45 -0
  119. package/examples/app/(frontend)/page.tsx +94 -0
  120. package/examples/app/[...slug]/page.tsx +101 -0
  121. package/examples/app/pages/[id]/edit/page.tsx +148 -0
  122. package/examples/components/CustomBanner.tsx +368 -0
  123. package/examples/config/custom-config.ts +223 -0
  124. package/examples/config/payload.config.example.ts +64 -0
  125. package/examples/lib/puck-layouts.ts +258 -0
  126. package/examples/lib/puck-theme.ts +94 -0
  127. package/examples/styles/puck-theme.css +171 -0
  128. 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