@contrail/cli 3.4.3 → 3.4.4-alpha.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 (241) hide show
  1. package/README.md +38 -1
  2. package/bin/dev +0 -0
  3. package/bin/run +0 -0
  4. package/dist/__mocks__/@contrail/sdk.d.ts +123 -123
  5. package/dist/__mocks__/@contrail/sdk.js +716 -716
  6. package/dist/api/app-extension-deployments.d.ts +2 -2
  7. package/dist/api/app-extension-deployments.js +11 -11
  8. package/dist/api/app-extension-packages.d.ts +2 -2
  9. package/dist/api/app-extension-packages.js +11 -11
  10. package/dist/api/apps.d.ts +10 -10
  11. package/dist/api/apps.js +63 -63
  12. package/dist/api/event-workflow-action-definition.d.ts +3 -3
  13. package/dist/api/event-workflow-action-definition.js +18 -18
  14. package/dist/api/event-workflow-template-definition.d.ts +7 -7
  15. package/dist/api/event-workflow-template-definition.js +26 -26
  16. package/dist/api/event-workflow-templates.d.ts +8 -8
  17. package/dist/api/event-workflow-templates.js +32 -32
  18. package/dist/api/schedules.d.ts +7 -7
  19. package/dist/api/schedules.js +32 -32
  20. package/dist/api/types.d.ts +11 -11
  21. package/dist/api/types.js +79 -79
  22. package/dist/api/users.d.ts +2 -2
  23. package/dist/api/users.js +18 -18
  24. package/dist/api/webhooks.d.ts +4 -4
  25. package/dist/api/webhooks.js +16 -16
  26. package/dist/auth/login.d.ts +3 -3
  27. package/dist/auth/login.js +221 -221
  28. package/dist/auth/login.spec.d.ts +1 -1
  29. package/dist/auth/login.spec.js +10 -10
  30. package/dist/baseFlags.d.ts +10 -10
  31. package/dist/baseFlags.js +25 -25
  32. package/dist/basecommand.d.ts +15 -15
  33. package/dist/basecommand.js +83 -83
  34. package/dist/commands/app/create.d.ts +10 -10
  35. package/dist/commands/app/create.js +96 -96
  36. package/dist/commands/app/delete.d.ts +11 -11
  37. package/dist/commands/app/delete.js +40 -40
  38. package/dist/commands/app/extension/deploy.d.ts +18 -18
  39. package/dist/commands/app/extension/deploy.js +127 -127
  40. package/dist/commands/app/extension/deployment/list.d.ts +14 -14
  41. package/dist/commands/app/extension/deployment/list.js +82 -82
  42. package/dist/commands/app/getApiKey.d.ts +11 -11
  43. package/dist/commands/app/getApiKey.js +49 -49
  44. package/dist/commands/app/init.d.ts +10 -10
  45. package/dist/commands/app/init.js +67 -67
  46. package/dist/commands/app/install.d.ts +13 -13
  47. package/dist/commands/app/install.js +135 -135
  48. package/dist/commands/app/publish.d.ts +14 -14
  49. package/dist/commands/app/publish.js +69 -69
  50. package/dist/commands/app/uninstall.d.ts +12 -12
  51. package/dist/commands/app/uninstall.js +68 -68
  52. package/dist/commands/app/upgrade.d.ts +14 -14
  53. package/dist/commands/app/upgrade.js +108 -108
  54. package/dist/commands/app/version/major.d.ts +11 -11
  55. package/dist/commands/app/version/major.js +39 -39
  56. package/dist/commands/app/version/minor.d.ts +11 -11
  57. package/dist/commands/app/version/minor.js +39 -39
  58. package/dist/commands/app/version/patch.d.ts +11 -11
  59. package/dist/commands/app/version/patch.js +39 -39
  60. package/dist/commands/config/create.d.ts +12 -12
  61. package/dist/commands/config/create.js +27 -27
  62. package/dist/commands/config/describe.d.ts +14 -14
  63. package/dist/commands/config/describe.js +46 -46
  64. package/dist/commands/config/list.d.ts +11 -11
  65. package/dist/commands/config/list.js +38 -38
  66. package/dist/commands/config/set.d.ts +16 -16
  67. package/dist/commands/config/set.js +46 -46
  68. package/dist/commands/config/use.d.ts +14 -14
  69. package/dist/commands/config/use.js +47 -47
  70. package/dist/commands/file/upload.d.ts +15 -15
  71. package/dist/commands/file/upload.js +69 -69
  72. package/dist/commands/groups/export.d.ts +14 -14
  73. package/dist/commands/groups/export.js +103 -103
  74. package/dist/commands/groups/import.d.ts +14 -14
  75. package/dist/commands/groups/import.js +190 -190
  76. package/dist/commands/instance/export.d.ts +12 -12
  77. package/dist/commands/instance/export.js +36 -36
  78. package/dist/commands/instance/import.d.ts +11 -11
  79. package/dist/commands/instance/import.js +34 -34
  80. package/dist/commands/load/colors.d.ts +14 -14
  81. package/dist/commands/load/colors.js +53 -53
  82. package/dist/commands/load/custom-entity.d.ts +14 -14
  83. package/dist/commands/load/custom-entity.js +55 -55
  84. package/dist/commands/load/line-sheet.d.ts +14 -14
  85. package/dist/commands/load/line-sheet.js +55 -55
  86. package/dist/commands/load/upload-and-load.d.ts +14 -14
  87. package/dist/commands/load/upload-and-load.js +46 -46
  88. package/dist/commands/load-local/index.d.ts +17 -0
  89. package/dist/commands/load-local/index.js +156 -0
  90. package/dist/commands/projects/export.d.ts +13 -13
  91. package/dist/commands/projects/export.js +35 -35
  92. package/dist/commands/projects/list.d.ts +10 -10
  93. package/dist/commands/projects/list.js +36 -36
  94. package/dist/commands/projects/load.d.ts +25 -25
  95. package/dist/commands/projects/load.js +198 -198
  96. package/dist/commands/types/exportOptionSetHierarchies.d.ts +11 -11
  97. package/dist/commands/types/exportOptionSetHierarchies.js +133 -133
  98. package/dist/commands/types/getAll.d.ts +21 -21
  99. package/dist/commands/types/getAll.js +180 -180
  100. package/dist/commands/types/getOptionSets.d.ts +16 -16
  101. package/dist/commands/types/getOptionSets.js +170 -170
  102. package/dist/commands/types/loadAll.d.ts +12 -12
  103. package/dist/commands/types/loadAll.js +55 -55
  104. package/dist/commands/types/mergeOptionSets.d.ts +13 -13
  105. package/dist/commands/types/mergeOptionSets.js +116 -116
  106. package/dist/commands/types/mergeTypeProperties.d.ts +15 -15
  107. package/dist/commands/types/mergeTypeProperties.js +95 -95
  108. package/dist/commands/types/parseOptionSetsHierarchyLocalFile.d.ts +14 -14
  109. package/dist/commands/types/parseOptionSetsHierarchyLocalFile.js +133 -133
  110. package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.d.ts +14 -14
  111. package/dist/commands/types/parseOptionSetsHierarchyValuesToKeysLocalFile.js +102 -102
  112. package/dist/commands/types/parseOptionSetsLocalFiles.d.ts +39 -39
  113. package/dist/commands/types/parseOptionSetsLocalFiles.js +229 -229
  114. package/dist/commands/types/parseOptionSetsToFolderStructure.d.ts +13 -13
  115. package/dist/commands/types/parseOptionSetsToFolderStructure.js +68 -68
  116. package/dist/commands/types/parseTypesFromFiles.d.ts +14 -14
  117. package/dist/commands/types/parseTypesFromFiles.js +40 -40
  118. package/dist/commands/types/parseTypesFromLocalFiles.d.ts +14 -14
  119. package/dist/commands/types/parseTypesFromLocalFiles.js +37 -37
  120. package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.d.ts +15 -15
  121. package/dist/commands/types/parseTypesFromTemplateAndDataFromLocalFiles.js +39 -39
  122. package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.d.ts +14 -14
  123. package/dist/commands/types/parseTypesFromTemplateFromLocalFiles.js +38 -38
  124. package/dist/commands/types/uploadOptionSetHierarchies.d.ts +12 -12
  125. package/dist/commands/types/uploadOptionSetHierarchies.js +257 -257
  126. package/dist/commands/types/uploadOptionSets.d.ts +13 -13
  127. package/dist/commands/types/uploadOptionSets.js +155 -155
  128. package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.d.ts +15 -15
  129. package/dist/commands/types/uploadOptionSetsHierarchyLocalFile.js +135 -135
  130. package/dist/commands/types/uploadRuleSets.d.ts +12 -12
  131. package/dist/commands/types/uploadRuleSets.js +197 -197
  132. package/dist/commands/types/uploadTypePolicies.d.ts +12 -12
  133. package/dist/commands/types/uploadTypePolicies.js +233 -233
  134. package/dist/commands/types/uploadTypePropertyPolicies.d.ts +13 -13
  135. package/dist/commands/types/uploadTypePropertyPolicies.js +286 -286
  136. package/dist/commands/types/uploadTypes.d.ts +13 -13
  137. package/dist/commands/types/uploadTypes.js +35 -35
  138. package/dist/commands/types/uploadUsageInfo.d.ts +15 -15
  139. package/dist/commands/types/uploadUsageInfo.js +179 -179
  140. package/dist/commands/types/uploadUsageInfo.spec.d.ts +1 -1
  141. package/dist/commands/types/uploadUsageInfo.spec.js +249 -249
  142. package/dist/commands/users/export.d.ts +14 -14
  143. package/dist/commands/users/export.js +76 -76
  144. package/dist/commands/users/import.d.ts +14 -14
  145. package/dist/commands/users/import.js +68 -68
  146. package/dist/commands/webhooks/create.d.ts +11 -11
  147. package/dist/commands/webhooks/create.js +25 -25
  148. package/dist/commands/webhooks/delete.d.ts +14 -14
  149. package/dist/commands/webhooks/delete.js +53 -53
  150. package/dist/commands/webhooks/getWebhookTrigger.d.ts +13 -13
  151. package/dist/commands/webhooks/getWebhookTrigger.js +40 -40
  152. package/dist/commands/webhooks/list.d.ts +12 -12
  153. package/dist/commands/webhooks/list.js +31 -31
  154. package/dist/commands/workflow-template-definitions/install.d.ts +10 -10
  155. package/dist/commands/workflow-template-definitions/install.js +19 -19
  156. package/dist/commands/workflow-template-definitions/list.d.ts +10 -10
  157. package/dist/commands/workflow-template-definitions/list.js +19 -19
  158. package/dist/commands/workflow-templates/delete.d.ts +10 -10
  159. package/dist/commands/workflow-templates/delete.js +19 -19
  160. package/dist/commands/workflow-templates/export.d.ts +14 -14
  161. package/dist/commands/workflow-templates/export.js +78 -78
  162. package/dist/commands/workflow-templates/list.d.ts +10 -10
  163. package/dist/commands/workflow-templates/list.js +19 -19
  164. package/dist/commands/workflow-templates/load.d.ts +13 -13
  165. package/dist/commands/workflow-templates/load.js +26 -26
  166. package/dist/common.d.ts +4 -4
  167. package/dist/common.js +18 -18
  168. package/dist/helpers/app/actions-deployer.d.ts +11 -11
  169. package/dist/helpers/app/actions-deployer.js +123 -123
  170. package/dist/helpers/app/app-config-validators.d.ts +22 -22
  171. package/dist/helpers/app/app-config-validators.js +100 -100
  172. package/dist/helpers/app/app-config-validators.spec.d.ts +1 -1
  173. package/dist/helpers/app/app-config-validators.spec.js +310 -310
  174. package/dist/helpers/app/app-deployer.d.ts +12 -12
  175. package/dist/helpers/app/app-deployer.js +278 -278
  176. package/dist/helpers/app/app-template-parsers.d.ts +14 -14
  177. package/dist/helpers/app/app-template-parsers.js +106 -106
  178. package/dist/helpers/app/extension-package-deployer.d.ts +7 -7
  179. package/dist/helpers/app/extension-package-deployer.js +175 -175
  180. package/dist/helpers/app/extensions-deployer.d.ts +9 -9
  181. package/dist/helpers/app/extensions-deployer.js +95 -95
  182. package/dist/helpers/app/load-app-config.d.ts +4 -4
  183. package/dist/helpers/app/load-app-config.js +22 -22
  184. package/dist/helpers/app/metadata-extractor.d.ts +1 -1
  185. package/dist/helpers/app/metadata-extractor.js +100 -100
  186. package/dist/helpers/app/setup-template.d.ts +8 -8
  187. package/dist/helpers/app/setup-template.js +48 -48
  188. package/dist/helpers/app/update-app-config.d.ts +2 -2
  189. package/dist/helpers/app/update-app-config.js +20 -20
  190. package/dist/helpers/app/upgrade-version.d.ts +16 -16
  191. package/dist/helpers/app/upgrade-version.js +37 -37
  192. package/dist/helpers/app/upgrade-version.spec.d.ts +1 -1
  193. package/dist/helpers/app/upgrade-version.spec.js +33 -33
  194. package/dist/helpers/colors/helpers.d.ts +12 -12
  195. package/dist/helpers/colors/helpers.js +84 -84
  196. package/dist/helpers/config/config.d.ts +16 -16
  197. package/dist/helpers/config/config.js +223 -223
  198. package/dist/helpers/file-helpers.d.ts +2 -2
  199. package/dist/helpers/file-helpers.js +36 -36
  200. package/dist/helpers/load/helpers.d.ts +20 -20
  201. package/dist/helpers/load/helpers.js +141 -141
  202. package/dist/helpers/load/helpers.spec.d.ts +1 -1
  203. package/dist/helpers/load/helpers.spec.js +62 -62
  204. package/dist/helpers/load/validators.d.ts +14 -14
  205. package/dist/helpers/load/validators.js +182 -182
  206. package/dist/helpers/load/validators.spec.d.ts +1 -1
  207. package/dist/helpers/load/validators.spec.js +450 -450
  208. package/dist/helpers/pipeline/formatters.d.ts +6 -0
  209. package/dist/helpers/pipeline/formatters.js +219 -0
  210. package/dist/helpers/projects/helpers.d.ts +3 -3
  211. package/dist/helpers/projects/helpers.js +167 -167
  212. package/dist/helpers/types/csv-parser.d.ts +1 -1
  213. package/dist/helpers/types/csv-parser.js +59 -59
  214. package/dist/helpers/types/option-set-helper.d.ts +9 -9
  215. package/dist/helpers/types/option-set-helper.js +48 -48
  216. package/dist/helpers/types/option-set-helper.spec.d.ts +1 -1
  217. package/dist/helpers/types/option-set-helper.spec.js +64 -64
  218. package/dist/helpers/types/parseOptionSetsLocalFiles.spec.d.ts +1 -1
  219. package/dist/helpers/types/parseOptionSetsLocalFiles.spec.js +285 -285
  220. package/dist/helpers/types/type-extractor.d.ts +1 -1
  221. package/dist/helpers/types/type-extractor.js +36 -36
  222. package/dist/helpers/types/type-parser.d.ts +4 -4
  223. package/dist/helpers/types/type-parser.js +119 -119
  224. package/dist/helpers/types/type-uploader.d.ts +20 -20
  225. package/dist/helpers/types/type-uploader.js +336 -336
  226. package/dist/helpers/types/type-uploader.spec.d.ts +1 -1
  227. package/dist/helpers/types/type-uploader.spec.js +266 -266
  228. package/dist/helpers/types/uploadOptionSets.spec.d.ts +1 -1
  229. package/dist/helpers/types/uploadOptionSets.spec.js +19 -19
  230. package/dist/helpers/workflow-template-definitions/workflow-template-definition-deployer.d.ts +12 -12
  231. package/dist/helpers/workflow-template-definitions/workflow-template-definition-deployer.js +158 -158
  232. package/dist/helpers/workflow-templates/helper.d.ts +20 -20
  233. package/dist/helpers/workflow-templates/helper.js +285 -285
  234. package/dist/index.d.ts +1 -1
  235. package/dist/index.js +5 -5
  236. package/dist/interfaces.d.ts +470 -470
  237. package/dist/interfaces.js +163 -163
  238. package/dist/logger.d.ts +3 -3
  239. package/dist/logger.js +33 -33
  240. package/oclif.manifest.json +85 -1
  241. package/package.json +7 -2
@@ -1,127 +1,127 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const core_1 = require("@oclif/core");
5
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
- const fs = tslib_1.__importStar(require("fs"));
7
- const path = tslib_1.__importStar(require("path"));
8
- const app_extension_deployments_1 = require("../../../api/app-extension-deployments");
9
- const app_extension_packages_1 = require("../../../api/app-extension-packages");
10
- const apps_1 = require("../../../api/apps");
11
- const login_1 = require("../../../auth/login");
12
- const basecommand_1 = require("../../../basecommand");
13
- const extension_package_deployer_1 = require("../../../helpers/app/extension-package-deployer");
14
- const load_app_config_1 = require("../../../helpers/app/load-app-config");
15
- const interfaces_1 = require("../../../interfaces");
16
- const logger_1 = tslib_1.__importDefault(require("../../../logger"));
17
- class DeployExtension extends basecommand_1.BaseCommand {
18
- static description = 'Deploy an extension from the extensions directory to a VibeIQ managed URL.';
19
- static examples = [`$ contrail extension deploy --identifier <extensionIdentifier>`];
20
- static flags = {
21
- ...basecommand_1.BaseCommand.baseFlags,
22
- identifier: core_1.Flags.string({
23
- char: 'i',
24
- description: 'The extension identifier to deploy. The identifier of the extension is the "identifier" property in the extension defined in the app.yml',
25
- required: true,
26
- }),
27
- debug: core_1.Flags.boolean({
28
- char: 'd',
29
- description: 'Enable debug mode',
30
- default: false,
31
- }),
32
- };
33
- async run() {
34
- await (0, login_1.authUser)();
35
- try {
36
- const extensionIdentifier = this.flags.identifier;
37
- // 1. Validate manifest and extension existence
38
- const appDeclaration = this.getAppDeclaration();
39
- const app = await this.getExistingApp(appDeclaration);
40
- await this.validateExtensionDeclaration(appDeclaration, extensionIdentifier);
41
- const extensionDir = this.getExtensionDirectory(extensionIdentifier);
42
- // 2. Package and upload extension
43
- const createdPackage = await (0, extension_package_deployer_1.createExtensionPackage)(app.id, extensionDir, {
44
- debug: this.flags.debug,
45
- });
46
- // 3. Poll until package is ready (timeout after 1 minute)
47
- const readyPackage = await this.pollUntilPackageIsReady(createdPackage);
48
- logger_1.default.info('Extension package is ready...Checking for extension deployment');
49
- logger_1.default.debug(JSON.stringify(readyPackage, null, 2));
50
- const deployment = await this.pollUntilDeploymentIsReady(readyPackage.deploymentId);
51
- logger_1.default.info(`${chalk_1.default.green.bold('SUCCESS')} Extension package is ready.`);
52
- logger_1.default.info(`${chalk_1.default.green.bold('SUCCESS')} Please note that it may take a few minutes for the extension to be available if it is the first time you are deploying it.`);
53
- logger_1.default.info(`${chalk_1.default.green.bold('SUCCESS')} Extension deployment URL: ${deployment.cloudFrontUrl}/packages/${readyPackage.id}/index.html`);
54
- }
55
- catch (error) {
56
- logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Extension Deployment Failed. ${error}`);
57
- }
58
- }
59
- async pollUntilPackageIsReady(createdPackage) {
60
- let currentPackage = createdPackage;
61
- const startTime = Date.now();
62
- const timeoutMs = 120000; // 2 minutes
63
- while (currentPackage.status !== interfaces_1.AppExtensionPackageStatus.READY) {
64
- if (Date.now() - startTime > timeoutMs) {
65
- throw new Error('Timed out waiting for package to be ready');
66
- }
67
- await new Promise((resolve) => setTimeout(resolve, 2000));
68
- currentPackage = await (0, app_extension_packages_1.getAppExtensionPackage)(currentPackage.id);
69
- logger_1.default.info(`Package status: ${currentPackage.status}`);
70
- if (currentPackage.status === interfaces_1.AppExtensionPackageStatus.FAILED) {
71
- throw new Error('Package failed to build');
72
- }
73
- }
74
- return currentPackage;
75
- }
76
- async pollUntilDeploymentIsReady(deploymentId) {
77
- let currentDeployment = await (0, app_extension_deployments_1.getAppExtensionDeployment)(deploymentId);
78
- const startTime = Date.now();
79
- const timeoutMs = 60000; // 1 minute
80
- while (currentDeployment.status !== interfaces_1.AppExtensionDeploymentStatus.DEPLOYED) {
81
- if (Date.now() - startTime > timeoutMs) {
82
- throw new Error('Timed out waiting for deployment to be ready');
83
- }
84
- await new Promise((resolve) => setTimeout(resolve, 2000));
85
- currentDeployment = await (0, app_extension_deployments_1.getAppExtensionDeployment)(currentDeployment.id);
86
- logger_1.default.info(`Deployment status: ${currentDeployment.status}`);
87
- if (currentDeployment.status === interfaces_1.AppExtensionDeploymentStatus.FAILED) {
88
- throw new Error('Deployment failed');
89
- }
90
- }
91
- return currentDeployment;
92
- }
93
- getAppDeclaration() {
94
- return (0, load_app_config_1.loadAppConfig)();
95
- }
96
- async getExistingApp(appDeclaration) {
97
- const apps = await (0, apps_1.getAvailableApps)();
98
- const foundApp = apps.find((app) => app.identifier === appDeclaration.appIdentifier);
99
- if (!foundApp) {
100
- throw new Error(`App ${appDeclaration.appIdentifier} not found. Extensions can only be deployed for existing apps.`);
101
- }
102
- return foundApp;
103
- }
104
- async validateExtensionDeclaration(appDeclaration, extensionIdentifier) {
105
- const extensions = appDeclaration.extensions;
106
- if (!Array.isArray(extensions) || extensions.length === 0) {
107
- throw new Error('No extensions defined in app.yml.');
108
- }
109
- const extensionDecl = extensions.find((ext) => ext.identifier === extensionIdentifier);
110
- if (!extensionDecl) {
111
- const message = `Extension '${extensionIdentifier}' not found in app.yml.`;
112
- logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} ${message}`);
113
- throw new Error(message);
114
- }
115
- return extensionDecl;
116
- }
117
- getExtensionDirectory(extensionIdentifier) {
118
- const extensionDir = path.resolve(process.cwd(), 'extensions', extensionIdentifier);
119
- if (!fs.existsSync(extensionDir)) {
120
- const message = `Extension directory '${extensionDir}' does not exist.`;
121
- logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} ${message}`);
122
- throw new Error(message);
123
- }
124
- return extensionDir;
125
- }
126
- }
127
- exports.default = DeployExtension;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const core_1 = require("@oclif/core");
5
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
+ const fs = tslib_1.__importStar(require("fs"));
7
+ const path = tslib_1.__importStar(require("path"));
8
+ const app_extension_deployments_1 = require("../../../api/app-extension-deployments");
9
+ const app_extension_packages_1 = require("../../../api/app-extension-packages");
10
+ const apps_1 = require("../../../api/apps");
11
+ const login_1 = require("../../../auth/login");
12
+ const basecommand_1 = require("../../../basecommand");
13
+ const extension_package_deployer_1 = require("../../../helpers/app/extension-package-deployer");
14
+ const load_app_config_1 = require("../../../helpers/app/load-app-config");
15
+ const interfaces_1 = require("../../../interfaces");
16
+ const logger_1 = tslib_1.__importDefault(require("../../../logger"));
17
+ class DeployExtension extends basecommand_1.BaseCommand {
18
+ static description = 'Deploy an extension from the extensions directory to a VibeIQ managed URL.';
19
+ static examples = [`$ contrail extension deploy --identifier <extensionIdentifier>`];
20
+ static flags = {
21
+ ...basecommand_1.BaseCommand.baseFlags,
22
+ identifier: core_1.Flags.string({
23
+ char: 'i',
24
+ description: 'The extension identifier to deploy. The identifier of the extension is the "identifier" property in the extension defined in the app.yml',
25
+ required: true,
26
+ }),
27
+ debug: core_1.Flags.boolean({
28
+ char: 'd',
29
+ description: 'Enable debug mode',
30
+ default: false,
31
+ }),
32
+ };
33
+ async run() {
34
+ await (0, login_1.authUser)();
35
+ try {
36
+ const extensionIdentifier = this.flags.identifier;
37
+ // 1. Validate manifest and extension existence
38
+ const appDeclaration = this.getAppDeclaration();
39
+ const app = await this.getExistingApp(appDeclaration);
40
+ await this.validateExtensionDeclaration(appDeclaration, extensionIdentifier);
41
+ const extensionDir = this.getExtensionDirectory(extensionIdentifier);
42
+ // 2. Package and upload extension
43
+ const createdPackage = await (0, extension_package_deployer_1.createExtensionPackage)(app.id, extensionDir, {
44
+ debug: this.flags.debug,
45
+ });
46
+ // 3. Poll until package is ready (timeout after 1 minute)
47
+ const readyPackage = await this.pollUntilPackageIsReady(createdPackage);
48
+ logger_1.default.info('Extension package is ready...Checking for extension deployment');
49
+ logger_1.default.debug(JSON.stringify(readyPackage, null, 2));
50
+ const deployment = await this.pollUntilDeploymentIsReady(readyPackage.deploymentId);
51
+ logger_1.default.info(`${chalk_1.default.green.bold('SUCCESS')} Extension package is ready.`);
52
+ logger_1.default.info(`${chalk_1.default.green.bold('SUCCESS')} Please note that it may take a few minutes for the extension to be available if it is the first time you are deploying it.`);
53
+ logger_1.default.info(`${chalk_1.default.green.bold('SUCCESS')} Extension deployment URL: ${deployment.cloudFrontUrl}/packages/${readyPackage.id}/index.html`);
54
+ }
55
+ catch (error) {
56
+ logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Extension Deployment Failed. ${error}`);
57
+ }
58
+ }
59
+ async pollUntilPackageIsReady(createdPackage) {
60
+ let currentPackage = createdPackage;
61
+ const startTime = Date.now();
62
+ const timeoutMs = 120000; // 2 minutes
63
+ while (currentPackage.status !== interfaces_1.AppExtensionPackageStatus.READY) {
64
+ if (Date.now() - startTime > timeoutMs) {
65
+ throw new Error('Timed out waiting for package to be ready');
66
+ }
67
+ await new Promise((resolve) => setTimeout(resolve, 2000));
68
+ currentPackage = await (0, app_extension_packages_1.getAppExtensionPackage)(currentPackage.id);
69
+ logger_1.default.info(`Package status: ${currentPackage.status}`);
70
+ if (currentPackage.status === interfaces_1.AppExtensionPackageStatus.FAILED) {
71
+ throw new Error('Package failed to build');
72
+ }
73
+ }
74
+ return currentPackage;
75
+ }
76
+ async pollUntilDeploymentIsReady(deploymentId) {
77
+ let currentDeployment = await (0, app_extension_deployments_1.getAppExtensionDeployment)(deploymentId);
78
+ const startTime = Date.now();
79
+ const timeoutMs = 60000; // 1 minute
80
+ while (currentDeployment.status !== interfaces_1.AppExtensionDeploymentStatus.DEPLOYED) {
81
+ if (Date.now() - startTime > timeoutMs) {
82
+ throw new Error('Timed out waiting for deployment to be ready');
83
+ }
84
+ await new Promise((resolve) => setTimeout(resolve, 2000));
85
+ currentDeployment = await (0, app_extension_deployments_1.getAppExtensionDeployment)(currentDeployment.id);
86
+ logger_1.default.info(`Deployment status: ${currentDeployment.status}`);
87
+ if (currentDeployment.status === interfaces_1.AppExtensionDeploymentStatus.FAILED) {
88
+ throw new Error('Deployment failed');
89
+ }
90
+ }
91
+ return currentDeployment;
92
+ }
93
+ getAppDeclaration() {
94
+ return (0, load_app_config_1.loadAppConfig)();
95
+ }
96
+ async getExistingApp(appDeclaration) {
97
+ const apps = await (0, apps_1.getAvailableApps)();
98
+ const foundApp = apps.find((app) => app.identifier === appDeclaration.appIdentifier);
99
+ if (!foundApp) {
100
+ throw new Error(`App ${appDeclaration.appIdentifier} not found. Extensions can only be deployed for existing apps.`);
101
+ }
102
+ return foundApp;
103
+ }
104
+ async validateExtensionDeclaration(appDeclaration, extensionIdentifier) {
105
+ const extensions = appDeclaration.extensions;
106
+ if (!Array.isArray(extensions) || extensions.length === 0) {
107
+ throw new Error('No extensions defined in app.yml.');
108
+ }
109
+ const extensionDecl = extensions.find((ext) => ext.identifier === extensionIdentifier);
110
+ if (!extensionDecl) {
111
+ const message = `Extension '${extensionIdentifier}' not found in app.yml.`;
112
+ logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} ${message}`);
113
+ throw new Error(message);
114
+ }
115
+ return extensionDecl;
116
+ }
117
+ getExtensionDirectory(extensionIdentifier) {
118
+ const extensionDir = path.resolve(process.cwd(), 'extensions', extensionIdentifier);
119
+ if (!fs.existsSync(extensionDir)) {
120
+ const message = `Extension directory '${extensionDir}' does not exist.`;
121
+ logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} ${message}`);
122
+ throw new Error(message);
123
+ }
124
+ return extensionDir;
125
+ }
126
+ }
127
+ exports.default = DeployExtension;
@@ -1,14 +1,14 @@
1
- import { BaseCommand } from '../../../../basecommand';
2
- import { AppExtensionPackage } from '../../../../interfaces';
3
- export default class ListExtensionDeployments extends BaseCommand {
4
- static description: string;
5
- static examples: string[];
6
- static flags: {
7
- all: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
- alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
9
- logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
10
- };
11
- run(): Promise<void>;
12
- getLatest20ExtensionPackages(appId: string): Promise<AppExtensionPackage[]>;
13
- getAllExtensionPackages(appId: string): Promise<AppExtensionPackage[]>;
14
- }
1
+ import { BaseCommand } from '../../../../basecommand';
2
+ import { AppExtensionPackage } from '../../../../interfaces';
3
+ export default class ListExtensionDeployments extends BaseCommand {
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ all: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
9
+ logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
10
+ };
11
+ run(): Promise<void>;
12
+ getLatest20ExtensionPackages(appId: string): Promise<AppExtensionPackage[]>;
13
+ getAllExtensionPackages(appId: string): Promise<AppExtensionPackage[]>;
14
+ }
@@ -1,82 +1,82 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const sdk_1 = require("@contrail/sdk");
5
- const core_1 = require("@oclif/core");
6
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
7
- const login_1 = require("../../../../auth/login");
8
- const basecommand_1 = require("../../../../basecommand");
9
- const extension_package_deployer_1 = require("../../../../helpers/app/extension-package-deployer");
10
- const load_app_config_1 = require("../../../../helpers/app/load-app-config");
11
- const logger_1 = tslib_1.__importDefault(require("../../../../logger"));
12
- const lodash_1 = require("lodash");
13
- class ListExtensionDeployments extends basecommand_1.BaseCommand {
14
- static description = 'List extension deployments';
15
- static examples = [`$ contrail extension deployment list`];
16
- static flags = {
17
- ...basecommand_1.BaseCommand.baseFlags,
18
- all: core_1.Flags.boolean({
19
- char: 'a',
20
- description: 'List all extension deployments. By default, only the latest 20 are shown',
21
- required: false,
22
- default: false,
23
- }),
24
- };
25
- async run() {
26
- await (0, login_1.authUser)();
27
- logger_1.default.info(`${chalk_1.default.blue.bold('START')} Listing extension deployments.`);
28
- const appDeclaration = (0, load_app_config_1.loadAppConfig)();
29
- const app = await (0, extension_package_deployer_1.getExistingApp)(appDeclaration);
30
- const packages = this.flags.all
31
- ? await this.getAllExtensionPackages(app.id)
32
- : await this.getLatest20ExtensionPackages(app.id);
33
- logger_1.default.debug('packages:', packages);
34
- const deploymentIds = Array.from(new Set(packages.map((p) => p.deploymentId))).filter((id) => !!id);
35
- logger_1.default.debug('deploymentIds:', deploymentIds);
36
- const deployments = await Promise.all(deploymentIds.map((id) => new sdk_1.Entities().get({ entityName: 'app-extension-deployment', id })));
37
- const deploymentsById = (0, lodash_1.keyBy)(deployments, 'id');
38
- const uniqueDeploymentUrls = new Set(deployments.map((d) => d.cloudFrontUrl).filter((url) => !!url));
39
- if (uniqueDeploymentUrls.size > 1) {
40
- logger_1.default.info(`${chalk_1.default.red.yellow('WARNING')} Multiple extension deployment URLS found for app ${appDeclaration.appIdentifier}`);
41
- return;
42
- }
43
- else if (uniqueDeploymentUrls.size === 0) {
44
- logger_1.default.info(`${chalk_1.default.red.yellow('WARNING')} No extension deployment URL found for app ${appDeclaration.appIdentifier}`);
45
- return;
46
- }
47
- const tableData = packages.map((extensionPackage) => ({
48
- 'Created At': extensionPackage.createdOn,
49
- 'Package ID': extensionPackage.id,
50
- Status: deploymentsById[extensionPackage.deploymentId]?.status || '-',
51
- URL: deploymentsById[extensionPackage.deploymentId]
52
- ? `${deploymentsById[extensionPackage.deploymentId]?.cloudFrontUrl}/packages/${extensionPackage.id}/index.html`
53
- : '-',
54
- }));
55
- console.table(tableData);
56
- }
57
- async getLatest20ExtensionPackages(appId) {
58
- return await new sdk_1.Entities().get({
59
- entityName: 'app-extension-package',
60
- criteria: { appId },
61
- order: [{ orderField: 'createdOn', order: sdk_1.SortOrderOptions.DESC }],
62
- take: 20,
63
- });
64
- }
65
- async getAllExtensionPackages(appId) {
66
- const packages = [];
67
- let nextPageKey = null;
68
- do {
69
- const response = await new sdk_1.Entities().get({
70
- entityName: 'app-extension-package',
71
- criteria: { appId },
72
- order: [{ orderField: 'createdOn', order: sdk_1.SortOrderOptions.DESC }],
73
- nextPageKey,
74
- apiVersion: sdk_1.API_VERSION.V2,
75
- });
76
- packages.push(...response.results);
77
- nextPageKey = response.nextPageKey;
78
- } while (nextPageKey);
79
- return packages;
80
- }
81
- }
82
- exports.default = ListExtensionDeployments;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@contrail/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
7
+ const login_1 = require("../../../../auth/login");
8
+ const basecommand_1 = require("../../../../basecommand");
9
+ const extension_package_deployer_1 = require("../../../../helpers/app/extension-package-deployer");
10
+ const load_app_config_1 = require("../../../../helpers/app/load-app-config");
11
+ const logger_1 = tslib_1.__importDefault(require("../../../../logger"));
12
+ const lodash_1 = require("lodash");
13
+ class ListExtensionDeployments extends basecommand_1.BaseCommand {
14
+ static description = 'List extension deployments';
15
+ static examples = [`$ contrail extension deployment list`];
16
+ static flags = {
17
+ ...basecommand_1.BaseCommand.baseFlags,
18
+ all: core_1.Flags.boolean({
19
+ char: 'a',
20
+ description: 'List all extension deployments. By default, only the latest 20 are shown',
21
+ required: false,
22
+ default: false,
23
+ }),
24
+ };
25
+ async run() {
26
+ await (0, login_1.authUser)();
27
+ logger_1.default.info(`${chalk_1.default.blue.bold('START')} Listing extension deployments.`);
28
+ const appDeclaration = (0, load_app_config_1.loadAppConfig)();
29
+ const app = await (0, extension_package_deployer_1.getExistingApp)(appDeclaration);
30
+ const packages = this.flags.all
31
+ ? await this.getAllExtensionPackages(app.id)
32
+ : await this.getLatest20ExtensionPackages(app.id);
33
+ logger_1.default.debug('packages:', packages);
34
+ const deploymentIds = Array.from(new Set(packages.map((p) => p.deploymentId))).filter((id) => !!id);
35
+ logger_1.default.debug('deploymentIds:', deploymentIds);
36
+ const deployments = await Promise.all(deploymentIds.map((id) => new sdk_1.Entities().get({ entityName: 'app-extension-deployment', id })));
37
+ const deploymentsById = (0, lodash_1.keyBy)(deployments, 'id');
38
+ const uniqueDeploymentUrls = new Set(deployments.map((d) => d.cloudFrontUrl).filter((url) => !!url));
39
+ if (uniqueDeploymentUrls.size > 1) {
40
+ logger_1.default.info(`${chalk_1.default.red.yellow('WARNING')} Multiple extension deployment URLS found for app ${appDeclaration.appIdentifier}`);
41
+ return;
42
+ }
43
+ else if (uniqueDeploymentUrls.size === 0) {
44
+ logger_1.default.info(`${chalk_1.default.red.yellow('WARNING')} No extension deployment URL found for app ${appDeclaration.appIdentifier}`);
45
+ return;
46
+ }
47
+ const tableData = packages.map((extensionPackage) => ({
48
+ 'Created At': extensionPackage.createdOn,
49
+ 'Package ID': extensionPackage.id,
50
+ Status: deploymentsById[extensionPackage.deploymentId]?.status || '-',
51
+ URL: deploymentsById[extensionPackage.deploymentId]
52
+ ? `${deploymentsById[extensionPackage.deploymentId]?.cloudFrontUrl}/packages/${extensionPackage.id}/index.html`
53
+ : '-',
54
+ }));
55
+ console.table(tableData);
56
+ }
57
+ async getLatest20ExtensionPackages(appId) {
58
+ return await new sdk_1.Entities().get({
59
+ entityName: 'app-extension-package',
60
+ criteria: { appId },
61
+ order: [{ orderField: 'createdOn', order: sdk_1.SortOrderOptions.DESC }],
62
+ take: 20,
63
+ });
64
+ }
65
+ async getAllExtensionPackages(appId) {
66
+ const packages = [];
67
+ let nextPageKey = null;
68
+ do {
69
+ const response = await new sdk_1.Entities().get({
70
+ entityName: 'app-extension-package',
71
+ criteria: { appId },
72
+ order: [{ orderField: 'createdOn', order: sdk_1.SortOrderOptions.DESC }],
73
+ nextPageKey,
74
+ apiVersion: sdk_1.API_VERSION.V2,
75
+ });
76
+ packages.push(...response.results);
77
+ nextPageKey = response.nextPageKey;
78
+ } while (nextPageKey);
79
+ return packages;
80
+ }
81
+ }
82
+ exports.default = ListExtensionDeployments;
@@ -1,11 +1,11 @@
1
- import { BaseCommand } from '../../basecommand';
2
- export default class GetAPIKeyApp extends BaseCommand {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- appIdentifier: 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>;
9
- };
10
- run(): Promise<void>;
11
- }
1
+ import { BaseCommand } from '../../basecommand';
2
+ export default class GetAPIKeyApp extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ appIdentifier: 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>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
@@ -1,50 +1,50 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const core_1 = require("@oclif/core");
5
- const apps_1 = require("../../api/apps");
6
- const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
7
- const login_1 = require("../../auth/login");
8
- const basecommand_1 = require("../../basecommand");
9
- const logger_1 = tslib_1.__importDefault(require("../../logger"));
10
- class GetAPIKeyApp extends basecommand_1.BaseCommand {
11
- static description = 'Get an api key for an installed app';
12
- static examples = [
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const core_1 = require("@oclif/core");
5
+ const apps_1 = require("../../api/apps");
6
+ const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
7
+ const login_1 = require("../../auth/login");
8
+ const basecommand_1 = require("../../basecommand");
9
+ const logger_1 = tslib_1.__importDefault(require("../../logger"));
10
+ class GetAPIKeyApp extends basecommand_1.BaseCommand {
11
+ static description = 'Get an api key for an installed app';
12
+ static examples = [
13
13
  `$ contrail app getApiKey
14
- `,
15
- ];
16
- static flags = {
17
- ...basecommand_1.BaseCommand.baseFlags,
18
- appIdentifier: core_1.Flags.string({ char: 'a', description: 'The app identifier', required: false }),
19
- };
20
- async run() {
21
- await (0, login_1.authUser)();
22
- const installedApps = await (0, apps_1.getInstalledApps)();
23
- if (!this.flags.appIdentifier) {
24
- const questions = [
25
- {
26
- type: 'list',
27
- name: 'appApiKey',
28
- message: 'For which app would you like to retrieve the API key?',
29
- choices: installedApps.map((x) => {
30
- return {
31
- name: x.app.name,
32
- value: x.apiKey.apiKey,
33
- };
34
- }),
35
- },
36
- ];
37
- const answers = await inquirer_1.default.prompt(questions);
38
- logger_1.default.info(`App API key: (app:${answers.appApiKey})`);
39
- }
40
- else {
41
- const appFound = installedApps.find((x) => x.app.identifier === this.flags.appIdentifier);
42
- if (!appFound) {
43
- logger_1.default.info('You do not have such an app installed');
44
- return;
45
- }
46
- logger_1.default.info(`App API key: (app:${appFound.apiKey.apiKey})`);
47
- }
48
- }
49
- }
50
- exports.default = GetAPIKeyApp;
14
+ `,
15
+ ];
16
+ static flags = {
17
+ ...basecommand_1.BaseCommand.baseFlags,
18
+ appIdentifier: core_1.Flags.string({ char: 'a', description: 'The app identifier', required: false }),
19
+ };
20
+ async run() {
21
+ await (0, login_1.authUser)();
22
+ const installedApps = await (0, apps_1.getInstalledApps)();
23
+ if (!this.flags.appIdentifier) {
24
+ const questions = [
25
+ {
26
+ type: 'list',
27
+ name: 'appApiKey',
28
+ message: 'For which app would you like to retrieve the API key?',
29
+ choices: installedApps.map((x) => {
30
+ return {
31
+ name: x.app.name,
32
+ value: x.apiKey.apiKey,
33
+ };
34
+ }),
35
+ },
36
+ ];
37
+ const answers = await inquirer_1.default.prompt(questions);
38
+ logger_1.default.info(`App API key: (app:${answers.appApiKey})`);
39
+ }
40
+ else {
41
+ const appFound = installedApps.find((x) => x.app.identifier === this.flags.appIdentifier);
42
+ if (!appFound) {
43
+ logger_1.default.info('You do not have such an app installed');
44
+ return;
45
+ }
46
+ logger_1.default.info(`App API key: (app:${appFound.apiKey.apiKey})`);
47
+ }
48
+ }
49
+ }
50
+ exports.default = GetAPIKeyApp;
@@ -1,10 +1,10 @@
1
- import { BaseCommand } from '../../basecommand';
2
- export default class InitApp extends BaseCommand {
3
- static description: string;
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
- };
9
- run(): Promise<void>;
10
- }
1
+ import { BaseCommand } from '../../basecommand';
2
+ export default class InitApp extends BaseCommand {
3
+ static description: string;
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
+ };
9
+ run(): Promise<void>;
10
+ }