@o/cli 0.0.0-bootstrap.0 → 0.16.14
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 +17 -0
- package/dist/args.d.ts +27 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +46 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/cmd.d.ts +32 -0
- package/dist/cmd.d.ts.map +1 -0
- package/dist/cmd.js +70 -0
- package/dist/cmd.js.map +1 -0
- package/dist/handle-process-exit.d.ts +14 -0
- package/dist/handle-process-exit.d.ts.map +1 -0
- package/dist/handle-process-exit.js +191 -0
- package/dist/handle-process-exit.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/process-state.d.ts +8 -0
- package/dist/process-state.d.ts.map +1 -0
- package/dist/process-state.js +17 -0
- package/dist/process-state.js.map +1 -0
- package/dist/resolve-script.d.ts +26 -0
- package/dist/resolve-script.d.ts.map +1 -0
- package/dist/resolve-script.js +193 -0
- package/dist/resolve-script.js.map +1 -0
- package/dist/run-all.d.ts +15 -0
- package/dist/run-all.d.ts.map +1 -0
- package/dist/run-all.js +405 -0
- package/dist/run-all.js.map +1 -0
- package/dist/run-pty.mjs +455 -0
- package/dist/run.d.ts +34 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +253 -0
- package/dist/run.js.map +1 -0
- package/package.json +40 -2
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @o/cli
|
|
2
|
+
|
|
3
|
+
Typed command definitions, subprocess execution, and process cleanup for project
|
|
4
|
+
tooling.
|
|
5
|
+
|
|
6
|
+
```ts
|
|
7
|
+
import { cmd, handleProcessExit, run } from '@o/cli'
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Run package scripts in parallel with the `o` binary:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
o run-all --flags=last api dev
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Add `--pty` for the interactive terminal supervisor and `--watch` to restart
|
|
17
|
+
failed children.
|
package/dist/args.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ultra simple typed arg parsing
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* const { port, verbose, rest } = args`--port number --verbose boolean`
|
|
6
|
+
* // port: number | undefined
|
|
7
|
+
* // verbose: boolean
|
|
8
|
+
* // rest: string[] - positional args that don't match any flag
|
|
9
|
+
*/
|
|
10
|
+
type ParseType<T extends string> = T extends 'number' ? number | undefined : T extends 'boolean' ? boolean : T extends 'string' ? string | undefined : never;
|
|
11
|
+
type ParseFlag<S extends string> = S extends `--${infer Name} ${infer Type}` ? {
|
|
12
|
+
[K in Name as KebabToCamel<K>]: ParseType<Type>;
|
|
13
|
+
} : S extends `-${infer Name} ${infer Type}` ? {
|
|
14
|
+
[K in Name as KebabToCamel<K>]: ParseType<Type>;
|
|
15
|
+
} : object;
|
|
16
|
+
type KebabToCamel<S extends string> = S extends `${infer A}-${infer B}` ? `${A}${Capitalize<KebabToCamel<B>>}` : S;
|
|
17
|
+
type Trim<S extends string> = S extends ` ${infer R}` ? Trim<R> : S extends `${infer R} ` ? Trim<R> : S extends `\n${infer R}` ? Trim<R> : S extends `${infer R}\n` ? Trim<R> : S;
|
|
18
|
+
type ParseFlags<S extends string> = Trim<S> extends `${infer Flag} --${infer Rest}` ? ParseFlag<Trim<Flag>> & ParseFlags<`--${Rest}`> : Trim<S> extends `${infer Flag}\n--${infer Rest}` ? ParseFlag<Trim<Flag>> & ParseFlags<`--${Rest}`> : Trim<S> extends `${infer Flag} -${infer Rest}` ? ParseFlag<Trim<Flag>> & ParseFlags<`-${Rest}`> : Trim<S> extends `${infer Flag}\n-${infer Rest}` ? ParseFlag<Trim<Flag>> & ParseFlags<`-${Rest}`> : ParseFlag<Trim<S>>;
|
|
19
|
+
type Prettify<T> = {
|
|
20
|
+
[K in keyof T]: T[K];
|
|
21
|
+
} & {};
|
|
22
|
+
export type Args<S extends string> = Prettify<ParseFlags<S> & {
|
|
23
|
+
rest: string[];
|
|
24
|
+
}>;
|
|
25
|
+
export declare function args<const S extends string>(spec: S): Args<S>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,QAAQ,GACjD,MAAM,GAAG,SAAS,GAClB,CAAC,SAAS,SAAS,GACjB,OAAO,GACP,CAAC,SAAS,QAAQ,GAChB,MAAM,GAAG,SAAS,GAClB,KAAK,CAAA;AAEb,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GACxE;KAAG,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;CAAE,GACnD,CAAC,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GACtC;KAAG,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;CAAE,GACnD,MAAM,CAAA;AAEZ,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GACnE,GAAG,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,GACpC,CAAC,CAAA;AAGL,KAAK,IAAI,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,GACjD,IAAI,CAAC,CAAC,CAAC,GACP,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GACrB,IAAI,CAAC,CAAC,CAAC,GACP,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,GACtB,IAAI,CAAC,CAAC,CAAC,GACP,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,GACtB,IAAI,CAAC,CAAC,CAAC,GACP,CAAC,CAAA;AAGX,KAAK,UAAU,CAAC,CAAC,SAAS,MAAM,IAC9B,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,EAAE,GAC3C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,GAC/C,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,IAAI,OAAO,MAAM,IAAI,EAAE,GAC9C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,GAC/C,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE,GAC5C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,GAC9C,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,EAAE,GAC7C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,GAC9C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAG9B,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAA;AAEhD,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAA;AAEjF,wBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA"}
|
package/dist/args.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ultra simple typed arg parsing
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* const { port, verbose, rest } = args`--port number --verbose boolean`
|
|
6
|
+
* // port: number | undefined
|
|
7
|
+
* // verbose: boolean
|
|
8
|
+
* // rest: string[] - positional args that don't match any flag
|
|
9
|
+
*/
|
|
10
|
+
export function args(strings) {
|
|
11
|
+
const spec = typeof strings === 'string' ? strings : strings[0] || '';
|
|
12
|
+
const argv = process.argv.slice(2);
|
|
13
|
+
// parse spec: "--port number --verbose boolean"
|
|
14
|
+
const schema = {};
|
|
15
|
+
const matches = spec.matchAll(/--?([a-z0-9-]+)\s+(string|number|boolean)/gi);
|
|
16
|
+
for (const [, flag, type] of matches) {
|
|
17
|
+
const camel = flag.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
|
|
18
|
+
schema[camel] = type;
|
|
19
|
+
}
|
|
20
|
+
const result = {};
|
|
21
|
+
const rest = [];
|
|
22
|
+
for (let i = 0; i < argv.length; i++) {
|
|
23
|
+
const arg = argv[i];
|
|
24
|
+
if (arg.startsWith('-')) {
|
|
25
|
+
const key = arg
|
|
26
|
+
.replace(/^--?/, '')
|
|
27
|
+
.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
|
|
28
|
+
const type = schema[key];
|
|
29
|
+
if (type === 'boolean') {
|
|
30
|
+
result[key] = true;
|
|
31
|
+
}
|
|
32
|
+
else if (type === 'string' || type === 'number') {
|
|
33
|
+
const val = argv[++i];
|
|
34
|
+
result[key] = type === 'number' ? Number(val) : val;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
rest.push(arg);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
rest.push(arg);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { ...result, rest };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiDH,MAAM,UAAU,IAAI,CAAyB,OAAiC;IAC5E,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACrE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAElC,gDAAgD;IAChD,MAAM,MAAM,GAAoD,EAAE,CAAA;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAA;IAE5E,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;QACtE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAuC,CAAA;IACzD,CAAC;IAED,MAAM,MAAM,GAA0D,EAAE,CAAA;IACxE,MAAM,IAAI,GAAa,EAAE,CAAA;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QAEpB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,GAAG;iBACZ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;YACrD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YAExB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;YACpB,CAAC;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YACrD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAa,CAAA;AACvC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { parseRunArgs, runParallelScripts } from './run-all.js';
|
|
5
|
+
async function main() {
|
|
6
|
+
const [command, ...args] = process.argv.slice(2);
|
|
7
|
+
if (command !== 'run-all') {
|
|
8
|
+
console.error('Usage: o run-all [--pty] [--watch] [--flags=last] <script...>');
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const usePty = args.includes('--pty');
|
|
13
|
+
const filteredArgs = args.filter((arg) => arg !== '--pty');
|
|
14
|
+
if (!usePty) {
|
|
15
|
+
await runParallelScripts(parseRunArgs(filteredArgs));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const scriptPath = fileURLToPath(new URL('./run-pty.mjs', import.meta.url));
|
|
19
|
+
const child = spawn(process.execPath, [scriptPath, ...filteredArgs], {
|
|
20
|
+
stdio: 'inherit',
|
|
21
|
+
shell: false,
|
|
22
|
+
});
|
|
23
|
+
const code = await new Promise((resolve) => {
|
|
24
|
+
child.on('exit', (exitCode) => resolve(exitCode ?? 0));
|
|
25
|
+
});
|
|
26
|
+
process.exitCode = code;
|
|
27
|
+
}
|
|
28
|
+
main().catch((error) => {
|
|
29
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,CAAA;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,kBAAkB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAA;QACpD,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC,EAAE;QACnE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,KAAK;KACb,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACjD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
|
package/dist/cmd.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
type Prettify<T> = {
|
|
2
|
+
[K in keyof T]: T[K];
|
|
3
|
+
} & {};
|
|
4
|
+
type CmdContext = {
|
|
5
|
+
$: typeof import('bun').$;
|
|
6
|
+
colors: typeof import('picocolors');
|
|
7
|
+
prompt: typeof import('@clack/prompts');
|
|
8
|
+
run: typeof import('./run.js').run;
|
|
9
|
+
fs: typeof import('node:fs');
|
|
10
|
+
path: typeof import('node:path');
|
|
11
|
+
os: typeof import('node:os');
|
|
12
|
+
};
|
|
13
|
+
type Args<S extends string> = import('./args.js').Args<S>;
|
|
14
|
+
type RunFn<S extends string> = (fn: (ctx: Prettify<{
|
|
15
|
+
args: Args<S>;
|
|
16
|
+
} & CmdContext>) => Promise<void> | void) => Promise<void>;
|
|
17
|
+
export declare function setInterceptCmd(fn: ((info: {
|
|
18
|
+
description: string;
|
|
19
|
+
args?: string;
|
|
20
|
+
}) => void) | undefined): void;
|
|
21
|
+
declare function createCmd(description: string): {
|
|
22
|
+
env(vars: Record<string, string>): /*elided*/ any;
|
|
23
|
+
args<const S extends string>(spec: S): {
|
|
24
|
+
env(vars: Record<string, string>): /*elided*/ any;
|
|
25
|
+
run: RunFn<S>;
|
|
26
|
+
};
|
|
27
|
+
run: RunFn<"">;
|
|
28
|
+
};
|
|
29
|
+
export declare function cmd(description: string): ReturnType<typeof createCmd>;
|
|
30
|
+
export declare function cmd(strings: TemplateStringsArray): ReturnType<typeof createCmd>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd.d.ts","sourceRoot":"","sources":["../src/cmd.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAA;AAEhD,KAAK,UAAU,GAAG;IAChB,CAAC,EAAE,cAAc,KAAK,EAAE,CAAC,CAAA;IACzB,MAAM,EAAE,cAAc,YAAY,CAAC,CAAA;IACnC,MAAM,EAAE,cAAc,gBAAgB,CAAC,CAAA;IACvC,GAAG,EAAE,cAAc,UAAU,EAAE,GAAG,CAAA;IAClC,EAAE,EAAE,cAAc,SAAS,CAAC,CAAA;IAC5B,IAAI,EAAE,cAAc,WAAW,CAAC,CAAA;IAChC,EAAE,EAAE,cAAc,SAAS,CAAC,CAAA;CAC7B,CAAA;AAED,KAAK,IAAI,CAAC,CAAC,SAAS,MAAM,IAAI,OAAO,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AAEzD,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM,IAAI,CAC7B,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;CAAE,GAAG,UAAU,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KACxE,OAAO,CAAC,IAAI,CAAC,CAAA;AAIlB,wBAAgB,eAAe,CAC7B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC,GAAG,SAAS,QAGzE;AAED,iBAAS,SAAS,CAAC,WAAW,EAAE,MAAM;cA6DxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;eAIrB,CAAC,SAAS,MAAM,QAAQ,CAAC;kBAbxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;EAmBrC;AAED,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA;AACtE,wBAAgB,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA"}
|
package/dist/cmd.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
let _interceptCmd;
|
|
2
|
+
export function setInterceptCmd(fn) {
|
|
3
|
+
_interceptCmd = fn;
|
|
4
|
+
}
|
|
5
|
+
function createCmd(description) {
|
|
6
|
+
let argsSpec;
|
|
7
|
+
let envVars = {};
|
|
8
|
+
function makeRun(spec) {
|
|
9
|
+
return async (fn) => {
|
|
10
|
+
if (_interceptCmd) {
|
|
11
|
+
_interceptCmd({ description, args: argsSpec });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const colors = (await import(`picocolors`)).default;
|
|
15
|
+
if (process.argv.includes(`--help`) || process.argv.includes(`-h`)) {
|
|
16
|
+
console.info();
|
|
17
|
+
console.info(colors.bold(description));
|
|
18
|
+
if (argsSpec) {
|
|
19
|
+
console.info();
|
|
20
|
+
const flags = [...argsSpec.matchAll(/--?([a-z-]+)\s+(string|number|boolean)/gi)];
|
|
21
|
+
for (const [, flag, type] of flags) {
|
|
22
|
+
console.info(` --${flag} ${colors.dim(type)}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
console.info();
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
// apply env vars before running
|
|
29
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
30
|
+
process.env[key] = value;
|
|
31
|
+
}
|
|
32
|
+
const [{ $ }, prompt, { run }, { args: parseArgs }, fs, path, os] = await Promise.all([
|
|
33
|
+
import(`bun`),
|
|
34
|
+
import(`@clack/prompts`),
|
|
35
|
+
import(`./run.js`),
|
|
36
|
+
import(`./args.js`),
|
|
37
|
+
import(`node:fs`),
|
|
38
|
+
import(`node:path`),
|
|
39
|
+
import(`node:os`),
|
|
40
|
+
]);
|
|
41
|
+
const args = spec ? parseArgs(spec) : { rest: [] };
|
|
42
|
+
await fn({ args, $, colors, prompt, run, fs, path, os });
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function makeChainable(spec) {
|
|
46
|
+
return {
|
|
47
|
+
env(vars) {
|
|
48
|
+
Object.assign(envVars, vars);
|
|
49
|
+
return this;
|
|
50
|
+
},
|
|
51
|
+
run: makeRun(spec),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
env(vars) {
|
|
56
|
+
Object.assign(envVars, vars);
|
|
57
|
+
return this;
|
|
58
|
+
},
|
|
59
|
+
args(spec) {
|
|
60
|
+
argsSpec = spec;
|
|
61
|
+
return makeChainable(spec);
|
|
62
|
+
},
|
|
63
|
+
run: makeRun(``),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function cmd(input) {
|
|
67
|
+
const description = typeof input === `string` ? input : input[0] || ``;
|
|
68
|
+
return createCmd(description);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=cmd.js.map
|
package/dist/cmd.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd.js","sourceRoot":"","sources":["../src/cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ProcessHandler } from './process-state.js';
|
|
2
|
+
type ExitCallback = (info: {
|
|
3
|
+
signal: string;
|
|
4
|
+
}) => void | Promise<void>;
|
|
5
|
+
interface HandleProcessExitReturn {
|
|
6
|
+
addChildProcess: ProcessHandler;
|
|
7
|
+
cleanup: () => Promise<void>;
|
|
8
|
+
exit: (code?: number) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare function handleProcessExit({ onExit, }?: {
|
|
11
|
+
onExit?: ExitCallback;
|
|
12
|
+
}): HandleProcessExitReturn;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=handle-process-exit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-process-exit.d.ts","sourceRoot":"","sources":["../src/handle-process-exit.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAA;AAE3B,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAEtE,UAAU,uBAAuB;IAC/B,eAAe,EAAE,cAAc,CAAA;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC;AA0ED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,GACP,GAAE;IACD,MAAM,CAAC,EAAE,YAAY,CAAA;CACjB,GAAG,uBAAuB,CAuI/B"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { appendFileSync, rmSync } from 'node:fs';
|
|
3
|
+
import { addProcessHandler, setExitCleanupState, } from './process-state.js';
|
|
4
|
+
const pidFilePath = `/tmp/o-run-${process.pid}.pids`;
|
|
5
|
+
function writePidFile(pid) {
|
|
6
|
+
try {
|
|
7
|
+
appendFileSync(pidFilePath, `${pid}\n`);
|
|
8
|
+
}
|
|
9
|
+
catch { }
|
|
10
|
+
}
|
|
11
|
+
function removePidFile() {
|
|
12
|
+
try {
|
|
13
|
+
rmSync(pidFilePath, { force: true });
|
|
14
|
+
}
|
|
15
|
+
catch { }
|
|
16
|
+
}
|
|
17
|
+
// find descendant pids that survived the group kill
|
|
18
|
+
// uses pgrep -P instead of ps (ps is a setuid binary blocked by sandbox-exec)
|
|
19
|
+
function findStragglers(trackedPids) {
|
|
20
|
+
try {
|
|
21
|
+
const descendants = new Set();
|
|
22
|
+
const queue = [...trackedPids];
|
|
23
|
+
while (queue.length > 0) {
|
|
24
|
+
const current = queue.pop();
|
|
25
|
+
try {
|
|
26
|
+
const output = execSync(`pgrep -P ${current}`, {
|
|
27
|
+
encoding: 'utf-8',
|
|
28
|
+
timeout: 2000,
|
|
29
|
+
});
|
|
30
|
+
for (const line of output.trim().split('\n')) {
|
|
31
|
+
const pid = parseInt(line, 10);
|
|
32
|
+
if (!isNaN(pid) && !descendants.has(pid)) {
|
|
33
|
+
descendants.add(pid);
|
|
34
|
+
queue.push(pid);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// pgrep exits 1 when no children found, that's fine
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return [...descendants];
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// kill entire process group to prevent orphaned descendants
|
|
49
|
+
function killProcess(pid, signal = 'SIGTERM', forceful = false) {
|
|
50
|
+
// kill process group first (negative pid), then direct process
|
|
51
|
+
try {
|
|
52
|
+
process.kill(-pid, signal);
|
|
53
|
+
}
|
|
54
|
+
catch (_) { }
|
|
55
|
+
try {
|
|
56
|
+
process.kill(pid, signal);
|
|
57
|
+
}
|
|
58
|
+
catch (_) { }
|
|
59
|
+
if (forceful && signal !== 'SIGKILL') {
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
try {
|
|
62
|
+
process.kill(-pid, 'SIGKILL');
|
|
63
|
+
}
|
|
64
|
+
catch (_) { }
|
|
65
|
+
try {
|
|
66
|
+
process.kill(pid, 'SIGKILL');
|
|
67
|
+
}
|
|
68
|
+
catch (_) { }
|
|
69
|
+
}, 100);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
let isHandling = false;
|
|
73
|
+
export function handleProcessExit({ onExit, } = {}) {
|
|
74
|
+
if (isHandling) {
|
|
75
|
+
throw new Error(`Only one handleProcessExit per process should be registered!`);
|
|
76
|
+
}
|
|
77
|
+
isHandling = true;
|
|
78
|
+
const processes = [];
|
|
79
|
+
let cleanupPromise = null;
|
|
80
|
+
const cleanup = (signal = 'SIGTERM') => {
|
|
81
|
+
// return existing cleanup promise if already running, so process.exit
|
|
82
|
+
// override waits for the real cleanup instead of exiting early
|
|
83
|
+
if (cleanupPromise)
|
|
84
|
+
return cleanupPromise;
|
|
85
|
+
cleanupPromise = doCleanup(signal);
|
|
86
|
+
return cleanupPromise;
|
|
87
|
+
};
|
|
88
|
+
const doCleanup = async (signal) => {
|
|
89
|
+
setExitCleanupState(true);
|
|
90
|
+
if (onExit) {
|
|
91
|
+
try {
|
|
92
|
+
await onExit({ signal });
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('Error in exit callback:', error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (processes.length === 0) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const isInterrupt = signal === 'SIGINT';
|
|
102
|
+
const killSignal = isInterrupt ? 'SIGTERM' : signal;
|
|
103
|
+
for (const proc of processes) {
|
|
104
|
+
if (proc.pid) {
|
|
105
|
+
killProcess(proc.pid, killSignal, isInterrupt);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// brief wait for graceful shutdown
|
|
109
|
+
await new Promise((res) => setTimeout(res, isInterrupt ? 80 : 200));
|
|
110
|
+
// force kill any remaining
|
|
111
|
+
for (const proc of processes) {
|
|
112
|
+
if (proc.pid && !proc.exitCode) {
|
|
113
|
+
killProcess(proc.pid, 'SIGKILL');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// straggler walk: find any descendants that survived the group kill
|
|
117
|
+
const trackedPids = processes.map((p) => p.pid).filter(Boolean);
|
|
118
|
+
if (trackedPids.length > 0) {
|
|
119
|
+
const stragglers = findStragglers(trackedPids);
|
|
120
|
+
for (const pid of stragglers) {
|
|
121
|
+
try {
|
|
122
|
+
process.kill(pid, 'SIGKILL');
|
|
123
|
+
}
|
|
124
|
+
catch { }
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
removePidFile();
|
|
128
|
+
};
|
|
129
|
+
const addChildProcess = (proc) => {
|
|
130
|
+
processes.push(proc);
|
|
131
|
+
if (proc.pid)
|
|
132
|
+
writePidFile(proc.pid);
|
|
133
|
+
};
|
|
134
|
+
addProcessHandler(addChildProcess);
|
|
135
|
+
let finalized = false;
|
|
136
|
+
const finalizeWithSignal = (signal, fallbackCode) => {
|
|
137
|
+
if (finalized)
|
|
138
|
+
return;
|
|
139
|
+
finalized = true;
|
|
140
|
+
process.off('SIGINT', sigintHandler);
|
|
141
|
+
process.off('SIGTERM', sigtermHandler);
|
|
142
|
+
process.off('SIGHUP', sighupHandler);
|
|
143
|
+
process.off('beforeExit', beforeExitHandler);
|
|
144
|
+
process.exit = originalExit;
|
|
145
|
+
try {
|
|
146
|
+
process.kill(process.pid, signal);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
originalExit(fallbackCode);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const sigtermHandler = () => {
|
|
153
|
+
cleanup('SIGTERM').then(() => {
|
|
154
|
+
finalizeWithSignal('SIGTERM', 143);
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
const sigintHandler = () => {
|
|
158
|
+
cleanup('SIGINT').then(() => {
|
|
159
|
+
finalizeWithSignal('SIGINT', 130);
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
const sighupHandler = () => {
|
|
163
|
+
cleanup('SIGHUP').then(() => {
|
|
164
|
+
finalizeWithSignal('SIGHUP', 129);
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
// intercept process.exit to ensure cleanup completes before exiting.
|
|
168
|
+
// if cleanup is already running, this awaits the SAME promise instead of
|
|
169
|
+
// early-returning and calling originalExit prematurely.
|
|
170
|
+
const originalExit = process.exit;
|
|
171
|
+
process.exit = ((code) => {
|
|
172
|
+
cleanup('SIGTERM').then(() => {
|
|
173
|
+
originalExit(code);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
const beforeExitHandler = () => cleanup('SIGTERM');
|
|
177
|
+
process.on('beforeExit', beforeExitHandler);
|
|
178
|
+
process.on('SIGINT', sigintHandler);
|
|
179
|
+
process.on('SIGTERM', sigtermHandler);
|
|
180
|
+
process.on('SIGHUP', sighupHandler);
|
|
181
|
+
const exit = async (code = 0) => {
|
|
182
|
+
await cleanup('SIGTERM');
|
|
183
|
+
process.exit(code);
|
|
184
|
+
};
|
|
185
|
+
return {
|
|
186
|
+
addChildProcess,
|
|
187
|
+
cleanup,
|
|
188
|
+
exit,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=handle-process-exit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-process-exit.js","sourceRoot":"","sources":["../src/handle-process-exit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
export type ProcessType = ChildProcess;
|
|
3
|
+
export type ProcessHandler = (process: ProcessType) => void;
|
|
4
|
+
export declare function setExitCleanupState(state: boolean): void;
|
|
5
|
+
export declare function getIsExiting(): boolean;
|
|
6
|
+
export declare const addProcessHandler: (cb: ProcessHandler) => void;
|
|
7
|
+
export declare function notifyProcessHandlers(proc: ProcessType): void;
|
|
8
|
+
//# sourceMappingURL=process-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-state.d.ts","sourceRoot":"","sources":["../src/process-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAA;AACtC,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;AAK3D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,QAEjD;AAED,wBAAgB,YAAY,YAE3B;AAKD,eAAO,MAAM,iBAAiB,GAAI,IAAI,cAAc,SAEnD,CAAA;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,QAEtD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// shared state: tracks if we're in cleanup (another process failed)
|
|
2
|
+
let isInExitCleanup = false;
|
|
3
|
+
export function setExitCleanupState(state) {
|
|
4
|
+
isInExitCleanup = state;
|
|
5
|
+
}
|
|
6
|
+
export function getIsExiting() {
|
|
7
|
+
return isInExitCleanup;
|
|
8
|
+
}
|
|
9
|
+
// handlers called when any process is spawned via run()
|
|
10
|
+
const processHandlers = new Set();
|
|
11
|
+
export const addProcessHandler = (cb) => {
|
|
12
|
+
processHandlers.add(cb);
|
|
13
|
+
};
|
|
14
|
+
export function notifyProcessHandlers(proc) {
|
|
15
|
+
processHandlers.forEach((cb) => cb(proc));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=process-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-state.js","sourceRoot":"","sources":["../src/process-state.ts"],"names":[],"mappings":"AAKA,oEAAoE;AACpE,IAAI,eAAe,GAAG,KAAK,CAAA;AAE3B,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,eAAe,GAAG,KAAK,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,wDAAwD;AACxD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAA;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAkB,EAAE,EAAE;IACtD,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAiB;IACrD,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface FlattenedScript {
|
|
2
|
+
name: string;
|
|
3
|
+
command: string;
|
|
4
|
+
/** true when the script name doesn't exist in package.json */
|
|
5
|
+
isRaw: boolean;
|
|
6
|
+
/** scripts to spawn in parallel after command completes successfully */
|
|
7
|
+
deferredScripts?: FlattenedScript[];
|
|
8
|
+
}
|
|
9
|
+
export interface FlattenOptions {
|
|
10
|
+
/** scripts already running (from BUN_RUN_SCRIPTS), will be filtered out */
|
|
11
|
+
runningScripts?: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* split a shell command on &&, ||, ; while respecting quotes.
|
|
15
|
+
* returns null if no operators found (command is not a compound).
|
|
16
|
+
*/
|
|
17
|
+
export declare function splitCompound(command: string): {
|
|
18
|
+
segments: string[];
|
|
19
|
+
operators: string[];
|
|
20
|
+
} | null;
|
|
21
|
+
/**
|
|
22
|
+
* recursively flatten script references into leaf commands.
|
|
23
|
+
* resolves o run-all chains AND shell compounds (&&, ;, ||).
|
|
24
|
+
*/
|
|
25
|
+
export declare function flattenScripts(commands: string[], packageJsonScripts: Record<string, string>, options?: FlattenOptions): FlattenedScript[];
|
|
26
|
+
//# sourceMappingURL=resolve-script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-script.d.ts","sourceRoot":"","sources":["../src/resolve-script.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAA;IACd,wEAAwE;IACxE,eAAe,CAAC,EAAE,eAAe,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AA8BD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAmDpD;AAkBD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAAE,EAClB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,OAAO,CAAC,EAAE,cAAc,GACvB,eAAe,EAAE,CAkGnB"}
|