multi-gws 0.0.4 → 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 +3 -0
- package/dist/account-add.d.ts +0 -1
- package/dist/account-add.d.ts.map +1 -1
- package/dist/account-add.js +14 -41
- 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/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
|
@@ -27,6 +27,9 @@ forwarded to the complete authorization process tree. Set
|
|
|
27
27
|
`MGWS_OAUTH_TIMEOUT_MS` to a positive integer to override the timeout.
|
|
28
28
|
|
|
29
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.
|
|
30
33
|
|
|
31
34
|
## Development
|
|
32
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 accountSlug(email: string): string;
|
|
8
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,8 +1,8 @@
|
|
|
1
1
|
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import { chmodSync, copyFileSync, lstatSync, mkdirSync, writeFileSync, } from "node:fs";
|
|
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
7
|
const DEFAULT_OAUTH_TIMEOUT_MS = 5 * 60 * 1000;
|
|
8
8
|
const OAUTH_KILL_GRACE_MS = 1000;
|
|
@@ -163,42 +163,15 @@ function ensurePrivateDirectory(path) {
|
|
|
163
163
|
}
|
|
164
164
|
chmodSync(path, 0o700);
|
|
165
165
|
}
|
|
166
|
-
function ensureSafeFileIfPresent(path) {
|
|
167
|
-
if (!pathExists(path))
|
|
168
|
-
return;
|
|
169
|
-
const file = lstatSync(path);
|
|
170
|
-
if (!file.isFile() || file.isSymbolicLink()) {
|
|
171
|
-
throw new CliError(EXIT.noPermission, `unsafe account path: ${path}`);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
export function accountSlug(email) {
|
|
175
|
-
const normalizedEmail = email.toLowerCase();
|
|
176
|
-
const readableSlug = normalizedEmail
|
|
177
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
178
|
-
.replace(/^-+|-+$/g, "");
|
|
179
|
-
if (readableSlug.length === 0) {
|
|
180
|
-
throw new CliError(EXIT.usage, `could not derive an account slug from: ${email}`);
|
|
181
|
-
}
|
|
182
|
-
const fingerprint = createHash("sha256")
|
|
183
|
-
.update(normalizedEmail)
|
|
184
|
-
.digest("base64url")
|
|
185
|
-
.slice(0, 16);
|
|
186
|
-
return `${readableSlug}-${fingerprint}`;
|
|
187
|
-
}
|
|
188
166
|
export async function addAccount({ email, gmail, drive, calendar, login, workspaceRoot, }) {
|
|
189
167
|
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
|
|
190
168
|
throw new CliError(EXIT.usage, `invalid email address: ${email}`);
|
|
191
169
|
}
|
|
192
170
|
const scopes = resolveAccountScopes({ gmail, drive, calendar });
|
|
193
|
-
const slug = accountSlug(email);
|
|
194
171
|
const root = resolve(workspaceRoot ?? process.cwd());
|
|
195
172
|
const credentialsDir = join(root, "credentials");
|
|
196
173
|
const oauthClient = join(credentialsDir, "google-oauth-client.json");
|
|
197
174
|
const accountsDir = join(root, "accounts");
|
|
198
|
-
const accountDir = join(accountsDir, slug);
|
|
199
|
-
const configDir = join(accountDir, "gws");
|
|
200
|
-
const accountOauthClient = join(configDir, "client_secret.json");
|
|
201
|
-
const accessProfile = join(configDir, "access.json");
|
|
202
175
|
if (!isFile(oauthClient)) {
|
|
203
176
|
throw new CliError(EXIT.noInput, `OAuth client must be a regular file, not a symlink: ${oauthClient}`);
|
|
204
177
|
}
|
|
@@ -210,6 +183,10 @@ export async function addAccount({ email, gmail, drive, calendar, login, workspa
|
|
|
210
183
|
chmodSync(credentialsDir, 0o700);
|
|
211
184
|
chmodSync(oauthClient, 0o600);
|
|
212
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");
|
|
213
190
|
ensurePrivateDirectory(accountDir);
|
|
214
191
|
ensurePrivateDirectory(configDir);
|
|
215
192
|
if (pathExists(accountOauthClient)) {
|
|
@@ -221,25 +198,21 @@ export async function addAccount({ email, gmail, drive, calendar, login, workspa
|
|
|
221
198
|
}
|
|
222
199
|
copyFileSync(oauthClient, accountOauthClient);
|
|
223
200
|
chmodSync(accountOauthClient, 0o600);
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
};
|
|
201
|
+
writeAccountProfile(configDir, {
|
|
202
|
+
slug,
|
|
203
|
+
email,
|
|
204
|
+
gmail,
|
|
205
|
+
drive,
|
|
206
|
+
calendar,
|
|
207
|
+
});
|
|
231
208
|
console.log(`Account slug: ${slug}`);
|
|
232
209
|
console.log(`Gmail access: ${gmail}`);
|
|
233
210
|
console.log(`Drive access: ${drive}`);
|
|
234
211
|
console.log(`Calendar access: ${calendar}`);
|
|
235
212
|
if (!login) {
|
|
236
|
-
saveAccessProfile();
|
|
237
213
|
console.log("Skipped OAuth login (--no-login).");
|
|
238
214
|
return 0;
|
|
239
215
|
}
|
|
240
|
-
|
|
241
|
-
if (status === 0)
|
|
242
|
-
saveAccessProfile();
|
|
243
|
-
return status;
|
|
216
|
+
return runOauthLogin(root, slug, scopes);
|
|
244
217
|
}
|
|
245
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,EAAqB,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"account-add.js","sourceRoot":"","sources":["../src/account-add.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAsB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,KAAK;SACf,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,KAAK,EACV,0CAA0C,KAAK,EAAE,CAClD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,UAAU,IAAI,KAAK;QACnB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,YAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,IAAkC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,OAAO,SAAS,CAAC;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,OAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACjD,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,IAAY;IAEZ,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,UAAU,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,KAAa;IAEb,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAE5C,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACjD,CAAC;QAED,IACE,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,eAAe,EACzE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,WAAW,EAChB,2CAA2C,KAAK,EAAE,CACnD,CAAC;AACJ,CAAC"}
|
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":"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"}
|