@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.
@@ -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;AAKpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgF3D"}
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('Configure API key authentication.')
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
- let token = opts['key'];
15
- if (!token) {
16
- // Interactive: read from stdin.
17
- const readline = await import('node:readline');
18
- const rl = readline.createInterface({
19
- input: process.stdin,
20
- output: process.stdout,
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
- token = await new Promise((resolve) => {
23
- rl.question('Enter your Jinko API key (jnk_...): ', (answer) => {
24
- rl.close();
25
- resolve(answer.trim());
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
- if (!token) {
30
- outputError({ code: 'INVALID_TOKEN', message: 'No API key provided.' }, globals);
31
- process.exit(3);
32
- }
33
- if (!token.startsWith('jnk_')) {
34
- outputError({ code: 'INVALID_TOKEN', message: 'API key must start with "jnk_". Get one from the Jinko developer platform.' }, globals);
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
- await writeConfigFile({ api_key: token });
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
- method: 'api_key',
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
- output({
127
+ const info = {
67
128
  authenticated: true,
68
129
  method: auth.method,
69
130
  token: masked,
70
131
  source,
71
- }, { format: globals.format });
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":"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"}
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.2.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.2.0"
16
+ "@gojinko/api-client": "0.3.0"
16
17
  },
17
18
  "publishConfig": {
18
19
  "access": "public"