@brass-build/cli 0.1.0 → 0.2.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/AGENTS.md +35 -32
- package/CHANGELOG.md +21 -0
- package/README.md +23 -20
- package/dist/api.d.ts +3 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +28 -8
- package/dist/api.js.map +1 -1
- package/dist/args.d.ts +4 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +92 -6
- package/dist/args.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +153 -58
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +49 -19
- package/dist/commands.js.map +1 -1
- package/dist/login.d.ts +1 -0
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +10 -8
- package/dist/login.js.map +1 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +34 -5
- package/dist/project.js.map +1 -1
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +91 -20
- package/dist/session.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/api.ts +38 -8
- package/src/args.ts +102 -6
- package/src/cli.ts +186 -57
- package/src/commands.ts +66 -19
- package/src/login.ts +14 -8
- package/src/project.ts +39 -5
- package/src/session.ts +106 -21
- package/src/version.ts +1 -1
package/dist/login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAIhB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAMD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB5E;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAIZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AASD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4E5E"}
|
package/dist/login.js
CHANGED
|
@@ -36,14 +36,16 @@ export async function loginStart(options) {
|
|
|
36
36
|
promptFor(options.log, pending, {
|
|
37
37
|
lead: resumed === null ? null : 'A sign-in is already waiting for approval.',
|
|
38
38
|
});
|
|
39
|
-
options.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
if (options.resultFollows !== true) {
|
|
40
|
+
options.log.result({
|
|
41
|
+
state: 'started',
|
|
42
|
+
resumed: resumed !== null,
|
|
43
|
+
verification_url: targetUrl(pending),
|
|
44
|
+
user_code: pending.userCode,
|
|
45
|
+
expires_at: pending.expiresAt,
|
|
46
|
+
expires_in_seconds: remainingSeconds(pending, now()),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
47
49
|
return 0;
|
|
48
50
|
}
|
|
49
51
|
// Poll the profile's pending grant. Approved stores the session exactly as the
|
package/dist/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,0BAA0B;AAC1B,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,mEAAmE;AAEnE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,YAAY,CAAC;AAIpB,MAAM,SAAS,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvF,2EAA2E;AAC3E,4EAA4E;AAC5E,MAAM,uBAAuB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C;AAKD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWhF;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAQf;AAKD,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,GAAG,IAAI,CAKhB;AAUD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IAOd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS5E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAMD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAEb;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C;AAKD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWhF;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAQf;AAKD,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,GAAG,IAAI,CAKhB;AAUD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IAOd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS5E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAMD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAEb;AAgBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAyCzF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAK1E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEpE;AASD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAKvE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhE"}
|
package/dist/project.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFile, writeFile, readdir, stat, mkdir } from 'node:fs/promises';
|
|
1
|
+
import { readFile, writeFile, readdir, stat, mkdir, realpath } from 'node:fs/promises';
|
|
2
2
|
import { join, relative, sep, dirname } from 'node:path';
|
|
3
3
|
import { createHash } from 'node:crypto';
|
|
4
4
|
import { zipSync } from 'fflate';
|
|
@@ -77,15 +77,38 @@ export function mergeSchemaIntoManifest(manifest, schema) {
|
|
|
77
77
|
// by forward-slash relative path (zip entries never use the OS separator).
|
|
78
78
|
// Symlinks are followed via `stat`; empty directories are omitted (a static
|
|
79
79
|
// bundle has none that matter).
|
|
80
|
+
// The one entry name a zip built from an object map cannot carry. Assigning it
|
|
81
|
+
// on an ordinary object literal runs the prototype setter instead of adding an
|
|
82
|
+
// entry, and both this walk and fflate's own index are such maps, so the file
|
|
83
|
+
// drops out of the archive and the map inherits from the bytes it was handed.
|
|
84
|
+
// fflate then walks that index with `for...in`, reaches the inherited keys, and
|
|
85
|
+
// writes one bogus directory per byte of the file. Only the exact name at the
|
|
86
|
+
// root of the bundle does this: a `__proto__` inside a subdirectory is keyed by
|
|
87
|
+
// its whole relative path, which is an ordinary string.
|
|
88
|
+
const UNPUBLISHABLE_ENTRY_NAME = '__proto__';
|
|
80
89
|
export async function collectZipEntries(root) {
|
|
81
|
-
|
|
82
|
-
|
|
90
|
+
// Null-prototype, so the name above lands as an ordinary key and the refusal
|
|
91
|
+
// below can see it. On a plain literal it is already gone by then.
|
|
92
|
+
const entries = Object.create(null);
|
|
93
|
+
// The real paths of the directories on the way down to `dir`, so a symlink
|
|
94
|
+
// pointing back at one of its own ancestors ends the descent instead of
|
|
95
|
+
// walking the subtree again at every level. `stat` resolves symlinks, so
|
|
96
|
+
// without this the walk re-reads the whole subtree until the kernel refuses
|
|
97
|
+
// the path at its symlink depth and the publish dies on a raw ELOOP naming a
|
|
98
|
+
// path thousands of characters long. Only an ANCESTOR ends it: two separate
|
|
99
|
+
// links to one directory are two real places to publish from, and each is
|
|
100
|
+
// still walked.
|
|
101
|
+
async function walk(dir, ancestors) {
|
|
102
|
+
const real = await realpath(dir);
|
|
103
|
+
if (ancestors.includes(real))
|
|
104
|
+
return;
|
|
105
|
+
const chain = [...ancestors, real];
|
|
83
106
|
const names = await readdir(dir);
|
|
84
107
|
for (const name of names) {
|
|
85
108
|
const abs = join(dir, name);
|
|
86
109
|
const info = await stat(abs);
|
|
87
110
|
if (info.isDirectory()) {
|
|
88
|
-
await walk(abs);
|
|
111
|
+
await walk(abs, chain);
|
|
89
112
|
}
|
|
90
113
|
else if (info.isFile()) {
|
|
91
114
|
const rel = relative(root, abs).split(sep).join('/');
|
|
@@ -93,7 +116,13 @@ export async function collectZipEntries(root) {
|
|
|
93
116
|
}
|
|
94
117
|
}
|
|
95
118
|
}
|
|
96
|
-
await walk(root);
|
|
119
|
+
await walk(root, []);
|
|
120
|
+
if (UNPUBLISHABLE_ENTRY_NAME in entries) {
|
|
121
|
+
throw new Error(`Cannot publish a file named "${UNPUBLISHABLE_ENTRY_NAME}" at the top ` +
|
|
122
|
+
`level of ${root}: the archive format keys entries by name, and that ` +
|
|
123
|
+
`name is an object's prototype rather than an entry. Rename or remove ` +
|
|
124
|
+
`it.`);
|
|
125
|
+
}
|
|
97
126
|
return entries;
|
|
98
127
|
}
|
|
99
128
|
export function zipEntries(entries) {
|
package/dist/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface RefreshedTokens {
|
|
|
7
7
|
sessionToken?: string;
|
|
8
8
|
}
|
|
9
9
|
export declare function postRefresh(authBaseUrl: string, sid: string, origin?: string, now?: number): Promise<RefreshedTokens>;
|
|
10
|
+
export declare function postSignOut(authBaseUrl: string, sid: string, origin?: string): Promise<boolean>;
|
|
11
|
+
export declare function postDeviceCancel(authBaseUrl: string, deviceCode: string): Promise<boolean>;
|
|
10
12
|
export declare function decodeEmail(idToken: string): string | undefined;
|
|
11
13
|
export interface LoginResult {
|
|
12
14
|
sessionToken: string;
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAY9C,eAAO,MAAM,UAAU,2BAA2B,CAAC;AAUnD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAKlB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA2BD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAuB,EAC/B,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAUD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAelB;AAMD,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW/D;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAQD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,mBAAmB,CAAC,CA+B9B;AAMD,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC9C;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAExB,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA0C5B;AAKD,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,mBAAmB,EACzB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACvE,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAI/C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAWnF;AAoCD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAW1E"}
|
package/dist/session.js
CHANGED
|
@@ -4,14 +4,21 @@
|
|
|
4
4
|
// code prefilled (and prints the URL + code as a fallback for a headless
|
|
5
5
|
// box), then polls until the human approves. Approval mints the same tokens
|
|
6
6
|
// `/refresh` returns, including the opaque `session_token` the CLI stores to
|
|
7
|
-
// keep refreshing
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
7
|
+
// keep refreshing, which is bound to the CLI's own app id. That app's
|
|
8
|
+
// registered redirect URLs are the loopback wildcards, which is what lets the
|
|
9
|
+
// portless 127.0.0.1 origin below pass the `/refresh` Origin check on every
|
|
10
|
+
// later token refresh.
|
|
11
11
|
import { spawn } from 'node:child_process';
|
|
12
|
-
import { BrassApiError } from './api.js';
|
|
13
|
-
//
|
|
14
|
-
//
|
|
12
|
+
import { BrassApiError, networkError } from './api.js';
|
|
13
|
+
// Every auth call carries a few hundred bytes, so a host still silent after
|
|
14
|
+
// this is one that is not going to answer.
|
|
15
|
+
const AUTH_TIMEOUT_MS = 15_000;
|
|
16
|
+
// Signing out on the server is best effort: `runLogout` clears the local
|
|
17
|
+
// credential whatever this returns, so a host that stalls must not be what
|
|
18
|
+
// stops the credential being cleared.
|
|
19
|
+
const SIGN_OUT_TIMEOUT_MS = 5_000;
|
|
20
|
+
// The app id the CLI signs in as. Stable across environments, so one CLI
|
|
21
|
+
// build authenticates against whichever stack the origin flags name.
|
|
15
22
|
export const CLI_APP_ID = 'brass_app_internal_cli';
|
|
16
23
|
// The Origin the CLI presents on every `/refresh` call (a command refreshing
|
|
17
24
|
// its access token from the stored session). The CLI app's loopback wildcard
|
|
@@ -19,6 +26,19 @@ export const CLI_APP_ID = 'brass_app_internal_cli';
|
|
|
19
26
|
// loopback origin passes the `/refresh` Origin gate.
|
|
20
27
|
const REFRESH_ORIGIN = 'http://127.0.0.1';
|
|
21
28
|
const realSleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
29
|
+
// The lifetime to stamp a token set with, given whatever `expires_in` the
|
|
30
|
+
// response carried. Every value that is not a positive finite number stamps an
|
|
31
|
+
// `expiresAt` the refresh guard `Date.now() >= expiresAt` reads wrong: a
|
|
32
|
+
// missing or non-numeric one makes it NaN, so every comparison is false and
|
|
33
|
+
// the token is never re-refreshed, and a zero or negative one makes it already
|
|
34
|
+
// past, so every call refreshes again. The SDK's `tokenTtlSeconds` is the same
|
|
35
|
+
// guard on the same field.
|
|
36
|
+
const DEFAULT_TOKEN_TTL_SECONDS = 3600;
|
|
37
|
+
function tokenTtlSeconds(expiresIn) {
|
|
38
|
+
return typeof expiresIn === 'number' && Number.isFinite(expiresIn) && expiresIn > 0
|
|
39
|
+
? expiresIn
|
|
40
|
+
: DEFAULT_TOKEN_TTL_SECONDS;
|
|
41
|
+
}
|
|
22
42
|
// Refresh an access token at `/refresh` from the stored session pointer
|
|
23
43
|
// (`sid`). A form-encoded body keeps this a CORS simple request (the auth API
|
|
24
44
|
// serves no preflight); the Origin header is required by the endpoint's
|
|
@@ -32,10 +52,11 @@ export async function postRefresh(authBaseUrl, sid, origin = REFRESH_ORIGIN, now
|
|
|
32
52
|
method: 'POST',
|
|
33
53
|
headers: { 'content-type': 'application/x-www-form-urlencoded', origin },
|
|
34
54
|
body,
|
|
55
|
+
signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
|
|
35
56
|
});
|
|
36
57
|
}
|
|
37
58
|
catch (cause) {
|
|
38
|
-
throw
|
|
59
|
+
throw networkError(`reaching ${authBaseUrl}`, cause);
|
|
39
60
|
}
|
|
40
61
|
if (!response.ok) {
|
|
41
62
|
// Carry the status, and name what a 401 means. Every command reaches the
|
|
@@ -47,20 +68,68 @@ export async function postRefresh(authBaseUrl, sid, origin = REFRESH_ORIGIN, now
|
|
|
47
68
|
? `Your Brass sign-in is no longer valid (401). Run 'brass login' to sign in again.`
|
|
48
69
|
: `Sign-in exchange failed (${response.status}).`);
|
|
49
70
|
}
|
|
50
|
-
const json = (await response.json());
|
|
71
|
+
const json = (await response.json().catch(() => ({})));
|
|
72
|
+
// A 200 carrying no tokens is a failed exchange whatever the status said.
|
|
73
|
+
// Taken here because the fields are read unchecked otherwise: an absent
|
|
74
|
+
// `access_token` is stored as `undefined` and presented as the literal
|
|
75
|
+
// header `Bearer undefined`, which comes back 401 and is reported as an
|
|
76
|
+
// expired sign-in, sending the caller to `brass login` for a session that
|
|
77
|
+
// was never the problem. `pollDeviceToken` requires both fields already.
|
|
78
|
+
if (!json.access_token || !json.id_token) {
|
|
79
|
+
throw new BrassApiError(response.status, `Sign-in exchange returned no tokens (${response.status}).`);
|
|
80
|
+
}
|
|
51
81
|
return {
|
|
52
82
|
accessToken: json.access_token,
|
|
53
83
|
idToken: json.id_token,
|
|
54
|
-
|
|
55
|
-
// `NaN`, which makes `expiresAt` NaN and the `Date.now() >= expiresAt`
|
|
56
|
-
// refresh guard permanently false, so the in-process token would never
|
|
57
|
-
// re-refresh. `pollDeviceToken` already guards the same field.
|
|
58
|
-
expiresAt: now + (json.expires_in ?? 3600) * 1000,
|
|
84
|
+
expiresAt: now + tokenTtlSeconds(json.expires_in) * 1000,
|
|
59
85
|
...(json.session_token ? { sessionToken: json.session_token } : {}),
|
|
60
86
|
};
|
|
61
87
|
}
|
|
62
|
-
//
|
|
63
|
-
//
|
|
88
|
+
// End this machine's sign-in on the server, not only in the local
|
|
89
|
+
// credentials file. The stored pointer keeps minting access tokens for the
|
|
90
|
+
// rest of the session's life, so forgetting it locally leaves a working
|
|
91
|
+
// credential behind wherever a copy of the file went.
|
|
92
|
+
//
|
|
93
|
+
// Reports whether the server confirmed it. Every outcome still clears the
|
|
94
|
+
// local credential (the caller asked to be signed out on this machine), so
|
|
95
|
+
// this is what tells the caller whether a credential elsewhere is still live.
|
|
96
|
+
export async function postSignOut(authBaseUrl, sid, origin = REFRESH_ORIGIN) {
|
|
97
|
+
const url = `${authBaseUrl}/sign-out-of-app?${new URLSearchParams({ app_id: CLI_APP_ID }).toString()}`;
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(url, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', origin },
|
|
102
|
+
body: new URLSearchParams({ sid }),
|
|
103
|
+
signal: AbortSignal.timeout(SIGN_OUT_TIMEOUT_MS),
|
|
104
|
+
});
|
|
105
|
+
// A 401 means the pointer no longer resolves, which is the state the
|
|
106
|
+
// caller wanted: there is nothing left to revoke.
|
|
107
|
+
return response.ok || response.status === 401;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Abandon a sign-in this machine started and never redeemed, so the code it
|
|
114
|
+
// relayed to a human stops being redeemable. Best effort, like `postSignOut`:
|
|
115
|
+
// the caller clears the local record either way, and reports what it could not
|
|
116
|
+
// reach.
|
|
117
|
+
export async function postDeviceCancel(authBaseUrl, deviceCode) {
|
|
118
|
+
try {
|
|
119
|
+
const response = await fetch(`${authBaseUrl}/device/cancel`, {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
122
|
+
body: new URLSearchParams({ device_code: deviceCode, app_id: CLI_APP_ID }),
|
|
123
|
+
signal: AbortSignal.timeout(SIGN_OUT_TIMEOUT_MS),
|
|
124
|
+
});
|
|
125
|
+
return response.ok;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Decode the email claim from an id token, best-effort (used only for the
|
|
132
|
+
// "Signed in as ..." confirmation; never for authorization).
|
|
64
133
|
export function decodeEmail(idToken) {
|
|
65
134
|
const part = idToken.split('.')[1];
|
|
66
135
|
if (part === undefined)
|
|
@@ -81,6 +150,7 @@ export async function deviceAuthorize(authBaseUrl, now = Date.now()) {
|
|
|
81
150
|
method: 'POST',
|
|
82
151
|
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
83
152
|
body,
|
|
153
|
+
signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
|
|
84
154
|
});
|
|
85
155
|
}
|
|
86
156
|
catch (cause) {
|
|
@@ -114,6 +184,7 @@ export async function pollDeviceTokenOnce(authBaseUrl, deviceCode, now = Date.no
|
|
|
114
184
|
method: 'POST',
|
|
115
185
|
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
116
186
|
body,
|
|
187
|
+
signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
|
|
117
188
|
});
|
|
118
189
|
}
|
|
119
190
|
catch {
|
|
@@ -130,7 +201,7 @@ export async function pollDeviceTokenOnce(authBaseUrl, deviceCode, now = Date.no
|
|
|
130
201
|
tokens: {
|
|
131
202
|
accessToken: json.access_token,
|
|
132
203
|
idToken: json.id_token,
|
|
133
|
-
expiresAt: now + (json.expires_in
|
|
204
|
+
expiresAt: now + tokenTtlSeconds(json.expires_in) * 1000,
|
|
134
205
|
...(json.session_token ? { sessionToken: json.session_token } : {}),
|
|
135
206
|
},
|
|
136
207
|
};
|
|
@@ -141,9 +212,9 @@ export async function pollDeviceTokenOnce(authBaseUrl, deviceCode, now = Date.no
|
|
|
141
212
|
// RFC 8628 §3.5: polling too fast. The caller backs off.
|
|
142
213
|
if (json.error === 'slow_down')
|
|
143
214
|
return { state: 'slow_down' };
|
|
144
|
-
// Everything else
|
|
145
|
-
// a non-JSON body, or an error code this pinned CLI does
|
|
146
|
-
//
|
|
215
|
+
// Everything else is "keep waiting": `authorization_pending`, a transient
|
|
216
|
+
// non-2xx (5xx/429), a non-JSON body, or an error code this pinned CLI does
|
|
217
|
+
// not recognize. The caller's deadline check is the single terminal bound,
|
|
147
218
|
// so an unknown error or a server blip does not abort a sign-in the user is
|
|
148
219
|
// one poll away from completing; a genuinely expired grant simply ends
|
|
149
220
|
// there as a clean timeout.
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,4EAA4E;AAC5E,0EAA0E;AAC1E,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
2
|
-
export declare const CLI_CLIENT_ID = "cli/0.
|
|
1
|
+
export declare const VERSION = "0.2.0";
|
|
2
|
+
export declare const CLI_CLIENT_ID = "cli/0.2.0";
|
|
3
3
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
// free here, unlike the SDK's query-param channel). Lets the platform
|
|
4
4
|
// measure the CLI version distribution, in particular pinned CI copies.
|
|
5
5
|
// A unit test pins this to package.json's version.
|
|
6
|
-
export const VERSION = '0.
|
|
6
|
+
export const VERSION = '0.2.0';
|
|
7
7
|
export const CLI_CLIENT_ID = `cli/${VERSION}`;
|
|
8
8
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
package/src/api.ts
CHANGED
|
@@ -34,6 +34,10 @@ export interface HostingStatus {
|
|
|
34
34
|
// Whether the edge gates the bundle behind the app's audience. A public
|
|
35
35
|
// showcase turns this off so the bundle is world-loadable.
|
|
36
36
|
require_access?: boolean;
|
|
37
|
+
// Whether the platform has registered this slot to serve. False means the
|
|
38
|
+
// hosted URL answers 404 however the rest of this body reads. Optional: an
|
|
39
|
+
// older api omits it, and an absent field is not a failure to report.
|
|
40
|
+
gate_settled?: boolean;
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
export interface HostingUploadUrl {
|
|
@@ -110,6 +114,28 @@ export class BrassApiError extends Error {
|
|
|
110
114
|
}
|
|
111
115
|
}
|
|
112
116
|
|
|
117
|
+
// `fetch` carries no timeout of its own, so a host that accepts the connection
|
|
118
|
+
// and then answers nothing holds the command open for as long as the caller
|
|
119
|
+
// leaves it running. In CI that is a job that never finishes rather than a
|
|
120
|
+
// failure anyone can read, so every request the CLI makes is bounded.
|
|
121
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
122
|
+
// The upload carries the whole bundle, so it is bounded far more loosely than
|
|
123
|
+
// a request that carries a few hundred bytes.
|
|
124
|
+
const UPLOAD_TIMEOUT_MS = 300_000;
|
|
125
|
+
|
|
126
|
+
/** A failed fetch as the caller should read it, naming a timeout as one. */
|
|
127
|
+
export function networkError(what: string, cause: unknown): BrassApiError {
|
|
128
|
+
const timedOut =
|
|
129
|
+
cause instanceof Error &&
|
|
130
|
+
(cause.name === 'TimeoutError' || cause.name === 'AbortError');
|
|
131
|
+
return new BrassApiError(
|
|
132
|
+
0,
|
|
133
|
+
timedOut
|
|
134
|
+
? `Timed out ${what}.`
|
|
135
|
+
: `Network error ${what}: ${String(cause)}`,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
113
139
|
export class BrassApi {
|
|
114
140
|
private readonly apiBaseUrl: string;
|
|
115
141
|
private readonly auth: AuthProvider;
|
|
@@ -132,7 +158,7 @@ export class BrassApi {
|
|
|
132
158
|
private async request<T>(method: string, path: string, body?: unknown): Promise<T> {
|
|
133
159
|
const headers: Record<string, string> = {
|
|
134
160
|
...(await this.auth.headers()),
|
|
135
|
-
// Version telemetry; the
|
|
161
|
+
// Version telemetry; the platform logs it so pinned CI copies
|
|
136
162
|
// stay visible in the deployed-version distribution.
|
|
137
163
|
'x-brass-client': CLI_CLIENT_ID,
|
|
138
164
|
};
|
|
@@ -143,9 +169,12 @@ export class BrassApi {
|
|
|
143
169
|
}
|
|
144
170
|
let response: Response;
|
|
145
171
|
try {
|
|
146
|
-
response = await fetch(`${this.apiBaseUrl}${path}`,
|
|
172
|
+
response = await fetch(`${this.apiBaseUrl}${path}`, {
|
|
173
|
+
...init,
|
|
174
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
175
|
+
});
|
|
147
176
|
} catch (cause) {
|
|
148
|
-
throw
|
|
177
|
+
throw networkError(`reaching ${this.apiBaseUrl}`, cause);
|
|
149
178
|
}
|
|
150
179
|
if (!response.ok) {
|
|
151
180
|
throw new BrassApiError(response.status, await errorMessage(response));
|
|
@@ -155,10 +184,10 @@ export class BrassApi {
|
|
|
155
184
|
}
|
|
156
185
|
}
|
|
157
186
|
|
|
158
|
-
// Upload bytes to
|
|
159
|
-
// and no bearer: the presigned
|
|
160
|
-
//
|
|
161
|
-
//
|
|
187
|
+
// Upload bytes to the presigned storage URL the platform handed back.
|
|
188
|
+
// Deliberately carries NO Brass headers and no bearer: the presigned
|
|
189
|
+
// signature pins an exact header set, so a stray `authorization` header
|
|
190
|
+
// invalidates it and the upload is refused.
|
|
162
191
|
export async function putPresigned(
|
|
163
192
|
url: string,
|
|
164
193
|
bytes: Uint8Array,
|
|
@@ -173,9 +202,10 @@ export async function putPresigned(
|
|
|
173
202
|
// `ArrayBufferLike` is sound and satisfies fetch's `BufferSource`
|
|
174
203
|
// (which pins `ArrayBufferView<ArrayBuffer>`) across lib configs.
|
|
175
204
|
body: bytes as Uint8Array<ArrayBuffer>,
|
|
205
|
+
signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),
|
|
176
206
|
});
|
|
177
207
|
} catch (cause) {
|
|
178
|
-
throw
|
|
208
|
+
throw networkError('uploading the bundle', cause);
|
|
179
209
|
}
|
|
180
210
|
if (!response.ok) {
|
|
181
211
|
throw new BrassApiError(response.status, `Bundle upload failed (${response.status})`);
|