@dbcube/core 5.2.2 → 5.2.3
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 +29 -17
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +31 -19
- package/dist/bin.js.map +1 -1
- package/dist/index.cjs +485 -172
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +17 -6
- package/dist/index.d.ts +17 -6
- package/dist/index.js +506 -186
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/bin.cjs
CHANGED
|
@@ -498,34 +498,46 @@ var Downloader = class {
|
|
|
498
498
|
}
|
|
499
499
|
static extractBinary(zipPath, outputPath, prefix) {
|
|
500
500
|
return new Promise((resolve2, reject) => {
|
|
501
|
-
|
|
501
|
+
const outDir = path.dirname(outputPath);
|
|
502
|
+
let extracted = 0;
|
|
503
|
+
const pending = [];
|
|
502
504
|
fs.createReadStream(zipPath).pipe(unzipper.Parse()).on("entry", (entry) => {
|
|
503
|
-
if (entry.type
|
|
504
|
-
|
|
505
|
-
|
|
505
|
+
if (entry.type !== "File") {
|
|
506
|
+
entry.autodrain();
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
const isMain = extracted === 0;
|
|
510
|
+
extracted++;
|
|
511
|
+
const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));
|
|
512
|
+
pending.push(new Promise((res, rej) => {
|
|
513
|
+
const writeStream = fs.createWriteStream(target);
|
|
506
514
|
entry.pipe(writeStream);
|
|
507
515
|
writeStream.on("finish", () => {
|
|
508
516
|
if (process.platform !== "win32") {
|
|
509
|
-
|
|
517
|
+
try {
|
|
518
|
+
fs.chmodSync(target, 493);
|
|
519
|
+
} catch {
|
|
520
|
+
}
|
|
510
521
|
}
|
|
511
|
-
|
|
512
|
-
resolve2();
|
|
522
|
+
res();
|
|
513
523
|
});
|
|
514
|
-
writeStream.on("error",
|
|
515
|
-
|
|
516
|
-
reject(err);
|
|
517
|
-
});
|
|
518
|
-
} else {
|
|
519
|
-
entry.autodrain();
|
|
520
|
-
}
|
|
524
|
+
writeStream.on("error", rej);
|
|
525
|
+
}));
|
|
521
526
|
}).on("error", (err) => {
|
|
522
527
|
this.cleanupFile(zipPath);
|
|
523
528
|
reject(err);
|
|
524
529
|
}).on("close", () => {
|
|
525
|
-
|
|
530
|
+
Promise.all(pending).then(() => {
|
|
526
531
|
this.cleanupFile(zipPath);
|
|
527
|
-
|
|
528
|
-
|
|
532
|
+
if (extracted === 0) {
|
|
533
|
+
reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
|
|
534
|
+
} else {
|
|
535
|
+
resolve2();
|
|
536
|
+
}
|
|
537
|
+
}).catch((err) => {
|
|
538
|
+
this.cleanupFile(zipPath);
|
|
539
|
+
reject(err);
|
|
540
|
+
});
|
|
529
541
|
});
|
|
530
542
|
});
|
|
531
543
|
}
|
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\";\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 // Los ZIPs traen el binario principal (primer archivo) y, desde\r\n // v1.1.0, también la cdylib embebida (query-engine-embedded-*.dll/\r\n // .so/.dylib). El binario va a outputPath; el resto conserva su\r\n // nombre junto a él.\r\n const outDir = path.dirname(outputPath);\r\n let extracted = 0;\r\n const pending: Promise<void>[] = [];\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') {\r\n entry.autodrain();\r\n return;\r\n }\r\n const isMain = extracted === 0;\r\n extracted++;\r\n const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));\r\n\r\n pending.push(new Promise<void>((res, rej) => {\r\n const writeStream = fs.createWriteStream(target);\r\n entry.pipe(writeStream);\r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n try { fs.chmodSync(target, 0o755); } catch { /* fs sin permisos */ }\r\n }\r\n res();\r\n });\r\n writeStream.on('error', rej);\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 Promise.all(pending)\r\n .then(() => {\r\n this.cleanupFile(zipPath);\r\n if (extracted === 0) {\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n } else {\r\n resolve();\r\n }\r\n })\r\n .catch((err) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\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"]}
|
package/dist/bin.js
CHANGED
|
@@ -131,7 +131,7 @@ 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;
|
|
@@ -474,34 +474,46 @@ var Downloader = class {
|
|
|
474
474
|
}
|
|
475
475
|
static extractBinary(zipPath, outputPath, prefix) {
|
|
476
476
|
return new Promise((resolve2, reject) => {
|
|
477
|
-
|
|
477
|
+
const outDir = path.dirname(outputPath);
|
|
478
|
+
let extracted = 0;
|
|
479
|
+
const pending = [];
|
|
478
480
|
fs.createReadStream(zipPath).pipe(unzipper.Parse()).on("entry", (entry) => {
|
|
479
|
-
if (entry.type
|
|
480
|
-
|
|
481
|
-
|
|
481
|
+
if (entry.type !== "File") {
|
|
482
|
+
entry.autodrain();
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
const isMain = extracted === 0;
|
|
486
|
+
extracted++;
|
|
487
|
+
const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));
|
|
488
|
+
pending.push(new Promise((res, rej) => {
|
|
489
|
+
const writeStream = fs.createWriteStream(target);
|
|
482
490
|
entry.pipe(writeStream);
|
|
483
491
|
writeStream.on("finish", () => {
|
|
484
492
|
if (process.platform !== "win32") {
|
|
485
|
-
|
|
493
|
+
try {
|
|
494
|
+
fs.chmodSync(target, 493);
|
|
495
|
+
} catch {
|
|
496
|
+
}
|
|
486
497
|
}
|
|
487
|
-
|
|
488
|
-
resolve2();
|
|
498
|
+
res();
|
|
489
499
|
});
|
|
490
|
-
writeStream.on("error",
|
|
491
|
-
|
|
492
|
-
reject(err);
|
|
493
|
-
});
|
|
494
|
-
} else {
|
|
495
|
-
entry.autodrain();
|
|
496
|
-
}
|
|
500
|
+
writeStream.on("error", rej);
|
|
501
|
+
}));
|
|
497
502
|
}).on("error", (err) => {
|
|
498
503
|
this.cleanupFile(zipPath);
|
|
499
504
|
reject(err);
|
|
500
505
|
}).on("close", () => {
|
|
501
|
-
|
|
506
|
+
Promise.all(pending).then(() => {
|
|
502
507
|
this.cleanupFile(zipPath);
|
|
503
|
-
|
|
504
|
-
|
|
508
|
+
if (extracted === 0) {
|
|
509
|
+
reject(new Error(`No se encontr\xF3 archivo v\xE1lido en el ZIP para ${prefix}`));
|
|
510
|
+
} else {
|
|
511
|
+
resolve2();
|
|
512
|
+
}
|
|
513
|
+
}).catch((err) => {
|
|
514
|
+
this.cleanupFile(zipPath);
|
|
515
|
+
reject(err);
|
|
516
|
+
});
|
|
505
517
|
});
|
|
506
518
|
});
|
|
507
519
|
}
|
|
@@ -515,7 +527,7 @@ var Downloader = class {
|
|
|
515
527
|
}
|
|
516
528
|
static getDefaultBinDir() {
|
|
517
529
|
const __filename = typeof import.meta !== "undefined" && import.meta.url ? fileURLToPath(import.meta.url) : "";
|
|
518
|
-
const __dirname = __filename ?
|
|
530
|
+
const __dirname = __filename ? dirname2(__filename) : process.cwd();
|
|
519
531
|
const possibleDirs = [
|
|
520
532
|
path.resolve(process.cwd(), ".dbcube", "bin"),
|
|
521
533
|
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":"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","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\";\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 // Los ZIPs traen el binario principal (primer archivo) y, desde\r\n // v1.1.0, también la cdylib embebida (query-engine-embedded-*.dll/\r\n // .so/.dylib). El binario va a outputPath; el resto conserva su\r\n // nombre junto a él.\r\n const outDir = path.dirname(outputPath);\r\n let extracted = 0;\r\n const pending: Promise<void>[] = [];\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') {\r\n entry.autodrain();\r\n return;\r\n }\r\n const isMain = extracted === 0;\r\n extracted++;\r\n const target = isMain ? outputPath : path.join(outDir, path.basename(entry.path));\r\n\r\n pending.push(new Promise<void>((res, rej) => {\r\n const writeStream = fs.createWriteStream(target);\r\n entry.pipe(writeStream);\r\n writeStream.on('finish', () => {\r\n if (process.platform !== 'win32') {\r\n try { fs.chmodSync(target, 0o755); } catch { /* fs sin permisos */ }\r\n }\r\n res();\r\n });\r\n writeStream.on('error', rej);\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 Promise.all(pending)\r\n .then(() => {\r\n this.cleanupFile(zipPath);\r\n if (extracted === 0) {\r\n reject(new Error(`No se encontró archivo válido en el ZIP para ${prefix}`));\r\n } else {\r\n resolve();\r\n }\r\n })\r\n .catch((err) => {\r\n this.cleanupFile(zipPath);\r\n reject(err);\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,WAAAC,gBAAe;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;AAKpC,YAAM,SAAc,aAAQ,UAAU;AACtC,UAAI,YAAY;AAChB,YAAM,UAA2B,CAAC;AAElC,MAAG,oBAAiB,OAAO,EACtB,KAAc,eAAM,CAAC,EACrB,GAAG,SAAS,CAAC,UAA0B;AACpC,YAAI,MAAM,SAAS,QAAQ;AACvB,gBAAM,UAAU;AAChB;AAAA,QACJ;AACA,cAAM,SAAS,cAAc;AAC7B;AACA,cAAM,SAAS,SAAS,aAAkB,UAAK,QAAa,cAAS,MAAM,IAAI,CAAC;AAEhF,gBAAQ,KAAK,IAAI,QAAc,CAAC,KAAK,QAAQ;AACzC,gBAAM,cAAiB,qBAAkB,MAAM;AAC/C,gBAAM,KAAK,WAAW;AACtB,sBAAY,GAAG,UAAU,MAAM;AAC3B,gBAAI,QAAQ,aAAa,SAAS;AAC9B,kBAAI;AAAE,gBAAG,aAAU,QAAQ,GAAK;AAAA,cAAG,QAAQ;AAAA,cAAwB;AAAA,YACvE;AACA,gBAAI;AAAA,UACR,CAAC;AACD,sBAAY,GAAG,SAAS,GAAG;AAAA,QAC/B,CAAC,CAAC;AAAA,MACN,CAAC,EACA,GAAG,SAAS,CAAC,QAAe;AACzB,aAAK,YAAY,OAAO;AACxB,eAAO,GAAG;AAAA,MACd,CAAC,EACA,GAAG,SAAS,MAAM;AACf,gBAAQ,IAAI,OAAO,EACd,KAAK,MAAM;AACR,eAAK,YAAY,OAAO;AACxB,cAAI,cAAc,GAAG;AACjB,mBAAO,IAAI,MAAM,sDAAgD,MAAM,EAAE,CAAC;AAAA,UAC9E,OAAO;AACH,YAAAA,SAAQ;AAAA,UACZ;AAAA,QACJ,CAAC,EACA,MAAM,CAAC,QAAQ;AACZ,eAAK,YAAY,OAAO;AACxB,iBAAO,GAAG;AAAA,QACd,CAAC;AAAA,MACT,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,aAAaD,SAAQ,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;;;AC1iBA,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","dirname","resolve","arch","platform"]}
|