@dbcube/core 1.0.30 → 1.0.32

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.
package/dist/bin.cjs CHANGED
@@ -366,7 +366,7 @@ var Downloader = class {
366
366
  }
367
367
  static getDefaultBinDir() {
368
368
  const possibleDirs = [
369
- path.resolve(process.cwd(), "bin"),
369
+ path.resolve(process.cwd(), ".dbcube", "bin"),
370
370
  path.resolve(process.cwd(), "node_modules", ".dbcube", "bin"),
371
371
  path.resolve(__dirname, "..", "bin")
372
372
  ];
@@ -383,7 +383,7 @@ var Downloader = class {
383
383
  continue;
384
384
  }
385
385
  }
386
- const tempDir = path.join(os2.tmpdir(), "dbcube-bin");
386
+ const tempDir = path.join(os2.tmpdir(), ".dbcube", "bin");
387
387
  fs.mkdirSync(tempDir, { recursive: true });
388
388
  return tempDir;
389
389
  }
package/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/Arquitecture.ts","../src/lib/Donwloader.ts","../src/bin.ts"],"sourcesContent":["import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as os from \"os\";\r\nimport { https } from 'follow-redirects';\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n \r\n static get(prefix: string): BinaryType & { name: string; url: string } {\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform();\r\n const architecture = arch.getArchitecture();\r\n \r\n const platformMap: Record<string, string> = {\r\n windows: \"windows\",\r\n linux: \"linux\",\r\n darwin: \"macos\"\r\n };\r\n \r\n const archMap: Record<string, string> = {\r\n x86_64: \"x64\",\r\n aarch64: \"arm64\"\r\n };\r\n \r\n const plat = platformMap[platform];\r\n const archSuffix = archMap[architecture];\r\n \r\n if (plat && archSuffix) {\r\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\r\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\r\n \r\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n query_engine: binaryName,\r\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\r\n };\r\n }\r\n \r\n return {\r\n name: \"\",\r\n url: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n static async download(targetDir?: string): Promise<void> {\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n const binDir = targetDir || this.getDefaultBinDir();\r\n fs.mkdirSync(binDir, { recursive: true });\r\n\r\n // Initialize main spinner\r\n this.mainSpinner = ora({\r\n text: chalk.blue('Descargando binarios necesarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n for (let i = 0; i < binaries.length; i++) {\r\n const prefix = binaries[i];\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n \r\n while (attempt <= maxRetries) {\r\n try {\r\n const binaryInfo = this.get(prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(\"Plataforma o arquitectura no soportada\");\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Skip if already exists\r\n if (fs.existsSync(finalBinaryPath)) {\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'exists');\r\n break;\r\n }\r\n\r\n // Update main spinner for current binary\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'downloading');\r\n \r\n // Download with progress tracking\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, prefix);\r\n \r\n // Extract\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'extracting');\r\n await this.extractBinary(tempZipPath, finalBinaryPath, prefix);\r\n \r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'completed');\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Error desconocido';\r\n \r\n if (attempt < maxRetries && (\r\n errorMessage.includes('ECONNRESET') || \r\n errorMessage.includes('timeout') ||\r\n errorMessage.includes('ETIMEDOUT') ||\r\n errorMessage.includes('ENOTFOUND')\r\n )) {\r\n attempt++;\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'retrying', attempt);\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n } else {\r\n this.mainSpinner.fail(chalk.red(`Error descargando ${prefix}: ${errorMessage}`));\r\n throw error;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binarios descargados correctamente'));\r\n }\r\n\r\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\r\n const progressBar = this.createProgressBar(current, total);\r\n const statusEmojis = {\r\n downloading: '📥',\r\n extracting: '📦', \r\n completed: '✅',\r\n exists: '✅',\r\n retrying: '🔄'\r\n };\r\n \r\n const statusMessages = {\r\n downloading: chalk.blue('descargando'),\r\n extracting: chalk.yellow('extrayendo'),\r\n completed: chalk.green('completado'),\r\n exists: chalk.gray('existe'),\r\n retrying: chalk.orange(`reintentando (${attempt}/${3})`)\r\n };\r\n\r\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\r\n const message = statusMessages[status as keyof typeof statusMessages] || status;\r\n \r\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\r\n }\r\n\r\n private static createProgressBar(current: number, total: number, width: number = 20): string {\r\n const filled = Math.round((current / total) * width);\r\n const empty = width - filled;\r\n const filledBar = chalk.green('█'.repeat(filled));\r\n const emptyBar = chalk.gray('░'.repeat(empty));\r\n const percentage = chalk.bold(`${current}/${total}`);\r\n return `[${filledBar}${emptyBar}] ${percentage}`;\r\n }\r\n\r\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const request = https.get(url, { timeout: 60000 }, (response: IncomingMessage) => {\r\n if (response.statusCode === 302 || response.statusCode === 301) {\r\n const redirectUrl = response.headers.location;\r\n if (redirectUrl) {\r\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\r\n }\r\n }\r\n \r\n if (response.statusCode !== 200) {\r\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\r\n return;\r\n }\r\n\r\n const file = fs.createWriteStream(outputPath);\r\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\r\n let downloadedBytes = 0;\r\n\r\n response.on('data', (chunk) => {\r\n downloadedBytes += chunk.length;\r\n file.write(chunk);\r\n \r\n if (totalBytes > 0) {\r\n const progress: DownloadProgress = {\r\n downloaded: downloadedBytes,\r\n total: totalBytes,\r\n percentage: (downloadedBytes / totalBytes) * 100\r\n };\r\n this.updateDownloadProgress(prefix, progress);\r\n }\r\n });\r\n\r\n response.on('end', () => {\r\n file.end();\r\n resolve();\r\n });\r\n\r\n response.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n\r\n file.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n });\r\n\r\n request.on('error', reject);\r\n request.on('timeout', () => {\r\n request.destroy();\r\n reject(new Error(`Timeout descargando ${prefix}`));\r\n });\r\n });\r\n }\r\n\r\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\r\n const percentage = progress.percentage.toFixed(1);\r\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\r\n const total = (progress.total / 1024 / 1024).toFixed(1);\r\n \r\n // Create a mini progress bar for the binary\r\n const barWidth = 15;\r\n const filled = Math.round((progress.percentage / 100) * barWidth);\r\n const empty = barWidth - filled;\r\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\r\n \r\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\r\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\r\n }\r\n\r\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let extracted = false;\r\n \r\n fs.createReadStream(zipPath)\r\n .pipe(unzipper.Parse())\r\n .on('entry', (entry: unzipper.Entry) => {\r\n if (entry.type === 'File' && !extracted) {\r\n extracted = true;\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n entry.pipe(writeStream);\r\n \r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n fs.chmodSync(outputPath, 0o755);\r\n }\r\n this.cleanupFile(zipPath);\r\n resolve();\r\n });\r\n \r\n writeStream.on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n });\r\n } else {\r\n entry.autodrain();\r\n }\r\n })\r\n .on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n })\r\n .on('close', () => {\r\n if (!extracted) {\r\n this.cleanupFile(zipPath);\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n }\r\n });\r\n });\r\n }\r\n\r\n private static cleanupFile(filePath: string): void {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n\r\n private static getDefaultBinDir(): string {\r\n // Try to find a suitable directory for binaries in order of preference\r\n const possibleDirs = [\r\n path.resolve(process.cwd(), 'bin'),\r\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\r\n path.resolve(__dirname, '..', 'bin'),\r\n ];\r\n\r\n // Use the first one that can be created or already exists\r\n for (const dir of possibleDirs) {\r\n try {\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n // Test write permissions\r\n const testFile = path.join(dir, '.test');\r\n fs.writeFileSync(testFile, 'test');\r\n fs.unlinkSync(testFile);\r\n return dir;\r\n } catch {\r\n // Try next directory\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback to temp directory\r\n const tempDir = path.join(os.tmpdir(), 'dbcube-bin');\r\n fs.mkdirSync(tempDir, { recursive: true });\r\n return tempDir;\r\n }\r\n}\r\n\r\nexport { Downloader };","#!/usr/bin/env node\r\n\r\nimport { Downloader } from \"./lib/Donwloader\";\r\n\r\n/**\r\n * Script CLI para descargar binarios manualmente\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'install':\r\n case 'download':\r\n console.log('🚀 Iniciando descarga de binarios DBCube...');\r\n try {\r\n await Downloader.download();\r\n console.log('✅ ¡Todos los binarios descargados exitosamente!');\r\n } catch (error) {\r\n console.error('❌ Error descargando binarios:', error);\r\n process.exit(1);\r\n }\r\n break;\r\n \r\n case 'check':\r\n console.log('🔍 Verificando binarios...');\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n for (const prefix of binaries) {\r\n const binary = Downloader.get(prefix);\r\n console.log(`${prefix}-engine: ${binary.name}`);\r\n console.log(` URL: ${binary.url}`);\r\n }\r\n break;\r\n \r\n default:\r\n console.log('DBCube Binary Manager');\r\n console.log('');\r\n console.log('Comandos disponibles:');\r\n console.log(' install|download - Descargar todos los binarios');\r\n console.log(' check - Verificar información de binarios');\r\n console.log('');\r\n console.log('Uso:');\r\n console.log(' npx @dbcube/core install');\r\n console.log(' npx @dbcube/core check');\r\n }\r\n}\r\n\r\nmain().catch(error => {\r\n console.error('Error:', error);\r\n process.exit(1);\r\n});"],"mappings":"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","names":["platform","arch","os","arch","platform","ora","chalk","resolve"]}
1
+ {"version":3,"sources":["../src/lib/Arquitecture.ts","../src/lib/Donwloader.ts","../src/bin.ts"],"sourcesContent":["import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as os from \"os\";\r\nimport { https } from 'follow-redirects';\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n \r\n static get(prefix: string): BinaryType & { name: string; url: string } {\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform();\r\n const architecture = arch.getArchitecture();\r\n \r\n const platformMap: Record<string, string> = {\r\n windows: \"windows\",\r\n linux: \"linux\",\r\n darwin: \"macos\"\r\n };\r\n \r\n const archMap: Record<string, string> = {\r\n x86_64: \"x64\",\r\n aarch64: \"arm64\"\r\n };\r\n \r\n const plat = platformMap[platform];\r\n const archSuffix = archMap[architecture];\r\n \r\n if (plat && archSuffix) {\r\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\r\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\r\n \r\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n query_engine: binaryName,\r\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\r\n };\r\n }\r\n \r\n return {\r\n name: \"\",\r\n url: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n static async download(targetDir?: string): Promise<void> {\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n const binDir = targetDir || this.getDefaultBinDir();\r\n fs.mkdirSync(binDir, { recursive: true });\r\n\r\n // Initialize main spinner\r\n this.mainSpinner = ora({\r\n text: chalk.blue('Descargando binarios necesarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n for (let i = 0; i < binaries.length; i++) {\r\n const prefix = binaries[i];\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n \r\n while (attempt <= maxRetries) {\r\n try {\r\n const binaryInfo = this.get(prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(\"Plataforma o arquitectura no soportada\");\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Skip if already exists\r\n if (fs.existsSync(finalBinaryPath)) {\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'exists');\r\n break;\r\n }\r\n\r\n // Update main spinner for current binary\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'downloading');\r\n \r\n // Download with progress tracking\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, prefix);\r\n \r\n // Extract\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'extracting');\r\n await this.extractBinary(tempZipPath, finalBinaryPath, prefix);\r\n \r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'completed');\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Error desconocido';\r\n \r\n if (attempt < maxRetries && (\r\n errorMessage.includes('ECONNRESET') || \r\n errorMessage.includes('timeout') ||\r\n errorMessage.includes('ETIMEDOUT') ||\r\n errorMessage.includes('ENOTFOUND')\r\n )) {\r\n attempt++;\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'retrying', attempt);\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n } else {\r\n this.mainSpinner.fail(chalk.red(`Error descargando ${prefix}: ${errorMessage}`));\r\n throw error;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binarios descargados correctamente'));\r\n }\r\n\r\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\r\n const progressBar = this.createProgressBar(current, total);\r\n const statusEmojis = {\r\n downloading: '📥',\r\n extracting: '📦', \r\n completed: '✅',\r\n exists: '✅',\r\n retrying: '🔄'\r\n };\r\n \r\n const statusMessages = {\r\n downloading: chalk.blue('descargando'),\r\n extracting: chalk.yellow('extrayendo'),\r\n completed: chalk.green('completado'),\r\n exists: chalk.gray('existe'),\r\n retrying: chalk.orange(`reintentando (${attempt}/${3})`)\r\n };\r\n\r\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\r\n const message = statusMessages[status as keyof typeof statusMessages] || status;\r\n \r\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\r\n }\r\n\r\n private static createProgressBar(current: number, total: number, width: number = 20): string {\r\n const filled = Math.round((current / total) * width);\r\n const empty = width - filled;\r\n const filledBar = chalk.green('█'.repeat(filled));\r\n const emptyBar = chalk.gray('░'.repeat(empty));\r\n const percentage = chalk.bold(`${current}/${total}`);\r\n return `[${filledBar}${emptyBar}] ${percentage}`;\r\n }\r\n\r\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const request = https.get(url, { timeout: 60000 }, (response: IncomingMessage) => {\r\n if (response.statusCode === 302 || response.statusCode === 301) {\r\n const redirectUrl = response.headers.location;\r\n if (redirectUrl) {\r\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\r\n }\r\n }\r\n \r\n if (response.statusCode !== 200) {\r\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\r\n return;\r\n }\r\n\r\n const file = fs.createWriteStream(outputPath);\r\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\r\n let downloadedBytes = 0;\r\n\r\n response.on('data', (chunk) => {\r\n downloadedBytes += chunk.length;\r\n file.write(chunk);\r\n \r\n if (totalBytes > 0) {\r\n const progress: DownloadProgress = {\r\n downloaded: downloadedBytes,\r\n total: totalBytes,\r\n percentage: (downloadedBytes / totalBytes) * 100\r\n };\r\n this.updateDownloadProgress(prefix, progress);\r\n }\r\n });\r\n\r\n response.on('end', () => {\r\n file.end();\r\n resolve();\r\n });\r\n\r\n response.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n\r\n file.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n });\r\n\r\n request.on('error', reject);\r\n request.on('timeout', () => {\r\n request.destroy();\r\n reject(new Error(`Timeout descargando ${prefix}`));\r\n });\r\n });\r\n }\r\n\r\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\r\n const percentage = progress.percentage.toFixed(1);\r\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\r\n const total = (progress.total / 1024 / 1024).toFixed(1);\r\n \r\n // Create a mini progress bar for the binary\r\n const barWidth = 15;\r\n const filled = Math.round((progress.percentage / 100) * barWidth);\r\n const empty = barWidth - filled;\r\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\r\n \r\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\r\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\r\n }\r\n\r\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let extracted = false;\r\n \r\n fs.createReadStream(zipPath)\r\n .pipe(unzipper.Parse())\r\n .on('entry', (entry: unzipper.Entry) => {\r\n if (entry.type === 'File' && !extracted) {\r\n extracted = true;\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n entry.pipe(writeStream);\r\n \r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n fs.chmodSync(outputPath, 0o755);\r\n }\r\n this.cleanupFile(zipPath);\r\n resolve();\r\n });\r\n \r\n writeStream.on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n });\r\n } else {\r\n entry.autodrain();\r\n }\r\n })\r\n .on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n })\r\n .on('close', () => {\r\n if (!extracted) {\r\n this.cleanupFile(zipPath);\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n }\r\n });\r\n });\r\n }\r\n\r\n private static cleanupFile(filePath: string): void {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n\r\n private static getDefaultBinDir(): string {\r\n // Try to find a suitable directory for binaries in order of preference\r\n const possibleDirs = [\r\n path.resolve(process.cwd(), '.dbcube', 'bin'),\r\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\r\n path.resolve(__dirname, '..', 'bin'),\r\n ];\r\n\r\n // Use the first one that can be created or already exists\r\n for (const dir of possibleDirs) {\r\n try {\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n // Test write permissions\r\n const testFile = path.join(dir, '.test');\r\n fs.writeFileSync(testFile, 'test');\r\n fs.unlinkSync(testFile);\r\n return dir;\r\n } catch {\r\n // Try next directory\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback to .dbcube directory in temp\r\n const tempDir = path.join(os.tmpdir(), '.dbcube', 'bin');\r\n fs.mkdirSync(tempDir, { recursive: true });\r\n return tempDir;\r\n }\r\n}\r\n\r\nexport { Downloader };","#!/usr/bin/env node\r\n\r\nimport { Downloader } from \"./lib/Donwloader\";\r\n\r\n/**\r\n * Script CLI para descargar binarios manualmente\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'install':\r\n case 'download':\r\n console.log('🚀 Iniciando descarga de binarios DBCube...');\r\n try {\r\n await Downloader.download();\r\n console.log('✅ ¡Todos los binarios descargados exitosamente!');\r\n } catch (error) {\r\n console.error('❌ Error descargando binarios:', error);\r\n process.exit(1);\r\n }\r\n break;\r\n \r\n case 'check':\r\n console.log('🔍 Verificando binarios...');\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n for (const prefix of binaries) {\r\n const binary = Downloader.get(prefix);\r\n console.log(`${prefix}-engine: ${binary.name}`);\r\n console.log(` URL: ${binary.url}`);\r\n }\r\n break;\r\n \r\n default:\r\n console.log('DBCube Binary Manager');\r\n console.log('');\r\n console.log('Comandos disponibles:');\r\n console.log(' install|download - Descargar todos los binarios');\r\n console.log(' check - Verificar información de binarios');\r\n console.log('');\r\n console.log('Uso:');\r\n console.log(' npx @dbcube/core install');\r\n console.log(' npx @dbcube/core check');\r\n }\r\n}\r\n\r\nmain().catch(error => {\r\n console.error('Error:', error);\r\n process.exit(1);\r\n});"],"mappings":"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","names":["platform","arch","os","arch","platform","ora","chalk","resolve"]}
package/dist/bin.js CHANGED
@@ -343,7 +343,7 @@ var Downloader = class {
343
343
  }
344
344
  static getDefaultBinDir() {
345
345
  const possibleDirs = [
346
- path.resolve(process.cwd(), "bin"),
346
+ path.resolve(process.cwd(), ".dbcube", "bin"),
347
347
  path.resolve(process.cwd(), "node_modules", ".dbcube", "bin"),
348
348
  path.resolve(__dirname, "..", "bin")
349
349
  ];
@@ -360,7 +360,7 @@ var Downloader = class {
360
360
  continue;
361
361
  }
362
362
  }
363
- const tempDir = path.join(os2.tmpdir(), "dbcube-bin");
363
+ const tempDir = path.join(os2.tmpdir(), ".dbcube", "bin");
364
364
  fs.mkdirSync(tempDir, { recursive: true });
365
365
  return tempDir;
366
366
  }
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/Arquitecture.ts","../src/lib/Donwloader.ts","../src/bin.ts"],"sourcesContent":["import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as os from \"os\";\r\nimport { https } from 'follow-redirects';\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n \r\n static get(prefix: string): BinaryType & { name: string; url: string } {\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform();\r\n const architecture = arch.getArchitecture();\r\n \r\n const platformMap: Record<string, string> = {\r\n windows: \"windows\",\r\n linux: \"linux\",\r\n darwin: \"macos\"\r\n };\r\n \r\n const archMap: Record<string, string> = {\r\n x86_64: \"x64\",\r\n aarch64: \"arm64\"\r\n };\r\n \r\n const plat = platformMap[platform];\r\n const archSuffix = archMap[architecture];\r\n \r\n if (plat && archSuffix) {\r\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\r\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\r\n \r\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n query_engine: binaryName,\r\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\r\n };\r\n }\r\n \r\n return {\r\n name: \"\",\r\n url: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n static async download(targetDir?: string): Promise<void> {\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n const binDir = targetDir || this.getDefaultBinDir();\r\n fs.mkdirSync(binDir, { recursive: true });\r\n\r\n // Initialize main spinner\r\n this.mainSpinner = ora({\r\n text: chalk.blue('Descargando binarios necesarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n for (let i = 0; i < binaries.length; i++) {\r\n const prefix = binaries[i];\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n \r\n while (attempt <= maxRetries) {\r\n try {\r\n const binaryInfo = this.get(prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(\"Plataforma o arquitectura no soportada\");\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Skip if already exists\r\n if (fs.existsSync(finalBinaryPath)) {\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'exists');\r\n break;\r\n }\r\n\r\n // Update main spinner for current binary\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'downloading');\r\n \r\n // Download with progress tracking\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, prefix);\r\n \r\n // Extract\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'extracting');\r\n await this.extractBinary(tempZipPath, finalBinaryPath, prefix);\r\n \r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'completed');\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Error desconocido';\r\n \r\n if (attempt < maxRetries && (\r\n errorMessage.includes('ECONNRESET') || \r\n errorMessage.includes('timeout') ||\r\n errorMessage.includes('ETIMEDOUT') ||\r\n errorMessage.includes('ENOTFOUND')\r\n )) {\r\n attempt++;\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'retrying', attempt);\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n } else {\r\n this.mainSpinner.fail(chalk.red(`Error descargando ${prefix}: ${errorMessage}`));\r\n throw error;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binarios descargados correctamente'));\r\n }\r\n\r\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\r\n const progressBar = this.createProgressBar(current, total);\r\n const statusEmojis = {\r\n downloading: '📥',\r\n extracting: '📦', \r\n completed: '✅',\r\n exists: '✅',\r\n retrying: '🔄'\r\n };\r\n \r\n const statusMessages = {\r\n downloading: chalk.blue('descargando'),\r\n extracting: chalk.yellow('extrayendo'),\r\n completed: chalk.green('completado'),\r\n exists: chalk.gray('existe'),\r\n retrying: chalk.orange(`reintentando (${attempt}/${3})`)\r\n };\r\n\r\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\r\n const message = statusMessages[status as keyof typeof statusMessages] || status;\r\n \r\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\r\n }\r\n\r\n private static createProgressBar(current: number, total: number, width: number = 20): string {\r\n const filled = Math.round((current / total) * width);\r\n const empty = width - filled;\r\n const filledBar = chalk.green('█'.repeat(filled));\r\n const emptyBar = chalk.gray('░'.repeat(empty));\r\n const percentage = chalk.bold(`${current}/${total}`);\r\n return `[${filledBar}${emptyBar}] ${percentage}`;\r\n }\r\n\r\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const request = https.get(url, { timeout: 60000 }, (response: IncomingMessage) => {\r\n if (response.statusCode === 302 || response.statusCode === 301) {\r\n const redirectUrl = response.headers.location;\r\n if (redirectUrl) {\r\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\r\n }\r\n }\r\n \r\n if (response.statusCode !== 200) {\r\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\r\n return;\r\n }\r\n\r\n const file = fs.createWriteStream(outputPath);\r\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\r\n let downloadedBytes = 0;\r\n\r\n response.on('data', (chunk) => {\r\n downloadedBytes += chunk.length;\r\n file.write(chunk);\r\n \r\n if (totalBytes > 0) {\r\n const progress: DownloadProgress = {\r\n downloaded: downloadedBytes,\r\n total: totalBytes,\r\n percentage: (downloadedBytes / totalBytes) * 100\r\n };\r\n this.updateDownloadProgress(prefix, progress);\r\n }\r\n });\r\n\r\n response.on('end', () => {\r\n file.end();\r\n resolve();\r\n });\r\n\r\n response.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n\r\n file.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n });\r\n\r\n request.on('error', reject);\r\n request.on('timeout', () => {\r\n request.destroy();\r\n reject(new Error(`Timeout descargando ${prefix}`));\r\n });\r\n });\r\n }\r\n\r\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\r\n const percentage = progress.percentage.toFixed(1);\r\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\r\n const total = (progress.total / 1024 / 1024).toFixed(1);\r\n \r\n // Create a mini progress bar for the binary\r\n const barWidth = 15;\r\n const filled = Math.round((progress.percentage / 100) * barWidth);\r\n const empty = barWidth - filled;\r\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\r\n \r\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\r\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\r\n }\r\n\r\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let extracted = false;\r\n \r\n fs.createReadStream(zipPath)\r\n .pipe(unzipper.Parse())\r\n .on('entry', (entry: unzipper.Entry) => {\r\n if (entry.type === 'File' && !extracted) {\r\n extracted = true;\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n entry.pipe(writeStream);\r\n \r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n fs.chmodSync(outputPath, 0o755);\r\n }\r\n this.cleanupFile(zipPath);\r\n resolve();\r\n });\r\n \r\n writeStream.on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n });\r\n } else {\r\n entry.autodrain();\r\n }\r\n })\r\n .on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n })\r\n .on('close', () => {\r\n if (!extracted) {\r\n this.cleanupFile(zipPath);\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n }\r\n });\r\n });\r\n }\r\n\r\n private static cleanupFile(filePath: string): void {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n\r\n private static getDefaultBinDir(): string {\r\n // Try to find a suitable directory for binaries in order of preference\r\n const possibleDirs = [\r\n path.resolve(process.cwd(), 'bin'),\r\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\r\n path.resolve(__dirname, '..', 'bin'),\r\n ];\r\n\r\n // Use the first one that can be created or already exists\r\n for (const dir of possibleDirs) {\r\n try {\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n // Test write permissions\r\n const testFile = path.join(dir, '.test');\r\n fs.writeFileSync(testFile, 'test');\r\n fs.unlinkSync(testFile);\r\n return dir;\r\n } catch {\r\n // Try next directory\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback to temp directory\r\n const tempDir = path.join(os.tmpdir(), 'dbcube-bin');\r\n fs.mkdirSync(tempDir, { recursive: true });\r\n return tempDir;\r\n }\r\n}\r\n\r\nexport { Downloader };","#!/usr/bin/env node\r\n\r\nimport { Downloader } from \"./lib/Donwloader\";\r\n\r\n/**\r\n * Script CLI para descargar binarios manualmente\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'install':\r\n case 'download':\r\n console.log('🚀 Iniciando descarga de binarios DBCube...');\r\n try {\r\n await Downloader.download();\r\n console.log('✅ ¡Todos los binarios descargados exitosamente!');\r\n } catch (error) {\r\n console.error('❌ Error descargando binarios:', error);\r\n process.exit(1);\r\n }\r\n break;\r\n \r\n case 'check':\r\n console.log('🔍 Verificando binarios...');\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n for (const prefix of binaries) {\r\n const binary = Downloader.get(prefix);\r\n console.log(`${prefix}-engine: ${binary.name}`);\r\n console.log(` URL: ${binary.url}`);\r\n }\r\n break;\r\n \r\n default:\r\n console.log('DBCube Binary Manager');\r\n console.log('');\r\n console.log('Comandos disponibles:');\r\n console.log(' install|download - Descargar todos los binarios');\r\n console.log(' check - Verificar información de binarios');\r\n console.log('');\r\n console.log('Uso:');\r\n console.log(' npx @dbcube/core install');\r\n console.log(' npx @dbcube/core check');\r\n }\r\n}\r\n\r\nmain().catch(error => {\r\n console.error('Error:', error);\r\n process.exit(1);\r\n});"],"mappings":"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","names":["platform","arch","os","arch","platform","resolve"]}
1
+ {"version":3,"sources":["../src/lib/Arquitecture.ts","../src/lib/Donwloader.ts","../src/bin.ts"],"sourcesContent":["import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport * as os from \"os\";\r\nimport { https } from 'follow-redirects';\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n \r\n static get(prefix: string): BinaryType & { name: string; url: string } {\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform();\r\n const architecture = arch.getArchitecture();\r\n \r\n const platformMap: Record<string, string> = {\r\n windows: \"windows\",\r\n linux: \"linux\",\r\n darwin: \"macos\"\r\n };\r\n \r\n const archMap: Record<string, string> = {\r\n x86_64: \"x64\",\r\n aarch64: \"arm64\"\r\n };\r\n \r\n const plat = platformMap[platform];\r\n const archSuffix = archMap[architecture];\r\n \r\n if (plat && archSuffix) {\r\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\r\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\r\n \r\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n query_engine: binaryName,\r\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\r\n };\r\n }\r\n \r\n return {\r\n name: \"\",\r\n url: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n static async download(targetDir?: string): Promise<void> {\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n const binDir = targetDir || this.getDefaultBinDir();\r\n fs.mkdirSync(binDir, { recursive: true });\r\n\r\n // Initialize main spinner\r\n this.mainSpinner = ora({\r\n text: chalk.blue('Descargando binarios necesarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n for (let i = 0; i < binaries.length; i++) {\r\n const prefix = binaries[i];\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n \r\n while (attempt <= maxRetries) {\r\n try {\r\n const binaryInfo = this.get(prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(\"Plataforma o arquitectura no soportada\");\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Skip if already exists\r\n if (fs.existsSync(finalBinaryPath)) {\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'exists');\r\n break;\r\n }\r\n\r\n // Update main spinner for current binary\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'downloading');\r\n \r\n // Download with progress tracking\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, prefix);\r\n \r\n // Extract\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'extracting');\r\n await this.extractBinary(tempZipPath, finalBinaryPath, prefix);\r\n \r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'completed');\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Error desconocido';\r\n \r\n if (attempt < maxRetries && (\r\n errorMessage.includes('ECONNRESET') || \r\n errorMessage.includes('timeout') ||\r\n errorMessage.includes('ETIMEDOUT') ||\r\n errorMessage.includes('ENOTFOUND')\r\n )) {\r\n attempt++;\r\n this.updateMainProgress(prefix, i + 1, binaries.length, 'retrying', attempt);\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n } else {\r\n this.mainSpinner.fail(chalk.red(`Error descargando ${prefix}: ${errorMessage}`));\r\n throw error;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binarios descargados correctamente'));\r\n }\r\n\r\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\r\n const progressBar = this.createProgressBar(current, total);\r\n const statusEmojis = {\r\n downloading: '📥',\r\n extracting: '📦', \r\n completed: '✅',\r\n exists: '✅',\r\n retrying: '🔄'\r\n };\r\n \r\n const statusMessages = {\r\n downloading: chalk.blue('descargando'),\r\n extracting: chalk.yellow('extrayendo'),\r\n completed: chalk.green('completado'),\r\n exists: chalk.gray('existe'),\r\n retrying: chalk.orange(`reintentando (${attempt}/${3})`)\r\n };\r\n\r\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\r\n const message = statusMessages[status as keyof typeof statusMessages] || status;\r\n \r\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\r\n }\r\n\r\n private static createProgressBar(current: number, total: number, width: number = 20): string {\r\n const filled = Math.round((current / total) * width);\r\n const empty = width - filled;\r\n const filledBar = chalk.green('█'.repeat(filled));\r\n const emptyBar = chalk.gray('░'.repeat(empty));\r\n const percentage = chalk.bold(`${current}/${total}`);\r\n return `[${filledBar}${emptyBar}] ${percentage}`;\r\n }\r\n\r\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const request = https.get(url, { timeout: 60000 }, (response: IncomingMessage) => {\r\n if (response.statusCode === 302 || response.statusCode === 301) {\r\n const redirectUrl = response.headers.location;\r\n if (redirectUrl) {\r\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\r\n }\r\n }\r\n \r\n if (response.statusCode !== 200) {\r\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\r\n return;\r\n }\r\n\r\n const file = fs.createWriteStream(outputPath);\r\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\r\n let downloadedBytes = 0;\r\n\r\n response.on('data', (chunk) => {\r\n downloadedBytes += chunk.length;\r\n file.write(chunk);\r\n \r\n if (totalBytes > 0) {\r\n const progress: DownloadProgress = {\r\n downloaded: downloadedBytes,\r\n total: totalBytes,\r\n percentage: (downloadedBytes / totalBytes) * 100\r\n };\r\n this.updateDownloadProgress(prefix, progress);\r\n }\r\n });\r\n\r\n response.on('end', () => {\r\n file.end();\r\n resolve();\r\n });\r\n\r\n response.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n\r\n file.on('error', (err) => {\r\n file.close();\r\n this.cleanupFile(outputPath);\r\n reject(err);\r\n });\r\n });\r\n\r\n request.on('error', reject);\r\n request.on('timeout', () => {\r\n request.destroy();\r\n reject(new Error(`Timeout descargando ${prefix}`));\r\n });\r\n });\r\n }\r\n\r\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\r\n const percentage = progress.percentage.toFixed(1);\r\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\r\n const total = (progress.total / 1024 / 1024).toFixed(1);\r\n \r\n // Create a mini progress bar for the binary\r\n const barWidth = 15;\r\n const filled = Math.round((progress.percentage / 100) * barWidth);\r\n const empty = barWidth - filled;\r\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\r\n \r\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\r\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\r\n }\r\n\r\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n let extracted = false;\r\n \r\n fs.createReadStream(zipPath)\r\n .pipe(unzipper.Parse())\r\n .on('entry', (entry: unzipper.Entry) => {\r\n if (entry.type === 'File' && !extracted) {\r\n extracted = true;\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n entry.pipe(writeStream);\r\n \r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n fs.chmodSync(outputPath, 0o755);\r\n }\r\n this.cleanupFile(zipPath);\r\n resolve();\r\n });\r\n \r\n writeStream.on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n });\r\n } else {\r\n entry.autodrain();\r\n }\r\n })\r\n .on('error', (err: Error) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\r\n })\r\n .on('close', () => {\r\n if (!extracted) {\r\n this.cleanupFile(zipPath);\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n }\r\n });\r\n });\r\n }\r\n\r\n private static cleanupFile(filePath: string): void {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n\r\n private static getDefaultBinDir(): string {\r\n // Try to find a suitable directory for binaries in order of preference\r\n const possibleDirs = [\r\n path.resolve(process.cwd(), '.dbcube', 'bin'),\r\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\r\n path.resolve(__dirname, '..', 'bin'),\r\n ];\r\n\r\n // Use the first one that can be created or already exists\r\n for (const dir of possibleDirs) {\r\n try {\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n // Test write permissions\r\n const testFile = path.join(dir, '.test');\r\n fs.writeFileSync(testFile, 'test');\r\n fs.unlinkSync(testFile);\r\n return dir;\r\n } catch {\r\n // Try next directory\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback to .dbcube directory in temp\r\n const tempDir = path.join(os.tmpdir(), '.dbcube', 'bin');\r\n fs.mkdirSync(tempDir, { recursive: true });\r\n return tempDir;\r\n }\r\n}\r\n\r\nexport { Downloader };","#!/usr/bin/env node\r\n\r\nimport { Downloader } from \"./lib/Donwloader\";\r\n\r\n/**\r\n * Script CLI para descargar binarios manualmente\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'install':\r\n case 'download':\r\n console.log('🚀 Iniciando descarga de binarios DBCube...');\r\n try {\r\n await Downloader.download();\r\n console.log('✅ ¡Todos los binarios descargados exitosamente!');\r\n } catch (error) {\r\n console.error('❌ Error descargando binarios:', error);\r\n process.exit(1);\r\n }\r\n break;\r\n \r\n case 'check':\r\n console.log('🔍 Verificando binarios...');\r\n const binaries = ['schema', 'query', 'sqlite'];\r\n for (const prefix of binaries) {\r\n const binary = Downloader.get(prefix);\r\n console.log(`${prefix}-engine: ${binary.name}`);\r\n console.log(` URL: ${binary.url}`);\r\n }\r\n break;\r\n \r\n default:\r\n console.log('DBCube Binary Manager');\r\n console.log('');\r\n console.log('Comandos disponibles:');\r\n console.log(' install|download - Descargar todos los binarios');\r\n console.log(' check - Verificar información de binarios');\r\n console.log('');\r\n console.log('Uso:');\r\n console.log(' npx @dbcube/core install');\r\n console.log(' npx @dbcube/core check');\r\n }\r\n}\r\n\r\nmain().catch(error => {\r\n console.error('Error:', error);\r\n process.exit(1);\r\n});"],"mappings":";;;AAAA,YAAY,QAAQ;AAoBpB,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EAER,cAAc;AACV,SAAK,aAAa,KAAK,iBAAiB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAA+B;AACnC,WAAO;AAAA,MACH,UAAa,YAAS;AAAA,MACtB,MAAS,QAAK;AAAA,MACd,SAAY,WAAQ;AAAA,MACpB,MAAS,QAAK;AAAA,MACd,YAAe,cAAW;AAAA,MAC1B,MAAS,QAAK,EAAE;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AAClB,UAAMA,YAAW,KAAK,WAAW;AAEjC,YAAQA,WAAU;AAAA,MACd,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAOA;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0B;AACtB,UAAMC,QAAO,KAAK,WAAW;AAE7B,YAAQA,OAAM;AAAA,MACV,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAOA;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,UAA0B;AACpC,UAAMD,YAAW,KAAK,YAAY;AAClC,UAAMC,QAAO,KAAK,gBAAgB;AAClC,UAAM,YAAYD,cAAa,YAAY,SAAS;AAEpD,WAAO,GAAG,QAAQ,IAAIA,SAAQ,IAAIC,KAAI,GAAG,SAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA4B;AACxB,WAAO,EAAE,GAAG,KAAK,WAAW;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B;AAC1B,UAAMD,YAAW,KAAK,YAAY;AAClC,UAAMC,QAAO,KAAK,gBAAgB;AAGlC,UAAM,YAAuC;AAAA,MACzC,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,IACtB;AAEA,UAAM,MAAM,GAAGD,SAAQ,IAAIC,KAAI;AAC/B,WAAO,UAAU,GAAG,KAAK,GAAGA,KAAI,YAAYD,SAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACpB,YAAQ,IAAI,sCAA0B;AACtC,YAAQ,IAAI,0BAAgB,KAAK,YAAY,CAAC;AAC9C,YAAQ,IAAI,8BAAoB,KAAK,gBAAgB,CAAC;AACtD,YAAQ,IAAI,yBAAe,KAAK,WAAW,IAAI;AAC/C,YAAQ,IAAI,4BAAkB,KAAK,WAAW,OAAO;AACrD,YAAQ,IAAI,4BAAkB,KAAK,WAAW,UAAU;AACxD,YAAQ,IAAI,sBAAY,KAAK,WAAW,IAAI;AAC5C,YAAQ,IAAI,6BAAmB,KAAK,oBAAoB,CAAC;AAAA,EAC7D;AACJ;;;ACtJA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAYE,SAAQ;AACpB,SAAS,aAAa;AACtB,YAAY,cAAc;AAE1B,OAAO,SAAS;AAChB,OAAO,WAAW;AAQlB,IAAM,aAAN,MAAiB;AAAA,EACb,OAAe,cAAmB;AAAA,EAClC,OAAe,iBAAsB;AAAA,EAErC,OAAO,IAAI,QAA4D;AACnE,UAAMC,QAAO,IAAI,aAAa;AAC9B,UAAMC,YAAWD,MAAK,YAAY;AAClC,UAAM,eAAeA,MAAK,gBAAgB;AAE1C,UAAM,cAAsC;AAAA,MACxC,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACZ;AAEA,UAAM,UAAkC;AAAA,MACpC,QAAQ;AAAA,MACR,SAAS;AAAA,IACb;AAEA,UAAM,OAAO,YAAYC,SAAQ;AACjC,UAAM,aAAa,QAAQ,YAAY;AAEvC,QAAI,QAAQ,YAAY;AACpB,YAAM,WAAW,GAAG,MAAM,WAAW,IAAI,IAAI,UAAU;AACvD,YAAM,aAAaA,cAAa,YAAY,GAAG,QAAQ,SAAS;AAEhE,YAAM,MAAM,wDAAwD,MAAM,WAAW,MAAM,kBAAkB,IAAI,IAAI,UAAU;AAC/H,aAAO;AAAA,QACH,MAAM;AAAA,QACN;AAAA,QACA,cAAc;AAAA,QACd,eAAe,GAAG,MAAM,WAAW,IAAI,IAAI,UAAU,GAAGA,cAAa,YAAY,SAAS,EAAE;AAAA,MAChG;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,MAAM;AAAA,MACN,KAAK;AAAA,MACL,cAAc;AAAA,MACd,eAAe;AAAA,IACnB;AAAA,EACJ;AAAA,EAEA,aAAa,SAAS,WAAmC;AACrD,UAAM,WAAW,CAAC,UAAU,SAAS,QAAQ;AAC7C,UAAM,SAAS,aAAa,KAAK,iBAAiB;AAClD,IAAG,aAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAGxC,SAAK,cAAc,IAAI;AAAA,MACnB,MAAM,MAAM,KAAK,oCAAoC;AAAA,MACrD,SAAS;AAAA,IACb,CAAC,EAAE,MAAM;AAET,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,YAAM,SAAS,SAAS,CAAC;AACzB,YAAM,aAAa;AACnB,UAAI,UAAU;AAEd,aAAO,WAAW,YAAY;AAC1B,YAAI;AACA,gBAAM,aAAa,KAAK,IAAI,MAAM;AAElC,cAAI,CAAC,WAAW,QAAQ,CAAC,WAAW,KAAK;AACrC,kBAAM,IAAI,MAAM,wCAAwC;AAAA,UAC5D;AAEA,gBAAM,cAAmB,UAAQ,WAAO,GAAG,UAAU,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM;AAC/E,gBAAM,kBAAuB,UAAK,QAAQ,WAAW,IAAI;AAGzD,cAAO,cAAW,eAAe,GAAG;AAChC,iBAAK,mBAAmB,QAAQ,IAAI,GAAG,SAAS,QAAQ,QAAQ;AAChE;AAAA,UACJ;AAGA,eAAK,mBAAmB,QAAQ,IAAI,GAAG,SAAS,QAAQ,aAAa;AAGrE,gBAAM,KAAK,yBAAyB,WAAW,KAAK,aAAa,MAAM;AAGvE,eAAK,mBAAmB,QAAQ,IAAI,GAAG,SAAS,QAAQ,YAAY;AACpE,gBAAM,KAAK,cAAc,aAAa,iBAAiB,MAAM;AAE7D,eAAK,mBAAmB,QAAQ,IAAI,GAAG,SAAS,QAAQ,WAAW;AACnE;AAAA,QAEJ,SAAS,OAAgB;AACrB,gBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAE9D,cAAI,UAAU,eACV,aAAa,SAAS,YAAY,KAClC,aAAa,SAAS,SAAS,KAC/B,aAAa,SAAS,WAAW,KACjC,aAAa,SAAS,WAAW,IAClC;AACC;AACA,iBAAK,mBAAmB,QAAQ,IAAI,GAAG,SAAS,QAAQ,YAAY,OAAO;AAC3E,kBAAM,IAAI,QAAQ,CAAAC,aAAW,WAAWA,UAAS,GAAI,CAAC;AAAA,UAC1D,OAAO;AACH,iBAAK,YAAY,KAAK,MAAM,IAAI,qBAAqB,MAAM,KAAK,YAAY,EAAE,CAAC;AAC/E,kBAAM;AAAA,UACV;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,SAAK,YAAY,QAAQ,MAAM,MAAM,oCAAoC,CAAC;AAAA,EAC9E;AAAA,EAEA,OAAe,mBAAmB,QAAgB,SAAiB,OAAe,QAAgB,SAAkB;AAChH,UAAM,cAAc,KAAK,kBAAkB,SAAS,KAAK;AACzD,UAAM,eAAe;AAAA,MACjB,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,IACd;AAEA,UAAM,iBAAiB;AAAA,MACnB,aAAa,MAAM,KAAK,aAAa;AAAA,MACrC,YAAY,MAAM,OAAO,YAAY;AAAA,MACrC,WAAW,MAAM,MAAM,YAAY;AAAA,MACnC,QAAQ,MAAM,KAAK,QAAQ;AAAA,MAC3B,UAAU,MAAM,OAAO,iBAAiB,OAAO,IAAI,CAAC,GAAG;AAAA,IAC3D;AAEA,UAAM,QAAQ,aAAa,MAAmC,KAAK;AACnE,UAAM,UAAU,eAAe,MAAqC,KAAK;AAEzE,SAAK,YAAY,OAAO,GAAG,WAAW,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,OAAO;AAAA,EACtF;AAAA,EAEA,OAAe,kBAAkB,SAAiB,OAAe,QAAgB,IAAY;AACzF,UAAM,SAAS,KAAK,MAAO,UAAU,QAAS,KAAK;AACnD,UAAM,QAAQ,QAAQ;AACtB,UAAM,YAAY,MAAM,MAAM,SAAI,OAAO,MAAM,CAAC;AAChD,UAAM,WAAW,MAAM,KAAK,SAAI,OAAO,KAAK,CAAC;AAC7C,UAAM,aAAa,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,EAAE;AACnD,WAAO,IAAI,SAAS,GAAG,QAAQ,KAAK,UAAU;AAAA,EAClD;AAAA,EAEA,OAAe,yBAAyB,KAAa,YAAoB,QAA+B;AACpG,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACpC,YAAM,UAAU,MAAM,IAAI,KAAK,EAAE,SAAS,IAAM,GAAG,CAAC,aAA8B;AAC9E,YAAI,SAAS,eAAe,OAAO,SAAS,eAAe,KAAK;AAC5D,gBAAM,cAAc,SAAS,QAAQ;AACrC,cAAI,aAAa;AACb,mBAAO,KAAK,yBAAyB,aAAa,YAAY,MAAM,EAAE,KAAKA,QAAO,EAAE,MAAM,MAAM;AAAA,UACpG;AAAA,QACJ;AAEA,YAAI,SAAS,eAAe,KAAK;AAC7B,iBAAO,IAAI,MAAM,QAAQ,SAAS,UAAU,SAAS,MAAM,EAAE,CAAC;AAC9D;AAAA,QACJ;AAEA,cAAM,OAAU,qBAAkB,UAAU;AAC5C,cAAM,aAAa,SAAS,SAAS,QAAQ,gBAAgB,KAAK,KAAK,EAAE;AACzE,YAAI,kBAAkB;AAEtB,iBAAS,GAAG,QAAQ,CAAC,UAAU;AAC3B,6BAAmB,MAAM;AACzB,eAAK,MAAM,KAAK;AAEhB,cAAI,aAAa,GAAG;AAChB,kBAAM,WAA6B;AAAA,cAC/B,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,YAAa,kBAAkB,aAAc;AAAA,YACjD;AACA,iBAAK,uBAAuB,QAAQ,QAAQ;AAAA,UAChD;AAAA,QACJ,CAAC;AAED,iBAAS,GAAG,OAAO,MAAM;AACrB,eAAK,IAAI;AACT,UAAAA,SAAQ;AAAA,QACZ,CAAC;AAED,iBAAS,GAAG,SAAS,CAAC,QAAQ;AAC1B,eAAK,MAAM;AACX,eAAK,YAAY,UAAU;AAC3B,iBAAO,GAAG;AAAA,QACd,CAAC;AAED,aAAK,GAAG,SAAS,CAAC,QAAQ;AACtB,eAAK,MAAM;AACX,eAAK,YAAY,UAAU;AAC3B,iBAAO,GAAG;AAAA,QACd,CAAC;AAAA,MACL,CAAC;AAED,cAAQ,GAAG,SAAS,MAAM;AAC1B,cAAQ,GAAG,WAAW,MAAM;AACxB,gBAAQ,QAAQ;AAChB,eAAO,IAAI,MAAM,uBAAuB,MAAM,EAAE,CAAC;AAAA,MACrD,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA,EAEA,OAAe,uBAAuB,QAAgB,UAA4B;AAC9E,UAAM,aAAa,SAAS,WAAW,QAAQ,CAAC;AAChD,UAAM,cAAc,SAAS,aAAa,OAAO,MAAM,QAAQ,CAAC;AAChE,UAAM,SAAS,SAAS,QAAQ,OAAO,MAAM,QAAQ,CAAC;AAGtD,UAAM,WAAW;AACjB,UAAM,SAAS,KAAK,MAAO,SAAS,aAAa,MAAO,QAAQ;AAChE,UAAM,QAAQ,WAAW;AACzB,UAAM,cAAc,MAAM,MAAM,SAAI,OAAO,MAAM,CAAC,IAAI,MAAM,KAAK,SAAI,OAAO,KAAK,CAAC;AAElF,UAAM,eAAe,IAAI,WAAW,KAAK,UAAU,MAAM,UAAU,IAAI,KAAK;AAC5E,SAAK,YAAY,OAAO,aAAM,MAAM,KAAK,MAAM,CAAC,MAAM,YAAY;AAAA,EACtE;AAAA,EAEA,OAAe,cAAc,SAAiB,YAAoB,QAA+B;AAC7F,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACpC,UAAI,YAAY;AAEhB,MAAG,oBAAiB,OAAO,EACtB,KAAc,eAAM,CAAC,EACrB,GAAG,SAAS,CAAC,UAA0B;AACpC,YAAI,MAAM,SAAS,UAAU,CAAC,WAAW;AACrC,sBAAY;AACZ,gBAAM,cAAiB,qBAAkB,UAAU;AAEnD,gBAAM,KAAK,WAAW;AAEtB,sBAAY,GAAG,UAAU,MAAM;AAC3B,gBAAI,QAAQ,aAAa,SAAS;AAC9B,cAAG,aAAU,YAAY,GAAK;AAAA,YAClC;AACA,iBAAK,YAAY,OAAO;AACxB,YAAAA,SAAQ;AAAA,UACZ,CAAC;AAED,sBAAY,GAAG,SAAS,CAAC,QAAe;AACpC,iBAAK,YAAY,OAAO;AACxB,mBAAO,GAAG;AAAA,UACd,CAAC;AAAA,QACL,OAAO;AACH,gBAAM,UAAU;AAAA,QACpB;AAAA,MACJ,CAAC,EACA,GAAG,SAAS,CAAC,QAAe;AACzB,aAAK,YAAY,OAAO;AACxB,eAAO,GAAG;AAAA,MACd,CAAC,EACA,GAAG,SAAS,MAAM;AACf,YAAI,CAAC,WAAW;AACZ,eAAK,YAAY,OAAO;AACxB,iBAAO,IAAI,MAAM,sDAAgD,MAAM,EAAE,CAAC;AAAA,QAC9E;AAAA,MACJ,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEA,OAAe,YAAY,UAAwB;AAC/C,QAAI;AACA,UAAO,cAAW,QAAQ,GAAG;AACzB,QAAG,cAAW,QAAQ;AAAA,MAC1B;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACJ;AAAA,EAEA,OAAe,mBAA2B;AAEtC,UAAM,eAAe;AAAA,MACZ,aAAQ,QAAQ,IAAI,GAAG,WAAW,KAAK;AAAA,MACvC,aAAQ,QAAQ,IAAI,GAAG,gBAAgB,WAAW,KAAK;AAAA,MACvD,aAAQ,WAAW,MAAM,KAAK;AAAA,IACvC;AAGA,eAAW,OAAO,cAAc;AAC5B,UAAI;AACA,YAAI,CAAI,cAAW,GAAG,GAAG;AACrB,UAAG,aAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,QACzC;AAEA,cAAM,WAAgB,UAAK,KAAK,OAAO;AACvC,QAAG,iBAAc,UAAU,MAAM;AACjC,QAAG,cAAW,QAAQ;AACtB,eAAO;AAAA,MACX,QAAQ;AAEJ;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,UAAe,UAAQ,WAAO,GAAG,WAAW,KAAK;AACvD,IAAG,aAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,WAAO;AAAA,EACX;AACJ;;;ACzTA,eAAe,OAAO;AAClB,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAAU,KAAK,CAAC;AAEtB,UAAQ,SAAS;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACD,cAAQ,IAAI,oDAA6C;AACzD,UAAI;AACA,cAAM,WAAW,SAAS;AAC1B,gBAAQ,IAAI,yDAAiD;AAAA,MACjE,SAAS,OAAO;AACZ,gBAAQ,MAAM,sCAAiC,KAAK;AACpD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA;AAAA,IAEJ,KAAK;AACD,cAAQ,IAAI,mCAA4B;AACxC,YAAM,WAAW,CAAC,UAAU,SAAS,QAAQ;AAC7C,iBAAW,UAAU,UAAU;AAC3B,cAAM,SAAS,WAAW,IAAI,MAAM;AACpC,gBAAQ,IAAI,GAAG,MAAM,YAAY,OAAO,IAAI,EAAE;AAC9C,gBAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,MACtC;AACA;AAAA,IAEJ;AACI,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,IAAI,2DAAwD;AACpE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,MAAM;AAClB,cAAQ,IAAI,4BAA4B;AACxC,cAAQ,IAAI,0BAA0B;AAAA,EAC9C;AACJ;AAEA,KAAK,EAAE,MAAM,WAAS;AAClB,UAAQ,MAAM,UAAU,KAAK;AAC7B,UAAQ,KAAK,CAAC;AAClB,CAAC;","names":["platform","arch","os","arch","platform","resolve"]}
package/dist/index.cjs CHANGED
@@ -388,7 +388,7 @@ var Downloader = class {
388
388
  }
389
389
  static getDefaultBinDir() {
390
390
  const possibleDirs = [
391
- path.resolve(process.cwd(), "bin"),
391
+ path.resolve(process.cwd(), ".dbcube", "bin"),
392
392
  path.resolve(process.cwd(), "node_modules", ".dbcube", "bin"),
393
393
  path.resolve(__dirname, "..", "bin")
394
394
  ];
@@ -405,7 +405,7 @@ var Downloader = class {
405
405
  continue;
406
406
  }
407
407
  }
408
- const tempDir = path.join(os2.tmpdir(), "dbcube-bin");
408
+ const tempDir = path.join(os2.tmpdir(), ".dbcube", "bin");
409
409
  fs.mkdirSync(tempDir, { recursive: true });
410
410
  return tempDir;
411
411
  }
@@ -414,6 +414,7 @@ var Downloader = class {
414
414
  // src/lib/Binary.ts
415
415
  var fs2 = __toESM(require("fs"));
416
416
  var path2 = __toESM(require("path"));
417
+ var os3 = __toESM(require("os"));
417
418
  var Binary = class {
418
419
  static isDownloading = false;
419
420
  static downloadPromise = null;
@@ -455,7 +456,7 @@ var Binary = class {
455
456
  }
456
457
  static getBinDir() {
457
458
  const possibleDirs = [
458
- path2.resolve(process.cwd(), "bin"),
459
+ path2.resolve(process.cwd(), ".dbcube", "bin"),
459
460
  path2.resolve(process.cwd(), "node_modules", ".dbcube", "bin"),
460
461
  path2.resolve(__dirname, "..", "bin")
461
462
  ];
@@ -464,12 +465,32 @@ var Binary = class {
464
465
  if (!fs2.existsSync(dir)) {
465
466
  fs2.mkdirSync(dir, { recursive: true });
466
467
  }
468
+ if (dir.includes(path2.resolve(process.cwd(), ".dbcube"))) {
469
+ this.ensureGitIgnore(path2.resolve(process.cwd(), ".dbcube"));
470
+ }
467
471
  return dir;
468
472
  } catch {
469
473
  continue;
470
474
  }
471
475
  }
472
- return process.cwd();
476
+ const tempDir = path2.join(os3.tmpdir(), ".dbcube", "bin");
477
+ fs2.mkdirSync(tempDir, { recursive: true });
478
+ return tempDir;
479
+ }
480
+ static ensureGitIgnore(dbcubeDir) {
481
+ try {
482
+ const gitignorePath = path2.join(dbcubeDir, ".gitignore");
483
+ if (!fs2.existsSync(gitignorePath)) {
484
+ const gitignoreContent = `# DBCube binaries
485
+ bin/
486
+ *.exe
487
+ *.log
488
+ *.tmp
489
+ `;
490
+ fs2.writeFileSync(gitignorePath, gitignoreContent);
491
+ }
492
+ } catch {
493
+ }
473
494
  }
474
495
  static async get() {
475
496
  await this.ensureBinariesExist();