@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.
Files changed (52) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +40 -0
  3. package/.mocharc.json +12 -0
  4. package/.nycrc.json +5 -0
  5. package/LICENSE +21 -0
  6. package/lib/cli-error.js +16 -0
  7. package/lib/cli-ux.js +59 -0
  8. package/lib/config-handler.js +128 -0
  9. package/lib/flag-deprecation-check.js +40 -0
  10. package/lib/http-client/client.js +313 -0
  11. package/lib/http-client/http-response.js +46 -0
  12. package/lib/http-client/index.js +7 -0
  13. package/lib/index.js +17 -0
  14. package/lib/interfaces/index.js +2 -0
  15. package/lib/logger.js +92 -0
  16. package/lib/message-handler.js +43 -0
  17. package/lib/selectors/index.js +376 -0
  18. package/lib/selectors/interfaces.js +2 -0
  19. package/lib/selectors/validations.js +9 -0
  20. package/messages/auth.json +46 -0
  21. package/messages/config.json +9 -0
  22. package/messages/core.json +6 -0
  23. package/package.json +68 -0
  24. package/src/cli-error.ts +15 -0
  25. package/src/cli-ux.ts +78 -0
  26. package/src/config-handler.ts +142 -0
  27. package/src/flag-deprecation-check.ts +41 -0
  28. package/src/http-client/client.ts +369 -0
  29. package/src/http-client/http-response.ts +55 -0
  30. package/src/http-client/index.ts +7 -0
  31. package/src/index.ts +7 -0
  32. package/src/interfaces/index.ts +61 -0
  33. package/src/logger.ts +101 -0
  34. package/src/message-handler.ts +45 -0
  35. package/src/selectors/index.ts +381 -0
  36. package/src/selectors/interfaces.ts +39 -0
  37. package/src/selectors/validations.ts +5 -0
  38. package/test/helpers/init.js +4 -0
  39. package/test/tsconfig.json +6 -0
  40. package/tsconfig.json +20 -0
  41. package/types/cli-error.d.ts +4 -0
  42. package/types/cli-ux.d.ts +22 -0
  43. package/types/config-handler.d.ts +17 -0
  44. package/types/flag-deprecation-check.d.ts +7 -0
  45. package/types/http-client.d.ts +54 -0
  46. package/types/index.d.ts +7 -0
  47. package/types/interfaces/index.d.ts +50 -0
  48. package/types/logger.d.ts +17 -0
  49. package/types/message-handler.d.ts +12 -0
  50. package/types/selectors/index.d.ts +12 -0
  51. package/types/selectors/interfaces.d.ts +32 -0
  52. 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
+ }
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ import { HttpClient } from './client';
4
+
5
+ export default HttpClient;
6
+ export * from './client';
7
+ export * from './http-response';
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
+ }
@@ -0,0 +1,5 @@
1
+ export function shouldNotBeEmpty(input) {
2
+ if (input.length === 0)
3
+ throw new Error('Please enter a valid value')
4
+ return true
5
+ }