qdd-framework 2.9.7 → 2.9.9
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/README.md +4 -1
- package/bin/qdd.js +17 -3
- package/install.js +52 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,9 +10,12 @@
|
|
|
10
10
|
## 🚀 Instalación Rápida
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
npm install -g qdd-framework
|
|
13
|
+
npm install -g qdd-framework --allow-scripts=qdd-framework
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
npm 12 no corre los scripts de instalación sin esa bandera. Si instalas sin ella, la primera vez que uses `qdd` se baja su
|
|
17
|
+
binario desde el release de GitHub de esa versión, fuera del bloqueo de npm.
|
|
18
|
+
|
|
16
19
|
> **Conflicto con el paquete `qdd` de npm:** existe un paquete ajeno llamado `qdd` (no pertenece a QDD Framework) que también instala un comando `qdd`. Si lo tienes instalado globalmente, desinstálalo antes (`npm uninstall -g qdd`) para que `qdd` apunte a QDD Framework. Desde v1.9.22 su presencia ya no rompe la instalación (antes fallaba con `EISDIR`).
|
|
17
20
|
|
|
18
21
|
---
|
package/bin/qdd.js
CHANGED
|
@@ -3,9 +3,23 @@
|
|
|
3
3
|
const { spawnSync } = require('child_process');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const os = require('os');
|
|
6
|
+
const fs = require('fs');
|
|
6
7
|
|
|
7
8
|
const binaryExt = os.platform() === 'win32' ? '.exe' : '';
|
|
8
9
|
const binaryPath = path.join(__dirname, `qdd${binaryExt}`);
|
|
10
|
+
const instalador = path.join(__dirname, '..', 'install.js');
|
|
11
|
+
|
|
12
|
+
// Con npm 12, quien instala sin --allow-scripts=qdd-framework no corrió el postinstall (FND-143): el primer qdd baja el
|
|
13
|
+
// binario con el mismo instalador. Lo que escribe va a stderr: otro programa puede estar leyendo la salida de qdd.
|
|
14
|
+
function bajarAlPrimerUso() {
|
|
15
|
+
if (fs.existsSync(binaryPath) || !fs.existsSync(instalador)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
console.error('[QDD] qdd no tiene su binario: lo bajo ahora, porque npm no corrió su instalación.');
|
|
19
|
+
spawnSync(process.execPath, [instalador, '--primer-uso'], { stdio: ['ignore', 2, 'inherit'] });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
bajarAlPrimerUso();
|
|
9
23
|
|
|
10
24
|
const result = spawnSync(binaryPath, process.argv.slice(2), {
|
|
11
25
|
stdio: 'inherit'
|
|
@@ -13,14 +27,14 @@ const result = spawnSync(binaryPath, process.argv.slice(2), {
|
|
|
13
27
|
|
|
14
28
|
// Sin binario, lo más probable es que npm esté reinstalando qdd: 75 es «todavía no» para los pedidos del panel (FND-135).
|
|
15
29
|
if (result.error && result.error.code === 'ENOENT') {
|
|
16
|
-
console.error('[QDD] qdd se está actualizando
|
|
17
|
-
console.error('[QDD] Si sigue así, reinstala el paquete con: npm install -g qdd-framework');
|
|
30
|
+
console.error('[QDD] qdd no tiene su binario: se está actualizando, o npm bloqueó su instalación (npm 12 lo hace por defecto).');
|
|
31
|
+
console.error('[QDD] Si sigue así, reinstala el paquete con: npm install -g qdd-framework --allow-scripts=qdd-framework');
|
|
18
32
|
process.exit(75);
|
|
19
33
|
}
|
|
20
34
|
|
|
21
35
|
if (result.error) {
|
|
22
36
|
console.error(`[QDD] No se pudo ejecutar el binario nativo ${binaryPath}: ${result.error.message}`);
|
|
23
|
-
console.error('[QDD] Reinstala el paquete con: npm install -g qdd-framework');
|
|
37
|
+
console.error('[QDD] Reinstala el paquete con: npm install -g qdd-framework --allow-scripts=qdd-framework');
|
|
24
38
|
process.exit(1);
|
|
25
39
|
}
|
|
26
40
|
|
package/install.js
CHANGED
|
@@ -9,6 +9,8 @@ const VERSION = 'v' + pkg.version;
|
|
|
9
9
|
const REPO = 'trdago/qdd-framework';
|
|
10
10
|
// TOPE_VERSION_MS: el antivirus puede demorar la primera ejecución de un binario recién descargado.
|
|
11
11
|
const TOPE_VERSION_MS = 60000;
|
|
12
|
+
// TOPE_TURNO_MS: un turno más viejo que esto quedó abandonado; bajar el binario tarda mucho menos.
|
|
13
|
+
const TOPE_TURNO_MS = 5 * 60 * 1000;
|
|
12
14
|
|
|
13
15
|
const platformMap = {
|
|
14
16
|
win32: 'windows',
|
|
@@ -73,6 +75,10 @@ function main() {
|
|
|
73
75
|
fs.mkdirSync(binDir, { recursive: true });
|
|
74
76
|
}
|
|
75
77
|
|
|
78
|
+
if (process.argv.includes('--primer-uso')) {
|
|
79
|
+
pedirTurno(path.join(binDir, '.bajando'));
|
|
80
|
+
}
|
|
81
|
+
|
|
76
82
|
const binarioLocal = resolverBinarioLocal(__dirname, binaryName);
|
|
77
83
|
if (binarioLocal) {
|
|
78
84
|
console.log(`[QDD] Binario local detectado en ${binarioLocal}. Usando copia local para desarrollo...`);
|
|
@@ -85,10 +91,52 @@ function main() {
|
|
|
85
91
|
descargarDesdeRelease({ os, arch, ext, binaryName, binDir });
|
|
86
92
|
}
|
|
87
93
|
|
|
94
|
+
// tomarTurno: varios qdd sin binario a la vez (un panel, por ejemplo) no bajan cada uno el suyo.
|
|
95
|
+
function tomarTurno(ruta) {
|
|
96
|
+
try {
|
|
97
|
+
fs.closeSync(fs.openSync(ruta, 'wx'));
|
|
98
|
+
return true;
|
|
99
|
+
} catch (err) {
|
|
100
|
+
if (err.code !== 'EEXIST') {
|
|
101
|
+
throw err;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (Date.now() - fs.statSync(ruta).mtimeMs < TOPE_TURNO_MS) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
fs.rmSync(ruta, { force: true });
|
|
108
|
+
return tomarTurno(ruta);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// pedirTurno sale con 75, el «todavía no» de los pedidos, si otro qdd ya lo está bajando.
|
|
112
|
+
function pedirTurno(ruta) {
|
|
113
|
+
try {
|
|
114
|
+
if (!tomarTurno(ruta)) {
|
|
115
|
+
console.error('[QDD] Otro proceso ya está bajando el binario.');
|
|
116
|
+
process.exit(75);
|
|
117
|
+
}
|
|
118
|
+
} catch (err) {
|
|
119
|
+
fallar(`no se pudo escribir en la carpeta del paquete: ${err.message}`);
|
|
120
|
+
}
|
|
121
|
+
process.on('exit', () => fs.rmSync(ruta, { force: true }));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// carpetaDeDescarga es propia de este proceso: un postinstall y un primer uso pueden correr a la vez.
|
|
125
|
+
function carpetaDeDescarga() {
|
|
126
|
+
try {
|
|
127
|
+
const carpeta = fs.mkdtempSync(path.join(__dirname, 'descarga-'));
|
|
128
|
+
process.on('exit', () => fs.rmSync(carpeta, { recursive: true, force: true }));
|
|
129
|
+
return carpeta;
|
|
130
|
+
} catch (err) {
|
|
131
|
+
return fallar(`no se pudo escribir en la carpeta del paquete: ${err.message}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
88
135
|
// 2. Descarga desde GitHub Releases
|
|
89
136
|
function descargarDesdeRelease({ os, arch, ext, binaryName, binDir }) {
|
|
90
137
|
const url = `https://github.com/${REPO}/releases/download/${VERSION}/qdd_${os}_${arch}.${ext}`;
|
|
91
|
-
const
|
|
138
|
+
const carpeta = carpetaDeDescarga();
|
|
139
|
+
const downloadDest = path.join(carpeta, `qdd-download.${ext}`);
|
|
92
140
|
|
|
93
141
|
console.log(`[QDD] Descargando binario nativo para ${os}-${arch}...`);
|
|
94
142
|
console.log(`[QDD] URL: ${url}`);
|
|
@@ -121,7 +169,7 @@ function descargarDesdeRelease({ os, arch, ext, binaryName, binDir }) {
|
|
|
121
169
|
function extractBinary() {
|
|
122
170
|
console.log('[QDD] Extrayendo...');
|
|
123
171
|
try {
|
|
124
|
-
const bin = instalarDescarga({ os, paquete: downloadDest, carpeta
|
|
172
|
+
const bin = instalarDescarga({ os, paquete: downloadDest, carpeta, binaryName, binDir, env: process.env });
|
|
125
173
|
console.log('[QDD] ¡Instalación nativa completada exitosamente!');
|
|
126
174
|
actualizarConsola(bin);
|
|
127
175
|
} catch (err) {
|
|
@@ -164,7 +212,7 @@ function codigoDeFalla(env) {
|
|
|
164
212
|
|
|
165
213
|
function fallar(motivo) {
|
|
166
214
|
console.error(`[QDD] La instalación falló: ${motivo}`);
|
|
167
|
-
console.error('[QDD] Para reintentar: npm install -g qdd-framework');
|
|
215
|
+
console.error('[QDD] Para reintentar: npm install -g qdd-framework --allow-scripts=qdd-framework');
|
|
168
216
|
process.exit(codigoDeFalla(process.env));
|
|
169
217
|
}
|
|
170
218
|
|
|
@@ -178,7 +226,7 @@ function actualizarConsola(bin) {
|
|
|
178
226
|
}
|
|
179
227
|
}
|
|
180
228
|
|
|
181
|
-
module.exports = { esArchivo, estaDentroDeNodeModules, resolverBinarioLocal, comandoExtraer, instalarDescarga, codigoDeFalla };
|
|
229
|
+
module.exports = { esArchivo, estaDentroDeNodeModules, resolverBinarioLocal, comandoExtraer, instalarDescarga, codigoDeFalla, tomarTurno };
|
|
182
230
|
|
|
183
231
|
if (require.main === module) {
|
|
184
232
|
main();
|