@payloadcms/plugin-cloud-storage 1.0.15 → 1.0.17-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 (214) hide show
  1. package/.editorconfig +10 -10
  2. package/.eslintrc.js +14 -14
  3. package/.gitignore +248 -248
  4. package/.prettierignore +1 -1
  5. package/.prettierrc.js +8 -8
  6. package/.vscode/launch.json +40 -28
  7. package/.vscode/settings.json +9 -9
  8. package/LICENSE.md +22 -22
  9. package/README.md +196 -178
  10. package/azure.d.ts +1 -1
  11. package/azure.js +1 -1
  12. package/dev/.env +11 -15
  13. package/dev/.env.example +21 -21
  14. package/dev/nodemon.json +8 -8
  15. package/dev/package.json +34 -32
  16. package/dev/src/collections/Media.ts +56 -56
  17. package/dev/src/collections/Users.ts +23 -23
  18. package/dev/src/mocks/fsMock.js +1 -1
  19. package/dev/src/mocks/promisifyMock.js +1 -1
  20. package/dev/src/payload.config.ts +111 -111
  21. package/dev/src/server.ts +26 -26
  22. package/dev/tsconfig.json +20 -20
  23. package/dist/adapters/azure/fileStub.d.ts +2 -2
  24. package/dist/adapters/azure/fileStub.js +3 -3
  25. package/dist/adapters/azure/generateURL.d.ts +7 -7
  26. package/dist/adapters/azure/generateURL.js +15 -15
  27. package/dist/adapters/azure/handleDelete.d.ts +9 -9
  28. package/dist/adapters/azure/handleDelete.js +63 -63
  29. package/dist/adapters/azure/handleUpload.d.ts +10 -10
  30. package/dist/adapters/azure/handleUpload.js +80 -80
  31. package/dist/adapters/azure/index.d.ts +8 -8
  32. package/dist/adapters/azure/index.js +42 -42
  33. package/dist/adapters/azure/index.js.map +1 -1
  34. package/dist/adapters/azure/mock.d.ts +13 -13
  35. package/dist/adapters/azure/mock.js +12 -12
  36. package/dist/adapters/azure/staticHandler.d.ts +9 -9
  37. package/dist/adapters/azure/staticHandler.js +81 -81
  38. package/dist/adapters/azure/webpack.d.ts +2 -2
  39. package/dist/adapters/azure/webpack.js +24 -24
  40. package/dist/adapters/azure/webpack.js.map +1 -1
  41. package/dist/adapters/gcs/generateURL.d.ts +8 -8
  42. package/dist/adapters/gcs/generateURL.js +15 -15
  43. package/dist/adapters/gcs/handleDelete.d.ts +8 -8
  44. package/dist/adapters/gcs/handleDelete.js +62 -62
  45. package/dist/adapters/gcs/handleUpload.d.ts +12 -12
  46. package/dist/adapters/gcs/handleUpload.js +72 -72
  47. package/dist/adapters/gcs/index.d.ts +8 -8
  48. package/dist/adapters/gcs/index.js +35 -35
  49. package/dist/adapters/gcs/mock.d.ts +1 -1
  50. package/dist/adapters/gcs/mock.js +4 -4
  51. package/dist/adapters/gcs/staticHandler.d.ts +10 -10
  52. package/dist/adapters/gcs/staticHandler.js +76 -76
  53. package/dist/adapters/gcs/webpack.d.ts +2 -2
  54. package/dist/adapters/gcs/webpack.js +24 -24
  55. package/dist/adapters/gcs/webpack.js.map +1 -1
  56. package/dist/adapters/s3/fileStub.d.ts +2 -2
  57. package/dist/adapters/s3/fileStub.js +3 -3
  58. package/dist/adapters/s3/generateURL.d.ts +8 -8
  59. package/dist/adapters/s3/generateURL.js +15 -15
  60. package/dist/adapters/s3/handleDelete.d.ts +8 -8
  61. package/dist/adapters/s3/handleDelete.js +63 -63
  62. package/dist/adapters/s3/handleUpload.d.ts +12 -12
  63. package/dist/adapters/s3/handleUpload.js +93 -93
  64. package/dist/adapters/s3/index.d.ts +8 -8
  65. package/dist/adapters/s3/index.js +59 -59
  66. package/dist/adapters/s3/mock.d.ts +8 -8
  67. package/dist/adapters/s3/mock.js +9 -9
  68. package/dist/adapters/s3/staticHandler.d.ts +10 -10
  69. package/dist/adapters/s3/staticHandler.js +81 -80
  70. package/dist/adapters/s3/staticHandler.js.map +1 -1
  71. package/dist/adapters/s3/webpack.d.ts +2 -2
  72. package/dist/adapters/s3/webpack.js +24 -24
  73. package/dist/adapters/s3/webpack.js.map +1 -1
  74. package/dist/fields/getFields.d.ts +11 -11
  75. package/dist/fields/getFields.js +118 -118
  76. package/dist/hooks/afterDelete.d.ts +10 -10
  77. package/dist/hooks/afterDelete.js +91 -88
  78. package/dist/hooks/afterDelete.js.map +1 -1
  79. package/dist/hooks/afterRead.d.ts +12 -12
  80. package/dist/hooks/afterRead.js +79 -79
  81. package/dist/hooks/beforeChange.d.ts +10 -10
  82. package/dist/hooks/beforeChange.js +105 -77
  83. package/dist/hooks/beforeChange.js.map +1 -1
  84. package/dist/index.d.ts +1 -1
  85. package/dist/index.js +5 -5
  86. package/dist/plugin.d.ts +3 -3
  87. package/dist/plugin.js +130 -124
  88. package/dist/plugin.js.map +1 -1
  89. package/dist/types.d.ts +68 -62
  90. package/dist/types.js +2 -2
  91. package/dist/utilities/getFilePrefix.d.ts +5 -5
  92. package/dist/utilities/getFilePrefix.js +80 -80
  93. package/dist/utilities/getIncomingFiles.d.ts +7 -7
  94. package/dist/utilities/getIncomingFiles.js +37 -37
  95. package/dist/utilities/getRangeFromHeader.d.ts +6 -6
  96. package/dist/utilities/getRangeFromHeader.js +66 -66
  97. package/dist/webpack.d.ts +9 -9
  98. package/dist/webpack.js +39 -39
  99. package/docs/local-dev.md +47 -47
  100. package/eslint-config/index.js +15 -15
  101. package/eslint-config/rules/import.js +38 -38
  102. package/eslint-config/rules/prettier.js +7 -7
  103. package/eslint-config/rules/style.js +21 -21
  104. package/eslint-config/rules/typescript.js +628 -628
  105. package/gcs.d.ts +1 -1
  106. package/gcs.js +1 -1
  107. package/package.json +67 -67
  108. package/s3.d.ts +1 -1
  109. package/s3.js +1 -1
  110. package/src/adapters/azure/emulator/docker-compose.yml +16 -16
  111. package/src/adapters/azure/fileStub.js +1 -1
  112. package/src/adapters/azure/generateURL.ts +13 -13
  113. package/src/adapters/azure/handleDelete.ts +16 -16
  114. package/src/adapters/azure/handleUpload.ts +41 -41
  115. package/src/adapters/azure/index.ts +48 -47
  116. package/src/adapters/azure/mock.js +13 -13
  117. package/src/adapters/azure/staticHandler.ts +38 -38
  118. package/src/adapters/azure/webpack.ts +24 -20
  119. package/src/adapters/gcs/emulator/docker-compose.yml +15 -15
  120. package/src/adapters/gcs/generateURL.ts +16 -16
  121. package/src/adapters/gcs/handleDelete.ts +16 -16
  122. package/src/adapters/gcs/handleUpload.ts +34 -34
  123. package/src/adapters/gcs/index.ts +37 -37
  124. package/src/adapters/gcs/mock.js +3 -3
  125. package/src/adapters/gcs/staticHandler.ts +34 -34
  126. package/src/adapters/gcs/webpack.ts +21 -17
  127. package/src/adapters/s3/emulator/.localstack/cache/machine.json +1 -0
  128. package/src/adapters/s3/emulator/.localstack/cache/server.test.pem +127 -0
  129. package/src/adapters/s3/emulator/.localstack/cache/server.test.pem.crt +99 -0
  130. package/src/adapters/s3/emulator/.localstack/cache/server.test.pem.key +28 -0
  131. package/src/adapters/s3/emulator/.localstack/cache/service-catalog-2_1_1_dev-1_29_149.pickle +0 -0
  132. package/src/adapters/s3/emulator/docker-compose.yml +15 -15
  133. package/src/adapters/s3/generateURL.ts +14 -14
  134. package/src/adapters/s3/handleDelete.ts +17 -17
  135. package/src/adapters/s3/index.ts +38 -38
  136. package/src/adapters/s3/mock.js +9 -9
  137. package/src/adapters/s3/staticHandler.ts +41 -40
  138. package/src/adapters/s3/webpack.ts +4 -0
  139. package/src/fields/getFields.ts +155 -155
  140. package/src/hooks/afterDelete.ts +35 -35
  141. package/src/hooks/afterRead.ts +38 -38
  142. package/src/hooks/beforeChange.ts +59 -30
  143. package/src/index.ts +1 -1
  144. package/src/plugin.ts +101 -94
  145. package/src/types.ts +79 -73
  146. package/src/utilities/getFilePrefix.ts +26 -26
  147. package/src/utilities/getIncomingFiles.ts +44 -44
  148. package/src/utilities/getRangeFromHeader.ts +27 -27
  149. package/src/webpack.ts +46 -46
  150. package/tsconfig.json +23 -23
  151. package/yarn-error.log +8163 -0
  152. package/yarn.lock +8062 -8155
  153. package/.idea/.gitignore +0 -5
  154. package/.idea/httpRequests/2023-04-07T152957.206.png +0 -0
  155. package/.idea/httpRequests/2023-04-07T153025.403.html +0 -10
  156. package/.idea/httpRequests/2023-04-07T153146.200.png +0 -0
  157. package/.idea/httpRequests/http-client.cookies +0 -1
  158. package/.idea/httpRequests/http-requests-log.http +0 -74
  159. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  160. package/.idea/jsLinters/eslint.xml +0 -6
  161. package/.idea/modules.xml +0 -8
  162. package/.idea/plugin-cloud-storage.iml +0 -12
  163. package/.idea/vcs.xml +0 -6
  164. package/.idea/workspace.xml +0 -269
  165. package/dev/build/127.d2c2ffcfff69fabfdd1b.js +0 -1
  166. package/dev/build/16.17dbe03b1d0a96f3e564.js +0 -2
  167. package/dev/build/16.17dbe03b1d0a96f3e564.js.LICENSE.txt +0 -8
  168. package/dev/build/171.bbcbae3ea90468ad0cad.js +0 -2
  169. package/dev/build/171.bbcbae3ea90468ad0cad.js.LICENSE.txt +0 -8
  170. package/dev/build/18.e50c27edff6716f930d9.js +0 -1
  171. package/dev/build/205.33c7a29683ba98de93e0.js +0 -1
  172. package/dev/build/2211c49456cd07331ea9.woff +0 -0
  173. package/dev/build/234.79395f82c18207c13766.js +0 -1
  174. package/dev/build/266.9d4a240b3e0985bd7dd5.js +0 -1
  175. package/dev/build/296.4c5d646257b42c915834.js +0 -1
  176. package/dev/build/304.40dbe690de322c8f7c0d.js +0 -2
  177. package/dev/build/304.40dbe690de322c8f7c0d.js.LICENSE.txt +0 -37
  178. package/dev/build/349.446c12bffd3905085fdb.js +0 -1
  179. package/dev/build/354.5acd04b85b96a9839125.js +0 -1
  180. package/dev/build/40ad7515b8674bb854a1.woff2 +0 -0
  181. package/dev/build/422.086542466cdc9f6a2437.js +0 -2
  182. package/dev/build/422.086542466cdc9f6a2437.js.LICENSE.txt +0 -6
  183. package/dev/build/491.0bfe1bb0ecfe383179aa.js +0 -1
  184. package/dev/build/4d8845b830f4e8e2affb.png +0 -0
  185. package/dev/build/51922ceb71da289688d3.woff2 +0 -0
  186. package/dev/build/522443364fda49e9e0ed.woff2 +0 -0
  187. package/dev/build/531.1c6f53f3b44a3c45b444.js +0 -2
  188. package/dev/build/531.1c6f53f3b44a3c45b444.js.LICENSE.txt +0 -6
  189. package/dev/build/570.f2d9b99706765fbf0225.js +0 -1
  190. package/dev/build/599.570a04990d5806004f61.js +0 -1
  191. package/dev/build/5b718d9772de251a8c0a.woff2 +0 -0
  192. package/dev/build/778.41ae26bcd617861ad586.js +0 -1
  193. package/dev/build/783.0117995f2ff6036d6746.js +0 -1
  194. package/dev/build/787999a6af6a17efbc7c.woff +0 -0
  195. package/dev/build/78b8935fb481e11c92ce.woff +0 -0
  196. package/dev/build/860.7688681d3269f3f16e9a.js +0 -1
  197. package/dev/build/892.1a4ca5ac67d81038ceec.js +0 -1
  198. package/dev/build/896.d8cb1160388dc29d6364.js +0 -1
  199. package/dev/build/8b4ddd0d08500553efde.woff +0 -0
  200. package/dev/build/8f612153248094525d9d.woff +0 -0
  201. package/dev/build/995.cc11e738ff81a85821b4.js +0 -1
  202. package/dev/build/9c7dfd0036f7bd24b053.woff2 +0 -0
  203. package/dev/build/a1cfdc5b5250b7c4b481.woff2 +0 -0
  204. package/dev/build/d7aeda9e48ce098e7b48.woff +0 -0
  205. package/dev/build/e009f21405b4d7e89367.woff2 +0 -0
  206. package/dev/build/e7caa9e17af6ac87d182.woff +0 -0
  207. package/dev/build/ebcc1430049fddb274f8.svg +0 -15
  208. package/dev/build/efe8f6a3b46446cc9135.woff +0 -0
  209. package/dev/build/f53bb8d4b29adc903703.woff2 +0 -0
  210. package/dev/build/index.html +0 -1
  211. package/dev/build/main.a2003d502fbb9aaa3e8d.js +0 -2
  212. package/dev/build/main.a2003d502fbb9aaa3e8d.js.LICENSE.txt +0 -57
  213. package/dev/build/styles.css +0 -1
  214. package/dev/build/styles.fa29d16b0baf5b98a1cf.js +0 -1
package/gcs.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './dist/adapters/gcs'
1
+ export * from './dist/adapters/gcs'
package/gcs.js CHANGED
@@ -1 +1 @@
1
- exports.gcsAdapter = require('./dist/adapters/gcs').gcsAdapter
1
+ exports.gcsAdapter = require('./dist/adapters/gcs').gcsAdapter
package/package.json CHANGED
@@ -1,67 +1,67 @@
1
- {
2
- "name": "@payloadcms/plugin-cloud-storage",
3
- "description": "The official cloud storage plugin for Payload CMS",
4
- "version": "1.0.15",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "license": "MIT",
8
- "scripts": {
9
- "build": "tsc",
10
- "lint": "eslint src",
11
- "lint:fix": "eslint --fix --ext .ts,.tsx src",
12
- "clean": "rimraf dist && rimraf dev/yarn.lock",
13
- "prepublishOnly": "yarn clean && yarn build"
14
- },
15
- "peerDependencies": {
16
- "@aws-sdk/client-s3": "^3.142.0",
17
- "@aws-sdk/lib-storage": "^3.267.0",
18
- "@azure/storage-blob": "^12.11.0",
19
- "@google-cloud/storage": "^6.4.1",
20
- "payload": "^1.0.27"
21
- },
22
- "peerDependenciesMeta": {
23
- "@aws-sdk/client-s3": {
24
- "optional": true
25
- },
26
- "@aws-sdk/lib-storage": {
27
- "optional": true
28
- },
29
- "@azure/storage-blob": {
30
- "optional": true
31
- },
32
- "@google-cloud/storage": {
33
- "optional": true
34
- }
35
- },
36
- "files": [
37
- "dist",
38
- "*.js",
39
- "*.d.ts",
40
- "!.prettierrc.js"
41
- ],
42
- "devDependencies": {
43
- "@aws-sdk/client-s3": "^3.142.0",
44
- "@aws-sdk/lib-storage": "^3.267.0",
45
- "@azure/storage-blob": "^12.11.0",
46
- "@google-cloud/storage": "^6.4.1",
47
- "@types/express": "^4.17.9",
48
- "@typescript-eslint/eslint-plugin": "5.12.1",
49
- "@typescript-eslint/parser": "5.12.1",
50
- "cross-env": "^7.0.3",
51
- "dotenv": "^8.2.0",
52
- "eslint": "^8.19.0",
53
- "eslint-config-airbnb-base": "^14.2.1",
54
- "eslint-config-prettier": "^8.5.0",
55
- "eslint-plugin-import": "2.25.4",
56
- "eslint-plugin-prettier": "^4.0.0",
57
- "nodemon": "^2.0.6",
58
- "payload": "^1.6.6",
59
- "prettier": "^2.7.1",
60
- "rimraf": "^4.1.2",
61
- "ts-node": "^9.1.1",
62
- "typescript": "^4.1.3"
63
- },
64
- "dependencies": {
65
- "range-parser": "^1.2.1"
66
- }
67
- }
1
+ {
2
+ "name": "@payloadcms/plugin-cloud-storage",
3
+ "description": "The official cloud storage plugin for Payload CMS",
4
+ "version": "1.0.17-beta.0",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "license": "MIT",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "lint": "eslint src",
11
+ "lint:fix": "eslint --fix --ext .ts,.tsx src",
12
+ "clean": "rimraf dist && rimraf dev/yarn.lock",
13
+ "prepublishOnly": "yarn clean && yarn build"
14
+ },
15
+ "peerDependencies": {
16
+ "@aws-sdk/client-s3": "^3.142.0",
17
+ "@aws-sdk/lib-storage": "^3.267.0",
18
+ "@azure/storage-blob": "^12.11.0",
19
+ "@google-cloud/storage": "^6.4.1",
20
+ "payload": "^1.7.2"
21
+ },
22
+ "peerDependenciesMeta": {
23
+ "@aws-sdk/client-s3": {
24
+ "optional": true
25
+ },
26
+ "@aws-sdk/lib-storage": {
27
+ "optional": true
28
+ },
29
+ "@azure/storage-blob": {
30
+ "optional": true
31
+ },
32
+ "@google-cloud/storage": {
33
+ "optional": true
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "*.js",
39
+ "*.d.ts",
40
+ "!.prettierrc.js"
41
+ ],
42
+ "devDependencies": {
43
+ "@aws-sdk/client-s3": "^3.142.0",
44
+ "@aws-sdk/lib-storage": "^3.267.0",
45
+ "@azure/storage-blob": "^12.11.0",
46
+ "@google-cloud/storage": "^6.4.1",
47
+ "@types/express": "^4.17.9",
48
+ "@typescript-eslint/eslint-plugin": "5.12.1",
49
+ "@typescript-eslint/parser": "5.12.1",
50
+ "cross-env": "^7.0.3",
51
+ "dotenv": "^8.2.0",
52
+ "eslint": "^8.19.0",
53
+ "eslint-config-airbnb-base": "^14.2.1",
54
+ "eslint-config-prettier": "^8.5.0",
55
+ "eslint-plugin-import": "2.25.4",
56
+ "eslint-plugin-prettier": "^4.0.0",
57
+ "nodemon": "^2.0.6",
58
+ "payload": "^1.7.2",
59
+ "prettier": "^2.7.1",
60
+ "rimraf": "^4.1.2",
61
+ "ts-node": "^9.1.1",
62
+ "typescript": "^4.1.3"
63
+ },
64
+ "dependencies": {
65
+ "range-parser": "^1.2.1"
66
+ }
67
+ }
package/s3.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './dist/adapters/s3'
1
+ export * from './dist/adapters/s3'
package/s3.js CHANGED
@@ -1 +1 @@
1
- exports.s3Adapter = require('./dist/adapters/s3').s3Adapter
1
+ exports.s3Adapter = require('./dist/adapters/s3').s3Adapter
@@ -1,16 +1,16 @@
1
- version: "3"
2
-
3
- services:
4
- azure-storage:
5
- image: mcr.microsoft.com/azure-storage/azurite:3.18.0
6
- restart: always
7
- command: "azurite --loose --blobHost 0.0.0.0 --tableHost 0.0.0.0 --queueHost 0.0.0.0"
8
- ports:
9
- - "10000:10000"
10
- - "10001:10001"
11
- - "10002:10002"
12
- volumes:
13
- - ./azurestoragedata:/data"
14
-
15
- volumes:
16
- azurestoragedata:
1
+ version: "3"
2
+
3
+ services:
4
+ azure-storage:
5
+ image: mcr.microsoft.com/azure-storage/azurite:3.18.0
6
+ restart: always
7
+ command: "azurite --loose --blobHost 0.0.0.0 --tableHost 0.0.0.0 --queueHost 0.0.0.0"
8
+ ports:
9
+ - "10000:10000"
10
+ - "10001:10001"
11
+ - "10002:10002"
12
+ volumes:
13
+ - ./azurestoragedata:/data"
14
+
15
+ volumes:
16
+ azurestoragedata:
@@ -1 +1 @@
1
- export default 'file-stub'
1
+ export default 'file-stub'
@@ -1,13 +1,13 @@
1
- import path from 'path'
2
- import type { GenerateURL } from '../../types'
3
-
4
- interface Args {
5
- containerName: string
6
- baseURL: string
7
- }
8
-
9
- export const getGenerateURL =
10
- ({ containerName, baseURL }: Args): GenerateURL =>
11
- ({ filename, prefix = '' }) => {
12
- return `${baseURL}/${containerName}/${path.posix.join(prefix, filename)}`
13
- }
1
+ import path from 'path'
2
+ import type { GenerateURL } from '../../types'
3
+
4
+ interface Args {
5
+ containerName: string
6
+ baseURL: string
7
+ }
8
+
9
+ export const getGenerateURL =
10
+ ({ containerName, baseURL }: Args): GenerateURL =>
11
+ ({ filename, prefix = '' }) => {
12
+ return `${baseURL}/${containerName}/${path.posix.join(prefix, filename)}`
13
+ }
@@ -1,16 +1,16 @@
1
- import path from 'path'
2
- import type { CollectionConfig } from 'payload/types'
3
- import type { ContainerClient } from '@azure/storage-blob'
4
- import type { HandleDelete } from '../../types'
5
-
6
- interface Args {
7
- collection: CollectionConfig
8
- getStorageClient: () => ContainerClient
9
- }
10
-
11
- export const getHandleDelete = ({ getStorageClient }: Args): HandleDelete => {
12
- return async ({ filename, doc: { prefix = '' } }) => {
13
- const blockBlobClient = getStorageClient().getBlockBlobClient(path.posix.join(prefix, filename))
14
- await blockBlobClient.deleteIfExists()
15
- }
16
- }
1
+ import path from 'path'
2
+ import type { CollectionConfig } from 'payload/types'
3
+ import type { ContainerClient } from '@azure/storage-blob'
4
+ import type { HandleDelete } from '../../types'
5
+
6
+ interface Args {
7
+ collection: CollectionConfig
8
+ getStorageClient: () => ContainerClient
9
+ }
10
+
11
+ export const getHandleDelete = ({ getStorageClient }: Args): HandleDelete => {
12
+ return async ({ filename, doc: { prefix = '' } }) => {
13
+ const blockBlobClient = getStorageClient().getBlockBlobClient(path.posix.join(prefix, filename))
14
+ await blockBlobClient.deleteIfExists()
15
+ }
16
+ }
@@ -1,41 +1,41 @@
1
- import path from 'path'
2
- import fs from 'fs'
3
- import { Readable } from 'stream'
4
- import type { ContainerClient } from '@azure/storage-blob'
5
- import { AbortController } from '@azure/abort-controller'
6
- import type { CollectionConfig } from 'payload/types'
7
- import type { HandleUpload } from '../../types'
8
-
9
- interface Args {
10
- collection: CollectionConfig
11
- getStorageClient: () => ContainerClient
12
- prefix?: string
13
- }
14
-
15
- const multipartThreshold = 1024 * 1024 * 50 // 50MB
16
- export const getHandleUpload = ({ getStorageClient, prefix = '' }: Args): HandleUpload => {
17
- return async ({ data, file }) => {
18
- const blockBlobClient = getStorageClient().getBlockBlobClient(
19
- path.posix.join(prefix, file.filename),
20
- )
21
-
22
- // when there are no temp files, or the upload is less than the threshold size, do not stream files
23
- if (!file.tempFilePath && file.buffer.length > 0 && file.buffer.length < multipartThreshold) {
24
- await blockBlobClient.upload(file.buffer, file.buffer.byteLength, {
25
- blobHTTPHeaders: { blobContentType: file.mimeType },
26
- })
27
-
28
- return data
29
- }
30
-
31
- const fileBufferOrStream: Readable = file.tempFilePath
32
- ? fs.createReadStream(file.tempFilePath)
33
- : Readable.from(file.buffer)
34
-
35
- await blockBlobClient.uploadStream(fileBufferOrStream, 4 * 1024 * 1024, 4, {
36
- abortSignal: AbortController.timeout(30 * 60 * 1000),
37
- })
38
-
39
- return data
40
- }
41
- }
1
+ import path from 'path'
2
+ import fs from 'fs'
3
+ import { Readable } from 'stream'
4
+ import type { ContainerClient } from '@azure/storage-blob'
5
+ import { AbortController } from '@azure/abort-controller'
6
+ import type { CollectionConfig } from 'payload/types'
7
+ import type { HandleUpload } from '../../types'
8
+
9
+ interface Args {
10
+ collection: CollectionConfig
11
+ getStorageClient: () => ContainerClient
12
+ prefix?: string
13
+ }
14
+
15
+ const multipartThreshold = 1024 * 1024 * 50 // 50MB
16
+ export const getHandleUpload = ({ getStorageClient, prefix = '' }: Args): HandleUpload => {
17
+ return async ({ data, file }) => {
18
+ const blockBlobClient = getStorageClient().getBlockBlobClient(
19
+ path.posix.join(prefix, file.filename),
20
+ )
21
+
22
+ // when there are no temp files, or the upload is less than the threshold size, do not stream files
23
+ if (!file.tempFilePath && file.buffer.length > 0 && file.buffer.length < multipartThreshold) {
24
+ await blockBlobClient.upload(file.buffer, file.buffer.byteLength, {
25
+ blobHTTPHeaders: { blobContentType: file.mimeType },
26
+ })
27
+
28
+ return data
29
+ }
30
+
31
+ const fileBufferOrStream: Readable = file.tempFilePath
32
+ ? fs.createReadStream(file.tempFilePath)
33
+ : Readable.from(file.buffer)
34
+
35
+ await blockBlobClient.uploadStream(fileBufferOrStream, 4 * 1024 * 1024, 4, {
36
+ abortSignal: AbortController.timeout(30 * 60 * 1000),
37
+ })
38
+
39
+ return data
40
+ }
41
+ }
@@ -1,47 +1,48 @@
1
- import { BlobServiceClient, ContainerClient } from '@azure/storage-blob'
2
- import type { Adapter, GeneratedAdapter } from '../../types'
3
- import { getHandler } from './staticHandler'
4
- import { getGenerateURL } from './generateURL'
5
- import { getHandleDelete } from './handleDelete'
6
- import { getHandleUpload } from './handleUpload'
7
- import { extendWebpackConfig } from './webpack'
8
-
9
- export interface Args {
10
- connectionString: string
11
- containerName: string
12
- baseURL: string
13
- allowContainerCreate: boolean
14
- }
15
-
16
- export const azureBlobStorageAdapter = ({
17
- connectionString,
18
- allowContainerCreate,
19
- containerName,
20
- baseURL,
21
- }: Args): Adapter => {
22
- let storageClient: ContainerClient | null = null
23
- const getStorageClient = () => {
24
- if (storageClient) return storageClient
25
- const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString)
26
- return (storageClient = blobServiceClient.getContainerClient(containerName))
27
- }
28
-
29
- const createContainerIfNotExists = () => {
30
- getStorageClient().createIfNotExists({ access: 'blob' })
31
- }
32
-
33
- return ({ collection, prefix }): GeneratedAdapter => {
34
- return {
35
- handleUpload: getHandleUpload({
36
- collection,
37
- getStorageClient,
38
- prefix,
39
- }),
40
- handleDelete: getHandleDelete({ collection, getStorageClient }),
41
- generateURL: getGenerateURL({ containerName, baseURL }),
42
- staticHandler: getHandler({ getStorageClient, collection }),
43
- webpack: extendWebpackConfig,
44
- ...(allowContainerCreate && { onInit: createContainerIfNotExists }),
45
- }
46
- }
47
- }
1
+ import type { ContainerClient } from '@azure/storage-blob'
2
+ import { BlobServiceClient } from '@azure/storage-blob'
3
+ import type { Adapter, GeneratedAdapter } from '../../types'
4
+ import { getHandler } from './staticHandler'
5
+ import { getGenerateURL } from './generateURL'
6
+ import { getHandleDelete } from './handleDelete'
7
+ import { getHandleUpload } from './handleUpload'
8
+ import { extendWebpackConfig } from './webpack'
9
+
10
+ export interface Args {
11
+ connectionString: string
12
+ containerName: string
13
+ baseURL: string
14
+ allowContainerCreate: boolean
15
+ }
16
+
17
+ export const azureBlobStorageAdapter = ({
18
+ connectionString,
19
+ allowContainerCreate,
20
+ containerName,
21
+ baseURL,
22
+ }: Args): Adapter => {
23
+ let storageClient: ContainerClient | null = null
24
+ const getStorageClient = () => {
25
+ if (storageClient) return storageClient
26
+ const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString)
27
+ return (storageClient = blobServiceClient.getContainerClient(containerName))
28
+ }
29
+
30
+ const createContainerIfNotExists = () => {
31
+ getStorageClient().createIfNotExists({ access: 'blob' })
32
+ }
33
+
34
+ return ({ collection, prefix }): GeneratedAdapter => {
35
+ return {
36
+ handleUpload: getHandleUpload({
37
+ collection,
38
+ getStorageClient,
39
+ prefix,
40
+ }),
41
+ handleDelete: getHandleDelete({ collection, getStorageClient }),
42
+ generateURL: getGenerateURL({ containerName, baseURL }),
43
+ staticHandler: getHandler({ getStorageClient, collection }),
44
+ webpack: extendWebpackConfig,
45
+ ...(allowContainerCreate && { onInit: createContainerIfNotExists }),
46
+ }
47
+ }
48
+ }
@@ -1,13 +1,13 @@
1
- exports.BlobServiceClient = {
2
- fromConnectionString: () => ({
3
- getContainerClient: () => ({
4
- createIfNotExists: () => null,
5
- }),
6
- }),
7
- }
8
-
9
- exports.AbortController = {
10
- timeout: () => null,
11
- }
12
-
13
- exports.Readable = { from: () => null }
1
+ exports.BlobServiceClient = {
2
+ fromConnectionString: () => ({
3
+ getContainerClient: () => ({
4
+ createIfNotExists: () => null,
5
+ }),
6
+ }),
7
+ }
8
+
9
+ exports.AbortController = {
10
+ timeout: () => null,
11
+ }
12
+
13
+ exports.Readable = { from: () => null }
@@ -1,38 +1,38 @@
1
- import type { ContainerClient } from '@azure/storage-blob'
2
- import path from 'path'
3
- import type { CollectionConfig } from 'payload/types'
4
- import type { StaticHandler } from '../../types'
5
- import { getFilePrefix } from '../../utilities/getFilePrefix'
6
- import getRangeFromHeader from '../../utilities/getRangeFromHeader'
7
-
8
- interface Args {
9
- getStorageClient: () => ContainerClient
10
- collection: CollectionConfig
11
- }
12
-
13
- export const getHandler = ({ getStorageClient, collection }: Args): StaticHandler => {
14
- return async (req, res, next) => {
15
- try {
16
- const prefix = await getFilePrefix({ req, collection })
17
- const blockBlobClient = getStorageClient().getBlockBlobClient(
18
- path.posix.join(prefix, req.params.filename),
19
- )
20
-
21
- const { start, end } = await getRangeFromHeader(blockBlobClient, req.headers.range)
22
-
23
- const blob = await blockBlobClient.download(start, end)
24
- // eslint-disable-next-line no-underscore-dangle
25
- const response = blob._response
26
- res.header(response.headers.rawHeaders())
27
- res.status(response.status)
28
-
29
- if (blob?.readableStreamBody) {
30
- return blob.readableStreamBody.pipe(res)
31
- }
32
-
33
- return next()
34
- } catch (err: unknown) {
35
- return next()
36
- }
37
- }
38
- }
1
+ import type { ContainerClient } from '@azure/storage-blob'
2
+ import path from 'path'
3
+ import type { CollectionConfig } from 'payload/types'
4
+ import type { StaticHandler } from '../../types'
5
+ import { getFilePrefix } from '../../utilities/getFilePrefix'
6
+ import getRangeFromHeader from '../../utilities/getRangeFromHeader'
7
+
8
+ interface Args {
9
+ getStorageClient: () => ContainerClient
10
+ collection: CollectionConfig
11
+ }
12
+
13
+ export const getHandler = ({ getStorageClient, collection }: Args): StaticHandler => {
14
+ return async (req, res, next) => {
15
+ try {
16
+ const prefix = await getFilePrefix({ req, collection })
17
+ const blockBlobClient = getStorageClient().getBlockBlobClient(
18
+ path.posix.join(prefix, req.params.filename),
19
+ )
20
+
21
+ const { start, end } = await getRangeFromHeader(blockBlobClient, req.headers.range)
22
+
23
+ const blob = await blockBlobClient.download(start, end)
24
+ // eslint-disable-next-line no-underscore-dangle
25
+ const response = blob._response
26
+ res.header(response.headers.rawHeaders())
27
+ res.status(response.status)
28
+
29
+ if (blob?.readableStreamBody) {
30
+ return blob.readableStreamBody.pipe(res)
31
+ }
32
+
33
+ return next()
34
+ } catch (err: unknown) {
35
+ return next()
36
+ }
37
+ }
38
+ }
@@ -1,20 +1,24 @@
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
- alias: {
10
- ...(existingWebpackConfig.resolve?.alias ? existingWebpackConfig.resolve.alias : {}),
11
- stream: path.resolve(__dirname, './mock.js'),
12
- '@azure/storage-blob': path.resolve(__dirname, './mock.js'),
13
- '@azure/abort-controller': path.resolve(__dirname, './mock.js'),
14
- fs: path.resolve(__dirname, './fileStub.js'),
15
- },
16
- },
17
- }
18
-
19
- return newConfig
20
- }
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
+ stream: path.resolve(__dirname, './mock.js'),
16
+ '@azure/storage-blob': path.resolve(__dirname, './mock.js'),
17
+ '@azure/abort-controller': path.resolve(__dirname, './mock.js'),
18
+ fs: path.resolve(__dirname, './fileStub.js'),
19
+ },
20
+ },
21
+ }
22
+
23
+ return newConfig
24
+ }
@@ -1,15 +1,15 @@
1
- version: "3"
2
-
3
- services:
4
- google-cloud-storage:
5
- image: fsouza/fake-gcs-server
6
- restart: always
7
- command: ["-scheme", "http", "-port", "4443", "-public-host", "http://localhost:4443", "-external-url", "http://localhost:4443", "-backend", "memory"]
8
- ports:
9
- - "4443:4443"
10
- volumes:
11
- - ./google-cloud-storage/payload-bucket:/data/payload-bucket
12
-
13
- volumes:
14
- google-cloud-storage:
15
-
1
+ version: "3"
2
+
3
+ services:
4
+ google-cloud-storage:
5
+ image: fsouza/fake-gcs-server
6
+ restart: always
7
+ command: ["-scheme", "http", "-port", "4443", "-public-host", "http://localhost:4443", "-external-url", "http://localhost:4443", "-backend", "memory"]
8
+ ports:
9
+ - "4443:4443"
10
+ volumes:
11
+ - ./google-cloud-storage/payload-bucket:/data/payload-bucket
12
+
13
+ volumes:
14
+ google-cloud-storage:
15
+
@@ -1,16 +1,16 @@
1
- import path from 'path'
2
- import { Storage } from '@google-cloud/storage'
3
- import type { GenerateURL } from '../../types'
4
-
5
- interface Args {
6
- getStorageClient: () => Storage
7
- bucket: string
8
- }
9
-
10
- export const getGenerateURL =
11
- ({ getStorageClient, bucket }: Args): GenerateURL =>
12
- ({ filename, prefix = '' }) => {
13
- return decodeURIComponent(
14
- getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename)).publicUrl(),
15
- )
16
- }
1
+ import path from 'path'
2
+ import { Storage } from '@google-cloud/storage'
3
+ import type { GenerateURL } from '../../types'
4
+
5
+ interface Args {
6
+ getStorageClient: () => Storage
7
+ bucket: string
8
+ }
9
+
10
+ export const getGenerateURL =
11
+ ({ getStorageClient, bucket }: Args): GenerateURL =>
12
+ ({ filename, prefix = '' }) => {
13
+ return decodeURIComponent(
14
+ getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename)).publicUrl(),
15
+ )
16
+ }