@orion-studios/payload-studio 0.5.0-beta.8 → 0.5.0-beta.80

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 (67) hide show
  1. package/README.md +20 -0
  2. package/dist/admin/client.d.mts +2 -0
  3. package/dist/admin/client.d.ts +2 -0
  4. package/dist/admin/client.js +779 -137
  5. package/dist/admin/client.mjs +769 -129
  6. package/dist/admin/index.d.mts +1 -1
  7. package/dist/admin/index.d.ts +1 -1
  8. package/dist/admin/index.js +100 -8
  9. package/dist/admin/index.mjs +3 -1
  10. package/dist/admin-app/client.d.mts +7 -0
  11. package/dist/admin-app/client.d.ts +7 -0
  12. package/dist/admin-app/client.js +1262 -3
  13. package/dist/admin-app/client.mjs +1164 -2
  14. package/dist/admin-app/index.d.mts +1 -1
  15. package/dist/admin-app/index.d.ts +1 -1
  16. package/dist/admin-app/index.js +167 -0
  17. package/dist/admin-app/index.mjs +13 -1
  18. package/dist/admin-app/styles.css +229 -0
  19. package/dist/blocks/index.js +633 -8
  20. package/dist/blocks/index.mjs +2 -2
  21. package/dist/chunk-ADIIWIYL.mjs +322 -0
  22. package/dist/{chunk-ZLLNO5FM.mjs → chunk-AFLEATYB.mjs} +44 -13
  23. package/dist/chunk-FWVVRZ32.mjs +1143 -0
  24. package/dist/{chunk-J7W5EE3B.mjs → chunk-HCEPGEAI.mjs} +100 -8
  25. package/dist/chunk-ROTPP5CU.mjs +99 -0
  26. package/dist/{chunk-ETRRXURT.mjs → chunk-SIL2J5MF.mjs} +14 -0
  27. package/dist/{chunk-PC5622T7.mjs → chunk-XK3K5GRP.mjs} +620 -9
  28. package/dist/chunk-XVH5SCBD.mjs +234 -0
  29. package/dist/index-BBp-3l6M.d.ts +134 -0
  30. package/dist/{index-CmR6NInu.d.ts → index-BIwu3qIH.d.mts} +29 -3
  31. package/dist/{index-CmR6NInu.d.mts → index-BIwu3qIH.d.ts} +29 -3
  32. package/dist/{index-DbH0Ljwp.d.ts → index-CpG3UHcS.d.mts} +1 -0
  33. package/dist/{index-DbH0Ljwp.d.mts → index-CpG3UHcS.d.ts} +1 -0
  34. package/dist/index-DT_Vorvh.d.mts +134 -0
  35. package/dist/index-ZbOx4OCF.d.mts +128 -0
  36. package/dist/index-ZbOx4OCF.d.ts +128 -0
  37. package/dist/{index-DJFhANvJ.d.mts → index-cDYkEj29.d.mts} +20 -2
  38. package/dist/{index-DJFhANvJ.d.ts → index-cDYkEj29.d.ts} +20 -2
  39. package/dist/index.d.mts +5 -5
  40. package/dist/index.d.ts +5 -5
  41. package/dist/index.js +2232 -324
  42. package/dist/index.mjs +7 -7
  43. package/dist/nextjs/index.d.mts +1 -1
  44. package/dist/nextjs/index.d.ts +1 -1
  45. package/dist/nextjs/index.js +1002 -13
  46. package/dist/nextjs/index.mjs +4 -1
  47. package/dist/studio/index.d.mts +2 -1
  48. package/dist/studio/index.d.ts +2 -1
  49. package/dist/studio/index.js +171 -5
  50. package/dist/studio/index.mjs +7 -3
  51. package/dist/studio-pages/builder.css +472 -8
  52. package/dist/studio-pages/client.d.mts +17 -0
  53. package/dist/studio-pages/client.d.ts +17 -0
  54. package/dist/studio-pages/client.js +5057 -2546
  55. package/dist/studio-pages/client.mjs +4972 -2552
  56. package/dist/studio-pages/index.d.mts +3 -2
  57. package/dist/studio-pages/index.d.ts +3 -2
  58. package/dist/studio-pages/index.js +873 -32
  59. package/dist/studio-pages/index.mjs +6 -2
  60. package/package.json +26 -12
  61. package/dist/chunk-AAOHJDNS.mjs +0 -67
  62. package/dist/chunk-N67KVM2S.mjs +0 -156
  63. package/dist/chunk-TVDMZNKU.mjs +0 -301
  64. package/dist/index-B9N5MyjF.d.mts +0 -39
  65. package/dist/index-BallJs-K.d.mts +0 -43
  66. package/dist/index-BallJs-K.d.ts +0 -43
  67. package/dist/index-g8tBHLKD.d.ts +0 -39
@@ -4,7 +4,10 @@ import {
4
4
  createPayloadClient,
5
5
  createSiteQueries,
6
6
  resolveMedia
7
- } from "../chunk-ZLLNO5FM.mjs";
7
+ } from "../chunk-AFLEATYB.mjs";
8
+ import "../chunk-ADIIWIYL.mjs";
9
+ import "../chunk-FWVVRZ32.mjs";
10
+ import "../chunk-SIL2J5MF.mjs";
8
11
  import "../chunk-6BWS3CLP.mjs";
9
12
  export {
10
13
  WEBSITE_CONTENT_TAG,
@@ -1 +1,2 @@
1
- export { c as StudioCompileResult, S as StudioDocumentV1, d as StudioInspectorField, e as StudioInspectorPanel, f as StudioMigration, b as StudioModuleManifest, g as StudioNode, h as StudioNodeData, a as StudioNodeTypeDefinition, j as StudioPageService, k as StudioPaletteGroup, l as StudioPaletteItem, m as StudioPermission, n as StudioRegistry, o as StudioValidationIssue, p as assertStudioDocumentV1, q as compileStudioDocument, r as createEmptyStudioDocument, s as createStudioRegistry, t as migrateStudioDocument, v as validateStudioDocument } from '../index-CmR6NInu.mjs';
1
+ export { I as ImageUploadOptimizationOptions, c as StudioCompileResult, S as StudioDocumentV1, d as StudioInspectorField, e as StudioInspectorPanel, f as StudioMigration, b as StudioModuleManifest, g as StudioNode, h as StudioNodeData, a as StudioNodeTypeDefinition, j as StudioPageService, k as StudioPaletteGroup, l as StudioPaletteItem, m as StudioPermission, n as StudioRegistry, o as StudioValidationIssue, p as SupportedImageMimeType, q as assertStudioDocumentV1, r as compileStudioDocument, s as createEmptyStudioDocument, t as createImageUploadOptimizationHook, u as createStudioRegistry, v as migrateStudioDocument, w as validateStudioDocument, x as withImageUploadOptimization } from '../index-BIwu3qIH.mjs';
2
+ import 'payload';
@@ -1 +1,2 @@
1
- export { c as StudioCompileResult, S as StudioDocumentV1, d as StudioInspectorField, e as StudioInspectorPanel, f as StudioMigration, b as StudioModuleManifest, g as StudioNode, h as StudioNodeData, a as StudioNodeTypeDefinition, j as StudioPageService, k as StudioPaletteGroup, l as StudioPaletteItem, m as StudioPermission, n as StudioRegistry, o as StudioValidationIssue, p as assertStudioDocumentV1, q as compileStudioDocument, r as createEmptyStudioDocument, s as createStudioRegistry, t as migrateStudioDocument, v as validateStudioDocument } from '../index-CmR6NInu.js';
1
+ export { I as ImageUploadOptimizationOptions, c as StudioCompileResult, S as StudioDocumentV1, d as StudioInspectorField, e as StudioInspectorPanel, f as StudioMigration, b as StudioModuleManifest, g as StudioNode, h as StudioNodeData, a as StudioNodeTypeDefinition, j as StudioPageService, k as StudioPaletteGroup, l as StudioPaletteItem, m as StudioPermission, n as StudioRegistry, o as StudioValidationIssue, p as SupportedImageMimeType, q as assertStudioDocumentV1, r as compileStudioDocument, s as createEmptyStudioDocument, t as createImageUploadOptimizationHook, u as createStudioRegistry, v as migrateStudioDocument, w as validateStudioDocument, x as withImageUploadOptimization } from '../index-BIwu3qIH.js';
2
+ import 'payload';
@@ -23,11 +23,178 @@ __export(studio_exports, {
23
23
  assertStudioDocumentV1: () => assertStudioDocumentV1,
24
24
  compileStudioDocument: () => compileStudioDocument,
25
25
  createEmptyStudioDocument: () => createEmptyStudioDocument,
26
+ createImageUploadOptimizationHook: () => createImageUploadOptimizationHook,
26
27
  createStudioRegistry: () => createStudioRegistry,
27
28
  migrateStudioDocument: () => migrateStudioDocument,
28
- validateStudioDocument: () => validateStudioDocument
29
+ validateStudioDocument: () => validateStudioDocument,
30
+ withImageUploadOptimization: () => withImageUploadOptimization
29
31
  });
30
32
  module.exports = __toCommonJS(studio_exports);
33
+
34
+ // src/studio/imageUploadOptimization.ts
35
+ var import_promises = require("fs/promises");
36
+ var DEFAULT_SUPPORTED_MIME_TYPES = [
37
+ "image/jpeg",
38
+ "image/jpg",
39
+ "image/png",
40
+ "image/webp",
41
+ "image/avif",
42
+ "image/tiff"
43
+ ];
44
+ var DEFAULT_OPTIONS = {
45
+ avifQuality: 50,
46
+ enforceSmallerForLossy: true,
47
+ jpegQuality: 78,
48
+ minBytes: 48 * 1024,
49
+ minQualityFloor: 42,
50
+ onlyIfSmaller: true,
51
+ pngCompressionLevel: 9,
52
+ skipAnimated: true,
53
+ tiffQuality: 75,
54
+ webpQuality: 78
55
+ };
56
+ var clamp = (value, min, max) => Math.max(min, Math.min(max, Math.round(value)));
57
+ var isUploadMutationOperation = (operation) => operation === "create" || operation === "update" || operation === "updateByID";
58
+ var isLossyMimeType = (mimetype) => mimetype === "image/jpeg" || mimetype === "image/jpg" || mimetype === "image/webp" || mimetype === "image/avif" || mimetype === "image/tiff";
59
+ var readIncomingBuffer = async (file) => {
60
+ if (file.tempFilePath) {
61
+ return (0, import_promises.readFile)(file.tempFilePath);
62
+ }
63
+ return file.data;
64
+ };
65
+ var writeOptimizedBuffer = async (file, buffer) => {
66
+ if (file.tempFilePath) {
67
+ await (0, import_promises.unlink)(file.tempFilePath).catch(() => void 0);
68
+ }
69
+ return {
70
+ ...file,
71
+ data: buffer,
72
+ size: buffer.length,
73
+ tempFilePath: void 0
74
+ };
75
+ };
76
+ var createImageUploadOptimizationHook = (options = {}) => {
77
+ const supportedMimeTypes = new Set(options.supportedMimeTypes || DEFAULT_SUPPORTED_MIME_TYPES);
78
+ const settings = { ...DEFAULT_OPTIONS, ...options };
79
+ return async ({ operation, req }) => {
80
+ if (!isUploadMutationOperation(operation)) {
81
+ return;
82
+ }
83
+ const file = req.file;
84
+ if (!file) {
85
+ return;
86
+ }
87
+ if (!supportedMimeTypes.has(file.mimetype)) {
88
+ return;
89
+ }
90
+ if (typeof file.size === "number" && file.size < settings.minBytes) {
91
+ return;
92
+ }
93
+ const sharpFactory = req.payload?.config?.sharp;
94
+ if (typeof sharpFactory !== "function") {
95
+ return;
96
+ }
97
+ const originalBuffer = await readIncomingBuffer(file);
98
+ if (!Buffer.isBuffer(originalBuffer) || originalBuffer.length === 0) {
99
+ return;
100
+ }
101
+ const animatedInput = file.mimetype === "image/avif" || file.mimetype === "image/webp";
102
+ const metadataProbe = await sharpFactory(
103
+ originalBuffer,
104
+ animatedInput ? {
105
+ animated: true
106
+ } : void 0
107
+ ).metadata();
108
+ if (settings.skipAnimated && typeof metadataProbe.pages === "number" && metadataProbe.pages > 1) {
109
+ return;
110
+ }
111
+ const buildPipeline = (qualityOverride) => {
112
+ let pipeline = sharpFactory(
113
+ originalBuffer,
114
+ animatedInput ? {
115
+ animated: true
116
+ } : void 0
117
+ );
118
+ switch (file.mimetype) {
119
+ case "image/jpeg":
120
+ case "image/jpg":
121
+ pipeline = pipeline.jpeg({
122
+ mozjpeg: true,
123
+ progressive: true,
124
+ quality: clamp(qualityOverride ?? settings.jpegQuality, 20, 100)
125
+ });
126
+ break;
127
+ case "image/png":
128
+ pipeline = pipeline.png({
129
+ compressionLevel: clamp(settings.pngCompressionLevel, 0, 9),
130
+ palette: false
131
+ });
132
+ break;
133
+ case "image/webp":
134
+ pipeline = pipeline.webp({
135
+ quality: clamp(qualityOverride ?? settings.webpQuality, 20, 100)
136
+ });
137
+ break;
138
+ case "image/avif":
139
+ pipeline = pipeline.avif({
140
+ quality: clamp(qualityOverride ?? settings.avifQuality, 20, 100)
141
+ });
142
+ break;
143
+ case "image/tiff":
144
+ pipeline = pipeline.tiff({
145
+ quality: clamp(qualityOverride ?? settings.tiffQuality, 20, 100)
146
+ });
147
+ break;
148
+ default:
149
+ return null;
150
+ }
151
+ return pipeline;
152
+ };
153
+ const initialPipeline = buildPipeline();
154
+ if (!initialPipeline) {
155
+ return;
156
+ }
157
+ let optimizedBuffer = await initialPipeline.toBuffer();
158
+ const shouldSweepQuality = settings.enforceSmallerForLossy && isLossyMimeType(file.mimetype);
159
+ if (shouldSweepQuality) {
160
+ const initialQuality = file.mimetype === "image/jpeg" || file.mimetype === "image/jpg" ? settings.jpegQuality : file.mimetype === "image/webp" ? settings.webpQuality : file.mimetype === "image/avif" ? settings.avifQuality : settings.tiffQuality;
161
+ let bestBuffer = optimizedBuffer;
162
+ let quality = clamp(initialQuality - 5, settings.minQualityFloor, 100);
163
+ while (quality >= settings.minQualityFloor) {
164
+ const retryPipeline = buildPipeline(quality);
165
+ if (!retryPipeline) {
166
+ break;
167
+ }
168
+ const retryBuffer = await retryPipeline.toBuffer();
169
+ if (retryBuffer.length < bestBuffer.length) {
170
+ bestBuffer = retryBuffer;
171
+ }
172
+ quality -= 5;
173
+ }
174
+ optimizedBuffer = bestBuffer;
175
+ }
176
+ if (settings.onlyIfSmaller && optimizedBuffer.length >= originalBuffer.length) {
177
+ return;
178
+ }
179
+ req.file = await writeOptimizedBuffer(file, optimizedBuffer);
180
+ };
181
+ };
182
+ var withImageUploadOptimization = (collection, options = {}) => {
183
+ if (!collection.upload) {
184
+ return collection;
185
+ }
186
+ const existingHooks = collection.hooks || {};
187
+ const beforeOperation = existingHooks.beforeOperation || [];
188
+ return {
189
+ ...collection,
190
+ hooks: {
191
+ ...existingHooks,
192
+ beforeOperation: [createImageUploadOptimizationHook(options), ...beforeOperation]
193
+ }
194
+ };
195
+ };
196
+
197
+ // src/studio/index.ts
31
198
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
32
199
  var makeIssue = (message, path, code = "studio.invalid") => ({
33
200
  code,
@@ -148,9 +315,6 @@ function compileStudioDocument(document, modules) {
148
315
  }
149
316
  function migrateStudioDocument(value, migrations) {
150
317
  const sorted = [...migrations].sort((a, b) => a.fromVersion - b.fromVersion);
151
- if (isRecord(value) && value.schemaVersion === 1) {
152
- return assertStudioDocumentV1(value);
153
- }
154
318
  let current = value;
155
319
  for (const migration of sorted) {
156
320
  if (!isRecord(current) || current.schemaVersion !== migration.fromVersion) {
@@ -165,7 +329,9 @@ function migrateStudioDocument(value, migrations) {
165
329
  assertStudioDocumentV1,
166
330
  compileStudioDocument,
167
331
  createEmptyStudioDocument,
332
+ createImageUploadOptimizationHook,
168
333
  createStudioRegistry,
169
334
  migrateStudioDocument,
170
- validateStudioDocument
335
+ validateStudioDocument,
336
+ withImageUploadOptimization
171
337
  });
@@ -2,16 +2,20 @@ import {
2
2
  assertStudioDocumentV1,
3
3
  compileStudioDocument,
4
4
  createEmptyStudioDocument,
5
+ createImageUploadOptimizationHook,
5
6
  createStudioRegistry,
6
7
  migrateStudioDocument,
7
- validateStudioDocument
8
- } from "../chunk-N67KVM2S.mjs";
8
+ validateStudioDocument,
9
+ withImageUploadOptimization
10
+ } from "../chunk-ADIIWIYL.mjs";
9
11
  import "../chunk-6BWS3CLP.mjs";
10
12
  export {
11
13
  assertStudioDocumentV1,
12
14
  compileStudioDocument,
13
15
  createEmptyStudioDocument,
16
+ createImageUploadOptimizationHook,
14
17
  createStudioRegistry,
15
18
  migrateStudioDocument,
16
- validateStudioDocument
19
+ validateStudioDocument,
20
+ withImageUploadOptimization
17
21
  };