@contrail/cli 1.0.31 → 1.0.33

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 (42) hide show
  1. package/.eslintrc.js +53 -0
  2. package/lib/apps/deploy-app/actions-deployer.js +12 -3
  3. package/lib/apps/deploy-app/app-deployer.js +2 -3
  4. package/lib/apps/deploy-app/app-template-parsers.js +1 -1
  5. package/lib/apps/deploy-app/workflow-definition-deployer.js +1 -1
  6. package/lib/auth/login.js +5 -5
  7. package/lib/cli.js +2 -1
  8. package/lib/colors/color-loader.js +8 -8
  9. package/lib/config/config.js +2 -2
  10. package/lib/interfaces.d.ts +2 -2
  11. package/lib/types/interfaces.js +1 -0
  12. package/lib/types/option-set-merger.js +2 -2
  13. package/lib/types/option-set-parser.js +2 -2
  14. package/lib/types/option-set-uploader.js +2 -2
  15. package/lib/types/parse-types.js +6 -6
  16. package/lib/types/types-extractor.js +4 -4
  17. package/lib/types/types-properties-merger.js +2 -2
  18. package/lib/types/types-uploader.d.ts +1 -1
  19. package/lib/types/types-uploader.js +6 -6
  20. package/package.json +8 -6
  21. package/src/apps/deploy-app/actions-deployer.ts +17 -10
  22. package/src/apps/deploy-app/app-deployer.ts +3 -4
  23. package/src/apps/deploy-app/workflow-definition-deployer.ts +3 -3
  24. package/src/auth/login.ts +124 -124
  25. package/src/cli.ts +115 -115
  26. package/src/colors/color-loader.ts +16 -16
  27. package/src/config/config.ts +9 -11
  28. package/src/config/configCommands.ts +1 -1
  29. package/src/interfaces.ts +9 -10
  30. package/src/types/csv-parser.ts +1 -1
  31. package/src/types/option-set-merger.ts +9 -9
  32. package/src/types/option-set-parser.ts +5 -6
  33. package/src/types/option-set-uploader.ts +2 -2
  34. package/src/types/parse-types.ts +9 -9
  35. package/src/types/types-extractor.ts +5 -5
  36. package/src/types/types-properties-merger.ts +6 -6
  37. package/src/types/types-uploader.ts +31 -31
  38. package/src/workflows/workflow-template-deployer.ts +2 -4
  39. package/src/workflows/workflowCommands.ts +0 -1
  40. package/templates/javascript/actions/example/action.js +37 -37
  41. package/templates/typescript/actions/exampleAction.ts +1 -1
  42. package/templates/typescript/app.yml +1 -1
@@ -1,7 +1,7 @@
1
1
  import { Entities } from '@contrail/sdk';
2
2
  import chalk from 'chalk';
3
3
  import { App, AppDeclaration, WorkflowDefinition } from '../../interfaces';
4
- import { getActionDeclarationIdentifier, getActionsForApp } from './actions-deployer'
4
+ import { getActionDeclarationIdentifier, getActionsForApp } from './actions-deployer';
5
5
 
6
6
  export class WorkflowDefinitionDeployer {
7
7
  async deployWorkflowDefinitions(appDeclaration: AppDeclaration, app: App) {
@@ -70,7 +70,7 @@ export class WorkflowDefinitionDeployer {
70
70
  }
71
71
 
72
72
  private async populateActionIds(workflowDefinition: WorkflowDefinition, app: App) {
73
- let availableAppActions = await getActionsForApp(app);
73
+ const availableAppActions = await getActionsForApp(app);
74
74
  if (!workflowDefinition.workflowDefinition?.paths) {
75
75
  return;
76
76
  }
@@ -82,7 +82,7 @@ export class WorkflowDefinitionDeployer {
82
82
  const actionKey = actionConfiguration.action;
83
83
  const action = availableAppActions.find(
84
84
  action => action.identifier === getActionDeclarationIdentifier(actionKey, app)
85
- )
85
+ );
86
86
  if (!action) {
87
87
  throw new Error(`Could not find action ${actionKey} declared in workflow definition ${workflowDefinition.name}`);
88
88
  }
package/src/auth/login.ts CHANGED
@@ -5,151 +5,151 @@ import { Auth, AuthContext } from './auth';
5
5
  import { getConfig, storeConfig } from '../config/config';
6
6
 
7
7
  const CONFIGURATION = {
8
- userPoolId: 'us-east-1_x8hXZUsL6',
9
- clientId: process.env.CONTRAIL_COGNITO_CLIENT_ID || '2oubek96sue5rsncovtqhs3scm',
8
+ userPoolId: 'us-east-1_x8hXZUsL6',
9
+ clientId: process.env.CONTRAIL_COGNITO_CLIENT_ID || '2oubek96sue5rsncovtqhs3scm',
10
10
  };
11
11
 
12
12
  export async function authUser(): Promise<AuthContext> {
13
- console.debug("authorizing user")
14
- const config = await getConfig();
15
- if (
16
- config &&
13
+ console.debug('authorizing user');
14
+ const config = await getConfig();
15
+ if (
16
+ config &&
17
17
  config.apiUserToken &&
18
18
  config.apiGateway &&
19
19
  config.orgSlug
20
- ) {
21
- console.debug("populating auth config from fs config")
22
- Auth.config = {
23
- apiUserToken: config.apiUserToken,
24
- apiGateway: config.apiGateway,
25
- orgSlug: config.orgSlug,
26
- };
27
- setSdkConfig(Auth.config);
28
- try {
29
- return await refreshCurrentUserOrg();
30
- } catch (e) {
31
- console.log("Token expired. Requesting auth credentials...")
32
- }
33
-
34
- }
35
- const questions = [];
36
- if (!process.env.CONTRAIL_CLI_EMAIL) {
37
- questions.push({
38
- type: 'input',
39
- name: 'email',
40
- validate: (val) => !!val,
41
- message: 'Email',
42
- });
43
- }
44
- if (!process.env.CONTRAIL_CLI_PASSWORD) {
45
- questions.push({
46
- type: 'password',
47
- name: 'password',
48
- validate: (val) => !!val,
49
- message: 'Password',
50
- });
51
- }
52
- if (!process.env.CONTRAIL_CLI_ORGSLUG) {
53
- questions.push({
54
- type: 'input',
55
- name: 'orgSlug',
56
- validate: (val) => !!val,
57
- message: 'Org (slug)',
58
- });
59
- }
60
-
61
- const answers = await inquirer.prompt(questions);
62
- const params = {
63
- email: process.env.CONTRAIL_CLI_EMAIL || answers.email,
64
- password: process.env.CONTRAIL_CLI_PASSWORD || answers.password,
65
- orgSlug: process.env.CONTRAIL_CLI_ORGSLUG || answers.orgSlug,
20
+ ) {
21
+ console.debug('populating auth config from fs config');
22
+ Auth.config = {
23
+ apiUserToken: config.apiUserToken,
24
+ apiGateway: config.apiGateway,
25
+ orgSlug: config.orgSlug,
66
26
  };
67
- if (!params.email || !params.password) {
68
- throw new Error('Email and Password required');
27
+ setSdkConfig(Auth.config);
28
+ try {
29
+ return await refreshCurrentUserOrg();
30
+ } catch (e) {
31
+ console.log('Token expired. Requesting auth credentials...');
69
32
  }
70
33
 
71
- const poolData = {
72
- UserPoolId: CONFIGURATION.userPoolId,
73
- ClientId: CONFIGURATION.clientId,
74
- };
34
+ }
35
+ const questions = [];
36
+ if (!process.env.CONTRAIL_CLI_EMAIL) {
37
+ questions.push({
38
+ type: 'input',
39
+ name: 'email',
40
+ validate: (val) => !!val,
41
+ message: 'Email',
42
+ });
43
+ }
44
+ if (!process.env.CONTRAIL_CLI_PASSWORD) {
45
+ questions.push({
46
+ type: 'password',
47
+ name: 'password',
48
+ validate: (val) => !!val,
49
+ message: 'Password',
50
+ });
51
+ }
52
+ if (!process.env.CONTRAIL_CLI_ORGSLUG) {
53
+ questions.push({
54
+ type: 'input',
55
+ name: 'orgSlug',
56
+ validate: (val) => !!val,
57
+ message: 'Org (slug)',
58
+ });
59
+ }
75
60
 
76
- const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
77
- const authData = {
78
- Username: params.email,
79
- Password: params.password,
80
- };
61
+ const answers = await inquirer.prompt(questions);
62
+ const params = {
63
+ email: process.env.CONTRAIL_CLI_EMAIL || answers.email,
64
+ password: process.env.CONTRAIL_CLI_PASSWORD || answers.password,
65
+ orgSlug: process.env.CONTRAIL_CLI_ORGSLUG || answers.orgSlug,
66
+ };
67
+ if (!params.email || !params.password) {
68
+ throw new Error('Email and Password required');
69
+ }
81
70
 
82
- const authDetails = new AmazonCognitoIdentity.AuthenticationDetails(authData);
83
- const userData = {
84
- Username: params.email,
85
- Pool: userPool,
86
- };
71
+ const poolData = {
72
+ UserPoolId: CONFIGURATION.userPoolId,
73
+ ClientId: CONFIGURATION.clientId,
74
+ };
75
+
76
+ const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
77
+ const authData = {
78
+ Username: params.email,
79
+ Password: params.password,
80
+ };
81
+
82
+ const authDetails = new AmazonCognitoIdentity.AuthenticationDetails(authData);
83
+ const userData = {
84
+ Username: params.email,
85
+ Pool: userPool,
86
+ };
87
87
 
88
- const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
88
+ const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
89
89
 
90
- return new Promise((resolve, reject) => {
91
- cognitoUser.authenticateUser(authDetails, {
92
- onSuccess: async (result) => {
93
- const user = result;
94
- const config = await setAuthContext(user, params);
90
+ return new Promise((resolve, reject) => {
91
+ cognitoUser.authenticateUser(authDetails, {
92
+ onSuccess: async (result) => {
93
+ const user = result;
94
+ const config = await setAuthContext(user, params);
95
95
 
96
- resolve(config);
97
- },
98
- onFailure: (err) => {
99
- reject(err);
100
- },
101
- });
96
+ resolve(config);
97
+ },
98
+ onFailure: (err) => {
99
+ reject(err);
100
+ },
102
101
  });
102
+ });
103
103
  }
104
104
 
105
105
  async function setAuthContext(user, params): Promise<AuthContext> {
106
- const config = await getConfig();
107
- let apiGateway;
108
- console.log(config.environments)
109
- if(config.environments) {
110
- const questions = [];
111
- questions.push({
112
- type: 'list',
113
- name: 'environment',
114
- message: 'Which environment would you like to use?',
115
- choices: Object.keys(config.environments),
116
- default: Object.keys(config.environments)[0],
117
- });
118
- const answers = await inquirer.prompt(questions);
119
- apiGateway = config.environments[answers.environment]
120
- } else {
121
- apiGateway = 'https://api.vibeiq.com/prod/api';
122
- }
106
+ const config = await getConfig();
107
+ let apiGateway;
108
+ console.log(config.environments);
109
+ if(config.environments) {
110
+ const questions = [];
111
+ questions.push({
112
+ type: 'list',
113
+ name: 'environment',
114
+ message: 'Which environment would you like to use?',
115
+ choices: Object.keys(config.environments),
116
+ default: Object.keys(config.environments)[0],
117
+ });
118
+ const answers = await inquirer.prompt(questions);
119
+ apiGateway = config.environments[answers.environment];
120
+ } else {
121
+ apiGateway = 'https://api.vibeiq.com/prod/api';
122
+ }
123
123
 
124
- // Set Auth Config
125
- Auth.config = {
126
- apiUserToken: user.idToken.jwtToken,
127
- apiGateway,
128
- orgSlug: params.orgSlug,
129
- };
130
- // SET SDK CONFIG
131
- setSdkConfig(Auth.config);
124
+ // Set Auth Config
125
+ Auth.config = {
126
+ apiUserToken: user.idToken.jwtToken,
127
+ apiGateway,
128
+ orgSlug: params.orgSlug,
129
+ };
130
+ // SET SDK CONFIG
131
+ setSdkConfig(Auth.config);
132
132
 
133
- return refreshCurrentUserOrg();
133
+ return refreshCurrentUserOrg();
134
134
  }
135
135
 
136
136
  async function refreshCurrentUserOrg() {
137
- console.debug("refreshing current user org")
138
- const currentUser = await Request.request('/users/current', {
139
- method: 'GET',
140
- headers: {
141
- 'Accept': 'application/json',
142
- 'Content-Type': 'application/json',
143
- },
144
- });
145
- if (!currentUser) {
146
- throw Error('Could not get current user');
147
- }
148
- const org = currentUser.orgs.find(o => o.orgSlug === Auth.config.orgSlug);
149
- if (org) {
150
- Auth.config.orgId = org.orgId || org.id;
151
- }
152
- // cache config in the fs
153
- storeConfig(Object.assign({}, Auth.config))
154
- return Object.assign({}, Auth.config);
137
+ console.debug('refreshing current user org');
138
+ const currentUser = await Request.request('/users/current', {
139
+ method: 'GET',
140
+ headers: {
141
+ Accept: 'application/json',
142
+ 'Content-Type': 'application/json',
143
+ },
144
+ });
145
+ if (!currentUser) {
146
+ throw Error('Could not get current user');
147
+ }
148
+ const org = currentUser.orgs.find(o => o.orgSlug === Auth.config.orgSlug);
149
+ if (org) {
150
+ Auth.config.orgId = org.orgId || org.id;
151
+ }
152
+ // cache config in the fs
153
+ storeConfig(Object.assign({}, Auth.config));
154
+ return Object.assign({}, Auth.config);
155
155
  }
package/src/cli.ts CHANGED
@@ -9,7 +9,7 @@ import { MergeOptionSets } from './types/option-set-merger';
9
9
  import { MergeTypeProperties } from './types/types-properties-merger';
10
10
  import { ParseTypesFromFiles, ParseTypesFromLocalFiles, ParseTypesFromTemplateFromLocalFiles } from './types/parse-types';
11
11
  import { loadColors, deleteColors } from './colors/color-loader';
12
- import {listConfig, removeConfig} from './config/configCommands'
12
+ import {listConfig, removeConfig} from './config/configCommands';
13
13
  import {deleteWorkflowTemplate, deployWorkflowTemplate, listWorkflowTemplate} from './workflows/workflowCommands';
14
14
  const cliUsage = require('command-line-usage');
15
15
 
@@ -42,132 +42,132 @@ export async function cli(args) {
42
42
  command = commandParts[1];
43
43
 
44
44
  switch (domain) {
45
- case 'app': {
46
- switch (command) {
47
- case 'create': {
48
- create(args);
49
- break;
50
- }
51
- case 'deploy': {
52
- deployApp(args);
53
- break;
54
- }
55
- case 'remove': {
56
- removeApp(args);
57
- break;
58
- }
59
- default: {
60
- printIllegalCommand();
61
- }
62
- }
45
+ case 'app': {
46
+ switch (command) {
47
+ case 'create': {
48
+ create(args);
63
49
  break;
64
50
  }
65
- case 'types': {
66
- switch (command) {
67
- case 'getAll': {
68
- getTypes(args);
69
- break;
70
- }
71
- case 'uploadTypes': {
72
- uploadTypes(args);
73
- break;
74
- }
75
- case 'uploadOptionSets': {
76
- UploadOptionSets(args);
77
- break;
78
- }
79
- case 'parseOptionSetsLocalFiles': {
80
- ParseOptionSetsLocalFiles(args);
81
- break;
82
- }
83
- case 'parseTypesFromLocalFiles': {
84
- ParseTypesFromLocalFiles(args);
85
- break;
86
- }
87
- case 'parseTypesFromTemplateFromLocalFiles': {
88
- ParseTypesFromTemplateFromLocalFiles(args);
89
- break;
90
- }
91
- case 'parseTypesFromFiles': {
92
- ParseTypesFromFiles(args);
93
- break;
94
- }
95
- case 'mergeOptionSets': {
96
- MergeOptionSets(args);
97
- break;
98
- }
99
- case 'mergeTypeProperties': {
100
- MergeTypeProperties(args);
101
- break;
102
- }
103
- default: {
104
- printIllegalCommand();
105
- }
106
- }
51
+ case 'deploy': {
52
+ deployApp(args);
107
53
  break;
108
54
  }
55
+ case 'remove': {
56
+ removeApp(args);
57
+ break;
58
+ }
59
+ default: {
60
+ printIllegalCommand();
61
+ }
62
+ }
63
+ break;
64
+ }
65
+ case 'types': {
66
+ switch (command) {
67
+ case 'getAll': {
68
+ getTypes(args);
69
+ break;
70
+ }
71
+ case 'uploadTypes': {
72
+ uploadTypes();
73
+ break;
74
+ }
75
+ case 'uploadOptionSets': {
76
+ UploadOptionSets(args);
77
+ break;
78
+ }
79
+ case 'parseOptionSetsLocalFiles': {
80
+ ParseOptionSetsLocalFiles(args);
81
+ break;
82
+ }
83
+ case 'parseTypesFromLocalFiles': {
84
+ ParseTypesFromLocalFiles(args);
85
+ break;
86
+ }
87
+ case 'parseTypesFromTemplateFromLocalFiles': {
88
+ ParseTypesFromTemplateFromLocalFiles(args);
89
+ break;
90
+ }
91
+ case 'parseTypesFromFiles': {
92
+ ParseTypesFromFiles(args);
93
+ break;
94
+ }
95
+ case 'mergeOptionSets': {
96
+ MergeOptionSets(args);
97
+ break;
98
+ }
99
+ case 'mergeTypeProperties': {
100
+ MergeTypeProperties(args);
101
+ break;
102
+ }
103
+ default: {
104
+ printIllegalCommand();
105
+ }
106
+ }
107
+ break;
108
+ }
109
109
 
110
- case 'colors': {
111
- switch (command) {
112
- case 'load': {
113
- await loadColors();
114
- break;
115
- }
116
- case 'delete': {
117
- await deleteColors();
118
- break;
119
- }
120
- default: {
121
- printIllegalCommand();
122
- }
123
- }
110
+ case 'colors': {
111
+ switch (command) {
112
+ case 'load': {
113
+ await loadColors();
124
114
  break;
125
115
  }
126
- case 'workflow-templates': {
127
- switch (command) {
128
- case 'load': {
129
- await deployWorkflowTemplate();
130
- break;
131
- }
132
- case 'delete': {
133
- await deleteWorkflowTemplate();
134
- break;
135
- }
136
- case 'list': {
137
- await listWorkflowTemplate();
138
- break;
139
- }
140
- default: {
141
- printIllegalCommand();
142
- }
143
- }
116
+ case 'delete': {
117
+ await deleteColors();
144
118
  break;
145
119
  }
146
- case 'config': {
147
- switch (command) {
148
- case 'list': {
149
- await listConfig();
150
- break;
151
- }
152
- case 'remove': {
153
- await removeConfig(args);
154
- break;
155
- }
156
- default: {
157
- printIllegalCommand();
158
- }
159
- }
120
+ default: {
121
+ printIllegalCommand();
122
+ }
123
+ }
124
+ break;
125
+ }
126
+ case 'workflow-templates': {
127
+ switch (command) {
128
+ case 'load': {
129
+ await deployWorkflowTemplate();
130
+ break;
131
+ }
132
+ case 'delete': {
133
+ await deleteWorkflowTemplate();
160
134
  break;
161
135
  }
162
- case 'help':
163
- case '-help':
164
- case '--help': {
165
- printHelp();
136
+ case 'list': {
137
+ await listWorkflowTemplate();
166
138
  break;
167
139
  }
168
140
  default: {
169
141
  printIllegalCommand();
170
142
  }
143
+ }
144
+ break;
145
+ }
146
+ case 'config': {
147
+ switch (command) {
148
+ case 'list': {
149
+ await listConfig();
150
+ break;
151
+ }
152
+ case 'remove': {
153
+ await removeConfig(args);
154
+ break;
155
+ }
156
+ default: {
157
+ printIllegalCommand();
158
+ }
159
+ }
160
+ break;
161
+ }
162
+ case 'help':
163
+ case '-help':
164
+ case '--help': {
165
+ printHelp();
166
+ break;
167
+ }
168
+ default: {
169
+ printIllegalCommand();
170
+ }
171
171
  }
172
172
  }
173
173
 
@@ -244,13 +244,13 @@ const helpSections = [
244
244
  'parseTypesFromFiles <fileIds> Parse CSV files into Types and ',
245
245
  '. OptionSets from VibeIQ Files.\n',
246
246
  'mergeOptionSets <File Path> Merge the OptionSets from an existing',
247
- '. org and the OptionSets passed in.',
247
+ '. org and the OptionSets passed in.',
248
248
  '. File must be .yml\n',
249
- 'mergeTypeProperties <File Path> <TypePaths> ',
249
+ 'mergeTypeProperties <File Path> <TypePaths> ',
250
250
  '. Merge the TypeProperties from an existing',
251
251
  '. org and the TypeProperties passed in.',
252
- '. Add to Types via TypePath',
252
+ '. Add to Types via TypePath',
253
253
  '. File must be .yml\n',
254
254
  ],
255
255
  },
256
- ];
256
+ ];
@@ -3,7 +3,7 @@ import chalk from 'chalk';
3
3
  import { authUser } from '../auth/login';
4
4
  import { getSeparatorByPlatform } from '../common';
5
5
 
6
- const csv = require('csvtojson')
6
+ const csv = require('csvtojson');
7
7
 
8
8
  interface Color {
9
9
  name: string;
@@ -17,7 +17,7 @@ export async function deleteColors() {
17
17
  try {
18
18
  await authUser();
19
19
  const colors = await getExistingColors();
20
- console.log("Deleting %s colors", colors.length)
20
+ console.log('Deleting %s colors', colors.length);
21
21
  for (const color of colors) {
22
22
  await deleteColor(color);
23
23
  }
@@ -32,10 +32,10 @@ export async function deleteColors() {
32
32
  export async function loadColors() {
33
33
  try {
34
34
  await authUser();
35
- console.log(`%s Getting Existing Colors`, chalk.yellow.bold('COLORS'));
36
- console.log(`%s Uploading`, chalk.yellow.bold('COLORS'));
35
+ console.log('%s Getting Existing Colors', chalk.yellow.bold('COLORS'));
36
+ console.log('%s Uploading', chalk.yellow.bold('COLORS'));
37
37
  await uploadColors();
38
- console.log(`%s Uploaded`, chalk.yellow.bold('COLORS'));
38
+ console.log('%s Uploaded', chalk.yellow.bold('COLORS'));
39
39
 
40
40
  }
41
41
  catch (e) {
@@ -47,23 +47,23 @@ export async function loadColors() {
47
47
  }
48
48
 
49
49
  async function getLocalColors() {
50
- console.log("loading colors from local file")
50
+ console.log('loading colors from local file');
51
51
  const TARGET_DIR = process.cwd();
52
52
  try {
53
53
  const separator = getSeparatorByPlatform();
54
54
 
55
- const csvFilePath = TARGET_DIR + separator + 'colors.csv'
56
- return await csv().fromFile(csvFilePath)
55
+ const csvFilePath = TARGET_DIR + separator + 'colors.csv';
56
+ return await csv().fromFile(csvFilePath);
57
57
  } catch (e) {
58
58
  throw new Error(`ERROR PARSING COLORS CSV: ${e}`);
59
59
  }
60
60
  }
61
61
 
62
62
  async function getExistingColors() {
63
- console.log(`%s Getting Existing Colors`, chalk.yellow.bold('COLORS'));
63
+ console.log('%s Getting Existing Colors', chalk.yellow.bold('COLORS'));
64
64
  try {
65
65
  const result = await new Entities().get({ entityName: 'color', take: 3000}); //, useSearch: false }); Not in EntitiesClientGetOptions yet
66
- console.log("Found %s existing colors", result.length)
66
+ console.log('Found %s existing colors', result.length);
67
67
  return result;
68
68
  } catch (e) {
69
69
  throw new Error(`ERROR DOWNLOADING COLORS: ${e}`);
@@ -81,10 +81,10 @@ async function deleteColor(color) {
81
81
  async function uploadColors() {
82
82
  const colors: Color[] = await getLocalColors();
83
83
  const existingColors = await getExistingColors();
84
- const existingNamesValues = existingColors.filter(x => x.name).map(x => x.name)
84
+ const existingNamesValues = existingColors.filter(x => x.name).map(x => x.name);
85
85
  for (const color of colors) {
86
86
  if (existingNamesValues.includes(color.name)) {
87
- console.log(`%s SKIPPING %s (%s)`, chalk.yellow.bold('COLORS'), color.hex, color.name);
87
+ console.log('%s SKIPPING %s (%s)', chalk.yellow.bold('COLORS'), color.hex, color.name);
88
88
  continue;
89
89
  }
90
90
  if (color.hex.length > 1 && color.hex[0] === '#') {
@@ -93,15 +93,15 @@ async function uploadColors() {
93
93
  const o: any = {
94
94
  hex: color.hex,
95
95
  name: color.name
96
- }
96
+ };
97
97
  if (color.red) {
98
- o.red = color.red
98
+ o.red = color.red;
99
99
  }
100
100
  if (color.green) {
101
- o.green = color.green
101
+ o.green = color.green;
102
102
  }
103
103
  if (color.blue) {
104
- o.blue = color.blue
104
+ o.blue = color.blue;
105
105
  }
106
106
 
107
107
  await new Entities().create({