Skip to content

Commit c2677f7

Browse files
authored
feat(open): rdme open should have a flag for opening the dash (#671)
* feat(open): add --dash option * feat(open): add logic to open project dash * refactor(versionSelect): add parameter to automatically return stable version * test: add tests for `rdme open` with `--dash` flag * Merge branch 'main' into darren/rm-5741 * chore: copy changes * refactor: add check to ensure user is logged in * test: update `open --dash` test
1 parent 1aa7214 commit c2677f7

File tree

3 files changed

+83
-4
lines changed

3 files changed

+83
-4
lines changed

__tests__/cmds/open.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import type { Version } from '../../src/cmds/versions';
2+
13
import chalk from 'chalk';
24
import config from 'config';
35

46
import Command from '../../src/cmds/open';
57
import configStore from '../../src/lib/configstore';
8+
import getAPIMock from '../helpers/get-api-mock';
69

710
const cmd = new Command();
811

@@ -30,4 +33,53 @@ describe('rdme open', () => {
3033

3134
return expect(cmd.run({ mockOpen })).resolves.toBe(`Opening ${chalk.green(projectUrl)} in your browser...`);
3235
});
36+
37+
describe('open --dash', () => {
38+
it('should open the dash', () => {
39+
expect.assertions(2);
40+
configStore.set('project', 'subdomain');
41+
configStore.set('apiKey', '12345');
42+
43+
const version = '1.0';
44+
const key = '12345';
45+
const versionPayload: Version = {
46+
createdAt: '2019-06-17T22:39:56.462Z',
47+
is_deprecated: false,
48+
is_hidden: false,
49+
is_beta: false,
50+
is_stable: true,
51+
codename: '',
52+
version,
53+
};
54+
55+
const mockRequest = getAPIMock().get('/api/v1/version').basicAuth({ user: key }).reply(200, [versionPayload]);
56+
57+
const dashUrl = 'https://dash.readme.com/project/subdomain/v1.0/overview';
58+
59+
function mockOpen(url: string) {
60+
expect(url).toBe(dashUrl);
61+
return Promise.resolve();
62+
}
63+
64+
return expect(cmd.run({ mockOpen, dash: true, key: '12345' })).resolves.toBe(
65+
`Opening ${chalk.green(dashUrl)} in your browser...`
66+
);
67+
mockRequest.done();
68+
});
69+
70+
it('should require user to be logged in', () => {
71+
configStore.set('project', 'subdomain');
72+
73+
const dashUrl = 'https://dash.readme.com/project/subdomain/v1.0/overview';
74+
75+
function mockOpen(url: string) {
76+
expect(url).toBe(dashUrl);
77+
return Promise.resolve();
78+
}
79+
80+
return expect(cmd.run({ mockOpen, dash: true, key: '12345' })).rejects.toStrictEqual(
81+
new Error(`Please login using \`${config.get('cli')} login\`.`)
82+
);
83+
});
84+
});
3385
});

src/cmds/open.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import open from 'open';
66

77
import Command, { CommandCategories } from '../lib/baseCommand';
88
import configStore from '../lib/configstore';
9+
import { getProjectVersion } from '../lib/versionSelect';
910

1011
export type Options = {
1112
mockOpen?: (url: string) => Promise<void>;
13+
dash?: boolean;
1214
};
1315

1416
export default class OpenCommand extends Command {
@@ -21,21 +23,41 @@ export default class OpenCommand extends Command {
2123
this.cmdCategory = CommandCategories.UTILITIES;
2224
this.position = 1;
2325

24-
this.args = [];
26+
this.args = [
27+
{
28+
name: 'dash',
29+
type: Boolean,
30+
description: 'Opens your current ReadMe project dashboard.',
31+
},
32+
];
2533
}
2634

2735
async run(opts: CommandOptions<Options>) {
2836
await super.run(opts);
2937

38+
const { dash } = opts;
3039
const project = configStore.get('project');
3140
Command.debug(`project: ${project}`);
3241

3342
if (!project) {
3443
return Promise.reject(new Error(`Please login using \`${config.get('cli')} login\`.`));
3544
}
3645

37-
const hubURL: string = config.get('hub');
38-
const url = hubURL.replace('{project}', project);
46+
let url: string;
47+
48+
if (dash) {
49+
const key = configStore.get('apiKey');
50+
if (!key) {
51+
return Promise.reject(new Error(`Please login using \`${config.get('cli')} login\`.`));
52+
}
53+
54+
const selectedVersion = await getProjectVersion(undefined, key, true);
55+
const dashURL: string = config.get('host');
56+
url = `${dashURL}/project/${project}/v${selectedVersion}/overview`;
57+
} else {
58+
const hubURL: string = config.get('hub');
59+
url = hubURL.replace('{project}', project);
60+
}
3961

4062
return (opts.mockOpen || open)(url, {
4163
wait: false,

src/lib/versionSelect.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import promptTerminal from './promptWrapper';
1515
* @param key project API key
1616
* @returns a cleaned up project version
1717
*/
18-
export async function getProjectVersion(versionFlag: string, key: string): Promise<string> {
18+
export async function getProjectVersion(versionFlag: string, key: string, returnStable = false): Promise<string> {
1919
try {
2020
if (versionFlag) {
2121
return await fetch(`${config.get('host')}/api/v1/version/${versionFlag}`, {
@@ -36,6 +36,11 @@ export async function getProjectVersion(versionFlag: string, key: string): Promi
3636
headers: cleanHeaders(key),
3737
}).then(res => handleRes(res));
3838

39+
if (returnStable) {
40+
const stableVersion = versionList.find(v => v.is_stable === true);
41+
return stableVersion.version;
42+
}
43+
3944
const { versionSelection } = await promptTerminal({
4045
type: 'select',
4146
name: 'versionSelection',

0 commit comments

Comments
 (0)