UNPKG

@strapi-community/strapi-provider-upload-google-cloud-storage

Version:
1 lines 22.6 kB
{"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["import type { FileMetadata } from '@google-cloud/storage';\nimport type { ReadStream } from 'node:fs';\nimport path from 'node:path';\nimport slugify from 'slugify';\nimport { z } from 'zod';\n\nconst fileSchema = z.object({\n name: z.string(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n sizeInBytes: z.number(),\n url: z.string(),\n previewUrl: z.string().optional(),\n path: z.string().optional(),\n provider: z.string().optional(),\n provider_metadata: z.record(z.string(), z.unknown()).optional(),\n stream: z.unknown().optional(), // `ReadStream` can't be validated easily, so `any` or skip\n buffer: z.unknown().optional(), // same for `Buffer`\n});\n\nexport type File = z.infer<typeof fileSchema> & {\n stream?: ReadStream;\n buffer?: Buffer;\n};\n\nexport type FileAttributes = {\n contentType: string;\n gzip: Options['gzip'];\n metadata: FileMetadata;\n public?: boolean;\n};\n\nexport const serviceAccountSchema = z.object({\n project_id: z.string({\n error: (issue) =>\n issue.input === undefined\n ? 'Error parsing data \"Service Account JSON\". Missing \"project_id\" field in JSON file.'\n : 'Error parsing data \"Service Account JSON\". Property \"project_id\" must be a string.',\n }),\n client_email: z.string({\n error: (issue) =>\n issue.input === undefined\n ? 'Error parsing data \"Service Account JSON\". Missing \"client_email\" field in JSON file.'\n : 'Error parsing data \"Service Account JSON\". Property \"client_email\" must be a string.',\n }),\n private_key: z.string({\n error: (issue) =>\n issue.input === undefined\n ? 'Error parsing data \"Service Account JSON\". Missing \"private_key\" field in JSON file.'\n : 'Error parsing data \"Service Account JSON\". Property \"private_key\" must be a string.',\n }),\n});\n\nexport type ServiceAccount = z.infer<typeof serviceAccountSchema>;\n\ntype MetadataFn = (file: File) => FileMetadata;\ntype GetContentTypeFn = (file: File) => string;\ntype GenerateUploadFileNameFn = (basePath: string, file: File) => Promise<string> | string;\n\nconst defaultGetMetadata = (file: File) => {\n const asciiFileName = file.name.normalize('NFKD').replace(/[\\u0300-\\u036f]/g, '');\n return {\n contentDisposition: `inline; filename=\"${asciiFileName}\"`,\n cacheControl: 'public, max-age=3600',\n };\n};\n\nconst defaultGetContentType = (file: File) => file.mime;\n\nconst defaultGenerateUploadFileName = (basePath: string, file: File) => {\n const filePath = `${file.path ? file.path.slice(1) : file.hash}/`;\n const extension = file.ext?.toLowerCase() || '';\n const fileName = slugify(path.basename(file.hash));\n return `${basePath}${filePath}${fileName}${extension}`;\n};\n\nexport const optionsSchema = z.object({\n serviceAccount: z\n .preprocess((input) => {\n if (typeof input === 'string') {\n try {\n return JSON.parse(input);\n } catch {\n throw new Error(\n 'Error parsing data \"Service Account JSON\", please be sure to copy/paste the full JSON file.'\n );\n }\n }\n return input;\n }, serviceAccountSchema)\n .optional(),\n bucketName: z.string({\n error: (issue) =>\n issue.input === undefined\n ? 'Property \"bucketName\" is required'\n : 'Property \"bucketName\" must be a string',\n }),\n baseUrl: z.string().default('https://storage.googleapis.com/{bucket-name}'),\n basePath: z.string().default(''),\n publicFiles: z.boolean().or(z.stringbool()).default(true),\n uniform: z.boolean().or(z.stringbool()).default(false),\n skipCheckBucket: z.boolean().or(z.stringbool()).default(false),\n gzip: z.boolean().or(z.stringbool()).or(z.literal('auto')).default('auto'),\n cacheMaxAge: z.number().default(3600),\n expires: z.union([\n z.string(),\n z.date(),\n z\n .number()\n .min(0)\n .max(1000 * 60 * 60 * 24 * 7)\n .default(15 * 60 * 1000),\n ]),\n metadata: z\n .custom<MetadataFn>((val) => typeof val === 'function')\n .optional()\n .default(() => defaultGetMetadata),\n getContentType: z\n .custom<GetContentTypeFn>((val) => typeof val === 'function')\n .optional()\n .default(() => defaultGetContentType),\n generateUploadFileName: z\n .custom<GenerateUploadFileNameFn>((val) => typeof val === 'function')\n .optional()\n .default(() => defaultGenerateUploadFileName),\n});\n\nexport type Options = z.infer<typeof optionsSchema>;\n\nexport type DefaultOptions = Partial<Omit<Options, 'serviceAccount' | 'bucketName'>> & {\n bucketName: string;\n serviceAccount?: ServiceAccount | string;\n};\n","import type { Bucket, Storage } from '@google-cloud/storage';\nimport z from 'zod';\nimport {\n optionsSchema,\n type DefaultOptions,\n type File,\n type FileAttributes,\n type Options,\n} from './types';\n\nexport const getConfigDefaultValues = (config: DefaultOptions) => {\n try {\n return optionsSchema.parse(config);\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new Error(err.issues[0]?.message);\n } else {\n throw err;\n }\n }\n};\n\nexport const getExpires = (expires: Date | number | string) => {\n if (typeof expires === 'number') {\n return Date.now() + expires;\n }\n return expires;\n};\n\nexport const checkBucket = async (bucket: Bucket, bucketName: string) => {\n const [exists] = await bucket.exists();\n if (!exists) {\n throw new Error(\n `An error occurs when we try to retrieve the Bucket \"${bucketName}\". Check if bucket exist on Google Cloud Platform.`\n );\n }\n};\n\nexport const prepareUploadFile = async (\n file: File,\n config: Options,\n basePath: string,\n GCS: Storage\n) => {\n const fullFileName = await config.generateUploadFileName(basePath, file);\n const bucket = GCS.bucket(config.bucketName);\n if (!config.skipCheckBucket) {\n await checkBucket(bucket, config.bucketName);\n }\n\n const bucketFile = bucket.file(fullFileName);\n const [fileExists] = await bucketFile.exists();\n\n const fileAttributes: FileAttributes = {\n contentType: config.getContentType(file),\n gzip: config.gzip,\n metadata: config.metadata(file),\n };\n\n if (!config.uniform) {\n fileAttributes.public = config.publicFiles;\n }\n\n return { fileAttributes, bucketFile, fullFileName, fileExists };\n};\n","import type { GetSignedUrlConfig } from '@google-cloud/storage';\nimport { Storage } from '@google-cloud/storage';\nimport { pipeline } from 'node:stream/promises';\nimport type { DefaultOptions, File } from './types';\nimport { getConfigDefaultValues, getExpires, prepareUploadFile } from './utils';\n\nexport default {\n init(providedConfig: DefaultOptions) {\n const config = getConfigDefaultValues(providedConfig);\n const { serviceAccount } = config;\n\n const GCS = new Storage(\n serviceAccount && {\n projectId: serviceAccount.project_id,\n credentials: {\n client_email: serviceAccount.client_email,\n private_key: serviceAccount.private_key,\n },\n }\n );\n\n const basePath = `${config.basePath}/`.replace(/^\\/+/, '');\n const baseUrl = config.baseUrl.replace('{bucket-name}', config.bucketName);\n\n return {\n async upload(file: File) {\n try {\n const { fileAttributes, bucketFile, fullFileName, fileExists } = await prepareUploadFile(\n file,\n config,\n basePath,\n GCS\n );\n if (fileExists) {\n await this.delete(file);\n }\n\n if (file.buffer) {\n await bucketFile.save(file.buffer, fileAttributes);\n file.url = `${baseUrl}/${fullFileName}`;\n }\n } catch (error) {\n if (error instanceof Error && 'message' in error) {\n console.error(`Error uploading file to Google Cloud Storage: ${error.message}`);\n }\n throw error;\n }\n },\n async uploadStream(file: File) {\n try {\n const { fileAttributes, bucketFile, fullFileName, fileExists } = await prepareUploadFile(\n file,\n config,\n basePath,\n GCS\n );\n if (fileExists) {\n await this.delete(file);\n }\n\n if (file.stream) {\n await pipeline(file.stream, bucketFile.createWriteStream(fileAttributes));\n file.url = `${baseUrl}/${fullFileName}`;\n }\n } catch (error) {\n if (error instanceof Error && 'message' in error) {\n console.error(`Error uploading file to Google Cloud Storage: ${error.message}`);\n }\n throw error;\n }\n },\n async delete(file: File) {\n if (!file.url) {\n return;\n }\n\n const fileName = file.url.replace(`${baseUrl}/`, '');\n const bucket = GCS.bucket(config.bucketName);\n try {\n await bucket.file(fileName).delete();\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 404) {\n throw new Error('Remote file was not found, you may have to delete manually.');\n }\n throw error;\n }\n },\n isPrivate() {\n return !config.publicFiles;\n },\n async getSignedUrl(file: File) {\n // Check if we can sign URLs (requires service account with client_email)\n if (!serviceAccount || !serviceAccount.client_email) {\n // If using ADC or missing client_email, we cannot generate signed URLs\n if (!config.publicFiles) {\n throw new Error(\n 'Cannot generate signed URLs without service account credentials. ' +\n 'Either:\\n' +\n '1. Provide serviceAccount with client_email and private_key in your configuration, or\\n' +\n '2. Set publicFiles to true to use direct URLs instead of signed URLs.\\n' +\n 'For more information, see: https://github.com/strapi-community/strapi-provider-upload-google-cloud-storage#setting-up-google-authentication'\n );\n }\n\n // Fallback to direct URL for public files\n console.warn(\n 'Warning: Cannot generate signed URL without service account credentials. ' +\n 'Returning direct URL instead. This works only for public files.'\n );\n return { url: file.url };\n }\n\n try {\n const options: GetSignedUrlConfig = {\n version: 'v4',\n action: 'read',\n expires: getExpires(config.expires),\n };\n const fileName = file.url.replace(`${baseUrl}/`, '');\n const [url] = await GCS.bucket(config.bucketName).file(fileName).getSignedUrl(options);\n return { url };\n } catch (error) {\n if (error instanceof Error && error.message.includes('Cannot sign data without')) {\n throw new Error(\n `Failed to generate signed URL: ${error.message}\\n` +\n 'This usually means your service account credentials are incomplete. ' +\n 'Please ensure your serviceAccount configuration includes both client_email and private_key fields.'\n );\n }\n throw error;\n }\n },\n };\n },\n};\n"],"names":["z","object","name","string","alternativeText","optional","caption","width","number","height","formats","record","unknown","hash","ext","mime","size","sizeInBytes","url","previewUrl","path","provider","provider_metadata","stream","buffer","serviceAccountSchema","project_id","error","issue","input","undefined","client_email","private_key","defaultGetMetadata","file","asciiFileName","normalize","replace","contentDisposition","cacheControl","defaultGetContentType","defaultGenerateUploadFileName","basePath","filePath","slice","extension","toLowerCase","fileName","slugify","basename","optionsSchema","serviceAccount","preprocess","JSON","parse","Error","bucketName","baseUrl","default","publicFiles","boolean","or","stringbool","uniform","skipCheckBucket","gzip","literal","cacheMaxAge","expires","union","date","min","max","metadata","custom","val","getContentType","generateUploadFileName","getConfigDefaultValues","config","err","ZodError","issues","message","getExpires","Date","now","checkBucket","bucket","exists","prepareUploadFile","GCS","fullFileName","bucketFile","fileExists","fileAttributes","contentType","public","init","providedConfig","Storage","projectId","credentials","upload","delete","save","console","uploadStream","pipeline","createWriteStream","code","isPrivate","getSignedUrl","warn","options","version","action","includes"],"mappings":"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"}