@payloadcms/plugin-cloud-storage 1.1.0 → 1.1.2-beta.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 (272) hide show
  1. package/.eslintrc.js +29 -6
  2. package/README.md +25 -24
  3. package/dist/adapters/azure/generateURL.d.ts +3 -2
  4. package/dist/adapters/azure/generateURL.d.ts.map +1 -0
  5. package/dist/adapters/azure/generateURL.js +19 -14
  6. package/dist/adapters/azure/handleDelete.d.ts +2 -1
  7. package/dist/adapters/azure/handleDelete.d.ts.map +1 -0
  8. package/dist/adapters/azure/handleDelete.js +20 -60
  9. package/dist/adapters/azure/handleUpload.d.ts +1 -0
  10. package/dist/adapters/azure/handleUpload.d.ts.map +1 -0
  11. package/dist/adapters/azure/handleUpload.js +36 -75
  12. package/dist/adapters/azure/index.d.ts +4 -3
  13. package/dist/adapters/azure/index.d.ts.map +1 -0
  14. package/dist/adapters/azure/index.js +51 -38
  15. package/dist/adapters/azure/mock.js +12 -5
  16. package/dist/adapters/azure/staticHandler.d.ts +3 -2
  17. package/dist/adapters/azure/staticHandler.d.ts.map +1 -0
  18. package/dist/adapters/azure/staticHandler.js +39 -78
  19. package/dist/adapters/azure/webpack.d.ts +1 -0
  20. package/dist/adapters/azure/webpack.d.ts.map +1 -0
  21. package/dist/adapters/azure/webpack.js +30 -20
  22. package/dist/adapters/gcs/generateURL.d.ts +4 -3
  23. package/dist/adapters/gcs/generateURL.d.ts.map +1 -0
  24. package/dist/adapters/gcs/generateURL.js +19 -14
  25. package/dist/adapters/gcs/handleDelete.d.ts +4 -3
  26. package/dist/adapters/gcs/handleDelete.d.ts.map +1 -0
  27. package/dist/adapters/gcs/handleDelete.js +20 -58
  28. package/dist/adapters/gcs/handleUpload.d.ts +5 -4
  29. package/dist/adapters/gcs/handleUpload.d.ts.map +1 -0
  30. package/dist/adapters/gcs/handleUpload.js +28 -69
  31. package/dist/adapters/gcs/index.d.ts +4 -3
  32. package/dist/adapters/gcs/index.d.ts.map +1 -0
  33. package/dist/adapters/gcs/index.js +42 -30
  34. package/dist/adapters/gcs/mock.js +12 -5
  35. package/dist/adapters/gcs/staticHandler.d.ts +3 -2
  36. package/dist/adapters/gcs/staticHandler.d.ts.map +1 -0
  37. package/dist/adapters/gcs/staticHandler.js +36 -74
  38. package/dist/adapters/gcs/webpack.d.ts +1 -0
  39. package/dist/adapters/gcs/webpack.d.ts.map +1 -0
  40. package/dist/adapters/gcs/webpack.js +30 -20
  41. package/dist/adapters/s3/generateURL.d.ts +3 -2
  42. package/dist/adapters/s3/generateURL.d.ts.map +1 -0
  43. package/dist/adapters/s3/generateURL.js +19 -14
  44. package/dist/adapters/s3/handleDelete.d.ts +3 -2
  45. package/dist/adapters/s3/handleDelete.d.ts.map +1 -0
  46. package/dist/adapters/s3/handleDelete.js +21 -59
  47. package/dist/adapters/s3/handleUpload.d.ts +5 -4
  48. package/dist/adapters/s3/handleUpload.d.ts.map +1 -0
  49. package/dist/adapters/s3/handleUpload.js +46 -88
  50. package/dist/adapters/s3/index.d.ts +9 -8
  51. package/dist/adapters/s3/index.d.ts.map +1 -0
  52. package/dist/adapters/s3/index.js +79 -51
  53. package/dist/adapters/s3/mock.js +12 -5
  54. package/dist/adapters/s3/staticHandler.d.ts +3 -2
  55. package/dist/adapters/s3/staticHandler.d.ts.map +1 -0
  56. package/dist/adapters/s3/staticHandler.js +42 -78
  57. package/dist/adapters/s3/webpack.d.ts +1 -0
  58. package/dist/adapters/s3/webpack.d.ts.map +1 -0
  59. package/dist/adapters/s3/webpack.js +47 -20
  60. package/dist/admin/fields/getFields.d.ts +1 -0
  61. package/dist/admin/fields/getFields.d.ts.map +1 -0
  62. package/dist/admin/fields/getFields.js +71 -60
  63. package/dist/admin/index.d.ts +1 -0
  64. package/dist/admin/index.d.ts.map +1 -0
  65. package/dist/admin/index.js +30 -30
  66. package/dist/fields/getFields.d.ts +3 -2
  67. package/dist/fields/getFields.d.ts.map +1 -0
  68. package/dist/fields/getFields.js +95 -77
  69. package/dist/hooks/afterDelete.d.ts +4 -4
  70. package/dist/hooks/afterDelete.d.ts.map +1 -0
  71. package/dist/hooks/afterDelete.js +30 -87
  72. package/dist/hooks/afterRead.d.ts +6 -6
  73. package/dist/hooks/afterRead.d.ts.map +1 -0
  74. package/dist/hooks/afterRead.js +29 -76
  75. package/dist/hooks/beforeChange.d.ts +4 -4
  76. package/dist/hooks/beforeChange.d.ts.map +1 -0
  77. package/dist/hooks/beforeChange.js +54 -101
  78. package/dist/index.d.ts +1 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +12 -5
  81. package/dist/plugin.d.ts +1 -0
  82. package/dist/plugin.d.ts.map +1 -0
  83. package/dist/plugin.js +74 -113
  84. package/dist/types.d.ts +12 -11
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +5 -2
  87. package/dist/utilities/getFilePrefix.d.ts +3 -2
  88. package/dist/utilities/getFilePrefix.d.ts.map +1 -0
  89. package/dist/utilities/getFilePrefix.js +29 -76
  90. package/dist/utilities/getIncomingFiles.d.ts +3 -3
  91. package/dist/utilities/getIncomingFiles.d.ts.map +1 -0
  92. package/dist/utilities/getIncomingFiles.js +27 -22
  93. package/dist/utilities/getRangeFromHeader.d.ts +2 -1
  94. package/dist/utilities/getRangeFromHeader.d.ts.map +1 -0
  95. package/dist/utilities/getRangeFromHeader.js +34 -64
  96. package/dist/webpack.d.ts +1 -0
  97. package/dist/webpack.d.ts.map +1 -0
  98. package/dist/webpack.js +33 -33
  99. package/package.json +18 -21
  100. package/.editorconfig +0 -10
  101. package/.gitignore +0 -248
  102. package/.prettierignore +0 -1
  103. package/.prettierrc.js +0 -8
  104. package/.vscode/launch.json +0 -40
  105. package/.vscode/settings.json +0 -9
  106. package/dev/.env +0 -21
  107. package/dev/.env.example +0 -21
  108. package/dev/dist/dev/src/collections/Media.js +0 -56
  109. package/dev/dist/dev/src/collections/Media.js.map +0 -1
  110. package/dev/dist/dev/src/collections/Users.js +0 -23
  111. package/dev/dist/dev/src/collections/Users.js.map +0 -1
  112. package/dev/dist/dev/src/payload.config.js +0 -153
  113. package/dev/dist/dev/src/payload.config.js.map +0 -1
  114. package/dev/dist/dev/src/server.js +0 -26
  115. package/dev/dist/dev/src/server.js.map +0 -1
  116. package/dev/dist/src/adapters/azure/generateURL.js +0 -16
  117. package/dev/dist/src/adapters/azure/generateURL.js.map +0 -1
  118. package/dev/dist/src/adapters/azure/handleDelete.js +0 -64
  119. package/dev/dist/src/adapters/azure/handleDelete.js.map +0 -1
  120. package/dev/dist/src/adapters/azure/handleUpload.js +0 -81
  121. package/dev/dist/src/adapters/azure/handleUpload.js.map +0 -1
  122. package/dev/dist/src/adapters/azure/index.js +0 -43
  123. package/dev/dist/src/adapters/azure/index.js.map +0 -1
  124. package/dev/dist/src/adapters/azure/staticHandler.js +0 -82
  125. package/dev/dist/src/adapters/azure/staticHandler.js.map +0 -1
  126. package/dev/dist/src/adapters/azure/webpack.js +0 -25
  127. package/dev/dist/src/adapters/azure/webpack.js.map +0 -1
  128. package/dev/dist/src/adapters/gcs/generateURL.js +0 -16
  129. package/dev/dist/src/adapters/gcs/generateURL.js.map +0 -1
  130. package/dev/dist/src/adapters/gcs/handleDelete.js +0 -63
  131. package/dev/dist/src/adapters/gcs/handleDelete.js.map +0 -1
  132. package/dev/dist/src/adapters/gcs/handleUpload.js +0 -73
  133. package/dev/dist/src/adapters/gcs/handleUpload.js.map +0 -1
  134. package/dev/dist/src/adapters/gcs/index.js +0 -36
  135. package/dev/dist/src/adapters/gcs/index.js.map +0 -1
  136. package/dev/dist/src/adapters/gcs/staticHandler.js +0 -77
  137. package/dev/dist/src/adapters/gcs/staticHandler.js.map +0 -1
  138. package/dev/dist/src/adapters/gcs/webpack.js +0 -25
  139. package/dev/dist/src/adapters/gcs/webpack.js.map +0 -1
  140. package/dev/dist/src/adapters/s3/generateURL.js +0 -16
  141. package/dev/dist/src/adapters/s3/generateURL.js.map +0 -1
  142. package/dev/dist/src/adapters/s3/handleDelete.js +0 -64
  143. package/dev/dist/src/adapters/s3/handleDelete.js.map +0 -1
  144. package/dev/dist/src/adapters/s3/handleUpload.js +0 -94
  145. package/dev/dist/src/adapters/s3/handleUpload.js.map +0 -1
  146. package/dev/dist/src/adapters/s3/index.js +0 -60
  147. package/dev/dist/src/adapters/s3/index.js.map +0 -1
  148. package/dev/dist/src/adapters/s3/staticHandler.js +0 -82
  149. package/dev/dist/src/adapters/s3/staticHandler.js.map +0 -1
  150. package/dev/dist/src/adapters/s3/webpack.js +0 -25
  151. package/dev/dist/src/adapters/s3/webpack.js.map +0 -1
  152. package/dev/dist/src/fields/getFields.js +0 -119
  153. package/dev/dist/src/fields/getFields.js.map +0 -1
  154. package/dev/dist/src/hooks/afterDelete.js +0 -92
  155. package/dev/dist/src/hooks/afterDelete.js.map +0 -1
  156. package/dev/dist/src/hooks/afterRead.js +0 -80
  157. package/dev/dist/src/hooks/afterRead.js.map +0 -1
  158. package/dev/dist/src/hooks/beforeChange.js +0 -106
  159. package/dev/dist/src/hooks/beforeChange.js.map +0 -1
  160. package/dev/dist/src/index.js +0 -6
  161. package/dev/dist/src/index.js.map +0 -1
  162. package/dev/dist/src/plugin.js +0 -131
  163. package/dev/dist/src/plugin.js.map +0 -1
  164. package/dev/dist/src/types.js +0 -3
  165. package/dev/dist/src/types.js.map +0 -1
  166. package/dev/dist/src/utilities/getFilePrefix.js +0 -81
  167. package/dev/dist/src/utilities/getFilePrefix.js.map +0 -1
  168. package/dev/dist/src/utilities/getIncomingFiles.js +0 -38
  169. package/dev/dist/src/utilities/getIncomingFiles.js.map +0 -1
  170. package/dev/dist/src/utilities/getRangeFromHeader.js +0 -67
  171. package/dev/dist/src/utilities/getRangeFromHeader.js.map +0 -1
  172. package/dev/dist/src/webpack.js +0 -40
  173. package/dev/dist/src/webpack.js.map +0 -1
  174. package/dev/nodemon.json +0 -8
  175. package/dev/package.json +0 -34
  176. package/dev/src/collections/Media.ts +0 -56
  177. package/dev/src/collections/Users.ts +0 -23
  178. package/dev/src/mocks/fsMock.js +0 -1
  179. package/dev/src/mocks/promisifyMock.js +0 -1
  180. package/dev/src/payload.config.ts +0 -123
  181. package/dev/src/server.ts +0 -26
  182. package/dev/tmp/tmp-1-1688568985997 +0 -0
  183. package/dev/tmp/tmp-2-1687546883112 +0 -0
  184. package/dev/tsconfig.json +0 -20
  185. package/dist/adapters/azure/generateURL.js.map +0 -1
  186. package/dist/adapters/azure/handleDelete.js.map +0 -1
  187. package/dist/adapters/azure/handleUpload.js.map +0 -1
  188. package/dist/adapters/azure/index.js.map +0 -1
  189. package/dist/adapters/azure/mock.d.ts +0 -1
  190. package/dist/adapters/azure/mock.js.map +0 -1
  191. package/dist/adapters/azure/staticHandler.js.map +0 -1
  192. package/dist/adapters/azure/webpack.js.map +0 -1
  193. package/dist/adapters/gcs/generateURL.js.map +0 -1
  194. package/dist/adapters/gcs/handleDelete.js.map +0 -1
  195. package/dist/adapters/gcs/handleUpload.js.map +0 -1
  196. package/dist/adapters/gcs/index.js.map +0 -1
  197. package/dist/adapters/gcs/mock.d.ts +0 -1
  198. package/dist/adapters/gcs/mock.js.map +0 -1
  199. package/dist/adapters/gcs/staticHandler.js.map +0 -1
  200. package/dist/adapters/gcs/webpack.js.map +0 -1
  201. package/dist/adapters/s3/generateURL.js.map +0 -1
  202. package/dist/adapters/s3/handleDelete.js.map +0 -1
  203. package/dist/adapters/s3/handleUpload.js.map +0 -1
  204. package/dist/adapters/s3/index.js.map +0 -1
  205. package/dist/adapters/s3/mock.d.ts +0 -1
  206. package/dist/adapters/s3/mock.js.map +0 -1
  207. package/dist/adapters/s3/staticHandler.js.map +0 -1
  208. package/dist/adapters/s3/webpack.js.map +0 -1
  209. package/dist/admin/fields/getFields.js.map +0 -1
  210. package/dist/admin/index.js.map +0 -1
  211. package/dist/fields/getFields.js.map +0 -1
  212. package/dist/hooks/afterDelete.js.map +0 -1
  213. package/dist/hooks/afterRead.js.map +0 -1
  214. package/dist/hooks/beforeChange.js.map +0 -1
  215. package/dist/index.js.map +0 -1
  216. package/dist/plugin.js.map +0 -1
  217. package/dist/types.js.map +0 -1
  218. package/dist/utilities/getFilePrefix.js.map +0 -1
  219. package/dist/utilities/getIncomingFiles.js.map +0 -1
  220. package/dist/utilities/getRangeFromHeader.js.map +0 -1
  221. package/dist/webpack.js.map +0 -1
  222. package/docs/local-dev.md +0 -47
  223. package/eslint-config/index.js +0 -15
  224. package/eslint-config/rules/import.js +0 -38
  225. package/eslint-config/rules/prettier.js +0 -7
  226. package/eslint-config/rules/style.js +0 -21
  227. package/eslint-config/rules/typescript.js +0 -628
  228. package/src/adapters/azure/emulator/docker-compose.yml +0 -16
  229. package/src/adapters/azure/generateURL.ts +0 -13
  230. package/src/adapters/azure/handleDelete.ts +0 -16
  231. package/src/adapters/azure/handleUpload.ts +0 -43
  232. package/src/adapters/azure/index.ts +0 -48
  233. package/src/adapters/azure/mock.js +0 -1
  234. package/src/adapters/azure/staticHandler.ts +0 -38
  235. package/src/adapters/azure/webpack.ts +0 -21
  236. package/src/adapters/gcs/emulator/docker-compose.yml +0 -15
  237. package/src/adapters/gcs/generateURL.ts +0 -16
  238. package/src/adapters/gcs/handleDelete.ts +0 -16
  239. package/src/adapters/gcs/handleUpload.ts +0 -36
  240. package/src/adapters/gcs/index.ts +0 -40
  241. package/src/adapters/gcs/mock.js +0 -1
  242. package/src/adapters/gcs/staticHandler.ts +0 -34
  243. package/src/adapters/gcs/webpack.ts +0 -21
  244. package/src/adapters/s3/emulator/.localstack/cache/machine.json +0 -1
  245. package/src/adapters/s3/emulator/.localstack/cache/server.test.pem +0 -127
  246. package/src/adapters/s3/emulator/.localstack/cache/server.test.pem.crt +0 -99
  247. package/src/adapters/s3/emulator/.localstack/cache/server.test.pem.key +0 -28
  248. package/src/adapters/s3/emulator/.localstack/cache/service-catalog-2_1_1_dev-1_29_149.pickle +0 -0
  249. package/src/adapters/s3/emulator/docker-compose.yml +0 -15
  250. package/src/adapters/s3/generateURL.ts +0 -14
  251. package/src/adapters/s3/handleDelete.ts +0 -17
  252. package/src/adapters/s3/handleUpload.ts +0 -62
  253. package/src/adapters/s3/index.ts +0 -48
  254. package/src/adapters/s3/mock.js +0 -1
  255. package/src/adapters/s3/staticHandler.ts +0 -41
  256. package/src/adapters/s3/webpack.ts +0 -21
  257. package/src/admin/fields/getFields.ts +0 -126
  258. package/src/admin/index.ts +0 -39
  259. package/src/fields/getFields.ts +0 -155
  260. package/src/hooks/afterDelete.ts +0 -35
  261. package/src/hooks/afterRead.ts +0 -38
  262. package/src/hooks/beforeChange.ts +0 -59
  263. package/src/index.ts +0 -1
  264. package/src/plugin.ts +0 -101
  265. package/src/types.ts +0 -79
  266. package/src/utilities/getFilePrefix.ts +0 -26
  267. package/src/utilities/getIncomingFiles.ts +0 -44
  268. package/src/utilities/getRangeFromHeader.ts +0 -27
  269. package/src/webpack.ts +0 -48
  270. package/tsconfig.json +0 -23
  271. package/yarn-error.log +0 -8163
  272. package/yarn.lock +0 -8062
@@ -1,17 +0,0 @@
1
- import path from 'path'
2
- import type * as AWS from '@aws-sdk/client-s3'
3
- import type { HandleDelete } from '../../types'
4
-
5
- interface Args {
6
- getStorageClient: () => AWS.S3
7
- bucket: string
8
- }
9
-
10
- export const getHandleDelete = ({ getStorageClient, bucket }: Args): HandleDelete => {
11
- return async ({ filename, doc: { prefix = '' } }) => {
12
- await getStorageClient().deleteObject({
13
- Bucket: bucket,
14
- Key: path.posix.join(prefix, filename),
15
- })
16
- }
17
- }
@@ -1,62 +0,0 @@
1
- import fs from 'fs'
2
- import path from 'path'
3
- import type * as AWS from '@aws-sdk/client-s3'
4
- import type { CollectionConfig } from 'payload/types'
5
- import type stream from 'stream'
6
-
7
- import { Upload } from '@aws-sdk/lib-storage'
8
- import type { HandleUpload } from '../../types'
9
-
10
- interface Args {
11
- collection: CollectionConfig
12
- bucket: string
13
- acl?: 'private' | 'public-read'
14
- prefix?: string
15
- getStorageClient: () => AWS.S3
16
- }
17
-
18
- const multipartThreshold = 1024 * 1024 * 50 // 50MB
19
-
20
- export const getHandleUpload = ({
21
- getStorageClient,
22
- bucket,
23
- acl,
24
- prefix = '',
25
- }: Args): HandleUpload => {
26
- return async ({ data, file }) => {
27
- const fileKey = path.posix.join(data.prefix || prefix, file.filename)
28
-
29
- const fileBufferOrStream: Buffer | stream.Readable = file.tempFilePath
30
- ? fs.createReadStream(file.tempFilePath)
31
- : file.buffer
32
-
33
- if (file.buffer.length > 0 && file.buffer.length < multipartThreshold) {
34
- await getStorageClient().putObject({
35
- Bucket: bucket,
36
- Key: fileKey,
37
- Body: fileBufferOrStream,
38
- ACL: acl,
39
- ContentType: file.mimeType,
40
- })
41
-
42
- return data
43
- }
44
-
45
- const parallelUploadS3 = new Upload({
46
- client: getStorageClient(),
47
- params: {
48
- Bucket: bucket,
49
- Key: fileKey,
50
- Body: fileBufferOrStream,
51
- ACL: acl,
52
- ContentType: file.mimeType,
53
- },
54
- queueSize: 4,
55
- partSize: multipartThreshold,
56
- })
57
-
58
- await parallelUploadS3.done()
59
-
60
- return data
61
- }
62
- }
@@ -1,48 +0,0 @@
1
- import * as AWS from '@aws-sdk/client-s3'
2
- import type { Adapter, GeneratedAdapter } from '../../types'
3
- import { getGenerateURL } from './generateURL'
4
- import { getHandler } from './staticHandler'
5
- import { getHandleDelete } from './handleDelete'
6
- import { getHandleUpload } from './handleUpload'
7
- import { extendWebpackConfig } from './webpack'
8
-
9
- export interface Args {
10
- /**
11
- * AWS S3 client configuration. Highly dependent on your AWS setup.
12
- *
13
- * [AWS.S3ClientConfig Docs](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html)
14
- */
15
- config: AWS.S3ClientConfig
16
- /**
17
- * Bucket name to upload files to.
18
- *
19
- * Must follow [AWS S3 bucket naming conventions](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).
20
- */
21
- bucket: string
22
- acl?: 'private' | 'public-read'
23
- }
24
-
25
- export const s3Adapter =
26
- ({ config = {}, bucket, acl }: Args): Adapter =>
27
- ({ collection, prefix }): GeneratedAdapter => {
28
- let storageClient: AWS.S3 | null = null
29
- const getStorageClient: () => AWS.S3 = () => {
30
- if (storageClient) return storageClient
31
- storageClient = new AWS.S3(config)
32
- return storageClient
33
- }
34
-
35
- return {
36
- handleUpload: getHandleUpload({
37
- collection,
38
- getStorageClient,
39
- bucket,
40
- acl,
41
- prefix,
42
- }),
43
- handleDelete: getHandleDelete({ getStorageClient, bucket }),
44
- generateURL: getGenerateURL({ bucket, config }),
45
- staticHandler: getHandler({ bucket, getStorageClient, collection }),
46
- webpack: extendWebpackConfig,
47
- }
48
- }
@@ -1 +0,0 @@
1
- export const s3Adapter = () => ({})
@@ -1,41 +0,0 @@
1
- import path from 'path'
2
- import type { Readable } from 'stream'
3
- import type * as AWS from '@aws-sdk/client-s3'
4
- import type { CollectionConfig } from 'payload/types'
5
- import type { StaticHandler } from '../../types'
6
- import { getFilePrefix } from '../../utilities/getFilePrefix'
7
-
8
- interface Args {
9
- getStorageClient: () => AWS.S3
10
- bucket: string
11
- collection: CollectionConfig
12
- }
13
-
14
- export const getHandler = ({ getStorageClient, bucket, collection }: Args): StaticHandler => {
15
- return async (req, res, next) => {
16
- try {
17
- const prefix = await getFilePrefix({ req, collection })
18
-
19
- const object = await getStorageClient().getObject({
20
- Bucket: bucket,
21
- Key: path.posix.join(prefix, req.params.filename),
22
- })
23
-
24
- res.set({
25
- 'Accept-Ranges': object.AcceptRanges,
26
- 'Content-Length': object.ContentLength,
27
- 'Content-Type': object.ContentType,
28
- ETag: object.ETag,
29
- })
30
-
31
- if (object?.Body) {
32
- return (object.Body as Readable).pipe(res)
33
- }
34
-
35
- return next()
36
- } catch (err: unknown) {
37
- req.payload.logger.error(err)
38
- return next()
39
- }
40
- }
41
- }
@@ -1,21 +0,0 @@
1
- import type { Configuration as WebpackConfig } from 'webpack'
2
- import path from 'path'
3
-
4
- export const extendWebpackConfig = (existingWebpackConfig: WebpackConfig): WebpackConfig => {
5
- const newConfig: WebpackConfig = {
6
- ...existingWebpackConfig,
7
- resolve: {
8
- ...(existingWebpackConfig.resolve || {}),
9
- fallback: {
10
- ...(existingWebpackConfig.resolve?.fallback ? existingWebpackConfig.resolve.fallback : {}),
11
- stream: false,
12
- },
13
- alias: {
14
- ...(existingWebpackConfig.resolve?.alias ? existingWebpackConfig.resolve.alias : {}),
15
- '@payloadcms/plugin-cloud-storage/s3': path.resolve(__dirname, './mock.js'),
16
- },
17
- },
18
- }
19
-
20
- return newConfig
21
- }
@@ -1,126 +0,0 @@
1
- import path from 'path'
2
- import type { GroupField, TextField } from 'payload/dist/fields/config/types'
3
- import type { CollectionConfig, Field } from 'payload/types'
4
-
5
- interface Args {
6
- collection: CollectionConfig
7
- prefix?: string
8
- }
9
-
10
- export const getFields = ({ collection, prefix }: Args): Field[] => {
11
- const baseURLField: Field = {
12
- name: 'url',
13
- label: 'URL',
14
- type: 'text',
15
- admin: {
16
- readOnly: true,
17
- hidden: true,
18
- },
19
- }
20
-
21
- const basePrefixField: Field = {
22
- name: 'prefix',
23
- type: 'text',
24
- admin: {
25
- readOnly: true,
26
- hidden: true,
27
- },
28
- }
29
-
30
- const fields = [...collection.fields]
31
-
32
- // Inject a hook into all URL fields to generate URLs
33
-
34
- let existingURLFieldIndex = -1
35
-
36
- const existingURLField = fields.find((existingField, i) => {
37
- if ('name' in existingField && existingField.name === 'url') {
38
- existingURLFieldIndex = i
39
- return true
40
- }
41
- return false
42
- }) as TextField
43
-
44
- if (existingURLFieldIndex > -1) {
45
- fields.splice(existingURLFieldIndex, 1)
46
- }
47
-
48
- fields.push({
49
- ...baseURLField,
50
- ...(existingURLField || {}),
51
- })
52
-
53
- if (typeof collection.upload === 'object' && collection.upload.imageSizes) {
54
- let existingSizesFieldIndex = -1
55
-
56
- const existingSizesField = fields.find((existingField, i) => {
57
- if ('name' in existingField && existingField.name === 'sizes') {
58
- existingSizesFieldIndex = i
59
- return true
60
- }
61
-
62
- return false
63
- }) as GroupField
64
-
65
- if (existingSizesFieldIndex > -1) {
66
- fields.splice(existingSizesFieldIndex, 1)
67
- }
68
-
69
- const sizesField: Field = {
70
- ...(existingSizesField || {}),
71
- name: 'sizes',
72
- type: 'group',
73
- admin: {
74
- hidden: true,
75
- },
76
- fields: collection.upload.imageSizes.map(size => {
77
- const existingSizeField = existingSizesField?.fields.find(
78
- existingField => 'name' in existingField && existingField.name === size.name,
79
- ) as GroupField
80
-
81
- const existingSizeURLField = existingSizeField?.fields.find(
82
- existingField => 'name' in existingField && existingField.name === 'url',
83
- ) as GroupField
84
-
85
- return {
86
- ...existingSizeField,
87
- name: size.name,
88
- type: 'group',
89
- fields: [
90
- {
91
- ...(existingSizeURLField || {}),
92
- ...baseURLField,
93
- },
94
- ],
95
- }
96
- }),
97
- }
98
-
99
- fields.push(sizesField)
100
- }
101
-
102
- // If prefix is enabled, save it to db
103
- if (typeof prefix !== 'undefined') {
104
- let existingPrefixFieldIndex = -1
105
-
106
- const existingPrefixField = fields.find((existingField, i) => {
107
- if ('name' in existingField && existingField.name === 'prefix') {
108
- existingPrefixFieldIndex = i
109
- return true
110
- }
111
- return false
112
- }) as TextField
113
-
114
- if (existingPrefixFieldIndex > -1) {
115
- fields.splice(existingPrefixFieldIndex, 1)
116
- }
117
-
118
- fields.push({
119
- ...basePrefixField,
120
- ...(existingPrefixField || {}),
121
- defaultValue: path.posix.join(prefix),
122
- })
123
- }
124
-
125
- return fields
126
- }
@@ -1,39 +0,0 @@
1
- import type { Config } from 'payload/config'
2
- import type { PluginOptions } from '../types'
3
- import { getFields } from './fields/getFields'
4
-
5
- // This is the admin plugin cloud-storage stubfile.
6
- // It only extends the config that are required by the admin UI.
7
-
8
- export const cloudStorage =
9
- (pluginOptions: PluginOptions) =>
10
- (incomingConfig: Config): Config => {
11
- const { collections: allCollectionOptions, enabled } = pluginOptions
12
- const config = { ...incomingConfig }
13
-
14
- // Return early if disabled. Only webpack config mods are applied.
15
- if (enabled === false) {
16
- return config
17
- }
18
-
19
- return {
20
- ...config,
21
- collections: (config.collections || []).map(existingCollection => {
22
- const options = allCollectionOptions[existingCollection.slug]
23
-
24
- if (options?.adapter) {
25
- const fields = getFields({
26
- collection: existingCollection,
27
- prefix: options.prefix,
28
- })
29
-
30
- return {
31
- ...existingCollection,
32
- fields,
33
- }
34
- }
35
-
36
- return existingCollection
37
- }),
38
- }
39
- }
@@ -1,155 +0,0 @@
1
- import path from 'path'
2
- import type { GroupField, TextField } from 'payload/dist/fields/config/types'
3
- import type { CollectionConfig, Field } from 'payload/types'
4
- import { getAfterReadHook } from '../hooks/afterRead'
5
- import type { GeneratedAdapter, GenerateFileURL } from '../types'
6
-
7
- interface Args {
8
- collection: CollectionConfig
9
- disablePayloadAccessControl?: true
10
- generateFileURL?: GenerateFileURL
11
- prefix?: string
12
- adapter: GeneratedAdapter
13
- }
14
-
15
- export const getFields = ({
16
- adapter,
17
- collection,
18
- disablePayloadAccessControl,
19
- generateFileURL,
20
- prefix,
21
- }: Args): Field[] => {
22
- const baseURLField: Field = {
23
- name: 'url',
24
- label: 'URL',
25
- type: 'text',
26
- admin: {
27
- readOnly: true,
28
- hidden: true,
29
- },
30
- }
31
-
32
- const basePrefixField: Field = {
33
- name: 'prefix',
34
- type: 'text',
35
- admin: {
36
- readOnly: true,
37
- hidden: true,
38
- },
39
- }
40
-
41
- const fields = [...collection.fields]
42
-
43
- // Inject a hook into all URL fields to generate URLs
44
-
45
- let existingURLFieldIndex = -1
46
-
47
- const existingURLField = fields.find((existingField, i) => {
48
- if ('name' in existingField && existingField.name === 'url') {
49
- existingURLFieldIndex = i
50
- return true
51
- }
52
- return false
53
- }) as TextField
54
-
55
- if (existingURLFieldIndex > -1) {
56
- fields.splice(existingURLFieldIndex, 1)
57
- }
58
-
59
- fields.push({
60
- ...baseURLField,
61
- ...(existingURLField || {}),
62
- hooks: {
63
- afterRead: [
64
- getAfterReadHook({ adapter, collection, disablePayloadAccessControl, generateFileURL }),
65
- ...(existingURLField?.hooks?.afterRead || []),
66
- ],
67
- },
68
- })
69
-
70
- if (typeof collection.upload === 'object' && collection.upload.imageSizes) {
71
- let existingSizesFieldIndex = -1
72
-
73
- const existingSizesField = fields.find((existingField, i) => {
74
- if ('name' in existingField && existingField.name === 'sizes') {
75
- existingSizesFieldIndex = i
76
- return true
77
- }
78
-
79
- return false
80
- }) as GroupField
81
-
82
- if (existingSizesFieldIndex > -1) {
83
- fields.splice(existingSizesFieldIndex, 1)
84
- }
85
-
86
- const sizesField: Field = {
87
- ...(existingSizesField || {}),
88
- name: 'sizes',
89
- type: 'group',
90
- admin: {
91
- hidden: true,
92
- },
93
- fields: collection.upload.imageSizes.map(size => {
94
- const existingSizeField = existingSizesField?.fields.find(
95
- existingField => 'name' in existingField && existingField.name === size.name,
96
- ) as GroupField
97
-
98
- const existingSizeURLField = existingSizeField?.fields.find(
99
- existingField => 'name' in existingField && existingField.name === 'url',
100
- ) as GroupField
101
-
102
- return {
103
- ...existingSizeField,
104
- name: size.name,
105
- type: 'group',
106
- fields: [
107
- {
108
- ...(existingSizeURLField || {}),
109
- ...baseURLField,
110
- hooks: {
111
- afterRead: [
112
- getAfterReadHook({
113
- adapter,
114
- collection,
115
- size,
116
- disablePayloadAccessControl,
117
- generateFileURL,
118
- }),
119
- ...(existingSizeURLField?.hooks?.afterRead || []),
120
- ],
121
- },
122
- },
123
- ],
124
- }
125
- }),
126
- }
127
-
128
- fields.push(sizesField)
129
- }
130
-
131
- // If prefix is enabled, save it to db
132
- if (typeof prefix !== 'undefined') {
133
- let existingPrefixFieldIndex = -1
134
-
135
- const existingPrefixField = fields.find((existingField, i) => {
136
- if ('name' in existingField && existingField.name === 'prefix') {
137
- existingPrefixFieldIndex = i
138
- return true
139
- }
140
- return false
141
- }) as TextField
142
-
143
- if (existingPrefixFieldIndex > -1) {
144
- fields.splice(existingPrefixFieldIndex, 1)
145
- }
146
-
147
- fields.push({
148
- ...basePrefixField,
149
- ...(existingPrefixField || {}),
150
- defaultValue: path.posix.join(prefix),
151
- })
152
- }
153
-
154
- return fields
155
- }
@@ -1,35 +0,0 @@
1
- import type { TypeWithID } from 'payload/dist/globals/config/types'
2
- import type { FileData } from 'payload/dist/uploads/types'
3
- import type { CollectionAfterDeleteHook, CollectionConfig } from 'payload/types'
4
- import type { GeneratedAdapter, TypeWithPrefix } from '../types'
5
-
6
- interface Args {
7
- collection: CollectionConfig
8
- adapter: GeneratedAdapter
9
- }
10
-
11
- export const getAfterDeleteHook = ({
12
- collection,
13
- adapter,
14
- }: Args): CollectionAfterDeleteHook<FileData & TypeWithID & TypeWithPrefix> => {
15
- return async ({ req, doc }) => {
16
- try {
17
- const filesToDelete: string[] = [
18
- doc.filename,
19
- ...Object.values(doc?.sizes || []).map(resizedFileData => resizedFileData?.filename),
20
- ]
21
-
22
- const promises = filesToDelete.map(async filename => {
23
- if (filename) await adapter.handleDelete({ collection, doc, req, filename })
24
- })
25
-
26
- await Promise.all(promises)
27
- } catch (err: unknown) {
28
- req.payload.logger.error(
29
- `There was an error while deleting files corresponding to the ${collection.labels?.singular} with ID ${doc.id}:`,
30
- )
31
- req.payload.logger.error(err)
32
- }
33
- return doc
34
- }
35
- }
@@ -1,38 +0,0 @@
1
- import type { ImageSize } from 'payload/dist/uploads/types'
2
- import type { CollectionConfig, FieldHook } from 'payload/types'
3
- import type { GeneratedAdapter, GenerateFileURL } from '../types'
4
-
5
- interface Args {
6
- collection: CollectionConfig
7
- adapter: GeneratedAdapter
8
- disablePayloadAccessControl?: boolean
9
- size?: ImageSize
10
- generateFileURL?: GenerateFileURL
11
- }
12
-
13
- export const getAfterReadHook =
14
- ({ collection, adapter, size, disablePayloadAccessControl, generateFileURL }: Args): FieldHook =>
15
- async ({ data, value }) => {
16
- const filename = size ? data?.sizes?.[size.name]?.filename : data?.filename
17
- const prefix = data?.prefix
18
- let url = value
19
-
20
- if (disablePayloadAccessControl && filename) {
21
- url = await adapter.generateURL({
22
- collection,
23
- filename,
24
- prefix,
25
- })
26
- }
27
-
28
- if (generateFileURL) {
29
- url = await generateFileURL({
30
- collection,
31
- filename,
32
- prefix,
33
- size,
34
- })
35
- }
36
-
37
- return url
38
- }
@@ -1,59 +0,0 @@
1
- import type { TypeWithID } from 'payload/dist/collections/config/types'
2
- import type { FileData } from 'payload/dist/uploads/types'
3
- import type { CollectionBeforeChangeHook, CollectionConfig } from 'payload/types'
4
- import type { GeneratedAdapter } from '../types'
5
- import { getIncomingFiles } from '../utilities/getIncomingFiles'
6
-
7
- interface Args {
8
- collection: CollectionConfig
9
- adapter: GeneratedAdapter
10
- }
11
-
12
- export const getBeforeChangeHook =
13
- ({ collection, adapter }: Args): CollectionBeforeChangeHook<FileData & TypeWithID> =>
14
- async ({ req, data, originalDoc }) => {
15
- try {
16
- const files = getIncomingFiles({ req, data })
17
-
18
- if (files.length > 0) {
19
- // If there is an original doc,
20
- // And we have new files,
21
- // We need to delete the old files before uploading new
22
- if (originalDoc) {
23
- let filesToDelete: string[] = []
24
-
25
- if (typeof originalDoc?.filename === 'string') {
26
- filesToDelete.push(originalDoc.filename)
27
- }
28
-
29
- if (typeof originalDoc.sizes === 'object') {
30
- filesToDelete = filesToDelete.concat(
31
- Object.values(originalDoc?.sizes || []).map(
32
- resizedFileData => resizedFileData?.filename,
33
- ),
34
- )
35
- }
36
-
37
- const deletionPromises = filesToDelete.map(async filename => {
38
- if (filename) {
39
- await adapter.handleDelete({ collection, doc: originalDoc, req, filename })
40
- }
41
- })
42
-
43
- await Promise.all(deletionPromises)
44
- }
45
-
46
- const promises = files.map(async file => {
47
- await adapter.handleUpload({ collection, data, req, file })
48
- })
49
-
50
- await Promise.all(promises)
51
- }
52
- } catch (err: unknown) {
53
- req.payload.logger.error(
54
- `There was an error while uploading files corresponding to the collection ${collection.slug} with filename ${data.filename}:`,
55
- )
56
- req.payload.logger.error(err)
57
- }
58
- return data
59
- }
package/src/index.ts DELETED
@@ -1 +0,0 @@
1
- export { cloudStorage } from './plugin'