fullnative 0.1.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +21 -0
  3. package/README.md +161 -0
  4. package/dist/core/env/env.d.ts +34 -0
  5. package/dist/core/env/env.d.ts.map +1 -0
  6. package/dist/core/env/env.js +134 -0
  7. package/dist/core/env/env.js.map +1 -0
  8. package/dist/core/env/index.d.ts +10 -0
  9. package/dist/core/env/index.d.ts.map +1 -0
  10. package/dist/core/env/index.js +10 -0
  11. package/dist/core/env/index.js.map +1 -0
  12. package/dist/core/file/File.d.ts +246 -0
  13. package/dist/core/file/File.d.ts.map +1 -0
  14. package/dist/core/file/File.js +397 -0
  15. package/dist/core/file/File.js.map +1 -0
  16. package/dist/core/file/Folder.d.ts +235 -0
  17. package/dist/core/file/Folder.d.ts.map +1 -0
  18. package/dist/core/file/Folder.js +427 -0
  19. package/dist/core/file/Folder.js.map +1 -0
  20. package/dist/core/index.d.ts +6 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +6 -0
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/process/Command.d.ts +94 -0
  25. package/dist/core/process/Command.d.ts.map +1 -0
  26. package/dist/core/process/Command.js +143 -0
  27. package/dist/core/process/Command.js.map +1 -0
  28. package/dist/core/process/LiveProcess.d.ts +134 -0
  29. package/dist/core/process/LiveProcess.d.ts.map +1 -0
  30. package/dist/core/process/LiveProcess.js +214 -0
  31. package/dist/core/process/LiveProcess.js.map +1 -0
  32. package/dist/core/process/Process.d.ts +108 -0
  33. package/dist/core/process/Process.d.ts.map +1 -0
  34. package/dist/core/process/Process.js +138 -0
  35. package/dist/core/process/Process.js.map +1 -0
  36. package/dist/core/process/ProcessError.d.ts +50 -0
  37. package/dist/core/process/ProcessError.d.ts.map +1 -0
  38. package/dist/core/process/ProcessError.js +62 -0
  39. package/dist/core/process/ProcessError.js.map +1 -0
  40. package/dist/core/process/Result.d.ts +61 -0
  41. package/dist/core/process/Result.d.ts.map +1 -0
  42. package/dist/core/process/Result.js +89 -0
  43. package/dist/core/process/Result.js.map +1 -0
  44. package/dist/core/process/index.d.ts +7 -0
  45. package/dist/core/process/index.d.ts.map +1 -0
  46. package/dist/core/process/index.js +6 -0
  47. package/dist/core/process/index.js.map +1 -0
  48. package/dist/core/process/types.d.ts +17 -0
  49. package/dist/core/process/types.d.ts.map +1 -0
  50. package/dist/core/process/types.js +2 -0
  51. package/dist/core/process/types.js.map +1 -0
  52. package/dist/core/shell/Job.d.ts +149 -0
  53. package/dist/core/shell/Job.d.ts.map +1 -0
  54. package/dist/core/shell/Job.js +218 -0
  55. package/dist/core/shell/Job.js.map +1 -0
  56. package/dist/core/shell/Shell.d.ts +275 -0
  57. package/dist/core/shell/Shell.d.ts.map +1 -0
  58. package/dist/core/shell/Shell.js +461 -0
  59. package/dist/core/shell/Shell.js.map +1 -0
  60. package/dist/core/shell/index.d.ts +4 -0
  61. package/dist/core/shell/index.d.ts.map +1 -0
  62. package/dist/core/shell/index.js +3 -0
  63. package/dist/core/shell/index.js.map +1 -0
  64. package/dist/core/shell/types.d.ts +30 -0
  65. package/dist/core/shell/types.d.ts.map +1 -0
  66. package/dist/core/shell/types.js +2 -0
  67. package/dist/core/shell/types.js.map +1 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +2 -0
  71. package/dist/index.js.map +1 -0
  72. package/package.json +64 -0
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Representa un proceso en segundo plano registrado en una sesión de `Shell`.
3
+ *
4
+ * A diferencia de un `LiveProcess` suelto, un `Job` tiene:
5
+ * - **`name`**: identificador para referenciarlo desde `Shell.jobs`.
6
+ * - **`autoRestart`**: se reinicia solo si el proceso muere.
7
+ * - **Lifecycle atado a la sesión**: `Shell.killAll()` lo mata automáticamente.
8
+ *
9
+ * Expone toda la API de `LiveProcess` (stdin/stdout/kill/wait/onOutput/etc.)
10
+ * más la gestión de reinicio y nombre.
11
+ */
12
+ export class Job {
13
+ /** Identificador del job en el registro de la sesión (`Shell.jobs`). */
14
+ name;
15
+ /** El `LiveProcess` subyacente que el job envuelve. */
16
+ process;
17
+ /** Script original que se ejecuta (tras resolver aliases). */
18
+ script;
19
+ /** Si el proceso muere, se reinicia automáticamente. */
20
+ autoRestart;
21
+ _restartCount = 0;
22
+ _onRestart = new Set();
23
+ _disposed = false;
24
+ /**
25
+ * Crea un nuevo job a partir de un `LiveProcess`.
26
+ *
27
+ * @param process - El `LiveProcess` a envolver.
28
+ * @param script - Script que se ejecuta (para reinicios).
29
+ * @param options - Opciones del job (`name`, `autoRestart`).
30
+ */
31
+ constructor(process, script, options = {}) {
32
+ this.name = options.name ?? `job-${process.pid ?? Date.now()}`;
33
+ this.process = process;
34
+ this.script = script;
35
+ this.autoRestart = options.autoRestart ?? false;
36
+ }
37
+ /** PID del proceso subyacente, o `undefined` si aún no tiene. */
38
+ get pid() {
39
+ return this.process.pid;
40
+ }
41
+ /** `true` si el proceso está en ejecución. */
42
+ get running() {
43
+ return this.process.running;
44
+ }
45
+ /** `true` si el proceso ya terminó. */
46
+ get ended() {
47
+ return this.process.ended;
48
+ }
49
+ /** Código de salida del proceso (`null` si no terminó o fue por señal). */
50
+ get exitCode() {
51
+ return this.process.exitCode;
52
+ }
53
+ /** `true` si el proceso fue detenido explícitamente (distingue kill vs salida natural). */
54
+ get stopped() {
55
+ return this.process.stopped;
56
+ }
57
+ /** Tiempo transcurrido desde el inicio, en milisegundos. */
58
+ get elapsed() {
59
+ return this.process.elapsed;
60
+ }
61
+ /** Señal que terminó el proceso, o `null` si terminó naturalmente. */
62
+ get signal() {
63
+ return this.process.signal;
64
+ }
65
+ /** Comando ejecutado. */
66
+ get command() {
67
+ return this.process.command;
68
+ }
69
+ /** Argumentos pasados al comando. */
70
+ get args() {
71
+ return this.process.args;
72
+ }
73
+ /** Fecha y hora de inicio del proceso. */
74
+ get startedAt() {
75
+ return this.process.startedAt;
76
+ }
77
+ /** Cantidad de veces que el job fue reiniciado vía `autoRestart`. */
78
+ get restartCount() {
79
+ return this._restartCount;
80
+ }
81
+ /** Stream de entrada estándar del proceso. */
82
+ get stdin() {
83
+ return this.process.stdin;
84
+ }
85
+ /** Stream de salida estándar del proceso. */
86
+ get stdout() {
87
+ return this.process.stdout;
88
+ }
89
+ /** Stream de error estándar del proceso. */
90
+ get stderr() {
91
+ return this.process.stderr;
92
+ }
93
+ /**
94
+ * Envía una señal al proceso y lo marca como dispuesto (no se reiniciará).
95
+ *
96
+ * @param signal - Señal a enviar (por defecto `SIGTERM`).
97
+ * @returns `true` si la señal fue entregada.
98
+ */
99
+ kill(signal = "SIGTERM") {
100
+ this._disposed = true;
101
+ return this.process.kill(signal);
102
+ }
103
+ /**
104
+ * Fuerza la terminación del proceso (SIGKILL) y lo marca como dispuesto.
105
+ *
106
+ * @returns `true` si la señal fue entregada.
107
+ */
108
+ forceKill() {
109
+ this._disposed = true;
110
+ return this.process.forceKill();
111
+ }
112
+ /**
113
+ * Escribe datos al stdin del proceso.
114
+ *
115
+ * @param data - Datos a escribir (string o Buffer).
116
+ * @returns `true` si se escribió correctamente.
117
+ */
118
+ write(data) {
119
+ return this.process.write(data);
120
+ }
121
+ /**
122
+ * Escribe una línea al stdin del proceso (añade `\n`).
123
+ *
124
+ * @param line - Línea a escribir.
125
+ * @returns `true` si se escribió correctamente.
126
+ */
127
+ sendLine(line) {
128
+ return this.process.sendLine(line);
129
+ }
130
+ /** Cierra el stdin del proceso. */
131
+ endInput() {
132
+ this.process.endInput();
133
+ }
134
+ /**
135
+ * Registra un callback para cada chunk de stdout.
136
+ *
137
+ * @param callback - Función a ejecutar con cada chunk.
138
+ * @returns `this` para encadenamiento.
139
+ */
140
+ onStdout(callback) {
141
+ this.process.onStdout(callback);
142
+ return this;
143
+ }
144
+ /**
145
+ * Registra un callback para cada chunk de stderr.
146
+ *
147
+ * @param callback - Función a ejecutar con cada chunk.
148
+ * @returns `this` para encadenamiento.
149
+ */
150
+ onStderr(callback) {
151
+ this.process.onStderr(callback);
152
+ return this;
153
+ }
154
+ /**
155
+ * Registra un callback para cada chunk de stdout o stderr (combinados).
156
+ *
157
+ * @param callback - Función a ejecutar con cada chunk.
158
+ * @returns `this` para encadenamiento.
159
+ */
160
+ onOutput(callback) {
161
+ this.process.onOutput(callback);
162
+ return this;
163
+ }
164
+ /**
165
+ * Registra un callback que se ejecuta cuando el proceso termina.
166
+ *
167
+ * @param callback - Función a ejecutar con el resultado.
168
+ * @returns `this` para encadenamiento.
169
+ */
170
+ onExit(callback) {
171
+ this.process.onExit(callback);
172
+ return this;
173
+ }
174
+ /**
175
+ * Registra un callback que se ejecuta cuando el job se reinicia vía `autoRestart`.
176
+ *
177
+ * @param callback - Función a ejecutar con el job reiniciado.
178
+ * @returns `this` para encadenamiento.
179
+ */
180
+ onRestart(callback) {
181
+ this._onRestart.add(callback);
182
+ return this;
183
+ }
184
+ /**
185
+ * Espera a que el proceso termine y devuelve el resultado.
186
+ *
187
+ * @returns El resultado de la ejecución.
188
+ */
189
+ async wait() {
190
+ return this.process.wait();
191
+ }
192
+ /**
193
+ * Alias de `wait()`. Espera a que el proceso termine y devuelve el resultado.
194
+ *
195
+ * @returns El resultado de la ejecución.
196
+ */
197
+ async result() {
198
+ return this.wait();
199
+ }
200
+ /**
201
+ * Reemplaza el `LiveProcess` subyacente (interno, usado por `Shell` para `autoRestart`).
202
+ * Incrementa `restartCount` y dispara los callbacks registrados en `onRestart`.
203
+ *
204
+ * @internal
205
+ * @param process - El nuevo `LiveProcess` que reemplaza al actual.
206
+ */
207
+ _replace(process) {
208
+ this.process = process;
209
+ this._restartCount++;
210
+ for (const cb of this._onRestart)
211
+ cb(this);
212
+ }
213
+ /** @internal Indica si el job fue dispuesto (no debe reiniciarse). */
214
+ get _disposed_() {
215
+ return this._disposed;
216
+ }
217
+ }
218
+ //# sourceMappingURL=Job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Job.js","sourceRoot":"","sources":["../../../src/core/shell/Job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ import { LiveProcess, type Result, type ProcessOptions } from "../process/index.js";
2
+ import { Job } from "./Job.js";
3
+ import type { ShellConfig, HistoryItem, JobOptions } from "./types.js";
4
+ /**
5
+ * Facade que representa una sesión de shell para ejecutar comandos
6
+ * de forma cómoda. Mantiene estado (cwd, env, aliases, historial) y
7
+ * delega la ejecución a `Process` por debajo.
8
+ *
9
+ * @example
10
+ * const sh = new Shell();
11
+ *
12
+ * // Ejecución simple (shell-interpreted)
13
+ * const result = await sh.run("echo hola && ls -la");
14
+ * console.log(result.stdout);
15
+ *
16
+ * // Tagged template con interpolación segura
17
+ * const name = "mundo";
18
+ * await sh.$`echo hola ${name}`;
19
+ *
20
+ * // Pipeline
21
+ * const r = await sh.pipe("cat file.txt", "grep foo", "wc -l");
22
+ *
23
+ * // Cadena secuencial (stop on error)
24
+ * const results = await sh.chain("npm install", "npm run build", "npm test");
25
+ *
26
+ * // Segundo plano
27
+ * const job = sh.bg("npm run dev");
28
+ * job.onStdout(chunk => process.stdout.write(chunk));
29
+ * const res = await job.result();
30
+ */
31
+ export declare class Shell {
32
+ private readonly _proc;
33
+ private _cwd;
34
+ private _env;
35
+ private _aliases;
36
+ private _history;
37
+ private _jobs;
38
+ private _cleanupRegistered;
39
+ /**
40
+ * Crea una nueva sesión de shell.
41
+ *
42
+ * @param options - Configuración de la sesión (cwd, env, shell).
43
+ */
44
+ constructor(options?: ShellConfig);
45
+ /** Directorio de trabajo actual de la sesión. */
46
+ get cwd(): string;
47
+ /** Copia de las variables de entorno de la sesión. */
48
+ get env(): Record<string, string>;
49
+ /** Copia de los alias definidos como objeto plano. */
50
+ get aliases(): Record<string, string>;
51
+ /** Historial de comandos ejecutados (solo lectura). */
52
+ get history(): readonly HistoryItem[];
53
+ /**
54
+ * Cambia el directorio de trabajo de la sesión.
55
+ *
56
+ * @param path - Ruta del nuevo directorio de trabajo.
57
+ * @returns `this` para encadenamiento.
58
+ */
59
+ cd(path: string): this;
60
+ /**
61
+ * Establece una variable de entorno para los próximos comandos.
62
+ *
63
+ * @param key - Nombre de la variable.
64
+ * @param value - Valor de la variable.
65
+ * @returns `this` para encadenamiento.
66
+ */
67
+ set(key: string, value: string): this;
68
+ /**
69
+ * Elimina una variable de entorno de la sesión.
70
+ *
71
+ * @param key - Nombre de la variable a eliminar.
72
+ * @returns `this` para encadenamiento.
73
+ */
74
+ unset(key: string): this;
75
+ /**
76
+ * Define un alias para un comando.
77
+ *
78
+ * @param name - Nombre del alias.
79
+ * @param command - Comando al que se expande el alias.
80
+ * @returns `this` para encadenamiento.
81
+ */
82
+ alias(name: string, command: string): this;
83
+ /**
84
+ * Elimina un alias.
85
+ *
86
+ * @param name - Nombre del alias a eliminar.
87
+ * @returns `this` para encadenamiento.
88
+ */
89
+ unalias(name: string): this;
90
+ /**
91
+ * Tagged template que ejecuta un comando interpolando valores
92
+ * de forma segura (con quoting automático). Lanza `TypeError` si algún
93
+ * valor interpolado no es de un tipo soportado (string, number, boolean,
94
+ * array, null/undefined).
95
+ *
96
+ * @example
97
+ * const name = "world";
98
+ * await sh.$`echo hello ${name}`;
99
+ * // ejecuta: echo hello 'world'
100
+ *
101
+ * const files = ["a.txt", "b.txt"];
102
+ * await sh.$`cat ${files}`;
103
+ * // ejecuta: cat 'a.txt' 'b.txt'
104
+ *
105
+ * @param strings - Partes literales del template.
106
+ * @param values - Valores interpolados (se quotean automáticamente).
107
+ * @returns El resultado de la ejecución.
108
+ * @throws {TypeError} Cuando un valor interpolado no se puede quotear.
109
+ */
110
+ $(strings: TemplateStringsArray, ...values: unknown[]): Promise<Result>;
111
+ /**
112
+ * Ejecuta un script shell (interpretado), espera a que termine y devuelve el resultado.
113
+ *
114
+ * @param script - Script a ejecutar.
115
+ * @param options - Opciones adicionales de proceso (sobrescriben cwd/env de la sesión).
116
+ * @returns El resultado de la ejecución.
117
+ */
118
+ run(script: string, options?: ProcessOptions): Promise<Result>;
119
+ /**
120
+ * Inicia un script shell (interpretado) y devuelve un `LiveProcess`
121
+ * para interactuar en vivo con su stdin/stdout/stderr.
122
+ *
123
+ * @param script - Script a iniciar.
124
+ * @returns El `LiveProcess` del script lanzado.
125
+ */
126
+ spawnScript(script: string): LiveProcess;
127
+ /**
128
+ * Ejecuta una serie de comandos en pipeline (stdout de uno al stdin del siguiente).
129
+ * Devuelve el resultado del último comando. Lanza `TypeError` si no se pasa
130
+ * ningún comando.
131
+ *
132
+ * @example
133
+ * const r = await sh.pipe("cat file.txt", "grep foo", "wc -l");
134
+ *
135
+ * @param scripts - Comandos a ejecutar en pipeline.
136
+ * @returns El resultado del último comando del pipeline.
137
+ * @throws {TypeError} Cuando `scripts` está vacío.
138
+ */
139
+ pipe(...scripts: string[]): Promise<Result>;
140
+ /**
141
+ * Ejecuta comandos secuencialmente. Se detiene al primer fallo
142
+ * y devuelve todos los resultados hasta ese punto.
143
+ *
144
+ * @example
145
+ * const results = await sh.chain("npm install", "npm run build", "npm test");
146
+ *
147
+ * @param scripts - Comandos a ejecutar en secuencia.
148
+ * @returns Resultados de cada comando ejecutado (hasta el primer fallo).
149
+ */
150
+ chain(...scripts: string[]): Promise<Result[]>;
151
+ /**
152
+ * Ejecuta `condition`; si termina OK, ejecuta `then`.
153
+ *
154
+ * @param condition - Comando condicional a evaluar.
155
+ * @param then - Comando a ejecutar si `condition` termina OK.
156
+ * @returns El resultado del segundo comando o `null` si no se ejecutó.
157
+ */
158
+ ifOk(condition: string, then: string): Promise<Result | null>;
159
+ /**
160
+ * Ejecuta `condition`; si termina con error, ejecuta `then`.
161
+ *
162
+ * @param condition - Comando condicional a evaluar.
163
+ * @param then - Comando a ejecutar si `condition` falla.
164
+ * @returns El resultado del segundo comando o `null` si no se ejecutó.
165
+ */
166
+ ifFail(condition: string, then: string): Promise<Result | null>;
167
+ /**
168
+ * Inicia un script en segundo plano y devuelve un `Job` registrado
169
+ * en la sesión con el `name` dado (o uno aleatorio) y la opción `autoRestart`.
170
+ * El job se elimina del registro automáticamente al terminar (si no se reinicia).
171
+ * Lanza `TypeError` si ya existe un job con el mismo nombre.
172
+ *
173
+ * @example
174
+ * const dev = sh.bg("npm run dev", { name: "dev" });
175
+ * dev.onOutput(chunk => process.stdout.write(chunk));
176
+ *
177
+ * // Más tarde
178
+ * sh.killAll();
179
+ *
180
+ * @example autoRestart
181
+ * const server = sh.bg("npm run serve", { name: "server", autoRestart: true });
182
+ * server.onRestart(job => console.log(`Restarted (${job.restartCount})`));
183
+ *
184
+ * @param script - Script a ejecutar en segundo plano.
185
+ * @param options - Opciones del job (`name`, `autoRestart`).
186
+ * @returns El `Job` registrado en la sesión.
187
+ * @throws {TypeError} Cuando ya existe un job con el `name` dado.
188
+ */
189
+ bg(script: string, options?: JobOptions): Job;
190
+ /** Mapa de jobs activos en la sesión, indexados por nombre (solo lectura). */
191
+ get jobs(): ReadonlyMap<string, Job>;
192
+ /** Lista de jobs actualmente en ejecución. */
193
+ get activeJobs(): readonly Job[];
194
+ /**
195
+ * Mata todos los jobs activos con la señal dada (por defecto `SIGTERM`).
196
+ *
197
+ * @param signal - Señal a enviar a cada job activo.
198
+ */
199
+ killAll(signal?: NodeJS.Signals): void;
200
+ /**
201
+ * Devuelve un job por nombre.
202
+ *
203
+ * @param name - Nombre del job a buscar.
204
+ * @returns El `Job` correspondiente, o `undefined` si no existe.
205
+ */
206
+ job(name: string): Job | undefined;
207
+ /**
208
+ * Comprueba si un comando existe en el PATH.
209
+ *
210
+ * @param command - Comando a buscar.
211
+ * @returns `true` si el comando existe.
212
+ */
213
+ exists(command: string): Promise<boolean>;
214
+ /**
215
+ * Devuelve la ruta completa del comando o `null` si no existe.
216
+ *
217
+ * @param command - Comando a resolver.
218
+ * @returns La ruta absoluta del comando, o `null` si no se encuentra.
219
+ */
220
+ which(command: string): Promise<string | null>;
221
+ /** Limpia el historial de comandos. */
222
+ clearHistory(): void;
223
+ /**
224
+ * Devuelve la última entrada del historial.
225
+ *
226
+ * @returns La última `HistoryItem`, o `undefined` si el historial está vacío.
227
+ */
228
+ lastCommand(): HistoryItem | undefined;
229
+ /**
230
+ * Construye las `ProcessOptions` base incluyendo `cwd` y `env` de la sesión.
231
+ *
232
+ * @param extra - Opciones adicionales que sobrescriben las de la sesión.
233
+ * @returns Las opciones de proceso combinadas.
234
+ */
235
+ private buildOptions;
236
+ /**
237
+ * Resuelve aliases en la primera palabra del script.
238
+ *
239
+ * @param script - Script original.
240
+ * @returns El script con el alias expandido (si aplica).
241
+ */
242
+ private resolveAliases;
243
+ /**
244
+ * Escapa un valor para interpolación segura en shell. Lanza `TypeError`
245
+ * si el valor es de un tipo no soportado (p. ej. objetos).
246
+ *
247
+ * @param value - Valor a quotear (string, number, boolean, array, null/undefined).
248
+ * @returns El valor quoteado como string seguro para shell.
249
+ * @throws {TypeError} Cuando el valor es de un tipo no soportado (p. ej. object).
250
+ */
251
+ private quote;
252
+ /**
253
+ * Registra una entrada en el historial.
254
+ *
255
+ * @param command - Comando ejecutado.
256
+ * @param startMs - Timestamp de inicio (ms desde epoch).
257
+ * @param result - Resultado de la ejecución.
258
+ */
259
+ private recordHistory;
260
+ /**
261
+ * Configura el watcher de `autoRestart` sobre un job: cuando el proceso
262
+ * termina (sin ser dispuesto), se lanza un reemplazo y se registra
263
+ * recursivamente para el siguiente reinicio.
264
+ *
265
+ * @param job - Job a vigilar.
266
+ * @param script - Script a re-ejecutar al reiniciar.
267
+ */
268
+ private watchAutoRestart;
269
+ /**
270
+ * Registra handlers de proceso (`exit`, `SIGINT`, `SIGTERM`) para matar
271
+ * los jobs huérfanos al salir. Solo se registra una vez por sesión.
272
+ */
273
+ private ensureCleanup;
274
+ }
275
+ //# sourceMappingURL=Shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shell.d.ts","sourceRoot":"","sources":["../../../src/core/shell/Shell.ts"],"names":[],"mappings":"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"}