gigadrive 1.1.2 → 2.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/build/index.ts","../src/util/pm.ts","../../build-utils/src/exec.ts","../src/commands/debug/config/index.ts","../src/util/log.ts","../src/commands/debug/index.ts","../src/commands/platform/deploy/index.ts","../src/util/zip.ts","../src/commands/platform/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { build } from './commands/build';\nimport { debug } from './commands/debug';\nimport { platform } from './commands/platform';\nimport { error, log, setVerbose } from './util/log';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nlet { isTTY } = process.stdout;\n//process.stdin.resume();\n\nconst main = async () => {\n if (process.env.FORCE_TTY === '1') {\n isTTY = true;\n process.stdout.isTTY = true;\n process.stdin.isTTY = true;\n }\n\n let exitCode = 0;\n\n const program = new Command();\n\n program.option('-v, --verbose', 'Enable verbose logging', false);\n\n program.hook('preSubcommand', (thisCommand) => {\n setVerbose((thisCommand.opts().verbose as boolean) === true);\n\n if (thisCommand.opts().verbose) {\n log('Using verbose mode');\n }\n });\n\n program.hook('preAction', (thisCommand) => {\n setVerbose((thisCommand.opts().verbose as boolean) === true);\n });\n\n // register commands\n platform(program);\n debug(program);\n build(program);\n\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n error(err as string | number | boolean | object);\n exitCode = 1;\n }\n\n return exitCode;\n};\n\nconst handleRejection = (err: unknown) => {\n if (err) {\n if (err instanceof Error) {\n handleUnexpected(err);\n } else {\n console.error(`An unexpected rejection occurred\\n ${JSON.stringify(err)}`);\n }\n } else {\n console.error('An unexpected empty rejection occurred');\n }\n\n process.exit(1);\n};\n\nconst handleUnexpected = (error: Error) => {\n const { message } = error;\n\n console.error(`An unexpected error occurred\\n ${message}`);\n\n process.exit(1);\n};\n\nprocess.on('unhandledRejection', handleRejection);\nprocess.on('uncaughtException', handleUnexpected);\n\nprocess.on('exit', () => {\n const terminal = process.stderr.isTTY ? process.stderr : process.stdout.isTTY ? process.stdout : undefined;\n terminal?.write('\\u001B[?25h');\n});\n\nmain()\n .then((exitCode) => {\n process.exitCode = exitCode;\n })\n .catch(handleUnexpected);\n","import { exec } from '@gigadrive/build-utils';\nimport type { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport { buildCommand, getPackageManager, installCommand } from '../../util/pm';\n\nexport const build = (parent: Command) => {\n parent\n .command('build')\n .description('Build the current project')\n .action(async () => {\n // Set relevant environment variables\n const env = {\n ...process.env,\n NODE_ENV: 'production',\n NEBULA: '1',\n VERCEL: '1', // Vercel compatibility\n NOW_BUILDER: '1',\n };\n\n const cwd = process.cwd();\n\n const packageJsonPath = path.join(cwd, 'package.json');\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log('No package.json found');\n return;\n }\n\n // Read package.json and check for build scripts\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n\n const buildScript = packageJson.scripts?.build;\n\n // If build script is not defined, return null\n if (!buildScript) {\n console.log('No build script found in package.json');\n return;\n }\n\n const packageManager = await getPackageManager({ cwd });\n\n if (!packageManager) {\n console.log('No package manager found');\n return;\n }\n\n await exec({\n command: installCommand(packageManager),\n cwd,\n env,\n onOutput: (chunk) => {\n console.log(chunk);\n },\n });\n\n await exec({\n command: buildCommand(packageManager),\n cwd,\n env,\n onOutput: (chunk) => {\n console.log(chunk);\n },\n });\n });\n};\n","import fs from 'fs';\nimport path from 'path';\nimport { exec } from '../../../build-utils/src/exec';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/**\n * Detects the package manager to use for a specific directory\n */\nexport const getPackageManager = async ({ cwd }: { cwd: string }): Promise<PackageManager | null> => {\n // check if package.json exists\n const packageJsonPath = path.join(cwd, 'package.json');\n\n // If package.json does not exist, return null\n if (!fs.existsSync(packageJsonPath)) {\n return null;\n }\n\n // Check if yarn lock exists\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n\n // Check if pnpm lock exists\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n\n // Check if bun lock exists\n if (fs.existsSync(path.join(cwd, 'bun.lockb'))) {\n return 'bun';\n }\n\n // Check if pnpm lock exists\n if (fs.existsSync(path.join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Check if bun is installed\n try {\n await exec({ command: 'bun --version', cwd });\n return 'bun';\n } catch {\n // If bun is not installed, return npm\n return 'npm';\n }\n};\n\nexport const installCommand = (pm: PackageManager) => {\n return (\n {\n bun: 'bun install',\n npm: 'npm install',\n pnpm: 'pnpm install',\n yarn: 'yarn install',\n }[pm] || 'npm install'\n );\n};\n\nexport const buildCommand = (pm: PackageManager) => {\n return (\n {\n bun: 'bun run build',\n npm: 'npm run build',\n pnpm: 'pnpm build',\n yarn: 'yarn build',\n }[pm] || 'npm run build'\n );\n};\n","import { spawn } from 'child_process';\n\ntype CommandInput = string | { command: string; args?: string[] };\n\ninterface ExecOptions {\n /**\n * The command to execute.\n */\n command: CommandInput;\n\n /**\n * The working directory for the command.\n */\n cwd?: string;\n\n /**\n * Environment variables for the command.\n * Does not include the current process's environment variables by default.\n */\n env?: Record<string, string>;\n\n /**\n * Callback for handling output from the command (stdout).\n */\n onOutput?: (data: string) => void;\n\n /**\n * Callback for handling errors from the command (stderr).\n */\n onError?: (data: string) => void;\n}\n\n/**\n * Executes a command asynchronously in a child process\n * @param options Configuration options for executing the process\n * @returns Promise that resolves when the process completes\n */\nexport async function exec({\n command,\n cwd = process.cwd(),\n env,\n onOutput = (data: string) => console.log(data),\n onError = (data: string) => console.error(data),\n}: ExecOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n let spawnCommand: string;\n let spawnArgs: string[] = [];\n\n if (typeof command === 'string') {\n // For string input, first argument is the command, rest are args\n const parts = command.split(' ');\n spawnCommand = parts[0];\n spawnArgs = parts.slice(1);\n } else {\n // For object input, use command and args properties\n spawnCommand = command.command;\n spawnArgs = command.args || [];\n }\n\n const childProcess = spawn(spawnCommand, spawnArgs, {\n cwd,\n shell: true,\n env,\n });\n\n childProcess.stdout.on('data', (data) => {\n onOutput(data.toString().trim());\n });\n\n childProcess.stderr.on('data', (data) => {\n onError(data.toString().trim());\n });\n\n childProcess.on('error', (error) => {\n reject(new Error(`Failed to start process: ${error.message}`));\n });\n\n childProcess.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Process exited with code ${code}`));\n }\n });\n });\n}\n","import { findConfig, parseConfig } from '@gigadrive/network-config';\nimport { Command } from 'commander';\nimport { log } from 'console';\nimport { debug } from '../../../util/log';\n\nexport const config = (parent: Command) => {\n parent\n .command('config')\n .description('Provide debug info about the project configuration in the current directory')\n .action(async () => {\n const configPath = findConfig(process.cwd());\n\n if (!configPath) {\n debug('No config file found');\n throw new Error('The current project folder does not have a valid config file.');\n }\n\n const config = await parseConfig(configPath, process.cwd());\n\n log(`Config file found at: ${configPath}`);\n log(JSON.stringify(config, null, 2));\n });\n};\n","import { createConsola } from 'consola';\n\nlet verbose: boolean = false;\n\n// Create a custom consola instance that can be updated with verbose settings\nconst consola = createConsola({\n level: verbose ? 4 : 3, // 4 includes debug messages, 3 is the default (info and above)\n formatOptions: {\n colors: true,\n },\n});\n\n// Update the consola instance when verbose setting changes\nconst updateConsola = () => {\n consola.level = verbose ? 4 : 3;\n};\n\nexport const setVerbose = (value: boolean) => {\n verbose = value;\n updateConsola();\n};\n\nexport const isVerbose = () => verbose;\n\nexport const log = (message: string | number | boolean | object) => {\n consola.info(message);\n};\n\nexport const error = (message: string | number | boolean | object) => {\n consola.error(message);\n};\n\nexport const success = (message: string | number | boolean | object) => {\n consola.success(message);\n};\n\nexport const warn = (message: string | number | boolean | object) => {\n consola.warn(message);\n};\n\nexport const debug = (\n message?: string | number | boolean | object,\n ...optionalParams: (string | number | boolean | object)[]\n) => {\n if (!verbose) {\n return;\n }\n\n consola.debug('[DEBUG]', message, ...optionalParams);\n};\n\nexport const spinner = (message: string | number | boolean | object) => {\n //render(<Spinner label={message} />);\n log(message);\n};\n","import type { Command } from 'commander';\nimport { config } from './config';\n\nexport const debug = (program: Command) => {\n const debug = program.command('debug').description('Provides various debugging utilities');\n\n // register subcommands\n config(debug);\n};\n","import { formatFileSize, objectToQueryString } from '@gigadrive/commons';\nimport type { NormalizedConfig } from '@gigadrive/network-config';\nimport { findConfig, parseConfig } from '@gigadrive/network-config';\nimport type { Command } from 'commander';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { debug, error, log, spinner, success, warn } from '../../../util/log';\nimport { createZipArchive } from '../../../util/zip';\n\nexport const deploy = (parent: Command) => {\n parent\n .command('deploy')\n .description('Deploy the current project')\n .action(async () => {\n debug('Starting deploy command');\n const configPath = findConfig(process.cwd());\n\n if (!configPath) {\n debug('No config file found');\n throw new Error('The current project folder does not have a valid config file.');\n }\n\n debug(`Found config at: ${configPath}`);\n const config = await parseConfig(configPath, process.cwd());\n debug('Parsed config', config);\n\n if (config.warnings.length > 0) {\n debug(`Found ${config.warnings.length} warnings in config`);\n config.warnings.forEach((message) => {\n warn(message);\n });\n }\n\n if (config.errors.length > 0) {\n debug(`Found ${config.errors.length} errors in config`);\n config.errors.forEach((message) => {\n error(message);\n });\n\n throw new Error('The current project folder does not have a valid config file.');\n }\n\n debug('Creating deployment');\n const deploymentId = await createDeployment({\n applicationId: 'test', // TODO\n });\n\n debug(`Deployment ID: ${deploymentId}`);\n\n debug('Starting deployment process');\n await handleDeployment(deploymentId, config);\n });\n};\n\nconst handleDeployment = async (deploymentId: string, config: NormalizedConfig) => {\n debug('Deployment process initialized');\n let status: DeploymentStatus = 'PENDING';\n const logs: DeploymentLog[] = [];\n\n // Log deployment ID\n addLog('Deployment ID: ' + deploymentId, 'INFO', logs);\n\n // Start upload\n try {\n debug('Starting upload process');\n await uploadArchive(deploymentId, logs, config);\n debug('Upload completed successfully');\n addLog('Upload complete.', 'INFO', logs);\n addLog('The deployment pipeline is now being provisioned. This may take a few seconds.', 'INFO', logs);\n } catch (err) {\n debug(`Upload failed with error: ${(err as Error).message}`);\n addLog(`Upload failed: ${(err as Error).message}`, 'ERROR', logs);\n status = 'FAILED';\n error('The deployment failed. Please check the logs for more information.');\n process.exit(1);\n }\n\n // Start status polling\n const statusInterval = setInterval(() => {\n void (async () => {\n try {\n debug(`Fetching deployment status for ${deploymentId}`);\n const newStatus = await getDeploymentStatus(deploymentId);\n debug(`Current status: ${status}, New status: ${newStatus}`);\n\n if (newStatus === 'ACTIVE' || newStatus === 'FAILED') {\n debug(`Final status reached: ${newStatus}, clearing interval`);\n clearInterval(statusInterval);\n clearInterval(logsInterval);\n\n if (newStatus === 'ACTIVE') {\n success(`Deployed to https://${deploymentId}.gigadrivedev.com`);\n } else {\n error('The deployment failed. Please check the logs for more information.');\n }\n\n return;\n }\n\n if (newStatus !== status) {\n debug(`Updating status from ${status} to ${newStatus}`);\n status = newStatus;\n spinner(`Status: ${status.toLowerCase().replace(/^\\w/, (c) => c.toUpperCase())}`);\n }\n } catch (err) {\n debug(`Error fetching status: ${(err as Error).message}`);\n }\n })();\n }, 1000);\n\n // Start logs polling\n const logsInterval = setInterval(() => {\n void (async () => {\n try {\n debug(`Fetching logs for ${deploymentId}, current log count: ${logs.length}`);\n const newLogs = await getLogs(deploymentId, {\n offset: logs.length,\n limit: 100,\n 'createdAt[gt]': logs[logs.length - 1]?.createdAt,\n });\n\n debug(`Fetched ${newLogs.items.length} new logs`);\n\n // Display new logs\n for (const logEntry of newLogs.items) {\n logs.push(logEntry);\n\n if (logEntry.type === 'ERROR') {\n error(logEntry.message);\n } else if (logEntry.type === 'WARN') {\n warn(logEntry.message);\n } else {\n log(logEntry.message);\n }\n }\n } catch (err) {\n debug(`Error fetching logs: ${(err as Error).message}`);\n }\n })();\n }, 1000);\n\n // Initial status display\n spinner(`Status: ${status.toLowerCase().replace(/^\\w/, (c) => c.toUpperCase())}`);\n};\n\nconst addLog = (message: string, type: 'INFO' | 'ERROR' | 'WARN', logs: DeploymentLog[]) => {\n debug(`Adding log: [${type}] ${message}`);\n logs.push({\n id: String(logs.length),\n message,\n type,\n createdAt: new Date().toISOString(),\n });\n\n if (type === 'ERROR') {\n error(message);\n } else if (type === 'WARN') {\n warn(message);\n } else {\n log(message);\n }\n};\n\nconst uploadArchive = async (deploymentId: string, logs: DeploymentLog[], config: NormalizedConfig) => {\n debug('Starting uploadArchive');\n addLog('Creating archive...', 'INFO', logs);\n\n const archivePath = path.join(process.env.TEMP || os.tmpdir(), `project-${Date.now()}.zip`);\n debug(`Archive path: ${archivePath}`);\n\n if (fs.existsSync(archivePath)) {\n debug(`Archive already exists, removing: ${archivePath}`);\n fs.unlinkSync(archivePath);\n }\n\n debug('Creating zip archive');\n\n await createZipArchive(config.userArchive?.rootOverwrite || process.cwd(), archivePath, {\n whitelist: config.userArchive?.fileWhitelist,\n useIgnoreFiles: false,\n useManagedIgnore: false,\n });\n\n const fileStats = fs.statSync(archivePath);\n const fileSize = fileStats.size;\n debug(`Archive created, size: ${fileSize} bytes (${formatFileSize(fileSize)})`);\n\n addLog(`Archive created (${formatFileSize(fileSize)})`, 'INFO', logs);\n\n addLog('Uploading archive...', 'INFO', logs);\n\n debug(`Starting multipart upload for deployment: ${deploymentId}`);\n const uploadId = await startMultipartUpload(deploymentId);\n\n debug(`Upload ID: ${uploadId}`);\n\n debug('Uploading archive...');\n\n const fileChunkSize = 10 * 1024 * 1024; // 10 MB\n const numChunks = Math.ceil(fileSize / fileChunkSize);\n debug(`File size: ${fileSize}, chunk size: ${fileChunkSize}, number of chunks: ${numChunks}`);\n\n const promises = [];\n let start: number, end: number;\n\n for (let index = 1; index < numChunks + 1; index++) {\n start = (index - 1) * fileChunkSize;\n end = index * fileChunkSize;\n debug(`Processing chunk ${index}/${numChunks}, start: ${start}, end: ${end}`);\n\n const presignedUrl = await getPresignedUrl(deploymentId, uploadId, index);\n debug('Presigned URL for part', index, presignedUrl);\n\n const promise = new Promise<Response>((resolve, reject) => {\n void (async () => {\n try {\n debug(`Reading chunk ${index} data`);\n const readStream = fs.createReadStream(archivePath, {\n start,\n end: index < numChunks ? end - 1 : undefined,\n });\n\n const chunks: Buffer[] = [];\n readStream.on('data', (chunk: Buffer | string) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n\n await new Promise<void>((resolveRead) => {\n readStream.on('end', () => resolveRead());\n readStream.on('error', reject);\n });\n\n const buffer = Buffer.concat(chunks);\n\n debug(`Uploading chunk ${index} to presigned URL (${buffer.length} bytes)`);\n const response = await fetch(presignedUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/zip',\n 'Content-Length': String(buffer.length),\n },\n body: buffer,\n });\n resolve(response);\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n })();\n });\n\n promises.push(promise);\n }\n\n const finishedParts: { partNumber: number; etag: string }[] = [];\n\n try {\n debug(`Waiting for all ${promises.length} upload promises to complete`);\n const responses = await Promise.all(promises);\n debug('All upload promises completed');\n\n for (let index = 0; index < responses.length; index++) {\n const res = responses[index];\n debug(`Checking response for part ${index + 1}, status: ${res.status}`);\n\n if (!res.ok) {\n debug(`Failed to upload part ${index + 1}: ${res.statusText} ${await res.text()}`);\n throw new Error(`Failed to upload part ${index + 1}: ${res.statusText}`);\n }\n\n const etag = res.headers.get('ETag');\n if (!etag) {\n debug(`Failed to get ETag for part ${index + 1}`);\n throw new Error(`Failed to get ETag for part ${index + 1}`);\n }\n\n debug(`Part ${index + 1} uploaded successfully, ETag: ${etag}`);\n finishedParts.push({\n partNumber: index + 1,\n etag: etag,\n });\n }\n\n debug(`Completing upload with ${finishedParts.length} parts`);\n await completeUpload(deploymentId, uploadId, finishedParts);\n debug('Upload completed successfully');\n } catch (err) {\n const error = err as Error;\n debug(`Upload error: ${error.message}`);\n addLog(`Upload error: ${error.message}`, 'ERROR', logs);\n throw error;\n }\n};\n\nconst createDeployment = async ({ applicationId }: { applicationId: string }) => {\n debug(`Creating deployment for application: ${applicationId}`);\n const res = await fetch(`http://localhost:3000/${applicationId}/deployments`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n duplex: 'half',\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to create deployment: ${errorText}`);\n throw new Error('Failed to create deployment: ' + errorText);\n }\n\n const deployment = (await res.json()) as { id: string };\n debug(`Deployment created with ID: ${deployment.id}`);\n\n return deployment.id;\n};\n\nconst startMultipartUpload = async (deploymentId: string) => {\n debug(`Starting multipart upload for deployment: ${deploymentId}`);\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}/pre-signed-url/start`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to start multipart upload: ${errorText}`);\n throw new Error('Failed to start multipart upload: ' + errorText);\n }\n\n const upload = (await res.json()) as { uploadId: string };\n debug(`Multipart upload started with ID: ${upload.uploadId}`);\n\n return upload.uploadId;\n};\n\nconst getPresignedUrl = async (deploymentId: string, uploadId: string, partNumber: number) => {\n debug(`Getting presigned URL for deployment: ${deploymentId}, upload: ${uploadId}, part: ${partNumber}`);\n const res = await fetch(\n `http://localhost:3000/deployments/${deploymentId}/pre-signed-url/part?uploadId=${uploadId}&partNumber=${partNumber}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to get pre-signed URL: ${errorText}`);\n throw new Error('Failed to get pre-signed URL: ' + errorText);\n }\n\n const upload = (await res.json()) as { url: string };\n debug(`Got presigned URL for part ${partNumber}`);\n\n return upload.url;\n};\n\nconst completeUpload = async (\n deploymentId: string,\n uploadId: string,\n parts: { partNumber: number; etag: string }[]\n) => {\n debug(`Completing upload for deployment: ${deploymentId}, upload: ${uploadId}, parts: ${parts.length}`);\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}/pre-signed-url/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n uploadId,\n parts,\n }),\n duplex: 'half',\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to complete upload: ${errorText}`);\n throw new Error('Failed to complete upload: ' + errorText);\n }\n\n debug('Upload completed successfully');\n};\n\nconst getDeploymentStatus = async (deploymentId: string) => {\n debug(`Getting deployment status for: ${deploymentId}`);\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to get deployment status: ${errorText}`);\n throw new Error('Failed to get deployment status: ' + errorText);\n }\n\n const deployment = (await res.json()) as { status: DeploymentStatus };\n debug(`Deployment status: ${deployment.status}`);\n\n return deployment.status;\n};\n\nconst getLogs = async (\n deploymentId: string,\n options?: {\n offset: number;\n limit: number;\n 'createdAt[gt]'?: string;\n }\n) => {\n debug(`Getting logs for deployment: ${deploymentId}, options:`, options ?? 'No options');\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}/logs${objectToQueryString(options)}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to get logs: ${errorText}`);\n throw new Error('Failed to get logs: ' + errorText);\n }\n\n const logs = (await res.json()) as {\n totalItems: number;\n limit: number;\n offset: number;\n items: DeploymentLog[];\n };\n\n debug(`Got ${logs.items.length} logs, total: ${logs.totalItems}`);\n return logs;\n};\n\ntype DeploymentStatus = 'PENDING' | 'BUILDING' | 'PROVISIONING' | 'FAILED' | 'ACTIVE' | 'SUSPENDED';\n\ntype DeploymentLog = { id: string; message: string; type: 'INFO' | 'ERROR' | 'WARN'; createdAt: string };\n","import { getFilesForPattern } from '@gigadrive/build-utils';\nimport archiver from 'archiver';\nimport fs from 'fs';\nimport fsPromises from 'fs/promises';\nimport ignore, { type Ignore } from 'ignore';\nimport path from 'path';\n\nconst ignoreFileNames = [/*'.gitignore', */ '.gigadriveignore', '.vercelignore', '.dockerignore', '.nowignore'];\n\n// Function to read and parse the ignore file\nasync function readIgnoreFile(ignorePath: string) {\n try {\n await fsPromises.access(ignorePath);\n const content = await fsPromises.readFile(ignorePath, 'utf8');\n return content.split('\\n').filter((line: string) => line.trim() !== '');\n } catch {\n return [];\n }\n}\n\n// Collect ignore patterns from the given directory (including the root)\nasync function collectIgnorePatterns(dir: string, baseDir: string, ignoreRules: Ignore) {\n const items = await fsPromises.readdir(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const relativePath = path.relative(baseDir, fullPath);\n const stat = await fsPromises.lstat(fullPath);\n\n if (stat.isDirectory()) {\n // If the directory itself is ignored, skip it unless it has a negation rule\n if (ignoreRules.ignores(`${relativePath}/`)) {\n continue;\n }\n\n // Check if the directory contains an ignore file\n for (const ignoreFileName of ignoreFileNames) {\n const ignoreFilePath = path.join(fullPath, ignoreFileName);\n try {\n await fsPromises.access(ignoreFilePath);\n const patterns = (await readIgnoreFile(ignoreFilePath)).map((pattern: string) => {\n return pattern.startsWith('!')\n ? `!${path.join(relativePath, pattern.slice(1))}`\n : path.join(relativePath, pattern);\n });\n ignoreRules.add(patterns);\n } catch {\n // File doesn't exist, skip\n }\n }\n\n // Recurse into subdirectory\n await collectIgnorePatterns(fullPath, baseDir, ignoreRules);\n }\n }\n}\n\n// Function to initialize ignore rules including root-level ignore files\nasync function initializeIgnoreRules(baseDir: string): Promise<Ignore> {\n const ignoreRules = ignore();\n\n // Add default ignore rules\n ignoreRules.add(['.git/', '**/.DS_Store', '**/Thumbs.db']);\n\n // Process root-level ignore files\n for (const ignoreFileName of ignoreFileNames) {\n const ignoreFilePath = path.join(baseDir, ignoreFileName);\n try {\n await fsPromises.access(ignoreFilePath);\n const patterns = (await readIgnoreFile(ignoreFilePath)).map((pattern: string) => {\n return pattern.startsWith('!') ? `!${pattern.slice(1)}` : pattern;\n });\n ignoreRules.add(patterns);\n } catch {\n // File doesn't exist, skip\n }\n }\n\n // Recursively process all subdirectories to gather additional ignore patterns\n await collectIgnorePatterns(baseDir, baseDir, ignoreRules);\n\n return ignoreRules;\n}\n\n// Function to get all files and directories, excluding those in the ignore list\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nasync function getFilesToInclude(dir: string, ignoreRules: Ignore, whitelist?: string[]) {\n const filesToInclude: string[] = [];\n\n async function walkDir(currentDir: string) {\n const items = await fsPromises.readdir(currentDir);\n\n for (const item of items) {\n const fullPath = path.join(currentDir, item);\n const relativePath = path.relative(dir, fullPath);\n const stat = await fsPromises.lstat(fullPath);\n\n if (stat.isDirectory()) {\n if (ignoreRules.ignores(`${relativePath}/`)) {\n continue;\n }\n await walkDir(fullPath);\n } else {\n if (!ignoreRules.ignores(relativePath)) {\n filesToInclude.push(fullPath);\n } else if (ignoreRules.ignores(relativePath) && ignoreRules.test(relativePath).unignored) {\n // Handle whitelisted files that were previously ignored\n filesToInclude.push(fullPath);\n }\n }\n }\n }\n\n await walkDir(dir);\n return filesToInclude;\n}\n\n// Function to create the zip archive\nexport async function createZipArchive(\n inputDir: string,\n outputFile: string,\n options: {\n whitelist?: string[];\n useIgnoreFiles?: boolean;\n useManagedIgnore?: boolean;\n } = {}\n) {\n const ignoreRules = options.useIgnoreFiles !== false ? await initializeIgnoreRules(inputDir) : ignore();\n\n // Get list of files to include in the zip\n const filesToInclude = options.whitelist\n ? await Promise.all(options.whitelist.map((file) => getFilesForPattern(inputDir, file)))\n : await getFilesToInclude(inputDir, ignoreRules);\n\n // Create zip file\n const output = fs.createWriteStream(outputFile);\n const archive = archiver('zip', { zlib: { level: 9 } });\n\n return new Promise<void>((resolve, reject) => {\n output.on('close', () => resolve());\n archive.on('error', reject);\n\n archive.pipe(output);\n\n // Add files to the archive\n for (const file of filesToInclude.flat()) {\n archive.file(file, { name: path.relative(inputDir, file) });\n }\n\n void archive.finalize();\n });\n}\n","import type { Command } from 'commander';\nimport { deploy } from './deploy';\n\nexport const platform = (program: Command) => {\n const platform = program.command('platform').description('Manage the platform');\n\n // register subcommands\n deploy(platform);\n};\n"],"mappings":"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","names":["import_fs","import_path","error","path","fs","path","fs","config","debug","import_network_config","import_fs","import_path","import_build_utils","import_fs","import_path","fsPromises","path","ignore","fs","archiver","config","path","os","fs","error","platform","debug","error"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/util/log.ts","../src/commands/build/index.ts","../src/util/pm.ts","../../build-utils/src/exec.ts","../src/commands/debug/config/index.ts","../src/commands/debug/index.ts","../src/env.ts","../src/config/oauth.ts","../src/auth/manager.ts","../src/commands/login/index.ts","../src/commands/platform/deploy/index.ts","../src/util/zip.ts","../src/commands/platform/index.ts","../src/commands/whoami/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { build } from './commands/build';\nimport { debug } from './commands/debug';\nimport { login } from './commands/login';\nimport { platform } from './commands/platform';\nimport { whoami } from './commands/whoami';\nimport { error, log, setVerbose } from './util/log';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nlet { isTTY } = process.stdout;\n//process.stdin.resume();\n\nconst main = async () => {\n if (process.env.FORCE_TTY === '1') {\n isTTY = true;\n process.stdout.isTTY = true;\n process.stdin.isTTY = true;\n }\n\n let exitCode = 0;\n\n const program = new Command();\n\n program.option('-v, --verbose', 'Enable verbose logging', false);\n\n program.hook('preSubcommand', (thisCommand) => {\n setVerbose((thisCommand.opts().verbose as boolean) === true);\n\n if (thisCommand.opts().verbose) {\n log('Using verbose mode');\n }\n });\n\n program.hook('preAction', (thisCommand) => {\n setVerbose((thisCommand.opts().verbose as boolean) === true);\n });\n\n // register commands\n platform(program);\n debug(program);\n build(program);\n login(program);\n whoami(program);\n\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n error(err as string | number | boolean | object);\n exitCode = 1;\n }\n\n return exitCode;\n};\n\nconst handleRejection = (err: unknown) => {\n if (err) {\n if (err instanceof Error) {\n handleUnexpected(err);\n } else {\n console.error(`An unexpected rejection occurred\\n ${JSON.stringify(err)}`);\n }\n } else {\n console.error('An unexpected empty rejection occurred');\n }\n\n process.exit(1);\n};\n\nconst handleUnexpected = (error: Error) => {\n const { message } = error;\n\n console.error(`An unexpected error occurred\\n ${message}`);\n\n process.exit(1);\n};\n\nprocess.on('unhandledRejection', handleRejection);\nprocess.on('uncaughtException', handleUnexpected);\n\nprocess.on('exit', () => {\n const terminal = process.stderr.isTTY ? process.stderr : process.stdout.isTTY ? process.stdout : undefined;\n terminal?.write('\\u001B[?25h');\n});\n\nmain()\n .then((exitCode) => {\n process.exit(exitCode);\n })\n .catch(handleUnexpected);\n","import { createConsola } from 'consola';\n\nlet verbose: boolean = false;\n\n// Create a custom consola instance that can be updated with verbose settings\nconst consola = createConsola({\n level: verbose ? 4 : 3, // 4 includes debug messages, 3 is the default (info and above)\n formatOptions: {\n colors: true,\n },\n});\n\n// Update the consola instance when verbose setting changes\nconst updateConsola = () => {\n consola.level = verbose ? 4 : 3;\n};\n\nexport const setVerbose = (value: boolean) => {\n verbose = value;\n updateConsola();\n};\n\nexport const isVerbose = () => verbose;\n\nexport const log = (message: string | number | boolean | object) => {\n consola.info(message);\n};\n\nexport const error = (message: string | number | boolean | object) => {\n consola.error(message);\n};\n\nexport const success = (message: string | number | boolean | object) => {\n consola.success(message);\n};\n\nexport const warn = (message: string | number | boolean | object) => {\n consola.warn(message);\n};\n\nexport const debug = (\n message?: string | number | boolean | object,\n ...optionalParams: (string | number | boolean | object)[]\n) => {\n if (!verbose) {\n return;\n }\n\n consola.debug('[DEBUG]', message, ...optionalParams);\n};\n\nexport const spinner = (message: string | number | boolean | object) => {\n //render(<Spinner label={message} />);\n log(message);\n};\n","import { error, log } from '@/util/log';\nimport { exec } from '@gigadrive/build-utils';\nimport type { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport { buildCommand, getPackageManager, installCommand } from '../../util/pm';\n\nexport const build = (parent: Command) => {\n parent\n .command('build')\n .description('Build the current project')\n .action(async () => {\n // Set relevant environment variables\n const env = {\n ...process.env,\n NODE_ENV: 'production',\n NEBULA: '1',\n VERCEL: '1', // Vercel compatibility\n NOW_BUILDER: '1',\n };\n\n const cwd = process.cwd();\n\n const packageJsonPath = path.join(cwd, 'package.json');\n\n if (!fs.existsSync(packageJsonPath)) {\n error('No package.json found');\n return;\n }\n\n // Read package.json and check for build scripts\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n\n const buildScript = packageJson.scripts?.build;\n\n // If build script is not defined, return null\n if (!buildScript) {\n error('No build script found in package.json');\n return;\n }\n\n const packageManager = await getPackageManager({ cwd });\n\n if (!packageManager) {\n error('No package manager found');\n return;\n }\n\n await exec({\n command: installCommand(packageManager),\n cwd,\n env,\n onOutput: (chunk) => {\n log(chunk);\n },\n });\n\n await exec({\n command: buildCommand(packageManager),\n cwd,\n env,\n onOutput: (chunk) => {\n log(chunk);\n },\n });\n });\n};\n","import fs from 'fs';\nimport path from 'path';\nimport { exec } from '../../../build-utils/src/exec';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/**\n * Detects the package manager to use for a specific directory\n */\nexport const getPackageManager = async ({ cwd }: { cwd: string }): Promise<PackageManager | null> => {\n // check if package.json exists\n const packageJsonPath = path.join(cwd, 'package.json');\n\n // If package.json does not exist, return null\n if (!fs.existsSync(packageJsonPath)) {\n return null;\n }\n\n // Check if yarn lock exists\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n\n // Check if pnpm lock exists\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n\n // Check if bun lock exists\n if (fs.existsSync(path.join(cwd, 'bun.lockb'))) {\n return 'bun';\n }\n\n // Check if pnpm lock exists\n if (fs.existsSync(path.join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Check if bun is installed\n try {\n await exec({ command: 'bun --version', cwd });\n return 'bun';\n } catch {\n // If bun is not installed, return npm\n return 'npm';\n }\n};\n\nexport const installCommand = (pm: PackageManager) => {\n return (\n {\n bun: 'bun install',\n npm: 'npm install',\n pnpm: 'pnpm install',\n yarn: 'yarn install',\n }[pm] || 'npm install'\n );\n};\n\nexport const buildCommand = (pm: PackageManager) => {\n return (\n {\n bun: 'bun run build',\n npm: 'npm run build',\n pnpm: 'pnpm build',\n yarn: 'yarn build',\n }[pm] || 'npm run build'\n );\n};\n","import { spawn } from 'child_process';\n\ntype CommandInput = string | { command: string; args?: string[] };\n\ninterface ExecOptions {\n /**\n * The command to execute.\n */\n command: CommandInput;\n\n /**\n * The working directory for the command.\n */\n cwd?: string;\n\n /**\n * Environment variables for the command.\n * Does not include the current process's environment variables by default.\n */\n env?: Record<string, string>;\n\n /**\n * Callback for handling output from the command (stdout).\n */\n onOutput?: (data: string) => void;\n\n /**\n * Callback for handling errors from the command (stderr).\n */\n onError?: (data: string) => void;\n}\n\n/**\n * Executes a command asynchronously in a child process\n * @param options Configuration options for executing the process\n * @returns Promise that resolves when the process completes\n */\nexport async function exec({\n command,\n cwd = process.cwd(),\n env,\n onOutput = (data: string) => console.log(data),\n onError = (data: string) => console.error(data),\n}: ExecOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n let spawnCommand: string;\n let spawnArgs: string[] = [];\n\n if (typeof command === 'string') {\n // For string input, first argument is the command, rest are args\n const parts = command.split(' ');\n spawnCommand = parts[0];\n spawnArgs = parts.slice(1);\n } else {\n // For object input, use command and args properties\n spawnCommand = command.command;\n spawnArgs = command.args || [];\n }\n\n const childProcess = spawn(spawnCommand, spawnArgs, {\n cwd,\n shell: true,\n env,\n });\n\n childProcess.stdout.on('data', (data) => {\n onOutput(data.toString().trim());\n });\n\n childProcess.stderr.on('data', (data) => {\n onError(data.toString().trim());\n });\n\n childProcess.on('error', (error) => {\n reject(new Error(`Failed to start process: ${error.message}`));\n });\n\n childProcess.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Process exited with code ${code}`));\n }\n });\n });\n}\n","import { findConfig, parseConfig } from '@gigadrive/network-config';\nimport { Command } from 'commander';\nimport { log } from 'console';\nimport { debug } from '../../../util/log';\n\nexport const config = (parent: Command) => {\n parent\n .command('config')\n .description('Provide debug info about the project configuration in the current directory')\n .action(async () => {\n const configPath = findConfig(process.cwd());\n\n if (!configPath) {\n debug('No config file found');\n throw new Error('The current project folder does not have a valid config file.');\n }\n\n const config = await parseConfig(configPath, process.cwd());\n\n log(`Config file found at: ${configPath}`);\n log(JSON.stringify(config, null, 2));\n });\n};\n","import type { Command } from 'commander';\nimport { config } from './config';\n\nexport const debug = (program: Command) => {\n const debug = program.command('debug').description('Provides various debugging utilities');\n\n // register subcommands\n config(debug);\n};\n","import { createEnv } from '@t3-oss/env-core';\nimport { config as loadEnv } from 'dotenv';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\n\n// Load env files from current working directory with correct precedence\n// Precedence (highest to lowest):\n// .env.<NODE_ENV>.local -> .env.local -> .env.<NODE_ENV> -> .env\n// OS environment variables always take precedence (we never use override=true)\n(() => {\n const cwd = process.cwd();\n const nodeEnv = process.env.NODE_ENV;\n\n const candidates = [\n nodeEnv ? `.env.${nodeEnv}.local` : null,\n `.env.local`,\n nodeEnv ? `.env.${nodeEnv}` : null,\n `.env`,\n ].filter(Boolean) as string[];\n\n for (const filename of candidates) {\n const fullPath = path.join(cwd, filename);\n if (fs.existsSync(fullPath)) {\n console.debug(`Loading environment variables from ${fullPath}`);\n loadEnv({ path: fullPath, override: false });\n }\n }\n})();\n\nexport const env = createEnv({\n server: {\n GIGADRIVE_NETWORK_OAUTH_ISSUER_URL: z.url().min(1).default('https://idp.gigadrive.de'),\n GIGADRIVE_NETWORK_OAUTH_CLIENT_ID: z.string().min(1).default('todo_add_client_id'),\n },\n\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n});\n","import { env } from '@/env';\n\nexport interface OAuthClientConfig {\n clientId: string;\n issuer: string;\n authorizeUrl: string;\n tokenUrl: string;\n scope: string;\n userinfoUrl: string;\n}\n\ninterface OpenIdDiscoveryDocument {\n issuer?: string;\n authorization_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n}\n\nlet cachedConfig: OAuthClientConfig | null = null;\n\nexport async function getOAuthConfig(): Promise<OAuthClientConfig> {\n if (cachedConfig) return cachedConfig;\n\n const issuerBase = env.GIGADRIVE_NETWORK_OAUTH_ISSUER_URL.replace(/\\/$/, '');\n\n // Fetch OpenID Provider Configuration\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n let discovery: OpenIdDiscoveryDocument | null = null;\n try {\n const discoveryUrl = `${issuerBase}/.well-known/openid-configuration`;\n const res = await fetch(discoveryUrl, { signal: controller.signal });\n if (res.ok) {\n discovery = (await res.json()) as OpenIdDiscoveryDocument;\n } else {\n discovery = null;\n }\n } catch {\n discovery = null;\n } finally {\n clearTimeout(timeout);\n }\n\n if (!discovery?.authorization_endpoint || !discovery?.token_endpoint || !discovery?.userinfo_endpoint) {\n throw new Error('OIDC discovery failed or returned incomplete endpoints');\n }\n\n const DEFAULT_SCOPE = 'offline_access openid profile email';\n\n cachedConfig = {\n clientId: env.GIGADRIVE_NETWORK_OAUTH_CLIENT_ID,\n issuer: discovery.issuer ?? issuerBase,\n authorizeUrl: discovery.authorization_endpoint,\n tokenUrl: discovery.token_endpoint,\n scope: DEFAULT_SCOPE,\n userinfoUrl: discovery.userinfo_endpoint,\n };\n\n return cachedConfig;\n}\n","import { getOAuthConfig } from '@/config/oauth';\nimport { error, log, success } from '@/util/log';\nimport * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as http from 'node:http';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { URL, URLSearchParams } from 'node:url';\nimport open from 'open';\n\n// Type definitions for OAuth responses\ninterface OAuthTokens {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n}\n\ninterface OAuthError {\n error?: string;\n errors?: Array<{ code: string; message?: string }>;\n}\n\n// Type definition for stored auth data\ninterface StoredAuthData {\n refreshToken: string;\n accessToken?: string;\n tokenExpirationTime?: number;\n}\n\n/**\n * Gets the path to the auth storage directory and file.\n * @returns {Object} Object containing directory and file paths.\n */\nfunction getAuthStoragePaths(): { directory: string; file: string } {\n const homeDir = os.homedir();\n const authDir = path.join(homeDir, '.gigadrive');\n const authFile = path.join(authDir, 'auth.json');\n return { directory: authDir, file: authFile };\n}\n\n/**\n * Ensures the auth storage directory exists.\n * @returns {Promise<void>}\n */\nasync function ensureAuthDirectory(): Promise<void> {\n const { directory } = getAuthStoragePaths();\n try {\n await fs.promises.mkdir(directory, { recursive: true, mode: 0o700 });\n await fs.promises.chmod(directory, 0o700);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to create auth directory: ${errorMessage}`);\n }\n}\n\n/**\n * Generates PKCE (Proof Key for Code Exchange) values.\n * code_challenge = BASE64URL(SHA256(ASCII(code_verifier))) per RFC 7636\n */\nfunction generatePKCE(): { codeVerifier: string; codeChallenge: string } {\n const codeVerifier = base64URLEncode(crypto.randomBytes(64));\n const challengeBytes = crypto.createHash('sha256').update(codeVerifier, 'utf8').digest();\n const codeChallenge = base64URLEncode(challengeBytes);\n return { codeVerifier, codeChallenge };\n}\n\n/**\n * Base64 URL-encodes a string.\n * @param {Buffer} buffer The buffer to encode.\n * @returns {string} The URL-encoded string.\n */\nfunction base64URLEncode(buffer: Buffer): string {\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Manages the CLI's authentication state, including OAuth flow and secure token storage.\n */\nexport class AuthManager {\n private accessToken: string | null = null;\n private tokenExpirationTime: number = 0; // Unix timestamp in milliseconds\n private codeVerifier: string | null = null;\n private state: string | null = null;\n\n constructor() {\n // No explicit initialization needed, tokens are loaded on demand.\n }\n\n /**\n * Retrieves the stored auth data from the local file.\n * @returns {Promise<StoredAuthData | null>} The stored auth data if found, otherwise null.\n * @private\n */\n private async _loadStoredAuthData(): Promise<StoredAuthData | null> {\n try {\n const { file } = getAuthStoragePaths();\n const data = await fs.promises.readFile(file, 'utf8');\n const authData = JSON.parse(data) as StoredAuthData;\n\n // Restore in-memory tokens if they exist and are not expired\n if (authData.accessToken && authData.tokenExpirationTime && Date.now() < authData.tokenExpirationTime) {\n this.accessToken = authData.accessToken;\n this.tokenExpirationTime = authData.tokenExpirationTime;\n }\n\n return authData;\n } catch {\n // File doesn't exist or is invalid, which is fine\n return null;\n }\n }\n\n /**\n * Stores the auth data in the local file.\n * @param {StoredAuthData} authData The auth data to store.\n * @private\n */\n private async _saveStoredAuthData(authData: StoredAuthData): Promise<void> {\n try {\n await ensureAuthDirectory();\n const { file } = getAuthStoragePaths();\n await fs.promises.writeFile(file, JSON.stringify(authData, null, 2), { encoding: 'utf8', mode: 0o600 });\n await fs.promises.chmod(file, 0o600);\n console.debug('Auth data saved to local storage.');\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error('Error saving auth data to local storage:', errorMessage);\n }\n }\n\n /**\n * Deletes the stored auth data from the local file.\n */\n public async logout(): Promise<void> {\n this.accessToken = null;\n this.tokenExpirationTime = 0;\n try {\n const { file } = getAuthStoragePaths();\n await fs.promises.unlink(file);\n log('Logged out. Auth data removed from local storage.');\n } catch {\n // File doesn't exist, which is fine\n log('Logged out.');\n }\n }\n\n /**\n * Initiates the OAuth login flow with the IDP via a web portal.\n * Opens a browser for user authentication and listens for the redirect.\n * @returns {Promise<boolean>} True if login was successful, false otherwise.\n */\n public async login(): Promise<boolean> {\n // Clear any existing tokens to ensure a fresh login experience\n await this.logout();\n\n const { codeVerifier, codeChallenge } = generatePKCE();\n this.codeVerifier = codeVerifier;\n this.state = crypto.randomBytes(16).toString('hex');\n\n const OAUTH_CONFIG = await getOAuthConfig();\n const loginState = this.state;\n if (!loginState) {\n throw new Error('Internal error: login state not initialized');\n }\n\n // Start a local HTTP server to catch the redirect callback\n const server = http.createServer();\n let usedRedirectUri = '';\n const serverPromise = new Promise<string>((resolve, reject) => {\n const redirectPath = '/callback';\n\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (!address || typeof address !== 'object') {\n reject(new Error('Failed to determine callback server address'));\n return;\n }\n const port = address.port;\n usedRedirectUri = `http://127.0.0.1:${port}${redirectPath}`;\n\n // Build the authorization URL now that we have a redirect URI\n const authUrl = new URL(OAUTH_CONFIG.authorizeUrl);\n authUrl.searchParams.append('client_id', OAUTH_CONFIG.clientId);\n authUrl.searchParams.append('redirect_uri', usedRedirectUri);\n authUrl.searchParams.append('response_type', 'code');\n authUrl.searchParams.append('scope', OAUTH_CONFIG.scope);\n authUrl.searchParams.append('code_challenge', codeChallenge);\n authUrl.searchParams.append('code_challenge_method', 'S256');\n authUrl.searchParams.append('state', loginState);\n\n log(`Please open this URL in your browser to log in:\\n${authUrl.toString()}\\n`);\n log('Waiting for login callback...');\n void open(authUrl.toString()); // Automatically open the browser\n });\n\n server.on('request', (req, res) => {\n const base = usedRedirectUri || 'http://127.0.0.1/callback';\n const reqUrl = new URL(req.url || '', base);\n if (reqUrl.pathname === '/callback') {\n const authCode = reqUrl.searchParams.get('code');\n const receivedState = reqUrl.searchParams.get('state');\n const error = reqUrl.searchParams.get('error');\n\n res.writeHead(200, { 'Content-Type': 'text/html', Connection: 'close' });\n if (error) {\n res.end('<h1>Login Failed!</h1><p>Error: ' + error + '</p><p>You can close this tab.</p>');\n reject(new Error(`OAuth error: ${error}`));\n server.close();\n return;\n }\n\n if (receivedState !== this.state) {\n res.end('<h1>Login Failed!</h1><p>State mismatch. Possible CSRF attack.</p><p>You can close this tab.</p>');\n reject(new Error('State mismatch'));\n server.close();\n return;\n }\n\n if (authCode) {\n res.end('<h1>Login Successful!</h1><p>You can close this tab.</p>');\n resolve(authCode);\n server.close();\n } else {\n res.end('<h1>Login Failed!</h1><p>No authorization code received.</p><p>You can close this tab.</p>');\n reject(new Error('No authorization code received'));\n server.close();\n }\n } else {\n res.writeHead(404).end('Not Found');\n }\n });\n\n server.on('error', (err: Error) => {\n console.error('Local server error:', err);\n reject(err);\n });\n });\n\n try {\n const authCode = await serverPromise; // Wait for the auth code from the local server\n\n // Exchange the authorization code for tokens with the IDP's token endpoint\n const tokenResponse = await fetch(OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: OAUTH_CONFIG.clientId,\n code: authCode,\n ...(usedRedirectUri ? { redirect_uri: usedRedirectUri } : {}),\n code_verifier: this.codeVerifier || '', // Use the stored codeVerifier\n }).toString(),\n });\n\n if (!tokenResponse.ok) {\n const errorData = (await tokenResponse.json().catch(() => null)) as OAuthError | null;\n throw new Error(\n `Token exchange failed: ${tokenResponse.status} ${\n tokenResponse.statusText\n } - ${errorData ? JSON.stringify(errorData) : 'Unknown error'}`\n );\n }\n\n const tokens = (await tokenResponse.json()) as OAuthTokens;\n this.accessToken = tokens.access_token;\n // Calculate expiration time based on 'expires_in' seconds\n this.tokenExpirationTime = Date.now() + (tokens.expires_in || 3600) * 1000;\n\n if (tokens.refresh_token) {\n // Store both refresh token and current access token\n await this._saveStoredAuthData({\n refreshToken: tokens.refresh_token,\n accessToken: this.accessToken,\n tokenExpirationTime: this.tokenExpirationTime,\n });\n success('Login successful!');\n return true;\n } else {\n console.error('Error: No refresh token received from Gigadrive IDP.');\n return false;\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error('Login process failed:', errorMessage);\n this.accessToken = null; // Clear any partial tokens on failure\n this.tokenExpirationTime = 0;\n return false;\n } finally {\n this.codeVerifier = null; // Clear PKCE verifier after use\n this.state = null; // Clear state after use\n }\n }\n\n /**\n * Refreshes the access token using the stored refresh token.\n * This method implicitly loads the refresh token from local storage.\n * @returns {Promise<boolean>} True if refresh was successful, false otherwise.\n */\n private async refreshAccessToken(): Promise<boolean> {\n const storedData = await this._loadStoredAuthData();\n const OAUTH_CONFIG = await getOAuthConfig();\n if (!storedData?.refreshToken) {\n error('No refresh token available for refresh. Please log in.');\n return false;\n }\n\n try {\n const tokenResponse = await fetch(OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: OAUTH_CONFIG.clientId,\n refresh_token: storedData.refreshToken,\n }).toString(),\n });\n\n if (!tokenResponse.ok) {\n const errorData = (await tokenResponse.json().catch(() => null)) as OAuthError | null;\n // Handle common refresh token errors from the IDP\n if (\n tokenResponse.status === 400 &&\n errorData &&\n (errorData.error === 'oauth_token_not_found' ||\n errorData.errors?.[0]?.code === 'token_invalid' ||\n errorData.errors?.[0]?.code === 'token_expired' ||\n errorData.errors?.[0]?.code === 'token_revoked')\n ) {\n console.error('Refresh token is invalid or expired. Please log in again.');\n await this.logout(); // Clear the invalid refresh token from storage\n return false;\n }\n throw new Error(\n `Token refresh failed: ${tokenResponse.status} ${\n tokenResponse.statusText\n } - ${errorData ? JSON.stringify(errorData) : 'Unknown error'}`\n );\n }\n\n const tokens = (await tokenResponse.json()) as OAuthTokens;\n this.accessToken = tokens.access_token;\n this.tokenExpirationTime = Date.now() + (tokens.expires_in || 3600) * 1000;\n\n // Check for refresh token rotation (IDP might issue a new refresh token)\n const newRefreshToken = tokens.refresh_token || storedData.refreshToken;\n if (tokens.refresh_token && tokens.refresh_token !== storedData.refreshToken) {\n console.debug('New refresh token received and updated.');\n }\n\n // Update stored auth data with new tokens\n await this._saveStoredAuthData({\n refreshToken: newRefreshToken,\n accessToken: this.accessToken,\n tokenExpirationTime: this.tokenExpirationTime,\n });\n\n console.debug('Access token refreshed successfully!');\n return true;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error('Error refreshing access token:', errorMessage);\n this.accessToken = null; // Clear in-memory token on refresh failure\n this.tokenExpirationTime = 0;\n return false;\n }\n }\n\n /**\n * Provides the current valid access token. If the in-memory token is expired,\n * it attempts to refresh it using the stored refresh token.\n * @returns {Promise<string | null>} The valid access token or null if no session.\n */\n public async getAccessToken(): Promise<string | null> {\n // 1. Check if the in-memory access token is still valid\n if (this.accessToken && Date.now() < this.tokenExpirationTime) {\n return this.accessToken;\n }\n\n // 2. If no valid in-memory token, attempt to refresh using the stored refresh token\n console.debug('Access token expired or not available. Attempting to refresh...');\n if (await this.refreshAccessToken()) {\n return this.accessToken;\n }\n\n // 3. If refresh failed, the user needs to log in again\n error('No valid access token available. Please log in first.');\n return null;\n }\n\n /**\n * Fetches the current user's information from the configured userinfo endpoint.\n * Attempts a single token refresh and retry on 401/403 responses.\n */\n public async getUserInfo(): Promise<Record<string, unknown> | null> {\n const OAUTH_CONFIG = await getOAuthConfig();\n const currentToken = await this.getAccessToken();\n if (!currentToken) {\n error('Not authenticated. Please log in.');\n return null;\n }\n\n const fetchUserInfo = async (token: string) =>\n fetch(OAUTH_CONFIG.userinfoUrl, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'application/json',\n },\n });\n\n let response = await fetchUserInfo(currentToken);\n\n if (response.status === 401 || response.status === 403) {\n // Try refreshing the token once and retry\n const refreshed = await this.refreshAccessToken();\n if (!refreshed || !this.accessToken) {\n return null;\n }\n response = await fetchUserInfo(this.accessToken);\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch user info: ${response.status} ${response.statusText}${body ? ` - ${body}` : ''}`\n );\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n return data;\n }\n}\n\n// Export a singleton instance of the AuthManager\nexport const authManager = new AuthManager();\n","import { authManager } from '@/auth/manager';\nimport { error, log, success } from '@/util/log';\nimport type { Command } from 'commander';\n\nexport const login = (program: Command) => {\n program\n .command('login')\n .description('Login to the platform')\n .action(async () => {\n log('Initiating login...');\n const result = await authManager.login();\n if (result) {\n // Fetch user info for a friendly success message\n try {\n const info = (await authManager.getUserInfo()) ?? {};\n const isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value.trim() !== '';\n const nameField = (info as Record<string, unknown>).name;\n const givenNameField = (info as Record<string, unknown>).given_name;\n const familyNameField = (info as Record<string, unknown>).family_name;\n const preferredUsernameField = (info as Record<string, unknown>).preferred_username;\n const emailField = (info as Record<string, unknown>).email;\n\n const inferredName =\n (isNonEmptyString(nameField) && nameField) ||\n (isNonEmptyString(givenNameField) && isNonEmptyString(familyNameField)\n ? `${givenNameField} ${familyNameField}`\n : undefined) ||\n (isNonEmptyString(preferredUsernameField) && preferredUsernameField) ||\n (isNonEmptyString(emailField) && emailField) ||\n 'your account';\n\n success(`You are now logged in as ${inferredName}.`);\n } catch {\n // Fallback if userinfo fails\n success('You are now logged in.');\n }\n } else {\n error('Login failed. Please try again.');\n }\n });\n};\n","import { formatFileSize, objectToQueryString } from '@gigadrive/commons';\nimport type { NormalizedConfig } from '@gigadrive/network-config';\nimport { findConfig, parseConfig } from '@gigadrive/network-config';\nimport type { Command } from 'commander';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { debug, error, log, spinner, success, warn } from '../../../util/log';\nimport { createZipArchive } from '../../../util/zip';\n\nexport const deploy = (parent: Command) => {\n parent\n .command('deploy')\n .description('Deploy the current project')\n .action(async () => {\n debug('Starting deploy command');\n const configPath = findConfig(process.cwd());\n\n if (!configPath) {\n debug('No config file found');\n throw new Error('The current project folder does not have a valid config file.');\n }\n\n debug(`Found config at: ${configPath}`);\n const config = await parseConfig(configPath, process.cwd());\n debug('Parsed config', config);\n\n if (config.warnings.length > 0) {\n debug(`Found ${config.warnings.length} warnings in config`);\n config.warnings.forEach((message) => {\n warn(message);\n });\n }\n\n if (config.errors.length > 0) {\n debug(`Found ${config.errors.length} errors in config`);\n config.errors.forEach((message) => {\n error(message);\n });\n\n throw new Error('The current project folder does not have a valid config file.');\n }\n\n debug('Creating deployment');\n const deploymentId = await createDeployment({\n applicationId: 'test', // TODO\n });\n\n debug(`Deployment ID: ${deploymentId}`);\n\n debug('Starting deployment process');\n await handleDeployment(deploymentId, config);\n });\n};\n\nconst handleDeployment = async (deploymentId: string, config: NormalizedConfig) => {\n debug('Deployment process initialized');\n let status: DeploymentStatus = 'PENDING';\n const logs: DeploymentLog[] = [];\n\n // Log deployment ID\n addLog('Deployment ID: ' + deploymentId, 'INFO', logs);\n\n // Start upload\n try {\n debug('Starting upload process');\n await uploadArchive(deploymentId, logs, config);\n debug('Upload completed successfully');\n addLog('Upload complete.', 'INFO', logs);\n addLog('The deployment pipeline is now being provisioned. This may take a few seconds.', 'INFO', logs);\n } catch (err) {\n debug(`Upload failed with error: ${(err as Error).message}`);\n addLog(`Upload failed: ${(err as Error).message}`, 'ERROR', logs);\n status = 'FAILED';\n error('The deployment failed. Please check the logs for more information.');\n process.exit(1);\n }\n\n // Start status polling\n const statusInterval = setInterval(() => {\n void (async () => {\n try {\n debug(`Fetching deployment status for ${deploymentId}`);\n const newStatus = await getDeploymentStatus(deploymentId);\n debug(`Current status: ${status}, New status: ${newStatus}`);\n\n if (newStatus === 'ACTIVE' || newStatus === 'FAILED') {\n debug(`Final status reached: ${newStatus}, clearing interval`);\n clearInterval(statusInterval);\n clearInterval(logsInterval);\n\n if (newStatus === 'ACTIVE') {\n success(`Deployed to https://${deploymentId}.gigadrivedev.com`);\n } else {\n error('The deployment failed. Please check the logs for more information.');\n }\n\n return;\n }\n\n if (newStatus !== status) {\n debug(`Updating status from ${status} to ${newStatus}`);\n status = newStatus;\n spinner(`Status: ${status.toLowerCase().replace(/^\\w/, (c) => c.toUpperCase())}`);\n }\n } catch (err) {\n debug(`Error fetching status: ${(err as Error).message}`);\n }\n })();\n }, 1000);\n\n // Start logs polling\n const logsInterval = setInterval(() => {\n void (async () => {\n try {\n debug(`Fetching logs for ${deploymentId}, current log count: ${logs.length}`);\n const newLogs = await getLogs(deploymentId, {\n offset: logs.length,\n limit: 100,\n 'createdAt[gt]': logs[logs.length - 1]?.createdAt,\n });\n\n debug(`Fetched ${newLogs.items.length} new logs`);\n\n // Display new logs\n for (const logEntry of newLogs.items) {\n logs.push(logEntry);\n\n if (logEntry.type === 'ERROR') {\n error(logEntry.message);\n } else if (logEntry.type === 'WARN') {\n warn(logEntry.message);\n } else {\n log(logEntry.message);\n }\n }\n } catch (err) {\n debug(`Error fetching logs: ${(err as Error).message}`);\n }\n })();\n }, 1000);\n\n // Initial status display\n spinner(`Status: ${status.toLowerCase().replace(/^\\w/, (c) => c.toUpperCase())}`);\n};\n\nconst addLog = (message: string, type: 'INFO' | 'ERROR' | 'WARN', logs: DeploymentLog[]) => {\n debug(`Adding log: [${type}] ${message}`);\n logs.push({\n id: String(logs.length),\n message,\n type,\n createdAt: new Date().toISOString(),\n });\n\n if (type === 'ERROR') {\n error(message);\n } else if (type === 'WARN') {\n warn(message);\n } else {\n log(message);\n }\n};\n\nconst uploadArchive = async (deploymentId: string, logs: DeploymentLog[], config: NormalizedConfig) => {\n debug('Starting uploadArchive');\n addLog('Creating archive...', 'INFO', logs);\n\n const archivePath = path.join(process.env.TEMP || os.tmpdir(), `project-${Date.now()}.zip`);\n debug(`Archive path: ${archivePath}`);\n\n if (fs.existsSync(archivePath)) {\n debug(`Archive already exists, removing: ${archivePath}`);\n fs.unlinkSync(archivePath);\n }\n\n debug('Creating zip archive');\n\n await createZipArchive(config.userArchive?.rootOverwrite || process.cwd(), archivePath, {\n whitelist: config.userArchive?.fileWhitelist,\n useIgnoreFiles: false,\n useManagedIgnore: false,\n });\n\n const fileStats = fs.statSync(archivePath);\n const fileSize = fileStats.size;\n debug(`Archive created, size: ${fileSize} bytes (${formatFileSize(fileSize)})`);\n\n addLog(`Archive created (${formatFileSize(fileSize)})`, 'INFO', logs);\n\n addLog('Uploading archive...', 'INFO', logs);\n\n debug(`Starting multipart upload for deployment: ${deploymentId}`);\n const uploadId = await startMultipartUpload(deploymentId);\n\n debug(`Upload ID: ${uploadId}`);\n\n debug('Uploading archive...');\n\n const fileChunkSize = 10 * 1024 * 1024; // 10 MB\n const numChunks = Math.ceil(fileSize / fileChunkSize);\n debug(`File size: ${fileSize}, chunk size: ${fileChunkSize}, number of chunks: ${numChunks}`);\n\n const promises = [];\n let start: number, end: number;\n\n for (let index = 1; index < numChunks + 1; index++) {\n start = (index - 1) * fileChunkSize;\n end = index * fileChunkSize;\n debug(`Processing chunk ${index}/${numChunks}, start: ${start}, end: ${end}`);\n\n const presignedUrl = await getPresignedUrl(deploymentId, uploadId, index);\n debug('Presigned URL for part', index, presignedUrl);\n\n const promise = new Promise<Response>((resolve, reject) => {\n void (async () => {\n try {\n debug(`Reading chunk ${index} data`);\n const readStream = fs.createReadStream(archivePath, {\n start,\n end: index < numChunks ? end - 1 : undefined,\n });\n\n const chunks: Buffer[] = [];\n readStream.on('data', (chunk: Buffer | string) => {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n\n await new Promise<void>((resolveRead) => {\n readStream.on('end', () => resolveRead());\n readStream.on('error', reject);\n });\n\n const buffer = Buffer.concat(chunks);\n\n debug(`Uploading chunk ${index} to presigned URL (${buffer.length} bytes)`);\n const response = await fetch(presignedUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/zip',\n 'Content-Length': String(buffer.length),\n },\n body: buffer,\n });\n resolve(response);\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n })();\n });\n\n promises.push(promise);\n }\n\n const finishedParts: { partNumber: number; etag: string }[] = [];\n\n try {\n debug(`Waiting for all ${promises.length} upload promises to complete`);\n const responses = await Promise.all(promises);\n debug('All upload promises completed');\n\n for (let index = 0; index < responses.length; index++) {\n const res = responses[index];\n debug(`Checking response for part ${index + 1}, status: ${res.status}`);\n\n if (!res.ok) {\n debug(`Failed to upload part ${index + 1}: ${res.statusText} ${await res.text()}`);\n throw new Error(`Failed to upload part ${index + 1}: ${res.statusText}`);\n }\n\n const etag = res.headers.get('ETag');\n if (!etag) {\n debug(`Failed to get ETag for part ${index + 1}`);\n throw new Error(`Failed to get ETag for part ${index + 1}`);\n }\n\n debug(`Part ${index + 1} uploaded successfully, ETag: ${etag}`);\n finishedParts.push({\n partNumber: index + 1,\n etag: etag,\n });\n }\n\n debug(`Completing upload with ${finishedParts.length} parts`);\n await completeUpload(deploymentId, uploadId, finishedParts);\n debug('Upload completed successfully');\n } catch (err) {\n const error = err as Error;\n debug(`Upload error: ${error.message}`);\n addLog(`Upload error: ${error.message}`, 'ERROR', logs);\n throw error;\n }\n};\n\nconst createDeployment = async ({ applicationId }: { applicationId: string }) => {\n debug(`Creating deployment for application: ${applicationId}`);\n const res = await fetch(`http://localhost:3000/${applicationId}/deployments`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n duplex: 'half',\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to create deployment: ${errorText}`);\n throw new Error('Failed to create deployment: ' + errorText);\n }\n\n const deployment = (await res.json()) as { id: string };\n debug(`Deployment created with ID: ${deployment.id}`);\n\n return deployment.id;\n};\n\nconst startMultipartUpload = async (deploymentId: string) => {\n debug(`Starting multipart upload for deployment: ${deploymentId}`);\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}/pre-signed-url/start`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to start multipart upload: ${errorText}`);\n throw new Error('Failed to start multipart upload: ' + errorText);\n }\n\n const upload = (await res.json()) as { uploadId: string };\n debug(`Multipart upload started with ID: ${upload.uploadId}`);\n\n return upload.uploadId;\n};\n\nconst getPresignedUrl = async (deploymentId: string, uploadId: string, partNumber: number) => {\n debug(`Getting presigned URL for deployment: ${deploymentId}, upload: ${uploadId}, part: ${partNumber}`);\n const res = await fetch(\n `http://localhost:3000/deployments/${deploymentId}/pre-signed-url/part?uploadId=${uploadId}&partNumber=${partNumber}`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to get pre-signed URL: ${errorText}`);\n throw new Error('Failed to get pre-signed URL: ' + errorText);\n }\n\n const upload = (await res.json()) as { url: string };\n debug(`Got presigned URL for part ${partNumber}`);\n\n return upload.url;\n};\n\nconst completeUpload = async (\n deploymentId: string,\n uploadId: string,\n parts: { partNumber: number; etag: string }[]\n) => {\n debug(`Completing upload for deployment: ${deploymentId}, upload: ${uploadId}, parts: ${parts.length}`);\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}/pre-signed-url/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n uploadId,\n parts,\n }),\n duplex: 'half',\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to complete upload: ${errorText}`);\n throw new Error('Failed to complete upload: ' + errorText);\n }\n\n debug('Upload completed successfully');\n};\n\nconst getDeploymentStatus = async (deploymentId: string) => {\n debug(`Getting deployment status for: ${deploymentId}`);\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to get deployment status: ${errorText}`);\n throw new Error('Failed to get deployment status: ' + errorText);\n }\n\n const deployment = (await res.json()) as { status: DeploymentStatus };\n debug(`Deployment status: ${deployment.status}`);\n\n return deployment.status;\n};\n\nconst getLogs = async (\n deploymentId: string,\n options?: {\n offset: number;\n limit: number;\n 'createdAt[gt]'?: string;\n }\n) => {\n debug(`Getting logs for deployment: ${deploymentId}, options:`, options ?? 'No options');\n const res = await fetch(`http://localhost:3000/deployments/${deploymentId}/logs${objectToQueryString(options)}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorText = await res.text();\n debug(`Failed to get logs: ${errorText}`);\n throw new Error('Failed to get logs: ' + errorText);\n }\n\n const logs = (await res.json()) as {\n totalItems: number;\n limit: number;\n offset: number;\n items: DeploymentLog[];\n };\n\n debug(`Got ${logs.items.length} logs, total: ${logs.totalItems}`);\n return logs;\n};\n\ntype DeploymentStatus = 'PENDING' | 'BUILDING' | 'PROVISIONING' | 'FAILED' | 'ACTIVE' | 'SUSPENDED';\n\ntype DeploymentLog = { id: string; message: string; type: 'INFO' | 'ERROR' | 'WARN'; createdAt: string };\n","import { getFilesForPattern } from '@gigadrive/build-utils';\nimport archiver from 'archiver';\nimport fs from 'fs';\nimport fsPromises from 'fs/promises';\nimport ignore, { type Ignore } from 'ignore';\nimport path from 'path';\n\nconst ignoreFileNames = [/*'.gitignore', */ '.gigadriveignore', '.vercelignore', '.dockerignore', '.nowignore'];\n\n// Function to read and parse the ignore file\nasync function readIgnoreFile(ignorePath: string) {\n try {\n await fsPromises.access(ignorePath);\n const content = await fsPromises.readFile(ignorePath, 'utf8');\n return content.split('\\n').filter((line: string) => line.trim() !== '');\n } catch {\n return [];\n }\n}\n\n// Collect ignore patterns from the given directory (including the root)\nasync function collectIgnorePatterns(dir: string, baseDir: string, ignoreRules: Ignore) {\n const items = await fsPromises.readdir(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const relativePath = path.relative(baseDir, fullPath);\n const stat = await fsPromises.lstat(fullPath);\n\n if (stat.isDirectory()) {\n // If the directory itself is ignored, skip it unless it has a negation rule\n if (ignoreRules.ignores(`${relativePath}/`)) {\n continue;\n }\n\n // Check if the directory contains an ignore file\n for (const ignoreFileName of ignoreFileNames) {\n const ignoreFilePath = path.join(fullPath, ignoreFileName);\n try {\n await fsPromises.access(ignoreFilePath);\n const patterns = (await readIgnoreFile(ignoreFilePath)).map((pattern: string) => {\n return pattern.startsWith('!')\n ? `!${path.join(relativePath, pattern.slice(1))}`\n : path.join(relativePath, pattern);\n });\n ignoreRules.add(patterns);\n } catch {\n // File doesn't exist, skip\n }\n }\n\n // Recurse into subdirectory\n await collectIgnorePatterns(fullPath, baseDir, ignoreRules);\n }\n }\n}\n\n// Function to initialize ignore rules including root-level ignore files\nasync function initializeIgnoreRules(baseDir: string): Promise<Ignore> {\n const ignoreRules = ignore();\n\n // Add default ignore rules\n ignoreRules.add(['.git/', '**/.DS_Store', '**/Thumbs.db']);\n\n // Process root-level ignore files\n for (const ignoreFileName of ignoreFileNames) {\n const ignoreFilePath = path.join(baseDir, ignoreFileName);\n try {\n await fsPromises.access(ignoreFilePath);\n const patterns = (await readIgnoreFile(ignoreFilePath)).map((pattern: string) => {\n return pattern.startsWith('!') ? `!${pattern.slice(1)}` : pattern;\n });\n ignoreRules.add(patterns);\n } catch {\n // File doesn't exist, skip\n }\n }\n\n // Recursively process all subdirectories to gather additional ignore patterns\n await collectIgnorePatterns(baseDir, baseDir, ignoreRules);\n\n return ignoreRules;\n}\n\n// Function to get all files and directories, excluding those in the ignore list\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nasync function getFilesToInclude(dir: string, ignoreRules: Ignore, whitelist?: string[]) {\n const filesToInclude: string[] = [];\n\n async function walkDir(currentDir: string) {\n const items = await fsPromises.readdir(currentDir);\n\n for (const item of items) {\n const fullPath = path.join(currentDir, item);\n const relativePath = path.relative(dir, fullPath);\n const stat = await fsPromises.lstat(fullPath);\n\n if (stat.isDirectory()) {\n if (ignoreRules.ignores(`${relativePath}/`)) {\n continue;\n }\n await walkDir(fullPath);\n } else {\n if (!ignoreRules.ignores(relativePath)) {\n filesToInclude.push(fullPath);\n } else if (ignoreRules.ignores(relativePath) && ignoreRules.test(relativePath).unignored) {\n // Handle whitelisted files that were previously ignored\n filesToInclude.push(fullPath);\n }\n }\n }\n }\n\n await walkDir(dir);\n return filesToInclude;\n}\n\n// Function to create the zip archive\nexport async function createZipArchive(\n inputDir: string,\n outputFile: string,\n options: {\n whitelist?: string[];\n useIgnoreFiles?: boolean;\n useManagedIgnore?: boolean;\n } = {}\n) {\n const ignoreRules = options.useIgnoreFiles !== false ? await initializeIgnoreRules(inputDir) : ignore();\n\n // Get list of files to include in the zip\n const filesToInclude = options.whitelist\n ? await Promise.all(options.whitelist.map((file) => getFilesForPattern(inputDir, file)))\n : await getFilesToInclude(inputDir, ignoreRules);\n\n // Create zip file\n const output = fs.createWriteStream(outputFile);\n const archive = archiver('zip', { zlib: { level: 9 } });\n\n return new Promise<void>((resolve, reject) => {\n output.on('close', () => resolve());\n archive.on('error', reject);\n\n archive.pipe(output);\n\n // Add files to the archive\n for (const file of filesToInclude.flat()) {\n archive.file(file, { name: path.relative(inputDir, file) });\n }\n\n void archive.finalize();\n });\n}\n","import type { Command } from 'commander';\nimport { deploy } from './deploy';\n\nexport const platform = (program: Command) => {\n const platform = program.command('platform').description('Manage the platform');\n\n // register subcommands\n deploy(platform);\n};\n","import type { Command } from 'commander';\nimport { authManager } from '../../auth/manager';\n\nexport const whoami = (program: Command) => {\n program\n .command('whoami')\n .description('Show the currently authenticated user information')\n .action(async () => {\n try {\n const info = await authManager.getUserInfo();\n if (!info) {\n console.log('You are not logged in. Run \"gigadrive login\" to authenticate.');\n return;\n }\n // Pretty-print the user info JSON\n console.log(JSON.stringify(info, null, 2));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Failed to retrieve user info: ${msg}`);\n }\n });\n};\n"],"mappings":"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","names":["import_fs","import_path","env","error","path","fs","env","path","fs","config","debug","path","fs","loadEnv","fs","path","error","open","import_network_config","import_fs","import_path","import_build_utils","import_fs","import_path","fsPromises","path","ignore","fs","archiver","config","path","os","fs","promises","error","platform","debug","error"]}