{"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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"}