@gojinko/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/auth/index.d.ts.map +1 -1
- package/dist/commands/auth/index.js +103 -27
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/prompt.d.ts +14 -0
- package/dist/commands/auth/prompt.d.ts.map +1 -0
- package/dist/commands/auth/prompt.js +32 -0
- package/dist/commands/auth/prompt.js.map +1 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+J3D"}
|
|
@@ -1,44 +1,105 @@
|
|
|
1
|
-
import { resolveAuth, writeConfigFile, CONFIG_FILE } from '@gojinko/api-client';
|
|
1
|
+
import { resolveAuth, writeConfigFile, clearAuthConfig, readConfigFile, CONFIG_FILE, requestDeviceAuthorization, pollForToken, OAuthError, } from '@gojinko/api-client';
|
|
2
2
|
import { output, outputError } from '../shared.js';
|
|
3
3
|
import { getGlobalOptions } from '../../config/config.js';
|
|
4
|
+
import { promptChoice, promptText } from './prompt.js';
|
|
4
5
|
export function registerAuthCommands(program) {
|
|
5
6
|
const auth = program
|
|
6
7
|
.command('auth')
|
|
7
8
|
.description('Manage authentication.');
|
|
8
9
|
auth
|
|
9
10
|
.command('login')
|
|
10
|
-
.description('
|
|
11
|
-
.option('--key <token>', 'API key (jnk_...)')
|
|
11
|
+
.description('Authenticate with Jinko (OAuth or API key).')
|
|
12
|
+
.option('--key <token>', 'API key (jnk_...) — skip interactive prompt')
|
|
12
13
|
.action(async (opts, cmd) => {
|
|
13
14
|
const globals = getGlobalOptions(cmd);
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
// Fast path: --key flag → direct API key save
|
|
16
|
+
if (opts['key']) {
|
|
17
|
+
const token = opts['key'];
|
|
18
|
+
if (!token.startsWith('jnk_')) {
|
|
19
|
+
outputError({ code: 'INVALID_TOKEN', message: 'API key must start with "jnk_". Get one from the Jinko developer platform.' }, globals);
|
|
20
|
+
process.exit(3);
|
|
21
|
+
}
|
|
22
|
+
await writeConfigFile({ api_key: token });
|
|
23
|
+
output({
|
|
24
|
+
status: 'ok',
|
|
25
|
+
method: 'api_key',
|
|
26
|
+
message: `API key saved to ${CONFIG_FILE}`,
|
|
27
|
+
}, { format: globals.format });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Interactive: choose auth method
|
|
31
|
+
const method = await promptChoice('How would you like to authenticate?', [
|
|
32
|
+
{ label: 'OAuth — sign in with browser (recommended)', value: 'oauth' },
|
|
33
|
+
{ label: 'API key — paste a jnk_... token', value: 'api_key' },
|
|
34
|
+
]);
|
|
35
|
+
if (method === 'api_key') {
|
|
36
|
+
const token = await promptText('Enter your Jinko API key (jnk_...): ');
|
|
37
|
+
if (!token) {
|
|
38
|
+
outputError({ code: 'INVALID_TOKEN', message: 'No API key provided.' }, globals);
|
|
39
|
+
process.exit(3);
|
|
40
|
+
}
|
|
41
|
+
if (!token.startsWith('jnk_')) {
|
|
42
|
+
outputError({ code: 'INVALID_TOKEN', message: 'API key must start with "jnk_". Get one from the Jinko developer platform.' }, globals);
|
|
43
|
+
process.exit(3);
|
|
44
|
+
}
|
|
45
|
+
await writeConfigFile({ api_key: token });
|
|
46
|
+
output({
|
|
47
|
+
status: 'ok',
|
|
48
|
+
method: 'api_key',
|
|
49
|
+
message: `API key saved to ${CONFIG_FILE}`,
|
|
50
|
+
}, { format: globals.format });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// OAuth Device Authorization Flow
|
|
54
|
+
try {
|
|
55
|
+
console.log('Requesting device authorization...\n');
|
|
56
|
+
const device = await requestDeviceAuthorization();
|
|
57
|
+
console.log(`Visit this URL to authenticate:\n`);
|
|
58
|
+
console.log(` ${device.verification_uri_complete}\n`);
|
|
59
|
+
console.log(`Or go to ${device.verification_uri} and enter code: ${device.user_code}\n`);
|
|
60
|
+
// Try to open browser automatically
|
|
61
|
+
try {
|
|
62
|
+
const open = await import('open');
|
|
63
|
+
await open.default(device.verification_uri_complete);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Browser open failed — URL is already printed above
|
|
67
|
+
}
|
|
68
|
+
console.log('Waiting for approval...');
|
|
69
|
+
const tokens = await pollForToken(device.device_code, {
|
|
70
|
+
intervalSeconds: device.interval,
|
|
71
|
+
expiresIn: device.expires_in,
|
|
21
72
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
73
|
+
await writeConfigFile({
|
|
74
|
+
oauth: {
|
|
75
|
+
access_token: tokens.access_token,
|
|
76
|
+
refresh_token: tokens.refresh_token,
|
|
77
|
+
expires_at: tokens.expires_at,
|
|
78
|
+
},
|
|
27
79
|
});
|
|
80
|
+
output({
|
|
81
|
+
status: 'ok',
|
|
82
|
+
method: 'oauth',
|
|
83
|
+
message: `Authenticated successfully. Credentials saved to ${CONFIG_FILE}`,
|
|
84
|
+
}, { format: globals.format });
|
|
28
85
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
process.exit(3);
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error instanceof OAuthError) {
|
|
88
|
+
outputError({ code: 'OAUTH_ERROR', message: error.message }, globals);
|
|
89
|
+
process.exit(3);
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
36
92
|
}
|
|
37
|
-
|
|
93
|
+
});
|
|
94
|
+
auth
|
|
95
|
+
.command('logout')
|
|
96
|
+
.description('Clear stored credentials.')
|
|
97
|
+
.action(async (_opts, cmd) => {
|
|
98
|
+
const globals = getGlobalOptions(cmd);
|
|
99
|
+
await clearAuthConfig();
|
|
38
100
|
output({
|
|
39
101
|
status: 'ok',
|
|
40
|
-
|
|
41
|
-
message: `API key saved to ${CONFIG_FILE}`,
|
|
102
|
+
message: 'Credentials cleared.',
|
|
42
103
|
}, { format: globals.format });
|
|
43
104
|
});
|
|
44
105
|
auth
|
|
@@ -63,12 +124,27 @@ export function registerAuthCommands(program) {
|
|
|
63
124
|
: process.env['JINKO_API_KEY']
|
|
64
125
|
? 'env'
|
|
65
126
|
: 'config';
|
|
66
|
-
|
|
127
|
+
const info = {
|
|
67
128
|
authenticated: true,
|
|
68
129
|
method: auth.method,
|
|
69
130
|
token: masked,
|
|
70
131
|
source,
|
|
71
|
-
}
|
|
132
|
+
};
|
|
133
|
+
// Add expiry info for OAuth
|
|
134
|
+
if (auth.method === 'oauth' && source === 'config') {
|
|
135
|
+
const config = await readConfigFile();
|
|
136
|
+
if (config?.oauth?.expires_at) {
|
|
137
|
+
const remainingMs = config.oauth.expires_at - Date.now();
|
|
138
|
+
if (remainingMs > 0) {
|
|
139
|
+
const minutes = Math.round(remainingMs / 60_000);
|
|
140
|
+
info['expires_in'] = `${minutes} minute${minutes !== 1 ? 's' : ''}`;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
info['expires_in'] = 'expired (will auto-refresh on next request)';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
output(info, { format: globals.format });
|
|
72
148
|
});
|
|
73
149
|
}
|
|
74
150
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface Choice<T> {
|
|
2
|
+
readonly label: string;
|
|
3
|
+
readonly value: T;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Interactive numbered-menu prompt. Returns selected value.
|
|
7
|
+
*/
|
|
8
|
+
export declare function promptChoice<T>(question: string, choices: ReadonlyArray<Choice<T>>): Promise<T>;
|
|
9
|
+
/**
|
|
10
|
+
* Simple text prompt. Returns trimmed input.
|
|
11
|
+
*/
|
|
12
|
+
export declare function promptText(question: string): Promise<string>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/prompt.ts"],"names":[],"mappings":"AAEA,UAAU,MAAM,CAAC,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAgBrG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
/**
|
|
3
|
+
* Interactive numbered-menu prompt. Returns selected value.
|
|
4
|
+
*/
|
|
5
|
+
export async function promptChoice(question, choices) {
|
|
6
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
7
|
+
const menu = choices.map((c, i) => ` ${i + 1}) ${c.label}`).join('\n');
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
rl.question(`${question}\n${menu}\n\nChoice: `, (answer) => {
|
|
10
|
+
rl.close();
|
|
11
|
+
const index = parseInt(answer.trim(), 10) - 1;
|
|
12
|
+
if (isNaN(index) || index < 0 || index >= choices.length) {
|
|
13
|
+
reject(new Error('Invalid choice'));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
resolve(choices[index].value);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Simple text prompt. Returns trimmed input.
|
|
22
|
+
*/
|
|
23
|
+
export async function promptText(question) {
|
|
24
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
rl.question(question, (answer) => {
|
|
27
|
+
rl.close();
|
|
28
|
+
resolve(answer.trim());
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/commands/auth/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB,EAAE,OAAiC;IACvF,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,KAAK,IAAI,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;YACzD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACzD,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACrC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gojinko/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"jinko": "./dist/bin/jinko.js"
|
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"commander": "^12.1.0",
|
|
12
12
|
"chalk": "^5.4.1",
|
|
13
|
+
"open": "^10.0.0",
|
|
13
14
|
"zod": "^3.23.8",
|
|
14
15
|
"yaml": "^2.7.0",
|
|
15
|
-
"@gojinko/api-client": "0.
|
|
16
|
+
"@gojinko/api-client": "0.3.0"
|
|
16
17
|
},
|
|
17
18
|
"publishConfig": {
|
|
18
19
|
"access": "public"
|