@contrail/cli 2.4.0 → 3.0.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 (172) hide show
  1. package/README.md +550 -196
  2. package/dist/auth/login.d.ts +1 -0
  3. package/dist/auth/login.js +119 -48
  4. package/dist/auth/login.spec.d.ts +1 -0
  5. package/dist/auth/login.spec.js +10 -0
  6. package/dist/baseFlags.d.ts +10 -0
  7. package/dist/baseFlags.js +25 -0
  8. package/dist/basecommand.d.ts +5 -2
  9. package/dist/basecommand.js +51 -47
  10. package/dist/commands/app/create.d.ts +2 -2
  11. package/dist/commands/app/create.js +1 -1
  12. package/dist/commands/app/delete.d.ts +4 -0
  13. package/dist/commands/app/delete.js +3 -0
  14. package/dist/commands/app/getApiKey.d.ts +2 -0
  15. package/dist/commands/app/getApiKey.js +3 -3
  16. package/dist/commands/app/init.d.ts +5 -1
  17. package/dist/commands/app/init.js +6 -3
  18. package/dist/commands/app/install.d.ts +1 -1
  19. package/dist/commands/app/install.js +10 -11
  20. package/dist/commands/app/publish.d.ts +2 -0
  21. package/dist/commands/app/publish.js +3 -3
  22. package/dist/commands/app/uninstall.d.ts +2 -0
  23. package/dist/commands/app/uninstall.js +5 -5
  24. package/dist/commands/app/upgrade.d.ts +2 -0
  25. package/dist/commands/app/upgrade.js +8 -8
  26. package/dist/commands/app/version/major.d.ts +4 -0
  27. package/dist/commands/app/version/major.js +3 -0
  28. package/dist/commands/app/version/minor.d.ts +4 -0
  29. package/dist/commands/app/version/minor.js +3 -0
  30. package/dist/commands/app/version/patch.d.ts +4 -0
  31. package/dist/commands/app/version/patch.js +3 -0
  32. package/dist/commands/config/create.d.ts +12 -0
  33. package/dist/commands/config/create.js +27 -0
  34. package/dist/commands/config/describe.d.ts +14 -0
  35. package/dist/commands/config/describe.js +46 -0
  36. package/dist/commands/config/list.d.ts +4 -0
  37. package/dist/commands/config/list.js +5 -1
  38. package/dist/commands/config/set.d.ts +3 -2
  39. package/dist/commands/config/set.js +17 -13
  40. package/dist/commands/config/use.d.ts +14 -0
  41. package/dist/commands/config/use.js +47 -0
  42. package/dist/commands/file/upload.d.ts +15 -0
  43. package/dist/commands/file/upload.js +69 -0
  44. package/dist/commands/groups/export.d.ts +2 -0
  45. package/dist/commands/groups/export.js +2 -2
  46. package/dist/commands/groups/{upload.d.ts → import.d.ts} +4 -0
  47. package/dist/commands/groups/{upload.js → import.js} +60 -23
  48. package/dist/commands/instance/export.d.ts +2 -0
  49. package/dist/commands/instance/export.js +4 -4
  50. package/dist/commands/instance/import.d.ts +2 -0
  51. package/dist/commands/instance/import.js +8 -8
  52. package/dist/commands/load/colors.d.ts +14 -0
  53. package/dist/commands/load/colors.js +53 -0
  54. package/dist/commands/load/custom-entity.d.ts +14 -0
  55. package/dist/commands/load/custom-entity.js +55 -0
  56. package/dist/commands/load/line-sheet.d.ts +14 -0
  57. package/dist/commands/load/line-sheet.js +55 -0
  58. package/dist/commands/{loader-process → load}/upload-and-load.d.ts +4 -0
  59. package/dist/commands/{loader-process → load}/upload-and-load.js +6 -4
  60. package/dist/commands/projects/export.d.ts +4 -1
  61. package/dist/commands/projects/export.js +4 -3
  62. package/dist/commands/projects/list.d.ts +4 -0
  63. package/dist/commands/projects/list.js +3 -0
  64. package/dist/commands/projects/load.d.ts +4 -0
  65. package/dist/commands/projects/load.js +5 -3
  66. package/dist/commands/types/exportOptionSetHierarchies.d.ts +4 -0
  67. package/dist/commands/types/exportOptionSetHierarchies.js +3 -0
  68. package/dist/commands/types/getAll.d.ts +9 -27
  69. package/dist/commands/types/getAll.js +6 -313
  70. package/dist/commands/types/getOptionSets.d.ts +16 -0
  71. package/dist/commands/types/getOptionSets.js +171 -0
  72. package/dist/commands/types/loadAll.d.ts +2 -0
  73. package/dist/commands/types/loadAll.js +2 -2
  74. package/dist/commands/types/mergeOptionSets.d.ts +4 -0
  75. package/dist/commands/types/mergeOptionSets.js +5 -3
  76. package/dist/commands/types/mergeTypeProperties.d.ts +4 -0
  77. package/dist/commands/types/mergeTypeProperties.js +11 -9
  78. package/dist/commands/types/parseOptionSetsHierarchyLocalFile.d.ts +4 -0
  79. package/dist/commands/types/parseOptionSetsHierarchyLocalFile.js +4 -2
  80. package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.d.ts +4 -0
  81. package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.js +4 -2
  82. package/dist/commands/types/parseOptionSetsLocalFiles.d.ts +2 -0
  83. package/dist/commands/types/parseOptionSetsLocalFiles.js +4 -4
  84. package/dist/commands/types/parseOptionSetsToFolderStructure.d.ts +4 -0
  85. package/dist/commands/types/parseOptionSetsToFolderStructure.js +6 -4
  86. package/dist/commands/types/parseTypesFromFiles.d.ts +4 -0
  87. package/dist/commands/types/parseTypesFromFiles.js +4 -2
  88. package/dist/commands/types/parseTypesFromLocalFiles.d.ts +4 -0
  89. package/dist/commands/types/parseTypesFromLocalFiles.js +4 -2
  90. package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.d.ts +4 -0
  91. package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.js +5 -3
  92. package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.d.ts +4 -0
  93. package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.js +5 -3
  94. package/dist/commands/types/uploadOptionSetHierarchies.d.ts +2 -0
  95. package/dist/commands/types/uploadOptionSetHierarchies.js +2 -2
  96. package/dist/commands/types/uploadOptionSets.d.ts +2 -0
  97. package/dist/commands/types/uploadOptionSets.js +2 -2
  98. package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.d.ts +4 -0
  99. package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.js +4 -2
  100. package/dist/commands/types/uploadRuleSets.d.ts +2 -0
  101. package/dist/commands/types/uploadRuleSets.js +2 -2
  102. package/dist/commands/types/uploadTypePolicies.d.ts +2 -0
  103. package/dist/commands/types/uploadTypePolicies.js +2 -2
  104. package/dist/commands/types/uploadTypePropertyPolicies.d.ts +2 -0
  105. package/dist/commands/types/uploadTypePropertyPolicies.js +2 -2
  106. package/dist/commands/types/uploadTypes.d.ts +2 -0
  107. package/dist/commands/types/uploadTypes.js +2 -2
  108. package/dist/commands/types/uploadUsageInfo.d.ts +2 -0
  109. package/dist/commands/types/uploadUsageInfo.js +2 -2
  110. package/dist/commands/users/export.d.ts +2 -0
  111. package/dist/commands/users/export.js +2 -2
  112. package/dist/commands/users/{upload.d.ts → import.d.ts} +4 -0
  113. package/dist/commands/users/{upload.js → import.js} +4 -2
  114. package/dist/commands/webhooks/create.d.ts +2 -0
  115. package/dist/commands/webhooks/create.js +2 -2
  116. package/dist/commands/webhooks/delete.d.ts +2 -0
  117. package/dist/commands/webhooks/delete.js +5 -5
  118. package/dist/commands/webhooks/getWebhookTrigger.d.ts +4 -0
  119. package/dist/commands/webhooks/getWebhookTrigger.js +6 -4
  120. package/dist/commands/webhooks/list.d.ts +2 -0
  121. package/dist/commands/webhooks/list.js +2 -2
  122. package/dist/commands/workflow-template-definitions/install.d.ts +4 -0
  123. package/dist/commands/workflow-template-definitions/install.js +3 -0
  124. package/dist/commands/workflow-template-definitions/list.d.ts +4 -0
  125. package/dist/commands/workflow-template-definitions/list.js +3 -0
  126. package/dist/commands/workflow-templates/delete.d.ts +4 -0
  127. package/dist/commands/workflow-templates/delete.js +3 -0
  128. package/dist/commands/workflow-templates/export.d.ts +2 -0
  129. package/dist/commands/workflow-templates/export.js +4 -2
  130. package/dist/commands/workflow-templates/list.d.ts +4 -0
  131. package/dist/commands/workflow-templates/list.js +3 -0
  132. package/dist/commands/workflow-templates/load.d.ts +4 -0
  133. package/dist/commands/workflow-templates/load.js +4 -2
  134. package/dist/helpers/app/app-template-parsers.d.ts +1 -1
  135. package/dist/helpers/app/app-template-parsers.js +3 -4
  136. package/dist/helpers/config/config.d.ts +12 -2
  137. package/dist/helpers/config/config.js +158 -16
  138. package/dist/helpers/file-helpers.d.ts +1 -0
  139. package/dist/helpers/file-helpers.js +11 -1
  140. package/dist/helpers/load/helpers.d.ts +20 -0
  141. package/dist/helpers/load/helpers.js +141 -0
  142. package/dist/helpers/load/helpers.spec.d.ts +1 -0
  143. package/dist/helpers/load/helpers.spec.js +62 -0
  144. package/dist/helpers/load/validators.d.ts +14 -0
  145. package/dist/helpers/load/validators.js +182 -0
  146. package/dist/helpers/load/validators.spec.d.ts +1 -0
  147. package/dist/helpers/load/validators.spec.js +450 -0
  148. package/dist/helpers/types/type-uploader.js +11 -3
  149. package/dist/helpers/workflow-template-definitions/workflow-template-definition-deployer.js +1 -1
  150. package/dist/helpers/workflow-templates/helper.js +0 -4
  151. package/dist/interfaces.d.ts +1 -0
  152. package/dist/templates/typescript/app.yml +17 -19
  153. package/dist/templates/typescript/package.json +14 -0
  154. package/dist/templates/typescript/src/actions/logItem.ts +1 -2
  155. package/oclif.manifest.json +1955 -250
  156. package/package.json +4 -2
  157. package/dist/commands/colors/deleteAll.d.ts +0 -6
  158. package/dist/commands/colors/deleteAll.js +0 -31
  159. package/dist/commands/colors/load.d.ts +0 -6
  160. package/dist/commands/colors/load.js +0 -30
  161. package/dist/commands/config/environments/list.d.ts +0 -7
  162. package/dist/commands/config/environments/list.js +0 -19
  163. package/dist/commands/config/environments/remove.d.ts +0 -12
  164. package/dist/commands/config/environments/remove.js +0 -36
  165. package/dist/commands/config/environments/set.d.ts +0 -12
  166. package/dist/commands/config/environments/set.js +0 -29
  167. package/dist/commands/config/remove.d.ts +0 -15
  168. package/dist/commands/config/remove.js +0 -28
  169. package/dist/commands/loader-process/load.d.ts +0 -9
  170. package/dist/commands/loader-process/load.js +0 -39
  171. package/dist/helpers/loader-process/helpers.d.ts +0 -2
  172. package/dist/helpers/loader-process/helpers.js +0 -99
@@ -1,29 +1,11 @@
1
1
  import { BaseCommand } from '../../basecommand';
2
- export interface DataHolder {
3
- types: any[];
4
- optionSets: any[];
5
- optionSetHierarchies: any[];
6
- optionSetHierarchyLinks: any[];
7
- ruleSets: any[];
8
- ruleSetLinks: any[];
9
- usageInfo: any[];
10
- typePropertyPolicies: any[];
11
- typePropertyPolicyLinks: any[];
12
- typePolicies: any[];
13
- typePolicyLinks: any[];
14
- }
15
- export interface ReducedDataHolder {
16
- reducedTypes: any[];
17
- reducedOptionSets: any[];
18
- reducedOptionSetHierarchies: any[];
19
- reducedOptionSetHierarchyLinks: any[];
20
- reducedRuleSets: any[];
21
- reducedRuleSetLinks: any[];
22
- reducedUsageInfo: any[];
23
- reducedTypePropertyPolicies: any[];
24
- reducedTypePropertyPolicyLinks: any[];
25
- reducedTypePolicies: any[];
26
- reducedTypePolicyLinks: any[];
2
+ export interface FolderMap {
3
+ [key: string]: {
4
+ filename: string;
5
+ split: boolean;
6
+ fileLabel: string;
7
+ saveFunction?: (data: any, dir: string, overwrite: boolean) => Promise<void>;
8
+ };
27
9
  }
28
10
  export default class GetAllTypes extends BaseCommand {
29
11
  static description: string;
@@ -31,9 +13,9 @@ export default class GetAllTypes extends BaseCommand {
31
13
  static flags: {
32
14
  outDir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
33
15
  overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
17
+ logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
34
18
  };
35
19
  run(): Promise<void>;
36
20
  }
37
21
  export declare function getAll(outDir: string, overwrite: boolean): Promise<void>;
38
- export declare function reduceTypes(dataHolder: DataHolder): any[];
39
- export declare function reduceData(data: DataHolder): Promise<ReducedDataHolder>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.reduceData = exports.reduceTypes = exports.getAll = void 0;
3
+ exports.getAll = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const core_1 = require("@oclif/core");
6
6
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
@@ -9,8 +9,8 @@ const login_1 = require("../../auth/login");
9
9
  const path = tslib_1.__importStar(require("path"));
10
10
  const type_extractor_1 = require("../../helpers/types/type-extractor");
11
11
  const types_1 = require("../../api/types");
12
+ const types_2 = require("@contrail/org-config-migration/lib/types");
12
13
  const file_helpers_1 = require("../../helpers/file-helpers");
13
- const users_1 = require("../../api/users");
14
14
  const basecommand_1 = require("../../basecommand");
15
15
  const logger_1 = tslib_1.__importDefault(require("../../logger"));
16
16
  const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
@@ -22,6 +22,7 @@ class GetAllTypes extends basecommand_1.BaseCommand {
22
22
  `,
23
23
  ];
24
24
  static flags = {
25
+ ...basecommand_1.BaseCommand.baseFlags,
25
26
  outDir: core_1.Flags.string({
26
27
  char: 'd',
27
28
  description: 'The directory to which to export the type data. Defaults to the current directory',
@@ -36,15 +37,14 @@ class GetAllTypes extends basecommand_1.BaseCommand {
36
37
  }),
37
38
  };
38
39
  async run() {
39
- const { flags } = await this.parse(GetAllTypes);
40
- await getAll(flags.outDir, flags.overwrite);
40
+ await getAll(this.flags.outDir, this.flags.overwrite);
41
41
  }
42
42
  }
43
43
  exports.default = GetAllTypes;
44
44
  async function getAll(outDir, overwrite) {
45
45
  try {
46
46
  const userConfig = await (0, login_1.authUser)();
47
- logger_1.default.info(`${chalk_1.default.blue.bold('START')} Getting all types for orgId: ${userConfig.orgId}`);
47
+ logger_1.default.info(`${chalk_1.default.blue.bold('START')} Getting all types for org ${userConfig.orgSlug}`);
48
48
  // make directory to house exports
49
49
  if (!fs_1.default.existsSync(path.resolve(outDir))) {
50
50
  fs_1.default.mkdirSync(path.resolve(outDir));
@@ -62,7 +62,7 @@ async function getAll(outDir, overwrite) {
62
62
  typePolicies: await (0, types_1.getTypePolicies)(),
63
63
  typePolicyLinks: await (0, types_1.getTypePolicyLinks)(),
64
64
  };
65
- const reducedData = await reduceData(data);
65
+ const reducedData = await (0, types_2.getAllReducedTypes)(data);
66
66
  await saveData(reducedData, outDir, overwrite);
67
67
  logger_1.default.info(`${chalk_1.default.yellow.bold('TYPES')} Retrieved`);
68
68
  }
@@ -73,313 +73,6 @@ async function getAll(outDir, overwrite) {
73
73
  logger_1.default.info(`${chalk_1.default.green.bold('COMPLETE')} Types Retrieval Complete.`);
74
74
  }
75
75
  exports.getAll = getAll;
76
- async function reduceTypePropertyPolicies(data) {
77
- const orgUsers = await (0, users_1.getUserOrgs)();
78
- const groups = await (0, users_1.getGroups)();
79
- function reducePrincipal(statement) {
80
- if (!statement?.principal) {
81
- return statement;
82
- }
83
- const [type, id] = statement.principal.split(':');
84
- if (!type || !id) {
85
- return statement;
86
- }
87
- if (type === 'group') {
88
- const groupName = groups.find((x) => x.id === id)?.name;
89
- if (!groupName) {
90
- logger_1.default.info(`Could not find group for statement. skipping invalid policy conversion ${id}`);
91
- return statement;
92
- }
93
- statement.principal = `group:${groupName}`;
94
- }
95
- else if (type === 'user') {
96
- const userEmail = orgUsers.find((x) => x.user.id === id)?.email;
97
- if (!userEmail) {
98
- logger_1.default.info(`Could not find group for statement. skipping invalid policy conversion ${id}`);
99
- return statement;
100
- }
101
- statement.principal = `user:${userEmail}`;
102
- }
103
- return statement;
104
- }
105
- return data?.typePropertyPolicies
106
- ?.map((x) => {
107
- return {
108
- label: x.label,
109
- identifier: x.identifier,
110
- policy: {
111
- version: x.policy.version,
112
- statements: x.policy.statements.map((x) => reducePrincipal(x)),
113
- },
114
- };
115
- })
116
- .sort((one, two) => (one.label < two.label ? -1 : 1));
117
- }
118
- function reduceTypePropertyPolicyLinks(data) {
119
- const typeProperties = data?.types?.map((x) => x.typeProperties).reduce((x, y) => x.concat(y));
120
- // make a map of all type properties to their type ids
121
- const typePropertyIdToTypeSlugMap = data.types.reduce((map, obj) => {
122
- for (const tp of obj.typeProperties) {
123
- map[tp.id] = obj.slug;
124
- }
125
- return map;
126
- }, {});
127
- return data?.typePropertyPolicyLinks
128
- ?.map((x) => {
129
- const typeSlug = typePropertyIdToTypeSlugMap[x.typePropertyId];
130
- const typePropertySlug = typeProperties.find((y) => y.id === x.typePropertyId)?.slug;
131
- const typePropertyPolicyIdentifier = data.typePropertyPolicies.find((y) => y.id === x.typePropertyPolicyId)?.identifier;
132
- if (!typeSlug || !typePropertySlug || !typePropertyPolicyIdentifier) {
133
- logger_1.default.debug(`typeSlug: ${typeSlug} typePropertySlug: ${typePropertySlug}, typePropertyPolicyIdentifier: ${typePropertyPolicyIdentifier} `);
134
- logger_1.default.warn(`Could not reduce bad type property policy link... skipping ${JSON.stringify(x, null, 2)}`);
135
- return null;
136
- }
137
- return {
138
- typeSlug,
139
- typePropertySlug,
140
- typePropertyPolicyIdentifier,
141
- };
142
- })
143
- .filter((x) => !!x);
144
- }
145
- async function reduceTypePolicies(data) {
146
- const orgUsers = await (0, users_1.getUserOrgs)();
147
- const groups = await (0, users_1.getGroups)();
148
- function reducePrincipal(statement) {
149
- if (!statement?.principal) {
150
- return statement;
151
- }
152
- const [type, id] = statement.principal.split(':');
153
- if (!type || !id) {
154
- return statement;
155
- }
156
- if (type === 'group') {
157
- const groupName = groups.find((x) => x.id === id)?.name;
158
- if (!groupName) {
159
- logger_1.default.info(`Could not find group for statement. skipping invalid policy conversion ${id}`);
160
- return statement;
161
- }
162
- statement.principal = `group:${groupName}`;
163
- }
164
- else if (type === 'user') {
165
- const userEmail = orgUsers.find((x) => x.user.id === id)?.email;
166
- if (!userEmail) {
167
- logger_1.default.info(`Could not find group for statement. skipping invalid policy conversion ${id}`);
168
- return statement;
169
- }
170
- statement.principal = `user:${userEmail}`;
171
- }
172
- return statement;
173
- }
174
- return data?.typePolicies
175
- ?.map((x) => {
176
- return {
177
- label: x.label,
178
- identifier: x.identifier,
179
- policy: {
180
- version: x.policy.version,
181
- statements: x.policy.statements.map((x) => reducePrincipal(x)),
182
- },
183
- };
184
- })
185
- .sort((one, two) => (one.label < two.label ? -1 : 1));
186
- }
187
- function reduceTypePolicyLinks(data) {
188
- const types = data?.types;
189
- return data?.typePolicyLinks?.map((x) => {
190
- return {
191
- typeSlug: types.find((y) => y.id === x.typeId)?.slug,
192
- typePolicyIdentifier: data.typePolicies.find((y) => y.id === x.typePolicyId)?.identifier,
193
- };
194
- });
195
- }
196
- function reduceUsageInfo(data) {
197
- const typeProperties = data?.types?.map((x) => x.typeProperties).reduce((x, y) => x.concat(y));
198
- return data?.usageInfo
199
- ?.map((x) => {
200
- return {
201
- used: x.used,
202
- editable: x.editable,
203
- formulaFunction: x.formulaFunction,
204
- validationFunction: x.validationFunction,
205
- numberFormat: x.numberFormat,
206
- defaultValue: x.defaultValue,
207
- label: x.label,
208
- typeSlug: data.types.find((y) => y.id === x.typeId)?.slug,
209
- typePropertySlug: typeProperties.find((y) => y.id === x.typePropertyId)?.slug,
210
- };
211
- })
212
- .sort((one, two) => (one.label < two.label ? -1 : 1));
213
- }
214
- function reduceRuleSetLinks(data) {
215
- const reducedRuleSetLinks = [];
216
- if (!data?.ruleSetLinks.length) {
217
- return [];
218
- }
219
- for (const ruleSetLink of data.ruleSetLinks) {
220
- const ruleSet = data?.ruleSets?.find((x) => x.id === ruleSetLink.typeRuleSetId);
221
- const type = data?.types?.find((x) => x.id === ruleSetLink.typeId);
222
- if (!ruleSet || !type) {
223
- logger_1.default.info(`${chalk_1.default.red.bold('TYPES')} Skipping bad rule set link ${ruleSetLink.id}`);
224
- }
225
- reducedRuleSetLinks.push({
226
- ruleSet: ruleSet.identifier,
227
- type: type.slug,
228
- });
229
- }
230
- return reducedRuleSetLinks.sort((one, two) => {
231
- if (one.type === two.type) {
232
- return one.ruleSet > two.ruleSet ? -1 : 1;
233
- }
234
- return one.type > two.type ? -1 : 1;
235
- });
236
- }
237
- function reduceRuleSets(data) {
238
- return data?.ruleSets
239
- ?.map((x) => {
240
- return {
241
- ruleSet: x.ruleSet,
242
- name: x.name,
243
- identifier: x.identifier,
244
- };
245
- })
246
- .sort((one, two) => (one.name < two.name ? -1 : 1));
247
- }
248
- function reduceOptionSets(data) {
249
- return data.optionSets
250
- ?.map((optionSet) => {
251
- return {
252
- name: optionSet.name,
253
- slug: optionSet.slug,
254
- isArchived: optionSet.isArchived,
255
- optionSet: optionSet.optionSet,
256
- };
257
- })
258
- .sort((one, two) => (one.name < two.name ? -1 : 1));
259
- }
260
- function reduceOptionSetHierarchies(data) {
261
- return data.optionSetHierarchies
262
- ?.map((x) => {
263
- const hierarchyBySlug = x.hierarchy.map((optionSetId) => data.optionSets?.find((x) => x.id === optionSetId)?.slug);
264
- return {
265
- hierarchy: hierarchyBySlug,
266
- options: x.options,
267
- name: x.name,
268
- identifier: x.identifier,
269
- };
270
- })
271
- .sort((one, two) => (one.name < two.name ? -1 : 1));
272
- }
273
- function reduceOptionSetHierarchyLinks(data) {
274
- return data.optionSetHierarchyLinks
275
- ?.map((x) => {
276
- const osh = data.optionSetHierarchies.find((y) => y.id === x.optionSetHierarchyId);
277
- if (!osh) {
278
- logger_1.default.info(`OSH Link: could not find option set hierarchy ${x.optionSetHierarchyId} skipping...`);
279
- return null;
280
- }
281
- const type = data.types.find((y) => y.id === x.typeId);
282
- if (!type) {
283
- logger_1.default.info(`OSH Link: could not find type ${x.typeId} skipping...`);
284
- return null;
285
- }
286
- const typePropertySlugs = [];
287
- for (const tpId of x.hierarchyTypePropertyIds) {
288
- const typePropertySlug = type.typeProperties.find((y) => y.id === tpId)?.slug;
289
- if (!typePropertySlug) {
290
- logger_1.default.info(`OSH Link: could not find type property ${tpId} skipping...`);
291
- return null;
292
- }
293
- typePropertySlugs.push(typePropertySlug);
294
- }
295
- return {
296
- optionSetHierarchyIdentifier: osh.identifier,
297
- typeSlug: type.slug,
298
- typePropertySlugs,
299
- };
300
- })
301
- .filter((x) => !!x)
302
- .sort((one, two) => (one.typeSlug < two.typeSlug ? -1 : 1));
303
- }
304
- function reduceTypes(dataHolder) {
305
- logger_1.default.info(`Found types: ${dataHolder.types.length}`);
306
- let reducedTypes = [];
307
- const optionSetSlugById = {};
308
- for (const optionSet of dataHolder.optionSets) {
309
- optionSetSlugById[optionSet.id] = optionSet.slug;
310
- }
311
- logger_1.default.debug(`option set and their ids: ${JSON.stringify(optionSetSlugById, null, 2)}`);
312
- for (const type of dataHolder.types) {
313
- const reducedTypeProperties = [];
314
- for (const typeProperty of type.typeProperties) {
315
- if (typeProperty.inherited) {
316
- continue;
317
- }
318
- const reducedTypeProperty = {
319
- slug: typeProperty.slug,
320
- id: typeProperty.id,
321
- isArchived: typeProperty.isArchived,
322
- propertyType: typeProperty.propertyType,
323
- label: typeProperty.label,
324
- editable: typeProperty.editable,
325
- searchable: typeProperty.searchable,
326
- core: typeProperty.core,
327
- typePropertyOptionSetSlug: optionSetSlugById[typeProperty.typePropertyOptionSetId],
328
- formula: typeProperty.formula,
329
- referencedTypePath: typeProperty.referencedTypePath,
330
- referencedTypeRootSlug: typeProperty.referencedTypeRootSlug,
331
- typePropertyUserListId: typeProperty.typePropertyUserListId,
332
- referencedTypeRole: typeProperty.referencedTypeRole,
333
- defaultValue: typeProperty.defaultValue,
334
- propertyLevel: typeProperty.propertyLevel,
335
- carryOverBehavior: typeProperty.carryOverBehavior,
336
- carryOverDefault: typeProperty.carryOverDefault,
337
- isUniqueProperty: typeProperty.isUniqueProperty,
338
- isUniquePropertyInFamily: typeProperty.isUniquePropertyInFamily,
339
- inherited: typeProperty.inherited,
340
- formulaFunction: typeProperty.formulaFunction,
341
- validationFunction: typeProperty.validationFunction,
342
- numberFormat: typeProperty.numberFormat,
343
- sequenceSeedValue: typeProperty.sequenceSeedValue,
344
- };
345
- reducedTypeProperties.push(reducedTypeProperty);
346
- }
347
- const reducedType = {
348
- typePath: type.typePath,
349
- slug: type.slug,
350
- label: type.label,
351
- isArchived: type.isArchived,
352
- typeProperties: reducedTypeProperties
353
- .map((x) => {
354
- delete x['id'];
355
- return {
356
- ...x,
357
- };
358
- })
359
- .sort((one, two) => (one.slug < two.slug ? -1 : 1)),
360
- };
361
- reducedTypes.push(reducedType);
362
- }
363
- reducedTypes = reducedTypes.sort((one, two) => (one.typePath < two.typePath ? -1 : 1));
364
- return reducedTypes;
365
- }
366
- exports.reduceTypes = reduceTypes;
367
- async function reduceData(data) {
368
- return {
369
- reducedTypes: reduceTypes(data),
370
- reducedOptionSets: reduceOptionSets(data),
371
- reducedOptionSetHierarchies: reduceOptionSetHierarchies(data),
372
- reducedOptionSetHierarchyLinks: reduceOptionSetHierarchyLinks(data),
373
- reducedRuleSets: reduceRuleSets(data),
374
- reducedRuleSetLinks: reduceRuleSetLinks(data),
375
- reducedUsageInfo: reduceUsageInfo(data),
376
- reducedTypePropertyPolicies: await reduceTypePropertyPolicies(data),
377
- reducedTypePropertyPolicyLinks: reduceTypePropertyPolicyLinks(data),
378
- reducedTypePolicies: await reduceTypePolicies(data),
379
- reducedTypePolicyLinks: reduceTypePolicyLinks(data),
380
- };
381
- }
382
- exports.reduceData = reduceData;
383
76
  const saveTypesFunction = async (data, dir, overwrite) => {
384
77
  const roots = {};
385
78
  for (const type of data.reducedTypes) {
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from '../../basecommand';
2
+ import { DataHolder, ReducedDataHolder } from '@contrail/org-config-migration/lib/interfaces';
3
+ export default class GetOptionSets extends BaseCommand {
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ format: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
8
+ outDir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
9
+ overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
11
+ logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ export declare function getAllOptionSets(outDir: string, overwrite: boolean, format: string): Promise<void>;
16
+ export declare function reduceData(data: DataHolder): Promise<ReducedDataHolder>;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reduceData = exports.getAllOptionSets = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const core_1 = require("@oclif/core");
6
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
7
+ const fs_1 = tslib_1.__importDefault(require("fs"));
8
+ const login_1 = require("../../auth/login");
9
+ const path = tslib_1.__importStar(require("path"));
10
+ const types_1 = require("../../api/types");
11
+ const file_helpers_1 = require("../../helpers/file-helpers");
12
+ const basecommand_1 = require("../../basecommand");
13
+ const logger_1 = tslib_1.__importDefault(require("../../logger"));
14
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
15
+ const common_1 = require("../../common");
16
+ const types_2 = require("@contrail/org-config-migration/lib/types");
17
+ class GetOptionSets extends basecommand_1.BaseCommand {
18
+ static description = 'Get all option sets and associated data for your Org';
19
+ static examples = [
20
+ `$ contrail types getOptionSets --format <YAML or CSV>
21
+ `,
22
+ ];
23
+ static flags = {
24
+ ...basecommand_1.BaseCommand.baseFlags,
25
+ format: core_1.Flags.string({ options: ['YAML', 'CSV'] }),
26
+ outDir: core_1.Flags.string({
27
+ char: 'd',
28
+ description: 'The directory to which to export the option sets data. Defaults to the current directory',
29
+ required: false,
30
+ default: '.',
31
+ }),
32
+ overwrite: core_1.Flags.boolean({
33
+ char: 'f',
34
+ description: 'Replaces any existing export files in outDir',
35
+ required: false,
36
+ default: false,
37
+ }),
38
+ };
39
+ async run() {
40
+ await getAllOptionSets(this.flags.outDir, this.flags.overwrite, this.flags.format);
41
+ }
42
+ }
43
+ exports.default = GetOptionSets;
44
+ async function getAllOptionSets(outDir, overwrite, format) {
45
+ try {
46
+ const userConfig = await (0, login_1.authUser)();
47
+ logger_1.default.info(`%s Getting all Option Sets for orgId: ${userConfig.orgId}`, chalk_1.default.blue.bold('START'));
48
+ // make directory to house exports
49
+ if (!fs_1.default.existsSync(path.resolve(outDir))) {
50
+ fs_1.default.mkdirSync(path.resolve(outDir));
51
+ }
52
+ const data = {
53
+ optionSets: await (0, types_1.getOptionSets)(),
54
+ };
55
+ const reducedData = await reduceData(data);
56
+ await saveData(reducedData, outDir, overwrite, format);
57
+ logger_1.default.info('%s Retrieved', chalk_1.default.yellow.bold('OPTION SETS'));
58
+ }
59
+ catch (e) {
60
+ logger_1.default.info(`%s Option Sets Retrieval Failed. ${e}`, chalk_1.default.red.bold('FAIL'));
61
+ return;
62
+ }
63
+ logger_1.default.info('%s Option Sets Retrieval Complete.', chalk_1.default.green.bold('COMPLETE'));
64
+ }
65
+ exports.getAllOptionSets = getAllOptionSets;
66
+ async function reduceData(data) {
67
+ return {
68
+ reducedOptionSets: (0, types_2.getReducedOptionSets)(data),
69
+ };
70
+ }
71
+ exports.reduceData = reduceData;
72
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
73
+ function sortOptionSetsByName(optionSets) {
74
+ return optionSets.sort((a, b) => {
75
+ const nameA = a.name.toLowerCase();
76
+ const nameB = b.name.toLowerCase();
77
+ if (nameA < nameB)
78
+ return -1;
79
+ if (nameA > nameB)
80
+ return 1;
81
+ return 0;
82
+ });
83
+ }
84
+ async function saveData(reducedData, dir, overwrite, format) {
85
+ const propertyToFolderMap = {
86
+ reducedOptionSets: { filename: 'option-sets', split: true, fileLabel: 'name' },
87
+ };
88
+ for (const [key, folder] of Object.entries(propertyToFolderMap)) {
89
+ const CURRENT_DIR = process.cwd();
90
+ if (folder['saveFunction']) {
91
+ await folder['saveFunction'](reducedData, dir, overwrite);
92
+ }
93
+ else if (folder.split) {
94
+ const subDir = path.join(CURRENT_DIR, dir, folder.filename);
95
+ if (!fs_1.default.existsSync(subDir)) {
96
+ fs_1.default.mkdirSync(subDir);
97
+ }
98
+ if (format === 'CSV') {
99
+ await saveOptionSetsToCSV(reducedData[key], subDir, folder.fileLabel, overwrite, false);
100
+ }
101
+ else {
102
+ await saveOptionSetsToYAML(reducedData[key], subDir, folder.fileLabel, overwrite);
103
+ }
104
+ }
105
+ else {
106
+ if (format === 'CSV') {
107
+ const combinedCSVPath = path.join(CURRENT_DIR, dir, 'option-sets.csv');
108
+ const combineCSV = true;
109
+ await saveOptionSetsToCSV(reducedData[key], combinedCSVPath, folder.fileLabel, overwrite, combineCSV);
110
+ }
111
+ else {
112
+ const yamlStr = js_yaml_1.default.dump(reducedData[key]);
113
+ const pathToWrite = path.join(CURRENT_DIR, dir, `${folder.filename}.yml`);
114
+ if (fs_1.default.existsSync(pathToWrite)) {
115
+ await (0, file_helpers_1.safeFileOverwrite)(pathToWrite, overwrite);
116
+ }
117
+ fs_1.default.writeFileSync(pathToWrite, yamlStr, 'utf8');
118
+ }
119
+ }
120
+ }
121
+ }
122
+ async function saveOptionSetsToCSV(optionSets, dir, fileLabel, overwrite, combineCSV) {
123
+ const sortedOptionSets = sortOptionSetsByName(optionSets);
124
+ let dataToAdd = [];
125
+ for (const item of sortedOptionSets) {
126
+ const fileLabelValue = item[fileLabel];
127
+ if (!fileLabelValue) {
128
+ logger_1.default.warn('skipping bad data:', item);
129
+ continue;
130
+ }
131
+ let pathToWrite;
132
+ if (combineCSV) {
133
+ const csvHeaders = 'Option Set name,Value Key,label\n'; // CSV headers
134
+ fs_1.default.writeFileSync(dir, csvHeaders, 'utf8');
135
+ pathToWrite = dir;
136
+ }
137
+ else {
138
+ dataToAdd = [];
139
+ pathToWrite = path.join(dir, `${(0, common_1.removeSlash)(fileLabelValue)}.csv`);
140
+ const csvHeaders = 'Option Set Name,Value Key,Label\n'; // CSV headers
141
+ if (!fs_1.default.existsSync(pathToWrite)) {
142
+ fs_1.default.writeFileSync(pathToWrite, csvHeaders, 'utf8');
143
+ }
144
+ }
145
+ const existingData = fs_1.default.readFileSync(pathToWrite, 'utf8');
146
+ for (const option of item.optionSet) {
147
+ const csvData = `${item.name},${option.value},${option.display}\n`;
148
+ if (!existingData.includes(csvData)) {
149
+ dataToAdd.push(csvData);
150
+ }
151
+ }
152
+ if (dataToAdd.length > 0) {
153
+ fs_1.default.writeFileSync(pathToWrite, dataToAdd.join(''), { encoding: 'utf8', flag: 'a' });
154
+ }
155
+ }
156
+ }
157
+ async function saveOptionSetsToYAML(optionSets, dir, fileLabel, overwrite) {
158
+ for (const item of optionSets) {
159
+ const yamlStr = js_yaml_1.default.dump(item);
160
+ const fileLabelValue = item[fileLabel];
161
+ if (!fileLabelValue) {
162
+ logger_1.default.warn('skipping bad data:', item);
163
+ continue;
164
+ }
165
+ const pathToWrite = path.join(dir, `${(0, common_1.removeSlash)(fileLabelValue)}.yml`);
166
+ if (fs_1.default.existsSync(pathToWrite)) {
167
+ await (0, file_helpers_1.safeFileOverwrite)(pathToWrite, overwrite);
168
+ }
169
+ fs_1.default.writeFileSync(pathToWrite, yamlStr, 'utf8');
170
+ }
171
+ }
@@ -4,6 +4,8 @@ export default class LoadAllTypes extends BaseCommand {
4
4
  static examples: string[];
5
5
  static flags: {
6
6
  dir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
7
+ alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
8
+ logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
7
9
  };
8
10
  run(): Promise<void>;
9
11
  }
@@ -21,6 +21,7 @@ class LoadAllTypes extends basecommand_1.BaseCommand {
21
21
  `,
22
22
  ];
23
23
  static flags = {
24
+ ...basecommand_1.BaseCommand.baseFlags,
24
25
  dir: core_1.Flags.string({
25
26
  char: 'd',
26
27
  description: 'The directory from which to load the types data. Defaults to the current directory.',
@@ -29,8 +30,7 @@ class LoadAllTypes extends basecommand_1.BaseCommand {
29
30
  }),
30
31
  };
31
32
  async run() {
32
- const { flags } = await this.parse(LoadAllTypes);
33
- await loadAll(flags.dir);
33
+ await loadAll(this.flags.dir);
34
34
  }
35
35
  }
36
36
  exports.default = LoadAllTypes;
@@ -2,6 +2,10 @@ import { BaseCommand } from '../../basecommand';
2
2
  export default class MergeOptionSets extends BaseCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
+ static flags: {
6
+ alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
7
+ logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
8
+ };
5
9
  static args: {
6
10
  file: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
7
11
  };
@@ -16,15 +16,17 @@ class MergeOptionSets extends basecommand_1.BaseCommand {
16
16
  `$ contrail types mergeOptionSets <File Path>
17
17
  `,
18
18
  ];
19
+ static flags = {
20
+ ...basecommand_1.BaseCommand.baseFlags,
21
+ };
19
22
  static args = {
20
23
  file: core_1.Args.string({ description: 'File to merge with the cloud option sets', required: true }),
21
24
  };
22
25
  async run() {
23
- const { args } = await this.parse(MergeOptionSets);
24
26
  try {
25
27
  this.log('%s Importing local file', chalk_1.default.yellow.bold('OPTION SET MERGE'));
26
- this.log('Using File: ', args.file);
27
- await mergeOptionSets(args.file);
28
+ this.log('Using File: ', this.args.file);
29
+ await mergeOptionSets(this.args.file);
28
30
  this.log('%s Merged', chalk_1.default.yellow.bold('OPTION SET MERGE'));
29
31
  }
30
32
  catch (e) {
@@ -3,6 +3,10 @@ export default class MergeTypeProperties extends BaseCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static strict: boolean;
6
+ static flags: {
7
+ alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
8
+ logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
9
+ };
6
10
  static args: {
7
11
  file: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
8
12
  typePaths: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;