@payloadcms/plugin-cloud-storage 4.0.0-internal.8867dba → 4.0.0-internal.934870d

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 (90) hide show
  1. package/README.md +2 -0
  2. package/dist/exports/client.d.ts +1 -1
  3. package/dist/exports/client.d.ts.map +1 -1
  4. package/dist/exports/client.js +1 -1
  5. package/dist/exports/client.js.map +1 -1
  6. package/dist/exports/utilities.d.ts +1 -1
  7. package/dist/exports/utilities.d.ts.map +1 -1
  8. package/dist/exports/utilities.js +1 -1
  9. package/dist/exports/utilities.js.map +1 -1
  10. package/dist/fields/getFields.d.ts +1 -5
  11. package/dist/fields/getFields.d.ts.map +1 -1
  12. package/dist/fields/getFields.js +118 -24
  13. package/dist/fields/getFields.js.map +1 -1
  14. package/dist/hooks/afterChange.d.ts +5 -1
  15. package/dist/hooks/afterChange.d.ts.map +1 -1
  16. package/dist/hooks/afterChange.js +137 -23
  17. package/dist/hooks/afterChange.js.map +1 -1
  18. package/dist/hooks/afterDelete.d.ts +3 -1
  19. package/dist/hooks/afterDelete.d.ts.map +1 -1
  20. package/dist/hooks/afterDelete.js +26 -4
  21. package/dist/hooks/afterDelete.js.map +1 -1
  22. package/dist/hooks/afterRead.d.ts +6 -1
  23. package/dist/hooks/afterRead.d.ts.map +1 -1
  24. package/dist/hooks/afterRead.js +34 -7
  25. package/dist/hooks/afterRead.js.map +1 -1
  26. package/dist/hooks/beforeChange.d.ts +2 -1
  27. package/dist/hooks/beforeChange.d.ts.map +1 -1
  28. package/dist/hooks/beforeChange.js +18 -4
  29. package/dist/hooks/beforeChange.js.map +1 -1
  30. package/dist/hooks/normalizeUploadPrefix.d.ts +11 -0
  31. package/dist/hooks/normalizeUploadPrefix.d.ts.map +1 -0
  32. package/dist/hooks/normalizeUploadPrefix.js +42 -0
  33. package/dist/hooks/normalizeUploadPrefix.js.map +1 -0
  34. package/dist/hooks/publicOriginalURL.d.ts +8 -0
  35. package/dist/hooks/publicOriginalURL.d.ts.map +1 -0
  36. package/dist/hooks/publicOriginalURL.js +34 -0
  37. package/dist/hooks/publicOriginalURL.js.map +1 -0
  38. package/dist/plugin.d.ts.map +1 -1
  39. package/dist/plugin.js +200 -166
  40. package/dist/plugin.js.map +1 -1
  41. package/dist/types.d.ts +46 -12
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/utilities/buildPrefixWithObjectKey.d.ts +8 -0
  45. package/dist/utilities/buildPrefixWithObjectKey.d.ts.map +1 -0
  46. package/dist/utilities/buildPrefixWithObjectKey.js +13 -0
  47. package/dist/utilities/buildPrefixWithObjectKey.js.map +1 -0
  48. package/dist/utilities/buildStoragePathData.d.ts +49 -0
  49. package/dist/utilities/buildStoragePathData.d.ts.map +1 -0
  50. package/dist/utilities/buildStoragePathData.js +67 -0
  51. package/dist/utilities/buildStoragePathData.js.map +1 -0
  52. package/dist/utilities/createFileOperations.d.ts +13 -0
  53. package/dist/utilities/createFileOperations.d.ts.map +1 -0
  54. package/dist/utilities/createFileOperations.js +258 -0
  55. package/dist/utilities/createFileOperations.js.map +1 -0
  56. package/dist/utilities/getFilePrefix.d.ts +15 -10
  57. package/dist/utilities/getFilePrefix.d.ts.map +1 -1
  58. package/dist/utilities/getFilePrefix.js +85 -30
  59. package/dist/utilities/getFilePrefix.js.map +1 -1
  60. package/dist/utilities/getIncomingFiles.js +2 -2
  61. package/dist/utilities/getIncomingFiles.js.map +1 -1
  62. package/dist/utilities/getStorageLocationSelect.d.ts +9 -0
  63. package/dist/utilities/getStorageLocationSelect.d.ts.map +1 -0
  64. package/dist/utilities/getStorageLocationSelect.js +54 -0
  65. package/dist/utilities/getStorageLocationSelect.js.map +1 -0
  66. package/dist/utilities/resolveSignedURLKey.d.ts +12 -1
  67. package/dist/utilities/resolveSignedURLKey.d.ts.map +1 -1
  68. package/dist/utilities/resolveSignedURLKey.js +52 -10
  69. package/dist/utilities/resolveSignedURLKey.js.map +1 -1
  70. package/dist/utilities/sanitizePrefix.d.ts +1 -9
  71. package/dist/utilities/sanitizePrefix.d.ts.map +1 -1
  72. package/dist/utilities/sanitizePrefix.js +1 -21
  73. package/dist/utilities/sanitizePrefix.js.map +1 -1
  74. package/package.json +6 -6
  75. package/dist/admin/fields/getFields.d.ts +0 -17
  76. package/dist/admin/fields/getFields.d.ts.map +0 -1
  77. package/dist/admin/fields/getFields.js +0 -98
  78. package/dist/admin/fields/getFields.js.map +0 -1
  79. package/dist/admin/index.d.ts +0 -4
  80. package/dist/admin/index.d.ts.map +0 -1
  81. package/dist/admin/index.js +0 -34
  82. package/dist/admin/index.js.map +0 -1
  83. package/dist/utilities/getFileKey.d.ts +0 -22
  84. package/dist/utilities/getFileKey.d.ts.map +0 -1
  85. package/dist/utilities/getFileKey.js +0 -23
  86. package/dist/utilities/getFileKey.js.map +0 -1
  87. package/dist/utilities/getFileKey.spec.js +0 -174
  88. package/dist/utilities/getFileKey.spec.js.map +0 -1
  89. package/dist/utilities/getFilePrefix.spec.js +0 -105
  90. package/dist/utilities/getFilePrefix.spec.js.map +0 -1
package/dist/plugin.js CHANGED
@@ -1,7 +1,11 @@
1
1
  import { getFields } from './fields/getFields.js';
2
2
  import { getAfterChangeHook } from './hooks/afterChange.js';
3
3
  import { getAfterDeleteHook } from './hooks/afterDelete.js';
4
+ import { getNormalizeUploadPrefixHook } from './hooks/normalizeUploadPrefix.js';
4
5
  import { getPreserveFileDataHook } from './hooks/preserveFileData.js';
6
+ import { getPublicOriginalURLHook } from './hooks/publicOriginalURL.js';
7
+ import { createFileOperations } from './utilities/createFileOperations.js';
8
+ import { getStorageLocationSelect } from './utilities/getStorageLocationSelect.js';
5
9
  // This plugin extends all targeted collections by offloading uploaded files
6
10
  // to cloud storage instead of solely storing files locally.
7
11
  // It is based on an adapter approach, where adapters can be written for any cloud provider.
@@ -9,189 +13,219 @@ import { getPreserveFileDataHook } from './hooks/preserveFileData.js';
9
13
  // 1. handleUpload, 2. handleDelete, 3. generateURL, 4. staticHandler
10
14
  // Optionally, the adapter can specify any Webpack config overrides if they are necessary.
11
15
  export const cloudStoragePlugin = (pluginOptions)=>(incomingConfig)=>{
12
- const { alwaysInsertFields, collections: allCollectionOptions, enabled, useCompositePrefixes } = pluginOptions;
16
+ const { collections: allCollectionOptions, enabled, useCompositePrefixes } = pluginOptions;
13
17
  const config = {
14
18
  ...incomingConfig
15
19
  };
16
- // If disabled but alwaysInsertFields is true, only insert fields without full plugin functionality
20
+ // If disabled, only insert fields (e.g. prefix) without full plugin functionality,
21
+ // so the collection schema stays consistent across environments.
17
22
  if (enabled === false) {
18
- if (alwaysInsertFields) {
19
- return {
20
- ...config,
21
- collections: (config.collections || []).map((existingCollection)=>{
22
- const options = allCollectionOptions[existingCollection.slug];
23
- if (options) {
24
- // If adapter is provided, use it to get fields
25
- const adapter = options.adapter ? options.adapter({
26
- collection: existingCollection,
27
- prefix: options.prefix
28
- }) : undefined;
29
- const fields = getFields({
30
- adapter,
31
- alwaysInsertFields: true,
32
- collection: existingCollection,
33
- disablePayloadAccessControl: options.disablePayloadAccessControl,
34
- generateFileURL: options.generateFileURL,
35
- prefix: options.prefix,
36
- useCompositePrefixes
37
- });
38
- return {
39
- ...existingCollection,
40
- fields
41
- };
42
- }
43
- return existingCollection;
44
- })
45
- };
46
- }
47
- return config;
23
+ return {
24
+ ...config,
25
+ collections: (config.collections || []).map((existingCollection)=>{
26
+ const options = allCollectionOptions[existingCollection.slug];
27
+ if (options) {
28
+ // If adapter is provided, use it to get fields
29
+ const adapter = options.adapter ? options.adapter({
30
+ collection: existingCollection,
31
+ prefix: options.prefix
32
+ }) : undefined;
33
+ const fields = getFields({
34
+ adapter,
35
+ collection: existingCollection,
36
+ disablePayloadAccessControl: options.disablePayloadAccessControl,
37
+ generateFileURL: options.generateFileURL,
38
+ prefix: options.prefix,
39
+ useCompositePrefixes
40
+ });
41
+ return {
42
+ ...existingCollection,
43
+ fields
44
+ };
45
+ }
46
+ return existingCollection;
47
+ })
48
+ };
48
49
  }
49
50
  const initFunctions = [];
50
51
  const endpointPaths = new Map();
51
- return {
52
- ...config,
53
- collections: (config.collections || []).map((existingCollection)=>{
54
- const options = allCollectionOptions[existingCollection.slug];
55
- if (options?.adapter) {
56
- const adapter = options.adapter({
57
- collection: existingCollection,
58
- prefix: options.prefix
59
- });
60
- if (adapter.onInit) {
61
- initFunctions.push(adapter.onInit);
52
+ const collections = (config.collections || []).map((existingCollection)=>{
53
+ const options = allCollectionOptions[existingCollection.slug];
54
+ if (options?.adapter) {
55
+ const adapter = options.adapter({
56
+ collection: existingCollection,
57
+ prefix: options.prefix
58
+ });
59
+ if (adapter.onInit) {
60
+ initFunctions.push(adapter.onInit);
61
+ }
62
+ let uploadInstructions;
63
+ if (adapter.uploadInstructions) {
64
+ const { adminHandler, enabled, endpoint, ...instructions } = adapter.uploadInstructions;
65
+ let endpointPath = endpointPaths.get(options.adapter);
66
+ if (enabled && endpoint && !endpointPath) {
67
+ const endpointCount = config.endpoints?.filter(({ path })=>path?.startsWith(endpoint.path)).length || 0;
68
+ endpointPath = endpointCount ? `${endpoint.path}-${endpointCount}` : endpoint.path;
69
+ config.endpoints ??= [];
70
+ config.endpoints.push({
71
+ handler: endpoint.handler,
72
+ method: 'post',
73
+ path: endpointPath
74
+ });
75
+ endpointPaths.set(options.adapter, endpointPath);
62
76
  }
63
- let uploadInstructions;
64
- if (adapter.uploadInstructions) {
65
- const { adminHandler, endpoint, ...instructions } = adapter.uploadInstructions;
66
- let endpointPath = endpointPaths.get(options.adapter);
67
- if (endpoint && !endpointPath) {
68
- const endpointCount = config.endpoints?.filter(({ path })=>path?.startsWith(endpoint.path)).length || 0;
69
- endpointPath = endpointCount ? `${endpoint.path}-${endpointCount}` : endpoint.path;
70
- config.endpoints ??= [];
71
- config.endpoints.push({
72
- handler: endpoint.handler,
73
- method: 'post',
74
- path: endpointPath
75
- });
76
- endpointPaths.set(options.adapter, endpointPath);
77
- }
78
- if (adminHandler) {
79
- config.admin ??= {};
80
- config.admin.components ??= {};
81
- config.admin.components.providers ??= [];
82
- config.admin.components.providers.push({
83
- clientProps: {
84
- collectionSlug: existingCollection.slug,
85
- endpointPath,
86
- prefix: options.prefix,
87
- props: adminHandler.props || {}
88
- },
89
- path: adminHandler.path
90
- });
91
- }
77
+ if (enabled && adminHandler) {
78
+ config.admin ??= {};
79
+ config.admin.components ??= {};
80
+ config.admin.components.providers ??= [];
81
+ config.admin.components.providers.push({
82
+ clientProps: {
83
+ collectionSlug: existingCollection.slug,
84
+ endpointPath,
85
+ prefix: options.prefix,
86
+ props: adminHandler.props || {}
87
+ },
88
+ path: adminHandler.path
89
+ });
90
+ }
91
+ if (enabled) {
92
92
  uploadInstructions = instructions;
93
+ } else if (adminHandler) {
94
+ /** Avoid importMap.js differences when client uploads vary between dev and production. */ config.admin ??= {};
95
+ config.admin.dependencies ??= {};
96
+ config.admin.dependencies[adminHandler.path] = {
97
+ type: 'component',
98
+ path: adminHandler.path
99
+ };
93
100
  }
94
- const fields = getFields({
95
- adapter,
96
- collection: existingCollection,
97
- disablePayloadAccessControl: options.disablePayloadAccessControl,
98
- generateFileURL: options.generateFileURL,
99
- prefix: options.prefix,
100
- useCompositePrefixes
101
+ }
102
+ const fields = getFields({
103
+ adapter,
104
+ collection: existingCollection,
105
+ disablePayloadAccessControl: options.disablePayloadAccessControl,
106
+ generateFileURL: options.generateFileURL,
107
+ prefix: options.prefix,
108
+ useCompositePrefixes
109
+ });
110
+ const handlers = [
111
+ ...typeof existingCollection.upload === 'object' && Array.isArray(existingCollection.upload.handlers) ? existingCollection.upload.handlers : []
112
+ ];
113
+ if (!options.disablePayloadAccessControl) {
114
+ handlers.push(adapter.staticHandler);
115
+ // Public files still need a server path when Payload reads them for a transform.
116
+ } else {
117
+ handlers.push((req, args)=>{
118
+ if ('uploadReference' in args.params || args.params.operation === 'transform') {
119
+ return adapter.staticHandler(req, args);
120
+ }
101
121
  });
102
- const handlers = [
103
- ...typeof existingCollection.upload === 'object' && Array.isArray(existingCollection.upload.handlers) ? existingCollection.upload.handlers : []
104
- ];
105
- if (!options.disablePayloadAccessControl) {
106
- handlers.push(adapter.staticHandler);
107
- // Else if disablePayloadAccessControl: true and upload instructions are used
108
- // Build the "proxied" handler that responds only when addDataAndFileToRequest fetches the uploaded file
109
- } else if (adapter.uploadInstructions) {
110
- handlers.push((req, args)=>{
111
- if ('uploadReference' in args.params) {
112
- return adapter.staticHandler(req, args);
113
- }
122
+ }
123
+ const getSkipSafeFetchSetting = ()=>{
124
+ const isBooleanTrueSkipSafeFetch = typeof existingCollection.upload === 'object' && existingCollection.upload.skipSafeFetch === true;
125
+ const isAllowListSkipSafeFetch = typeof existingCollection.upload === 'object' && Array.isArray(existingCollection.upload.skipSafeFetch);
126
+ if (isBooleanTrueSkipSafeFetch) {
127
+ return true;
128
+ } else if (isAllowListSkipSafeFetch) {
129
+ const existingSkipSafeFetch = typeof existingCollection.upload === 'object' && Array.isArray(existingCollection.upload.skipSafeFetch) ? existingCollection.upload.skipSafeFetch : [];
130
+ const hasExactLocalhostMatch = existingSkipSafeFetch.some((entry)=>{
131
+ const entryKeys = Object.keys(entry);
132
+ return entryKeys.length === 1 && entry.hostname === 'localhost';
114
133
  });
134
+ const localhostEntry = process.env.NODE_ENV !== 'production' && !hasExactLocalhostMatch ? [
135
+ {
136
+ hostname: 'localhost'
137
+ }
138
+ ] : [];
139
+ return [
140
+ ...existingSkipSafeFetch,
141
+ ...localhostEntry
142
+ ];
115
143
  }
116
- const getSkipSafeFetchSetting = ()=>{
117
- if (options.disablePayloadAccessControl) {
118
- return true;
119
- }
120
- const isBooleanTrueSkipSafeFetch = typeof existingCollection.upload === 'object' && existingCollection.upload.skipSafeFetch === true;
121
- const isAllowListSkipSafeFetch = typeof existingCollection.upload === 'object' && Array.isArray(existingCollection.upload.skipSafeFetch);
122
- if (isBooleanTrueSkipSafeFetch) {
123
- return true;
124
- } else if (isAllowListSkipSafeFetch) {
125
- const existingSkipSafeFetch = typeof existingCollection.upload === 'object' && Array.isArray(existingCollection.upload.skipSafeFetch) ? existingCollection.upload.skipSafeFetch : [];
126
- const hasExactLocalhostMatch = existingSkipSafeFetch.some((entry)=>{
127
- const entryKeys = Object.keys(entry);
128
- return entryKeys.length === 1 && entry.hostname === 'localhost';
129
- });
130
- const localhostEntry = process.env.NODE_ENV !== 'production' && !hasExactLocalhostMatch ? [
131
- {
132
- hostname: 'localhost'
133
- }
134
- ] : [];
135
- return [
136
- ...existingSkipSafeFetch,
137
- ...localhostEntry
138
- ];
139
- }
140
- if (process.env.NODE_ENV !== 'production') {
141
- return [
142
- {
143
- hostname: 'localhost'
144
- }
145
- ];
146
- }
147
- return false;
148
- };
149
- return {
150
- ...existingCollection,
151
- fields,
152
- hooks: {
153
- ...existingCollection.hooks || {},
154
- afterChange: [
155
- ...existingCollection.hooks?.afterChange || [],
156
- getAfterChangeHook({
157
- adapter,
158
- collection: existingCollection
159
- })
160
- ],
161
- afterDelete: [
162
- ...existingCollection.hooks?.afterDelete || [],
163
- getAfterDeleteHook({
144
+ if (process.env.NODE_ENV !== 'production') {
145
+ return [
146
+ {
147
+ hostname: 'localhost'
148
+ }
149
+ ];
150
+ }
151
+ return false;
152
+ };
153
+ return {
154
+ ...existingCollection,
155
+ fields,
156
+ hooks: {
157
+ ...existingCollection.hooks || {},
158
+ afterChange: [
159
+ ...existingCollection.hooks?.afterChange || [],
160
+ getAfterChangeHook({
161
+ adapter,
162
+ collection: existingCollection,
163
+ collectionPrefix: options.prefix,
164
+ disablePayloadAccessControl: options.disablePayloadAccessControl,
165
+ hasCustomFileURL: Boolean(options.generateFileURL),
166
+ useCompositePrefixes
167
+ })
168
+ ],
169
+ afterDelete: [
170
+ ...existingCollection.hooks?.afterDelete || [],
171
+ getAfterDeleteHook({
172
+ adapter,
173
+ collection: existingCollection,
174
+ collectionPrefix: options.prefix,
175
+ useCompositePrefixes
176
+ })
177
+ ],
178
+ afterRead: [
179
+ ...existingCollection.hooks?.afterRead || [],
180
+ ...options.disablePayloadAccessControl && (options.generateFileURL || adapter.generateURL) ? [
181
+ getPublicOriginalURLHook({
164
182
  adapter,
165
- collection: existingCollection
183
+ collection: existingCollection,
184
+ generateFileURL: options.generateFileURL
166
185
  })
167
- ],
168
- beforeChange: [
169
- ...existingCollection.hooks?.beforeChange || [],
170
- getPreserveFileDataHook()
171
- ]
186
+ ] : []
187
+ ],
188
+ beforeChange: [
189
+ ...existingCollection.hooks?.beforeChange || [],
190
+ getNormalizeUploadPrefixHook({
191
+ collectionPrefix: options.prefix,
192
+ useCompositePrefixes
193
+ }),
194
+ getPreserveFileDataHook()
195
+ ]
196
+ },
197
+ select: getStorageLocationSelect({
198
+ select: existingCollection.select
199
+ }),
200
+ upload: {
201
+ ...typeof existingCollection.upload === 'object' ? existingCollection.upload : {},
202
+ adapter: adapter.name,
203
+ fileOperations: createFileOperations({
204
+ adapter,
205
+ collection: existingCollection,
206
+ collectionPrefix: options.prefix,
207
+ disablePayloadAccessControl: options.disablePayloadAccessControl,
208
+ generateFileURL: options.generateFileURL,
209
+ useCompositePrefixes
210
+ }),
211
+ ...uploadInstructions && {
212
+ uploadInstructions
172
213
  },
173
- upload: {
174
- ...typeof existingCollection.upload === 'object' ? existingCollection.upload : {},
175
- adapter: adapter.name,
176
- ...uploadInstructions && {
177
- uploadInstructions
178
- },
179
- disableLocalStorage: typeof options.disableLocalStorage === 'boolean' ? options.disableLocalStorage : true,
180
- handlers,
181
- skipSafeFetch: getSkipSafeFetchSetting()
182
- }
183
- };
184
- }
185
- return existingCollection;
186
- }),
187
- ...config.admin && {
188
- admin: config.admin
189
- },
190
- ...config.endpoints && {
191
- endpoints: config.endpoints
192
- },
214
+ disableLocalStorage: typeof options.disableLocalStorage === 'boolean' ? options.disableLocalStorage : true,
215
+ handlers,
216
+ skipSafeFetch: getSkipSafeFetchSetting()
217
+ }
218
+ };
219
+ }
220
+ return existingCollection;
221
+ });
222
+ return {
223
+ ...config,
224
+ collections,
193
225
  onInit: async (payload)=>{
194
- initFunctions.forEach((fn)=>fn());
226
+ // Await each init so a provisioning failure fails Payload startup
227
+ // instead of becoming an unhandled rejection.
228
+ await Promise.all(initFunctions.map((fn)=>fn()));
195
229
  if (config.onInit) {
196
230
  await config.onInit(payload);
197
231
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { Adapter, AllowList, PluginOptions } from './types.js'\n\nimport { getFields } from './fields/getFields.js'\nimport { getAfterChangeHook } from './hooks/afterChange.js'\nimport { getAfterDeleteHook } from './hooks/afterDelete.js'\nimport { getPreserveFileDataHook } from './hooks/preserveFileData.js'\n\n// This plugin extends all targeted collections by offloading uploaded files\n// to cloud storage instead of solely storing files locally.\n\n// It is based on an adapter approach, where adapters can be written for any cloud provider.\n// Adapters are responsible for providing four actions that this plugin will use:\n// 1. handleUpload, 2. handleDelete, 3. generateURL, 4. staticHandler\n\n// Optionally, the adapter can specify any Webpack config overrides if they are necessary.\n\nexport const cloudStoragePlugin =\n (pluginOptions: PluginOptions) =>\n (incomingConfig: Config): Config => {\n const {\n alwaysInsertFields,\n collections: allCollectionOptions,\n enabled,\n useCompositePrefixes,\n } = pluginOptions\n const config = { ...incomingConfig }\n\n // If disabled but alwaysInsertFields is true, only insert fields without full plugin functionality\n if (enabled === false) {\n if (alwaysInsertFields) {\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options) {\n // If adapter is provided, use it to get fields\n const adapter = options.adapter\n ? options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n : undefined\n\n const fields = getFields({\n adapter,\n alwaysInsertFields: true,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n useCompositePrefixes,\n })\n\n return {\n ...existingCollection,\n fields,\n }\n }\n\n return existingCollection\n }),\n }\n }\n\n return config\n }\n\n const initFunctions: Array<() => void> = []\n const endpointPaths = new Map<Adapter, string>()\n\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options?.adapter) {\n const adapter = options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n\n if (adapter.onInit) {\n initFunctions.push(adapter.onInit)\n }\n\n let uploadInstructions\n\n if (adapter.uploadInstructions) {\n const { adminHandler, endpoint, ...instructions } = adapter.uploadInstructions\n let endpointPath = endpointPaths.get(options.adapter)\n\n if (endpoint && !endpointPath) {\n const endpointCount =\n config.endpoints?.filter(({ path }) => path?.startsWith(endpoint.path)).length || 0\n\n endpointPath = endpointCount ? `${endpoint.path}-${endpointCount}` : endpoint.path\n config.endpoints ??= []\n config.endpoints.push({\n handler: endpoint.handler,\n method: 'post',\n path: endpointPath,\n })\n endpointPaths.set(options.adapter, endpointPath)\n }\n\n if (adminHandler) {\n config.admin ??= {}\n config.admin.components ??= {}\n config.admin.components.providers ??= []\n config.admin.components.providers.push({\n clientProps: {\n collectionSlug: existingCollection.slug,\n endpointPath,\n prefix: options.prefix,\n props: adminHandler.props || {},\n },\n path: adminHandler.path,\n })\n }\n\n uploadInstructions = instructions\n }\n\n const fields = getFields({\n adapter,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n useCompositePrefixes,\n })\n\n const handlers = [\n ...(typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.handlers)\n ? existingCollection.upload.handlers\n : []),\n ]\n\n if (!options.disablePayloadAccessControl) {\n handlers.push(adapter.staticHandler)\n // Else if disablePayloadAccessControl: true and upload instructions are used\n // Build the \"proxied\" handler that responds only when addDataAndFileToRequest fetches the uploaded file\n } else if (adapter.uploadInstructions) {\n handlers.push((req, args) => {\n if ('uploadReference' in args.params) {\n return adapter.staticHandler(req, args)\n }\n })\n }\n\n const getSkipSafeFetchSetting = (): AllowList | boolean => {\n if (options.disablePayloadAccessControl) {\n return true\n }\n const isBooleanTrueSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n existingCollection.upload.skipSafeFetch === true\n\n const isAllowListSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n\n if (isBooleanTrueSkipSafeFetch) {\n return true\n } else if (isAllowListSkipSafeFetch) {\n const existingSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n ? existingCollection.upload.skipSafeFetch\n : []\n\n const hasExactLocalhostMatch = existingSkipSafeFetch.some((entry) => {\n const entryKeys = Object.keys(entry)\n return entryKeys.length === 1 && entry.hostname === 'localhost'\n })\n\n const localhostEntry =\n process.env.NODE_ENV !== 'production' && !hasExactLocalhostMatch\n ? [{ hostname: 'localhost' }]\n : []\n\n return [...existingSkipSafeFetch, ...localhostEntry]\n }\n\n if (process.env.NODE_ENV !== 'production') {\n return [{ hostname: 'localhost' }]\n }\n\n return false\n }\n\n return {\n ...existingCollection,\n fields,\n hooks: {\n ...(existingCollection.hooks || {}),\n afterChange: [\n ...(existingCollection.hooks?.afterChange || []),\n getAfterChangeHook({ adapter, collection: existingCollection }),\n ],\n afterDelete: [\n ...(existingCollection.hooks?.afterDelete || []),\n getAfterDeleteHook({ adapter, collection: existingCollection }),\n ],\n beforeChange: [\n ...(existingCollection.hooks?.beforeChange || []),\n getPreserveFileDataHook(),\n ],\n },\n upload: {\n ...(typeof existingCollection.upload === 'object' ? existingCollection.upload : {}),\n adapter: adapter.name,\n ...(uploadInstructions && {\n uploadInstructions,\n }),\n disableLocalStorage:\n typeof options.disableLocalStorage === 'boolean'\n ? options.disableLocalStorage\n : true,\n handlers,\n skipSafeFetch: getSkipSafeFetchSetting(),\n },\n }\n }\n\n return existingCollection\n }),\n ...(config.admin && { admin: config.admin }),\n ...(config.endpoints && { endpoints: config.endpoints }),\n onInit: async (payload) => {\n initFunctions.forEach((fn) => fn())\n if (config.onInit) {\n await config.onInit(payload)\n }\n },\n }\n }\n"],"names":["getFields","getAfterChangeHook","getAfterDeleteHook","getPreserveFileDataHook","cloudStoragePlugin","pluginOptions","incomingConfig","alwaysInsertFields","collections","allCollectionOptions","enabled","useCompositePrefixes","config","map","existingCollection","options","slug","adapter","collection","prefix","undefined","fields","disablePayloadAccessControl","generateFileURL","initFunctions","endpointPaths","Map","onInit","push","uploadInstructions","adminHandler","endpoint","instructions","endpointPath","get","endpointCount","endpoints","filter","path","startsWith","length","handler","method","set","admin","components","providers","clientProps","collectionSlug","props","handlers","upload","Array","isArray","staticHandler","req","args","params","getSkipSafeFetchSetting","isBooleanTrueSkipSafeFetch","skipSafeFetch","isAllowListSkipSafeFetch","existingSkipSafeFetch","hasExactLocalhostMatch","some","entry","entryKeys","Object","keys","hostname","localhostEntry","process","env","NODE_ENV","hooks","afterChange","afterDelete","beforeChange","name","disableLocalStorage","payload","forEach","fn"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { Adapter, AllowList, PluginOptions } from './types.js'\n\nimport { getFields } from './fields/getFields.js'\nimport { getAfterChangeHook } from './hooks/afterChange.js'\nimport { getAfterDeleteHook } from './hooks/afterDelete.js'\nimport { getNormalizeUploadPrefixHook } from './hooks/normalizeUploadPrefix.js'\nimport { getPreserveFileDataHook } from './hooks/preserveFileData.js'\nimport { getPublicOriginalURLHook } from './hooks/publicOriginalURL.js'\nimport { createFileOperations } from './utilities/createFileOperations.js'\nimport { getStorageLocationSelect } from './utilities/getStorageLocationSelect.js'\n\n// This plugin extends all targeted collections by offloading uploaded files\n// to cloud storage instead of solely storing files locally.\n\n// It is based on an adapter approach, where adapters can be written for any cloud provider.\n// Adapters are responsible for providing four actions that this plugin will use:\n// 1. handleUpload, 2. handleDelete, 3. generateURL, 4. staticHandler\n\n// Optionally, the adapter can specify any Webpack config overrides if they are necessary.\n\nexport const cloudStoragePlugin =\n (pluginOptions: PluginOptions) =>\n (incomingConfig: Config): Config => {\n const { collections: allCollectionOptions, enabled, useCompositePrefixes } = pluginOptions\n const config = { ...incomingConfig }\n\n // If disabled, only insert fields (e.g. prefix) without full plugin functionality,\n // so the collection schema stays consistent across environments.\n if (enabled === false) {\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options) {\n // If adapter is provided, use it to get fields\n const adapter = options.adapter\n ? options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n : undefined\n\n const fields = getFields({\n adapter,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n useCompositePrefixes,\n })\n\n return {\n ...existingCollection,\n fields,\n }\n }\n\n return existingCollection\n }),\n }\n }\n\n const initFunctions: Array<() => Promise<void> | void> = []\n const endpointPaths = new Map<Adapter, string>()\n\n const collections = (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options?.adapter) {\n const adapter = options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n\n if (adapter.onInit) {\n initFunctions.push(adapter.onInit)\n }\n\n let uploadInstructions\n\n if (adapter.uploadInstructions) {\n const { adminHandler, enabled, endpoint, ...instructions } = adapter.uploadInstructions\n let endpointPath = endpointPaths.get(options.adapter)\n\n if (enabled && endpoint && !endpointPath) {\n const endpointCount =\n config.endpoints?.filter(({ path }) => path?.startsWith(endpoint.path)).length || 0\n\n endpointPath = endpointCount ? `${endpoint.path}-${endpointCount}` : endpoint.path\n config.endpoints ??= []\n config.endpoints.push({\n handler: endpoint.handler,\n method: 'post',\n path: endpointPath,\n })\n endpointPaths.set(options.adapter, endpointPath)\n }\n\n if (enabled && adminHandler) {\n config.admin ??= {}\n config.admin.components ??= {}\n config.admin.components.providers ??= []\n config.admin.components.providers.push({\n clientProps: {\n collectionSlug: existingCollection.slug,\n endpointPath,\n prefix: options.prefix,\n props: adminHandler.props || {},\n },\n path: adminHandler.path,\n })\n }\n\n if (enabled) {\n uploadInstructions = instructions\n } else if (adminHandler) {\n /** Avoid importMap.js differences when client uploads vary between dev and production. */\n config.admin ??= {}\n config.admin.dependencies ??= {}\n config.admin.dependencies[adminHandler.path] = {\n type: 'component',\n path: adminHandler.path,\n }\n }\n }\n\n const fields = getFields({\n adapter,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n useCompositePrefixes,\n })\n\n const handlers = [\n ...(typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.handlers)\n ? existingCollection.upload.handlers\n : []),\n ]\n\n if (!options.disablePayloadAccessControl) {\n handlers.push(adapter.staticHandler)\n // Public files still need a server path when Payload reads them for a transform.\n } else {\n handlers.push((req, args) => {\n if ('uploadReference' in args.params || args.params.operation === 'transform') {\n return adapter.staticHandler(req, args)\n }\n })\n }\n\n const getSkipSafeFetchSetting = (): AllowList | boolean => {\n const isBooleanTrueSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n existingCollection.upload.skipSafeFetch === true\n\n const isAllowListSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n\n if (isBooleanTrueSkipSafeFetch) {\n return true\n } else if (isAllowListSkipSafeFetch) {\n const existingSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n ? existingCollection.upload.skipSafeFetch\n : []\n\n const hasExactLocalhostMatch = existingSkipSafeFetch.some((entry) => {\n const entryKeys = Object.keys(entry)\n return entryKeys.length === 1 && entry.hostname === 'localhost'\n })\n\n const localhostEntry =\n process.env.NODE_ENV !== 'production' && !hasExactLocalhostMatch\n ? [{ hostname: 'localhost' }]\n : []\n\n return [...existingSkipSafeFetch, ...localhostEntry]\n }\n\n if (process.env.NODE_ENV !== 'production') {\n return [{ hostname: 'localhost' }]\n }\n\n return false\n }\n\n return {\n ...existingCollection,\n fields,\n hooks: {\n ...(existingCollection.hooks || {}),\n afterChange: [\n ...(existingCollection.hooks?.afterChange || []),\n getAfterChangeHook({\n adapter,\n collection: existingCollection,\n collectionPrefix: options.prefix,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n hasCustomFileURL: Boolean(options.generateFileURL),\n useCompositePrefixes,\n }),\n ],\n afterDelete: [\n ...(existingCollection.hooks?.afterDelete || []),\n getAfterDeleteHook({\n adapter,\n collection: existingCollection,\n collectionPrefix: options.prefix,\n useCompositePrefixes,\n }),\n ],\n afterRead: [\n ...(existingCollection.hooks?.afterRead || []),\n ...(options.disablePayloadAccessControl &&\n (options.generateFileURL || adapter.generateURL)\n ? [\n getPublicOriginalURLHook({\n adapter,\n collection: existingCollection,\n generateFileURL: options.generateFileURL,\n }),\n ]\n : []),\n ],\n beforeChange: [\n ...(existingCollection.hooks?.beforeChange || []),\n getNormalizeUploadPrefixHook({\n collectionPrefix: options.prefix,\n useCompositePrefixes,\n }),\n getPreserveFileDataHook(),\n ],\n },\n select: getStorageLocationSelect({ select: existingCollection.select }),\n upload: {\n ...(typeof existingCollection.upload === 'object' ? existingCollection.upload : {}),\n adapter: adapter.name,\n fileOperations: createFileOperations({\n adapter,\n collection: existingCollection,\n collectionPrefix: options.prefix,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n useCompositePrefixes,\n }),\n ...(uploadInstructions && {\n uploadInstructions,\n }),\n disableLocalStorage:\n typeof options.disableLocalStorage === 'boolean' ? options.disableLocalStorage : true,\n handlers,\n skipSafeFetch: getSkipSafeFetchSetting(),\n },\n }\n }\n\n return existingCollection\n })\n\n return {\n ...config,\n collections,\n onInit: async (payload) => {\n // Await each init so a provisioning failure fails Payload startup\n // instead of becoming an unhandled rejection.\n await Promise.all(initFunctions.map((fn) => fn()))\n if (config.onInit) {\n await config.onInit(payload)\n }\n },\n }\n }\n"],"names":["getFields","getAfterChangeHook","getAfterDeleteHook","getNormalizeUploadPrefixHook","getPreserveFileDataHook","getPublicOriginalURLHook","createFileOperations","getStorageLocationSelect","cloudStoragePlugin","pluginOptions","incomingConfig","collections","allCollectionOptions","enabled","useCompositePrefixes","config","map","existingCollection","options","slug","adapter","collection","prefix","undefined","fields","disablePayloadAccessControl","generateFileURL","initFunctions","endpointPaths","Map","onInit","push","uploadInstructions","adminHandler","endpoint","instructions","endpointPath","get","endpointCount","endpoints","filter","path","startsWith","length","handler","method","set","admin","components","providers","clientProps","collectionSlug","props","dependencies","type","handlers","upload","Array","isArray","staticHandler","req","args","params","operation","getSkipSafeFetchSetting","isBooleanTrueSkipSafeFetch","skipSafeFetch","isAllowListSkipSafeFetch","existingSkipSafeFetch","hasExactLocalhostMatch","some","entry","entryKeys","Object","keys","hostname","localhostEntry","process","env","NODE_ENV","hooks","afterChange","collectionPrefix","hasCustomFileURL","Boolean","afterDelete","afterRead","generateURL","beforeChange","select","name","fileOperations","disableLocalStorage","payload","Promise","all","fn"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { CollectionConfig, Field, FileData, ImageSize, PayloadHandler, PayloadRequest, TypeWithID, UploadCollectionSlug, UploadInstructionsAccess, UploadInstructionsCapability } from 'payload';
1
+ import type { CollectionConfig, Field, FileData, FileHandlerOperation, ImageSize, PayloadHandler, PayloadRequest, SanitizedCollectionConfig, TypeWithID, UploadCollectionSlug, UploadInstructionsAccess, UploadInstructionsCapability } from 'payload';
2
+ export type { FileHandlerOperation } from 'payload';
2
3
  export interface File {
3
4
  buffer: Buffer;
4
5
  filename: string;
@@ -10,11 +11,25 @@ export interface File {
10
11
  export type ClientUploadsConfig = {
11
12
  access?: UploadInstructionsAccess;
12
13
  } | boolean;
14
+ /**
15
+ * Reference to a client-uploaded object, returned by an upload handler and
16
+ * submitted with the document. Always carries the signed receipt; `prefix`
17
+ * locates the stored object.
18
+ */
19
+ export type UploadReference = {
20
+ _objectKey?: string;
21
+ prefix: string;
22
+ signedReceipt: `${string}.${string}`;
23
+ };
13
24
  export type HandleUpload = (args: {
14
25
  collection: CollectionConfig;
15
26
  data: any;
16
27
  file: File;
17
28
  req: PayloadRequest;
29
+ /**
30
+ * Pre-resolved storage path (`_objectKey` folded in, contained beneath the collection prefix).
31
+ */
32
+ storageFilePath: string;
18
33
  }) => Partial<FileData & TypeWithID> | Promise<Partial<FileData & TypeWithID>> | Promise<void> | void;
19
34
  export interface TypeWithPrefix {
20
35
  prefix?: string;
@@ -24,7 +39,28 @@ export type HandleDelete = (args: {
24
39
  doc: FileData & TypeWithID & TypeWithPrefix;
25
40
  filename: string;
26
41
  req: PayloadRequest;
42
+ /**
43
+ * Pre-resolved storage path of the object to delete.
44
+ */
45
+ storageFilePath: string;
46
+ }) => Promise<void> | void;
47
+ /** Deletes a stored object without requiring a saved document. */
48
+ export type DeleteFile = (args: {
49
+ collection: CollectionConfig;
50
+ req: PayloadRequest;
51
+ /** Complete storage path, with prefixes and `_objectKey` already resolved. */
52
+ storageFilePath: string;
27
53
  }) => Promise<void> | void;
54
+ /** Complete storage keys are resolved before invoking a provider operation. */
55
+ export type FileOperationArgs = {
56
+ collection: SanitizedCollectionConfig;
57
+ from: string;
58
+ mimeType?: string;
59
+ req: PayloadRequest;
60
+ to: string;
61
+ };
62
+ export type CopyFile = (args: FileOperationArgs) => Promise<void>;
63
+ export type MoveFile = (args: FileOperationArgs) => Promise<void>;
28
64
  export type GenerateURL = (args: {
29
65
  collection: CollectionConfig;
30
66
  data: any;
@@ -37,11 +73,15 @@ export type StaticHandler = (req: PayloadRequest, args: {
37
73
  params: {
38
74
  collection: string;
39
75
  filename: string;
76
+ operation?: FileHandlerOperation;
40
77
  prefix?: string;
41
78
  uploadReference?: unknown;
42
79
  };
43
80
  }) => Promise<Response> | Response;
44
81
  export interface GeneratedAdapter {
82
+ /** Preserve object metadata and fail if `to` already exists. Rename retains `from` for history. */
83
+ copyFile: CopyFile;
84
+ deleteFile: DeleteFile;
45
85
  /**
46
86
  * Additional fields to be injected into the base collection and image sizes
47
87
  */
@@ -52,15 +92,19 @@ export interface GeneratedAdapter {
52
92
  generateURL?: GenerateURL;
53
93
  handleDelete: HandleDelete;
54
94
  handleUpload: HandleUpload;
95
+ moveFile?: MoveFile;
55
96
  name: string;
56
- onInit?: () => void;
97
+ onInit?: () => Promise<void> | void;
57
98
  staticHandler: StaticHandler;
99
+ /** Reads source files by path when staging server-mediated uploads. */
100
+ supportsTempFiles?: boolean;
58
101
  /** Generates upload instructions when supported. */
59
102
  uploadInstructions?: {
60
103
  adminHandler?: {
61
104
  path: string;
62
105
  props?: Record<string, unknown>;
63
106
  };
107
+ enabled: boolean;
64
108
  endpoint?: {
65
109
  handler: PayloadHandler;
66
110
  path: `/${string}`;
@@ -92,16 +136,6 @@ export interface CollectionOptions {
92
136
  prefix?: string;
93
137
  }
94
138
  export interface PluginOptions {
95
- /**
96
- * When enabled, fields (like the prefix field) will always be inserted into
97
- * the collection schema regardless of whether the plugin is enabled. This
98
- * ensures a consistent schema across all environments.
99
- *
100
- * This will be enabled by default in Payload v4.
101
- *
102
- * @default false
103
- */
104
- alwaysInsertFields?: boolean;
105
139
  collections: Partial<Record<UploadCollectionSlug, CollectionOptions>>;
106
140
  /**
107
141
  * Whether or not to enable the plugin
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}