getmyenv 0.3.2 → 0.3.4
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 +9 -9
- package/dist/bin.js +23 -0
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -23
- package/dist/cli.js.map +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +9 -14
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/link.d.ts +2 -2
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +40 -13
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +6 -11
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +10 -17
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/token.d.ts +13 -13
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/commands/token.js +105 -144
- package/dist/commands/token.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +9 -20
- package/dist/commands/whoami.js.map +1 -1
- package/dist/lib/api.d.ts +12 -12
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +40 -81
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/bootstrap.d.ts +6 -5
- package/dist/lib/bootstrap.d.ts.map +1 -1
- package/dist/lib/bootstrap.js +15 -19
- package/dist/lib/bootstrap.js.map +1 -1
- package/dist/lib/credentials.d.ts +14 -62
- package/dist/lib/credentials.d.ts.map +1 -1
- package/dist/lib/credentials.js +40 -256
- package/dist/lib/credentials.js.map +1 -1
- package/dist/lib/fs.js +2 -2
- package/dist/lib/fs.js.map +1 -1
- package/dist/lib/pek.d.ts +1 -1
- package/dist/lib/pek.d.ts.map +1 -1
- package/dist/lib/pek.js +1 -1
- package/dist/lib/pek.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EACL,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAE1B,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAU9C,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,WAAoB,EAAE,KAAe;IACjE,IAAI,WAAW,EAAE,IAAI,EAAE;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,OAAO,SAAS;IAEV;IACA;IAFV,YACU,OAAe,EACf,KAAc;QADd,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAS;IACrB,CAAC;IAEI,OAAO,CAAC,KAA8B;QAC5C,MAAM,CAAC,GAA2B;YAChC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,wBAAwB,EAAE,WAAW;YACrC,GAAG,KAAK;SACT,CAAC;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,CAAC,CAAC,aAAa,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAc,EACd,IAAY,EACZ,IAAc,EACd,YAAqC;QAErC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACnE,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YACnC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC5D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;gBACtD,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QAC9C,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;CACF;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,OAAO,eAAe,EAAE,EAAE,KAAK,CAAC;AAClC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAC,eAAe,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAe;IAEf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;IAEpC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC9D,MAAM,YAAY,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,+DAA+D;AAC/D,KAAK,EAAE,CAAC;AACR,KAAM,EAAkB,CAAC"}
|
package/dist/lib/bootstrap.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { type WhoamiResponse } from "
|
|
1
|
+
import { type WhoamiResponse } from "./api.js";
|
|
2
2
|
export type BootstrapOpts = {
|
|
3
3
|
apiUrl?: string;
|
|
4
4
|
/** Skip confirm when linking (e.g. push --create). */
|
|
5
5
|
forceLink?: boolean;
|
|
6
|
-
/** Verb for confirm copy
|
|
7
|
-
action: "push" | "pull";
|
|
6
|
+
/** Verb for confirm copy. */
|
|
7
|
+
action: "push" | "pull" | "run" | "backup" | "restore";
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
|
-
* Ensure
|
|
11
|
-
*
|
|
10
|
+
* Ensure this folder is authorized (token) and linked to a project.
|
|
11
|
+
* TTY-only bootstrap; CI passes GETMYENV_TOKEN and either commits
|
|
12
|
+
* `.getmyenv/project.json` or runs `link --force` first.
|
|
12
13
|
*/
|
|
13
14
|
export declare function ensureTokenAndLink(opts: BootstrapOpts): Promise<{
|
|
14
15
|
who: WhoamiResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAIlB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;CACxD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;IACrE,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CA+DD"}
|
package/dist/lib/bootstrap.js
CHANGED
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
import { promptConfirm, readProjectMeta
|
|
2
|
-
import { ApiClient, ensureSessionToken,
|
|
1
|
+
import { promptConfirm, readProjectMeta } from "./fs.js";
|
|
2
|
+
import { ApiClient, ensureSessionToken, hasSessionToken, resolveApiUrl, } from "./api.js";
|
|
3
3
|
import { linkCommand } from "../commands/link.js";
|
|
4
4
|
import { tokenCommand } from "../commands/token.js";
|
|
5
5
|
/**
|
|
6
|
-
* Ensure
|
|
7
|
-
*
|
|
6
|
+
* Ensure this folder is authorized (token) and linked to a project.
|
|
7
|
+
* TTY-only bootstrap; CI passes GETMYENV_TOKEN and either commits
|
|
8
|
+
* `.getmyenv/project.json` or runs `link --force` first.
|
|
8
9
|
*/
|
|
9
10
|
export async function ensureTokenAndLink(opts) {
|
|
10
|
-
if (!
|
|
11
|
+
if (!hasSessionToken()) {
|
|
11
12
|
if (!process.stdin.isTTY) {
|
|
12
|
-
throw new Error("No CLI token.
|
|
13
|
+
throw new Error("No CLI token in this folder. Set GETMYENV_TOKEN for CI, or run in a TTY.");
|
|
13
14
|
}
|
|
14
|
-
await tokenCommand({
|
|
15
|
-
apiUrl: opts.apiUrl,
|
|
16
|
-
skipLinkOffer: true,
|
|
17
|
-
});
|
|
15
|
+
await tokenCommand({ apiUrl: opts.apiUrl, skipLinkOffer: true });
|
|
18
16
|
}
|
|
19
17
|
let meta = readProjectMeta();
|
|
20
|
-
let token = await ensureSessionToken(
|
|
21
|
-
const apiUrl = resolveApiUrl(opts.apiUrl
|
|
18
|
+
let token = await ensureSessionToken();
|
|
19
|
+
const apiUrl = resolveApiUrl(opts.apiUrl);
|
|
22
20
|
const client = new ApiClient(apiUrl, token);
|
|
23
21
|
const who = await client.request("GET", "/api/cli/whoami");
|
|
24
22
|
if (meta?.projectId && String(meta.projectId) !== String(who.projectId)) {
|
|
25
23
|
throw new Error([
|
|
26
|
-
`Linked project (${meta.projectName ?? meta.projectId}) does not match this token (${who.projectName}, ${who.projectId}).`,
|
|
27
|
-
"Run: npx getmyenv link --
|
|
28
|
-
"Or create a CLI token for this project on /cli.",
|
|
24
|
+
`Linked project (${meta.projectName ?? meta.projectId}) does not match this folder's token (${who.projectName}, ${who.projectId}).`,
|
|
25
|
+
"Run: npx getmyenv link --clear (then re-run this command)",
|
|
29
26
|
].join("\n"));
|
|
30
27
|
}
|
|
31
28
|
if (!meta?.projectId) {
|
|
32
29
|
if (opts.forceLink || process.stdin.isTTY) {
|
|
33
30
|
if (!opts.forceLink && process.stdin.isTTY) {
|
|
34
|
-
const ok = await promptConfirm(`Folder is not linked
|
|
31
|
+
const ok = await promptConfirm(`Folder is not linked to ${who.projectName}. Link and ${opts.action}?`, { defaultYes: true });
|
|
35
32
|
if (!ok) {
|
|
36
33
|
throw new Error("Run: npx getmyenv link first");
|
|
37
34
|
}
|
|
@@ -43,14 +40,13 @@ export async function ensureTokenAndLink(opts) {
|
|
|
43
40
|
skipPushOffer: true,
|
|
44
41
|
});
|
|
45
42
|
meta = readProjectMeta();
|
|
46
|
-
token = await ensureSessionToken(
|
|
43
|
+
token = await ensureSessionToken();
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
if (!meta?.projectId) {
|
|
50
47
|
throw new Error([
|
|
51
48
|
"No project is linked to this folder.",
|
|
52
|
-
"
|
|
53
|
-
"then: npx getmyenv token && npx getmyenv link",
|
|
49
|
+
"Run: npx getmyenv link",
|
|
54
50
|
].join("\n"));
|
|
55
51
|
}
|
|
56
52
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,aAAa,GAEd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAmB;IAO1D,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAE3E,IAAI,IAAI,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb;YACE,mBAAmB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,yCAAyC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,SAAS,IAAI;YACnI,6DAA6D;SAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC3C,MAAM,EAAE,GAAG,MAAM,aAAa,CAC5B,2BAA2B,GAAG,CAAC,WAAW,cAAc,IAAI,CAAC,MAAM,GAAG,EACtE,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;gBACF,IAAI,CAAC,EAAE,EAAE,CAAC;oBACR,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,MAAM,WAAW,CAAC,SAAS,EAAE;gBAC3B,MAAM;gBACN,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,GAAG,CAAC,QAAQ;gBACjB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,IAAI,GAAG,eAAe,EAAE,CAAC;YACzB,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb;YACE,sCAAsC;YACtC,wBAAwB;SACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG;QACH,MAAM;QACN,KAAK;QACL,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -1,70 +1,22 @@
|
|
|
1
1
|
export type CliScope = "development" | "production";
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Per-folder token stored in `.getmyenv/token.json`.
|
|
4
|
+
* One folder = one project = one token. No machine-global store.
|
|
5
|
+
*/
|
|
6
|
+
export type FolderToken = {
|
|
7
|
+
version: 1;
|
|
3
8
|
token: string;
|
|
9
|
+
cliScope: CliScope;
|
|
4
10
|
apiUrl?: string;
|
|
11
|
+
projectId: string;
|
|
5
12
|
projectName: string;
|
|
6
|
-
|
|
13
|
+
label?: string;
|
|
7
14
|
addedAt: string;
|
|
8
15
|
};
|
|
9
|
-
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
tokens: Record<string, TokenEntry>;
|
|
13
|
-
/** Default project id (string or number from older writes). */
|
|
14
|
-
default?: number | string;
|
|
15
|
-
};
|
|
16
|
-
/** Legacy single-token file. */
|
|
17
|
-
export type CredentialsV1 = {
|
|
18
|
-
token: string;
|
|
19
|
-
apiUrl?: string;
|
|
20
|
-
};
|
|
21
|
-
export declare function credentialsFilePath(): string;
|
|
22
|
-
export declare function readCredentialsV2(): CredentialsV2 | null;
|
|
23
|
-
/** Legacy v1 blob, if present and not yet migrated. */
|
|
24
|
-
export declare function readCredentialsV1(): CredentialsV1 | null;
|
|
25
|
-
export declare function writeCredentialsV2(creds: CredentialsV2): string;
|
|
26
|
-
export declare function upsertTokenEntry(projectId: string | number, entry: Omit<TokenEntry, "addedAt"> & {
|
|
16
|
+
export declare function tokenFilePath(cwd?: string): string;
|
|
17
|
+
export declare function readFolderToken(cwd?: string): FolderToken | null;
|
|
18
|
+
export declare function writeFolderToken(entry: Omit<FolderToken, "version" | "addedAt"> & {
|
|
27
19
|
addedAt?: string;
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
}): string;
|
|
31
|
-
export declare function removeTokenEntry(projectId: string | number): boolean;
|
|
32
|
-
export declare function clearAllCredentials(): boolean;
|
|
33
|
-
export declare function setDefaultProject(projectId: string | number): boolean;
|
|
34
|
-
export declare function findTokenByNameOrId(nameOrId: string): {
|
|
35
|
-
projectId: string;
|
|
36
|
-
entry: TokenEntry;
|
|
37
|
-
} | null;
|
|
38
|
-
export type ResolvedToken = {
|
|
39
|
-
token: string;
|
|
40
|
-
apiUrl?: string;
|
|
41
|
-
projectId?: string;
|
|
42
|
-
entry?: TokenEntry;
|
|
43
|
-
source: "env" | "linked" | "default" | "v1" | "single";
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Selection: GETMYENV_TOKEN > linked projectId entry > default > single entry > v1.
|
|
47
|
-
*/
|
|
48
|
-
export declare function resolveStoredToken(linkedProjectId?: string | number | null): ResolvedToken | null;
|
|
49
|
-
/**
|
|
50
|
-
* Migrate a v1 credentials file into v2 using whoami metadata.
|
|
51
|
-
* Returns the new store, or null if nothing to migrate / whoami failed.
|
|
52
|
-
*/
|
|
53
|
-
export declare function migrateV1ToV2(meta: {
|
|
54
|
-
projectId: string | number;
|
|
55
|
-
projectName: string;
|
|
56
|
-
cliScope: CliScope;
|
|
57
|
-
apiUrl?: string;
|
|
58
|
-
}): CredentialsV2 | null;
|
|
59
|
-
/** @deprecated Prefer resolveStoredToken / readCredentialsV2. */
|
|
60
|
-
export declare function readCredentials(): {
|
|
61
|
-
token: string;
|
|
62
|
-
apiUrl?: string;
|
|
63
|
-
} | null;
|
|
64
|
-
/** @deprecated Prefer upsertTokenEntry. */
|
|
65
|
-
export declare function writeCredentials(creds: {
|
|
66
|
-
token: string;
|
|
67
|
-
apiUrl?: string;
|
|
68
|
-
}): string;
|
|
69
|
-
export declare function clearCredentials(): boolean;
|
|
20
|
+
}, cwd?: string): string;
|
|
21
|
+
export declare function clearFolderToken(cwd?: string): boolean;
|
|
70
22
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC;AAEpD,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,SAAgB,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,WAAW,GAAG,IAAI,CAoCvE;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACtE,GAAG,SAAgB,GAClB,MAAM,CAiBR;AAED,wBAAgB,gBAAgB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAK7D"}
|
package/dist/lib/credentials.js
CHANGED
|
@@ -1,285 +1,69 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
function
|
|
5
|
-
return path.join(
|
|
3
|
+
import { getGetenvDir } from "./fs.js";
|
|
4
|
+
export function tokenFilePath(cwd = process.cwd()) {
|
|
5
|
+
return path.join(getGetenvDir(cwd), "token.json");
|
|
6
6
|
}
|
|
7
|
-
export function
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
function readRaw() {
|
|
11
|
-
const file = credentialsPath();
|
|
7
|
+
export function readFolderToken(cwd = process.cwd()) {
|
|
8
|
+
const file = tokenFilePath(cwd);
|
|
12
9
|
if (!fs.existsSync(file))
|
|
13
10
|
return null;
|
|
11
|
+
let raw;
|
|
14
12
|
try {
|
|
15
|
-
|
|
13
|
+
raw = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
16
14
|
}
|
|
17
15
|
catch {
|
|
18
16
|
return null;
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
function isV2(data) {
|
|
22
|
-
if (!data || typeof data !== "object")
|
|
23
|
-
return false;
|
|
24
|
-
const d = data;
|
|
25
|
-
return d.version === 2 && d.tokens != null && typeof d.tokens === "object";
|
|
26
|
-
}
|
|
27
|
-
function isV1(data) {
|
|
28
|
-
if (!data || typeof data !== "object")
|
|
29
|
-
return false;
|
|
30
|
-
const d = data;
|
|
31
|
-
if (d.version === 2)
|
|
32
|
-
return false;
|
|
33
|
-
return typeof d.token === "string" && d.token.trim().length > 0;
|
|
34
|
-
}
|
|
35
|
-
export function readCredentialsV2() {
|
|
36
|
-
const raw = readRaw();
|
|
37
|
-
if (!isV2(raw))
|
|
18
|
+
if (!raw || typeof raw !== "object")
|
|
38
19
|
return null;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const e = entry;
|
|
44
|
-
if (!e.token || typeof e.token !== "string")
|
|
45
|
-
continue;
|
|
46
|
-
const scope = e.cliScope === "production" ? "production" : "development";
|
|
47
|
-
tokens[String(id)] = {
|
|
48
|
-
token: e.token.trim(),
|
|
49
|
-
apiUrl: typeof e.apiUrl === "string" && e.apiUrl.trim()
|
|
50
|
-
? e.apiUrl.trim()
|
|
51
|
-
: undefined,
|
|
52
|
-
projectName: typeof e.projectName === "string" && e.projectName.trim()
|
|
53
|
-
? e.projectName.trim()
|
|
54
|
-
: String(id),
|
|
55
|
-
cliScope: scope,
|
|
56
|
-
addedAt: typeof e.addedAt === "string" && e.addedAt
|
|
57
|
-
? e.addedAt
|
|
58
|
-
: new Date().toISOString(),
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
version: 2,
|
|
63
|
-
tokens,
|
|
64
|
-
default: raw.default != null ? raw.default : undefined,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
/** Legacy v1 blob, if present and not yet migrated. */
|
|
68
|
-
export function readCredentialsV1() {
|
|
69
|
-
const raw = readRaw();
|
|
70
|
-
if (!isV1(raw))
|
|
20
|
+
const d = raw;
|
|
21
|
+
if (typeof d.token !== "string" || !d.token.trim())
|
|
22
|
+
return null;
|
|
23
|
+
if (typeof d.projectId !== "string" && typeof d.projectId !== "number") {
|
|
71
24
|
return null;
|
|
25
|
+
}
|
|
26
|
+
const scope = d.cliScope === "production" ? "production" : "development";
|
|
72
27
|
return {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
28
|
+
version: 1,
|
|
29
|
+
token: d.token.trim(),
|
|
30
|
+
cliScope: scope,
|
|
31
|
+
apiUrl: typeof d.apiUrl === "string" && d.apiUrl.trim()
|
|
32
|
+
? d.apiUrl.trim()
|
|
76
33
|
: undefined,
|
|
34
|
+
projectId: String(d.projectId),
|
|
35
|
+
projectName: typeof d.projectName === "string" && d.projectName.trim()
|
|
36
|
+
? d.projectName.trim()
|
|
37
|
+
: String(d.projectId),
|
|
38
|
+
label: typeof d.label === "string" && d.label.trim() ? d.label.trim() : undefined,
|
|
39
|
+
addedAt: typeof d.addedAt === "string" && d.addedAt
|
|
40
|
+
? d.addedAt
|
|
41
|
+
: new Date().toISOString(),
|
|
77
42
|
};
|
|
78
43
|
}
|
|
79
|
-
export function
|
|
80
|
-
const file =
|
|
81
|
-
|
|
82
|
-
for (const [id, entry] of Object.entries(creds.tokens)) {
|
|
83
|
-
tokens[String(id)] = {
|
|
84
|
-
token: entry.token.trim(),
|
|
85
|
-
projectName: entry.projectName,
|
|
86
|
-
cliScope: entry.cliScope,
|
|
87
|
-
addedAt: entry.addedAt,
|
|
88
|
-
...(entry.apiUrl?.trim() ? { apiUrl: entry.apiUrl.trim() } : {}),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
44
|
+
export function writeFolderToken(entry, cwd = process.cwd()) {
|
|
45
|
+
const file = tokenFilePath(cwd);
|
|
46
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
91
47
|
const payload = {
|
|
92
|
-
version:
|
|
93
|
-
|
|
94
|
-
|
|
48
|
+
version: 1,
|
|
49
|
+
token: entry.token.trim(),
|
|
50
|
+
cliScope: entry.cliScope,
|
|
51
|
+
projectId: String(entry.projectId),
|
|
52
|
+
projectName: entry.projectName,
|
|
53
|
+
...(entry.apiUrl?.trim() ? { apiUrl: entry.apiUrl.trim() } : {}),
|
|
54
|
+
...(entry.label?.trim() ? { label: entry.label.trim() } : {}),
|
|
55
|
+
addedAt: entry.addedAt ?? new Date().toISOString(),
|
|
95
56
|
};
|
|
96
57
|
fs.writeFileSync(file, JSON.stringify(payload, null, 2) + "\n", {
|
|
97
58
|
mode: 0o600,
|
|
98
59
|
});
|
|
99
60
|
return file;
|
|
100
61
|
}
|
|
101
|
-
export function
|
|
102
|
-
const
|
|
103
|
-
const existing = readCredentialsV2() ?? { version: 2, tokens: {} };
|
|
104
|
-
existing.tokens[id] = {
|
|
105
|
-
token: entry.token.trim(),
|
|
106
|
-
projectName: entry.projectName,
|
|
107
|
-
cliScope: entry.cliScope,
|
|
108
|
-
addedAt: entry.addedAt ?? new Date().toISOString(),
|
|
109
|
-
...(entry.apiUrl?.trim() ? { apiUrl: entry.apiUrl.trim() } : {}),
|
|
110
|
-
};
|
|
111
|
-
if (opts?.setDefault !== false) {
|
|
112
|
-
existing.default = id;
|
|
113
|
-
}
|
|
114
|
-
else if (existing.default == null) {
|
|
115
|
-
existing.default = id;
|
|
116
|
-
}
|
|
117
|
-
return writeCredentialsV2(existing);
|
|
118
|
-
}
|
|
119
|
-
export function removeTokenEntry(projectId) {
|
|
120
|
-
const store = readCredentialsV2();
|
|
121
|
-
if (!store)
|
|
122
|
-
return false;
|
|
123
|
-
const id = String(projectId);
|
|
124
|
-
if (!store.tokens[id])
|
|
125
|
-
return false;
|
|
126
|
-
delete store.tokens[id];
|
|
127
|
-
if (String(store.default) === id) {
|
|
128
|
-
const remaining = Object.keys(store.tokens);
|
|
129
|
-
store.default = remaining[0];
|
|
130
|
-
}
|
|
131
|
-
if (Object.keys(store.tokens).length === 0) {
|
|
132
|
-
return clearAllCredentials();
|
|
133
|
-
}
|
|
134
|
-
writeCredentialsV2(store);
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
export function clearAllCredentials() {
|
|
138
|
-
const file = credentialsPath();
|
|
62
|
+
export function clearFolderToken(cwd = process.cwd()) {
|
|
63
|
+
const file = tokenFilePath(cwd);
|
|
139
64
|
if (!fs.existsSync(file))
|
|
140
65
|
return false;
|
|
141
66
|
fs.unlinkSync(file);
|
|
142
67
|
return true;
|
|
143
68
|
}
|
|
144
|
-
export function setDefaultProject(projectId) {
|
|
145
|
-
const store = readCredentialsV2();
|
|
146
|
-
if (!store)
|
|
147
|
-
return false;
|
|
148
|
-
const id = String(projectId);
|
|
149
|
-
if (!store.tokens[id])
|
|
150
|
-
return false;
|
|
151
|
-
store.default = id;
|
|
152
|
-
writeCredentialsV2(store);
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
export function findTokenByNameOrId(nameOrId) {
|
|
156
|
-
const store = readCredentialsV2();
|
|
157
|
-
if (!store)
|
|
158
|
-
return null;
|
|
159
|
-
const needle = nameOrId.trim().toLowerCase();
|
|
160
|
-
if (store.tokens[nameOrId.trim()]) {
|
|
161
|
-
return { projectId: nameOrId.trim(), entry: store.tokens[nameOrId.trim()] };
|
|
162
|
-
}
|
|
163
|
-
const matches = Object.entries(store.tokens).filter(([id, e]) => id === nameOrId.trim() ||
|
|
164
|
-
e.projectName.toLowerCase() === needle ||
|
|
165
|
-
e.projectName.toLowerCase().includes(needle));
|
|
166
|
-
if (matches.length === 1) {
|
|
167
|
-
return { projectId: matches[0][0], entry: matches[0][1] };
|
|
168
|
-
}
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Selection: GETMYENV_TOKEN > linked projectId entry > default > single entry > v1.
|
|
173
|
-
*/
|
|
174
|
-
export function resolveStoredToken(linkedProjectId) {
|
|
175
|
-
const fromEnv = process.env.GETMYENV_TOKEN?.trim();
|
|
176
|
-
if (fromEnv) {
|
|
177
|
-
return { token: fromEnv, source: "env" };
|
|
178
|
-
}
|
|
179
|
-
const store = readCredentialsV2();
|
|
180
|
-
if (store) {
|
|
181
|
-
if (linkedProjectId != null) {
|
|
182
|
-
const id = String(linkedProjectId);
|
|
183
|
-
const entry = store.tokens[id];
|
|
184
|
-
if (entry) {
|
|
185
|
-
return {
|
|
186
|
-
token: entry.token,
|
|
187
|
-
apiUrl: entry.apiUrl,
|
|
188
|
-
projectId: id,
|
|
189
|
-
entry,
|
|
190
|
-
source: "linked",
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
if (store.default != null) {
|
|
195
|
-
const id = String(store.default);
|
|
196
|
-
const entry = store.tokens[id];
|
|
197
|
-
if (entry) {
|
|
198
|
-
return {
|
|
199
|
-
token: entry.token,
|
|
200
|
-
apiUrl: entry.apiUrl,
|
|
201
|
-
projectId: id,
|
|
202
|
-
entry,
|
|
203
|
-
source: "default",
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
const ids = Object.keys(store.tokens);
|
|
208
|
-
if (ids.length === 1) {
|
|
209
|
-
const id = ids[0];
|
|
210
|
-
const entry = store.tokens[id];
|
|
211
|
-
return {
|
|
212
|
-
token: entry.token,
|
|
213
|
-
apiUrl: entry.apiUrl,
|
|
214
|
-
projectId: id,
|
|
215
|
-
entry,
|
|
216
|
-
source: "single",
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
const v1 = readCredentialsV1();
|
|
222
|
-
if (v1) {
|
|
223
|
-
return { token: v1.token, apiUrl: v1.apiUrl, source: "v1" };
|
|
224
|
-
}
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Migrate a v1 credentials file into v2 using whoami metadata.
|
|
229
|
-
* Returns the new store, or null if nothing to migrate / whoami failed.
|
|
230
|
-
*/
|
|
231
|
-
export function migrateV1ToV2(meta) {
|
|
232
|
-
const v1 = readCredentialsV1();
|
|
233
|
-
if (!v1)
|
|
234
|
-
return null;
|
|
235
|
-
const id = String(meta.projectId);
|
|
236
|
-
const store = {
|
|
237
|
-
version: 2,
|
|
238
|
-
tokens: {
|
|
239
|
-
[id]: {
|
|
240
|
-
token: v1.token,
|
|
241
|
-
apiUrl: meta.apiUrl ?? v1.apiUrl,
|
|
242
|
-
projectName: meta.projectName,
|
|
243
|
-
cliScope: meta.cliScope,
|
|
244
|
-
addedAt: new Date().toISOString(),
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
default: id,
|
|
248
|
-
};
|
|
249
|
-
writeCredentialsV2(store);
|
|
250
|
-
return store;
|
|
251
|
-
}
|
|
252
|
-
/** @deprecated Prefer resolveStoredToken / readCredentialsV2. */
|
|
253
|
-
export function readCredentials() {
|
|
254
|
-
const resolved = resolveStoredToken();
|
|
255
|
-
if (!resolved)
|
|
256
|
-
return null;
|
|
257
|
-
return { token: resolved.token, apiUrl: resolved.apiUrl };
|
|
258
|
-
}
|
|
259
|
-
/** @deprecated Prefer upsertTokenEntry. */
|
|
260
|
-
export function writeCredentials(creds) {
|
|
261
|
-
const existing = readCredentialsV2();
|
|
262
|
-
if (existing && Object.keys(existing.tokens).length > 0) {
|
|
263
|
-
const id = String(existing.default ?? Object.keys(existing.tokens)[0] ?? "unknown");
|
|
264
|
-
const prev = existing.tokens[id];
|
|
265
|
-
return upsertTokenEntry(id, {
|
|
266
|
-
token: creds.token,
|
|
267
|
-
apiUrl: creds.apiUrl ?? prev?.apiUrl,
|
|
268
|
-
projectName: prev?.projectName ?? id,
|
|
269
|
-
cliScope: prev?.cliScope ?? "development",
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
// Write a temporary v1-shaped file until whoami upgrades it.
|
|
273
|
-
const file = credentialsPath();
|
|
274
|
-
const payload = { token: creds.token.trim() };
|
|
275
|
-
if (creds.apiUrl?.trim())
|
|
276
|
-
payload.apiUrl = creds.apiUrl.trim();
|
|
277
|
-
fs.writeFileSync(file, JSON.stringify(payload, null, 2) + "\n", {
|
|
278
|
-
mode: 0o600,
|
|
279
|
-
});
|
|
280
|
-
return file;
|
|
281
|
-
}
|
|
282
|
-
export function clearCredentials() {
|
|
283
|
-
return clearAllCredentials();
|
|
284
|
-
}
|
|
285
69
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmBvC,MAAM,UAAU,aAAa,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,CAAC,GAAG,GAA2B,CAAC;IACtC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAa,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IACnF,OAAO;QACL,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACrB,QAAQ,EAAE,KAAK;QACf,MAAM,EACJ,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YAC7C,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YACjB,CAAC,CAAC,SAAS;QACf,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9B,WAAW,EACT,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE;YACvD,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE;YACtB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACzB,KAAK,EACH,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;QAC5E,OAAO,EACL,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO;YACxC,CAAC,CAAC,CAAC,CAAC,OAAO;YACX,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAsE,EACtE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAgB;QAC3B,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAClC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnD,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC9D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAClD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/lib/fs.js
CHANGED
|
@@ -156,8 +156,8 @@ export function requireLinkedProject(meta) {
|
|
|
156
156
|
if (!meta?.projectId) {
|
|
157
157
|
throw new Error([
|
|
158
158
|
"No project is linked to this folder.",
|
|
159
|
-
"
|
|
160
|
-
"
|
|
159
|
+
"Run any verb (push / run) in a TTY and it will authorize + link on first use,",
|
|
160
|
+
"or run: npx getmyenv link",
|
|
161
161
|
].join("\n"));
|
|
162
162
|
}
|
|
163
163
|
}
|