@strapi/provider-upload-aws-s3
Version:
AWS S3 provider for strapi upload
1 lines • 7.13 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","sources":["../src/utils.ts"],"sourcesContent":["import type { AwsCredentialIdentity, AwsCredentialIdentityProvider } from '@aws-sdk/types';\nimport type { DefaultOptions, InitOptions } from '.';\n\nconst ENDPOINT_PATTERN = /^(.+\\.)?s3[.-]([a-z0-9-]+)\\./;\n\ninterface BucketInfo {\n bucket?: string | null;\n err?: string;\n}\n\nexport function isUrlFromBucket(fileUrl: string, bucketName: string, baseUrl = ''): boolean {\n try {\n const url = new URL(fileUrl);\n\n if (baseUrl) {\n return false;\n }\n\n const { bucket } = getBucketFromAwsUrl(fileUrl);\n\n if (bucket) {\n return bucket === bucketName;\n }\n\n return url.host.startsWith(`${bucketName}.`) || url.pathname.includes(`/${bucketName}/`);\n } catch {\n return false;\n }\n}\n\n/**\n * Parse the bucket name from a URL.\n * See all URL formats in https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-bucket-intro.html\n *\n * @param {string} fileUrl - the URL to parse\n * @returns {object} result\n * @returns {string} result.bucket - the bucket name\n * @returns {string} result.err - if any\n */\nfunction getBucketFromAwsUrl(fileUrl: string): BucketInfo {\n const url = new URL(fileUrl);\n\n // S3://<bucket-name>/<key>\n if (url.protocol === 's3:') {\n const bucket = url.host;\n\n if (!bucket) {\n return { err: `Invalid S3 url: no bucket: ${url}` };\n }\n return { bucket };\n }\n\n if (!url.host) {\n return { err: `Invalid S3 url: no hostname: ${url}` };\n }\n\n const matches = url.host.match(ENDPOINT_PATTERN);\n if (!matches) {\n return { err: `Invalid S3 url: hostname does not appear to be a valid S3 endpoint: ${url}` };\n }\n\n const prefix = matches[1];\n // https://s3.amazonaws.com/<bucket-name>\n if (!prefix) {\n if (url.pathname === '/') {\n return { bucket: null };\n }\n\n const index = url.pathname.indexOf('/', 1);\n\n // https://s3.amazonaws.com/<bucket-name>\n if (index === -1) {\n return { bucket: url.pathname.substring(1) };\n }\n\n // https://s3.amazonaws.com/<bucket-name>/\n if (index === url.pathname.length - 1) {\n return { bucket: url.pathname.substring(1, index) };\n }\n\n // https://s3.amazonaws.com/<bucket-name>/key\n return { bucket: url.pathname.substring(1, index) };\n }\n\n // https://<bucket-name>.s3.amazonaws.com/\n return { bucket: prefix.substring(0, prefix.length - 1) };\n}\n\nexport const extractCredentials = (\n options: InitOptions\n): AwsCredentialIdentity | AwsCredentialIdentityProvider | null => {\n const s3Options = (options as { s3Options?: DefaultOptions }).s3Options;\n\n // If a credential provider function is supplied, pass it through unchanged so the\n // AWS SDK resolves (and refreshes) credentials at runtime, rather than capturing a\n // single static value once at init. This supports credentials that change during\n // the process lifetime (e.g. periodically refreshed credentials).\n if (typeof s3Options?.credentials === 'function') {\n return s3Options.credentials as AwsCredentialIdentityProvider;\n }\n\n if (s3Options?.credentials) {\n return {\n accessKeyId: s3Options.credentials.accessKeyId,\n secretAccessKey: s3Options.credentials.secretAccessKey,\n ...(s3Options.credentials.sessionToken\n ? { sessionToken: s3Options.credentials.sessionToken }\n : {}),\n };\n }\n\n // Support root-level accessKeyId/secretAccessKey in s3Options for backwards\n // compatibility. AWS SDK v3 requires these inside a `credentials` object;\n // passing them at the top level silently fails (Access Denied).\n if (s3Options?.accessKeyId && s3Options?.secretAccessKey) {\n console.warn(\n \"[upload-aws-s3] Passing 'accessKeyId' and 'secretAccessKey' directly in s3Options is deprecated. \" +\n \"Please wrap them in a 'credentials' object: s3Options: { credentials: { accessKeyId, secretAccessKey } }.\"\n );\n return {\n accessKeyId: s3Options.accessKeyId,\n secretAccessKey: s3Options.secretAccessKey,\n };\n }\n\n return null;\n};\n"],"names":["ENDPOINT_PATTERN","isUrlFromBucket","fileUrl","bucketName","baseUrl","url","URL","bucket","getBucketFromAwsUrl","host","startsWith","pathname","includes","protocol","err","matches","match","prefix","index","indexOf","substring","length","extractCredentials","options","s3Options","credentials","accessKeyId","secretAccessKey","sessionToken","console","warn"],"mappings":"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"}