{"version":3,"sources":["../src/uploader.ts","../src/config.ts"],"sourcesContent":["import OSS from 'ali-oss';\nimport { type OSSConfig, type UploadOptions, type UploadResult, type UploadMapping } from './types';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { glob } from 'glob';\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport cliProgress from 'cli-progress';\n\n// Constants\nconst MAX_FILENAME_DISPLAY_LENGTH = 40;\nconst DEFAULT_TIMEOUT = 60000;\nconst CONTENT_HASH_LENGTH = 8;\n\n/**\n * OSS Uploader class\n */\nexport class OSSUploader {\n  private client: OSS;\n  private config: OSSConfig;\n\n  constructor(config: OSSConfig) {\n    this.config = config;\n    this.client = new OSS({\n      region: config.region,\n      accessKeyId: config.accessKeyId,\n      accessKeySecret: config.accessKeySecret,\n      bucket: config.bucket,\n      endpoint: config.endpoint,\n      internal: config.internal,\n      secure: config.secure !== false, // Default to true\n      timeout: config.timeout || DEFAULT_TIMEOUT,\n    });\n  }\n\n  /**\n   * Generate OSS URL for a given path\n   * Properly encodes URL path segments including Chinese characters\n   */\n  private generateUrl(ossPath: string): string {\n    const secure = this.config.secure !== false;\n    const protocol = secure ? 'https' : 'http';\n    const endpoint = this.config.endpoint || `${this.config.region}.aliyuncs.com`;\n\n    // Encode each path segment separately to preserve '/' separators\n    const encodedPath = ossPath\n      .split('/')\n      .map(segment => encodeURIComponent(segment))\n      .join('/');\n\n    return `${protocol}://${this.config.bucket}.${endpoint}/${encodedPath}`;\n  }\n\n  /**\n   * Normalize path to use forward slashes\n   */\n  private normalizePath(filePath: string): string {\n    return filePath.replace(/\\\\/g, '/');\n  }\n\n  /**\n   * Generate content hash from file content\n   * Similar to webpack's chunkhash\n   */\n  private generateContentHash(filePath: string): string {\n    const fileBuffer = fs.readFileSync(filePath);\n    const hash = crypto.createHash('md5').update(fileBuffer).digest('hex');\n    return hash.substring(0, CONTENT_HASH_LENGTH);\n  }\n\n  /**\n   * Add content hash to filename\n   * Example: file.js -> file.a1b2c3d4.js\n   */\n  private addHashToFilename(filename: string, hash: string): string {\n    const ext = path.extname(filename);\n    const basename = path.basename(filename, ext);\n    return `${basename}.${hash}${ext}`;\n  }\n\n  /**\n   * Truncate filename for display\n   */\n  private truncateFilename(filename: string): string {\n    if (filename.length <= MAX_FILENAME_DISPLAY_LENGTH) {\n      return filename;\n    }\n    return '...' + filename.slice(-(MAX_FILENAME_DISPLAY_LENGTH - 3));\n  }\n\n  /**\n   * Check if file exists in OSS\n   * @returns true if exists, false if not exists\n   * @throws Error if check fails for other reasons\n   */\n  private async fileExistsInOSS(remotePath: string): Promise<boolean> {\n    try {\n      await this.client.head(remotePath);\n      return true;\n    } catch (error: any) {\n      if (error.code === 'NoSuchKey') {\n        return false;\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Collect files based on patterns\n   */\n  private async collectFiles(\n    localDir: string,\n    include?: string[],\n    exclude?: string[]\n  ): Promise<string[]> {\n    const patterns = include && include.length > 0 ? include : ['**/*'];\n    const ignorePatterns = exclude || [];\n\n    let allFiles: string[] = [];\n    for (const pattern of patterns) {\n      const fullPattern = path.join(localDir, pattern);\n      const files = await glob(fullPattern, {\n        nodir: true,\n        ignore: ignorePatterns,\n        absolute: true,\n      });\n      allFiles = allFiles.concat(files);\n    }\n\n    // Remove duplicates\n    return [...new Set(allFiles)];\n  }\n\n  /**\n   * Create progress bar for batch upload\n   */\n  private createProgressBar(): cliProgress.SingleBar {\n    return new cliProgress.SingleBar(\n      {\n        format:\n          'Upload Progress |' +\n          chalk.cyan('{bar}') +\n          '| {percentage}% | {value}/{total} Files | {currentFile}',\n        barCompleteChar: '\\u2588',\n        barIncompleteChar: '\\u2591',\n        hideCursor: true,\n      },\n      cliProgress.Presets.shades_classic\n    );\n  }\n\n  /**\n   * Upload file or directory to OSS\n   */\n  async upload(options: UploadOptions): Promise<UploadResult[]> {\n    const {\n      source,\n      target = '',\n      recursive = true,\n      overwrite = true,\n      include,\n      exclude,\n      verbose = false,\n      contentHash = true,\n    } = options;\n\n    if (!fs.existsSync(source)) {\n      throw new Error(chalk.red(`Source path does not exist: ${source}`));\n    }\n\n    const stats = fs.statSync(source);\n    const results: UploadResult[] = [];\n\n    if (stats.isFile()) {\n      // Upload single file\n      const result = await this.uploadFile(source, target, overwrite, verbose, contentHash);\n      results.push(result);\n    } else if (stats.isDirectory()) {\n      // Upload directory\n      if (!recursive) {\n        throw new Error(\n          chalk.red('Source is a directory. Use --recursive flag to upload directories.')\n        );\n      }\n      const dirResults = await this.uploadDirectory(\n        source,\n        target,\n        overwrite,\n        include,\n        exclude,\n        verbose,\n        contentHash\n      );\n      results.push(...dirResults);\n    } else {\n      throw new Error(chalk.red(`Invalid source: ${source}`));\n    }\n\n    // Generate mapping file if requested\n    if (options.generateMapping !== false) {\n      await this.generateMappingFile(results, options.mappingFile);\n    }\n\n    return results;\n  }\n\n  /**\n   * Upload a single file\n   */\n  private async uploadFile(\n    localPath: string,\n    remotePath: string,\n    overwrite: boolean = true,\n    verbose: boolean = false,\n    contentHash: boolean = true\n  ): Promise<UploadResult> {\n    let fileName = path.basename(localPath);\n\n    // Add content hash to filename if enabled\n    if (contentHash) {\n      const hash = this.generateContentHash(localPath);\n      fileName = this.addHashToFilename(fileName, hash);\n    }\n\n    const ossPath = remotePath ? path.posix.join(remotePath, fileName) : fileName;\n    const normalizedOssPath = this.normalizePath(ossPath);\n\n    const spinner = verbose\n      ? ora(`Uploading ${chalk.cyan(localPath)} → ${chalk.cyan(normalizedOssPath)}`).start()\n      : null;\n\n    try {\n      // Check if file exists in OSS when overwrite is disabled\n      if (!overwrite && (await this.fileExistsInOSS(normalizedOssPath))) {\n        spinner?.fail();\n        return {\n          success: false,\n          localPath,\n          remotePath: normalizedOssPath,\n          error: 'File already exists (use --overwrite to replace)',\n        };\n      }\n\n      // Upload file\n      await this.client.put(normalizedOssPath, localPath);\n      const stats = fs.statSync(localPath);\n\n      spinner?.succeed();\n\n      if (verbose) {\n        console.log(\n          chalk.green(\n            `✓ Uploaded: ${localPath} → ${normalizedOssPath} (${this.formatBytes(stats.size)})`\n          )\n        );\n      }\n\n      return {\n        success: true,\n        localPath,\n        remotePath: normalizedOssPath,\n        url: this.generateUrl(normalizedOssPath),\n        size: stats.size,\n      };\n    } catch (error: any) {\n      spinner?.fail();\n\n      if (verbose) {\n        console.error(chalk.red(`✗ Failed: ${localPath} - ${error.message}`));\n      }\n\n      return {\n        success: false,\n        localPath,\n        remotePath: normalizedOssPath,\n        error: error.message,\n      };\n    }\n  }\n\n  /**\n   * Upload a single file in batch upload context (with progress tracking)\n   */\n  private async uploadSingleFileInBatch(\n    file: string,\n    localDir: string,\n    remoteDir: string,\n    overwrite: boolean,\n    verbose: boolean,\n    spinner: Ora | null,\n    contentHash: boolean = true\n  ): Promise<UploadResult> {\n    const relativePath = path.relative(localDir, file);\n    let processedRelativePath = relativePath;\n\n    // Add content hash to filename if enabled\n    if (contentHash) {\n      const hash = this.generateContentHash(file);\n      const dir = path.dirname(relativePath);\n      const fileName = path.basename(relativePath);\n      const hashedFileName = this.addHashToFilename(fileName, hash);\n      processedRelativePath = dir === '.' ? hashedFileName : path.join(dir, hashedFileName);\n    }\n\n    const remotePath = remoteDir\n      ? this.normalizePath(path.posix.join(remoteDir, processedRelativePath))\n      : this.normalizePath(processedRelativePath);\n\n    try {\n      // Check if file exists in OSS when overwrite is disabled\n      if (!overwrite && (await this.fileExistsInOSS(remotePath))) {\n        spinner?.fail();\n        return {\n          success: false,\n          localPath: file,\n          remotePath,\n          error: 'File already exists',\n        };\n      }\n\n      // Upload file\n      await this.client.put(remotePath, file);\n      const stats = fs.statSync(file);\n\n      spinner?.succeed();\n\n      if (verbose) {\n        console.log(\n          chalk.green(`✓ ${relativePath} → ${remotePath} (${this.formatBytes(stats.size)})`)\n        );\n      }\n\n      return {\n        success: true,\n        localPath: file,\n        remotePath,\n        url: this.generateUrl(remotePath),\n        size: stats.size,\n      };\n    } catch (error: any) {\n      spinner?.fail();\n\n      if (verbose) {\n        console.error(chalk.red(`✗ ${relativePath} - ${error.message}`));\n      }\n\n      return {\n        success: false,\n        localPath: file,\n        remotePath,\n        error: error.message,\n      };\n    }\n  }\n\n  /**\n   * Upload a directory recursively\n   */\n  private async uploadDirectory(\n    localDir: string,\n    remoteDir: string,\n    overwrite: boolean = true,\n    include?: string[],\n    exclude?: string[],\n    verbose: boolean = false,\n    contentHash: boolean = true\n  ): Promise<UploadResult[]> {\n    // Collect all files\n    const allFiles = await this.collectFiles(localDir, include, exclude);\n    const totalFiles = allFiles.length;\n\n    console.log(chalk.blue(`Found ${totalFiles} file(s) to upload from ${localDir}\\n`));\n\n    if (totalFiles === 0) {\n      return [];\n    }\n\n    // Create progress bar (only in non-verbose mode)\n    const progressBar = verbose ? null : this.createProgressBar();\n    progressBar?.start(totalFiles, 0, { currentFile: '' });\n\n    const results: UploadResult[] = [];\n    let uploadedCount = 0;\n\n    for (const file of allFiles) {\n      const relativePath = path.relative(localDir, file);\n      const truncatedPath = this.truncateFilename(relativePath);\n\n      // Update progress bar with current file\n      progressBar?.update(uploadedCount, { currentFile: truncatedPath });\n\n      // Create spinner for verbose mode\n      const spinner = verbose ? ora(`Uploading ${chalk.cyan(relativePath)}`).start() : null;\n\n      // Upload single file\n      const result = await this.uploadSingleFileInBatch(\n        file,\n        localDir,\n        remoteDir,\n        overwrite,\n        verbose,\n        spinner,\n        contentHash\n      );\n\n      results.push(result);\n      uploadedCount++;\n\n      // Update progress bar\n      progressBar?.update(uploadedCount, { currentFile: truncatedPath });\n    }\n\n    progressBar?.stop();\n    console.log(); // Add a newline after progress bar\n\n    return results;\n  }\n\n  /**\n   * Upload multiple files from different source paths\n   */\n  async uploadMultiple(\n    sources: string[],\n    targetDir: string = '',\n    overwrite: boolean = true,\n    verbose: boolean = false,\n    contentHash: boolean = true\n  ): Promise<UploadResult[]> {\n    console.log(chalk.blue(`Found ${sources.length} source(s) to upload\\n`));\n\n    const results: UploadResult[] = [];\n\n    // Create progress bar (only in non-verbose mode)\n    const progressBar = verbose ? null : this.createProgressBar();\n    const totalSources = sources.length;\n    progressBar?.start(totalSources, 0, { currentFile: '' });\n\n    let processedCount = 0;\n\n    for (const source of sources) {\n      const sourcePath = path.resolve(source);\n\n      if (!fs.existsSync(sourcePath)) {\n        console.error(chalk.red(`✗ Source does not exist: ${sourcePath}`));\n        results.push({\n          success: false,\n          localPath: sourcePath,\n          remotePath: '',\n          error: 'Source path does not exist',\n        });\n        processedCount++;\n        progressBar?.update(processedCount, { currentFile: path.basename(sourcePath) });\n        continue;\n      }\n\n      const stats = fs.statSync(sourcePath);\n      const fileName = path.basename(sourcePath);\n\n      progressBar?.update(processedCount, { currentFile: this.truncateFilename(fileName) });\n\n      if (stats.isFile()) {\n        const spinner = verbose ? ora(`Uploading ${chalk.cyan(fileName)}`).start() : null;\n        const result = await this.uploadFile(\n          sourcePath,\n          targetDir,\n          overwrite,\n          verbose,\n          contentHash\n        );\n        results.push(result);\n        spinner?.stop();\n      } else if (stats.isDirectory()) {\n        console.log(chalk.blue(`\\nUploading directory: ${sourcePath}`));\n        const dirResults = await this.uploadDirectory(\n          sourcePath,\n          targetDir,\n          overwrite,\n          undefined, // no include patterns in multi-file mode\n          undefined, // no exclude patterns in multi-file mode\n          verbose,\n          contentHash\n        );\n        results.push(...dirResults);\n      } else {\n        results.push({\n          success: false,\n          localPath: sourcePath,\n          remotePath: '',\n          error: 'Invalid source type',\n        });\n      }\n\n      processedCount++;\n      progressBar?.update(processedCount, { currentFile: this.truncateFilename(fileName) });\n    }\n\n    progressBar?.stop();\n    console.log(); // Add a newline after progress bar\n\n    return results;\n  }\n\n  /**\n   * Generate upload mapping file (now public for CLI usage)\n   */\n  async generateMappingFile(results: UploadResult[], customPath?: string): Promise<void> {\n    const successfulResults = results.filter(r => r.success && r.url);\n\n    if (successfulResults.length === 0) {\n      return;\n    }\n\n    const now = new Date();\n    const mappings: UploadMapping[] = successfulResults.map(result => ({\n      localPath: result.localPath,\n      remotePath: result.remotePath,\n      url: result.url!,\n      size: result.size || 0,\n      sizeFormatted: this.formatBytes(result.size || 0),\n      uploadTime: now.toISOString(),\n      uploadTimeLocal: this.formatLocalTime(now),\n    }));\n\n    const mappingPath = customPath || path.join(process.cwd(), '.oss-uploader-mapping.json');\n\n    const totalSize = mappings.reduce((sum, m) => sum + m.size, 0);\n    const mappingData = {\n      uploadTime: now.toISOString(),\n      uploadTimeLocal: this.formatLocalTime(now),\n      bucket: this.config.bucket,\n      region: this.config.region,\n      totalFiles: mappings.length,\n      totalSize,\n      totalSizeFormatted: this.formatBytes(totalSize),\n      files: mappings,\n    };\n\n    await fs.promises.writeFile(mappingPath, JSON.stringify(mappingData, null, 2), 'utf-8');\n\n    console.log(chalk.green(`\\n✓ Upload mapping saved to: ${mappingPath}`));\n  }\n\n  /**\n   * List files in OSS bucket\n   */\n  async listFiles(prefix?: string, maxKeys: number = 1000): Promise<OSS.ObjectMeta[]> {\n    try {\n      const result = await this.client.list({\n        prefix: prefix || '',\n        'max-keys': maxKeys,\n      });\n\n      return result.objects || [];\n    } catch (error: any) {\n      throw new Error(chalk.red(`Failed to list files: ${error.message}`));\n    }\n  }\n\n  /**\n   * Delete a file from OSS\n   */\n  async deleteFile(ossPath: string): Promise<void> {\n    try {\n      await this.client.delete(ossPath);\n      console.log(chalk.green(`✓ Deleted: ${ossPath}`));\n    } catch (error: any) {\n      throw new Error(chalk.red(`Failed to delete file: ${error.message}`));\n    }\n  }\n\n  /**\n   * Format bytes to human-readable format\n   */\n  private formatBytes(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n    return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n  }\n\n  /**\n   * Format date to local time string\n   * Returns a readable local time format: YYYY-MM-DD HH:mm:ss\n   */\n  private formatLocalTime(date: Date): string {\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    const hours = String(date.getHours()).padStart(2, '0');\n    const minutes = String(date.getMinutes()).padStart(2, '0');\n    const seconds = String(date.getSeconds()).padStart(2, '0');\n\n    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n  }\n\n  /**\n   * Get bucket info\n   */\n  async getBucketInfo(): Promise<any> {\n    try {\n      const result = await this.client.getBucketInfo();\n      return result;\n    } catch (error: any) {\n      throw new Error(chalk.red(`Failed to get bucket info: ${error.message}`));\n    }\n  }\n}\n","import { cosmiconfigSync } from 'cosmiconfig';\nimport { type OSSConfig } from './types';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { pathToFileURL } from 'url';\n\nconst CONFIG_MODULE_NAME = 'oss';\n\n/**\n * Load OSS configuration from environment variables\n */\nfunction loadConfigFromEnv(): Partial<OSSConfig> | null {\n  const {\n    OSS_REGION,\n    OSS_ACCESS_KEY_ID,\n    OSS_ACCESS_KEY_SECRET,\n    OSS_BUCKET,\n    OSS_ENDPOINT,\n    OSS_INTERNAL,\n    OSS_SECURE,\n    OSS_TIMEOUT,\n  } = process.env;\n\n  // Check if at least one env var is set\n  if (!OSS_REGION && !OSS_ACCESS_KEY_ID && !OSS_ACCESS_KEY_SECRET && !OSS_BUCKET) {\n    return null;\n  }\n\n  const config: Partial<OSSConfig> = {};\n\n  if (OSS_REGION) config.region = OSS_REGION;\n  if (OSS_ACCESS_KEY_ID) config.accessKeyId = OSS_ACCESS_KEY_ID;\n  if (OSS_ACCESS_KEY_SECRET) config.accessKeySecret = OSS_ACCESS_KEY_SECRET;\n  if (OSS_BUCKET) config.bucket = OSS_BUCKET;\n  if (OSS_ENDPOINT) config.endpoint = OSS_ENDPOINT;\n  if (OSS_INTERNAL !== undefined) config.internal = OSS_INTERNAL === 'true';\n  if (OSS_SECURE !== undefined) config.secure = OSS_SECURE === 'true';\n  if (OSS_TIMEOUT) config.timeout = parseInt(OSS_TIMEOUT, 10);\n\n  return config;\n}\n\n/**\n * Load OSS configuration from various sources\n * Priority: Config file first, fallback to Environment variables\n * Supports: .ossrc, .ossrc.json, .ossrc.yaml, .ossrc.yml, oss.config.js, package.json\n */\nexport async function loadConfig(configPath?: string): Promise<OSSConfig> {\n  let config: Partial<OSSConfig> | null = null;\n\n  // If config path is explicitly provided\n  if (configPath) {\n    if (!fs.existsSync(configPath)) {\n      throw new Error(chalk.red(`Config file not found: ${configPath}`));\n    }\n\n    const absolutePath = path.resolve(configPath);\n    const ext = path.extname(absolutePath);\n\n    try {\n      if (ext === '.js') {\n        // Use dynamic import for .js files in ESM\n        const fileUrl = pathToFileURL(absolutePath).href;\n        const module = await import(fileUrl);\n        config = module.default || module;\n      } else if (ext === '.json' || ext === '') {\n        const content = fs.readFileSync(absolutePath, 'utf-8');\n        config = JSON.parse(content);\n      } else {\n        throw new Error(`Unsupported config file format: ${ext}`);\n      }\n    } catch (error: any) {\n      throw new Error(chalk.red(`Failed to load config from ${configPath}: ${error.message}`));\n    }\n  } else {\n    // Search for config file automatically\n    const explorer = cosmiconfigSync(CONFIG_MODULE_NAME, {\n      searchPlaces: [\n        '.ossrc',\n        '.ossrc.json',\n        '.ossrc.yaml',\n        '.ossrc.yml',\n        'oss.config.js',\n        'oss.config.json',\n        'package.json',\n      ],\n    });\n\n    const result = explorer.search();\n\n    if (result && result.config) {\n      config = result.config;\n    }\n  }\n\n  // If no config file found, try loading from environment variables\n  if (!config) {\n    const envConfig = loadConfigFromEnv();\n    if (envConfig) {\n      config = envConfig;\n      console.log(chalk.cyan('ℹ Using configuration from environment variables'));\n    }\n  }\n\n  if (!config) {\n    throw new Error(\n      chalk.red(\n        'No configuration found. Please create a .ossrc.json, specify config path, or set environment variables (OSS_REGION, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, OSS_BUCKET).'\n      )\n    );\n  }\n\n  // Validate required fields\n  validateConfig(config as OSSConfig);\n\n  return config as OSSConfig;\n}\n\n/**\n * Validate OSS configuration\n */\nfunction validateConfig(config: OSSConfig): void {\n  const requiredFields: (keyof OSSConfig)[] = [\n    'region',\n    'accessKeyId',\n    'accessKeySecret',\n    'bucket',\n  ];\n  const missing: string[] = [];\n\n  for (const field of requiredFields) {\n    if (!config[field]) {\n      missing.push(field);\n    }\n  }\n\n  if (missing.length > 0) {\n    throw new Error(chalk.red(`Missing required configuration fields: ${missing.join(', ')}`));\n  }\n\n  // Validate region format\n  if (config.region && !config.region.startsWith('oss-')) {\n    console.warn(\n      chalk.yellow(\n        `Warning: Region \"${config.region}\" doesn't follow the standard format (e.g., \"oss-cn-hangzhou\")`\n      )\n    );\n  }\n}\n\n/**\n * Create a sample configuration file\n */\nexport function createSampleConfig(outputPath: string = '.ossrc.json', type?: string): void {\n  const absolutePath = path.resolve(outputPath);\n\n  if (fs.existsSync(absolutePath)) {\n    throw new Error(chalk.red(`Config file already exists: ${absolutePath}`));\n  }\n\n  // Determine file type from extension or explicit type option\n  const ext = path.extname(absolutePath);\n  const fileType = type || (ext === '.js' ? 'js' : 'json');\n\n  let content: string;\n\n  if (fileType === 'js') {\n    // Generate JavaScript config with environment variable support\n    content = `// OSS Uploader Configuration\n// You can use environment variables or hardcoded values\n\nexport default {\n  // Required fields\n  region: process.env.OSS_REGION || 'YOUR_REGION',\n  accessKeyId: process.env.OSS_ACCESS_KEY_ID || 'YOUR_ACCESS_KEY_ID',\n  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET || 'YOUR_ACCESS_KEY_SECRET',\n  bucket: process.env.OSS_BUCKET || 'YOUR_BUCKET_NAME',\n\n  // Optional fields\n  // endpoint: process.env.OSS_ENDPOINT,\n  // internal: process.env.OSS_INTERNAL === 'true',\n  secure: true,\n  timeout: 60000,\n};\n`;\n  } else {\n    // Generate JSON config\n    const sampleConfig: OSSConfig = {\n      region: 'YOUR_REGION',\n      accessKeyId: 'YOUR_ACCESS_KEY_ID',\n      accessKeySecret: 'YOUR_ACCESS_KEY_SECRET',\n      bucket: 'YOUR_BUCKET_NAME',\n      secure: true,\n      timeout: 60000,\n    };\n    content = JSON.stringify(sampleConfig, null, 2);\n  }\n\n  fs.writeFileSync(absolutePath, content, 'utf-8');\n  console.log(chalk.green(`✓ Sample configuration created: ${absolutePath}`));\n\n  if (fileType === 'js') {\n    console.log(\n      chalk.cyan('💡 JavaScript config supports environment variables with fallback values.')\n    );\n    console.log(chalk.yellow('Please set environment variables or update the fallback values.'));\n  } else {\n    console.log(chalk.yellow('Please update the configuration with your actual credentials.'));\n    console.log(\n      chalk.cyan(\n        '💡 Tip: Use `oss-uploader init -o oss.config.js` to generate a JS config that supports environment variables.'\n      )\n    );\n  }\n}\n"],"mappings":"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","names":["basename","chalk","path","fs"]}