@axinom/mosaic-cli 0.18.5-rc.1 → 0.19.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -7,6 +7,7 @@ const apply_templates_1 = require("../commands/apply-templates");
7
7
  const create_extension_config_1 = require("../commands/create-extension-config");
8
8
  const get_access_token_1 = require("../commands/get-access-token");
9
9
  const graphql_diff_1 = require("../commands/graphql-diff");
10
+ const hosting_1 = require("../commands/hosting");
10
11
  const msg_codegen_1 = require("../commands/msg-codegen");
11
12
  const msg_diff_1 = require("../commands/msg-diff");
12
13
  const pg_dump_1 = require("../commands/pg-dump");
@@ -22,7 +23,8 @@ const run = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
22
23
  .command(msg_codegen_1.msgCodegen)
23
24
  .command(msg_diff_1.msgDiff)
24
25
  .command(create_extension_config_1.createExtensionConfigCommand)
25
- .command(graphql_diff_1.graphqlDiff);
26
+ .command(graphql_diff_1.graphqlDiff)
27
+ .command(hosting_1.hosting);
26
28
  //adding cli extensions:
27
29
  yield Promise.all((0, create_extension_config_1.getExtensions)().map((library) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
28
30
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;AAAA,+BAA+B;AAC/B,iEAA6D;AAC7D,iFAG6C;AAC7C,mEAA8D;AAC9D,2DAAuD;AACvD,yDAAqD;AACrD,mDAA+C;AAC/C,iDAA6C;AAC7C,2EAAqE;AAE9D,MAAM,GAAG,GAAG,GAAwB,EAAE;IAC3C,KAAK;SACF,UAAU,CAAC,QAAQ,CAAC;SACpB,GAAG,EAAE;SACL,OAAO,CAAC,gCAAc,CAAC;SACvB,OAAO,CAAC,iCAAc,CAAC;SACvB,OAAO,CAAC,wCAAiB,CAAC;SAC1B,OAAO,CAAC,gBAAM,CAAC;SACf,OAAO,CAAC,wBAAU,CAAC;SACnB,OAAO,CAAC,kBAAO,CAAC;SAChB,OAAO,CAAC,sDAA4B,CAAC;SACrC,OAAO,CAAC,0BAAW,CAAC,CAAC;IAExB,wBAAwB;IACxB,MAAM,OAAO,CAAC,GAAG,CACf,IAAA,uCAAa,GAAE,CAAC,GAAG,CAAC,CAAO,OAAO,EAAE,EAAE;QACpC,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,yBAAa,OAAO,yBAAC,CAAC;YAC/C,IAAI,YAAY,EAAE;gBAChB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;aACJ;SACF;QAAC,OAAO,KAAK,EAAE;YACd,gEAAgE;SACjE;IACH,CAAC,CAAA,CAAC,CACH,CAAC;IAEF,KAAK;SACF,aAAa,EAAE;SACf,IAAI,EAAE;SACN,MAAM,CAAC,wDAAwD,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC,CAAA,CAAC;AAjCW,QAAA,GAAG,OAiCd"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;AAAA,+BAA+B;AAC/B,iEAA6D;AAC7D,iFAG6C;AAC7C,mEAA8D;AAC9D,2DAAuD;AACvD,iDAA8C;AAC9C,yDAAqD;AACrD,mDAA+C;AAC/C,iDAA6C;AAC7C,2EAAqE;AAE9D,MAAM,GAAG,GAAG,GAAwB,EAAE;IAC3C,KAAK;SACF,UAAU,CAAC,QAAQ,CAAC;SACpB,GAAG,EAAE;SACL,OAAO,CAAC,gCAAc,CAAC;SACvB,OAAO,CAAC,iCAAc,CAAC;SACvB,OAAO,CAAC,wCAAiB,CAAC;SAC1B,OAAO,CAAC,gBAAM,CAAC;SACf,OAAO,CAAC,wBAAU,CAAC;SACnB,OAAO,CAAC,kBAAO,CAAC;SAChB,OAAO,CAAC,sDAA4B,CAAC;SACrC,OAAO,CAAC,0BAAW,CAAC;SACpB,OAAO,CAAC,iBAAO,CAAC,CAAC;IAEpB,wBAAwB;IACxB,MAAM,OAAO,CAAC,GAAG,CACf,IAAA,uCAAa,GAAE,CAAC,GAAG,CAAC,CAAO,OAAO,EAAE,EAAE;QACpC,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,yBAAa,OAAO,yBAAC,CAAC;YAC/C,IAAI,YAAY,EAAE;gBAChB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;aACJ;SACF;QAAC,OAAO,KAAK,EAAE;YACd,gEAAgE;SACjE;IACH,CAAC,CAAA,CAAC,CACH,CAAC;IAEF,KAAK;SACF,aAAa,EAAE;SACf,IAAI,EAAE;SACN,MAAM,CAAC,wDAAwD,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC,CAAA,CAAC;AAlCW,QAAA,GAAG,OAkCd"}
@@ -0,0 +1,2 @@
1
+ import { CommandModule } from 'yargs';
2
+ export declare const hosting: CommandModule<unknown, unknown>;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hosting = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const register_pilet_1 = require("./register-pilet");
6
+ exports.hosting = {
7
+ command: 'hosting',
8
+ describe: 'Commands related to Mosaic Hosting.',
9
+ builder: (yargs) => yargs
10
+ .command('pilet', 'Pilet related actions', piletCommands)
11
+ .demandCommand(),
12
+ handler: (_args) => {
13
+ console.log('Please pick a sub command related to hosting.');
14
+ },
15
+ };
16
+ const piletCommands = {
17
+ builder: (yargs) => yargs
18
+ .command('register', 'Register a pilet in Mosaic Micro-Frontend Service.', piletRegister)
19
+ .demandCommand(),
20
+ handler: () => {
21
+ console.log('Please pick an action related to hosting pilet command.');
22
+ },
23
+ };
24
+ const piletRegister = {
25
+ builder: (yargs) => {
26
+ return yargs
27
+ .option('serviceId', {
28
+ describe: 'Service ID the pilet should be registered to',
29
+ alias: 'i',
30
+ string: true,
31
+ })
32
+ .option('mosaicHostingClientId', {
33
+ describe: 'Client ID to authenticate',
34
+ alias: 'c',
35
+ string: true,
36
+ })
37
+ .option('mosaicHostingClientSecret', {
38
+ describe: 'Client Secret to authenticate',
39
+ alias: 's',
40
+ string: true,
41
+ })
42
+ .option('tenantId', {
43
+ describe: 'Tenant ID',
44
+ alias: 't',
45
+ string: true,
46
+ })
47
+ .option('environmentId', {
48
+ describe: 'Environment ID',
49
+ alias: 'e',
50
+ string: true,
51
+ })
52
+ .option('piletArtifactPath', {
53
+ describe: 'Pilet Artifact Path',
54
+ alias: 'p',
55
+ string: true,
56
+ })
57
+ .option('idServiceAuthBaseURL', {
58
+ describe: 'ID Service Authentication Endpoint Base URL',
59
+ alias: 'a',
60
+ string: true,
61
+ })
62
+ .option('microFrontendServiceBaseURL', {
63
+ describe: 'Micro Frontend Service Base URL',
64
+ alias: 'm',
65
+ string: true,
66
+ })
67
+ .option('overrideRegistration', {
68
+ describe: 'Override registration',
69
+ alias: 'm',
70
+ default: false,
71
+ boolean: true,
72
+ });
73
+ },
74
+ handler: (args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
75
+ // Validate arguments and read any arguments that are coming from environment variables.
76
+ const validatedArgs = (0, register_pilet_1.validateArgs)(args);
77
+ yield (0, register_pilet_1.registerPilet)(validatedArgs);
78
+ }),
79
+ };
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/hosting/index.ts"],"names":[],"mappings":";;;;AACA,qDAA+D;AAGlD,QAAA,OAAO,GAAoC;IACtD,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,qCAAqC;IAC/C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,OAAO,EAAE,uBAAuB,EAAE,aAAa,CAAC;SACxD,aAAa,EAAE;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;CACF,CAAC;AAEF,MAAM,aAAa,GAAoC;IACrD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CACN,UAAU,EACV,oDAAoD,EACpD,aAAa,CACd;SACA,aAAa,EAAE;IACpB,OAAO,EAAE,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACzE,CAAC;CACF,CAAC;AAEF,MAAM,aAAa,GAAoD;IACrE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,KAAK;aACT,MAAM,CAAC,WAAW,EAAE;YACnB,QAAQ,EAAE,8CAA8C;YACxD,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,uBAAuB,EAAE;YAC/B,QAAQ,EAAE,2BAA2B;YACrC,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,2BAA2B,EAAE;YACnC,QAAQ,EAAE,+BAA+B;YACzC,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,UAAU,EAAE;YAClB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,eAAe,EAAE;YACvB,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,mBAAmB,EAAE;YAC3B,QAAQ,EAAE,qBAAqB;YAC/B,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,sBAAsB,EAAE;YAC9B,QAAQ,EAAE,6CAA6C;YACvD,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,6BAA6B,EAAE;YACrC,QAAQ,EAAE,iCAAiC;YAC3C,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,sBAAsB,EAAE;YAC9B,QAAQ,EAAE,uBAAuB;YACjC,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,CAAO,IAAI,EAAE,EAAE;QACtB,wFAAwF;QACxF,MAAM,aAAa,GAAG,IAAA,6BAAY,EAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAA,8BAAa,EAAC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAA;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Options for Register Pilet action
3
+ */
4
+ export interface GetRegisterPiletOptions {
5
+ serviceId?: string;
6
+ mosaicHostingClientId?: string;
7
+ mosaicHostingClientSecret?: string;
8
+ tenantId?: string;
9
+ environmentId?: string;
10
+ piletArtifactPath?: string;
11
+ idServiceAuthBaseURL?: string;
12
+ microFrontendServiceBaseURL?: string;
13
+ overrideRegistration?: boolean;
14
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=register-pilet-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-pilet-options.js","sourceRoot":"","sources":["../../../src/commands/hosting/register-pilet-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { GetRegisterPiletOptions } from './register-pilet-options';
2
+ export declare const registerPilet: (args: Required<GetRegisterPiletOptions>) => Promise<void>;
3
+ /**
4
+ * Method that validates the arguments.
5
+ * We're using this to allow both input arguments and environment variables.
6
+ *
7
+ * @param args
8
+ * @returns
9
+ */
10
+ export declare const validateArgs: (args: GetRegisterPiletOptions) => Required<GetRegisterPiletOptions>;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateArgs = exports.registerPilet = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const mosaic_id_link_be_1 = require("@axinom/mosaic-id-link-be");
6
+ const mosaic_service_common_1 = require("@axinom/mosaic-service-common");
7
+ const axios_1 = require("axios");
8
+ const FormData = require("form-data");
9
+ const fs_1 = require("fs");
10
+ const path = require("path");
11
+ const registerPilet = (args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
12
+ var _a;
13
+ const serviceAccountToken = yield (0, mosaic_id_link_be_1.getServiceAccountToken)(args.idServiceAuthBaseURL, args.mosaicHostingClientId, args.mosaicHostingClientSecret);
14
+ const data = new FormData();
15
+ const config = {
16
+ maxBodyLength: 52428890,
17
+ headers: Object.assign({ Authorization: `Bearer ${serviceAccountToken.accessToken}` }, data.getHeaders()),
18
+ };
19
+ try {
20
+ const artifactToPublish = findArtifactToPublish(args.piletArtifactPath);
21
+ if (artifactToPublish) {
22
+ data.append('', (0, fs_1.createReadStream)(artifactToPublish));
23
+ }
24
+ else {
25
+ throw new Error(`No Pilet Artifact found at ${args.piletArtifactPath}.`);
26
+ }
27
+ }
28
+ catch (error) {
29
+ throw new Error(`Error occurred while trying to read the Pilet Artifact at ${args.piletArtifactPath}.`);
30
+ }
31
+ try {
32
+ const result = yield axios_1.default.post(`${args.microFrontendServiceBaseURL}/v1/pilets/${args.tenantId}/${args.environmentId}/${args.serviceId}/register?override=${args.overrideRegistration}`, data, config);
33
+ console.log('Registration of Pilet complete.');
34
+ console.log(result.data);
35
+ }
36
+ catch (error) {
37
+ console.log('Registration of Pilet failed.', (_a = error.response) === null || _a === void 0 ? void 0 : _a.data);
38
+ }
39
+ });
40
+ exports.registerPilet = registerPilet;
41
+ /**
42
+ * Method that validates the arguments.
43
+ * We're using this to allow both input arguments and environment variables.
44
+ *
45
+ * @param args
46
+ * @returns
47
+ */
48
+ const validateArgs = (args) => {
49
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
50
+ const idServiceAuthBaseURL = (_a = args.idServiceAuthBaseURL) !== null && _a !== void 0 ? _a : process.env.ID_SERVICE_AUTH_BASE_URL;
51
+ const clientId = (_b = args.mosaicHostingClientId) !== null && _b !== void 0 ? _b : process.env.MOSAIC_HOSTING_CLIENT_ID;
52
+ const clientSecret = (_c = args.mosaicHostingClientSecret) !== null && _c !== void 0 ? _c : process.env.MOSAIC_HOSTING_CLIENT_SECRET;
53
+ const tenantId = (_d = args.tenantId) !== null && _d !== void 0 ? _d : process.env.TENANT_ID;
54
+ const environmentId = (_e = args.environmentId) !== null && _e !== void 0 ? _e : process.env.ENVIRONMENT_ID;
55
+ const serviceId = (_f = args.serviceId) !== null && _f !== void 0 ? _f : process.env.SERVICE_ID;
56
+ const piletArtifactPath = (_g = args.piletArtifactPath) !== null && _g !== void 0 ? _g : process.env.PILET_PATH;
57
+ const microFrontendServiceBaseURL = (_h = args.microFrontendServiceBaseURL) !== null && _h !== void 0 ? _h : process.env.MICRO_FRONTEND_SERVICE_BASE_URL;
58
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(idServiceAuthBaseURL)) {
59
+ throw new Error('idServiceAuthBaseURL is required.');
60
+ }
61
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(clientId)) {
62
+ throw new Error('clientId is required.');
63
+ }
64
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(clientSecret)) {
65
+ throw new Error('clientSecret is required.');
66
+ }
67
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(tenantId)) {
68
+ throw new Error('tenantId is required.');
69
+ }
70
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(environmentId)) {
71
+ throw new Error('environmentId is required,');
72
+ }
73
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(serviceId)) {
74
+ throw new Error('serviceId is required.');
75
+ }
76
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(piletArtifactPath)) {
77
+ throw new Error('piletArtifactPath is required,');
78
+ }
79
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(microFrontendServiceBaseURL)) {
80
+ throw new Error('microFrontendServiceBaseURL is required.');
81
+ }
82
+ return {
83
+ idServiceAuthBaseURL,
84
+ mosaicHostingClientId: clientId,
85
+ mosaicHostingClientSecret: clientSecret,
86
+ tenantId,
87
+ environmentId,
88
+ serviceId,
89
+ piletArtifactPath,
90
+ microFrontendServiceBaseURL,
91
+ overrideRegistration: (_j = args.overrideRegistration) !== null && _j !== void 0 ? _j : false,
92
+ };
93
+ };
94
+ exports.validateArgs = validateArgs;
95
+ const findArtifactToPublish = (piletPath) => {
96
+ if (!(0, fs_1.existsSync)(piletPath)) {
97
+ throw new Error(`No directory found at ${piletPath}`);
98
+ }
99
+ const files = (0, fs_1.readdirSync)(piletPath);
100
+ const tgzFiles = [];
101
+ for (let i = 0; i < files.length; i++) {
102
+ const filename = path.join(piletPath, files[i]);
103
+ const stat = (0, fs_1.lstatSync)(filename);
104
+ if (!stat.isDirectory() && filename.endsWith('.tgz')) {
105
+ tgzFiles.push(filename);
106
+ }
107
+ }
108
+ if (tgzFiles.length > 1) {
109
+ throw new Error(`Found more than one .tgz files in the folder ${piletPath}. Please make sure only one .tgz file exists`);
110
+ }
111
+ if (tgzFiles.length === 0) {
112
+ throw new Error(`'No .tgz files found at ${piletPath}.`);
113
+ }
114
+ return tgzFiles[0];
115
+ };
116
+ //# sourceMappingURL=register-pilet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-pilet.js","sourceRoot":"","sources":["../../../src/commands/hosting/register-pilet.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axinom/mosaic-cli",
3
- "version": "0.18.5-rc.1",
3
+ "version": "0.19.0-rc.0",
4
4
  "description": "The Axinom Mosaic CLI",
5
5
  "author": "Axinom",
6
6
  "license": "PROPRIETARY",
@@ -33,16 +33,18 @@
33
33
  "@asyncapi/diff": "^0.4.1",
34
34
  "@asyncapi/modelina": "^1.8.4",
35
35
  "@asyncapi/parser": "^2.0.2",
36
- "@axinom/mosaic-id-link-be": "^0.13.3-rc.1",
37
- "@axinom/mosaic-service-common": "^0.34.0-rc.1",
36
+ "@axinom/mosaic-id-link-be": "^0.13.3-rc.3",
37
+ "@axinom/mosaic-service-common": "^0.34.0-rc.3",
38
38
  "@graphql-inspector/core": "^3.1.2",
39
39
  "@stoplight/spectral": "^5.9.1",
40
+ "axios": "^0.19.2",
40
41
  "chalk": "^4.1.0",
41
42
  "diff": "^5.0.0",
42
43
  "dotenv": "^8.2.0",
43
44
  "endent": "^2.1.0",
44
45
  "envfile": "^6.17.0",
45
46
  "find-nearest-file": "^1.1.0",
47
+ "form-data": "^4.0.0",
46
48
  "glob": "^7.1.6",
47
49
  "graphile-utils": "^4.13.0",
48
50
  "graphql": "^15.4.0",
@@ -65,5 +67,5 @@
65
67
  "publishConfig": {
66
68
  "access": "public"
67
69
  },
68
- "gitHead": "aa98a4a89a48ff7650a40acfec9a5b24c90d9c01"
70
+ "gitHead": "482e74fd7ca0c3cc27879d2a7a6b9a385dec4f08"
69
71
  }
package/src/cli/index.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  } from '../commands/create-extension-config';
7
7
  import { getAccessToken } from '../commands/get-access-token';
8
8
  import { graphqlDiff } from '../commands/graphql-diff';
9
+ import { hosting } from '../commands/hosting';
9
10
  import { msgCodegen } from '../commands/msg-codegen';
10
11
  import { msgDiff } from '../commands/msg-diff';
11
12
  import { pgDump } from '../commands/pg-dump';
@@ -22,7 +23,8 @@ export const run = async (): Promise<void> => {
22
23
  .command(msgCodegen)
23
24
  .command(msgDiff)
24
25
  .command(createExtensionConfigCommand)
25
- .command(graphqlDiff);
26
+ .command(graphqlDiff)
27
+ .command(hosting);
26
28
 
27
29
  //adding cli extensions:
28
30
  await Promise.all(
@@ -0,0 +1,86 @@
1
+ import { CommandModule } from 'yargs';
2
+ import { registerPilet, validateArgs } from './register-pilet';
3
+ import { GetRegisterPiletOptions } from './register-pilet-options';
4
+
5
+ export const hosting: CommandModule<unknown, unknown> = {
6
+ command: 'hosting',
7
+ describe: 'Commands related to Mosaic Hosting.',
8
+ builder: (yargs) =>
9
+ yargs
10
+ .command('pilet', 'Pilet related actions', piletCommands)
11
+ .demandCommand(),
12
+ handler: (_args) => {
13
+ console.log('Please pick a sub command related to hosting.');
14
+ },
15
+ };
16
+
17
+ const piletCommands: CommandModule<unknown, unknown> = {
18
+ builder: (yargs) =>
19
+ yargs
20
+ .command(
21
+ 'register',
22
+ 'Register a pilet in Mosaic Micro-Frontend Service.',
23
+ piletRegister,
24
+ )
25
+ .demandCommand(),
26
+ handler: () => {
27
+ console.log('Please pick an action related to hosting pilet command.');
28
+ },
29
+ };
30
+
31
+ const piletRegister: CommandModule<unknown, GetRegisterPiletOptions> = {
32
+ builder: (yargs) => {
33
+ return yargs
34
+ .option('serviceId', {
35
+ describe: 'Service ID the pilet should be registered to',
36
+ alias: 'i',
37
+ string: true,
38
+ })
39
+ .option('mosaicHostingClientId', {
40
+ describe: 'Client ID to authenticate',
41
+ alias: 'c',
42
+ string: true,
43
+ })
44
+ .option('mosaicHostingClientSecret', {
45
+ describe: 'Client Secret to authenticate',
46
+ alias: 's',
47
+ string: true,
48
+ })
49
+ .option('tenantId', {
50
+ describe: 'Tenant ID',
51
+ alias: 't',
52
+ string: true,
53
+ })
54
+ .option('environmentId', {
55
+ describe: 'Environment ID',
56
+ alias: 'e',
57
+ string: true,
58
+ })
59
+ .option('piletArtifactPath', {
60
+ describe: 'Pilet Artifact Path',
61
+ alias: 'p',
62
+ string: true,
63
+ })
64
+ .option('idServiceAuthBaseURL', {
65
+ describe: 'ID Service Authentication Endpoint Base URL',
66
+ alias: 'a',
67
+ string: true,
68
+ })
69
+ .option('microFrontendServiceBaseURL', {
70
+ describe: 'Micro Frontend Service Base URL',
71
+ alias: 'm',
72
+ string: true,
73
+ })
74
+ .option('overrideRegistration', {
75
+ describe: 'Override registration',
76
+ alias: 'm',
77
+ default: false,
78
+ boolean: true,
79
+ });
80
+ },
81
+ handler: async (args) => {
82
+ // Validate arguments and read any arguments that are coming from environment variables.
83
+ const validatedArgs = validateArgs(args);
84
+ await registerPilet(validatedArgs);
85
+ },
86
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Options for Register Pilet action
3
+ */
4
+ export interface GetRegisterPiletOptions {
5
+ serviceId?: string;
6
+ mosaicHostingClientId?: string;
7
+ mosaicHostingClientSecret?: string;
8
+ tenantId?: string;
9
+ environmentId?: string;
10
+ piletArtifactPath?: string;
11
+ idServiceAuthBaseURL?: string;
12
+ microFrontendServiceBaseURL?: string;
13
+ overrideRegistration?: boolean;
14
+ }
@@ -0,0 +1,146 @@
1
+ import { getServiceAccountToken } from '@axinom/mosaic-id-link-be';
2
+ import { isNullOrWhitespace } from '@axinom/mosaic-service-common';
3
+ import axios, { AxiosError } from 'axios';
4
+ import * as FormData from 'form-data';
5
+ import { createReadStream, existsSync, lstatSync, readdirSync } from 'fs';
6
+ import * as path from 'path';
7
+ import { GetRegisterPiletOptions } from './register-pilet-options';
8
+
9
+ export const registerPilet = async (
10
+ args: Required<GetRegisterPiletOptions>,
11
+ ): Promise<void> => {
12
+ const serviceAccountToken = await getServiceAccountToken(
13
+ args.idServiceAuthBaseURL,
14
+ args.mosaicHostingClientId,
15
+ args.mosaicHostingClientSecret,
16
+ );
17
+
18
+ const data = new FormData();
19
+
20
+ const config = {
21
+ maxBodyLength: 52428890, // 50MB
22
+ headers: {
23
+ Authorization: `Bearer ${serviceAccountToken.accessToken}`,
24
+ ...data.getHeaders(),
25
+ },
26
+ };
27
+
28
+ try {
29
+ const artifactToPublish = findArtifactToPublish(args.piletArtifactPath);
30
+ if (artifactToPublish) {
31
+ data.append('', createReadStream(artifactToPublish));
32
+ } else {
33
+ throw new Error(`No Pilet Artifact found at ${args.piletArtifactPath}.`);
34
+ }
35
+ } catch (error) {
36
+ throw new Error(
37
+ `Error occurred while trying to read the Pilet Artifact at ${args.piletArtifactPath}.`,
38
+ );
39
+ }
40
+
41
+ try {
42
+ const result = await axios.post(
43
+ `${args.microFrontendServiceBaseURL}/v1/pilets/${args.tenantId}/${args.environmentId}/${args.serviceId}/register?override=${args.overrideRegistration}`,
44
+ data,
45
+ config,
46
+ );
47
+
48
+ console.log('Registration of Pilet complete.');
49
+ console.log(result.data);
50
+ } catch (error) {
51
+ console.log(
52
+ 'Registration of Pilet failed.',
53
+ (error as AxiosError).response?.data,
54
+ );
55
+ }
56
+ };
57
+
58
+ /**
59
+ * Method that validates the arguments.
60
+ * We're using this to allow both input arguments and environment variables.
61
+ *
62
+ * @param args
63
+ * @returns
64
+ */
65
+ export const validateArgs = (
66
+ args: GetRegisterPiletOptions,
67
+ ): Required<GetRegisterPiletOptions> => {
68
+ const idServiceAuthBaseURL =
69
+ args.idServiceAuthBaseURL ?? process.env.ID_SERVICE_AUTH_BASE_URL;
70
+ const clientId =
71
+ args.mosaicHostingClientId ?? process.env.MOSAIC_HOSTING_CLIENT_ID;
72
+ const clientSecret =
73
+ args.mosaicHostingClientSecret ?? process.env.MOSAIC_HOSTING_CLIENT_SECRET;
74
+ const tenantId = args.tenantId ?? process.env.TENANT_ID;
75
+ const environmentId = args.environmentId ?? process.env.ENVIRONMENT_ID;
76
+ const serviceId = args.serviceId ?? process.env.SERVICE_ID;
77
+ const piletArtifactPath = args.piletArtifactPath ?? process.env.PILET_PATH;
78
+ const microFrontendServiceBaseURL =
79
+ args.microFrontendServiceBaseURL ??
80
+ process.env.MICRO_FRONTEND_SERVICE_BASE_URL;
81
+
82
+ if (isNullOrWhitespace(idServiceAuthBaseURL)) {
83
+ throw new Error('idServiceAuthBaseURL is required.');
84
+ }
85
+ if (isNullOrWhitespace(clientId)) {
86
+ throw new Error('clientId is required.');
87
+ }
88
+ if (isNullOrWhitespace(clientSecret)) {
89
+ throw new Error('clientSecret is required.');
90
+ }
91
+ if (isNullOrWhitespace(tenantId)) {
92
+ throw new Error('tenantId is required.');
93
+ }
94
+ if (isNullOrWhitespace(environmentId)) {
95
+ throw new Error('environmentId is required,');
96
+ }
97
+ if (isNullOrWhitespace(serviceId)) {
98
+ throw new Error('serviceId is required.');
99
+ }
100
+ if (isNullOrWhitespace(piletArtifactPath)) {
101
+ throw new Error('piletArtifactPath is required,');
102
+ }
103
+ if (isNullOrWhitespace(microFrontendServiceBaseURL)) {
104
+ throw new Error('microFrontendServiceBaseURL is required.');
105
+ }
106
+
107
+ return {
108
+ idServiceAuthBaseURL,
109
+ mosaicHostingClientId: clientId,
110
+ mosaicHostingClientSecret: clientSecret,
111
+ tenantId,
112
+ environmentId,
113
+ serviceId,
114
+ piletArtifactPath,
115
+ microFrontendServiceBaseURL,
116
+ overrideRegistration: args.overrideRegistration ?? false,
117
+ };
118
+ };
119
+
120
+ const findArtifactToPublish = (piletPath: string): string | undefined => {
121
+ if (!existsSync(piletPath)) {
122
+ throw new Error(`No directory found at ${piletPath}`);
123
+ }
124
+
125
+ const files = readdirSync(piletPath);
126
+ const tgzFiles: string[] = [];
127
+
128
+ for (let i = 0; i < files.length; i++) {
129
+ const filename = path.join(piletPath, files[i]);
130
+ const stat = lstatSync(filename);
131
+ if (!stat.isDirectory() && filename.endsWith('.tgz')) {
132
+ tgzFiles.push(filename);
133
+ }
134
+ }
135
+
136
+ if (tgzFiles.length > 1) {
137
+ throw new Error(
138
+ `Found more than one .tgz files in the folder ${piletPath}. Please make sure only one .tgz file exists`,
139
+ );
140
+ }
141
+ if (tgzFiles.length === 0) {
142
+ throw new Error(`'No .tgz files found at ${piletPath}.`);
143
+ }
144
+
145
+ return tgzFiles[0];
146
+ };