@dbcube/core 5.2.2 → 5.2.4

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
@@ -162,8 +162,7 @@ var Downloader = class {
162
162
  static currentSpinner = null;
163
163
  static VERSION_URLS = {
164
164
  query: "https://raw.githubusercontent.com/Dbcube/binaries/main/query-engines.json",
165
- schema: "https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json",
166
- sqlite: "https://raw.githubusercontent.com/Dbcube/binaries/main/sqlite-engines.json"
165
+ schema: "https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json"
167
166
  };
168
167
  /**
169
168
  * Fetch latest version from GitHub
@@ -333,7 +332,7 @@ var Downloader = class {
333
332
  spinner: "dots12"
334
333
  }).start();
335
334
  const binariesToProcess = [];
336
- for (const prefix of ["query", "schema", "sqlite"]) {
335
+ for (const prefix of ["query", "schema"]) {
337
336
  try {
338
337
  const localVersion = this.getLocalVersion(binDir, prefix);
339
338
  const remoteVersion = await this.fetchLatestVersion(prefix);
@@ -498,34 +497,46 @@ var Downloader = class {
498
497
  }
499
498
  static extractBinary(zipPath, outputPath, prefix) {
500
499
  return new Promise((resolve2, reject) => {
501
- let extracted = false;
500
+ const outDir = path.dirname(outputPath);
501
+ let extracted = 0;
502
+ const pending = [];
502
503
  fs.createReadStream(zipPath).pipe(unzipper.Parse()).on("entry", (entry) => {
503
- if (entry.type === "File" && !extracted) {
504
- extracted = true;
505
- const writeStream = fs.createWriteStream(outputPath);
504
+ if (entry.type !== "File") {
505
+ entry.autodrain();
506
+ return;
507
+ }
508
+ const isMain = extracted === 0;
509
+ extracted++;
510
+ const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));
511
+ pending.push(new Promise((res, rej) => {
512
+ const writeStream = fs.createWriteStream(target);
506
513
  entry.pipe(writeStream);
507
514
  writeStream.on("finish", () => {
508
515
  if (process.platform !== "win32") {
509
- fs.chmodSync(outputPath, 493);
516
+ try {
517
+ fs.chmodSync(target, 493);
518
+ } catch {
519
+ }
510
520
  }
511
- this.cleanupFile(zipPath);
512
- resolve2();
521
+ res();
513
522
  });
514
- writeStream.on("error", (err) => {
515
- this.cleanupFile(zipPath);
516
- reject(err);
517
- });
518
- } else {
519
- entry.autodrain();
520
- }
523
+ writeStream.on("error", rej);
524
+ }));
521
525
  }).on("error", (err) => {
522
526
  this.cleanupFile(zipPath);
523
527
  reject(err);
524
528
  }).on("close", () => {
525
- if (!extracted) {
529
+ Promise.all(pending).then(() => {
526
530
  this.cleanupFile(zipPath);
527
- reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
528
- }
531
+ if (extracted === 0) {
532
+ reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
533
+ } else {
534
+ resolve2();
535
+ }
536
+ }).catch((err) => {
537
+ this.cleanupFile(zipPath);
538
+ reject(err);
539
+ });
529
540
  });
530
541
  });
531
542
  }
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 followRedirects from 'follow-redirects';\r\nconst { https } = followRedirects;\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\nimport { fileURLToPath } from \"url\";\r\nimport { dirname } from \"path\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\ninterface BinaryVersion {\r\n date_published: string;\r\n name: string;\r\n version: string;\r\n platforms: string[];\r\n download_url: string;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n private static readonly VERSION_URLS = {\r\n query: 'https://raw.githubusercontent.com/Dbcube/binaries/main/query-engines.json',\r\n schema: 'https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json',\r\n sqlite: 'https://raw.githubusercontent.com/Dbcube/binaries/main/sqlite-engines.json'\r\n };\r\n\r\n /**\r\n * Fetch latest version from GitHub\r\n */\r\n private static async fetchLatestVersion(prefix: 'query' | 'schema' | 'sqlite'): Promise<string> {\r\n const url = this.VERSION_URLS[prefix];\r\n\r\n return new Promise((resolve, reject) => {\r\n https.get(url, (response: IncomingMessage) => {\r\n let data = '';\r\n\r\n response.on('data', (chunk) => {\r\n data += chunk;\r\n });\r\n\r\n response.on('end', () => {\r\n try {\r\n const versions: BinaryVersion[] = JSON.parse(data);\r\n if (versions && versions.length > 0) {\r\n // Get the latest version (first in array)\r\n resolve(versions[0].version);\r\n } else {\r\n reject(new Error('No versions found'));\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n\r\n response.on('error', reject);\r\n }).on('error', reject);\r\n });\r\n }\r\n\r\n /**\r\n * Extract version from binary filename\r\n * Example: schema-engine-v1.0.0-windows-x64.exe -> v1.0.0\r\n */\r\n private static extractVersionFromFilename(filename: string): string | null {\r\n const match = filename.match(/-(v\\d+\\.\\d+\\.\\d+)-/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Get local version of installed binary\r\n */\r\n private static getLocalVersion(binDir: string, prefix: string): string | null {\r\n try {\r\n const files = fs.readdirSync(binDir);\r\n const binaryPattern = new RegExp(`^${prefix}-engine-v`);\r\n const binaryFile = files.find(f => binaryPattern.test(f));\r\n\r\n if (binaryFile) {\r\n return this.extractVersionFromFilename(binaryFile);\r\n }\r\n } catch (error) {\r\n // Directory doesn't exist or can't read\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Compare versions (returns true if remote is newer)\r\n */\r\n private static isNewerVersion(localVersion: string | null, remoteVersion: string): boolean {\r\n if (!localVersion) return true; // No local version, download\r\n\r\n // Remove 'v' prefix if exists\r\n const cleanLocal = localVersion.replace(/^v/, '');\r\n const cleanRemote = remoteVersion.replace(/^v/, '');\r\n\r\n const localParts = cleanLocal.split('.').map(Number);\r\n const remoteParts = cleanRemote.split('.').map(Number);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n if (remoteParts[i] > localParts[i]) return true;\r\n if (remoteParts[i] < localParts[i]) return false;\r\n }\r\n\r\n return false; // Versions are equal\r\n }\r\n\r\n /**\r\n * Delete old binary files\r\n */\r\n private static deleteOldBinary(binDir: string, prefix: string): void {\r\n try {\r\n const files = fs.readdirSync(binDir);\r\n const binaryPattern = new RegExp(`^${prefix}-engine-`);\r\n\r\n files.forEach(file => {\r\n if (binaryPattern.test(file)) {\r\n const filePath = path.join(binDir, file);\r\n try {\r\n fs.unlinkSync(filePath);\r\n console.log(`🗑️ Deleted old binary: ${file}`);\r\n } catch (err) {\r\n console.warn(`⚠️ Could not delete: ${file}`);\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n static get(prefix: string): BinaryType & { name: string; url: string; version: 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 // Note: This is a sync method, version will be \"latest\" placeholder\r\n // The actual version will be resolved during download\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 version: \"latest\",\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 version: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n /**\r\n * Get binary info with actual version from GitHub\r\n */\r\n static async getWithVersion(prefix: 'query' | 'schema' | 'sqlite'): Promise<BinaryType & { name: string; url: string; version: 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 // Fetch latest version from GitHub\r\n const version = await this.fetchLatestVersion(prefix);\r\n\r\n const baseName = `${prefix}-engine-${version}-${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-${version}-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n version,\r\n query_engine: binaryName,\r\n schema_engine: binaryName\r\n };\r\n }\r\n\r\n return {\r\n name: \"\",\r\n url: \"\",\r\n version: \"\",\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 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('Verificando versiones de binarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n const binariesToProcess: Array<{ prefix: 'query' | 'schema' | 'sqlite'; needsUpdate: boolean; localVersion: string | null; remoteVersion: string }> = [];\r\n\r\n // Check versions for all engines\r\n for (const prefix of ['query', 'schema', 'sqlite'] as const) {\r\n try {\r\n const localVersion = this.getLocalVersion(binDir, prefix);\r\n const remoteVersion = await this.fetchLatestVersion(prefix);\r\n const needsUpdate = this.isNewerVersion(localVersion, remoteVersion);\r\n\r\n binariesToProcess.push({\r\n prefix,\r\n needsUpdate,\r\n localVersion,\r\n remoteVersion\r\n });\r\n\r\n if (needsUpdate) {\r\n console.log(`\\n📦 ${prefix}-engine: ${localVersion || 'not installed'} → ${remoteVersion}`);\r\n } else if (localVersion) {\r\n console.log(`\\n✅ ${prefix}-engine: ${localVersion} (up to date)`);\r\n }\r\n } catch (error) {\r\n console.warn(`⚠️ Could not check version for ${prefix}-engine, will attempt download`);\r\n binariesToProcess.push({\r\n prefix,\r\n needsUpdate: true,\r\n localVersion: null,\r\n remoteVersion: 'latest'\r\n });\r\n }\r\n }\r\n\r\n const binariesToDownload = binariesToProcess.filter(b => b.needsUpdate);\r\n\r\n if (binariesToDownload.length === 0) {\r\n this.mainSpinner.succeed(chalk.green('All binaries are up to date'));\r\n return;\r\n }\r\n\r\n // Show update progress\r\n this.mainSpinner.text = chalk.blue(`Updating ${binariesToDownload.length} binary(ies)...`);\r\n\r\n try {\r\n // Download and update binaries in parallel. allSettled: si una\r\n // descarga falla las demás terminan igual y se reportan TODOS los\r\n // errores (Promise.all descartaba los resultados restantes).\r\n const results = await Promise.allSettled(binariesToDownload.map(async (binary) => {\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n\r\n while (attempt <= maxRetries) {\r\n try {\r\n // Get binary info with version\r\n const binaryInfo = await this.getWithVersion(binary.prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(`Platform or architecture not supported for ${binary.prefix}`);\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${binary.prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Delete old binary first\r\n this.deleteOldBinary(binDir, binary.prefix);\r\n\r\n // Download\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, binary.prefix);\r\n\r\n // Extract\r\n await this.extractBinary(tempZipPath, finalBinaryPath, binary.prefix);\r\n\r\n console.log(`✅ ${binary.prefix}-engine updated to ${binary.remoteVersion}`);\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\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 console.log(`🔄 Retrying ${binary.prefix}-engine (${attempt}/${maxRetries})...`);\r\n await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000));\r\n } else {\r\n throw new Error(`Error downloading ${binary.prefix}: ${errorMessage}`);\r\n }\r\n }\r\n }\r\n }));\r\n\r\n const failures = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected');\r\n if (failures.length > 0) {\r\n const messages = failures.map(f => f.reason instanceof Error ? f.reason.message : String(f.reason));\r\n throw new Error(messages.join(' | '));\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binaries updated successfully'));\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n this.mainSpinner.fail(chalk.red(`Error updating binaries: ${errorMessage}`));\r\n throw error;\r\n }\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.yellow(`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: 0 }, (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 // Resolver recién cuando el archivo está flushed a disco;\r\n // si no, extractBinary puede leer un ZIP incompleto\r\n file.end(() => 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 // Get __dirname equivalent for ESM\r\n const __filename = typeof import.meta !== 'undefined' && import.meta.url\r\n ? fileURLToPath(import.meta.url)\r\n : '';\r\n const __dirname = __filename ? dirname(__filename) : process.cwd();\r\n\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 }\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});"],"mappings":"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","names":["platform","arch","os","followRedirects","resolve","arch","platform","ora","chalk"]}
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\";\nimport { Arquitecture } from \"./Arquitecture\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport followRedirects from 'follow-redirects';\nconst { https } = followRedirects;\nimport * as unzipper from \"unzipper\";\nimport { IncomingMessage } from 'http';\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\n\ninterface DownloadProgress {\n downloaded: number;\n total: number;\n percentage: number;\n}\n\ninterface BinaryVersion {\n date_published: string;\n name: string;\n version: string;\n platforms: string[];\n download_url: string;\n}\n\nclass Downloader {\n private static mainSpinner: any = null;\n private static currentSpinner: any = null;\n private static readonly VERSION_URLS = {\n query: 'https://raw.githubusercontent.com/Dbcube/binaries/main/query-engines.json',\n schema: 'https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json'\n };\n\n /**\n * Fetch latest version from GitHub\n */\n private static async fetchLatestVersion(prefix: 'query' | 'schema'): Promise<string> {\n const url = this.VERSION_URLS[prefix];\n\n return new Promise((resolve, reject) => {\n https.get(url, (response: IncomingMessage) => {\n let data = '';\n\n response.on('data', (chunk) => {\n data += chunk;\n });\n\n response.on('end', () => {\n try {\n const versions: BinaryVersion[] = JSON.parse(data);\n if (versions && versions.length > 0) {\n // Get the latest version (first in array)\n resolve(versions[0].version);\n } else {\n reject(new Error('No versions found'));\n }\n } catch (error) {\n reject(error);\n }\n });\n\n response.on('error', reject);\n }).on('error', reject);\n });\n }\n\n /**\n * Extract version from binary filename\n * Example: schema-engine-v1.0.0-windows-x64.exe -> v1.0.0\n */\n private static extractVersionFromFilename(filename: string): string | null {\n const match = filename.match(/-(v\\d+\\.\\d+\\.\\d+)-/);\n return match ? match[1] : null;\n }\n\n /**\n * Get local version of installed binary\n */\n private static getLocalVersion(binDir: string, prefix: string): string | null {\n try {\n const files = fs.readdirSync(binDir);\n const binaryPattern = new RegExp(`^${prefix}-engine-v`);\n const binaryFile = files.find(f => binaryPattern.test(f));\n\n if (binaryFile) {\n return this.extractVersionFromFilename(binaryFile);\n }\n } catch (error) {\n // Directory doesn't exist or can't read\n }\n return null;\n }\n\n /**\n * Compare versions (returns true if remote is newer)\n */\n private static isNewerVersion(localVersion: string | null, remoteVersion: string): boolean {\n if (!localVersion) return true; // No local version, download\n\n // Remove 'v' prefix if exists\n const cleanLocal = localVersion.replace(/^v/, '');\n const cleanRemote = remoteVersion.replace(/^v/, '');\n\n const localParts = cleanLocal.split('.').map(Number);\n const remoteParts = cleanRemote.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n if (remoteParts[i] > localParts[i]) return true;\n if (remoteParts[i] < localParts[i]) return false;\n }\n\n return false; // Versions are equal\n }\n\n /**\n * Delete old binary files\n */\n private static deleteOldBinary(binDir: string, prefix: string): void {\n try {\n const files = fs.readdirSync(binDir);\n const binaryPattern = new RegExp(`^${prefix}-engine-`);\n\n files.forEach(file => {\n if (binaryPattern.test(file)) {\n const filePath = path.join(binDir, file);\n try {\n fs.unlinkSync(filePath);\n console.log(`🗑️ Deleted old binary: ${file}`);\n } catch (err) {\n console.warn(`⚠️ Could not delete: ${file}`);\n }\n }\n });\n } catch (error) {\n // Ignore errors\n }\n }\n\n static get(prefix: string): BinaryType & { name: string; url: string; version: string } {\n const arch = new Arquitecture();\n const platform = arch.getPlatform();\n const architecture = arch.getArchitecture();\n\n const platformMap: Record<string, string> = {\n windows: \"windows\",\n linux: \"linux\",\n darwin: \"macos\"\n };\n\n const archMap: Record<string, string> = {\n x86_64: \"x64\",\n aarch64: \"arm64\"\n };\n\n const plat = platformMap[platform];\n const archSuffix = archMap[architecture];\n\n if (plat && archSuffix) {\n // Note: This is a sync method, version will be \"latest\" placeholder\n // The actual version will be resolved during download\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\n\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\n return {\n name: binaryName,\n url,\n version: \"latest\",\n query_engine: binaryName,\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\n };\n }\n\n return {\n name: \"\",\n url: \"\",\n version: \"\",\n query_engine: \"\",\n schema_engine: \"\"\n };\n }\n\n /**\n * Get binary info with actual version from GitHub\n */\n static async getWithVersion(prefix: 'query' | 'schema'): Promise<BinaryType & { name: string; url: string; version: string }> {\n const arch = new Arquitecture();\n const platform = arch.getPlatform();\n const architecture = arch.getArchitecture();\n\n const platformMap: Record<string, string> = {\n windows: \"windows\",\n linux: \"linux\",\n darwin: \"macos\"\n };\n\n const archMap: Record<string, string> = {\n x86_64: \"x64\",\n aarch64: \"arm64\"\n };\n\n const plat = platformMap[platform];\n const archSuffix = archMap[architecture];\n\n if (plat && archSuffix) {\n // Fetch latest version from GitHub\n const version = await this.fetchLatestVersion(prefix);\n\n const baseName = `${prefix}-engine-${version}-${plat}-${archSuffix}`;\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\n\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-${version}-${plat}-${archSuffix}.zip`;\n return {\n name: binaryName,\n url,\n version,\n query_engine: binaryName,\n schema_engine: binaryName\n };\n }\n\n return {\n name: \"\",\n url: \"\",\n version: \"\",\n query_engine: \"\",\n schema_engine: \"\"\n };\n }\n\n static async download(targetDir?: string): Promise<void> {\n const binDir = targetDir || this.getDefaultBinDir();\n fs.mkdirSync(binDir, { recursive: true });\n\n // Initialize main spinner\n this.mainSpinner = ora({\n text: chalk.blue('Verificando versiones de binarios...'),\n spinner: 'dots12'\n }).start();\n\n const binariesToProcess: Array<{ prefix: 'query' | 'schema'; needsUpdate: boolean; localVersion: string | null; remoteVersion: string }> = [];\n\n // Check versions for all engines (sqlite-engine retirado: el config.db\n // interno ahora lo lee el query-engine)\n for (const prefix of ['query', 'schema'] as const) {\n try {\n const localVersion = this.getLocalVersion(binDir, prefix);\n const remoteVersion = await this.fetchLatestVersion(prefix);\n const needsUpdate = this.isNewerVersion(localVersion, remoteVersion);\n\n binariesToProcess.push({\n prefix,\n needsUpdate,\n localVersion,\n remoteVersion\n });\n\n if (needsUpdate) {\n console.log(`\\n📦 ${prefix}-engine: ${localVersion || 'not installed'} → ${remoteVersion}`);\n } else if (localVersion) {\n console.log(`\\n✅ ${prefix}-engine: ${localVersion} (up to date)`);\n }\n } catch (error) {\n console.warn(`⚠️ Could not check version for ${prefix}-engine, will attempt download`);\n binariesToProcess.push({\n prefix,\n needsUpdate: true,\n localVersion: null,\n remoteVersion: 'latest'\n });\n }\n }\n\n const binariesToDownload = binariesToProcess.filter(b => b.needsUpdate);\n\n if (binariesToDownload.length === 0) {\n this.mainSpinner.succeed(chalk.green('All binaries are up to date'));\n return;\n }\n\n // Show update progress\n this.mainSpinner.text = chalk.blue(`Updating ${binariesToDownload.length} binary(ies)...`);\n\n try {\n // Download and update binaries in parallel. allSettled: si una\n // descarga falla las demás terminan igual y se reportan TODOS los\n // errores (Promise.all descartaba los resultados restantes).\n const results = await Promise.allSettled(binariesToDownload.map(async (binary) => {\n const maxRetries = 3;\n let attempt = 0;\n\n while (attempt <= maxRetries) {\n try {\n // Get binary info with version\n const binaryInfo = await this.getWithVersion(binary.prefix);\n\n if (!binaryInfo.name || !binaryInfo.url) {\n throw new Error(`Platform or architecture not supported for ${binary.prefix}`);\n }\n\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${binary.prefix}-${Date.now()}.zip`);\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\n\n // Delete old binary first\n this.deleteOldBinary(binDir, binary.prefix);\n\n // Download\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, binary.prefix);\n\n // Extract\n await this.extractBinary(tempZipPath, finalBinaryPath, binary.prefix);\n\n console.log(`✅ ${binary.prefix}-engine updated to ${binary.remoteVersion}`);\n break;\n\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n if (attempt < maxRetries && (\n errorMessage.includes('ECONNRESET') ||\n errorMessage.includes('timeout') ||\n errorMessage.includes('ETIMEDOUT') ||\n errorMessage.includes('ENOTFOUND')\n )) {\n attempt++;\n console.log(`🔄 Retrying ${binary.prefix}-engine (${attempt}/${maxRetries})...`);\n await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000));\n } else {\n throw new Error(`Error downloading ${binary.prefix}: ${errorMessage}`);\n }\n }\n }\n }));\n\n const failures = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected');\n if (failures.length > 0) {\n const messages = failures.map(f => f.reason instanceof Error ? f.reason.message : String(f.reason));\n throw new Error(messages.join(' | '));\n }\n\n // Complete successfully\n this.mainSpinner.succeed(chalk.green('Binaries updated successfully'));\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.mainSpinner.fail(chalk.red(`Error updating binaries: ${errorMessage}`));\n throw error;\n }\n }\n\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\n const progressBar = this.createProgressBar(current, total);\n const statusEmojis = {\n downloading: '📥',\n extracting: '📦',\n completed: '✅',\n exists: '✅',\n retrying: '🔄'\n };\n\n const statusMessages = {\n downloading: chalk.blue('descargando'),\n extracting: chalk.yellow('extrayendo'),\n completed: chalk.green('completado'),\n exists: chalk.gray('existe'),\n retrying: chalk.yellow(`reintentando (${attempt}/${3})`)\n };\n\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\n const message = statusMessages[status as keyof typeof statusMessages] || status;\n\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\n }\n\n private static createProgressBar(current: number, total: number, width: number = 20): string {\n const filled = Math.round((current / total) * width);\n const empty = width - filled;\n const filledBar = chalk.green('█'.repeat(filled));\n const emptyBar = chalk.gray('░'.repeat(empty));\n const percentage = chalk.bold(`${current}/${total}`);\n return `[${filledBar}${emptyBar}] ${percentage}`;\n }\n\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = https.get(url, { timeout: 0 }, (response: IncomingMessage) => {\n if (response.statusCode === 302 || response.statusCode === 301) {\n const redirectUrl = response.headers.location;\n if (redirectUrl) {\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\n }\n }\n\n if (response.statusCode !== 200) {\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\n return;\n }\n\n const file = fs.createWriteStream(outputPath);\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n file.write(chunk);\n\n if (totalBytes > 0) {\n const progress: DownloadProgress = {\n downloaded: downloadedBytes,\n total: totalBytes,\n percentage: (downloadedBytes / totalBytes) * 100\n };\n this.updateDownloadProgress(prefix, progress);\n }\n });\n\n response.on('end', () => {\n // Resolver recién cuando el archivo está flushed a disco;\n // si no, extractBinary puede leer un ZIP incompleto\n file.end(() => resolve());\n });\n\n response.on('error', (err) => {\n file.close();\n this.cleanupFile(outputPath);\n reject(err);\n });\n\n file.on('error', (err) => {\n file.close();\n this.cleanupFile(outputPath);\n reject(err);\n });\n });\n\n request.on('error', reject);\n request.on('timeout', () => {\n request.destroy();\n reject(new Error(`Timeout descargando ${prefix}`));\n });\n });\n }\n\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\n const percentage = progress.percentage.toFixed(1);\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\n const total = (progress.total / 1024 / 1024).toFixed(1);\n\n // Create a mini progress bar for the binary\n const barWidth = 15;\n const filled = Math.round((progress.percentage / 100) * barWidth);\n const empty = barWidth - filled;\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\n }\n\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Los ZIPs traen el binario principal (primer archivo) y, desde\n // v1.1.0, también la cdylib embebida (query-engine-embedded-*.dll/\n // .so/.dylib). El binario va a outputPath; el resto conserva su\n // nombre junto a él.\n const outDir = path.dirname(outputPath);\n let extracted = 0;\n const pending: Promise<void>[] = [];\n\n fs.createReadStream(zipPath)\n .pipe(unzipper.Parse())\n .on('entry', (entry: unzipper.Entry) => {\n if (entry.type !== 'File') {\n entry.autodrain();\n return;\n }\n const isMain = extracted === 0;\n extracted++;\n const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));\n\n pending.push(new Promise<void>((res, rej) => {\n const writeStream = fs.createWriteStream(target);\n entry.pipe(writeStream);\n writeStream.on('finish', () => {\n if (process.platform !== 'win32') {\n try { fs.chmodSync(target, 0o755); } catch { /* fs sin permisos */ }\n }\n res();\n });\n writeStream.on('error', rej);\n }));\n })\n .on('error', (err: Error) => {\n this.cleanupFile(zipPath);\n reject(err);\n })\n .on('close', () => {\n Promise.all(pending)\n .then(() => {\n this.cleanupFile(zipPath);\n if (extracted === 0) {\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\n } else {\n resolve();\n }\n })\n .catch((err) => {\n this.cleanupFile(zipPath);\n reject(err);\n });\n });\n });\n }\n\n private static cleanupFile(filePath: string): void {\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n private static getDefaultBinDir(): string {\n // Get __dirname equivalent for ESM\n const __filename = typeof import.meta !== 'undefined' && import.meta.url\n ? fileURLToPath(import.meta.url)\n : '';\n const __dirname = __filename ? dirname(__filename) : process.cwd();\n\n // Try to find a suitable directory for binaries in order of preference\n const possibleDirs = [\n path.resolve(process.cwd(), '.dbcube', 'bin'),\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\n path.resolve(__dirname, '..', 'bin'),\n ];\n\n // Use the first one that can be created or already exists\n for (const dir of possibleDirs) {\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n // Test write permissions\n const testFile = path.join(dir, '.test');\n fs.writeFileSync(testFile, 'test');\n fs.unlinkSync(testFile);\n return dir;\n } catch {\n // Try next directory\n continue;\n }\n }\n\n // Fallback to .dbcube directory in temp\n const tempDir = path.join(os.tmpdir(), '.dbcube', 'bin');\n fs.mkdirSync(tempDir, { recursive: true });\n return tempDir;\n }\n}\n\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 }\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});"],"mappings":"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","names":["platform","arch","os","followRedirects","resolve","arch","platform","ora","chalk"]}
package/dist/bin.js CHANGED
@@ -131,15 +131,14 @@ import * as unzipper from "unzipper";
131
131
  import ora from "ora";
132
132
  import chalk from "chalk";
133
133
  import { fileURLToPath } from "url";
134
- import { dirname } from "path";
134
+ import { dirname as dirname2 } from "path";
135
135
  var { https } = followRedirects;
136
136
  var Downloader = class {
137
137
  static mainSpinner = null;
138
138
  static currentSpinner = null;
139
139
  static VERSION_URLS = {
140
140
  query: "https://raw.githubusercontent.com/Dbcube/binaries/main/query-engines.json",
141
- schema: "https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json",
142
- sqlite: "https://raw.githubusercontent.com/Dbcube/binaries/main/sqlite-engines.json"
141
+ schema: "https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json"
143
142
  };
144
143
  /**
145
144
  * Fetch latest version from GitHub
@@ -309,7 +308,7 @@ var Downloader = class {
309
308
  spinner: "dots12"
310
309
  }).start();
311
310
  const binariesToProcess = [];
312
- for (const prefix of ["query", "schema", "sqlite"]) {
311
+ for (const prefix of ["query", "schema"]) {
313
312
  try {
314
313
  const localVersion = this.getLocalVersion(binDir, prefix);
315
314
  const remoteVersion = await this.fetchLatestVersion(prefix);
@@ -474,34 +473,46 @@ var Downloader = class {
474
473
  }
475
474
  static extractBinary(zipPath, outputPath, prefix) {
476
475
  return new Promise((resolve2, reject) => {
477
- let extracted = false;
476
+ const outDir = path.dirname(outputPath);
477
+ let extracted = 0;
478
+ const pending = [];
478
479
  fs.createReadStream(zipPath).pipe(unzipper.Parse()).on("entry", (entry) => {
479
- if (entry.type === "File" && !extracted) {
480
- extracted = true;
481
- const writeStream = fs.createWriteStream(outputPath);
480
+ if (entry.type !== "File") {
481
+ entry.autodrain();
482
+ return;
483
+ }
484
+ const isMain = extracted === 0;
485
+ extracted++;
486
+ const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));
487
+ pending.push(new Promise((res, rej) => {
488
+ const writeStream = fs.createWriteStream(target);
482
489
  entry.pipe(writeStream);
483
490
  writeStream.on("finish", () => {
484
491
  if (process.platform !== "win32") {
485
- fs.chmodSync(outputPath, 493);
492
+ try {
493
+ fs.chmodSync(target, 493);
494
+ } catch {
495
+ }
486
496
  }
487
- this.cleanupFile(zipPath);
488
- resolve2();
497
+ res();
489
498
  });
490
- writeStream.on("error", (err) => {
491
- this.cleanupFile(zipPath);
492
- reject(err);
493
- });
494
- } else {
495
- entry.autodrain();
496
- }
499
+ writeStream.on("error", rej);
500
+ }));
497
501
  }).on("error", (err) => {
498
502
  this.cleanupFile(zipPath);
499
503
  reject(err);
500
504
  }).on("close", () => {
501
- if (!extracted) {
505
+ Promise.all(pending).then(() => {
502
506
  this.cleanupFile(zipPath);
503
- reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
504
- }
507
+ if (extracted === 0) {
508
+ reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
509
+ } else {
510
+ resolve2();
511
+ }
512
+ }).catch((err) => {
513
+ this.cleanupFile(zipPath);
514
+ reject(err);
515
+ });
505
516
  });
506
517
  });
507
518
  }
@@ -515,7 +526,7 @@ var Downloader = class {
515
526
  }
516
527
  static getDefaultBinDir() {
517
528
  const __filename = typeof import.meta !== "undefined" && import.meta.url ? fileURLToPath(import.meta.url) : "";
518
- const __dirname = __filename ? dirname(__filename) : process.cwd();
529
+ const __dirname = __filename ? dirname2(__filename) : process.cwd();
519
530
  const possibleDirs = [
520
531
  path.resolve(process.cwd(), ".dbcube", "bin"),
521
532
  path.resolve(process.cwd(), "node_modules", ".dbcube", "bin"),
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 followRedirects from 'follow-redirects';\r\nconst { https } = followRedirects;\r\nimport * as unzipper from \"unzipper\";\r\nimport { IncomingMessage } from 'http';\r\nimport ora from \"ora\";\r\nimport chalk from \"chalk\";\r\nimport { fileURLToPath } from \"url\";\r\nimport { dirname } from \"path\";\r\n\r\ninterface DownloadProgress {\r\n downloaded: number;\r\n total: number;\r\n percentage: number;\r\n}\r\n\r\ninterface BinaryVersion {\r\n date_published: string;\r\n name: string;\r\n version: string;\r\n platforms: string[];\r\n download_url: string;\r\n}\r\n\r\nclass Downloader {\r\n private static mainSpinner: any = null;\r\n private static currentSpinner: any = null;\r\n private static readonly VERSION_URLS = {\r\n query: 'https://raw.githubusercontent.com/Dbcube/binaries/main/query-engines.json',\r\n schema: 'https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json',\r\n sqlite: 'https://raw.githubusercontent.com/Dbcube/binaries/main/sqlite-engines.json'\r\n };\r\n\r\n /**\r\n * Fetch latest version from GitHub\r\n */\r\n private static async fetchLatestVersion(prefix: 'query' | 'schema' | 'sqlite'): Promise<string> {\r\n const url = this.VERSION_URLS[prefix];\r\n\r\n return new Promise((resolve, reject) => {\r\n https.get(url, (response: IncomingMessage) => {\r\n let data = '';\r\n\r\n response.on('data', (chunk) => {\r\n data += chunk;\r\n });\r\n\r\n response.on('end', () => {\r\n try {\r\n const versions: BinaryVersion[] = JSON.parse(data);\r\n if (versions && versions.length > 0) {\r\n // Get the latest version (first in array)\r\n resolve(versions[0].version);\r\n } else {\r\n reject(new Error('No versions found'));\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n\r\n response.on('error', reject);\r\n }).on('error', reject);\r\n });\r\n }\r\n\r\n /**\r\n * Extract version from binary filename\r\n * Example: schema-engine-v1.0.0-windows-x64.exe -> v1.0.0\r\n */\r\n private static extractVersionFromFilename(filename: string): string | null {\r\n const match = filename.match(/-(v\\d+\\.\\d+\\.\\d+)-/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Get local version of installed binary\r\n */\r\n private static getLocalVersion(binDir: string, prefix: string): string | null {\r\n try {\r\n const files = fs.readdirSync(binDir);\r\n const binaryPattern = new RegExp(`^${prefix}-engine-v`);\r\n const binaryFile = files.find(f => binaryPattern.test(f));\r\n\r\n if (binaryFile) {\r\n return this.extractVersionFromFilename(binaryFile);\r\n }\r\n } catch (error) {\r\n // Directory doesn't exist or can't read\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Compare versions (returns true if remote is newer)\r\n */\r\n private static isNewerVersion(localVersion: string | null, remoteVersion: string): boolean {\r\n if (!localVersion) return true; // No local version, download\r\n\r\n // Remove 'v' prefix if exists\r\n const cleanLocal = localVersion.replace(/^v/, '');\r\n const cleanRemote = remoteVersion.replace(/^v/, '');\r\n\r\n const localParts = cleanLocal.split('.').map(Number);\r\n const remoteParts = cleanRemote.split('.').map(Number);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n if (remoteParts[i] > localParts[i]) return true;\r\n if (remoteParts[i] < localParts[i]) return false;\r\n }\r\n\r\n return false; // Versions are equal\r\n }\r\n\r\n /**\r\n * Delete old binary files\r\n */\r\n private static deleteOldBinary(binDir: string, prefix: string): void {\r\n try {\r\n const files = fs.readdirSync(binDir);\r\n const binaryPattern = new RegExp(`^${prefix}-engine-`);\r\n\r\n files.forEach(file => {\r\n if (binaryPattern.test(file)) {\r\n const filePath = path.join(binDir, file);\r\n try {\r\n fs.unlinkSync(filePath);\r\n console.log(`🗑️ Deleted old binary: ${file}`);\r\n } catch (err) {\r\n console.warn(`⚠️ Could not delete: ${file}`);\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n static get(prefix: string): BinaryType & { name: string; url: string; version: 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 // Note: This is a sync method, version will be \"latest\" placeholder\r\n // The actual version will be resolved during download\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 version: \"latest\",\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 version: \"\",\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n\r\n /**\r\n * Get binary info with actual version from GitHub\r\n */\r\n static async getWithVersion(prefix: 'query' | 'schema' | 'sqlite'): Promise<BinaryType & { name: string; url: string; version: 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 // Fetch latest version from GitHub\r\n const version = await this.fetchLatestVersion(prefix);\r\n\r\n const baseName = `${prefix}-engine-${version}-${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-${version}-${plat}-${archSuffix}.zip`;\r\n return {\r\n name: binaryName,\r\n url,\r\n version,\r\n query_engine: binaryName,\r\n schema_engine: binaryName\r\n };\r\n }\r\n\r\n return {\r\n name: \"\",\r\n url: \"\",\r\n version: \"\",\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 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('Verificando versiones de binarios...'),\r\n spinner: 'dots12'\r\n }).start();\r\n\r\n const binariesToProcess: Array<{ prefix: 'query' | 'schema' | 'sqlite'; needsUpdate: boolean; localVersion: string | null; remoteVersion: string }> = [];\r\n\r\n // Check versions for all engines\r\n for (const prefix of ['query', 'schema', 'sqlite'] as const) {\r\n try {\r\n const localVersion = this.getLocalVersion(binDir, prefix);\r\n const remoteVersion = await this.fetchLatestVersion(prefix);\r\n const needsUpdate = this.isNewerVersion(localVersion, remoteVersion);\r\n\r\n binariesToProcess.push({\r\n prefix,\r\n needsUpdate,\r\n localVersion,\r\n remoteVersion\r\n });\r\n\r\n if (needsUpdate) {\r\n console.log(`\\n📦 ${prefix}-engine: ${localVersion || 'not installed'} → ${remoteVersion}`);\r\n } else if (localVersion) {\r\n console.log(`\\n✅ ${prefix}-engine: ${localVersion} (up to date)`);\r\n }\r\n } catch (error) {\r\n console.warn(`⚠️ Could not check version for ${prefix}-engine, will attempt download`);\r\n binariesToProcess.push({\r\n prefix,\r\n needsUpdate: true,\r\n localVersion: null,\r\n remoteVersion: 'latest'\r\n });\r\n }\r\n }\r\n\r\n const binariesToDownload = binariesToProcess.filter(b => b.needsUpdate);\r\n\r\n if (binariesToDownload.length === 0) {\r\n this.mainSpinner.succeed(chalk.green('All binaries are up to date'));\r\n return;\r\n }\r\n\r\n // Show update progress\r\n this.mainSpinner.text = chalk.blue(`Updating ${binariesToDownload.length} binary(ies)...`);\r\n\r\n try {\r\n // Download and update binaries in parallel. allSettled: si una\r\n // descarga falla las demás terminan igual y se reportan TODOS los\r\n // errores (Promise.all descartaba los resultados restantes).\r\n const results = await Promise.allSettled(binariesToDownload.map(async (binary) => {\r\n const maxRetries = 3;\r\n let attempt = 0;\r\n\r\n while (attempt <= maxRetries) {\r\n try {\r\n // Get binary info with version\r\n const binaryInfo = await this.getWithVersion(binary.prefix);\r\n\r\n if (!binaryInfo.name || !binaryInfo.url) {\r\n throw new Error(`Platform or architecture not supported for ${binary.prefix}`);\r\n }\r\n\r\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${binary.prefix}-${Date.now()}.zip`);\r\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\r\n\r\n // Delete old binary first\r\n this.deleteOldBinary(binDir, binary.prefix);\r\n\r\n // Download\r\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, binary.prefix);\r\n\r\n // Extract\r\n await this.extractBinary(tempZipPath, finalBinaryPath, binary.prefix);\r\n\r\n console.log(`✅ ${binary.prefix}-engine updated to ${binary.remoteVersion}`);\r\n break;\r\n\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\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 console.log(`🔄 Retrying ${binary.prefix}-engine (${attempt}/${maxRetries})...`);\r\n await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000));\r\n } else {\r\n throw new Error(`Error downloading ${binary.prefix}: ${errorMessage}`);\r\n }\r\n }\r\n }\r\n }));\r\n\r\n const failures = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected');\r\n if (failures.length > 0) {\r\n const messages = failures.map(f => f.reason instanceof Error ? f.reason.message : String(f.reason));\r\n throw new Error(messages.join(' | '));\r\n }\r\n\r\n // Complete successfully\r\n this.mainSpinner.succeed(chalk.green('Binaries updated successfully'));\r\n } catch (error: unknown) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n this.mainSpinner.fail(chalk.red(`Error updating binaries: ${errorMessage}`));\r\n throw error;\r\n }\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.yellow(`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: 0 }, (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 // Resolver recién cuando el archivo está flushed a disco;\r\n // si no, extractBinary puede leer un ZIP incompleto\r\n file.end(() => 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 // Get __dirname equivalent for ESM\r\n const __filename = typeof import.meta !== 'undefined' && import.meta.url\r\n ? fileURLToPath(import.meta.url)\r\n : '';\r\n const __dirname = __filename ? dirname(__filename) : process.cwd();\r\n\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 }\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});"],"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,OAAO,qBAAqB;AAE5B,YAAY,cAAc;AAE1B,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AANxB,IAAM,EAAE,MAAM,IAAI;AAsBlB,IAAM,aAAN,MAAiB;AAAA,EACb,OAAe,cAAmB;AAAA,EAClC,OAAe,iBAAsB;AAAA,EACrC,OAAwB,eAAe;AAAA,IACnC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,mBAAmB,QAAwD;AAC5F,UAAM,MAAM,KAAK,aAAa,MAAM;AAEpC,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACpC,YAAM,IAAI,KAAK,CAAC,aAA8B;AAC1C,YAAI,OAAO;AAEX,iBAAS,GAAG,QAAQ,CAAC,UAAU;AAC3B,kBAAQ;AAAA,QACZ,CAAC;AAED,iBAAS,GAAG,OAAO,MAAM;AACrB,cAAI;AACA,kBAAM,WAA4B,KAAK,MAAM,IAAI;AACjD,gBAAI,YAAY,SAAS,SAAS,GAAG;AAEjC,cAAAA,SAAQ,SAAS,CAAC,EAAE,OAAO;AAAA,YAC/B,OAAO;AACH,qBAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,YACzC;AAAA,UACJ,SAAS,OAAO;AACZ,mBAAO,KAAK;AAAA,UAChB;AAAA,QACJ,CAAC;AAED,iBAAS,GAAG,SAAS,MAAM;AAAA,MAC/B,CAAC,EAAE,GAAG,SAAS,MAAM;AAAA,IACzB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,2BAA2B,UAAiC;AACvE,UAAM,QAAQ,SAAS,MAAM,oBAAoB;AACjD,WAAO,QAAQ,MAAM,CAAC,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,gBAAgB,QAAgB,QAA+B;AAC1E,QAAI;AACA,YAAM,QAAW,eAAY,MAAM;AACnC,YAAM,gBAAgB,IAAI,OAAO,IAAI,MAAM,WAAW;AACtD,YAAM,aAAa,MAAM,KAAK,OAAK,cAAc,KAAK,CAAC,CAAC;AAExD,UAAI,YAAY;AACZ,eAAO,KAAK,2BAA2B,UAAU;AAAA,MACrD;AAAA,IACJ,SAAS,OAAO;AAAA,IAEhB;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,eAAe,cAA6B,eAAgC;AACvF,QAAI,CAAC,aAAc,QAAO;AAG1B,UAAM,aAAa,aAAa,QAAQ,MAAM,EAAE;AAChD,UAAM,cAAc,cAAc,QAAQ,MAAM,EAAE;AAElD,UAAM,aAAa,WAAW,MAAM,GAAG,EAAE,IAAI,MAAM;AACnD,UAAM,cAAc,YAAY,MAAM,GAAG,EAAE,IAAI,MAAM;AAErD,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAI,YAAY,CAAC,IAAI,WAAW,CAAC,EAAG,QAAO;AAC3C,UAAI,YAAY,CAAC,IAAI,WAAW,CAAC,EAAG,QAAO;AAAA,IAC/C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,gBAAgB,QAAgB,QAAsB;AACjE,QAAI;AACA,YAAM,QAAW,eAAY,MAAM;AACnC,YAAM,gBAAgB,IAAI,OAAO,IAAI,MAAM,UAAU;AAErD,YAAM,QAAQ,UAAQ;AAClB,YAAI,cAAc,KAAK,IAAI,GAAG;AAC1B,gBAAM,WAAgB,UAAK,QAAQ,IAAI;AACvC,cAAI;AACA,YAAG,cAAW,QAAQ;AACtB,oBAAQ,IAAI,wCAA4B,IAAI,EAAE;AAAA,UAClD,SAAS,KAAK;AACV,oBAAQ,KAAK,mCAAyB,IAAI,EAAE;AAAA,UAChD;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAAA,EAEA,OAAO,IAAI,QAA6E;AACpF,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;AAGpB,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,SAAS;AAAA,QACT,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,SAAS;AAAA,MACT,cAAc;AAAA,MACd,eAAe;AAAA,IACnB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,eAAe,QAA6G;AACrI,UAAMD,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;AAEpB,YAAM,UAAU,MAAM,KAAK,mBAAmB,MAAM;AAEpD,YAAM,WAAW,GAAG,MAAM,WAAW,OAAO,IAAI,IAAI,IAAI,UAAU;AAClE,YAAM,aAAaA,cAAa,YAAY,GAAG,QAAQ,SAAS;AAEhE,YAAM,MAAM,wDAAwD,MAAM,WAAW,MAAM,WAAW,OAAO,IAAI,IAAI,IAAI,UAAU;AACnI,aAAO;AAAA,QACH,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,eAAe;AAAA,MACnB;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,eAAe;AAAA,IACnB;AAAA,EACJ;AAAA,EAEA,aAAa,SAAS,WAAmC;AACrD,UAAM,SAAS,aAAa,KAAK,iBAAiB;AAClD,IAAG,aAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAGxC,SAAK,cAAc,IAAI;AAAA,MACnB,MAAM,MAAM,KAAK,sCAAsC;AAAA,MACvD,SAAS;AAAA,IACb,CAAC,EAAE,MAAM;AAET,UAAM,oBAAgJ,CAAC;AAGvJ,eAAW,UAAU,CAAC,SAAS,UAAU,QAAQ,GAAY;AACzD,UAAI;AACA,cAAM,eAAe,KAAK,gBAAgB,QAAQ,MAAM;AACxD,cAAM,gBAAgB,MAAM,KAAK,mBAAmB,MAAM;AAC1D,cAAM,cAAc,KAAK,eAAe,cAAc,aAAa;AAEnE,0BAAkB,KAAK;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ,CAAC;AAED,YAAI,aAAa;AACb,kBAAQ,IAAI;AAAA,YAAQ,MAAM,YAAY,gBAAgB,eAAe,WAAM,aAAa,EAAE;AAAA,QAC9F,WAAW,cAAc;AACrB,kBAAQ,IAAI;AAAA,SAAO,MAAM,YAAY,YAAY,eAAe;AAAA,QACpE;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,KAAK,6CAAmC,MAAM,gCAAgC;AACtF,0BAAkB,KAAK;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,UACb,cAAc;AAAA,UACd,eAAe;AAAA,QACnB,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,UAAM,qBAAqB,kBAAkB,OAAO,OAAK,EAAE,WAAW;AAEtE,QAAI,mBAAmB,WAAW,GAAG;AACjC,WAAK,YAAY,QAAQ,MAAM,MAAM,6BAA6B,CAAC;AACnE;AAAA,IACJ;AAGA,SAAK,YAAY,OAAO,MAAM,KAAK,YAAY,mBAAmB,MAAM,iBAAiB;AAEzF,QAAI;AAIA,YAAM,UAAU,MAAM,QAAQ,WAAW,mBAAmB,IAAI,OAAO,WAAW;AAC9E,cAAM,aAAa;AACnB,YAAI,UAAU;AAEd,eAAO,WAAW,YAAY;AAC1B,cAAI;AAEA,kBAAM,aAAa,MAAM,KAAK,eAAe,OAAO,MAAM;AAE1D,gBAAI,CAAC,WAAW,QAAQ,CAAC,WAAW,KAAK;AACrC,oBAAM,IAAI,MAAM,8CAA8C,OAAO,MAAM,EAAE;AAAA,YACjF;AAEA,kBAAM,cAAmB,UAAQ,WAAO,GAAG,UAAU,OAAO,MAAM,IAAI,KAAK,IAAI,CAAC,MAAM;AACtF,kBAAM,kBAAuB,UAAK,QAAQ,WAAW,IAAI;AAGzD,iBAAK,gBAAgB,QAAQ,OAAO,MAAM;AAG1C,kBAAM,KAAK,yBAAyB,WAAW,KAAK,aAAa,OAAO,MAAM;AAG9E,kBAAM,KAAK,cAAc,aAAa,iBAAiB,OAAO,MAAM;AAEpE,oBAAQ,IAAI,UAAK,OAAO,MAAM,sBAAsB,OAAO,aAAa,EAAE;AAC1E;AAAA,UAEJ,SAAS,OAAgB;AACrB,kBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAE9D,gBAAI,UAAU,eACV,aAAa,SAAS,YAAY,KAClC,aAAa,SAAS,SAAS,KAC/B,aAAa,SAAS,WAAW,KACjC,aAAa,SAAS,WAAW,IAClC;AACC;AACA,sBAAQ,IAAI,sBAAe,OAAO,MAAM,YAAY,OAAO,IAAI,UAAU,MAAM;AAC/E,oBAAM,IAAI,QAAQ,CAAAF,aAAW,WAAWA,UAAS,MAAO,KAAK,OAAO,IAAI,GAAI,CAAC;AAAA,YACjF,OAAO;AACH,oBAAM,IAAI,MAAM,qBAAqB,OAAO,MAAM,KAAK,YAAY,EAAE;AAAA,YACzE;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC,CAAC;AAEF,YAAM,WAAW,QAAQ,OAAO,CAAC,MAAkC,EAAE,WAAW,UAAU;AAC1F,UAAI,SAAS,SAAS,GAAG;AACrB,cAAM,WAAW,SAAS,IAAI,OAAK,EAAE,kBAAkB,QAAQ,EAAE,OAAO,UAAU,OAAO,EAAE,MAAM,CAAC;AAClG,cAAM,IAAI,MAAM,SAAS,KAAK,KAAK,CAAC;AAAA,MACxC;AAGA,WAAK,YAAY,QAAQ,MAAM,MAAM,+BAA+B,CAAC;AAAA,IACzE,SAAS,OAAgB;AACrB,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,WAAK,YAAY,KAAK,MAAM,IAAI,4BAA4B,YAAY,EAAE,CAAC;AAC3E,YAAM;AAAA,IACV;AAAA,EACJ;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,EAAE,GAAG,CAAC,aAA8B;AAC1E,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;AAGrB,eAAK,IAAI,MAAMA,SAAQ,CAAC;AAAA,QAC5B,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,aAAa,OAAO,gBAAgB,eAAe,YAAY,MAC/D,cAAc,YAAY,GAAG,IAC7B;AACN,UAAM,YAAY,aAAa,QAAQ,UAAU,IAAI,QAAQ,IAAI;AAGjE,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;;;AC7hBA,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;AAAA,MACxD;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;AACjC,CAAC;","names":["platform","arch","os","resolve","arch","platform"]}
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\";\nimport { Arquitecture } from \"./Arquitecture\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport followRedirects from 'follow-redirects';\nconst { https } = followRedirects;\nimport * as unzipper from \"unzipper\";\nimport { IncomingMessage } from 'http';\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\n\ninterface DownloadProgress {\n downloaded: number;\n total: number;\n percentage: number;\n}\n\ninterface BinaryVersion {\n date_published: string;\n name: string;\n version: string;\n platforms: string[];\n download_url: string;\n}\n\nclass Downloader {\n private static mainSpinner: any = null;\n private static currentSpinner: any = null;\n private static readonly VERSION_URLS = {\n query: 'https://raw.githubusercontent.com/Dbcube/binaries/main/query-engines.json',\n schema: 'https://raw.githubusercontent.com/Dbcube/binaries/main/schema-engines.json'\n };\n\n /**\n * Fetch latest version from GitHub\n */\n private static async fetchLatestVersion(prefix: 'query' | 'schema'): Promise<string> {\n const url = this.VERSION_URLS[prefix];\n\n return new Promise((resolve, reject) => {\n https.get(url, (response: IncomingMessage) => {\n let data = '';\n\n response.on('data', (chunk) => {\n data += chunk;\n });\n\n response.on('end', () => {\n try {\n const versions: BinaryVersion[] = JSON.parse(data);\n if (versions && versions.length > 0) {\n // Get the latest version (first in array)\n resolve(versions[0].version);\n } else {\n reject(new Error('No versions found'));\n }\n } catch (error) {\n reject(error);\n }\n });\n\n response.on('error', reject);\n }).on('error', reject);\n });\n }\n\n /**\n * Extract version from binary filename\n * Example: schema-engine-v1.0.0-windows-x64.exe -> v1.0.0\n */\n private static extractVersionFromFilename(filename: string): string | null {\n const match = filename.match(/-(v\\d+\\.\\d+\\.\\d+)-/);\n return match ? match[1] : null;\n }\n\n /**\n * Get local version of installed binary\n */\n private static getLocalVersion(binDir: string, prefix: string): string | null {\n try {\n const files = fs.readdirSync(binDir);\n const binaryPattern = new RegExp(`^${prefix}-engine-v`);\n const binaryFile = files.find(f => binaryPattern.test(f));\n\n if (binaryFile) {\n return this.extractVersionFromFilename(binaryFile);\n }\n } catch (error) {\n // Directory doesn't exist or can't read\n }\n return null;\n }\n\n /**\n * Compare versions (returns true if remote is newer)\n */\n private static isNewerVersion(localVersion: string | null, remoteVersion: string): boolean {\n if (!localVersion) return true; // No local version, download\n\n // Remove 'v' prefix if exists\n const cleanLocal = localVersion.replace(/^v/, '');\n const cleanRemote = remoteVersion.replace(/^v/, '');\n\n const localParts = cleanLocal.split('.').map(Number);\n const remoteParts = cleanRemote.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n if (remoteParts[i] > localParts[i]) return true;\n if (remoteParts[i] < localParts[i]) return false;\n }\n\n return false; // Versions are equal\n }\n\n /**\n * Delete old binary files\n */\n private static deleteOldBinary(binDir: string, prefix: string): void {\n try {\n const files = fs.readdirSync(binDir);\n const binaryPattern = new RegExp(`^${prefix}-engine-`);\n\n files.forEach(file => {\n if (binaryPattern.test(file)) {\n const filePath = path.join(binDir, file);\n try {\n fs.unlinkSync(filePath);\n console.log(`🗑️ Deleted old binary: ${file}`);\n } catch (err) {\n console.warn(`⚠️ Could not delete: ${file}`);\n }\n }\n });\n } catch (error) {\n // Ignore errors\n }\n }\n\n static get(prefix: string): BinaryType & { name: string; url: string; version: string } {\n const arch = new Arquitecture();\n const platform = arch.getPlatform();\n const architecture = arch.getArchitecture();\n\n const platformMap: Record<string, string> = {\n windows: \"windows\",\n linux: \"linux\",\n darwin: \"macos\"\n };\n\n const archMap: Record<string, string> = {\n x86_64: \"x64\",\n aarch64: \"arm64\"\n };\n\n const plat = platformMap[platform];\n const archSuffix = archMap[architecture];\n\n if (plat && archSuffix) {\n // Note: This is a sync method, version will be \"latest\" placeholder\n // The actual version will be resolved during download\n const baseName = `${prefix}-engine-${plat}-${archSuffix}`;\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\n\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-latest-${plat}-${archSuffix}.zip`;\n return {\n name: binaryName,\n url,\n version: \"latest\",\n query_engine: binaryName,\n schema_engine: `${prefix}-engine-${plat}-${archSuffix}${platform === \"windows\" ? \".exe\" : \"\"}`\n };\n }\n\n return {\n name: \"\",\n url: \"\",\n version: \"\",\n query_engine: \"\",\n schema_engine: \"\"\n };\n }\n\n /**\n * Get binary info with actual version from GitHub\n */\n static async getWithVersion(prefix: 'query' | 'schema'): Promise<BinaryType & { name: string; url: string; version: string }> {\n const arch = new Arquitecture();\n const platform = arch.getPlatform();\n const architecture = arch.getArchitecture();\n\n const platformMap: Record<string, string> = {\n windows: \"windows\",\n linux: \"linux\",\n darwin: \"macos\"\n };\n\n const archMap: Record<string, string> = {\n x86_64: \"x64\",\n aarch64: \"arm64\"\n };\n\n const plat = platformMap[platform];\n const archSuffix = archMap[architecture];\n\n if (plat && archSuffix) {\n // Fetch latest version from GitHub\n const version = await this.fetchLatestVersion(prefix);\n\n const baseName = `${prefix}-engine-${version}-${plat}-${archSuffix}`;\n const binaryName = platform === \"windows\" ? `${baseName}.exe` : baseName;\n\n const url = `https://github.com/Dbcube/binaries/releases/download/${prefix}-engine/${prefix}-engine-${version}-${plat}-${archSuffix}.zip`;\n return {\n name: binaryName,\n url,\n version,\n query_engine: binaryName,\n schema_engine: binaryName\n };\n }\n\n return {\n name: \"\",\n url: \"\",\n version: \"\",\n query_engine: \"\",\n schema_engine: \"\"\n };\n }\n\n static async download(targetDir?: string): Promise<void> {\n const binDir = targetDir || this.getDefaultBinDir();\n fs.mkdirSync(binDir, { recursive: true });\n\n // Initialize main spinner\n this.mainSpinner = ora({\n text: chalk.blue('Verificando versiones de binarios...'),\n spinner: 'dots12'\n }).start();\n\n const binariesToProcess: Array<{ prefix: 'query' | 'schema'; needsUpdate: boolean; localVersion: string | null; remoteVersion: string }> = [];\n\n // Check versions for all engines (sqlite-engine retirado: el config.db\n // interno ahora lo lee el query-engine)\n for (const prefix of ['query', 'schema'] as const) {\n try {\n const localVersion = this.getLocalVersion(binDir, prefix);\n const remoteVersion = await this.fetchLatestVersion(prefix);\n const needsUpdate = this.isNewerVersion(localVersion, remoteVersion);\n\n binariesToProcess.push({\n prefix,\n needsUpdate,\n localVersion,\n remoteVersion\n });\n\n if (needsUpdate) {\n console.log(`\\n📦 ${prefix}-engine: ${localVersion || 'not installed'} → ${remoteVersion}`);\n } else if (localVersion) {\n console.log(`\\n✅ ${prefix}-engine: ${localVersion} (up to date)`);\n }\n } catch (error) {\n console.warn(`⚠️ Could not check version for ${prefix}-engine, will attempt download`);\n binariesToProcess.push({\n prefix,\n needsUpdate: true,\n localVersion: null,\n remoteVersion: 'latest'\n });\n }\n }\n\n const binariesToDownload = binariesToProcess.filter(b => b.needsUpdate);\n\n if (binariesToDownload.length === 0) {\n this.mainSpinner.succeed(chalk.green('All binaries are up to date'));\n return;\n }\n\n // Show update progress\n this.mainSpinner.text = chalk.blue(`Updating ${binariesToDownload.length} binary(ies)...`);\n\n try {\n // Download and update binaries in parallel. allSettled: si una\n // descarga falla las demás terminan igual y se reportan TODOS los\n // errores (Promise.all descartaba los resultados restantes).\n const results = await Promise.allSettled(binariesToDownload.map(async (binary) => {\n const maxRetries = 3;\n let attempt = 0;\n\n while (attempt <= maxRetries) {\n try {\n // Get binary info with version\n const binaryInfo = await this.getWithVersion(binary.prefix);\n\n if (!binaryInfo.name || !binaryInfo.url) {\n throw new Error(`Platform or architecture not supported for ${binary.prefix}`);\n }\n\n const tempZipPath = path.join(os.tmpdir(), `dbcube-${binary.prefix}-${Date.now()}.zip`);\n const finalBinaryPath = path.join(binDir, binaryInfo.name);\n\n // Delete old binary first\n this.deleteOldBinary(binDir, binary.prefix);\n\n // Download\n await this.downloadFileWithProgress(binaryInfo.url, tempZipPath, binary.prefix);\n\n // Extract\n await this.extractBinary(tempZipPath, finalBinaryPath, binary.prefix);\n\n console.log(`✅ ${binary.prefix}-engine updated to ${binary.remoteVersion}`);\n break;\n\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n if (attempt < maxRetries && (\n errorMessage.includes('ECONNRESET') ||\n errorMessage.includes('timeout') ||\n errorMessage.includes('ETIMEDOUT') ||\n errorMessage.includes('ENOTFOUND')\n )) {\n attempt++;\n console.log(`🔄 Retrying ${binary.prefix}-engine (${attempt}/${maxRetries})...`);\n await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000));\n } else {\n throw new Error(`Error downloading ${binary.prefix}: ${errorMessage}`);\n }\n }\n }\n }));\n\n const failures = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected');\n if (failures.length > 0) {\n const messages = failures.map(f => f.reason instanceof Error ? f.reason.message : String(f.reason));\n throw new Error(messages.join(' | '));\n }\n\n // Complete successfully\n this.mainSpinner.succeed(chalk.green('Binaries updated successfully'));\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.mainSpinner.fail(chalk.red(`Error updating binaries: ${errorMessage}`));\n throw error;\n }\n }\n\n private static updateMainProgress(binary: string, current: number, total: number, status: string, attempt?: number) {\n const progressBar = this.createProgressBar(current, total);\n const statusEmojis = {\n downloading: '📥',\n extracting: '📦',\n completed: '✅',\n exists: '✅',\n retrying: '🔄'\n };\n\n const statusMessages = {\n downloading: chalk.blue('descargando'),\n extracting: chalk.yellow('extrayendo'),\n completed: chalk.green('completado'),\n exists: chalk.gray('existe'),\n retrying: chalk.yellow(`reintentando (${attempt}/${3})`)\n };\n\n const emoji = statusEmojis[status as keyof typeof statusEmojis] || '📥';\n const message = statusMessages[status as keyof typeof statusMessages] || status;\n\n this.mainSpinner.text = `${progressBar} ${emoji} ${chalk.bold(binary)} - ${message}`;\n }\n\n private static createProgressBar(current: number, total: number, width: number = 20): string {\n const filled = Math.round((current / total) * width);\n const empty = width - filled;\n const filledBar = chalk.green('█'.repeat(filled));\n const emptyBar = chalk.gray('░'.repeat(empty));\n const percentage = chalk.bold(`${current}/${total}`);\n return `[${filledBar}${emptyBar}] ${percentage}`;\n }\n\n private static downloadFileWithProgress(url: string, outputPath: string, prefix: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = https.get(url, { timeout: 0 }, (response: IncomingMessage) => {\n if (response.statusCode === 302 || response.statusCode === 301) {\n const redirectUrl = response.headers.location;\n if (redirectUrl) {\n return this.downloadFileWithProgress(redirectUrl, outputPath, prefix).then(resolve).catch(reject);\n }\n }\n\n if (response.statusCode !== 200) {\n reject(new Error(`HTTP ${response.statusCode} para ${prefix}`));\n return;\n }\n\n const file = fs.createWriteStream(outputPath);\n const totalBytes = parseInt(response.headers['content-length'] || '0', 10);\n let downloadedBytes = 0;\n\n response.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n file.write(chunk);\n\n if (totalBytes > 0) {\n const progress: DownloadProgress = {\n downloaded: downloadedBytes,\n total: totalBytes,\n percentage: (downloadedBytes / totalBytes) * 100\n };\n this.updateDownloadProgress(prefix, progress);\n }\n });\n\n response.on('end', () => {\n // Resolver recién cuando el archivo está flushed a disco;\n // si no, extractBinary puede leer un ZIP incompleto\n file.end(() => resolve());\n });\n\n response.on('error', (err) => {\n file.close();\n this.cleanupFile(outputPath);\n reject(err);\n });\n\n file.on('error', (err) => {\n file.close();\n this.cleanupFile(outputPath);\n reject(err);\n });\n });\n\n request.on('error', reject);\n request.on('timeout', () => {\n request.destroy();\n reject(new Error(`Timeout descargando ${prefix}`));\n });\n });\n }\n\n private static updateDownloadProgress(binary: string, progress: DownloadProgress) {\n const percentage = progress.percentage.toFixed(1);\n const downloaded = (progress.downloaded / 1024 / 1024).toFixed(1);\n const total = (progress.total / 1024 / 1024).toFixed(1);\n\n // Create a mini progress bar for the binary\n const barWidth = 15;\n const filled = Math.round((progress.percentage / 100) * barWidth);\n const empty = barWidth - filled;\n const progressBar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n\n const progressText = `[${progressBar}] ${percentage}% (${downloaded}/${total}MB)`;\n this.mainSpinner.text = `📥 ${chalk.bold(binary)} - ${progressText}`;\n }\n\n private static extractBinary(zipPath: string, outputPath: string, prefix: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Los ZIPs traen el binario principal (primer archivo) y, desde\n // v1.1.0, también la cdylib embebida (query-engine-embedded-*.dll/\n // .so/.dylib). El binario va a outputPath; el resto conserva su\n // nombre junto a él.\n const outDir = path.dirname(outputPath);\n let extracted = 0;\n const pending: Promise<void>[] = [];\n\n fs.createReadStream(zipPath)\n .pipe(unzipper.Parse())\n .on('entry', (entry: unzipper.Entry) => {\n if (entry.type !== 'File') {\n entry.autodrain();\n return;\n }\n const isMain = extracted === 0;\n extracted++;\n const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));\n\n pending.push(new Promise<void>((res, rej) => {\n const writeStream = fs.createWriteStream(target);\n entry.pipe(writeStream);\n writeStream.on('finish', () => {\n if (process.platform !== 'win32') {\n try { fs.chmodSync(target, 0o755); } catch { /* fs sin permisos */ }\n }\n res();\n });\n writeStream.on('error', rej);\n }));\n })\n .on('error', (err: Error) => {\n this.cleanupFile(zipPath);\n reject(err);\n })\n .on('close', () => {\n Promise.all(pending)\n .then(() => {\n this.cleanupFile(zipPath);\n if (extracted === 0) {\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\n } else {\n resolve();\n }\n })\n .catch((err) => {\n this.cleanupFile(zipPath);\n reject(err);\n });\n });\n });\n }\n\n private static cleanupFile(filePath: string): void {\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n private static getDefaultBinDir(): string {\n // Get __dirname equivalent for ESM\n const __filename = typeof import.meta !== 'undefined' && import.meta.url\n ? fileURLToPath(import.meta.url)\n : '';\n const __dirname = __filename ? dirname(__filename) : process.cwd();\n\n // Try to find a suitable directory for binaries in order of preference\n const possibleDirs = [\n path.resolve(process.cwd(), '.dbcube', 'bin'),\n path.resolve(process.cwd(), 'node_modules', '.dbcube', 'bin'),\n path.resolve(__dirname, '..', 'bin'),\n ];\n\n // Use the first one that can be created or already exists\n for (const dir of possibleDirs) {\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n // Test write permissions\n const testFile = path.join(dir, '.test');\n fs.writeFileSync(testFile, 'test');\n fs.unlinkSync(testFile);\n return dir;\n } catch {\n // Try next directory\n continue;\n }\n }\n\n // Fallback to .dbcube directory in temp\n const tempDir = path.join(os.tmpdir(), '.dbcube', 'bin');\n fs.mkdirSync(tempDir, { recursive: true });\n return tempDir;\n }\n}\n\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 }\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});"],"mappings":"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","names":["platform","arch","os","dirname","resolve","arch","platform"]}