-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathdevice.ts
104 lines (94 loc) · 3.71 KB
/
device.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* Copyright (c) 2020, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
import {
type AuthFields,
AuthInfo,
DeviceOauthService,
Messages,
type OAuth2Config,
type DeviceCodeResponse,
} from '@salesforce/core';
import { Flags, SfCommand, loglevel, Ux } from '@salesforce/sf-plugins-core';
import common from '../../../common.js';
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
const messages = Messages.loadMessages('@salesforce/plugin-auth', 'device.login');
const commonMessages = Messages.loadMessages('@salesforce/plugin-auth', 'messages');
export type DeviceLoginResult = (AuthFields & DeviceCodeResponse) | Record<string, never>;
export default class LoginDevice extends SfCommand<DeviceLoginResult> {
public static readonly summary = messages.getMessage('summary');
public static readonly description = messages.getMessage('description');
public static readonly examples = messages.getMessages('examples');
public static readonly aliases = ['force:auth:device:login', 'auth:device:login'];
public static readonly deprecateAliases = true;
public static readonly flags = {
'client-id': Flags.string({
char: 'i',
summary: commonMessages.getMessage('flags.client-id.summary'),
deprecateAliases: true,
aliases: ['clientid'],
}),
'instance-url': Flags.url({
char: 'r',
summary: commonMessages.getMessage('flags.instance-url.summary'),
description: commonMessages.getMessage('flags.instance-url.description'),
deprecateAliases: true,
aliases: ['instanceurl'],
}),
'set-default-dev-hub': Flags.boolean({
char: 'd',
summary: commonMessages.getMessage('flags.set-default-dev-hub.summary'),
deprecateAliases: true,
aliases: ['setdefaultdevhub', 'setdefaultdevhubusername'],
}),
'set-default': Flags.boolean({
char: 's',
summary: commonMessages.getMessage('flags.set-default.summary'),
deprecateAliases: true,
aliases: ['setdefaultusername'],
}),
alias: Flags.string({
char: 'a',
summary: commonMessages.getMessage('flags.alias.summary'),
deprecateAliases: true,
aliases: ['setalias'],
}),
loglevel,
};
public async run(): Promise<DeviceLoginResult> {
const { flags } = await this.parse(LoginDevice);
if (await common.shouldExitCommand(false)) return {};
const oauthConfig: OAuth2Config = {
loginUrl: await common.resolveLoginUrl(flags['instance-url']?.href),
clientId: flags['client-id'],
};
const deviceOauthService = await DeviceOauthService.create(oauthConfig);
const loginData = await deviceOauthService.requestDeviceLogin();
if (this.jsonEnabled()) {
new Ux().log(JSON.stringify(loginData, null, 2));
} else {
this.styledHeader(messages.getMessage('actionRequired'));
this.log(messages.getMessage('enterCode', [loginData.user_code, loginData.verification_uri]));
this.log();
}
const approval = await deviceOauthService.awaitDeviceApproval(loginData);
if (approval) {
const authInfo = await deviceOauthService.authorizeAndSave(approval);
await authInfo.handleAliasAndDefaultSettings({
alias: flags.alias,
setDefault: flags['set-default'],
setDefaultDevHub: flags['set-default-dev-hub'],
});
const fields = authInfo.getFields(true);
await AuthInfo.identifyPossibleScratchOrgs(fields, authInfo);
const successMsg = messages.getMessage('success', [fields.username]);
this.logSuccess(successMsg);
return { ...fields, ...loginData };
} else {
return {};
}
}
}