multi-gws 0.0.3 → 0.0.5
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/account-add.d.ts +1 -2
- package/dist/account-add.d.ts.map +1 -1
- package/dist/account-add.js +140 -57
- package/dist/account-add.js.map +1 -1
- package/dist/account-state.d.ts +10 -0
- package/dist/account-state.d.ts.map +1 -0
- package/dist/account-state.js +103 -0
- package/dist/account-state.js.map +1 -0
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +3 -33
- package/dist/run.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,7 +21,15 @@ Add or reconnect an account:
|
|
|
21
21
|
mgws account add <email-address> --gmail=<none|read|manage> --drive=<none|read|manage> --calendar=<none|read|manage>
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
Account authorization streams the Google OAuth URL to the terminal and waits up
|
|
25
|
+
to five minutes for the browser callback. `Ctrl-C` and termination signals are
|
|
26
|
+
forwarded to the complete authorization process tree. Set
|
|
27
|
+
`MGWS_OAUTH_TIMEOUT_MS` to a positive integer to override the timeout.
|
|
28
|
+
|
|
24
29
|
`mgws` treats the current working directory as the workspace. Shared OAuth configuration belongs at `credentials/google-oauth-client.json`; account state is stored under `accounts/<account-slug>/gws/`.
|
|
30
|
+
Account slugs use the normalized email when it is available, then add incrementing
|
|
31
|
+
suffixes such as `-1` and `-2` only when another email already occupies that
|
|
32
|
+
slug. Reconnecting the same email reuses its existing slug.
|
|
25
33
|
|
|
26
34
|
## Development
|
|
27
35
|
|
package/dist/account-add.d.ts
CHANGED
|
@@ -4,6 +4,5 @@ export interface AddAccountOptions extends AccountAccess {
|
|
|
4
4
|
login: boolean;
|
|
5
5
|
workspaceRoot?: string;
|
|
6
6
|
}
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function addAccount({ email, gmail, drive, calendar, login, workspaceRoot, }: AddAccountOptions): number;
|
|
7
|
+
export declare function addAccount({ email, gmail, drive, calendar, login, workspaceRoot, }: AddAccountOptions): Promise<number>;
|
|
9
8
|
//# sourceMappingURL=account-add.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-add.d.ts","sourceRoot":"","sources":["../src/account-add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account-add.d.ts","sourceRoot":"","sources":["../src/account-add.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAK9D,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoND,wBAAsB,UAAU,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAa,GACd,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqErC"}
|
package/dist/account-add.js
CHANGED
|
@@ -1,9 +1,133 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import { chmodSync, copyFileSync, lstatSync, mkdirSync, writeFileSync, } from "node:fs";
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
import { chmodSync, copyFileSync, lstatSync, mkdirSync } from "node:fs";
|
|
4
3
|
import { join, resolve } from "node:path";
|
|
5
4
|
import { resolveAccountScopes } from "./account-permissions.js";
|
|
5
|
+
import { allocateAccountSlug, writeAccountProfile } from "./account-state.js";
|
|
6
6
|
import { CliError, EXIT, errorCode } from "./errors.js";
|
|
7
|
+
const DEFAULT_OAUTH_TIMEOUT_MS = 5 * 60 * 1000;
|
|
8
|
+
const OAUTH_KILL_GRACE_MS = 1000;
|
|
9
|
+
const FORWARDED_SIGNALS = ["SIGINT", "SIGTERM"];
|
|
10
|
+
function oauthTimeoutMs() {
|
|
11
|
+
const configured = process.env.MGWS_OAUTH_TIMEOUT_MS;
|
|
12
|
+
if (configured === undefined)
|
|
13
|
+
return DEFAULT_OAUTH_TIMEOUT_MS;
|
|
14
|
+
if (!/^[1-9][0-9]*$/.test(configured)) {
|
|
15
|
+
throw new CliError(EXIT.usage, "MGWS_OAUTH_TIMEOUT_MS must be a positive integer");
|
|
16
|
+
}
|
|
17
|
+
const timeout = Number(configured);
|
|
18
|
+
if (!Number.isSafeInteger(timeout)) {
|
|
19
|
+
throw new CliError(EXIT.usage, "MGWS_OAUTH_TIMEOUT_MS must be a positive integer");
|
|
20
|
+
}
|
|
21
|
+
return timeout;
|
|
22
|
+
}
|
|
23
|
+
function terminateProcessTree(child, signal) {
|
|
24
|
+
if (child.pid === undefined)
|
|
25
|
+
return;
|
|
26
|
+
try {
|
|
27
|
+
if (process.platform === "win32") {
|
|
28
|
+
spawnSync("taskkill", ["/pid", child.pid.toString(), "/t", "/f"], {
|
|
29
|
+
stdio: "ignore",
|
|
30
|
+
windowsHide: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
process.kill(-child.pid, signal);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (errorCode(error) !== "ESRCH")
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function runOauthLogin(root, slug, scopes) {
|
|
43
|
+
const timeoutMs = oauthTimeoutMs();
|
|
44
|
+
console.log(`Waiting up to ${timeoutMs}ms for OAuth approval. Press Ctrl-C to cancel.`);
|
|
45
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
46
|
+
const child = spawn(process.execPath, [
|
|
47
|
+
process.argv[1] ?? "mgws",
|
|
48
|
+
"run",
|
|
49
|
+
slug,
|
|
50
|
+
"auth",
|
|
51
|
+
"login",
|
|
52
|
+
"--scopes",
|
|
53
|
+
scopes.join(","),
|
|
54
|
+
], {
|
|
55
|
+
cwd: root,
|
|
56
|
+
detached: process.platform !== "win32",
|
|
57
|
+
stdio: "inherit",
|
|
58
|
+
});
|
|
59
|
+
let completed = false;
|
|
60
|
+
let terminationError;
|
|
61
|
+
let killTimer;
|
|
62
|
+
const timeoutTimer = setTimeout(() => {
|
|
63
|
+
requestTermination("SIGTERM", new CliError(EXIT.unavailable, `OAuth login timed out after ${timeoutMs}ms`));
|
|
64
|
+
}, timeoutMs);
|
|
65
|
+
const signalHandlers = new Map();
|
|
66
|
+
const cleanup = () => {
|
|
67
|
+
clearTimeout(timeoutTimer);
|
|
68
|
+
if (killTimer !== undefined)
|
|
69
|
+
clearTimeout(killTimer);
|
|
70
|
+
for (const [signal, handler] of signalHandlers) {
|
|
71
|
+
process.removeListener(signal, handler);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const reject = (error) => {
|
|
75
|
+
if (completed)
|
|
76
|
+
return;
|
|
77
|
+
completed = true;
|
|
78
|
+
cleanup();
|
|
79
|
+
rejectPromise(error);
|
|
80
|
+
};
|
|
81
|
+
const requestTermination = (signal, error) => {
|
|
82
|
+
if (completed || terminationError !== undefined)
|
|
83
|
+
return;
|
|
84
|
+
terminationError = error;
|
|
85
|
+
try {
|
|
86
|
+
terminateProcessTree(child, signal);
|
|
87
|
+
}
|
|
88
|
+
catch (terminationFailure) {
|
|
89
|
+
reject(new CliError(EXIT.unavailable, `could not terminate OAuth login: ${terminationFailure instanceof Error
|
|
90
|
+
? terminationFailure.message
|
|
91
|
+
: String(terminationFailure)}`));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
killTimer = setTimeout(() => {
|
|
95
|
+
try {
|
|
96
|
+
terminateProcessTree(child, "SIGKILL");
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// The close handler reports the original timeout or cancellation.
|
|
100
|
+
}
|
|
101
|
+
}, OAUTH_KILL_GRACE_MS);
|
|
102
|
+
killTimer.unref();
|
|
103
|
+
};
|
|
104
|
+
for (const signal of FORWARDED_SIGNALS) {
|
|
105
|
+
const handler = () => {
|
|
106
|
+
requestTermination(signal, new CliError(signal === "SIGINT" ? 130 : 143, `OAuth login cancelled by ${signal}`));
|
|
107
|
+
};
|
|
108
|
+
signalHandlers.set(signal, handler);
|
|
109
|
+
process.once(signal, handler);
|
|
110
|
+
}
|
|
111
|
+
child.once("error", (error) => {
|
|
112
|
+
reject(new CliError(EXIT.unavailable, `could not start OAuth login: ${error.message}`));
|
|
113
|
+
});
|
|
114
|
+
child.once("close", (status, signal) => {
|
|
115
|
+
if (completed)
|
|
116
|
+
return;
|
|
117
|
+
if (terminationError !== undefined) {
|
|
118
|
+
reject(terminationError);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
completed = true;
|
|
122
|
+
cleanup();
|
|
123
|
+
if (status !== null) {
|
|
124
|
+
resolvePromise(status);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
rejectPromise(new CliError(1, `OAuth login terminated by signal ${signal ?? "unknown"}`));
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
7
131
|
function isFile(path) {
|
|
8
132
|
try {
|
|
9
133
|
return lstatSync(path).isFile();
|
|
@@ -39,42 +163,15 @@ function ensurePrivateDirectory(path) {
|
|
|
39
163
|
}
|
|
40
164
|
chmodSync(path, 0o700);
|
|
41
165
|
}
|
|
42
|
-
function
|
|
43
|
-
if (!pathExists(path))
|
|
44
|
-
return;
|
|
45
|
-
const file = lstatSync(path);
|
|
46
|
-
if (!file.isFile() || file.isSymbolicLink()) {
|
|
47
|
-
throw new CliError(EXIT.noPermission, `unsafe account path: ${path}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
export function accountSlug(email) {
|
|
51
|
-
const normalizedEmail = email.toLowerCase();
|
|
52
|
-
const readableSlug = normalizedEmail
|
|
53
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
54
|
-
.replace(/^-+|-+$/g, "");
|
|
55
|
-
if (readableSlug.length === 0) {
|
|
56
|
-
throw new CliError(EXIT.usage, `could not derive an account slug from: ${email}`);
|
|
57
|
-
}
|
|
58
|
-
const fingerprint = createHash("sha256")
|
|
59
|
-
.update(normalizedEmail)
|
|
60
|
-
.digest("base64url")
|
|
61
|
-
.slice(0, 16);
|
|
62
|
-
return `${readableSlug}-${fingerprint}`;
|
|
63
|
-
}
|
|
64
|
-
export function addAccount({ email, gmail, drive, calendar, login, workspaceRoot, }) {
|
|
166
|
+
export async function addAccount({ email, gmail, drive, calendar, login, workspaceRoot, }) {
|
|
65
167
|
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
|
|
66
168
|
throw new CliError(EXIT.usage, `invalid email address: ${email}`);
|
|
67
169
|
}
|
|
68
170
|
const scopes = resolveAccountScopes({ gmail, drive, calendar });
|
|
69
|
-
const slug = accountSlug(email);
|
|
70
171
|
const root = resolve(workspaceRoot ?? process.cwd());
|
|
71
172
|
const credentialsDir = join(root, "credentials");
|
|
72
173
|
const oauthClient = join(credentialsDir, "google-oauth-client.json");
|
|
73
174
|
const accountsDir = join(root, "accounts");
|
|
74
|
-
const accountDir = join(accountsDir, slug);
|
|
75
|
-
const configDir = join(accountDir, "gws");
|
|
76
|
-
const accountOauthClient = join(configDir, "client_secret.json");
|
|
77
|
-
const accessProfile = join(configDir, "access.json");
|
|
78
175
|
if (!isFile(oauthClient)) {
|
|
79
176
|
throw new CliError(EXIT.noInput, `OAuth client must be a regular file, not a symlink: ${oauthClient}`);
|
|
80
177
|
}
|
|
@@ -86,6 +183,10 @@ export function addAccount({ email, gmail, drive, calendar, login, workspaceRoot
|
|
|
86
183
|
chmodSync(credentialsDir, 0o700);
|
|
87
184
|
chmodSync(oauthClient, 0o600);
|
|
88
185
|
ensurePrivateDirectory(accountsDir);
|
|
186
|
+
const slug = allocateAccountSlug(accountsDir, email);
|
|
187
|
+
const accountDir = join(accountsDir, slug);
|
|
188
|
+
const configDir = join(accountDir, "gws");
|
|
189
|
+
const accountOauthClient = join(configDir, "client_secret.json");
|
|
89
190
|
ensurePrivateDirectory(accountDir);
|
|
90
191
|
ensurePrivateDirectory(configDir);
|
|
91
192
|
if (pathExists(accountOauthClient)) {
|
|
@@ -97,39 +198,21 @@ export function addAccount({ email, gmail, drive, calendar, login, workspaceRoot
|
|
|
97
198
|
}
|
|
98
199
|
copyFileSync(oauthClient, accountOauthClient);
|
|
99
200
|
chmodSync(accountOauthClient, 0o600);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
};
|
|
201
|
+
writeAccountProfile(configDir, {
|
|
202
|
+
slug,
|
|
203
|
+
email,
|
|
204
|
+
gmail,
|
|
205
|
+
drive,
|
|
206
|
+
calendar,
|
|
207
|
+
});
|
|
107
208
|
console.log(`Account slug: ${slug}`);
|
|
108
209
|
console.log(`Gmail access: ${gmail}`);
|
|
109
210
|
console.log(`Drive access: ${drive}`);
|
|
110
211
|
console.log(`Calendar access: ${calendar}`);
|
|
111
212
|
if (!login) {
|
|
112
|
-
saveAccessProfile();
|
|
113
213
|
console.log("Skipped OAuth login (--no-login).");
|
|
114
214
|
return 0;
|
|
115
215
|
}
|
|
116
|
-
|
|
117
|
-
process.argv[1] ?? "mgws",
|
|
118
|
-
"run",
|
|
119
|
-
slug,
|
|
120
|
-
"auth",
|
|
121
|
-
"login",
|
|
122
|
-
"--scopes",
|
|
123
|
-
scopes.join(","),
|
|
124
|
-
], { cwd: root, stdio: "inherit" });
|
|
125
|
-
if (result.error) {
|
|
126
|
-
throw new CliError(EXIT.unavailable, `could not start OAuth login: ${result.error.message}`);
|
|
127
|
-
}
|
|
128
|
-
if (result.status !== null) {
|
|
129
|
-
if (result.status === 0)
|
|
130
|
-
saveAccessProfile();
|
|
131
|
-
return result.status;
|
|
132
|
-
}
|
|
133
|
-
throw new CliError(1, `OAuth login terminated by signal ${result.signal ?? "unknown"}`);
|
|
216
|
+
return runOauthLogin(root, slug, scopes);
|
|
134
217
|
}
|
|
135
218
|
//# sourceMappingURL=account-add.js.map
|
package/dist/account-add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-add.js","sourceRoot":"","sources":["../src/account-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"account-add.js","sourceRoot":"","sources":["../src/account-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQxD,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;AAGzD,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACrD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,wBAAwB,CAAC;IAC9D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,KAAK,EACV,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,KAAK,EACV,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAmB,EACnB,MAAmC;IAEnC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO;IACpC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAChE,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,IAAY,EACZ,IAAY,EACZ,MAAyB;IAEzB,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;IACnC,OAAO,CAAC,GAAG,CACT,iBAAiB,SAAS,gDAAgD,CAC3E,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB;YACE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM;YACzB,KAAK;YACL,IAAI;YACJ,MAAM;YACN,OAAO;YACP,UAAU;YACV,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SACjB,EACD;YACE,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,KAAK,EAAE,SAAS;SACjB,CACF,CAAC;QACF,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,gBAAsC,CAAC;QAC3C,IAAI,SAAqC,CAAC;QAE1C,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,kBAAkB,CAChB,SAAS,EACT,IAAI,QAAQ,CACV,IAAI,CAAC,WAAW,EAChB,+BAA+B,SAAS,IAAI,CAC7C,CACF,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+B,CAAC;QAE9D,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,IAAI,SAAS,KAAK,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACrD,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC/C,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAe,EAAQ,EAAE;YACvC,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,EAAE,CAAC;YACV,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,CACzB,MAAuB,EACvB,KAAe,EACT,EAAE;YACR,IAAI,SAAS,IAAI,gBAAgB,KAAK,SAAS;gBAAE,OAAO;YACxD,gBAAgB,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC;gBACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,kBAAkB,EAAE,CAAC;gBAC5B,MAAM,CACJ,IAAI,QAAQ,CACV,IAAI,CAAC,WAAW,EAChB,oCACE,kBAAkB,YAAY,KAAK;oBACjC,CAAC,CAAC,kBAAkB,CAAC,OAAO;oBAC5B,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAC/B,EAAE,CACH,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC;oBACH,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,kEAAkE;gBACpE,CAAC;YACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACxB,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,kBAAkB,CAChB,MAAM,EACN,IAAI,QAAQ,CACV,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAC/B,4BAA4B,MAAM,EAAE,CACrC,CACF,CAAC;YACJ,CAAC,CAAC;YACF,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,MAAM,CACJ,IAAI,QAAQ,CACV,IAAI,CAAC,WAAW,EAChB,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAChD,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,EAAE,CAAC;YACV,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,cAAc,CAAC,MAAM,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,aAAa,CACX,IAAI,QAAQ,CACV,CAAC,EACD,oCAAoC,MAAM,IAAI,SAAS,EAAE,CAC1D,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACjD,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAa,GACK;IAClB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,0BAA0B,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,OAAO,EACZ,uDAAuD,WAAW,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;IACvD,IACE,CAAC,oBAAoB,CAAC,WAAW,EAAE;QACnC,oBAAoB,CAAC,cAAc,EAAE,EACrC,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,OAAO,EACZ,iDAAiD,cAAc,EAAE,CAClE,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACjC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAE9B,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACjE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACnC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAElC,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnC,MAAM,sBAAsB,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7D,IACE,CAAC,sBAAsB,CAAC,MAAM,EAAE;YAChC,sBAAsB,CAAC,cAAc,EAAE,EACvC,CAAC;YACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,OAAO,EACZ,gDAAgD,kBAAkB,EAAE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC9C,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACrC,mBAAmB,CAAC,SAAS,EAAE;QAC7B,IAAI;QACJ,KAAK;QACL,KAAK;QACL,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AccountAccess } from "./account-permissions.js";
|
|
2
|
+
export interface AccountProfile extends AccountAccess {
|
|
3
|
+
slug: string;
|
|
4
|
+
email: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function accountSlug(email: string): string;
|
|
7
|
+
export declare function readAccountProfile(configDir: string, expectedSlug: string): AccountProfile | undefined;
|
|
8
|
+
export declare function writeAccountProfile(configDir: string, profile: AccountProfile): void;
|
|
9
|
+
export declare function allocateAccountSlug(accountsDir: string, email: string): string;
|
|
10
|
+
//# sourceMappingURL=account-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-state.d.ts","sourceRoot":"","sources":["../src/account-state.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,0BAA0B,CAAC;AAG7E,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYjD;AAsBD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,cAAc,GAAG,SAAS,CAwB5B;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAaN;AAaD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CA0BR"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { chmodSync, lstatSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { isAccessLevel } from "./account-permissions.js";
|
|
4
|
+
import { CliError, EXIT, errorCode } from "./errors.js";
|
|
5
|
+
const ACCESS_PROFILE = "access.json";
|
|
6
|
+
export function accountSlug(email) {
|
|
7
|
+
const slug = email
|
|
8
|
+
.toLowerCase()
|
|
9
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
10
|
+
.replace(/^-+|-+$/g, "");
|
|
11
|
+
if (slug.length === 0) {
|
|
12
|
+
throw new CliError(EXIT.usage, `could not derive an account slug from: ${email}`);
|
|
13
|
+
}
|
|
14
|
+
return slug;
|
|
15
|
+
}
|
|
16
|
+
function isAccountProfile(value) {
|
|
17
|
+
return (typeof value === "object" &&
|
|
18
|
+
value !== null &&
|
|
19
|
+
"slug" in value &&
|
|
20
|
+
typeof value.slug === "string" &&
|
|
21
|
+
"email" in value &&
|
|
22
|
+
typeof value.email === "string" &&
|
|
23
|
+
"gmail" in value &&
|
|
24
|
+
typeof value.gmail === "string" &&
|
|
25
|
+
isAccessLevel(value.gmail) &&
|
|
26
|
+
"drive" in value &&
|
|
27
|
+
typeof value.drive === "string" &&
|
|
28
|
+
isAccessLevel(value.drive) &&
|
|
29
|
+
"calendar" in value &&
|
|
30
|
+
typeof value.calendar === "string" &&
|
|
31
|
+
isAccessLevel(value.calendar));
|
|
32
|
+
}
|
|
33
|
+
export function readAccountProfile(configDir, expectedSlug) {
|
|
34
|
+
const path = join(configDir, ACCESS_PROFILE);
|
|
35
|
+
let file;
|
|
36
|
+
try {
|
|
37
|
+
file = lstatSync(path);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (errorCode(error) === "ENOENT")
|
|
41
|
+
return undefined;
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
if (!file.isFile() || file.isSymbolicLink()) {
|
|
45
|
+
throw new CliError(EXIT.noPermission, `unsafe account path: ${path}`);
|
|
46
|
+
}
|
|
47
|
+
let profile;
|
|
48
|
+
try {
|
|
49
|
+
profile = JSON.parse(readFileSync(path, "utf8"));
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof SyntaxError)
|
|
53
|
+
return undefined;
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
if (!isAccountProfile(profile) || profile.slug !== expectedSlug) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return profile;
|
|
60
|
+
}
|
|
61
|
+
export function writeAccountProfile(configDir, profile) {
|
|
62
|
+
const path = join(configDir, ACCESS_PROFILE);
|
|
63
|
+
try {
|
|
64
|
+
const file = lstatSync(path);
|
|
65
|
+
if (!file.isFile() || file.isSymbolicLink()) {
|
|
66
|
+
throw new CliError(EXIT.noPermission, `unsafe account path: ${path}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (errorCode(error) !== "ENOENT")
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
writeFileSync(path, `${JSON.stringify(profile, null, 2)}\n`, { mode: 0o600 });
|
|
74
|
+
chmodSync(path, 0o600);
|
|
75
|
+
}
|
|
76
|
+
function existingAccountEmail(accountDir, slug) {
|
|
77
|
+
const directory = lstatSync(accountDir);
|
|
78
|
+
if (!directory.isDirectory() || directory.isSymbolicLink()) {
|
|
79
|
+
throw new CliError(EXIT.noPermission, `unsafe account path: ${accountDir}`);
|
|
80
|
+
}
|
|
81
|
+
return readAccountProfile(join(accountDir, "gws"), slug)?.email;
|
|
82
|
+
}
|
|
83
|
+
export function allocateAccountSlug(accountsDir, email) {
|
|
84
|
+
const baseSlug = accountSlug(email);
|
|
85
|
+
const normalizedEmail = email.toLowerCase();
|
|
86
|
+
for (let suffix = 0; Number.isSafeInteger(suffix); suffix += 1) {
|
|
87
|
+
const slug = suffix === 0 ? baseSlug : `${baseSlug}-${suffix}`;
|
|
88
|
+
const accountDir = join(accountsDir, slug);
|
|
89
|
+
try {
|
|
90
|
+
mkdirSync(accountDir, { mode: 0o700 });
|
|
91
|
+
return slug;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (errorCode(error) !== "EEXIST")
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
if (existingAccountEmail(accountDir, slug)?.toLowerCase() === normalizedEmail) {
|
|
98
|
+
return slug;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
throw new CliError(EXIT.unavailable, `could not allocate an account slug for: ${email}`);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=account-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-state.js","sourceRoot":"","sources":["../src/account-state.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -49,13 +49,13 @@ account
|
|
|
49
49
|
.argParser(accessLevel)
|
|
50
50
|
.makeOptionMandatory())
|
|
51
51
|
.option("--no-login", "create account state without starting OAuth")
|
|
52
|
-
.action((email, options) => {
|
|
52
|
+
.action(async (email, options) => {
|
|
53
53
|
if (!isAccessLevel(options.gmail) ||
|
|
54
54
|
!isAccessLevel(options.drive) ||
|
|
55
55
|
!isAccessLevel(options.calendar)) {
|
|
56
56
|
throw new CliError(EXIT.usage, "invalid permission level");
|
|
57
57
|
}
|
|
58
|
-
process.exitCode = addAccount({
|
|
58
|
+
process.exitCode = await addAccount({
|
|
59
59
|
email,
|
|
60
60
|
gmail: options.gmail,
|
|
61
61
|
drive: options.drive,
|
|
@@ -81,7 +81,7 @@ try {
|
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
else {
|
|
84
|
-
program.
|
|
84
|
+
await program.parseAsync();
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
catch (error) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOlC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC/C,CAAC;AAErB,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,CACtB,IAAI,CAAC,KAAK,EACV,oBAAoB,EACpB,oBAAoB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/C,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC;KACxC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC;KAChC,kBAAkB,EAAE;KACpB,YAAY,EAAE,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,oDAAoD,CAAC;KACjE,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;KACrC,QAAQ,CAAC,oBAAoB,EAAE,4BAA4B,CAAC;KAC5D,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,kBAAkB,EAAE;KACpB,MAAM,CACL,CACE,OAAe,EACf,YAAsB,EACtB,OAA8B,EAC9B,EAAE;IACF,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC;QACxB,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;QACnC,YAAY;KACb,CAAC,CAAC;AACL,CAAC,CACF,CAAC;AAEJ,MAAM,OAAO,GAAG,OAAO;KACpB,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,iCAAiC,CAAC,CAAC;AAElD,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0BAA0B,CAAC;KACvC,QAAQ,CAAC,SAAS,EAAE,8BAA8B,CAAC;KACnD,SAAS,CACR,IAAI,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;KACpD,SAAS,CAAC,WAAW,CAAC;KACtB,mBAAmB,EAAE,CACzB;KACA,SAAS,CACR,IAAI,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;KACpD,SAAS,CAAC,WAAW,CAAC;KACtB,mBAAmB,EAAE,CACzB;KACA,SAAS,CACR,IAAI,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;KAC1D,SAAS,CAAC,WAAW,CAAC;KACtB,mBAAmB,EAAE,CACzB;KACA,MAAM,CAAC,YAAY,EAAE,6CAA6C,CAAC;KACnE,MAAM,CACL,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8DD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,CAiCV;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,SAAS,EACT,YAAY,EACZ,aAAa,GACd,EAAE,UAAU,GAAG,MAAM,CAyFrB"}
|
package/dist/run.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
-
import { accessSync, chmodSync, constants, lstatSync, mkdirSync,
|
|
2
|
+
import { accessSync, chmodSync, constants, lstatSync, mkdirSync, statSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { isAbsolute, join, resolve } from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { readAccountProfile } from "./account-state.js";
|
|
6
6
|
import { CliError, EXIT, errorCode } from "./errors.js";
|
|
7
7
|
import { classifyGwsCommand } from "./gws-command-policy.js";
|
|
8
8
|
const require = createRequire(import.meta.url);
|
|
@@ -40,36 +40,6 @@ function isFile(path) {
|
|
|
40
40
|
throw error;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
function readAccountEmail(configDir, account) {
|
|
44
|
-
const accessProfile = join(configDir, "access.json");
|
|
45
|
-
let profileFile;
|
|
46
|
-
try {
|
|
47
|
-
profileFile = lstatSync(accessProfile);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
if (errorCode(error) === "ENOENT")
|
|
51
|
-
return undefined;
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
if (!profileFile.isFile() || profileFile.isSymbolicLink()) {
|
|
55
|
-
throw new CliError(EXIT.noPermission, `unsafe account path: ${accessProfile}`);
|
|
56
|
-
}
|
|
57
|
-
let profile;
|
|
58
|
-
try {
|
|
59
|
-
profile = JSON.parse(readFileSync(accessProfile, "utf8"));
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
if (typeof profile !== "object" ||
|
|
65
|
-
profile === null ||
|
|
66
|
-
!("email" in profile) ||
|
|
67
|
-
typeof profile.email !== "string" ||
|
|
68
|
-
accountSlug(profile.email) !== account) {
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
return profile.email;
|
|
72
|
-
}
|
|
73
43
|
function ensureRuntimeDirectory(path) {
|
|
74
44
|
mkdirSync(path, { recursive: true, mode: 0o700 });
|
|
75
45
|
const directory = lstatSync(path);
|
|
@@ -145,7 +115,7 @@ export function runGws({ account, confirmed, gwsArguments, workspaceRoot, }) {
|
|
|
145
115
|
: !isFile(gwsEntrypoint)) {
|
|
146
116
|
throw new CliError(EXIT.unavailable, "gws is not installed; run: npm install");
|
|
147
117
|
}
|
|
148
|
-
const policy = classifyGwsCommand(gwsArguments,
|
|
118
|
+
const policy = classifyGwsCommand(gwsArguments, readAccountProfile(configDir, account)?.email);
|
|
149
119
|
if (policy.action === "prohibit")
|
|
150
120
|
throw new CliError(EXIT.noPermission, policy.reason);
|
|
151
121
|
if (policy.action === "confirm" && !confirmed) {
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAS1D,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACjD,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,IACE,CAAC,UAAU,CAAC,MAAM,EAAE;QACpB,UAAU,CAAC,cAAc,EAAE;QAC3B,UAAU,CAAC,IAAI,KAAK,CAAC,EACrB,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,YAAY,EACjB,oCAAoC,MAAM,EAAE,CAC7C,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAuB,EACvB,IAAY;IAEZ,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAS;QACrC,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CACf,QAAQ,EACR,KAAK,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAClE,CAAC;gBACF,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACpD,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAChC,CAAC;QACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,YAAY,CAAC,IAAI,CACf,GAAG,UAAU,IAAI,KAAK,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CACrF,CAAC;YACF,SAAS;QACX,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,EACP,SAAS,EACT,YAAY,EACZ,aAAa,GACF;IACX,IACE,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EACtB,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,aAAa,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,IACE,CAAC,sBAAsB,CAAC,WAAW,CAAC;QACpC,CAAC,sBAAsB,CAAC,UAAU,CAAC;QACnC,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAClC,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,OAAO,EACZ,oBAAoB,OAAO,oDAAoD,CAChF,CAAC;IACJ,CAAC;IACD,IACE,WAAW,KAAK,SAAS;QACvB,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC;QAC9B,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAC1B,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,WAAW,EAChB,wCAAwC,CACzC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAC/B,YAAY,EACZ,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,KAAK,CAC9C,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAC9B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,YAAY,EACjB,GAAG,MAAM,CAAC,MAAM,mEAAmE,CACpF,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,8BAA8B,CAAC;IAC7C,OAAO,MAAM,CAAC,kCAAkC,CAAC;IACjD,OAAO,MAAM,CAAC,qCAAqC,CAAC;IAEpD,MAAM,MAAM,GAAG,SAAS,CACtB,aAAa,EACb,CAAC,GAAG,aAAa,EAAE,GAAG,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,EAC/D;QACE,GAAG,EAAE,UAAU;QACf,GAAG,EAAE;YACH,GAAG,MAAM;YACT,8BAA8B,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC;YAClE,+BAA+B,EAAE,SAAS;YAC1C,oCAAoC,EAAE,SAAS;YAC/C,0BAA0B,EAAE,EAAE;SAC/B;QACD,KAAK,EAAE,SAAS;KACjB,CACF,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,WAAW,EAChB,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACjD,MAAM,IAAI,QAAQ,CAChB,CAAC,EACD,4BAA4B,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CACzD,CAAC;AACJ,CAAC"}
|