fullnative 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/MIGRATION.md +161 -0
- package/README.md +128 -34
- package/dist/core/env/env.d.ts +37 -5
- package/dist/core/env/env.d.ts.map +1 -1
- package/dist/core/env/env.js +27 -6
- package/dist/core/env/env.js.map +1 -1
- package/dist/core/env/index.d.ts +1 -1
- package/dist/core/env/index.d.ts.map +1 -1
- package/dist/core/env/index.js.map +1 -1
- package/dist/core/file/File.d.ts +13 -11
- package/dist/core/file/File.d.ts.map +1 -1
- package/dist/core/file/File.js +15 -14
- package/dist/core/file/File.js.map +1 -1
- package/dist/core/file/Folder.d.ts +11 -11
- package/dist/core/file/Folder.d.ts.map +1 -1
- package/dist/core/file/Folder.js +44 -27
- package/dist/core/file/Folder.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/process/Command.d.ts +19 -0
- package/dist/core/process/Command.d.ts.map +1 -1
- package/dist/core/process/Command.js +36 -1
- package/dist/core/process/Command.js.map +1 -1
- package/dist/core/process/Result.d.ts +10 -2
- package/dist/core/process/Result.d.ts.map +1 -1
- package/dist/core/process/Result.js +12 -2
- package/dist/core/process/Result.js.map +1 -1
- package/dist/core/process/types.d.ts +4 -0
- package/dist/core/process/types.d.ts.map +1 -1
- package/dist/core/shell/Shell.d.ts +33 -5
- package/dist/core/shell/Shell.d.ts.map +1 -1
- package/dist/core/shell/Shell.js +49 -7
- package/dist/core/shell/Shell.js.map +1 -1
- package/dist/core/shell/types.d.ts +7 -3
- package/dist/core/shell/types.d.ts.map +1 -1
- package/dist/core/utils/index.d.ts +4 -0
- package/dist/core/utils/index.d.ts.map +1 -0
- package/dist/core/utils/index.js +4 -0
- package/dist/core/utils/index.js.map +1 -0
- package/dist/core/utils/sleep.d.ts +14 -0
- package/dist/core/utils/sleep.d.ts.map +1 -0
- package/dist/core/utils/sleep.js +16 -0
- package/dist/core/utils/sleep.js.map +1 -0
- package/dist/core/utils/tempDir.d.ts +59 -0
- package/dist/core/utils/tempDir.d.ts.map +1 -0
- package/dist/core/utils/tempDir.js +92 -0
- package/dist/core/utils/tempDir.js.map +1 -0
- package/dist/core/utils/timeout.d.ts +40 -0
- package/dist/core/utils/timeout.d.ts.map +1 -0
- package/dist/core/utils/timeout.js +54 -0
- package/dist/core/utils/timeout.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { promises as fs, rmSync } from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { Folder } from "../file/Folder.js";
|
|
5
|
+
/**
|
|
6
|
+
* Registro a nivel de módulo con las rutas de los directorios temporales
|
|
7
|
+
* pendientes de limpieza automática. Solo contiene las rutas creadas con
|
|
8
|
+
* `keep !== true`; las de `keep: true` no se registran.
|
|
9
|
+
*/
|
|
10
|
+
const pending = new Set();
|
|
11
|
+
/** Marca si el hook de `exit` ya se registró (único por proceso). */
|
|
12
|
+
let hookInstalled = false;
|
|
13
|
+
/**
|
|
14
|
+
* Limpieza al finalizar el proceso: elimina cada ruta registrada.
|
|
15
|
+
*
|
|
16
|
+
* Se registra UNA sola vez (aunque se creen N tempdirs) para no acumular
|
|
17
|
+
* listeners de `exit`. Los fallos de `rmSync` se tragan a propósito: la
|
|
18
|
+
* limpieza en el cierre del proceso es de "mejor esfuerzo" y no debe
|
|
19
|
+
* interrumpir el shutdown.
|
|
20
|
+
*/
|
|
21
|
+
const cleanupPending = () => {
|
|
22
|
+
for (const dir of pending) {
|
|
23
|
+
try {
|
|
24
|
+
rmSync(dir, { recursive: true, force: true });
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Mejor esfuerzo en el cierre del proceso.
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
pending.clear();
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Registra el hook de `exit` (solo la primera vez que se necesita).
|
|
34
|
+
*/
|
|
35
|
+
function installExitHook() {
|
|
36
|
+
if (hookInstalled)
|
|
37
|
+
return;
|
|
38
|
+
hookInstalled = true;
|
|
39
|
+
process.once("exit", cleanupPending);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Directorio temporal gestionado, creado con `fs.mkdtemp` bajo `os.tmpdir()`.
|
|
43
|
+
*
|
|
44
|
+
* Extiende `Folder`, así que hereda toda la API de directorios (`list`,
|
|
45
|
+
* `createFile`, `walk`, etc.). Añade `dispose()` para eliminarlo bajo demanda:
|
|
46
|
+
* `dispose()` es idempotente y quita la ruta del registro del auto-cleanup,
|
|
47
|
+
* así que no hay doble intento de borrado al salir del proceso.
|
|
48
|
+
*/
|
|
49
|
+
export class TempDir extends Folder {
|
|
50
|
+
/** Indica si el directorio fue creado con `keep: true`. */
|
|
51
|
+
keep;
|
|
52
|
+
/**
|
|
53
|
+
* @param dirPath Ruta (absoluta) del directorio temporal.
|
|
54
|
+
* @param keep `true` si se creó con `keep: true` (sin auto-cleanup).
|
|
55
|
+
*/
|
|
56
|
+
constructor(dirPath, keep = false) {
|
|
57
|
+
super(dirPath);
|
|
58
|
+
this.keep = keep;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Elimina el directorio y todo su contenido del disco
|
|
62
|
+
* (`fs.rm` con `recursive` y `force`) y lo saca del registro de
|
|
63
|
+
* auto-cleanup. No falla si ya no existe.
|
|
64
|
+
*/
|
|
65
|
+
async dispose() {
|
|
66
|
+
await fs.rm(this.path, { recursive: true, force: true });
|
|
67
|
+
pending.delete(this.path);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Crea un directorio temporal único bajo `os.tmpdir()` con `fs.mkdtemp`.
|
|
72
|
+
*
|
|
73
|
+
* Por defecto (`keep: false`) la ruta se registra y un hook **único** de
|
|
74
|
+
* `process.once("exit")` la elimina automáticamente al finalizar el proceso
|
|
75
|
+
* (un solo listener para todos los tempdirs, nunca uno por creación), con
|
|
76
|
+
* `rmSync` recursive + force.
|
|
77
|
+
*
|
|
78
|
+
* @param options Opciones `prefix` (default `"fullnative-"`) y `keep`
|
|
79
|
+
* (default `false`).
|
|
80
|
+
* @returns Una promesa con la instancia `TempDir`; el directorio ya existe
|
|
81
|
+
* en disco al resolverse.
|
|
82
|
+
*/
|
|
83
|
+
export async function tempDir(options = {}) {
|
|
84
|
+
const { prefix = "fullnative-", keep = false } = options;
|
|
85
|
+
const dirPath = await fs.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
86
|
+
if (!keep) {
|
|
87
|
+
pending.add(dirPath);
|
|
88
|
+
installExitHook();
|
|
89
|
+
}
|
|
90
|
+
return new TempDir(dirPath, keep);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tempDir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tempDir.js","sourceRoot":"","sources":["../../../src/core/utils/tempDir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;AAElC,qEAAqE;AACrE,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;;;;;GAOG;AACH,MAAM,cAAc,GAAG,GAAS,EAAE;IAChC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,aAAa;QAAE,OAAO;IAC1B,aAAa,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACvC,CAAC;AAwBD;;;;;;;GAOG;AACH,MAAM,OAAO,OAAQ,SAAQ,MAAM;IACjC,2DAA2D;IAC3C,IAAI,CAAU;IAE9B;;;OAGG;IACH,YAAY,OAAe,EAAE,IAAI,GAAG,KAAK;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAA0B,EAAE;IACxD,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,eAAe,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error que indica que una operación superó el plazo máximo permitido.
|
|
3
|
+
*
|
|
4
|
+
* Se usa como rechazo estándar de `timeout()` y permite detectar caducidades
|
|
5
|
+
* de forma tipada sin depender del mensaje literal.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* try {
|
|
9
|
+
* await timeout(slowTask(), 5_000);
|
|
10
|
+
* } catch (err) {
|
|
11
|
+
* if (err instanceof TimeoutError) console.error("se pasó de plazo");
|
|
12
|
+
* }
|
|
13
|
+
*/
|
|
14
|
+
export declare class TimeoutError extends Error {
|
|
15
|
+
/**
|
|
16
|
+
* @param message Descripción del vencimiento (por defecto, genérica).
|
|
17
|
+
*/
|
|
18
|
+
constructor(message?: string);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Compite una promesa contra un temporizador y limita su plazo de resolución.
|
|
22
|
+
*
|
|
23
|
+
* - Si `promise` se resuelve a tiempo, su valor gana la carrera y el timer
|
|
24
|
+
* se limpia con `clearTimeout` (vía `finally`).
|
|
25
|
+
* - Si expira el plazo, la promesa devuelta rechaza con `TimeoutError`
|
|
26
|
+
* (el `message` dado, o uno por defecto que incluye los `ms`).
|
|
27
|
+
*
|
|
28
|
+
* El `promise` subyacente nunca se cancela (las promesas nativas no se pueden
|
|
29
|
+
* cancelar): si rechaza después de que el timer haya ganado, `Promise.race`
|
|
30
|
+
* ya tenía handlers adjuntos a ambos, así que no hay unhandled rejection.
|
|
31
|
+
*
|
|
32
|
+
* @param promise Promesa a la que se quiere limitar el plazo.
|
|
33
|
+
* @param ms Plazo máximo en milisegundos antes de rechazar.
|
|
34
|
+
* @param message Mensaje opcional para el `TimeoutError`. Por defecto,
|
|
35
|
+
* `"Operation timed out after {ms}ms"`.
|
|
36
|
+
* @returns Una promesa con el valor de `promise`, o que rechaza con
|
|
37
|
+
* `TimeoutError` si vence el plazo.
|
|
38
|
+
*/
|
|
39
|
+
export declare function timeout<T>(promise: Promise<T>, ms: number, message?: string): Promise<T>;
|
|
40
|
+
//# sourceMappingURL=timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/core/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC;;OAEG;gBACS,OAAO,SAAwB;CAI5C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC,CAYZ"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error que indica que una operación superó el plazo máximo permitido.
|
|
3
|
+
*
|
|
4
|
+
* Se usa como rechazo estándar de `timeout()` y permite detectar caducidades
|
|
5
|
+
* de forma tipada sin depender del mensaje literal.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* try {
|
|
9
|
+
* await timeout(slowTask(), 5_000);
|
|
10
|
+
* } catch (err) {
|
|
11
|
+
* if (err instanceof TimeoutError) console.error("se pasó de plazo");
|
|
12
|
+
* }
|
|
13
|
+
*/
|
|
14
|
+
export class TimeoutError extends Error {
|
|
15
|
+
/**
|
|
16
|
+
* @param message Descripción del vencimiento (por defecto, genérica).
|
|
17
|
+
*/
|
|
18
|
+
constructor(message = "Operation timed out") {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "TimeoutError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compite una promesa contra un temporizador y limita su plazo de resolución.
|
|
25
|
+
*
|
|
26
|
+
* - Si `promise` se resuelve a tiempo, su valor gana la carrera y el timer
|
|
27
|
+
* se limpia con `clearTimeout` (vía `finally`).
|
|
28
|
+
* - Si expira el plazo, la promesa devuelta rechaza con `TimeoutError`
|
|
29
|
+
* (el `message` dado, o uno por defecto que incluye los `ms`).
|
|
30
|
+
*
|
|
31
|
+
* El `promise` subyacente nunca se cancela (las promesas nativas no se pueden
|
|
32
|
+
* cancelar): si rechaza después de que el timer haya ganado, `Promise.race`
|
|
33
|
+
* ya tenía handlers adjuntos a ambos, así que no hay unhandled rejection.
|
|
34
|
+
*
|
|
35
|
+
* @param promise Promesa a la que se quiere limitar el plazo.
|
|
36
|
+
* @param ms Plazo máximo en milisegundos antes de rechazar.
|
|
37
|
+
* @param message Mensaje opcional para el `TimeoutError`. Por defecto,
|
|
38
|
+
* `"Operation timed out after {ms}ms"`.
|
|
39
|
+
* @returns Una promesa con el valor de `promise`, o que rechaza con
|
|
40
|
+
* `TimeoutError` si vence el plazo.
|
|
41
|
+
*/
|
|
42
|
+
export function timeout(promise, ms, message) {
|
|
43
|
+
let timer;
|
|
44
|
+
const guard = new Promise((_, reject) => {
|
|
45
|
+
timer = setTimeout(() => {
|
|
46
|
+
reject(new TimeoutError(message ?? `Operation timed out after ${ms}ms`));
|
|
47
|
+
}, ms);
|
|
48
|
+
});
|
|
49
|
+
return Promise.race([promise, guard]).finally(() => {
|
|
50
|
+
if (timer !== undefined)
|
|
51
|
+
clearTimeout(timer);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../src/core/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC;;OAEG;IACH,YAAY,OAAO,GAAG,qBAAqB;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,OAAO,CACrB,OAAmB,EACnB,EAAU,EACV,OAAgB;IAEhB,IAAI,KAAgD,CAAC;IAErD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,IAAI,6BAA6B,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fullnative",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "TypeScript toolchain for Node.js — files, folders, processes, shell sessions, and env loading with a clean, object-oriented API.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"dist",
|
|
18
18
|
"README.md",
|
|
19
19
|
"LICENSE",
|
|
20
|
-
"CHANGELOG.md"
|
|
20
|
+
"CHANGELOG.md",
|
|
21
|
+
"MIGRATION.md"
|
|
21
22
|
],
|
|
22
23
|
"scripts": {
|
|
23
24
|
"build": "tsc",
|