@contentstack/cli-utilities 0.1.1-beta.1
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/.eslintignore +2 -0
- package/.eslintrc +40 -0
- package/.mocharc.json +12 -0
- package/.nycrc.json +5 -0
- package/LICENSE +21 -0
- package/lib/cli-error.js +16 -0
- package/lib/cli-ux.js +59 -0
- package/lib/config-handler.js +128 -0
- package/lib/flag-deprecation-check.js +40 -0
- package/lib/http-client/client.js +313 -0
- package/lib/http-client/http-response.js +46 -0
- package/lib/http-client/index.js +7 -0
- package/lib/index.js +17 -0
- package/lib/interfaces/index.js +2 -0
- package/lib/logger.js +92 -0
- package/lib/message-handler.js +43 -0
- package/lib/selectors/index.js +376 -0
- package/lib/selectors/interfaces.js +2 -0
- package/lib/selectors/validations.js +9 -0
- package/messages/auth.json +46 -0
- package/messages/config.json +9 -0
- package/messages/core.json +6 -0
- package/package.json +68 -0
- package/src/cli-error.ts +15 -0
- package/src/cli-ux.ts +78 -0
- package/src/config-handler.ts +142 -0
- package/src/flag-deprecation-check.ts +41 -0
- package/src/http-client/client.ts +369 -0
- package/src/http-client/http-response.ts +55 -0
- package/src/http-client/index.ts +7 -0
- package/src/index.ts +7 -0
- package/src/interfaces/index.ts +61 -0
- package/src/logger.ts +101 -0
- package/src/message-handler.ts +45 -0
- package/src/selectors/index.ts +381 -0
- package/src/selectors/interfaces.ts +39 -0
- package/src/selectors/validations.ts +5 -0
- package/test/helpers/init.js +4 -0
- package/test/tsconfig.json +6 -0
- package/tsconfig.json +20 -0
- package/types/cli-error.d.ts +4 -0
- package/types/cli-ux.d.ts +22 -0
- package/types/config-handler.d.ts +17 -0
- package/types/flag-deprecation-check.d.ts +7 -0
- package/types/http-client.d.ts +54 -0
- package/types/index.d.ts +7 -0
- package/types/interfaces/index.d.ts +50 -0
- package/types/logger.d.ts +17 -0
- package/types/message-handler.d.ts +12 -0
- package/types/selectors/index.d.ts +12 -0
- package/types/selectors/interfaces.d.ts +32 -0
- package/types/selectors/validations.d.ts +1 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { AxiosResponse } from 'axios';
|
|
4
|
+
|
|
5
|
+
export class HttpResponse<ResponseType = any> {
|
|
6
|
+
/**
|
|
7
|
+
* The Axios response object.
|
|
8
|
+
*/
|
|
9
|
+
private readonly response: AxiosResponse;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wrap the given Axios `response` into a new response instance.
|
|
13
|
+
*
|
|
14
|
+
* @param {AxiosResponse} response
|
|
15
|
+
*/
|
|
16
|
+
constructor(response: AxiosResponse) {
|
|
17
|
+
this.response = response;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Returns the response status.
|
|
22
|
+
*
|
|
23
|
+
* @returns {Number}
|
|
24
|
+
*/
|
|
25
|
+
get status() {
|
|
26
|
+
return this.response.status;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Returns the response payload. This method is an alias for `response.payload()`.
|
|
31
|
+
*
|
|
32
|
+
* @returns {*}
|
|
33
|
+
*/
|
|
34
|
+
get data() {
|
|
35
|
+
return this.payload;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Returns the response payload.
|
|
40
|
+
*
|
|
41
|
+
* @returns {*}
|
|
42
|
+
*/
|
|
43
|
+
get payload() {
|
|
44
|
+
return this.response.data;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Returns the response headers.
|
|
49
|
+
*
|
|
50
|
+
* @returns {Object}
|
|
51
|
+
*/
|
|
52
|
+
get headers() {
|
|
53
|
+
return this.response.headers;
|
|
54
|
+
}
|
|
55
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default as logger } from './logger';
|
|
2
|
+
export { default as cliux } from './cli-ux';
|
|
3
|
+
export { default as CLIError } from './cli-error';
|
|
4
|
+
export { default as messageHandler } from './message-handler';
|
|
5
|
+
export { default as configHandler } from './config-handler';
|
|
6
|
+
export { default as printFlagDeprecation } from './flag-deprecation-check';
|
|
7
|
+
export * from './http-client';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { IPromptOptions } from "@oclif/core/lib/cli-ux";
|
|
2
|
+
|
|
3
|
+
export interface PrintOptions {
|
|
4
|
+
color?: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface InquirePayload {
|
|
8
|
+
type: string;
|
|
9
|
+
name: string;
|
|
10
|
+
message: string;
|
|
11
|
+
choices?: Array<any>;
|
|
12
|
+
transformer?: Function;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface Region {
|
|
16
|
+
name: string;
|
|
17
|
+
cma: string;
|
|
18
|
+
cda: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface Token {
|
|
22
|
+
token: string;
|
|
23
|
+
apiKey: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Organization {
|
|
27
|
+
uid: string,
|
|
28
|
+
name: string,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface selectedOrganization {
|
|
32
|
+
orgUid: string,
|
|
33
|
+
orgName: string,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface Stack {
|
|
37
|
+
name: string,
|
|
38
|
+
api_key: string,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ContentType {
|
|
42
|
+
uid: string,
|
|
43
|
+
title: string,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface Environment {
|
|
47
|
+
name: string,
|
|
48
|
+
uid: string,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface Entry {
|
|
52
|
+
uid: string,
|
|
53
|
+
title: string,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface Locale {
|
|
57
|
+
name: string;
|
|
58
|
+
code: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface CliUXPromptOptions extends IPromptOptions {}
|
package/src/logger.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import messageHandler from './message-handler';
|
|
3
|
+
|
|
4
|
+
class LoggerService {
|
|
5
|
+
name: string;
|
|
6
|
+
data: object | null;
|
|
7
|
+
logger: winston.Logger;
|
|
8
|
+
|
|
9
|
+
static dateFormat(): string {
|
|
10
|
+
return new Date(Date.now()).toUTCString();
|
|
11
|
+
}
|
|
12
|
+
constructor(name: string) {
|
|
13
|
+
this.data = null;
|
|
14
|
+
this.name = null;
|
|
15
|
+
|
|
16
|
+
const logger = winston.createLogger({
|
|
17
|
+
transports: [
|
|
18
|
+
// new winston.transports.Console(),
|
|
19
|
+
new winston.transports.File({
|
|
20
|
+
filename: `./logs/${name}.log`,
|
|
21
|
+
}),
|
|
22
|
+
],
|
|
23
|
+
format: winston.format.combine(
|
|
24
|
+
winston.format.colorize(),
|
|
25
|
+
winston.format.printf((info) => {
|
|
26
|
+
let stringifiedParam;
|
|
27
|
+
try {
|
|
28
|
+
stringifiedParam = JSON.stringify(info.obj);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.log('warning: failed to log the result');
|
|
31
|
+
}
|
|
32
|
+
// parse message
|
|
33
|
+
info.message = messageHandler.parse(info.message);
|
|
34
|
+
let message = `${LoggerService.dateFormat()}:${name}:${info.level}:${info.message}`;
|
|
35
|
+
message = info.obj ? message + `:${stringifiedParam}` : message;
|
|
36
|
+
message = this.data ? message + `:${JSON.stringify(this.data)}` : message;
|
|
37
|
+
return message;
|
|
38
|
+
}),
|
|
39
|
+
),
|
|
40
|
+
// level: (config.get('logger.level') as string) || 'error',
|
|
41
|
+
level: 'error',
|
|
42
|
+
silent: true
|
|
43
|
+
// silent: config.get('logger.enabled') && process.env.CLI_ENV !== 'TEST' ? false : false,
|
|
44
|
+
});
|
|
45
|
+
this.logger = logger;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
init(context) {
|
|
49
|
+
this.name = (context && context.plugin && context.plugin.name) || 'cli';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
set loggerName(name: string) {
|
|
53
|
+
this.name = name;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
setLogData(data: object): void {
|
|
57
|
+
this.data = data;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async info(message: string, param?: any): Promise<any> {
|
|
61
|
+
if (param) {
|
|
62
|
+
this.logger.log('info', message, {
|
|
63
|
+
obj: param,
|
|
64
|
+
});
|
|
65
|
+
} else {
|
|
66
|
+
this.logger.log('info', message);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async debug(message: string, param?: any): Promise<any> {
|
|
71
|
+
if (param) {
|
|
72
|
+
this.logger.log('debug', message, {
|
|
73
|
+
obj: param,
|
|
74
|
+
});
|
|
75
|
+
} else {
|
|
76
|
+
this.logger.log('debug', message);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async error(message: string, param?: any): Promise<any> {
|
|
81
|
+
if (param) {
|
|
82
|
+
this.logger.log('error', message, {
|
|
83
|
+
obj: param,
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
this.logger.log('error', message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async warn(message: string, param?: any): Promise<any> {
|
|
91
|
+
if (param) {
|
|
92
|
+
this.logger.log('warn', message, {
|
|
93
|
+
obj: param,
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
this.logger.log('warn', message);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export default new LoggerService('cli');
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import CLIError from './cli-error';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Message handler
|
|
6
|
+
*/
|
|
7
|
+
class Messages {
|
|
8
|
+
private messages: object;
|
|
9
|
+
messageFilePath: any;
|
|
10
|
+
|
|
11
|
+
constructor() {
|
|
12
|
+
this.messages = {};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
init(context) {
|
|
16
|
+
if (!context.messageFilePath) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
this.messages = JSON.parse(fs.readFileSync(context.messageFilePath, 'utf-8'));
|
|
21
|
+
} catch (error) {
|
|
22
|
+
// create empty messages object if message file is not exist
|
|
23
|
+
if (error.code === 'ENOENT') {
|
|
24
|
+
this.messages = {};
|
|
25
|
+
} else {
|
|
26
|
+
throw new CLIError(error.message);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
parse(messageKey: string, ...substitutions: Array<any>): string {
|
|
32
|
+
const msg = this.messages[messageKey];
|
|
33
|
+
if (!msg) {
|
|
34
|
+
return messageKey;
|
|
35
|
+
}
|
|
36
|
+
if (substitutions.length > 0) {
|
|
37
|
+
const callSite = msg.split('%s');
|
|
38
|
+
callSite.push('');
|
|
39
|
+
return String.raw({ raw: callSite } as TemplateStringsArray, ...substitutions);
|
|
40
|
+
}
|
|
41
|
+
return msg;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default new Messages();
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import ora from 'ora'
|
|
2
|
+
import { default as config } from '../config-handler';
|
|
3
|
+
import {
|
|
4
|
+
Token,
|
|
5
|
+
Organization,
|
|
6
|
+
selectedOrganization,
|
|
7
|
+
Stack,
|
|
8
|
+
ContentType,
|
|
9
|
+
Environment,
|
|
10
|
+
Entry,
|
|
11
|
+
Locale
|
|
12
|
+
} from './interfaces'
|
|
13
|
+
import { shouldNotBeEmpty } from './validations';
|
|
14
|
+
|
|
15
|
+
const inquirer = require('inquirer')
|
|
16
|
+
inquirer.registerPrompt('search-list', require('inquirer-search-list'))
|
|
17
|
+
inquirer.registerPrompt('search-checkbox', require('inquirer-search-checkbox'))
|
|
18
|
+
const {Command} = require('@contentstack/cli-command')
|
|
19
|
+
|
|
20
|
+
export function chooseOrganization(client: any, displayMessage?: string, region?: string, orgUid?: string): Promise<selectedOrganization> {
|
|
21
|
+
return new Promise(async (resolve, reject) => {
|
|
22
|
+
try {
|
|
23
|
+
const spinner = ora('Loading Organizations').start()
|
|
24
|
+
let {items: organizations} = await client.organization().fetchAll()
|
|
25
|
+
spinner.stop()
|
|
26
|
+
let orgMap: any = {}
|
|
27
|
+
if (orgUid) {
|
|
28
|
+
organizations.forEach((org: Organization) => {
|
|
29
|
+
orgMap[org.uid] = org.name
|
|
30
|
+
})
|
|
31
|
+
if (orgMap[orgUid]) {
|
|
32
|
+
resolve({orgUid: orgUid, orgName: orgMap[orgUid]})
|
|
33
|
+
} else {
|
|
34
|
+
return reject(new Error('The given orgUid doesn\'t exist or you might not have access to it.'))
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
organizations.forEach((org: Organization) => {
|
|
38
|
+
orgMap[org.name] = org.uid
|
|
39
|
+
})
|
|
40
|
+
const orgList = Object.keys(orgMap)
|
|
41
|
+
let inquirerConfig = {
|
|
42
|
+
type: 'search-list',
|
|
43
|
+
name: 'chosenOrganization',
|
|
44
|
+
message: displayMessage || 'Choose an organization',
|
|
45
|
+
choices: orgList,
|
|
46
|
+
loop: false,
|
|
47
|
+
validate: shouldNotBeEmpty
|
|
48
|
+
}
|
|
49
|
+
inquirer.prompt(inquirerConfig).then(({chosenOrganization}: {chosenOrganization: string}) => {
|
|
50
|
+
resolve({orgUid: orgMap[chosenOrganization], orgName: chosenOrganization})
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
} catch (error) {
|
|
54
|
+
reject(error)
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function chooseStack(client: any, organizationId: string, displayMessage?: string, region?: string) : Promise<Stack> {
|
|
60
|
+
return new Promise(async (resolve, reject) => {
|
|
61
|
+
try {
|
|
62
|
+
const spinner = ora('Loading Stacks').start()
|
|
63
|
+
let {items: stacks} = await client.stack({organization_uid: organizationId}).query({query: {}}).find()
|
|
64
|
+
spinner.stop()
|
|
65
|
+
let stackMap: any = {}
|
|
66
|
+
stacks.forEach((stack: Stack) => {
|
|
67
|
+
stackMap[stack.name] = stack.api_key
|
|
68
|
+
})
|
|
69
|
+
const stackList = Object.keys(stackMap)
|
|
70
|
+
let inquirerConfig = {
|
|
71
|
+
type: 'search-list',
|
|
72
|
+
name: 'chosenStack',
|
|
73
|
+
choices: stackList,
|
|
74
|
+
message: displayMessage || 'Choose a stack',
|
|
75
|
+
loop: false,
|
|
76
|
+
}
|
|
77
|
+
inquirer.prompt(inquirerConfig).then(({chosenStack}: {chosenStack: string}) => {
|
|
78
|
+
resolve({api_key: stackMap[chosenStack], name: chosenStack})
|
|
79
|
+
})
|
|
80
|
+
} catch (error) {
|
|
81
|
+
console.error(error.message)
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function chooseContentType(stackApiKey: string, displayMessage?: string, region?: string): Promise<ContentType> {
|
|
87
|
+
return new Promise(async (resolve, reject) => {
|
|
88
|
+
const command = new Command()
|
|
89
|
+
command.managementAPIClient = {host: command.cmaHost, authtoken: command.authToken}
|
|
90
|
+
const client = command.managementAPIClient
|
|
91
|
+
try {
|
|
92
|
+
const spinner = ora('Loading Content Types').start()
|
|
93
|
+
// let {items: contentTypes} = await client.stack({api_key: stackApiKey}).contentType().query({include_count: true}).find()
|
|
94
|
+
let contentTypes = await getAll(client.stack({api_key: stackApiKey}).contentType())
|
|
95
|
+
spinner.stop()
|
|
96
|
+
let contentTypeMap: any = {}
|
|
97
|
+
contentTypes.forEach((contentType: ContentType) => {
|
|
98
|
+
contentTypeMap[contentType.title] = contentType.uid
|
|
99
|
+
})
|
|
100
|
+
const contentTypeList = Object.keys(contentTypeMap)
|
|
101
|
+
let inquirerConfig = {
|
|
102
|
+
type: 'search-list',
|
|
103
|
+
name: 'chosenContentType',
|
|
104
|
+
choices: contentTypeList,
|
|
105
|
+
message: displayMessage || 'Choose a content type',
|
|
106
|
+
loop: false,
|
|
107
|
+
}
|
|
108
|
+
inquirer.prompt(inquirerConfig).then(({chosenContentType}: {chosenContentType: string}) => {
|
|
109
|
+
resolve({uid: contentTypeMap[chosenContentType], title: chosenContentType})
|
|
110
|
+
})
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error(error.message)
|
|
113
|
+
}
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function chooseEntry(contentTypeUid: string, stackApiKey: string, displayMessage?: string, region?: string): Promise<Entry> {
|
|
118
|
+
return new Promise(async (resolve, reject) => {
|
|
119
|
+
const command = new Command()
|
|
120
|
+
command.managementAPIClient = {host: command.cmaHost, authtoken: command.authToken}
|
|
121
|
+
const client = command.managementAPIClient
|
|
122
|
+
try {
|
|
123
|
+
const spinner = ora('Loading Entries').start()
|
|
124
|
+
let entries = await getAll(client.stack({api_key: stackApiKey}).contentType(contentTypeUid).entry())
|
|
125
|
+
spinner.stop()
|
|
126
|
+
let entryMap: any = {}
|
|
127
|
+
entries.forEach((entry: Entry) => {
|
|
128
|
+
entryMap[entry.title] = entry.uid
|
|
129
|
+
})
|
|
130
|
+
const entryList = Object.keys(entryMap)
|
|
131
|
+
let inquirerConfig = {
|
|
132
|
+
type: 'search-list',
|
|
133
|
+
name: 'chosenEntry',
|
|
134
|
+
choices: entryList,
|
|
135
|
+
message: displayMessage || 'Choose an entry',
|
|
136
|
+
loop: false
|
|
137
|
+
}
|
|
138
|
+
inquirer.prompt(inquirerConfig).then(({chosenEntry}: {chosenEntry: string}) => {
|
|
139
|
+
resolve({uid: entryMap[chosenEntry], title: chosenEntry})
|
|
140
|
+
})
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error(error.message)
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function chooseContentTypes(stack: any, displayMessage?: string): Promise<ContentType[]> {
|
|
148
|
+
return new Promise(async (resolve, reject) => {
|
|
149
|
+
try {
|
|
150
|
+
const spinner = ora('Loading Content Types').start()
|
|
151
|
+
// let {items: contentTypes} = await client.stack({api_key: stackApiKey}).contentType().query({include_count: true}).find()
|
|
152
|
+
let contentTypes = await getAll(stack.contentType())
|
|
153
|
+
spinner.stop()
|
|
154
|
+
let contentTypeMap: any = {}
|
|
155
|
+
contentTypes.forEach((contentType: ContentType) => {
|
|
156
|
+
contentTypeMap[contentType.title] = contentType.uid
|
|
157
|
+
})
|
|
158
|
+
const contentTypeList = Object.keys(contentTypeMap)
|
|
159
|
+
let inquirerConfig = {
|
|
160
|
+
type: 'search-checkbox',
|
|
161
|
+
name: 'chosenContentTypes',
|
|
162
|
+
choices: contentTypeList,
|
|
163
|
+
message: displayMessage || 'Choose a content type',
|
|
164
|
+
loop: false,
|
|
165
|
+
}
|
|
166
|
+
inquirer.prompt(inquirerConfig).then(({ chosenContentTypes }: { chosenContentTypes: string[]}) => {
|
|
167
|
+
let result: ContentType[] = chosenContentTypes.map(ct => {
|
|
168
|
+
let foo: ContentType = { uid: contentTypeMap[ct], title: ct }
|
|
169
|
+
return foo
|
|
170
|
+
})
|
|
171
|
+
resolve(result)
|
|
172
|
+
})
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error(error.message)
|
|
175
|
+
}
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function chooseEnvironments(stack: any, displayMessage?: string): Promise<Environment[]> {
|
|
180
|
+
return new Promise(async (resolve, reject) => {
|
|
181
|
+
try {
|
|
182
|
+
const spinner = ora('Loading Environments').start()
|
|
183
|
+
// let {items: contentTypes} = await client.stack({api_key: stackApiKey}).contentType().query({include_count: true}).find()
|
|
184
|
+
let environments = await getAll(stack.environment())
|
|
185
|
+
spinner.stop()
|
|
186
|
+
let environmentMap: any = {}
|
|
187
|
+
environments.forEach((environment: Environment) => {
|
|
188
|
+
environmentMap[environment.name] = environment.uid
|
|
189
|
+
})
|
|
190
|
+
const environmentList = Object.keys(environmentMap)
|
|
191
|
+
let inquirerConfig = {
|
|
192
|
+
type: 'search-checkbox',
|
|
193
|
+
name: 'chosenEnvironments',
|
|
194
|
+
choices: environmentList,
|
|
195
|
+
message: displayMessage || 'Choose an environment',
|
|
196
|
+
loop: false,
|
|
197
|
+
validate: shouldNotBeEmpty
|
|
198
|
+
}
|
|
199
|
+
inquirer.prompt(inquirerConfig).then(({ chosenEnvironments }: { chosenEnvironments: string[] }) => {
|
|
200
|
+
let result: Environment[] = chosenEnvironments.map(env => {
|
|
201
|
+
let foo: Environment = { uid: environmentMap[env], name: env }
|
|
202
|
+
return foo
|
|
203
|
+
})
|
|
204
|
+
resolve(result)
|
|
205
|
+
})
|
|
206
|
+
} catch (error) {
|
|
207
|
+
console.error(error.message)
|
|
208
|
+
}
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function chooseEnvironment(stack: any, displayMessage?: string): Promise<Environment> {
|
|
213
|
+
return new Promise(async (resolve, reject) => {
|
|
214
|
+
try {
|
|
215
|
+
const spinner = ora('Loading Environments').start()
|
|
216
|
+
// let {items: contentTypes} = await client.stack({api_key: stackApiKey}).contentType().query({include_count: true}).find()
|
|
217
|
+
let environments = await getAll(stack.environment())
|
|
218
|
+
spinner.stop()
|
|
219
|
+
let environmentMap: any = {}
|
|
220
|
+
environments.forEach((environment: Environment) => {
|
|
221
|
+
environmentMap[environment.name] = environment.uid
|
|
222
|
+
})
|
|
223
|
+
const environmentList = Object.keys(environmentMap)
|
|
224
|
+
let inquirerConfig = {
|
|
225
|
+
type: 'search-list',
|
|
226
|
+
name: 'chosenEnvironment',
|
|
227
|
+
choices: environmentList,
|
|
228
|
+
message: displayMessage || 'Choose an environment',
|
|
229
|
+
loop: false,
|
|
230
|
+
validate: shouldNotBeEmpty
|
|
231
|
+
}
|
|
232
|
+
inquirer.prompt(inquirerConfig).then(({ chosenEnvironment }: { chosenEnvironment: string }) => {
|
|
233
|
+
let result: Environment = { uid: environmentMap[chosenEnvironment], name: chosenEnvironment }
|
|
234
|
+
resolve(result)
|
|
235
|
+
})
|
|
236
|
+
} catch (error) {
|
|
237
|
+
console.error(error.message)
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function chooseLocales(stack: any, displayMessage?: string): Promise<Locale[]> {
|
|
243
|
+
return new Promise(async (resolve, reject) => {
|
|
244
|
+
try {
|
|
245
|
+
const spinner = ora('Loading Locales').start()
|
|
246
|
+
// let {items: contentTypes} = await client.stack({api_key: stackApiKey}).contentType().query({include_count: true}).find()
|
|
247
|
+
let locales = await getAll(stack.locale())
|
|
248
|
+
spinner.stop()
|
|
249
|
+
let localeMap: any = {}
|
|
250
|
+
locales.forEach((locale: Locale) => {
|
|
251
|
+
localeMap[locale.name] = locale.code
|
|
252
|
+
})
|
|
253
|
+
const localeList = Object.keys(localeMap)
|
|
254
|
+
let inquirerConfig = {
|
|
255
|
+
type: 'search-checkbox',
|
|
256
|
+
name: 'chosenLocales',
|
|
257
|
+
choices: localeList,
|
|
258
|
+
message: displayMessage || 'Choose locales',
|
|
259
|
+
loop: false,
|
|
260
|
+
validate: shouldNotBeEmpty,
|
|
261
|
+
}
|
|
262
|
+
inquirer.prompt(inquirerConfig).then(({ chosenLocales }: { chosenLocales: string[] }) => {
|
|
263
|
+
let result: Locale[] = chosenLocales.map(locale => {
|
|
264
|
+
let foo: Locale = { code: localeMap[locale], name: locale }
|
|
265
|
+
return foo
|
|
266
|
+
})
|
|
267
|
+
resolve(result)
|
|
268
|
+
})
|
|
269
|
+
} catch (error) {
|
|
270
|
+
console.error(error.message)
|
|
271
|
+
}
|
|
272
|
+
})
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export function chooseLocale(stack: any, displayMessage?: string): Promise<Locale> {
|
|
276
|
+
return new Promise(async (resolve, reject) => {
|
|
277
|
+
try {
|
|
278
|
+
const spinner = ora('Loading Locales').start()
|
|
279
|
+
// let {items: contentTypes} = await client.stack({api_key: stackApiKey}).contentType().query({include_count: true}).find()
|
|
280
|
+
let locales = await getAll(stack.locale())
|
|
281
|
+
spinner.stop()
|
|
282
|
+
let localeMap: any = {}
|
|
283
|
+
locales.forEach((locale: Locale) => {
|
|
284
|
+
localeMap[locale.name] = locale.code
|
|
285
|
+
})
|
|
286
|
+
const localeList = Object.keys(localeMap)
|
|
287
|
+
let inquirerConfig = {
|
|
288
|
+
type: 'search-list',
|
|
289
|
+
name: 'chosenLocale',
|
|
290
|
+
choices: localeList,
|
|
291
|
+
message: displayMessage || 'Choose locale',
|
|
292
|
+
loop: false,
|
|
293
|
+
validate: shouldNotBeEmpty
|
|
294
|
+
}
|
|
295
|
+
inquirer.prompt(inquirerConfig).then(({ chosenLocale }: { chosenLocale: string }) => {
|
|
296
|
+
let result: Locale = { code: localeMap[chosenLocale], name: chosenLocale }
|
|
297
|
+
resolve(result)
|
|
298
|
+
})
|
|
299
|
+
} catch (error) {
|
|
300
|
+
console.error(error.message)
|
|
301
|
+
}
|
|
302
|
+
})
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export function chooseTokenAlias(): Promise<Token> {
|
|
306
|
+
return new Promise(async (resolve, reject) => {
|
|
307
|
+
const tokens = config.get('tokens')
|
|
308
|
+
const tokenList = Object.keys(tokens).filter((token: string) => tokens[token].type === 'management')
|
|
309
|
+
let inquirerConfig = {
|
|
310
|
+
type: 'search-list',
|
|
311
|
+
name: 'chosenToken',
|
|
312
|
+
choices: tokenList,
|
|
313
|
+
message: 'Choose an alias to use',
|
|
314
|
+
loop: false,
|
|
315
|
+
validate: shouldNotBeEmpty,
|
|
316
|
+
}
|
|
317
|
+
inquirer.prompt(inquirerConfig).then(({ chosenToken }: { chosenToken: string }) => {
|
|
318
|
+
resolve({ apiKey: tokens[chosenToken].apiKey, token: tokens[chosenToken].token })
|
|
319
|
+
})
|
|
320
|
+
})
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export function chooseDeliveryTokenAlias(): Promise<Token> {
|
|
324
|
+
return new Promise(async (resolve, reject) => {
|
|
325
|
+
const tokens = config.get('tokens')
|
|
326
|
+
const tokenList = Object.keys(tokens).filter((token: string) => tokens[token].type === 'delivery')
|
|
327
|
+
let inquirerConfig = {
|
|
328
|
+
type: 'search-list',
|
|
329
|
+
name: 'chosenToken',
|
|
330
|
+
choices: tokenList,
|
|
331
|
+
message: 'Choose an alias to use',
|
|
332
|
+
loop: false,
|
|
333
|
+
validate: shouldNotBeEmpty,
|
|
334
|
+
}
|
|
335
|
+
inquirer.prompt(inquirerConfig).then(({ chosenToken }: { chosenToken: string }) => {
|
|
336
|
+
resolve({ apiKey: tokens[chosenToken].apiKey, token: tokens[chosenToken].token })
|
|
337
|
+
})
|
|
338
|
+
})
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
async function getAll (element: any, skip: number=0): Promise<any> {
|
|
342
|
+
return new Promise(async resolve => {
|
|
343
|
+
let result: any[] = []
|
|
344
|
+
result = await fetch(element, skip, result)
|
|
345
|
+
resolve(result)
|
|
346
|
+
})
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
async function fetch(element: any, skip: number, accumulator: any[]): Promise<any[]> {
|
|
350
|
+
return new Promise(async resolve => {
|
|
351
|
+
let queryParams = {include_count: true, skip: skip}
|
|
352
|
+
let {items: result, count: count} = await element.query(queryParams).find()
|
|
353
|
+
accumulator = accumulator.concat(result)
|
|
354
|
+
skip += result.length
|
|
355
|
+
if (skip < count)
|
|
356
|
+
return resolve(await fetch(element, skip, accumulator))
|
|
357
|
+
return resolve(accumulator)
|
|
358
|
+
})
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// async function callMe() {
|
|
362
|
+
// // let organization = await chooseOrganization()
|
|
363
|
+
// // console.log(organization)
|
|
364
|
+
|
|
365
|
+
// // let stack = await chooseStack(organization.orgUid)
|
|
366
|
+
// // console.log(stack)
|
|
367
|
+
|
|
368
|
+
// // let contentType = await chooseContentType(stack.api_key)
|
|
369
|
+
// // console.log(contentType)
|
|
370
|
+
|
|
371
|
+
// // let entry = await chooseEntry(contentType.uid, stack.api_key)
|
|
372
|
+
// // console.log(entry)
|
|
373
|
+
|
|
374
|
+
// // let entry = await chooseEntry(contentType.uid, stack.api_key)
|
|
375
|
+
// // console.log(entry)
|
|
376
|
+
|
|
377
|
+
// let token = await chooseTokenAlias()
|
|
378
|
+
// console.log(token)
|
|
379
|
+
// }
|
|
380
|
+
|
|
381
|
+
// callMe()
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface Token {
|
|
2
|
+
token: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface Organization {
|
|
7
|
+
uid: string,
|
|
8
|
+
name: string,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface selectedOrganization {
|
|
12
|
+
orgUid: string,
|
|
13
|
+
orgName: string,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface Stack {
|
|
17
|
+
name: string,
|
|
18
|
+
api_key: string,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ContentType {
|
|
22
|
+
uid: string,
|
|
23
|
+
title: string,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Environment {
|
|
27
|
+
name: string,
|
|
28
|
+
uid: string,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface Entry {
|
|
32
|
+
uid: string,
|
|
33
|
+
title: string,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface Locale {
|
|
37
|
+
name: string;
|
|
38
|
+
code: string;
|
|
39
|
+
}
|