@payloadcms/figma 0.0.1-alpha.6 → 0.0.1-alpha.61
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/dist/api/control-plane.d.ts +52 -6
- package/dist/api/control-plane.js +174 -72
- package/dist/api/figma-api.d.ts +22 -1
- package/dist/api/figma-api.js +78 -25
- package/dist/auth/callback-server.js +2 -1
- package/dist/auth/credentials.d.ts +21 -0
- package/dist/auth/credentials.js +21 -0
- package/dist/auth/crypto-utils.d.ts +6 -0
- package/dist/auth/crypto-utils.js +16 -14
- package/dist/auth/jwt-validator.d.ts +2 -1
- package/dist/auth/jwt-validator.js +2 -2
- package/dist/auth/oauth-flow.d.ts +17 -3
- package/dist/auth/oauth-flow.js +63 -16
- package/dist/auth/project-token.js +16 -11
- package/dist/auth/refresh.d.ts +2 -1
- package/dist/auth/refresh.js +25 -12
- package/dist/auth/token-store.d.ts +42 -1
- package/dist/auth/token-store.js +118 -14
- package/dist/auth/types.d.ts +17 -4
- package/dist/cli.js +68 -5
- package/dist/commands/build-lambda-zip.d.ts +5 -0
- package/dist/commands/build-lambda-zip.js +19 -0
- package/dist/commands/debug.d.ts +8 -0
- package/dist/commands/debug.js +176 -0
- package/dist/commands/deploy.d.ts +9 -0
- package/dist/commands/deploy.js +178 -151
- package/dist/commands/env.d.ts +13 -0
- package/dist/commands/env.js +88 -0
- package/dist/commands/init.d.ts +3 -5
- package/dist/commands/init.js +165 -148
- package/dist/commands/list-tokens.d.ts +3 -3
- package/dist/commands/list-tokens.js +22 -7
- package/dist/commands/login.d.ts +8 -1
- package/dist/commands/login.js +33 -15
- package/dist/commands/logout.d.ts +5 -4
- package/dist/commands/logout.js +56 -13
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.js +331 -0
- package/dist/config/oauth.d.ts +4 -14
- package/dist/config/oauth.js +18 -40
- package/dist/constants.d.ts +44 -19
- package/dist/constants.js +73 -20
- package/dist/db-content-api/README.md +98 -0
- package/dist/db-content-api/generated/content-api-types.d.ts +3972 -0
- package/dist/db-content-api/generated/content-api-types.js +7 -0
- package/dist/db-content-api/index.d.ts +21 -0
- package/dist/db-content-api/index.js +914 -0
- package/dist/db-content-api/temp-utilities/slug.d.ts +2 -0
- package/dist/db-content-api/temp-utilities/slug.js +3 -0
- package/dist/db-content-api/temp-utilities/sorting.d.ts +3 -0
- package/dist/db-content-api/temp-utilities/sorting.js +39 -0
- package/dist/db-content-api/temp-utilities/types.d.ts +22 -0
- package/dist/db-content-api/temp-utilities/types.js +15 -0
- package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +39 -0
- package/dist/db-content-api/temp-utilities/unwrapDocument.js +59 -0
- package/dist/db-content-api/utilities/auth.d.ts +30 -0
- package/dist/db-content-api/utilities/auth.js +81 -0
- package/dist/db-content-api/utilities/data/applyDefaults.d.ts +7 -0
- package/dist/db-content-api/utilities/data/applyDefaults.js +75 -0
- package/dist/db-content-api/utilities/data/castFieldValue.d.ts +11 -0
- package/dist/db-content-api/utilities/data/castFieldValue.js +68 -0
- package/dist/db-content-api/utilities/data/index.d.ts +49 -0
- package/dist/db-content-api/utilities/data/index.js +301 -0
- package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +12 -0
- package/dist/db-content-api/utilities/data/removeVirtualFields.js +54 -0
- package/dist/db-content-api/utilities/data/stripFields.d.ts +48 -0
- package/dist/db-content-api/utilities/data/stripFields.js +195 -0
- package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +23 -0
- package/dist/db-content-api/utilities/data/transformPublishedLocale.js +42 -0
- package/dist/db-content-api/utilities/joins.d.ts +53 -0
- package/dist/db-content-api/utilities/joins.js +139 -0
- package/dist/db-content-api/utilities/locale/index.d.ts +10 -0
- package/dist/db-content-api/utilities/locale/index.js +21 -0
- package/dist/db-content-api/utilities/meta/buildLocalizedPaths.d.ts +11 -0
- package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js +74 -0
- package/dist/db-content-api/utilities/meta/buildMeta.d.ts +42 -0
- package/dist/db-content-api/utilities/meta/buildMeta.js +41 -0
- package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +17 -0
- package/dist/db-content-api/utilities/meta/buildPathTypes.js +244 -0
- package/dist/db-content-api/utilities/meta/buildUniquePaths.d.ts +13 -0
- package/dist/db-content-api/utilities/meta/buildUniquePaths.js +62 -0
- package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.d.ts +10 -0
- package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.js +102 -0
- package/dist/db-content-api/utilities/where.d.ts +20 -0
- package/dist/db-content-api/utilities/where.js +108 -0
- package/dist/deploy/schedule-extract-plugin.d.ts +11 -0
- package/dist/deploy/schedule-extract-plugin.js +34 -0
- package/dist/endpoints/health.d.ts +3 -0
- package/dist/endpoints/health.js +11 -0
- package/dist/endpoints/schema.d.ts +3 -0
- package/dist/endpoints/schema.js +29 -0
- package/dist/exports/client.d.ts +3 -0
- package/dist/exports/client.js +3 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/oauth/components/FigmaAvatar/index.d.ts +4 -0
- package/dist/oauth/components/FigmaAvatar/index.js +27 -0
- package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
- package/dist/oauth/components/FigmaAvatarCell/index.d.ts +5 -0
- package/dist/oauth/components/FigmaAvatarCell/index.js +25 -0
- package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
- package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +9 -0
- package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +37 -0
- package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
- package/dist/oauth/components/LoginButton/index.js +50 -6
- package/dist/oauth/components/LoginButton/index.scss +50 -3
- package/dist/oauth/components/LogoutButton/index.js +5 -4
- package/dist/oauth/defaults.js +67 -10
- package/dist/oauth/endpoints/getLoginEndpoint.js +77 -24
- package/dist/oauth/endpoints/getLogoutEndpoint.js +7 -4
- package/dist/oauth/index.js +40 -13
- package/dist/oauth/strategy/index.d.ts +0 -2
- package/dist/oauth/strategy/index.js +40 -17
- package/dist/oauth/types.d.ts +6 -6
- package/dist/oauth/utilities/isDuplicateKeyError.d.ts +7 -0
- package/dist/oauth/utilities/isDuplicateKeyError.js +14 -0
- package/dist/oauth/utilities/refreshTokens.js +6 -3
- package/dist/plugin/build-config.d.ts +18 -15
- package/dist/plugin/build-config.js +213 -18
- package/dist/storage-content-api/api-types.d.ts +168 -0
- package/dist/storage-content-api/api-types.js +6 -0
- package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts +9 -0
- package/dist/storage-content-api/client-uploads/ClientUploadHandler.js +42 -0
- package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts +13 -0
- package/dist/storage-content-api/client-uploads/generateSignedURL.js +39 -0
- package/dist/storage-content-api/client.d.ts +6 -0
- package/dist/storage-content-api/client.js +36 -0
- package/dist/storage-content-api/generateURL.d.ts +7 -0
- package/dist/storage-content-api/generateURL.js +8 -0
- package/dist/storage-content-api/handleDelete.d.ts +8 -0
- package/dist/storage-content-api/handleDelete.js +17 -0
- package/dist/storage-content-api/handleUpload.d.ts +11 -0
- package/dist/storage-content-api/handleUpload.js +144 -0
- package/dist/storage-content-api/index.d.ts +5 -0
- package/dist/storage-content-api/index.js +31 -0
- package/dist/storage-content-api/staticHandler.d.ts +10 -0
- package/dist/storage-content-api/staticHandler.js +56 -0
- package/dist/storage-content-api/types.d.ts +10 -0
- package/dist/storage-content-api/types.js +3 -0
- package/dist/storage-content-api/utilities/getSafeFilename.d.ts +12 -0
- package/dist/storage-content-api/utilities/getSafeFilename.js +61 -0
- package/dist/storage-content-api/utilities/index.d.ts +2 -0
- package/dist/storage-content-api/utilities/index.js +3 -0
- package/dist/templates/.env.example +5 -0
- package/dist/templates/README.md +19 -0
- package/dist/types/config.d.ts +2 -1
- package/dist/types/config.js +0 -2
- package/dist/types.d.ts +8 -1
- package/dist/utils/adapters/nextjs.d.ts +9 -0
- package/dist/utils/adapters/nextjs.js +64 -0
- package/dist/utils/adapters/nitro.d.ts +9 -0
- package/dist/utils/adapters/nitro.js +169 -0
- package/dist/utils/adapters/vite.d.ts +10 -0
- package/dist/utils/adapters/vite.js +33 -0
- package/dist/utils/asset-collection.d.ts +27 -6
- package/dist/utils/asset-collection.js +59 -30
- package/dist/utils/build-detection.d.ts +5 -11
- package/dist/utils/build-detection.js +74 -11
- package/dist/utils/build-lambda-zip.d.ts +14 -0
- package/dist/utils/build-lambda-zip.js +81 -0
- package/dist/utils/cache-bootstrap.d.ts +8 -0
- package/dist/utils/cache-bootstrap.js +18 -0
- package/dist/utils/config.js +1 -1
- package/dist/utils/deploy-adapter.d.ts +40 -0
- package/dist/utils/deploy-adapter.js +58 -0
- package/dist/utils/download-template.js +3 -2
- package/dist/utils/env-management.d.ts +24 -7
- package/dist/utils/env-management.js +119 -64
- package/dist/utils/format-env-suffix.d.ts +12 -0
- package/dist/utils/format-env-suffix.js +13 -0
- package/dist/utils/formatter.js +23 -11
- package/dist/utils/fs-utils.d.ts +6 -0
- package/dist/utils/fs-utils.js +27 -0
- package/dist/utils/handle-upgrade.d.ts +9 -0
- package/dist/utils/handle-upgrade.js +41 -0
- package/dist/utils/lambda-config.d.ts +3 -1
- package/dist/utils/lambda-config.js +75 -78
- package/dist/utils/messages.d.ts +1 -2
- package/dist/utils/messages.js +29 -11
- package/dist/utils/package-manager.d.ts +24 -0
- package/dist/utils/package-manager.js +53 -0
- package/dist/utils/payload-config-ast.d.ts +27 -6
- package/dist/utils/payload-config-ast.js +106 -58
- package/dist/utils/payload-config-finder.d.ts +2 -2
- package/dist/utils/payload-config-finder.js +48 -9
- package/dist/utils/payload-config-modifier.d.ts +1 -1
- package/dist/utils/payload-config-modifier.js +70 -11
- package/dist/utils/payload-package-check.d.ts +12 -1
- package/dist/utils/payload-package-check.js +63 -5
- package/dist/utils/project.d.ts +3 -2
- package/dist/utils/project.js +29 -15
- package/dist/utils/resolve-environment.d.ts +14 -0
- package/dist/utils/resolve-environment.js +31 -0
- package/dist/utils/s3-upload.d.ts +7 -2
- package/dist/utils/s3-upload.js +39 -6
- package/dist/utils/token-display.js +11 -5
- package/dist/utils/typescript-validator.js +4 -6
- package/dist/utils/version-check.d.ts +3 -0
- package/dist/utils/version-check.js +38 -0
- package/package.json +33 -15
- package/dist/api/control-plane.d.ts.map +0 -1
- package/dist/api/control-plane.js.map +0 -1
- package/dist/api/figma-api.d.ts.map +0 -1
- package/dist/api/figma-api.js.map +0 -1
- package/dist/auth/browser.d.ts.map +0 -1
- package/dist/auth/browser.js.map +0 -1
- package/dist/auth/callback-server.d.ts.map +0 -1
- package/dist/auth/callback-server.js.map +0 -1
- package/dist/auth/crypto-utils.d.ts.map +0 -1
- package/dist/auth/crypto-utils.js.map +0 -1
- package/dist/auth/jwt-validator.d.ts.map +0 -1
- package/dist/auth/jwt-validator.js.map +0 -1
- package/dist/auth/oauth-flow.d.ts.map +0 -1
- package/dist/auth/oauth-flow.js.map +0 -1
- package/dist/auth/pkce.d.ts.map +0 -1
- package/dist/auth/pkce.js.map +0 -1
- package/dist/auth/project-token.d.ts.map +0 -1
- package/dist/auth/project-token.js.map +0 -1
- package/dist/auth/refresh.d.ts.map +0 -1
- package/dist/auth/refresh.js.map +0 -1
- package/dist/auth/token-store.d.ts.map +0 -1
- package/dist/auth/token-store.js.map +0 -1
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list-tokens.d.ts.map +0 -1
- package/dist/commands/list-tokens.js.map +0 -1
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts.map +0 -1
- package/dist/commands/logout.js.map +0 -1
- package/dist/config/oauth.d.ts.map +0 -1
- package/dist/config/oauth.js.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/exports/client.d.ts.map +0 -1
- package/dist/exports/client.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/oauth/components/LoginButton/index.d.ts.map +0 -1
- package/dist/oauth/components/LoginButton/index.js.map +0 -1
- package/dist/oauth/components/LogoutButton/index.d.ts.map +0 -1
- package/dist/oauth/components/LogoutButton/index.js.map +0 -1
- package/dist/oauth/defaults.d.ts.map +0 -1
- package/dist/oauth/defaults.js.map +0 -1
- package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +0 -1
- package/dist/oauth/endpoints/getLoginEndpoint.js.map +0 -1
- package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +0 -1
- package/dist/oauth/endpoints/getLogoutEndpoint.js.map +0 -1
- package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +0 -1
- package/dist/oauth/endpoints/getMetaEndpoint.js.map +0 -1
- package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +0 -1
- package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +0 -1
- package/dist/oauth/exports/client.d.ts.map +0 -1
- package/dist/oauth/exports/client.js.map +0 -1
- package/dist/oauth/hooks/afterLogout.d.ts.map +0 -1
- package/dist/oauth/hooks/afterLogout.js.map +0 -1
- package/dist/oauth/hooks/me.d.ts.map +0 -1
- package/dist/oauth/hooks/me.js.map +0 -1
- package/dist/oauth/hooks/refresh.d.ts.map +0 -1
- package/dist/oauth/hooks/refresh.js.map +0 -1
- package/dist/oauth/index.d.ts.map +0 -1
- package/dist/oauth/index.js.map +0 -1
- package/dist/oauth/strategy/index.d.ts.map +0 -1
- package/dist/oauth/strategy/index.js.map +0 -1
- package/dist/oauth/types.d.ts.map +0 -1
- package/dist/oauth/types.js.map +0 -1
- package/dist/oauth/utilities/clearCookie.d.ts.map +0 -1
- package/dist/oauth/utilities/clearCookie.js.map +0 -1
- package/dist/oauth/utilities/createCookieOptions.d.ts.map +0 -1
- package/dist/oauth/utilities/createCookieOptions.js.map +0 -1
- package/dist/oauth/utilities/createDebugLogger.d.ts.map +0 -1
- package/dist/oauth/utilities/createDebugLogger.js.map +0 -1
- package/dist/oauth/utilities/extractOrigin.d.ts.map +0 -1
- package/dist/oauth/utilities/extractOrigin.js.map +0 -1
- package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +0 -1
- package/dist/oauth/utilities/getAdminCollectionSlug.js.map +0 -1
- package/dist/oauth/utilities/getAdminPath.d.ts +0 -8
- package/dist/oauth/utilities/getAdminPath.d.ts.map +0 -1
- package/dist/oauth/utilities/getAdminPath.js +0 -9
- package/dist/oauth/utilities/getAdminPath.js.map +0 -1
- package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +0 -1
- package/dist/oauth/utilities/getAuthorizeURL.js.map +0 -1
- package/dist/oauth/utilities/getCookieExpiration.d.ts.map +0 -1
- package/dist/oauth/utilities/getCookieExpiration.js.map +0 -1
- package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +0 -1
- package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +0 -1
- package/dist/oauth/utilities/getTokenExp.d.ts.map +0 -1
- package/dist/oauth/utilities/getTokenExp.js.map +0 -1
- package/dist/oauth/utilities/getUsernameField.d.ts.map +0 -1
- package/dist/oauth/utilities/getUsernameField.js.map +0 -1
- package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +0 -1
- package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +0 -1
- package/dist/oauth/utilities/mergeHeaders.d.ts.map +0 -1
- package/dist/oauth/utilities/mergeHeaders.js.map +0 -1
- package/dist/oauth/utilities/refreshTokens.d.ts.map +0 -1
- package/dist/oauth/utilities/refreshTokens.js.map +0 -1
- package/dist/plugin/adapter.d.ts.map +0 -1
- package/dist/plugin/adapter.js.map +0 -1
- package/dist/plugin/build-config.d.ts.map +0 -1
- package/dist/plugin/build-config.js.map +0 -1
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/asset-collection.d.ts.map +0 -1
- package/dist/utils/asset-collection.js.map +0 -1
- package/dist/utils/build-detection.d.ts.map +0 -1
- package/dist/utils/build-detection.js.map +0 -1
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/download-template.d.ts.map +0 -1
- package/dist/utils/download-template.js.map +0 -1
- package/dist/utils/env-management.d.ts.map +0 -1
- package/dist/utils/env-management.js.map +0 -1
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/formatter.d.ts.map +0 -1
- package/dist/utils/formatter.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/is-debug.d.ts.map +0 -1
- package/dist/utils/is-debug.js.map +0 -1
- package/dist/utils/lambda-config.d.ts.map +0 -1
- package/dist/utils/lambda-config.js.map +0 -1
- package/dist/utils/log.d.ts.map +0 -1
- package/dist/utils/log.js.map +0 -1
- package/dist/utils/messages.d.ts.map +0 -1
- package/dist/utils/messages.js.map +0 -1
- package/dist/utils/package-manager.d.ts.map +0 -1
- package/dist/utils/package-manager.js.map +0 -1
- package/dist/utils/payload-config-ast.d.ts.map +0 -1
- package/dist/utils/payload-config-ast.js.map +0 -1
- package/dist/utils/payload-config-finder.d.ts.map +0 -1
- package/dist/utils/payload-config-finder.js.map +0 -1
- package/dist/utils/payload-config-modifier.d.ts.map +0 -1
- package/dist/utils/payload-config-modifier.js.map +0 -1
- package/dist/utils/payload-package-check.d.ts.map +0 -1
- package/dist/utils/payload-package-check.js.map +0 -1
- package/dist/utils/project.d.ts.map +0 -1
- package/dist/utils/project.js.map +0 -1
- package/dist/utils/s3-upload.d.ts.map +0 -1
- package/dist/utils/s3-upload.js.map +0 -1
- package/dist/utils/token-display.d.ts.map +0 -1
- package/dist/utils/token-display.js.map +0 -1
- package/dist/utils/typescript-validator.d.ts.map +0 -1
- package/dist/utils/typescript-validator.js.map +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload API types extracted from Content API OpenAPI spec.
|
|
3
|
+
* These are kept separate to avoid breaking changes when the main spec is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
export type UploadPaths = {
|
|
6
|
+
'/api/v0/uploads/{collectionId}/{filename}': {
|
|
7
|
+
delete: {
|
|
8
|
+
parameters: {
|
|
9
|
+
path: {
|
|
10
|
+
collectionId: string;
|
|
11
|
+
filename: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
responses: {
|
|
15
|
+
200: {
|
|
16
|
+
content: {
|
|
17
|
+
'application/json': {
|
|
18
|
+
success: true;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
'/api/v0/uploads/download/sign': {
|
|
26
|
+
post: {
|
|
27
|
+
requestBody: {
|
|
28
|
+
content: {
|
|
29
|
+
'application/json': {
|
|
30
|
+
collectionId: string;
|
|
31
|
+
expiresIn: number;
|
|
32
|
+
filename: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
responses: {
|
|
37
|
+
200: {
|
|
38
|
+
content: {
|
|
39
|
+
'application/json': {
|
|
40
|
+
url: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
'/api/v0/uploads/multipart/abort': {
|
|
48
|
+
post: {
|
|
49
|
+
requestBody: {
|
|
50
|
+
content: {
|
|
51
|
+
'application/json': {
|
|
52
|
+
collectionId: string;
|
|
53
|
+
filename: string;
|
|
54
|
+
uploadId: string;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
responses: {
|
|
59
|
+
200: {
|
|
60
|
+
content: {
|
|
61
|
+
'application/json': {
|
|
62
|
+
success: true;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
'/api/v0/uploads/multipart/complete': {
|
|
70
|
+
post: {
|
|
71
|
+
requestBody: {
|
|
72
|
+
content: {
|
|
73
|
+
'application/json': {
|
|
74
|
+
collectionId: string;
|
|
75
|
+
filename: string;
|
|
76
|
+
parts: Array<{
|
|
77
|
+
ETag: string;
|
|
78
|
+
PartNumber: number;
|
|
79
|
+
}>;
|
|
80
|
+
uploadId: string;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
responses: {
|
|
85
|
+
200: {
|
|
86
|
+
content: {
|
|
87
|
+
'application/json': {
|
|
88
|
+
success: true;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
'/api/v0/uploads/multipart/initiate': {
|
|
96
|
+
post: {
|
|
97
|
+
requestBody: {
|
|
98
|
+
content: {
|
|
99
|
+
'application/json': {
|
|
100
|
+
collectionId: string;
|
|
101
|
+
contentType: string;
|
|
102
|
+
filename: string;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
responses: {
|
|
107
|
+
200: {
|
|
108
|
+
content: {
|
|
109
|
+
'application/json': {
|
|
110
|
+
uploadId: string;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
'/api/v0/uploads/multipart/parts': {
|
|
118
|
+
post: {
|
|
119
|
+
requestBody: {
|
|
120
|
+
content: {
|
|
121
|
+
'application/json': {
|
|
122
|
+
collectionId: string;
|
|
123
|
+
expiresIn: number;
|
|
124
|
+
filename: string;
|
|
125
|
+
partNumbers: number[];
|
|
126
|
+
uploadId: string;
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
responses: {
|
|
131
|
+
200: {
|
|
132
|
+
content: {
|
|
133
|
+
'application/json': {
|
|
134
|
+
parts: Array<{
|
|
135
|
+
partNumber: number;
|
|
136
|
+
url: string;
|
|
137
|
+
}>;
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
'/api/v0/uploads/sign': {
|
|
145
|
+
post: {
|
|
146
|
+
requestBody: {
|
|
147
|
+
content: {
|
|
148
|
+
'application/json': {
|
|
149
|
+
collectionId: string;
|
|
150
|
+
contentType?: string;
|
|
151
|
+
expiresIn: number;
|
|
152
|
+
filename: string;
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
responses: {
|
|
157
|
+
200: {
|
|
158
|
+
content: {
|
|
159
|
+
'application/json': {
|
|
160
|
+
url: string;
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=api-types.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const ContentApiClientUploadHandler: ({ children, collectionSlug, enabled, extra, prefix, serverHandlerPath, }: {
|
|
2
|
+
children: import("react").ReactNode;
|
|
3
|
+
collectionSlug: import("payload").UploadCollectionSlug;
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
extra: Record<string, unknown>;
|
|
6
|
+
prefix?: string;
|
|
7
|
+
serverHandlerPath: `/${string}`;
|
|
8
|
+
}) => import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=ClientUploadHandler.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client';
|
|
3
|
+
export const ContentApiClientUploadHandler = createClientUploadHandler({
|
|
4
|
+
handler: async ({ apiRoute, collectionSlug, file, prefix, serverHandlerPath, serverURL })=>{
|
|
5
|
+
// Build endpoint URL: serverURL + apiRoute + serverHandlerPath
|
|
6
|
+
const endpointRoute = `${serverURL}${apiRoute}${serverHandlerPath}`;
|
|
7
|
+
const response = await fetch(endpointRoute, {
|
|
8
|
+
body: JSON.stringify({
|
|
9
|
+
collectionSlug,
|
|
10
|
+
filename: file.name,
|
|
11
|
+
mimeType: file.type
|
|
12
|
+
}),
|
|
13
|
+
credentials: 'include',
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/json'
|
|
16
|
+
},
|
|
17
|
+
method: 'POST'
|
|
18
|
+
});
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
throw new Error(`Failed to get presigned URL: ${response.status} ${response.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
const { filename: safeFilename, url } = await response.json();
|
|
23
|
+
const uploadFilename = safeFilename || file.name;
|
|
24
|
+
const uploadResponse = await fetch(url, {
|
|
25
|
+
body: file,
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': file.type
|
|
28
|
+
},
|
|
29
|
+
method: 'PUT'
|
|
30
|
+
});
|
|
31
|
+
if (!uploadResponse.ok) {
|
|
32
|
+
throw new Error(`Failed to upload to S3: ${uploadResponse.status} ${uploadResponse.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
clientUploaded: true,
|
|
36
|
+
filename: uploadFilename,
|
|
37
|
+
prefix
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=ClientUploadHandler.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PayloadHandler } from 'payload';
|
|
2
|
+
import type { StorageClient } from '../client.js';
|
|
3
|
+
type ClientUploadsAccess = (args: {
|
|
4
|
+
collectionSlug: string;
|
|
5
|
+
req: Parameters<PayloadHandler>[0];
|
|
6
|
+
}) => boolean | Promise<boolean>;
|
|
7
|
+
type Args = {
|
|
8
|
+
access?: ClientUploadsAccess;
|
|
9
|
+
client: StorageClient;
|
|
10
|
+
};
|
|
11
|
+
export declare const getGenerateSignedURLHandler: ({ access, client, }: Args) => PayloadHandler;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=generateSignedURL.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { APIError, Forbidden } from 'payload';
|
|
2
|
+
import { getSafeFilename } from '../utilities/index.js';
|
|
3
|
+
const defaultAccess = ({ req })=>!!req.user;
|
|
4
|
+
export const getGenerateSignedURLHandler = ({ access = defaultAccess, client })=>{
|
|
5
|
+
return async (req)=>{
|
|
6
|
+
if (!req.json) {
|
|
7
|
+
throw new APIError('Content-Type expected to be application/json', 400);
|
|
8
|
+
}
|
|
9
|
+
const { collectionSlug, filename, mimeType } = await req.json();
|
|
10
|
+
if (!await access({
|
|
11
|
+
collectionSlug,
|
|
12
|
+
req
|
|
13
|
+
})) {
|
|
14
|
+
throw new Forbidden();
|
|
15
|
+
}
|
|
16
|
+
const safeFilename = await getSafeFilename({
|
|
17
|
+
collectionSlug,
|
|
18
|
+
desiredFilename: filename,
|
|
19
|
+
req
|
|
20
|
+
});
|
|
21
|
+
const { data, error } = await client.POST('/api/v0/uploads/sign', {
|
|
22
|
+
body: {
|
|
23
|
+
collectionId: collectionSlug,
|
|
24
|
+
contentType: mimeType,
|
|
25
|
+
expiresIn: 3600,
|
|
26
|
+
filename: safeFilename
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
if (error || !data) {
|
|
30
|
+
throw new APIError(`Failed to get presigned upload URL: ${JSON.stringify(error)}`);
|
|
31
|
+
}
|
|
32
|
+
return Response.json({
|
|
33
|
+
filename: safeFilename,
|
|
34
|
+
url: data.url
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=generateSignedURL.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import createClient from 'openapi-fetch';
|
|
2
|
+
import type { UploadPaths } from './api-types.js';
|
|
3
|
+
import type { StorageClientConfig } from './types.js';
|
|
4
|
+
export type StorageClient = ReturnType<typeof createClient<UploadPaths>>;
|
|
5
|
+
export declare function createStorageClient(config: StorageClientConfig): StorageClient;
|
|
6
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import createClient from 'openapi-fetch';
|
|
2
|
+
import { getValidProjectToken } from '../auth/project-token.js';
|
|
3
|
+
import { fetchDevJwt } from '../db-content-api/utilities/auth.js';
|
|
4
|
+
export function createStorageClient(config) {
|
|
5
|
+
const client = createClient({
|
|
6
|
+
baseUrl: config.baseUrl
|
|
7
|
+
});
|
|
8
|
+
client.use(createStorageAuthMiddleware(config));
|
|
9
|
+
return client;
|
|
10
|
+
}
|
|
11
|
+
function createStorageAuthMiddleware(config) {
|
|
12
|
+
return {
|
|
13
|
+
async onRequest ({ request }) {
|
|
14
|
+
if ('contentApiKey' in config) {
|
|
15
|
+
request.headers.set('X-Api-Key', config.contentApiKey);
|
|
16
|
+
} else {
|
|
17
|
+
const { auth, contentSystemId } = config;
|
|
18
|
+
if (auth.mode === 'apiKey') {
|
|
19
|
+
request.headers.set('X-Api-Key', auth.apiKey);
|
|
20
|
+
} else if (auth.mode === 'tokenStore') {
|
|
21
|
+
const token = await getValidProjectToken(auth.tokenStore, contentSystemId);
|
|
22
|
+
if (!token) {
|
|
23
|
+
throw new Error('Authentication required. Run `npx @payloadcms/figma login` to authenticate.');
|
|
24
|
+
}
|
|
25
|
+
request.headers.set('Authorization', `Bearer ${token}`);
|
|
26
|
+
} else {
|
|
27
|
+
const token = await fetchDevJwt(config.baseUrl, contentSystemId);
|
|
28
|
+
request.headers.set('Authorization', `Bearer ${token}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return request;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
export const getGenerateURL = ({ baseUrl })=>({ collection, filename, prefix = '' })=>{
|
|
3
|
+
const collectionId = collection.slug;
|
|
4
|
+
const fileKey = path.posix.join(prefix, filename);
|
|
5
|
+
return `${baseUrl}/api/v0/uploads/download/${collectionId}/${encodeURIComponent(fileKey)}`;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=generateURL.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types';
|
|
2
|
+
import type { StorageClient } from './client.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
client: StorageClient;
|
|
5
|
+
};
|
|
6
|
+
export declare const getHandleDelete: ({ client }: Args) => HandleDelete;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=handleDelete.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
export const getHandleDelete = ({ client })=>{
|
|
3
|
+
return async ({ collection, doc: { prefix = '' }, filename })=>{
|
|
4
|
+
const collectionId = collection.slug;
|
|
5
|
+
const fileKey = path.posix.join(prefix, filename);
|
|
6
|
+
await client.DELETE('/api/v0/uploads/{collectionId}/{filename}', {
|
|
7
|
+
params: {
|
|
8
|
+
path: {
|
|
9
|
+
collectionId,
|
|
10
|
+
filename: fileKey
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=handleDelete.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types';
|
|
2
|
+
import type { CollectionConfig } from 'payload';
|
|
3
|
+
import type { StorageClient } from './client.js';
|
|
4
|
+
type Args = {
|
|
5
|
+
client: StorageClient;
|
|
6
|
+
collection: CollectionConfig;
|
|
7
|
+
prefix?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const getHandleUpload: ({ client, collection, prefix }: Args) => HandleUpload;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=handleUpload.d.ts.map
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const PART_SIZE = 64 * 1024 * 1024 // 64MB per part
|
|
4
|
+
;
|
|
5
|
+
const MAX_FILE_SIZE_BEFORE_MULTIPART = 100 * 1024 * 1024 // 100MB
|
|
6
|
+
;
|
|
7
|
+
export const getHandleUpload = ({ client, collection, prefix = '' })=>{
|
|
8
|
+
return async ({ clientUploadContext, data, file })=>{
|
|
9
|
+
// Skip if client already uploaded THIS SPECIFIC file
|
|
10
|
+
// clientUploadContext.filename contains the original filename that was client-uploaded
|
|
11
|
+
// Resized versions (different filename) should still be uploaded
|
|
12
|
+
const clientUploadedFilename = clientUploadContext && typeof clientUploadContext === 'object' && 'filename' in clientUploadContext ? clientUploadContext.filename : undefined;
|
|
13
|
+
const isOriginalClientUploaded = clientUploadContext && typeof clientUploadContext === 'object' && 'clientUploaded' in clientUploadContext && clientUploadContext.clientUploaded && file.filename === clientUploadedFilename;
|
|
14
|
+
if (isOriginalClientUploaded) {
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
const collectionId = collection.slug;
|
|
18
|
+
const fileKey = path.posix.join(data.prefix || prefix, file.filename);
|
|
19
|
+
const fileData = file.tempFilePath ? fs.readFileSync(file.tempFilePath) : file.buffer;
|
|
20
|
+
const fileSize = file.filesize || fileData.length;
|
|
21
|
+
if (fileSize > MAX_FILE_SIZE_BEFORE_MULTIPART) {
|
|
22
|
+
await uploadMultipart({
|
|
23
|
+
client,
|
|
24
|
+
collectionId,
|
|
25
|
+
fileData,
|
|
26
|
+
fileKey,
|
|
27
|
+
mimeType: file.mimeType
|
|
28
|
+
});
|
|
29
|
+
} else {
|
|
30
|
+
await uploadSingleFile({
|
|
31
|
+
client,
|
|
32
|
+
collectionId,
|
|
33
|
+
fileData,
|
|
34
|
+
fileKey,
|
|
35
|
+
mimeType: file.mimeType
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return data;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
async function uploadSingleFile({ client, collectionId, fileData, fileKey, mimeType }) {
|
|
42
|
+
const { data, error } = await client.POST('/api/v0/uploads/sign', {
|
|
43
|
+
body: {
|
|
44
|
+
collectionId,
|
|
45
|
+
contentType: mimeType,
|
|
46
|
+
expiresIn: 3600,
|
|
47
|
+
filename: fileKey
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
if (error || !data) {
|
|
51
|
+
throw new Error(`Failed to get presigned upload URL: ${JSON.stringify(error)}`);
|
|
52
|
+
}
|
|
53
|
+
const uploadResponse = await fetch(data.url, {
|
|
54
|
+
body: fileData,
|
|
55
|
+
headers: {
|
|
56
|
+
'Content-Type': mimeType
|
|
57
|
+
},
|
|
58
|
+
method: 'PUT'
|
|
59
|
+
});
|
|
60
|
+
if (!uploadResponse.ok) {
|
|
61
|
+
throw new Error(`Failed to upload to S3: ${uploadResponse.status} ${uploadResponse.statusText}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function uploadMultipart({ client, collectionId, fileData, fileKey, mimeType }) {
|
|
65
|
+
const { data: initiateData, error: initiateError } = await client.POST('/api/v0/uploads/multipart/initiate', {
|
|
66
|
+
body: {
|
|
67
|
+
collectionId,
|
|
68
|
+
contentType: mimeType,
|
|
69
|
+
filename: fileKey
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
if (initiateError || !initiateData) {
|
|
73
|
+
throw new Error(`Failed to initiate multipart upload: ${JSON.stringify(initiateError)}`);
|
|
74
|
+
}
|
|
75
|
+
const { uploadId } = initiateData;
|
|
76
|
+
try {
|
|
77
|
+
const numParts = Math.ceil(fileData.length / PART_SIZE);
|
|
78
|
+
const partNumbers = Array.from({
|
|
79
|
+
length: numParts
|
|
80
|
+
}, (_, i)=>i + 1);
|
|
81
|
+
const { data: partsData, error: partsError } = await client.POST('/api/v0/uploads/multipart/parts', {
|
|
82
|
+
body: {
|
|
83
|
+
collectionId,
|
|
84
|
+
expiresIn: 3600,
|
|
85
|
+
filename: fileKey,
|
|
86
|
+
partNumbers,
|
|
87
|
+
uploadId
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
if (partsError || !partsData) {
|
|
91
|
+
throw new Error(`Failed to get part URLs: ${JSON.stringify(partsError)}`);
|
|
92
|
+
}
|
|
93
|
+
const { parts } = partsData;
|
|
94
|
+
if (!parts || !Array.isArray(parts)) {
|
|
95
|
+
throw new Error('Invalid response from part URLs endpoint: parts is not an array');
|
|
96
|
+
}
|
|
97
|
+
const uploadedParts = await Promise.all(parts.map(async ({ partNumber, url })=>{
|
|
98
|
+
const start = (partNumber - 1) * PART_SIZE;
|
|
99
|
+
const end = Math.min(start + PART_SIZE, fileData.length);
|
|
100
|
+
const partData = fileData.slice(start, end);
|
|
101
|
+
const uploadResponse = await fetch(url, {
|
|
102
|
+
body: partData,
|
|
103
|
+
headers: {
|
|
104
|
+
'Content-Type': mimeType
|
|
105
|
+
},
|
|
106
|
+
method: 'PUT'
|
|
107
|
+
});
|
|
108
|
+
const etag = uploadResponse.headers.get('ETag');
|
|
109
|
+
if (!etag) {
|
|
110
|
+
throw new Error(`No ETag returned for part ${partNumber}`);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
ETag: etag,
|
|
114
|
+
PartNumber: partNumber
|
|
115
|
+
};
|
|
116
|
+
}));
|
|
117
|
+
const { error: completeError } = await client.POST('/api/v0/uploads/multipart/complete', {
|
|
118
|
+
body: {
|
|
119
|
+
collectionId,
|
|
120
|
+
filename: fileKey,
|
|
121
|
+
parts: uploadedParts,
|
|
122
|
+
uploadId
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
if (completeError) {
|
|
126
|
+
throw new Error(`Failed to complete multipart upload: ${JSON.stringify(completeError)}`);
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
try {
|
|
130
|
+
await client.POST('/api/v0/uploads/multipart/abort', {
|
|
131
|
+
body: {
|
|
132
|
+
collectionId,
|
|
133
|
+
filename: fileKey,
|
|
134
|
+
uploadId
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
} catch {
|
|
138
|
+
// Ignore abort errors
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=handleUpload.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Adapter } from '@payloadcms/plugin-cloud-storage/types';
|
|
2
|
+
import type { StorageClientConfig } from './types.js';
|
|
3
|
+
export type { StorageClientConfig } from './types.js';
|
|
4
|
+
export declare function contentApiStorageAdapter(config: StorageClientConfig): Adapter;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createStorageClient } from './client.js';
|
|
2
|
+
import { getGenerateURL } from './generateURL.js';
|
|
3
|
+
import { getHandleDelete } from './handleDelete.js';
|
|
4
|
+
import { getHandleUpload } from './handleUpload.js';
|
|
5
|
+
import { getHandler } from './staticHandler.js';
|
|
6
|
+
export function contentApiStorageAdapter(config) {
|
|
7
|
+
return ({ collection, prefix })=>{
|
|
8
|
+
const client = createStorageClient(config);
|
|
9
|
+
const baseUrl = config.baseUrl;
|
|
10
|
+
return {
|
|
11
|
+
name: 'content-api',
|
|
12
|
+
generateURL: getGenerateURL({
|
|
13
|
+
baseUrl
|
|
14
|
+
}),
|
|
15
|
+
handleDelete: getHandleDelete({
|
|
16
|
+
client
|
|
17
|
+
}),
|
|
18
|
+
handleUpload: getHandleUpload({
|
|
19
|
+
client,
|
|
20
|
+
collection,
|
|
21
|
+
prefix
|
|
22
|
+
}),
|
|
23
|
+
staticHandler: getHandler({
|
|
24
|
+
client,
|
|
25
|
+
collection
|
|
26
|
+
})
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types';
|
|
2
|
+
import type { CollectionConfig } from 'payload';
|
|
3
|
+
import type { StorageClient } from './client.js';
|
|
4
|
+
type Args = {
|
|
5
|
+
client: StorageClient;
|
|
6
|
+
collection: CollectionConfig;
|
|
7
|
+
};
|
|
8
|
+
export declare const getHandler: ({ client, collection }: Args) => StaticHandler;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=staticHandler.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export const getHandler = ({ client, collection })=>{
|
|
4
|
+
return async (req, { params: { clientUploadContext, filename } })=>{
|
|
5
|
+
try {
|
|
6
|
+
const prefix = await getFilePrefix({
|
|
7
|
+
clientUploadContext,
|
|
8
|
+
collection,
|
|
9
|
+
filename,
|
|
10
|
+
req
|
|
11
|
+
});
|
|
12
|
+
const key = path.posix.join(prefix, filename);
|
|
13
|
+
const { data, error } = await client.POST('/api/v0/uploads/download/sign', {
|
|
14
|
+
body: {
|
|
15
|
+
collectionId: collection.slug,
|
|
16
|
+
expiresIn: 7200,
|
|
17
|
+
filename: key
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
if (error || !data) {
|
|
21
|
+
req.payload.logger.error(`Failed to get signed download URL: ${JSON.stringify(error)}`);
|
|
22
|
+
return new Response('Internal Server Error', {
|
|
23
|
+
status: 500
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Fetch file bytes from S3 (required for Payload's image processing)
|
|
27
|
+
const fileResponse = await fetch(data.url);
|
|
28
|
+
if (!fileResponse.ok) {
|
|
29
|
+
req.payload.logger.error(`S3 fetch failed: ${fileResponse.status} ${fileResponse.statusText}`);
|
|
30
|
+
return new Response('Failed to fetch file from storage', {
|
|
31
|
+
status: 502
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const contentType = fileResponse.headers.get('content-type') || 'application/octet-stream';
|
|
35
|
+
const contentLength = fileResponse.headers.get('content-length');
|
|
36
|
+
return new Response(fileResponse.body, {
|
|
37
|
+
headers: {
|
|
38
|
+
'Content-Type': contentType,
|
|
39
|
+
...contentLength && {
|
|
40
|
+
'Content-Length': contentLength
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
} catch (err) {
|
|
45
|
+
req.payload.logger.error({
|
|
46
|
+
err,
|
|
47
|
+
msg: 'Error in staticHandler'
|
|
48
|
+
});
|
|
49
|
+
return new Response('Internal Server Error', {
|
|
50
|
+
status: 500
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=staticHandler.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AuthMode } from '../db-content-api/utilities/auth.js';
|
|
2
|
+
export type StorageClientConfig = {
|
|
3
|
+
auth: AuthMode;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
contentSystemId: string;
|
|
6
|
+
} | {
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
contentApiKey: string;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PayloadRequest } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Get a safe filename that doesn't collide with existing documents
|
|
4
|
+
* Similar to Payload's getSafeFileName
|
|
5
|
+
*/
|
|
6
|
+
export declare function getSafeFilename({ collectionSlug, desiredFilename, prefix, req, }: {
|
|
7
|
+
collectionSlug: string;
|
|
8
|
+
desiredFilename: string;
|
|
9
|
+
prefix?: string;
|
|
10
|
+
req: PayloadRequest;
|
|
11
|
+
}): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=getSafeFilename.d.ts.map
|