kasy-cli 1.21.7 → 1.21.8
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.
|
@@ -19,6 +19,7 @@ const path = require('node:path');
|
|
|
19
19
|
const fs = require('fs-extra');
|
|
20
20
|
const os = require('node:os');
|
|
21
21
|
const { getInstallGuide } = require('../../../utils/checks');
|
|
22
|
+
const { keytoolBin } = require('../../../utils/env-tools');
|
|
22
23
|
|
|
23
24
|
const execAsync = promisify(exec);
|
|
24
25
|
|
|
@@ -536,7 +537,7 @@ async function ensureDebugKeystore() {
|
|
|
536
537
|
if (!(await fs.pathExists(DEBUG_KEYSTORE))) {
|
|
537
538
|
await fs.ensureDir(androidDir);
|
|
538
539
|
const createResult = await run(
|
|
539
|
-
|
|
540
|
+
`${keytoolBin()} -genkeypair -v -keystore "${DEBUG_KEYSTORE}" -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=Android Debug,O=Android,C=US" -noprompt`
|
|
540
541
|
);
|
|
541
542
|
if (!createResult.ok) return { ok: false, error: createResult.stderr || createResult.error };
|
|
542
543
|
}
|
|
@@ -552,7 +553,7 @@ async function extractSha1() {
|
|
|
552
553
|
if (!ensureResult.ok) return ensureResult;
|
|
553
554
|
|
|
554
555
|
const result = await run(
|
|
555
|
-
|
|
556
|
+
`${keytoolBin()} -list -v -keystore "${DEBUG_KEYSTORE}" -alias androiddebugkey -storepass android -keypass android`
|
|
556
557
|
);
|
|
557
558
|
if (!result.ok) return { ok: false, error: result.stderr || result.error };
|
|
558
559
|
|
|
@@ -13,16 +13,29 @@ const { exec, execFile } = require('node:child_process');
|
|
|
13
13
|
const { promisify } = require('node:util');
|
|
14
14
|
const path = require('node:path');
|
|
15
15
|
const fs = require('fs-extra');
|
|
16
|
+
const { augmentedEnv } = require('../../../utils/env-tools');
|
|
16
17
|
|
|
17
18
|
const execAsync = promisify(exec);
|
|
18
19
|
const execFileAsync = promisify(execFile);
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Parse JSON from a CLI's stdout tolerantly. The Supabase CLI sometimes prints
|
|
23
|
+
* an "update available" notice before the JSON payload (more often on Windows),
|
|
24
|
+
* which would break a strict JSON.parse — so we grab from the first [ or {.
|
|
25
|
+
*/
|
|
26
|
+
function parseJsonLoose(stdout) {
|
|
27
|
+
const s = (stdout || '').trim();
|
|
28
|
+
const start = s.search(/[[{]/);
|
|
29
|
+
if (start === -1) return null;
|
|
30
|
+
try { return JSON.parse(s.slice(start)); } catch { return null; }
|
|
31
|
+
}
|
|
32
|
+
|
|
20
33
|
async function run(cmd, cwd, env = {}) {
|
|
21
34
|
try {
|
|
22
35
|
const { stdout, stderr } = await execAsync(cmd, {
|
|
23
36
|
cwd,
|
|
24
37
|
maxBuffer: 10 * 1024 * 1024,
|
|
25
|
-
env: { ...
|
|
38
|
+
env: { ...augmentedEnv(), ...env },
|
|
26
39
|
});
|
|
27
40
|
return { ok: true, stdout, stderr };
|
|
28
41
|
} catch (err) {
|
|
@@ -40,13 +53,14 @@ async function run(cmd, cwd, env = {}) {
|
|
|
40
53
|
*/
|
|
41
54
|
async function checkLoggedIn() {
|
|
42
55
|
const result = await run('supabase projects list -o json', process.cwd());
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} catch {
|
|
56
|
+
// Trust the exit code: a successful command means we're authenticated. Only a
|
|
57
|
+
// non-zero exit (e.g. "Access token not provided") means login is required.
|
|
58
|
+
// The list itself is parsed best-effort (tolerant of update notices).
|
|
59
|
+
if (!result.ok) {
|
|
48
60
|
return { ok: false, error: 'Supabase login required. Run: supabase login' };
|
|
49
61
|
}
|
|
62
|
+
const data = parseJsonLoose(result.stdout);
|
|
63
|
+
return { ok: true, projects: Array.isArray(data) ? data : [] };
|
|
50
64
|
}
|
|
51
65
|
|
|
52
66
|
/**
|
|
@@ -69,13 +83,9 @@ async function getProjectsByOrg(orgId) {
|
|
|
69
83
|
async function getOrgsList() {
|
|
70
84
|
const result = await run('supabase orgs list -o json', process.cwd());
|
|
71
85
|
if (!result.ok) return { ok: false, error: result.error };
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return { ok: true, orgs: orgs.map((o) => ({ id: o.id, name: o.name || o.id })) };
|
|
76
|
-
} catch {
|
|
77
|
-
return { ok: false, error: 'Could not parse orgs list. Run: supabase login' };
|
|
78
|
-
}
|
|
86
|
+
const data = parseJsonLoose(result.stdout);
|
|
87
|
+
const orgs = Array.isArray(data) ? data : [];
|
|
88
|
+
return { ok: true, orgs: orgs.map((o) => ({ id: o.id, name: o.name || o.id })) };
|
|
79
89
|
}
|
|
80
90
|
|
|
81
91
|
/**
|
package/lib/utils/env-tools.js
CHANGED
|
@@ -69,6 +69,30 @@ function pubCacheBin(name) {
|
|
|
69
69
|
return `"${file}"`;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Quoted path to `keytool` (used for the Android debug SHA-1). It ships with
|
|
74
|
+
* the JDK and is almost never on PATH on Windows, so we look in JAVA_HOME and
|
|
75
|
+
* Android Studio's bundled JBR before falling back to bare `keytool`.
|
|
76
|
+
*/
|
|
77
|
+
function keytoolBin() {
|
|
78
|
+
const exe = isWindows ? 'keytool.exe' : 'keytool';
|
|
79
|
+
const candidates = [];
|
|
80
|
+
if (process.env.JAVA_HOME) candidates.push(path.join(process.env.JAVA_HOME, 'bin', exe));
|
|
81
|
+
if (isWindows) {
|
|
82
|
+
const pf = process.env.ProgramFiles;
|
|
83
|
+
const local = process.env.LOCALAPPDATA;
|
|
84
|
+
if (pf) candidates.push(path.win32.join(pf, 'Android', 'Android Studio', 'jbr', 'bin', exe));
|
|
85
|
+
if (local) candidates.push(path.win32.join(local, 'Programs', 'Android Studio', 'jbr', 'bin', exe));
|
|
86
|
+
if (pf) candidates.push(path.win32.join(pf, 'Android', 'Android Studio', 'jre', 'bin', exe));
|
|
87
|
+
} else {
|
|
88
|
+
candidates.push('/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/keytool');
|
|
89
|
+
}
|
|
90
|
+
for (const candidate of candidates) {
|
|
91
|
+
if (fs.existsSync(candidate)) return `"${candidate}"`;
|
|
92
|
+
}
|
|
93
|
+
return 'keytool';
|
|
94
|
+
}
|
|
95
|
+
|
|
72
96
|
/**
|
|
73
97
|
* Well-known install dirs of tools that may not be on the frozen session PATH
|
|
74
98
|
* yet — e.g. the Google Cloud SDK right after it's installed mid-run. Only
|
|
@@ -114,5 +138,6 @@ module.exports = {
|
|
|
114
138
|
homeDir,
|
|
115
139
|
pubCacheBinDir,
|
|
116
140
|
pubCacheBin,
|
|
141
|
+
keytoolBin,
|
|
117
142
|
augmentedEnv,
|
|
118
143
|
};
|