@payloadcms/plugin-cloud-storage 1.0.16 → 1.0.17-beta.1
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.
- package/.editorconfig +10 -0
- package/.gitignore +248 -0
- package/.prettierignore +1 -0
- package/.prettierrc.js +8 -0
- package/.vscode/launch.json +40 -0
- package/.vscode/settings.json +9 -0
- package/README.md +20 -2
- package/dev/.env +21 -0
- package/dev/.env.example +21 -0
- package/dev/dist/dev/src/collections/Media.js +56 -0
- package/dev/dist/dev/src/collections/Media.js.map +1 -0
- package/dev/dist/dev/src/collections/Users.js +23 -0
- package/dev/dist/dev/src/collections/Users.js.map +1 -0
- package/dev/dist/dev/src/payload.config.js +153 -0
- package/dev/dist/dev/src/payload.config.js.map +1 -0
- package/dev/dist/dev/src/server.js +26 -0
- package/dev/dist/dev/src/server.js.map +1 -0
- package/dev/dist/src/adapters/azure/generateURL.js +16 -0
- package/dev/dist/src/adapters/azure/generateURL.js.map +1 -0
- package/dev/dist/src/adapters/azure/handleDelete.js +64 -0
- package/dev/dist/src/adapters/azure/handleDelete.js.map +1 -0
- package/dev/dist/src/adapters/azure/handleUpload.js +81 -0
- package/dev/dist/src/adapters/azure/handleUpload.js.map +1 -0
- package/dev/dist/src/adapters/azure/index.js +43 -0
- package/dev/dist/src/adapters/azure/index.js.map +1 -0
- package/dev/dist/src/adapters/azure/staticHandler.js +82 -0
- package/dev/dist/src/adapters/azure/staticHandler.js.map +1 -0
- package/dev/dist/src/adapters/azure/webpack.js +25 -0
- package/dev/dist/src/adapters/azure/webpack.js.map +1 -0
- package/dev/dist/src/adapters/gcs/generateURL.js +16 -0
- package/dev/dist/src/adapters/gcs/generateURL.js.map +1 -0
- package/dev/dist/src/adapters/gcs/handleDelete.js +63 -0
- package/dev/dist/src/adapters/gcs/handleDelete.js.map +1 -0
- package/dev/dist/src/adapters/gcs/handleUpload.js +73 -0
- package/dev/dist/src/adapters/gcs/handleUpload.js.map +1 -0
- package/dev/dist/src/adapters/gcs/index.js +36 -0
- package/dev/dist/src/adapters/gcs/index.js.map +1 -0
- package/dev/dist/src/adapters/gcs/staticHandler.js +77 -0
- package/dev/dist/src/adapters/gcs/staticHandler.js.map +1 -0
- package/dev/dist/src/adapters/gcs/webpack.js +25 -0
- package/dev/dist/src/adapters/gcs/webpack.js.map +1 -0
- package/dev/dist/src/adapters/s3/generateURL.js +16 -0
- package/dev/dist/src/adapters/s3/generateURL.js.map +1 -0
- package/dev/dist/src/adapters/s3/handleDelete.js +64 -0
- package/dev/dist/src/adapters/s3/handleDelete.js.map +1 -0
- package/dev/dist/src/adapters/s3/handleUpload.js +94 -0
- package/dev/dist/src/adapters/s3/handleUpload.js.map +1 -0
- package/dev/dist/src/adapters/s3/index.js +60 -0
- package/dev/dist/src/adapters/s3/index.js.map +1 -0
- package/dev/dist/src/adapters/s3/staticHandler.js +82 -0
- package/dev/dist/src/adapters/s3/staticHandler.js.map +1 -0
- package/dev/dist/src/adapters/s3/webpack.js +25 -0
- package/dev/dist/src/adapters/s3/webpack.js.map +1 -0
- package/dev/dist/src/fields/getFields.js +119 -0
- package/dev/dist/src/fields/getFields.js.map +1 -0
- package/dev/dist/src/hooks/afterDelete.js +92 -0
- package/dev/dist/src/hooks/afterDelete.js.map +1 -0
- package/dev/dist/src/hooks/afterRead.js +80 -0
- package/dev/dist/src/hooks/afterRead.js.map +1 -0
- package/dev/dist/src/hooks/beforeChange.js +106 -0
- package/dev/dist/src/hooks/beforeChange.js.map +1 -0
- package/dev/dist/src/index.js +6 -0
- package/dev/dist/src/index.js.map +1 -0
- package/dev/dist/src/plugin.js +131 -0
- package/dev/dist/src/plugin.js.map +1 -0
- package/dev/dist/src/types.js +3 -0
- package/dev/dist/src/types.js.map +1 -0
- package/dev/dist/src/utilities/getFilePrefix.js +81 -0
- package/dev/dist/src/utilities/getFilePrefix.js.map +1 -0
- package/dev/dist/src/utilities/getIncomingFiles.js +38 -0
- package/dev/dist/src/utilities/getIncomingFiles.js.map +1 -0
- package/dev/dist/src/utilities/getRangeFromHeader.js +67 -0
- package/dev/dist/src/utilities/getRangeFromHeader.js.map +1 -0
- package/dev/dist/src/webpack.js +40 -0
- package/dev/dist/src/webpack.js.map +1 -0
- package/dev/nodemon.json +8 -0
- package/dev/package.json +34 -0
- package/dev/src/collections/Media.ts +56 -0
- package/dev/src/collections/Users.ts +23 -0
- package/dev/src/mocks/fsMock.js +1 -0
- package/dev/src/mocks/promisifyMock.js +1 -0
- package/dev/src/payload.config.ts +111 -0
- package/dev/src/server.ts +26 -0
- package/dev/tsconfig.json +20 -0
- package/dist/adapters/s3/fsMock.d.ts +3 -0
- package/dist/adapters/s3/fsMock.js +3 -0
- package/dist/adapters/s3/fsMock.js.map +1 -0
- package/dist/adapters/s3/webpack.js +1 -1
- package/dist/adapters/s3/webpack.js.map +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.js +10 -4
- package/dist/plugin.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/docs/local-dev.md +47 -0
- package/eslint-config/index.js +15 -0
- package/eslint-config/rules/import.js +38 -0
- package/eslint-config/rules/prettier.js +7 -0
- package/eslint-config/rules/style.js +21 -0
- package/eslint-config/rules/typescript.js +628 -0
- package/package.json +1 -1
- package/src/adapters/azure/emulator/docker-compose.yml +16 -0
- package/src/adapters/azure/fileStub.js +1 -0
- package/src/adapters/azure/generateURL.ts +13 -0
- package/src/adapters/azure/handleDelete.ts +16 -0
- package/src/adapters/azure/handleUpload.ts +41 -0
- package/src/adapters/azure/index.ts +48 -0
- package/src/adapters/azure/mock.js +13 -0
- package/src/adapters/azure/staticHandler.ts +38 -0
- package/src/adapters/azure/webpack.ts +24 -0
- package/src/adapters/gcs/emulator/docker-compose.yml +15 -0
- package/src/adapters/gcs/generateURL.ts +16 -0
- package/src/adapters/gcs/handleDelete.ts +16 -0
- package/src/adapters/gcs/handleUpload.ts +34 -0
- package/src/adapters/gcs/index.ts +37 -0
- package/src/adapters/gcs/mock.js +3 -0
- package/src/adapters/gcs/staticHandler.ts +34 -0
- package/src/adapters/gcs/webpack.ts +21 -0
- package/src/adapters/s3/emulator/.localstack/cache/machine.json +1 -0
- package/src/adapters/s3/emulator/.localstack/cache/server.test.pem +127 -0
- package/src/adapters/s3/emulator/.localstack/cache/server.test.pem.crt +99 -0
- package/src/adapters/s3/emulator/.localstack/cache/server.test.pem.key +28 -0
- package/src/adapters/s3/emulator/.localstack/cache/service-catalog-2_1_1_dev-1_29_149.pickle +0 -0
- package/src/adapters/s3/emulator/docker-compose.yml +15 -0
- package/src/adapters/s3/fileStub.js +1 -0
- package/src/adapters/s3/fsMock.js +1 -0
- package/src/adapters/s3/generateURL.ts +14 -0
- package/src/adapters/s3/handleDelete.ts +17 -0
- package/src/adapters/s3/handleUpload.ts +62 -0
- package/src/adapters/s3/index.ts +38 -0
- package/src/adapters/s3/mock.js +9 -0
- package/src/adapters/s3/staticHandler.ts +41 -0
- package/src/adapters/s3/webpack.ts +23 -0
- package/src/fields/getFields.ts +155 -0
- package/src/hooks/afterDelete.ts +35 -0
- package/src/hooks/afterRead.ts +38 -0
- package/src/hooks/beforeChange.ts +59 -0
- package/src/index.ts +1 -0
- package/src/plugin.ts +101 -0
- package/src/types.ts +79 -0
- package/src/utilities/getFilePrefix.ts +26 -0
- package/src/utilities/getIncomingFiles.ts +44 -0
- package/src/utilities/getRangeFromHeader.ts +27 -0
- package/src/webpack.ts +46 -0
- package/tsconfig.json +23 -0
- package/yarn-error.log +8163 -0
- package/yarn.lock +8062 -0
package/.editorconfig
ADDED
package/.gitignore
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
dev/tmp
|
|
2
|
+
dev/yarn.lock
|
|
3
|
+
|
|
4
|
+
# Created by https://www.gitignore.io/api/node,macos,windows,webstorm,sublimetext,visualstudiocode
|
|
5
|
+
|
|
6
|
+
### macOS ###
|
|
7
|
+
*.DS_Store
|
|
8
|
+
.AppleDouble
|
|
9
|
+
.LSOverride
|
|
10
|
+
|
|
11
|
+
# Thumbnails
|
|
12
|
+
._*
|
|
13
|
+
|
|
14
|
+
# Files that might appear in the root of a volume
|
|
15
|
+
.DocumentRevisions-V100
|
|
16
|
+
.fseventsd
|
|
17
|
+
.Spotlight-V100
|
|
18
|
+
.TemporaryItems
|
|
19
|
+
.Trashes
|
|
20
|
+
.VolumeIcon.icns
|
|
21
|
+
.com.apple.timemachine.donotpresent
|
|
22
|
+
|
|
23
|
+
# Directories potentially created on remote AFP share
|
|
24
|
+
.AppleDB
|
|
25
|
+
.AppleDesktop
|
|
26
|
+
Network Trash Folder
|
|
27
|
+
Temporary Items
|
|
28
|
+
.apdisk
|
|
29
|
+
|
|
30
|
+
### Node ###
|
|
31
|
+
# Logs
|
|
32
|
+
logs
|
|
33
|
+
*.log
|
|
34
|
+
npm-debug.log*
|
|
35
|
+
yarn-debug.log*
|
|
36
|
+
yarn-error.log*
|
|
37
|
+
|
|
38
|
+
# Runtime data
|
|
39
|
+
pids
|
|
40
|
+
*.pid
|
|
41
|
+
*.seed
|
|
42
|
+
*.pid.lock
|
|
43
|
+
|
|
44
|
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
45
|
+
lib-cov
|
|
46
|
+
|
|
47
|
+
# Coverage directory used by tools like istanbul
|
|
48
|
+
coverage
|
|
49
|
+
|
|
50
|
+
# nyc test coverage
|
|
51
|
+
.nyc_output
|
|
52
|
+
|
|
53
|
+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
54
|
+
.grunt
|
|
55
|
+
|
|
56
|
+
# Bower dependency directory (https://bower.io/)
|
|
57
|
+
bower_components
|
|
58
|
+
|
|
59
|
+
# node-waf configuration
|
|
60
|
+
.lock-wscript
|
|
61
|
+
|
|
62
|
+
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
|
63
|
+
build/Release
|
|
64
|
+
|
|
65
|
+
# Dependency directories
|
|
66
|
+
node_modules/
|
|
67
|
+
jspm_packages/
|
|
68
|
+
|
|
69
|
+
# Typescript v1 declaration files
|
|
70
|
+
typings/
|
|
71
|
+
|
|
72
|
+
# Optional npm cache directory
|
|
73
|
+
.npm
|
|
74
|
+
|
|
75
|
+
# Optional eslint cache
|
|
76
|
+
.eslintcache
|
|
77
|
+
|
|
78
|
+
# Optional REPL history
|
|
79
|
+
.node_repl_history
|
|
80
|
+
|
|
81
|
+
# Output of 'npm pack'
|
|
82
|
+
*.tgz
|
|
83
|
+
|
|
84
|
+
# Yarn Integrity file
|
|
85
|
+
.yarn-integrity
|
|
86
|
+
|
|
87
|
+
# Yarn Berry
|
|
88
|
+
.yarn/*
|
|
89
|
+
!.yarn/patches
|
|
90
|
+
!.yarn/plugins
|
|
91
|
+
!.yarn/releases
|
|
92
|
+
!.yarn/sdks
|
|
93
|
+
!.yarn/versions
|
|
94
|
+
.pnp.*
|
|
95
|
+
|
|
96
|
+
# dotenv environment variables file
|
|
97
|
+
.env
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
### SublimeText ###
|
|
101
|
+
# cache files for sublime text
|
|
102
|
+
*.tmlanguage.cache
|
|
103
|
+
*.tmPreferences.cache
|
|
104
|
+
*.stTheme.cache
|
|
105
|
+
|
|
106
|
+
# workspace files are user-specific
|
|
107
|
+
*.sublime-workspace
|
|
108
|
+
|
|
109
|
+
# project files should be checked into the repository, unless a significant
|
|
110
|
+
# proportion of contributors will probably not be using SublimeText
|
|
111
|
+
# *.sublime-project
|
|
112
|
+
|
|
113
|
+
# sftp configuration file
|
|
114
|
+
sftp-config.json
|
|
115
|
+
|
|
116
|
+
# Package control specific files
|
|
117
|
+
Package Control.last-run
|
|
118
|
+
Package Control.ca-list
|
|
119
|
+
Package Control.ca-bundle
|
|
120
|
+
Package Control.system-ca-bundle
|
|
121
|
+
Package Control.cache/
|
|
122
|
+
Package Control.ca-certs/
|
|
123
|
+
Package Control.merged-ca-bundle
|
|
124
|
+
Package Control.user-ca-bundle
|
|
125
|
+
oscrypto-ca-bundle.crt
|
|
126
|
+
bh_unicode_properties.cache
|
|
127
|
+
|
|
128
|
+
# Sublime-github package stores a github token in this file
|
|
129
|
+
# https://packagecontrol.io/packages/sublime-github
|
|
130
|
+
GitHub.sublime-settings
|
|
131
|
+
|
|
132
|
+
### VisualStudioCode ###
|
|
133
|
+
.vscode/*
|
|
134
|
+
!.vscode/tasks.json
|
|
135
|
+
!.vscode/launch.json
|
|
136
|
+
!.vscode/extensions.json
|
|
137
|
+
.history
|
|
138
|
+
|
|
139
|
+
### WebStorm ###
|
|
140
|
+
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
|
141
|
+
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
|
142
|
+
|
|
143
|
+
.idea/*
|
|
144
|
+
# User-specific stuff:
|
|
145
|
+
.idea/**/workspace.xml
|
|
146
|
+
.idea/**/tasks.xml
|
|
147
|
+
.idea/dictionaries
|
|
148
|
+
|
|
149
|
+
# Sensitive or high-churn files:
|
|
150
|
+
.idea/**/dataSources/
|
|
151
|
+
.idea/**/dataSources.ids
|
|
152
|
+
.idea/**/dataSources.xml
|
|
153
|
+
.idea/**/dataSources.local.xml
|
|
154
|
+
.idea/**/sqlDataSources.xml
|
|
155
|
+
.idea/**/dynamic.xml
|
|
156
|
+
.idea/**/uiDesigner.xml
|
|
157
|
+
|
|
158
|
+
# Gradle:
|
|
159
|
+
.idea/**/gradle.xml
|
|
160
|
+
.idea/**/libraries
|
|
161
|
+
|
|
162
|
+
# CMake
|
|
163
|
+
cmake-build-debug/
|
|
164
|
+
|
|
165
|
+
# Mongo Explorer plugin:
|
|
166
|
+
.idea/**/mongoSettings.xml
|
|
167
|
+
|
|
168
|
+
## File-based project format:
|
|
169
|
+
*.iws
|
|
170
|
+
|
|
171
|
+
## Plugin-specific files:
|
|
172
|
+
|
|
173
|
+
# IntelliJ
|
|
174
|
+
/out/
|
|
175
|
+
|
|
176
|
+
# mpeltonen/sbt-idea plugin
|
|
177
|
+
.idea_modules/
|
|
178
|
+
|
|
179
|
+
# JIRA plugin
|
|
180
|
+
atlassian-ide-plugin.xml
|
|
181
|
+
|
|
182
|
+
# Cursive Clojure plugin
|
|
183
|
+
.idea/replstate.xml
|
|
184
|
+
|
|
185
|
+
# Ruby plugin and RubyMine
|
|
186
|
+
/.rakeTasks
|
|
187
|
+
|
|
188
|
+
# Crashlytics plugin (for Android Studio and IntelliJ)
|
|
189
|
+
com_crashlytics_export_strings.xml
|
|
190
|
+
crashlytics.properties
|
|
191
|
+
crashlytics-build.properties
|
|
192
|
+
fabric.properties
|
|
193
|
+
|
|
194
|
+
### WebStorm Patch ###
|
|
195
|
+
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
|
196
|
+
|
|
197
|
+
# *.iml
|
|
198
|
+
# modules.xml
|
|
199
|
+
# .idea/misc.xml
|
|
200
|
+
# *.ipr
|
|
201
|
+
|
|
202
|
+
# Sonarlint plugin
|
|
203
|
+
.idea/sonarlint
|
|
204
|
+
|
|
205
|
+
### Windows ###
|
|
206
|
+
# Windows thumbnail cache files
|
|
207
|
+
Thumbs.db
|
|
208
|
+
ehthumbs.db
|
|
209
|
+
ehthumbs_vista.db
|
|
210
|
+
|
|
211
|
+
# Folder config file
|
|
212
|
+
Desktop.ini
|
|
213
|
+
|
|
214
|
+
# Recycle Bin used on file shares
|
|
215
|
+
$RECYCLE.BIN/
|
|
216
|
+
|
|
217
|
+
# Windows Installer files
|
|
218
|
+
*.cab
|
|
219
|
+
*.msi
|
|
220
|
+
*.msm
|
|
221
|
+
*.msp
|
|
222
|
+
|
|
223
|
+
# Windows shortcuts
|
|
224
|
+
*.lnk
|
|
225
|
+
|
|
226
|
+
# End of https://www.gitignore.io/api/node,macos,windows,webstorm,sublimetext,visualstudiocode
|
|
227
|
+
|
|
228
|
+
# Ignore all uploads
|
|
229
|
+
demo/upload
|
|
230
|
+
demo/media
|
|
231
|
+
demo/files
|
|
232
|
+
|
|
233
|
+
# Ignore build folder
|
|
234
|
+
build
|
|
235
|
+
|
|
236
|
+
# Ignore built components
|
|
237
|
+
components/index.js
|
|
238
|
+
components/styles.css
|
|
239
|
+
|
|
240
|
+
# Ignore generated
|
|
241
|
+
demo/generated-types.ts
|
|
242
|
+
demo/generated-schema.graphql
|
|
243
|
+
|
|
244
|
+
# Ignore dist, no need for git
|
|
245
|
+
dist
|
|
246
|
+
|
|
247
|
+
# Ignore emulator volumes
|
|
248
|
+
src/adapters/s3/emulator/.localstack/
|
package/.prettierignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
eslint-config
|
package/.prettierrc.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Use IntelliSense to learn about possible attributes.
|
|
3
|
+
// Hover to view descriptions of existing attributes.
|
|
4
|
+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
|
+
"version": "0.2.0",
|
|
6
|
+
"configurations": [
|
|
7
|
+
{
|
|
8
|
+
"type": "node",
|
|
9
|
+
"request": "launch",
|
|
10
|
+
"cwd": "${workspaceFolder}/dev",
|
|
11
|
+
"runtimeArgs": [
|
|
12
|
+
"-r",
|
|
13
|
+
"./node_modules/ts-node/register"
|
|
14
|
+
],
|
|
15
|
+
"name": "Debug Cloud Storage - S3",
|
|
16
|
+
"program": "${workspaceFolder}/dev/src/server.ts",
|
|
17
|
+
"outputCapture": "std",
|
|
18
|
+
"env": {
|
|
19
|
+
"PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER": "s3",
|
|
20
|
+
"PAYLOAD_CONFIG_PATH": "${workspaceFolder}/dev/src/payload.config.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"type": "node",
|
|
25
|
+
"request": "launch",
|
|
26
|
+
"cwd": "${workspaceFolder}/dev",
|
|
27
|
+
"runtimeArgs": [
|
|
28
|
+
"-r",
|
|
29
|
+
"./node_modules/ts-node/register"
|
|
30
|
+
],
|
|
31
|
+
"name": "Debug Cloud Storage - Azure",
|
|
32
|
+
"program": "${workspaceFolder}/dev/src/server.ts",
|
|
33
|
+
"outputCapture": "std",
|
|
34
|
+
"env": {
|
|
35
|
+
"PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER": "azure",
|
|
36
|
+
"PAYLOAD_CONFIG_PATH": "${workspaceFolder}/dev/src/payload.config.ts"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
]
|
|
40
|
+
}
|
package/README.md
CHANGED
|
@@ -37,6 +37,23 @@ export default buildConfig({
|
|
|
37
37
|
});
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
### Conditionally Enabling/Disabling
|
|
41
|
+
|
|
42
|
+
The proper way to conditionally enable/disable this plugin is to use the `enabled` property.
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
cloudStorage({
|
|
46
|
+
enabled: process.env.MY_CONDITION === 'true',
|
|
47
|
+
collections: {
|
|
48
|
+
'my-collection-slug': {
|
|
49
|
+
adapter: theAdapterToUse, // see docs for the adapter you want to use
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
If the code is included *in any way in your config* but conditionally disabled in another fashion, you may run into issues such as `Webpack Build Error: Can't Resolve 'fs' and 'stream'` or similar because the plugin must be run at all times in order to properly extend the webpack config.
|
|
56
|
+
|
|
40
57
|
## Features
|
|
41
58
|
|
|
42
59
|
**Adapter-based Implementation**
|
|
@@ -58,6 +75,7 @@ This plugin is configurable to work across many different Payload collections. A
|
|
|
58
75
|
| Option | Type | Description |
|
|
59
76
|
|-------------------------|-----------------------------------------| ----------- |
|
|
60
77
|
| `collections` * | Record<string, [CollectionOptions](https://github.com/payloadcms/plugin-cloud-storage/blob/c4a492a62abc2f21b4cd6a7c97778acd8e831212/src/types.ts#L48)> | Object with keys set to the slug of collections you want to enable the plugin for, and values set to collection-specific options. |
|
|
78
|
+
| `enabled` | | `boolean` to conditionally enable/disable plugin. Default: true. |
|
|
61
79
|
|
|
62
80
|
**Collection-specific options:**
|
|
63
81
|
|
|
@@ -157,9 +175,9 @@ const adapter = gcsAdapter({
|
|
|
157
175
|
|
|
158
176
|
### Payload Access Control
|
|
159
177
|
|
|
160
|
-
Payload ships with access control that runs
|
|
178
|
+
Payload ships with access control that runs *even on statically served files*. The same `read` access control property on your `upload`-enabled collections is used, and it allows you to restrict who can request your uploaded files.
|
|
161
179
|
|
|
162
|
-
To preserve this feature, by default, this plugin
|
|
180
|
+
To preserve this feature, by default, this plugin *keeps all file URLs exactly the same*. Your file URLs won't be updated to point directly to your cloud storage source, as in that case, Payload's access control will be completely bypassed and you would need public readability on your cloud-hosted files.
|
|
163
181
|
|
|
164
182
|
Instead, all uploads will still be reached from the default `/collectionSlug/staticURL/filename` path. This plugin will "pass through" all files that are hosted on your third-party cloud service—with the added benefit of keeping your existing access control in place.
|
|
165
183
|
|
package/dev/.env
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MONGODB_URI=mongodb://localhost/payload-plugin-cloud-storage
|
|
2
|
+
PAYLOAD_PUBLIC_SERVER_URL=http://localhost:3000
|
|
3
|
+
PAYLOAD_SECRET=45ligj345ligj4wl5igj4lw5igj45ligj45wlijl
|
|
4
|
+
PAYLOAD_CONFIG_PATH=src/payload.config.ts
|
|
5
|
+
|
|
6
|
+
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://localhost:10000/devstoreaccount1;QueueEndpoint=http://localhost:10001/devstoreaccount1;
|
|
7
|
+
AZURE_STORAGE_CONTAINER_NAME=az-media
|
|
8
|
+
AZURE_STORAGE_ALLOW_CONTAINER_CREATE=true
|
|
9
|
+
AZURE_STORAGE_ACCOUNT_BASEURL=http://localhost:10000/devstoreaccount1
|
|
10
|
+
|
|
11
|
+
S3_ENDPOINT=http://localhost:4566
|
|
12
|
+
S3_ACCESS_KEY_ID=payloadAccessKey
|
|
13
|
+
S3_SECRET_ACCESS_KEY=alwiejglaiwhewlihgawe
|
|
14
|
+
S3_BUCKET=payload-bucket
|
|
15
|
+
S3_FORCE_PATH_STYLE=true
|
|
16
|
+
|
|
17
|
+
GCS_ENDPOINT=http://localhost:4443
|
|
18
|
+
GCS_PROJECT_ID=test
|
|
19
|
+
GCS_BUCKET=payload-bucket
|
|
20
|
+
|
|
21
|
+
PAYLOAD_DROP_DATABASE=true
|
package/dev/.env.example
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MONGODB_URI=mongodb://localhost/payload-plugin-cloud-storage
|
|
2
|
+
PAYLOAD_PUBLIC_SERVER_URL=http://localhost:3000
|
|
3
|
+
PAYLOAD_SECRET=45ligj345ligj4wl5igj4lw5igj45ligj45wlijl
|
|
4
|
+
PAYLOAD_CONFIG_PATH=src/payload.config.ts
|
|
5
|
+
|
|
6
|
+
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://localhost:10000/devstoreaccount1;QueueEndpoint=http://localhost:10001/devstoreaccount1;
|
|
7
|
+
AZURE_STORAGE_CONTAINER_NAME=az-media
|
|
8
|
+
AZURE_STORAGE_ALLOW_CONTAINER_CREATE=true
|
|
9
|
+
AZURE_STORAGE_ACCOUNT_BASEURL=http://localhost:10000/devstoreaccount1
|
|
10
|
+
|
|
11
|
+
S3_ENDPOINT=http://localhost:4566
|
|
12
|
+
S3_ACCESS_KEY_ID=payloadAccessKey
|
|
13
|
+
S3_SECRET_ACCESS_KEY=alwiejglaiwhewlihgawe
|
|
14
|
+
S3_BUCKET=payload-bucket
|
|
15
|
+
S3_FORCE_PATH_STYLE=true
|
|
16
|
+
|
|
17
|
+
GCS_ENDPOINT=http://localhost:4443
|
|
18
|
+
GCS_PROJECT_ID=test
|
|
19
|
+
GCS_BUCKET=payload-bucket
|
|
20
|
+
|
|
21
|
+
PAYLOAD_DROP_DATABASE=true
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Media = void 0;
|
|
4
|
+
var urlField = {
|
|
5
|
+
name: 'url',
|
|
6
|
+
type: 'text',
|
|
7
|
+
hooks: {
|
|
8
|
+
afterRead: [
|
|
9
|
+
function (_a) {
|
|
10
|
+
var value = _a.value;
|
|
11
|
+
console.log('hello from hook');
|
|
12
|
+
return value;
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
exports.Media = {
|
|
18
|
+
slug: 'media',
|
|
19
|
+
upload: {
|
|
20
|
+
imageSizes: [
|
|
21
|
+
{
|
|
22
|
+
height: 400,
|
|
23
|
+
width: 400,
|
|
24
|
+
crop: 'center',
|
|
25
|
+
name: 'square',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
width: 900,
|
|
29
|
+
height: 450,
|
|
30
|
+
crop: 'center',
|
|
31
|
+
name: 'sixteenByNineMedium',
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
fields: [
|
|
36
|
+
{
|
|
37
|
+
name: 'alt',
|
|
38
|
+
label: 'Alt Text',
|
|
39
|
+
type: 'text',
|
|
40
|
+
},
|
|
41
|
+
// The following fields should be able to be merged in to default upload fields
|
|
42
|
+
urlField,
|
|
43
|
+
{
|
|
44
|
+
name: 'sizes',
|
|
45
|
+
type: 'group',
|
|
46
|
+
fields: [
|
|
47
|
+
{
|
|
48
|
+
name: 'square',
|
|
49
|
+
type: 'group',
|
|
50
|
+
fields: [urlField],
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=Media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Media.js","sourceRoot":"","sources":["../../../../src/collections/Media.ts"],"names":[],"mappings":";;;AAGA,IAAM,QAAQ,GAAU;IACtB,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE;QACL,SAAS,EAAE;YACT,UAAC,EAAS;oBAAP,KAAK,WAAA;gBACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;gBAC9B,OAAO,KAAK,CAAA;YACd,CAAC;SACF;KACF;CACF,CAAA;AAEY,QAAA,KAAK,GAAqB;IACrC,IAAI,EAAE,OAAO;IACb,MAAM,EAAE;QACN,UAAU,EAAE;YACV;gBACE,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;aACf;YACD;gBACE,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,qBAAqB;aAC5B;SACF;KACF;IACD,MAAM,EAAE;QACN;YACE,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,MAAM;SACb;QAED,+EAA+E;QAC/E,QAAQ;QACR;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,CAAC,QAAQ,CAAC;iBACnB;aACF;SACF;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var Users = {
|
|
4
|
+
slug: 'users',
|
|
5
|
+
auth: true,
|
|
6
|
+
access: {
|
|
7
|
+
read: function () { return true; },
|
|
8
|
+
},
|
|
9
|
+
fields: [
|
|
10
|
+
{
|
|
11
|
+
name: 'avatar',
|
|
12
|
+
type: 'upload',
|
|
13
|
+
relationTo: 'media',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'background',
|
|
17
|
+
type: 'upload',
|
|
18
|
+
relationTo: 'media',
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
exports.default = Users;
|
|
23
|
+
//# sourceMappingURL=Users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Users.js","sourceRoot":"","sources":["../../../../src/collections/Users.ts"],"names":[],"mappings":";;AAEA,IAAM,KAAK,GAAqB;IAC9B,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,IAAI;IACV,MAAM,EAAE;QACN,IAAI,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI;KACjB;IACD,MAAM,EAAE;QACN;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,OAAO;SACpB;QACD;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,OAAO;SACpB;KACF;CACF,CAAA;AAED,kBAAe,KAAK,CAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
var config_1 = require("payload/config");
|
|
54
|
+
var path_1 = __importDefault(require("path"));
|
|
55
|
+
var Users_1 = __importDefault(require("./collections/Users"));
|
|
56
|
+
var src_1 = require("../../src");
|
|
57
|
+
var s3_1 = require("../../src/adapters/s3");
|
|
58
|
+
var gcs_1 = require("../../src/adapters/gcs");
|
|
59
|
+
var azure_1 = require("../../src/adapters/azure");
|
|
60
|
+
var Media_1 = require("./collections/Media");
|
|
61
|
+
var adapter;
|
|
62
|
+
var uploadOptions;
|
|
63
|
+
if (process.env.PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER === 'azure') {
|
|
64
|
+
adapter = (0, azure_1.azureBlobStorageAdapter)({
|
|
65
|
+
connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING,
|
|
66
|
+
containerName: process.env.AZURE_STORAGE_CONTAINER_NAME,
|
|
67
|
+
allowContainerCreate: process.env.AZURE_STORAGE_ALLOW_CONTAINER_CREATE === 'true',
|
|
68
|
+
baseURL: process.env.AZURE_STORAGE_ACCOUNT_BASEURL,
|
|
69
|
+
});
|
|
70
|
+
// uploadOptions = {
|
|
71
|
+
// useTempFiles: true,
|
|
72
|
+
// }
|
|
73
|
+
}
|
|
74
|
+
if (process.env.PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER === 's3') {
|
|
75
|
+
// The s3 adapter supports using temp files for uploads
|
|
76
|
+
uploadOptions = {
|
|
77
|
+
useTempFiles: true,
|
|
78
|
+
};
|
|
79
|
+
adapter = (0, s3_1.s3Adapter)({
|
|
80
|
+
config: {
|
|
81
|
+
endpoint: process.env.S3_ENDPOINT,
|
|
82
|
+
forcePathStyle: process.env.S3_FORCE_PATH_STYLE === 'true',
|
|
83
|
+
region: process.env.S3_REGION,
|
|
84
|
+
credentials: {
|
|
85
|
+
accessKeyId: process.env.S3_ACCESS_KEY_ID,
|
|
86
|
+
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
bucket: process.env.S3_BUCKET,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (process.env.PAYLOAD_PUBLIC_CLOUD_STORAGE_ADAPTER === 'gcs') {
|
|
93
|
+
adapter = (0, gcs_1.gcsAdapter)({
|
|
94
|
+
options: {
|
|
95
|
+
apiEndpoint: process.env.GCS_ENDPOINT,
|
|
96
|
+
projectId: process.env.GCS_PROJECT_ID,
|
|
97
|
+
},
|
|
98
|
+
bucket: process.env.GCS_BUCKET,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
exports.default = (0, config_1.buildConfig)({
|
|
102
|
+
serverURL: 'http://localhost:3000',
|
|
103
|
+
collections: [Media_1.Media, Users_1.default],
|
|
104
|
+
upload: uploadOptions,
|
|
105
|
+
admin: {
|
|
106
|
+
// NOTE - these webpack extensions are only required
|
|
107
|
+
// for development of this plugin.
|
|
108
|
+
// No need to use these aliases within your own projects.
|
|
109
|
+
webpack: function (config) {
|
|
110
|
+
var newConfig = __assign(__assign({}, config), { resolve: __assign(__assign({}, (config.resolve || {})), { alias: __assign(__assign({}, (config.resolve.alias || {})), { react: path_1.default.resolve(__dirname, '../node_modules/react'), '@azure/storage-blob': path_1.default.resolve(__dirname, '../../src/adapters/azure/mock.js'), '@aws-sdk/client-s3': path_1.default.resolve(__dirname, '../../src/adapters/s3/mock.js'), '@google-cloud/storage': path_1.default.resolve(__dirname, '../../src/adapters/gcs/mock.js'), fs: path_1.default.resolve(__dirname, '../../src/adapters/s3/fsMock.js') }) }) });
|
|
111
|
+
return newConfig;
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
typescript: {
|
|
115
|
+
outputFile: path_1.default.resolve(__dirname, 'payload-types.ts'),
|
|
116
|
+
},
|
|
117
|
+
plugins: [
|
|
118
|
+
// @ts-expect-error Conflicting types for relative package
|
|
119
|
+
(0, src_1.cloudStorage)({
|
|
120
|
+
collections: {
|
|
121
|
+
media: {
|
|
122
|
+
adapter: adapter,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
],
|
|
127
|
+
onInit: function (payload) { return __awaiter(void 0, void 0, void 0, function () {
|
|
128
|
+
var users;
|
|
129
|
+
return __generator(this, function (_a) {
|
|
130
|
+
switch (_a.label) {
|
|
131
|
+
case 0: return [4 /*yield*/, payload.find({
|
|
132
|
+
collection: 'users',
|
|
133
|
+
limit: 1,
|
|
134
|
+
})];
|
|
135
|
+
case 1:
|
|
136
|
+
users = _a.sent();
|
|
137
|
+
if (!!users.docs.length) return [3 /*break*/, 3];
|
|
138
|
+
return [4 /*yield*/, payload.create({
|
|
139
|
+
collection: 'users',
|
|
140
|
+
data: {
|
|
141
|
+
email: 'dev@payloadcms.com',
|
|
142
|
+
password: 'test',
|
|
143
|
+
},
|
|
144
|
+
})];
|
|
145
|
+
case 2:
|
|
146
|
+
_a.sent();
|
|
147
|
+
_a.label = 3;
|
|
148
|
+
case 3: return [2 /*return*/];
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}); },
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=payload.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.config.js","sourceRoot":"","sources":["../../../src/payload.config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA4C;AAC5C,8CAAuB;AACvB,8DAAuC;AACvC,iCAAwC;AACxC,4CAAiD;AACjD,8CAAmD;AACnD,kDAAkE;AAElE,6CAA2C;AAE3C,IAAI,OAAgB,CAAA;AACpB,IAAI,aAAa,CAAA;AAEjB,IAAI,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,OAAO,EAAE;IAChE,OAAO,GAAG,IAAA,+BAAuB,EAAC;QAChC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAC7D,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;QACvD,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,MAAM;QACjF,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B;KACnD,CAAC,CAAA;IACF,oBAAoB;IACpB,wBAAwB;IACxB,IAAI;CACL;AAED,IAAI,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,IAAI,EAAE;IAC7D,uDAAuD;IACvD,aAAa,GAAG;QACd,YAAY,EAAE,IAAI;KACnB,CAAA;IAED,OAAO,GAAG,IAAA,cAAS,EAAC;QAClB,MAAM,EAAE;YACN,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;YACjC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;YAC1D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;YAC7B,WAAW,EAAE;gBACX,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;gBACzC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;aAClD;SACF;QACD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;KAC9B,CAAC,CAAA;CACH;AAED,IAAI,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,KAAK,EAAE;IAC9D,OAAO,GAAG,IAAA,gBAAU,EAAC;QACnB,OAAO,EAAE;YACP,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;YACrC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACtC;QACD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;KAC/B,CAAC,CAAA;CACH;AAED,kBAAe,IAAA,oBAAW,EAAC;IACzB,SAAS,EAAE,uBAAuB;IAClC,WAAW,EAAE,CAAC,aAAK,EAAE,eAAK,CAAC;IAC3B,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE;QACL,oDAAoD;QACpD,kCAAkC;QAClC,yDAAyD;QACzD,OAAO,EAAE,UAAA,MAAM;YACb,IAAM,SAAS,yBACV,MAAM,KACT,OAAO,wBACF,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,KACzB,KAAK,wBACA,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,KAC/B,KAAK,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,EACvD,qBAAqB,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,kCAAkC,CAAC,EAClF,oBAAoB,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,+BAA+B,CAAC,EAC9E,uBAAuB,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gCAAgC,CAAC,EAClF,EAAE,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iCAAiC,CAAC,SAGnE,CAAA;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KACF;IACD,UAAU,EAAE;QACV,UAAU,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC;KACxD;IACD,OAAO,EAAE;QACP,0DAA0D;QAC1D,IAAA,kBAAY,EAAC;YACX,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,OAAO,SAAA;iBACR;aACF;SACF,CAAC;KACH;IACD,MAAM,EAAE,UAAM,OAAO;;;;wBACL,qBAAM,OAAO,CAAC,IAAI,CAAC;wBAC/B,UAAU,EAAE,OAAO;wBACnB,KAAK,EAAE,CAAC;qBACT,CAAC,EAAA;;oBAHI,KAAK,GAAG,SAGZ;yBAEE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAlB,wBAAkB;oBACpB,qBAAM,OAAO,CAAC,MAAM,CAAC;4BACnB,UAAU,EAAE,OAAO;4BACnB,IAAI,EAAE;gCACJ,KAAK,EAAE,oBAAoB;gCAC3B,QAAQ,EAAE,MAAM;6BACjB;yBACF,CAAC,EAAA;;oBANF,SAME,CAAA;;;;;SAEL;CACF,CAAC,CAAA"}
|