@substrat-run/cli 0.49.7 → 0.50.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/README.md +8 -0
- package/dist/changeset.d.ts.map +1 -1
- package/dist/changeset.js +19 -6
- package/dist/changeset.js.map +1 -1
- package/dist/cli.js +96 -28
- package/dist/cli.js.map +1 -1
- package/dist/data-loss-check.d.ts.map +1 -1
- package/dist/data-loss-check.js +11 -1
- package/dist/data-loss-check.js.map +1 -1
- package/dist/dev-preload.d.ts +2 -0
- package/dist/dev-preload.d.ts.map +1 -0
- package/dist/dev-preload.js +32 -0
- package/dist/dev-preload.js.map +1 -0
- package/dist/dev-traces.d.ts +16 -0
- package/dist/dev-traces.d.ts.map +1 -0
- package/dist/dev-traces.js +188 -0
- package/dist/dev-traces.js.map +1 -0
- package/dist/dev.d.ts +6 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +65 -0
- package/dist/dev.js.map +1 -0
- package/dist/doctor.d.ts +34 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +89 -0
- package/dist/doctor.js.map +1 -0
- package/dist/login.d.ts +12 -0
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +22 -3
- package/dist/login.js.map +1 -1
- package/dist/outbound-scan.d.ts +1 -1
- package/dist/outbound-scan.d.ts.map +1 -1
- package/dist/outbound-scan.js +6 -4
- package/dist/outbound-scan.js.map +1 -1
- package/dist/promote.d.ts +2 -1
- package/dist/promote.d.ts.map +1 -1
- package/dist/promote.js +4 -3
- package/dist/promote.js.map +1 -1
- package/dist/prompt.d.ts +21 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +39 -0
- package/dist/prompt.js.map +1 -0
- package/dist/push.d.ts +38 -1
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +267 -111
- package/dist/push.js.map +1 -1
- package/dist/store-driver.d.ts.map +1 -1
- package/dist/store-driver.js +5 -3
- package/dist/store-driver.js.map +1 -1
- package/dist/worker-node-imports.d.ts.map +1 -1
- package/dist/worker-node-imports.js +2 -1
- package/dist/worker-node-imports.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-loss-check.d.ts","sourceRoot":"","sources":["../src/data-loss-check.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAK/E;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AA2BN,KAAK,WAAW,GACZ,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAK5F;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACtE,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"data-loss-check.d.ts","sourceRoot":"","sources":["../src/data-loss-check.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAK/E;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AA2BN,KAAK,WAAW,GACZ,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAK5F;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACtE,OAAO,CAAC,WAAW,CAAC,CAkFtB;AAOD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAoB,GAC9C,OAAO,CAUT;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAYhE;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE;IACJ,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CACxB,GACL,OAAO,CAAC,aAAa,CAAC,CAuBxB"}
|
package/dist/data-loss-check.js
CHANGED
|
@@ -58,6 +58,7 @@ const CHILD = fileURLToPath(new URL('./data-loss-replay-child.js', import.meta.u
|
|
|
58
58
|
*/
|
|
59
59
|
export function replayInChild(request, opts = {}) {
|
|
60
60
|
const timeoutMs = opts.timeoutMs ?? MIGRATION_TIMEOUT_MS;
|
|
61
|
+
const spawnedAt = Date.now();
|
|
61
62
|
// The child's stderr is kept, never forwarded: node's notice that `node:sqlite` is experimental
|
|
62
63
|
// stays out of the push log, and only a process that dies without answering is shown it.
|
|
63
64
|
const child = spawn(process.execPath, [opts.childPath ?? CHILD], {
|
|
@@ -127,7 +128,16 @@ export function replayInChild(request, opts = {}) {
|
|
|
127
128
|
});
|
|
128
129
|
child.on('error', (e) => settle({ kind: 'error', message: e.message }));
|
|
129
130
|
// `close`, not `exit`: it fires once stdout has drained, so a last `done` line is never lost.
|
|
130
|
-
|
|
131
|
+
// Past the deadline, the child's watchdog is what ended it — said in words, because how it
|
|
132
|
+
// ended does not say so everywhere: SIGKILL on POSIX, but `exit 1` on Windows, which has no
|
|
133
|
+
// signals. The child's clock starts after the parent's, so its deadline is never early here.
|
|
134
|
+
child.on('close', (code, signal) => {
|
|
135
|
+
const deadline = Date.now() - spawnedAt >= request.deadlineMs ? `, past its hard deadline of ${request.deadlineMs / 1000} s` : '';
|
|
136
|
+
settle({
|
|
137
|
+
kind: 'error',
|
|
138
|
+
message: `the replay process ended (${signal ?? `exit ${code}`}) without an answer${deadline}${stderr ? `: ${stderr.trim()}` : ''}`,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
131
141
|
arm();
|
|
132
142
|
child.stdin.on('error', () => { });
|
|
133
143
|
child.stdin.end(JSON.stringify(request));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-loss-check.js","sourceRoot":"","sources":["../src/data-loss-check.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data-loss-check.js","sourceRoot":"","sources":["../src/data-loss-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-preload.d.ts","sourceRoot":"","sources":["../src/dev-preload.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Installed only by `substrat dev` in the project's local process tree. */
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { TRACE_SINK_KEY } from '@substrat-run/contracts/trace-sink';
|
|
4
|
+
import { createDevTraceSink, LocalTraceStore, traceLine } from './dev-traces.js';
|
|
5
|
+
function warn(error) {
|
|
6
|
+
if (process.env.SUBSTRAT_DEV_TRACE_WARNED)
|
|
7
|
+
return;
|
|
8
|
+
process.env.SUBSTRAT_DEV_TRACE_WARNED = '1';
|
|
9
|
+
process.stderr.write(`warning: local request traces unavailable: ${String(error)}\n`);
|
|
10
|
+
}
|
|
11
|
+
const project = process.env.SUBSTRAT_DEV_TRACE_DIR;
|
|
12
|
+
if (project) {
|
|
13
|
+
try {
|
|
14
|
+
const store = new LocalTraceStore(join(project, '.data', 'substrat-traces'));
|
|
15
|
+
const sink = createDevTraceSink(store, (trace) => process.stderr.write(`${traceLine(trace)}\n`));
|
|
16
|
+
globalThis[TRACE_SINK_KEY] = {
|
|
17
|
+
...sink,
|
|
18
|
+
end(id) {
|
|
19
|
+
try {
|
|
20
|
+
sink.end(id);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
warn(error);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
warn(error);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=dev-preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-preload.js","sourceRoot":"","sources":["../src/dev-preload.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjF,SAAS,IAAI,CAAC,KAAc;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAAE,OAAO;IAClD,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AACnD,IAAI,OAAO,EAAE,CAAC;IACZ,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,UAAsC,CAAC,cAAc,CAAC,GAAG;YACxD,GAAG,IAAI;YACP,GAAG,CAAC,EAAU;gBACZ,IAAI,CAAC;oBACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,CAAC,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RequestTrace, type TraceSink } from '@substrat-run/contracts';
|
|
2
|
+
/** A file per completed request lets watch restarts write concurrently without a shared index. */
|
|
3
|
+
export declare class LocalTraceStore {
|
|
4
|
+
readonly dir: string;
|
|
5
|
+
private readonly maxRequests;
|
|
6
|
+
private readonly maxBytes;
|
|
7
|
+
constructor(dir: string, maxRequests?: number, maxBytes?: number);
|
|
8
|
+
write(trace: RequestTrace): void;
|
|
9
|
+
/** Newest first; malformed/incomplete files cannot break a trace read. */
|
|
10
|
+
traces(): RequestTrace[];
|
|
11
|
+
private prune;
|
|
12
|
+
}
|
|
13
|
+
/** The existing host hooks send patches and steps; only this dev process assembles them. */
|
|
14
|
+
export declare function createDevTraceSink(store: LocalTraceStore, line: (trace: RequestTrace) => void): TraceSink;
|
|
15
|
+
export declare function traceLine(trace: RequestTrace): string;
|
|
16
|
+
//# sourceMappingURL=dev-traces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-traces.d.ts","sourceRoot":"","sources":["../src/dev-traces.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,YAAY,EAGjB,KAAK,SAAS,EAEf,MAAM,yBAAyB,CAAC;AAKjC,kGAAkG;AAClG,qBAAa,eAAe;IAExB,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAH3B,YACW,GAAG,EAAE,MAAM,EACH,WAAW,SAAqB,EAChC,QAAQ,SAAkB,EACzC;IAEJ,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAuB/B;IAED,0EAA0E;IAC1E,MAAM,IAAI,YAAY,EAAE,CAkBvB;IAED,OAAO,CAAC,KAAK;CA0Bd;AAYD,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,SAAS,CAoEzG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAWrD"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/** Local, bounded request traces for `substrat dev` (#2358). */
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { requestTrace, TRACE_STEP_CAP, } from '@substrat-run/contracts';
|
|
6
|
+
const TRACE_MAX_REQUESTS = 256;
|
|
7
|
+
const TRACE_MAX_BYTES = 8 * 1024 * 1024;
|
|
8
|
+
/** A file per completed request lets watch restarts write concurrently without a shared index. */
|
|
9
|
+
export class LocalTraceStore {
|
|
10
|
+
dir;
|
|
11
|
+
maxRequests;
|
|
12
|
+
maxBytes;
|
|
13
|
+
constructor(dir, maxRequests = TRACE_MAX_REQUESTS, maxBytes = TRACE_MAX_BYTES) {
|
|
14
|
+
this.dir = dir;
|
|
15
|
+
this.maxRequests = maxRequests;
|
|
16
|
+
this.maxBytes = maxBytes;
|
|
17
|
+
}
|
|
18
|
+
write(trace) {
|
|
19
|
+
mkdirSync(this.dir, { recursive: true });
|
|
20
|
+
const name = `${Date.now().toString().padStart(13, '0')}-${process.hrtime.bigint().toString().padStart(20, '0')}-${process.pid}-${randomUUID()}.json`;
|
|
21
|
+
const target = join(this.dir, name);
|
|
22
|
+
const temporary = join(this.dir, `.${name}.tmp`);
|
|
23
|
+
let data = JSON.stringify(trace);
|
|
24
|
+
if (Buffer.byteLength(data) > this.maxBytes) {
|
|
25
|
+
// One verbose request still gets a record. Its head survives and the omitted steps
|
|
26
|
+
// are explicit, so the buffer never grows past its byte budget for one request.
|
|
27
|
+
data = JSON.stringify({
|
|
28
|
+
...trace,
|
|
29
|
+
steps: [],
|
|
30
|
+
capture: { ...trace.capture, stepsDropped: trace.capture.stepsDropped + trace.steps.length },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (Buffer.byteLength(data) > this.maxBytes)
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
writeFileSync(temporary, data);
|
|
37
|
+
renameSync(temporary, target);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
rmSync(temporary, { force: true });
|
|
41
|
+
}
|
|
42
|
+
this.prune();
|
|
43
|
+
}
|
|
44
|
+
/** Newest first; malformed/incomplete files cannot break a trace read. */
|
|
45
|
+
traces() {
|
|
46
|
+
let names;
|
|
47
|
+
try {
|
|
48
|
+
names = readdirSync(this.dir).filter((name) => name.endsWith('.json')).sort().reverse();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (missing(error))
|
|
52
|
+
return [];
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
const traces = [];
|
|
56
|
+
for (const name of names) {
|
|
57
|
+
try {
|
|
58
|
+
const parsed = requestTrace.safeParse(JSON.parse(readFileSync(join(this.dir, name), 'utf8')));
|
|
59
|
+
if (parsed.success)
|
|
60
|
+
traces.push(parsed.data);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (!missing(error) && !(error instanceof SyntaxError))
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return traces;
|
|
68
|
+
}
|
|
69
|
+
prune() {
|
|
70
|
+
// Each writer publishes before listing. Of two concurrent writers, the one that publishes
|
|
71
|
+
// last sees both files and restores the bound; a concurrent unlink is harmless.
|
|
72
|
+
const files = readdirSync(this.dir).filter((name) => name.endsWith('.json')).sort();
|
|
73
|
+
let bytes = 0;
|
|
74
|
+
const sizes = files.map((name) => {
|
|
75
|
+
try {
|
|
76
|
+
const size = statSync(join(this.dir, name)).size;
|
|
77
|
+
bytes += size;
|
|
78
|
+
return size;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (missing(error))
|
|
82
|
+
return 0;
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
let count = files.length;
|
|
87
|
+
for (let i = 0; (count > this.maxRequests || bytes > this.maxBytes) && i < files.length; i++) {
|
|
88
|
+
try {
|
|
89
|
+
rmSync(join(this.dir, files[i]));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (!missing(error))
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
count--;
|
|
96
|
+
bytes -= sizes[i];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function missing(error) {
|
|
101
|
+
return error.code === 'ENOENT';
|
|
102
|
+
}
|
|
103
|
+
/** The existing host hooks send patches and steps; only this dev process assembles them. */
|
|
104
|
+
export function createDevTraceSink(store, line) {
|
|
105
|
+
const pending = new Map();
|
|
106
|
+
const forId = (id) => {
|
|
107
|
+
let record = pending.get(id);
|
|
108
|
+
if (!record) {
|
|
109
|
+
record = { head: { invocationId: id }, steps: [], stepsDropped: 0 };
|
|
110
|
+
pending.set(id, record);
|
|
111
|
+
}
|
|
112
|
+
return record;
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
capture: { sqlParams: false },
|
|
116
|
+
head(id, patch) {
|
|
117
|
+
const record = forId(id);
|
|
118
|
+
const { stepsDropped = 0, ...head } = patch;
|
|
119
|
+
record.stepsDropped += stepsDropped;
|
|
120
|
+
for (const [key, value] of Object.entries(head)) {
|
|
121
|
+
if (value !== undefined)
|
|
122
|
+
record.head[key] = value;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
step(id, step) {
|
|
126
|
+
const record = forId(id);
|
|
127
|
+
if (record.steps.length >= TRACE_STEP_CAP) {
|
|
128
|
+
record.stepsDropped++;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Never persist bound SQL values even if a caller ignored `capture.sqlParams`.
|
|
132
|
+
if (step.type === 'sql') {
|
|
133
|
+
const { params: _params, ...withoutParams } = step;
|
|
134
|
+
record.steps.push(withoutParams);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
record.steps.push(step);
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
end(id) {
|
|
141
|
+
const record = pending.get(id);
|
|
142
|
+
pending.delete(id);
|
|
143
|
+
if (!record)
|
|
144
|
+
return;
|
|
145
|
+
const trace = requestTrace.parse({
|
|
146
|
+
invocationId: id,
|
|
147
|
+
startedAt: new Date().toISOString(),
|
|
148
|
+
tenantId: '',
|
|
149
|
+
scopeId: null,
|
|
150
|
+
vertical: null,
|
|
151
|
+
surface: null,
|
|
152
|
+
method: null,
|
|
153
|
+
path: null,
|
|
154
|
+
status: null,
|
|
155
|
+
threw: false,
|
|
156
|
+
durationMs: 0,
|
|
157
|
+
level: 'info',
|
|
158
|
+
operation: null,
|
|
159
|
+
problemCode: null,
|
|
160
|
+
principalKind: null,
|
|
161
|
+
principal: null,
|
|
162
|
+
eventCount: null,
|
|
163
|
+
eventTypes: [],
|
|
164
|
+
entities: [],
|
|
165
|
+
versionId: null,
|
|
166
|
+
specVersion: null,
|
|
167
|
+
...record.head,
|
|
168
|
+
steps: record.steps,
|
|
169
|
+
capture: { sqlParams: false, stepsDropped: record.stepsDropped },
|
|
170
|
+
});
|
|
171
|
+
store.write(trace);
|
|
172
|
+
line(trace);
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
export function traceLine(trace) {
|
|
177
|
+
const principal = typeof trace.principal === 'string'
|
|
178
|
+
? trace.principal
|
|
179
|
+
: trace.principal ? Object.values(trace.principal).join(':') : trace.principalKind ?? '-';
|
|
180
|
+
const check = [...trace.steps].reverse().find((step) => step.type === 'check');
|
|
181
|
+
const rule = check?.type === 'check'
|
|
182
|
+
? check.allowed
|
|
183
|
+
? `allowed by ${check.decidedBy ?? '-'}`
|
|
184
|
+
: `requires ${check.requires.join(',') || '-'}; caller has ${check.callerHas.join(',') || '-'}`
|
|
185
|
+
: '-';
|
|
186
|
+
return `[substrat trace] ${trace.invocationId} ${trace.operation ?? '-'} ${principal} ${trace.status ?? '-'} ${trace.durationMs}ms ${trace.problemCode ?? '-'} ${rule}`;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=dev-traces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-traces.js","sourceRoot":"","sources":["../src/dev-traces.ts"],"names":[],"mappings":"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"}
|
package/dist/dev.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,GAAG,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDnE"}
|
package/dist/dev.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Transparent local dev-script wrapper with an optional request-trace preload. */
|
|
2
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
3
|
+
import { constants } from 'node:os';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
export async function dev(options = {}) {
|
|
6
|
+
const project = resolve(options.dir ?? '.');
|
|
7
|
+
const env = { ...process.env };
|
|
8
|
+
if (options.trace !== false) {
|
|
9
|
+
delete env.SUBSTRAT_DEV_TRACE_WARNED;
|
|
10
|
+
// A missing/broken CLI preload must not stop the project's own dev script. The tiny
|
|
11
|
+
// data-URL module catches its dynamic import error before Node loads the script.
|
|
12
|
+
const preload = new URL('./dev-preload.js', import.meta.url).href;
|
|
13
|
+
const source = `try{await import(${JSON.stringify(preload)})}catch(error){if(!process.env.SUBSTRAT_DEV_TRACE_WARNED){process.env.SUBSTRAT_DEV_TRACE_WARNED='1';process.stderr.write('warning: local request traces unavailable: '+String(error)+'\\n')}}`;
|
|
14
|
+
const option = `--import=data:text/javascript;base64,${Buffer.from(source).toString('base64')}`;
|
|
15
|
+
env.NODE_OPTIONS = env.NODE_OPTIONS ? `${env.NODE_OPTIONS} ${option}` : option;
|
|
16
|
+
env.SUBSTRAT_DEV_TRACE_DIR = project;
|
|
17
|
+
}
|
|
18
|
+
// Give the script and its subprocesses one group. A dev script commonly runs through
|
|
19
|
+
// pnpm -> concurrently -> tsx watch; signaling pnpm alone leaves the watcher alive.
|
|
20
|
+
const windows = process.platform === 'win32';
|
|
21
|
+
const grouped = !windows;
|
|
22
|
+
// Windows installs pnpm as a .cmd shim. Only this fixed command goes through
|
|
23
|
+
// cmd.exe: the project path stays in cwd and never becomes shell input.
|
|
24
|
+
const child = spawn(windows ? 'pnpm run dev' : 'pnpm', windows ? [] : ['run', 'dev'], {
|
|
25
|
+
cwd: project, env, stdio: 'inherit', detached: grouped, shell: windows,
|
|
26
|
+
});
|
|
27
|
+
const forward = (signal) => {
|
|
28
|
+
try {
|
|
29
|
+
if (windows && child.pid) {
|
|
30
|
+
// Killing cmd.exe alone leaves pnpm's watcher and server alive. Windows has
|
|
31
|
+
// no POSIX process-group signals, so stop the whole tree before returning.
|
|
32
|
+
execFileSync('taskkill.exe', ['/pid', String(child.pid), '/T', '/F'], {
|
|
33
|
+
stdio: 'ignore', windowsHide: true,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else if (grouped && child.pid)
|
|
37
|
+
process.kill(-child.pid, signal);
|
|
38
|
+
else
|
|
39
|
+
child.kill(signal);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* the dev script already exited */
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const onInt = () => forward('SIGINT');
|
|
46
|
+
const onTerm = () => forward('SIGTERM');
|
|
47
|
+
process.on('SIGINT', onInt);
|
|
48
|
+
process.on('SIGTERM', onTerm);
|
|
49
|
+
try {
|
|
50
|
+
return await new Promise((done) => {
|
|
51
|
+
child.once('error', (error) => {
|
|
52
|
+
process.stderr.write(`error: could not run dev script: ${error.message}\n`);
|
|
53
|
+
done(127);
|
|
54
|
+
});
|
|
55
|
+
child.once('exit', (code, signal) => {
|
|
56
|
+
done(code ?? (signal ? 128 + (constants.signals[signal] ?? 1) : 1));
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
process.off('SIGINT', onInt);
|
|
62
|
+
process.off('SIGTERM', onTerm);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=dev.js.map
|
package/dist/dev.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `substrat doctor [dir] [--fix]`: is this machine and project ready to build and push?
|
|
3
|
+
*
|
|
4
|
+
* It reads, and changes nothing, unless `--fix` is given. The one thing `--fix` changes is
|
|
5
|
+
* Windows' long-path setting, because that is the one a person cannot be expected to know
|
|
6
|
+
* about: a vertical's `node_modules` holds files deeper than Windows' old 260-character limit,
|
|
7
|
+
* and with the setting off, programs built to go past it (PowerShell, Python, many installers)
|
|
8
|
+
* still stop there. Node goes past it either way; cmd.exe and Explorer never do, and git has its
|
|
9
|
+
* own `core.longpaths`. The setting is machine-wide and needs an administrator, so `--fix` asks Windows to run
|
|
10
|
+
* the one registry write elevated: the person sees Windows' own "allow this app" prompt, once.
|
|
11
|
+
*/
|
|
12
|
+
/** What the system calls are, so a test can stand in for the registry and the elevation. */
|
|
13
|
+
export interface DoctorSystem {
|
|
14
|
+
platform: NodeJS.Platform;
|
|
15
|
+
nodeVersion: string;
|
|
16
|
+
/** `reg query` of the long-path value: its stdout, or `undefined` when the value is absent. */
|
|
17
|
+
queryLongPaths: () => string | undefined;
|
|
18
|
+
/** Run the elevated registry write; throws when it did not run (the prompt was declined). */
|
|
19
|
+
elevateLongPaths: () => void;
|
|
20
|
+
}
|
|
21
|
+
/** Every argument is a constant: nothing a person or a project supplies reaches the shell. */
|
|
22
|
+
export declare const ELEVATE_LONG_PATHS_SCRIPT: string;
|
|
23
|
+
export declare const realSystem: () => DoctorSystem;
|
|
24
|
+
/** On, off, or (not Windows) not a question at all. */
|
|
25
|
+
export declare function parseLongPaths(stdout: string | undefined): boolean;
|
|
26
|
+
export interface DoctorResult {
|
|
27
|
+
lines: string[];
|
|
28
|
+
/** How many checks still fail. A non-zero count is a non-zero exit. */
|
|
29
|
+
problems: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function doctor(dir: string, opts?: {
|
|
32
|
+
fix?: boolean;
|
|
33
|
+
}, sys?: DoctorSystem): DoctorResult;
|
|
34
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AAEH,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,6FAA6F;IAC7F,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAID,8FAA8F;AAC9F,eAAO,MAAM,yBAAyB,QAE8C,CAAC;AAErF,eAAO,MAAM,UAAU,QAAO,YAoB5B,CAAC;AAEH,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGlE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,EAAE,GAAG,GAAE,YAA2B,GAAG,YAAY,CAiDhH"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { resolveWrangler } from './push.js';
|
|
5
|
+
const FILESYSTEM_KEY = 'HKLM\\SYSTEM\\CurrentControlSet\\Control\\FileSystem';
|
|
6
|
+
/** Every argument is a constant: nothing a person or a project supplies reaches the shell. */
|
|
7
|
+
export const ELEVATE_LONG_PATHS_SCRIPT = "Start-Process -FilePath reg.exe -Verb RunAs -Wait -WindowStyle Hidden -ArgumentList " +
|
|
8
|
+
`'add','${FILESYSTEM_KEY}','/v','LongPathsEnabled','/t','REG_DWORD','/d','1','/f'`;
|
|
9
|
+
export const realSystem = () => ({
|
|
10
|
+
platform: process.platform,
|
|
11
|
+
nodeVersion: process.versions.node,
|
|
12
|
+
queryLongPaths: () => {
|
|
13
|
+
try {
|
|
14
|
+
return execFileSync('reg.exe', ['query', FILESYSTEM_KEY, '/v', 'LongPathsEnabled'], {
|
|
15
|
+
encoding: 'utf8',
|
|
16
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
17
|
+
windowsHide: true,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined; // reg exits 1 when the value does not exist, which means "off"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
elevateLongPaths: () => {
|
|
25
|
+
execFileSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', ELEVATE_LONG_PATHS_SCRIPT], {
|
|
26
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
27
|
+
windowsHide: true,
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
/** On, off, or (not Windows) not a question at all. */
|
|
32
|
+
export function parseLongPaths(stdout) {
|
|
33
|
+
const m = stdout?.match(/LongPathsEnabled\s+REG_DWORD\s+0x([0-9a-f]+)/i);
|
|
34
|
+
return m ? parseInt(m[1], 16) !== 0 : false;
|
|
35
|
+
}
|
|
36
|
+
/** Push needs wrangler 4, and wrangler 4 needs Node 22. */
|
|
37
|
+
const NODE_FOR_PUSH = 22;
|
|
38
|
+
export function doctor(dir, opts = {}, sys = realSystem()) {
|
|
39
|
+
const lines = [];
|
|
40
|
+
let problems = 0;
|
|
41
|
+
const bad = (line, ...hints) => {
|
|
42
|
+
problems++;
|
|
43
|
+
lines.push(` ✗ ${line}`, ...hints.map((h) => ` ${h}`));
|
|
44
|
+
};
|
|
45
|
+
const major = Number(sys.nodeVersion.split('.')[0]);
|
|
46
|
+
if (major >= NODE_FOR_PUSH)
|
|
47
|
+
lines.push(` ✓ Node ${sys.nodeVersion}`);
|
|
48
|
+
else
|
|
49
|
+
bad(`Node ${sys.nodeVersion}: \`substrat push\` needs Node ${NODE_FOR_PUSH} or later, because wrangler 4 does`, 'install a current Node LTS from https://nodejs.org');
|
|
50
|
+
const root = resolve(dir);
|
|
51
|
+
if (!existsSync(join(root, 'package.json'))) {
|
|
52
|
+
lines.push(` – no project in ${root} (no package.json), so wrangler is not checked`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
try {
|
|
56
|
+
lines.push(` ✓ wrangler ${resolveWrangler(root).version}, installed in this project`);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
bad('wrangler is not installed in this project — `substrat push` builds with it', 'npm install --save-dev wrangler (or: pnpm add -D wrangler)');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (sys.platform === 'win32') {
|
|
63
|
+
let on = parseLongPaths(sys.queryLongPaths());
|
|
64
|
+
if (!on && opts.fix) {
|
|
65
|
+
lines.push(' … turning on Windows long paths — Windows asks you to allow it');
|
|
66
|
+
try {
|
|
67
|
+
sys.elevateLongPaths();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* declined or failed: the re-read below says which way it went */
|
|
71
|
+
}
|
|
72
|
+
on = parseLongPaths(sys.queryLongPaths());
|
|
73
|
+
if (on) {
|
|
74
|
+
lines.push(' ✓ Windows long paths: turned on', ' programs already running keep the old limit: restart your terminal and editor');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
bad('Windows long paths are still off — the permission prompt was declined or did not appear', 'run `substrat doctor --fix` again and choose Yes');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (on) {
|
|
81
|
+
lines.push(' ✓ Windows long paths are on');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
bad('Windows long paths are off: node_modules holds files deeper than 260 characters, and programs stop at that limit until it is on', 'substrat doctor --fix (Windows asks you to allow it, once)');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { lines, problems };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/login.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The command that hands `url` to the platform's default browser, the URL as ONE argv
|
|
3
|
+
* element that no shell parses. Windows must not go through `cmd /c start`: cmd.exe reads
|
|
4
|
+
* `&` as a command separator, so the browser got `…/auth/cli?port=N` alone, without
|
|
5
|
+
* `state` and `challenge`, and the broker answered "bad cli request". `rundll32
|
|
6
|
+
* url.dll,FileProtocolHandler` opens the URL with no shell in between (what Go's
|
|
7
|
+
* pkg/browser does).
|
|
8
|
+
*/
|
|
9
|
+
export declare function browserCommand(platform: NodeJS.Platform, url: string): {
|
|
10
|
+
cmd: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
};
|
|
1
13
|
/**
|
|
2
14
|
* Run the full loopback login against `controlPlaneUrl`; returns a session token to store.
|
|
3
15
|
* `fresh` forces a real re-authentication (`substrat login --fresh`): the broker skips any
|
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AA+BA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAItG;AA8DD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAa3G;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhH"}
|
package/dist/login.js
CHANGED
|
@@ -26,11 +26,30 @@ const randomB64url = (n = 32) => b64url(webcrypto.getRandomValues(new Uint8Array
|
|
|
26
26
|
async function s256(verifier) {
|
|
27
27
|
return b64url(new Uint8Array(await webcrypto.subtle.digest('SHA-256', enc.encode(verifier))));
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* The command that hands `url` to the platform's default browser, the URL as ONE argv
|
|
31
|
+
* element that no shell parses. Windows must not go through `cmd /c start`: cmd.exe reads
|
|
32
|
+
* `&` as a command separator, so the browser got `…/auth/cli?port=N` alone, without
|
|
33
|
+
* `state` and `challenge`, and the broker answered "bad cli request". `rundll32
|
|
34
|
+
* url.dll,FileProtocolHandler` opens the URL with no shell in between (what Go's
|
|
35
|
+
* pkg/browser does).
|
|
36
|
+
*/
|
|
37
|
+
export function browserCommand(platform, url) {
|
|
38
|
+
if (platform === 'darwin')
|
|
39
|
+
return { cmd: 'open', args: [url] };
|
|
40
|
+
if (platform === 'win32')
|
|
41
|
+
return { cmd: 'rundll32', args: ['url.dll,FileProtocolHandler', url] };
|
|
42
|
+
return { cmd: 'xdg-open', args: [url] };
|
|
43
|
+
}
|
|
29
44
|
function openBrowser(url) {
|
|
30
|
-
const cmd
|
|
31
|
-
const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
|
|
45
|
+
const { cmd, args } = browserCommand(process.platform, url);
|
|
32
46
|
try {
|
|
33
|
-
|
|
47
|
+
// A missing opener (no xdg-open on a headless box) is not a throw here: spawn reports it
|
|
48
|
+
// as an async 'error' event, and an 'error' event with no listener crashes the process
|
|
49
|
+
// mid-login. Swallow it — the printed URL is the fallback either way.
|
|
50
|
+
const child = spawn(cmd, args, { stdio: 'ignore', detached: true, windowsHide: true });
|
|
51
|
+
child.on('error', () => { });
|
|
52
|
+
child.unref();
|
|
34
53
|
}
|
|
35
54
|
catch {
|
|
36
55
|
/* the printed URL is the fallback */
|