@c8y/toolkit 1021.55.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.
- package/README.md +53 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/deploy.d.ts +2 -0
- package/dist/commands/deploy.js +30 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/client.d.ts +11 -0
- package/dist/utils/client.js +33 -0
- package/dist/utils/client.js.map +1 -0
- package/dist/utils/deploy.d.ts +31 -0
- package/dist/utils/deploy.js +397 -0
- package/dist/utils/deploy.js.map +1 -0
- package/dist/utils/deploy.model.d.ts +21 -0
- package/dist/utils/deploy.model.js +3 -0
- package/dist/utils/deploy.model.js.map +1 -0
- package/dist/utils/helpers.d.ts +25 -0
- package/dist/utils/helpers.js +44 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# @c8y/toolkit
|
|
2
|
+
|
|
3
|
+
`@c8y/toolkit` is a collection of CLI tools to interact with an instance of Cumulocity. It is meant to provide its functionality without depending on a specific framework, like the [`@c8y/devkit`](https://www.npmjs.com/package/@c8y/devkit) package does regarding angular.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
The toolkit cli currently provides functionality to deploy applications/extensions to Cumulocity.
|
|
8
|
+
|
|
9
|
+
You can also list all available commands by executing `npx @c8y/toolkit -h`.
|
|
10
|
+
Which should result in an output like:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Usage: @c8y/toolkit [options] [command]
|
|
14
|
+
|
|
15
|
+
Toolkit for Cumulocity applications, allows to e.g. deploy an application to an instance of Cumulocity.
|
|
16
|
+
|
|
17
|
+
Options:
|
|
18
|
+
-V, --version output the version number
|
|
19
|
+
-h, --help display help for command
|
|
20
|
+
|
|
21
|
+
Commands:
|
|
22
|
+
deploy [options] <zipFile> Deploy application to Cumulocity
|
|
23
|
+
help [command] display help for command
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Deploy
|
|
27
|
+
|
|
28
|
+
This cli provides multiple options while deploying and application/package.
|
|
29
|
+
To get all of the options available simply execute `npx @c8y/toolkit deploy -h`.
|
|
30
|
+
This should give you and output like:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Usage: @c8y/toolkit deploy [options] <zipFile>
|
|
34
|
+
|
|
35
|
+
Deploy application to Cumulocity
|
|
36
|
+
|
|
37
|
+
Arguments:
|
|
38
|
+
zipFile Path to zip file
|
|
39
|
+
|
|
40
|
+
Options:
|
|
41
|
+
-u, --url <URL> The url of the remote instance.
|
|
42
|
+
-U, --user <user> Username
|
|
43
|
+
-P, --password <password> Password
|
|
44
|
+
-t, --tenant <tenant> Tenant
|
|
45
|
+
--tags <tags> Comma separated list of tags to apply to the uploaded version
|
|
46
|
+
--rolling-tags Will remove tags that are already in use by previous version and adds them to the newly uploaded version
|
|
47
|
+
--add-web-sdk-stable-tag Add web SDK stable tag
|
|
48
|
+
--delete-existing-tags Delete existing tags
|
|
49
|
+
-h, --help display help for command
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
To e.g. deploy a previously built zip file of a plugin package, you could e.g. execute:
|
|
53
|
+
`npx @c8y/toolkit deploy -u "https://demos.cumulocity.com" -U "dummyUser" -P "dummyPassword" -t "t123456" --tags "latest" --rolling-tags --add-web-sdk-stable-tag ./widget-plugin.zip`
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const deploy_1 = require("./commands/deploy");
|
|
6
|
+
const package_json_1 = require("./../package.json");
|
|
7
|
+
const program = new commander_1.Command();
|
|
8
|
+
program.name(package_json_1.name).description(package_json_1.description).version(package_json_1.version);
|
|
9
|
+
(0, deploy_1.registerDeployCommand)(program);
|
|
10
|
+
program.parseAsync(process.argv);
|
|
11
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,8CAA0D;AAC1D,oDAA+D;AAE/D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,IAAI,CAAC,mBAAI,CAAC,CAAC,WAAW,CAAC,0BAAW,CAAC,CAAC,OAAO,CAAC,sBAAO,CAAC,CAAC;AAC7D,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDeployCommand = registerDeployCommand;
|
|
4
|
+
const deploy_1 = require("../utils/deploy");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
function registerDeployCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('deploy')
|
|
9
|
+
.description('Deploy application to Cumulocity')
|
|
10
|
+
.argument('<zipFile>', 'Path to zip file')
|
|
11
|
+
.requiredOption('-u, --url <URL>', constants_1.OPTIONS_CONSTANTS['TXT.URL'])
|
|
12
|
+
.requiredOption('-U, --user <user>', constants_1.OPTIONS_CONSTANTS['TXT.USERNAME'])
|
|
13
|
+
.requiredOption('-P, --password <password>', constants_1.OPTIONS_CONSTANTS['TXT.PASSWORD'])
|
|
14
|
+
.option('-t, --tenant <tenant>', constants_1.OPTIONS_CONSTANTS['TXT.TENANT'])
|
|
15
|
+
.option('--tags <tags>', 'Comma separated list of tags to apply to the uploaded version')
|
|
16
|
+
.option('--rolling-tags', 'Will remove tags that are already in use by previous version and adds them to the newly uploaded version')
|
|
17
|
+
.option('--add-web-sdk-stable-tag', 'Add web SDK stable tag')
|
|
18
|
+
.option('--delete-existing-tags', 'Delete existing tags')
|
|
19
|
+
.action(async (zipPath, options) => {
|
|
20
|
+
try {
|
|
21
|
+
await (0, deploy_1.deployZipFile)(zipPath, options);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
console.error('Failed to deploy application');
|
|
25
|
+
console.error(e);
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":";;AAIA,sDAyBC;AA5BD,4CAAgD;AAChD,4CAAiD;AAEjD,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;SACzC,cAAc,CAAC,iBAAiB,EAAE,6BAAiB,CAAC,SAAS,CAAC,CAAC;SAC/D,cAAc,CAAC,mBAAmB,EAAE,6BAAiB,CAAC,cAAc,CAAC,CAAC;SACtE,cAAc,CAAC,2BAA2B,EAAE,6BAAiB,CAAC,cAAc,CAAC,CAAC;SAC9E,MAAM,CAAC,uBAAuB,EAAE,6BAAiB,CAAC,YAAY,CAAC,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,+DAA+D,CAAC;SACxF,MAAM,CACL,gBAAgB,EAChB,0GAA0G,CAC3G;SACA,MAAM,CAAC,0BAA0B,EAAE,wBAAwB,CAAC;SAC5D,MAAM,CAAC,wBAAwB,EAAE,sBAAsB,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAO,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,IAAA,sBAAa,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const OPTIONS_CONSTANTS: {
|
|
2
|
+
readonly 'TXT.URL': "The url of the remote instance.";
|
|
3
|
+
readonly 'TXT.TENANT': "Tenant";
|
|
4
|
+
readonly 'TXT.USERNAME': "Username";
|
|
5
|
+
readonly 'TXT.PASSWORD': "Password";
|
|
6
|
+
readonly 'TXT.NOT_PACKAGE_WARNING': "The provided tag is redundant since the application is not a package.";
|
|
7
|
+
readonly 'TXT.APP_DEPLOYED': (ctxPath: any) => string;
|
|
8
|
+
readonly 'PATH.BUILT_MANIFEST_FILE': "cumulocity.json";
|
|
9
|
+
readonly 'TXT.INVALID_CREDENTIALS_BASEURL': (baseUrl: any) => string;
|
|
10
|
+
readonly 'TXT.APP_UPLOADING': (bytes: any) => string;
|
|
11
|
+
readonly 'TXT.APP_UPLOAD_ERROR': "File upload failed:";
|
|
12
|
+
readonly 'TXT.APP_CREATING': "Creating application...";
|
|
13
|
+
readonly 'TXT.APP_CREATE_FAILED': "Create application failed:";
|
|
14
|
+
readonly 'TXT.APP_FETCHING': "Fetching application list...";
|
|
15
|
+
readonly 'TXT.APP_FETCHING_FAILED': "Cannot fetch application list:";
|
|
16
|
+
readonly 'TXT.APP_ACTIVATING': (id: any) => string;
|
|
17
|
+
readonly 'TXT.APP_ACTIVATING_FAILED': (contextPath: any) => string;
|
|
18
|
+
readonly 'TXT.DELETE_EXISTING_TAG_WARNING': "Deleting the existing tag.";
|
|
19
|
+
readonly 'TXT.USER_MISSES_PERMISSION_TO_DEPLOY': "You are missing the required permissions to deploy an application on your tenant.";
|
|
20
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OPTIONS_CONSTANTS = void 0;
|
|
4
|
+
exports.OPTIONS_CONSTANTS = {
|
|
5
|
+
'TXT.URL': 'The url of the remote instance.',
|
|
6
|
+
'TXT.TENANT': 'Tenant',
|
|
7
|
+
'TXT.USERNAME': 'Username',
|
|
8
|
+
'TXT.PASSWORD': 'Password',
|
|
9
|
+
'TXT.NOT_PACKAGE_WARNING': 'The provided tag is redundant since the application is not a package.',
|
|
10
|
+
'TXT.APP_DEPLOYED': (ctxPath) => `Application ${ctxPath} deployed.`,
|
|
11
|
+
'PATH.BUILT_MANIFEST_FILE': 'cumulocity.json',
|
|
12
|
+
'TXT.INVALID_CREDENTIALS_BASEURL': (baseUrl) => `Failed to connect to ${baseUrl}. Invalid credentials provided or tenant not reachable.`,
|
|
13
|
+
'TXT.APP_UPLOADING': (bytes) => `Uploading application zip with ${bytes} bytes...`,
|
|
14
|
+
'TXT.APP_UPLOAD_ERROR': 'File upload failed:',
|
|
15
|
+
'TXT.APP_CREATING': 'Creating application...',
|
|
16
|
+
'TXT.APP_CREATE_FAILED': 'Create application failed:',
|
|
17
|
+
'TXT.APP_FETCHING': 'Fetching application list...',
|
|
18
|
+
'TXT.APP_FETCHING_FAILED': 'Cannot fetch application list:',
|
|
19
|
+
'TXT.APP_ACTIVATING': (id) => `Activating binary version id ${id}...`,
|
|
20
|
+
'TXT.APP_ACTIVATING_FAILED': (contextPath) => `Cannot activate latest version for application ${contextPath}:`,
|
|
21
|
+
'TXT.DELETE_EXISTING_TAG_WARNING': 'Deleting the existing tag.',
|
|
22
|
+
'TXT.USER_MISSES_PERMISSION_TO_DEPLOY': 'You are missing the required permissions to deploy an application on your tenant.'
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,iBAAiB,GAAG;IAC/B,SAAS,EAAE,iCAAiC;IAC5C,YAAY,EAAE,QAAQ;IACtB,cAAc,EAAE,UAAU;IAC1B,cAAc,EAAE,UAAU;IAC1B,yBAAyB,EACvB,uEAAuE;IACzE,kBAAkB,EAAE,CAAC,OAAY,EAAE,EAAE,CAAC,eAAe,OAAO,YAAY;IACxE,0BAA0B,EAAE,iBAAiB;IAC7C,iCAAiC,EAAE,CAAC,OAAY,EAAE,EAAE,CAClD,wBAAwB,OAAO,yDAAyD;IAC1F,mBAAmB,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,kCAAkC,KAAK,WAAW;IACvF,sBAAsB,EAAE,qBAAqB;IAC7C,kBAAkB,EAAE,yBAAyB;IAC7C,uBAAuB,EAAE,4BAA4B;IACrD,kBAAkB,EAAE,8BAA8B;IAClD,yBAAyB,EAAE,gCAAgC;IAC3D,oBAAoB,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,gCAAgC,EAAE,KAAK;IAC1E,2BAA2B,EAAE,CAAC,WAAgB,EAAE,EAAE,CAChD,kDAAkD,WAAW,GAAG;IAClE,iCAAiC,EAAE,4BAA4B;IAC/D,sCAAsC,EACpC,mFAAmF;CAC7E,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './utils';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./utils"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Client, ICredentials } from '@c8y/client';
|
|
2
|
+
/**
|
|
3
|
+
* Creates client class instance for communicating with server (authentication, application upload).
|
|
4
|
+
*
|
|
5
|
+
* @param options - Authorization options.
|
|
6
|
+
* @returns A Promise that resolves to the created client.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createClient({ user, password, url: baseUrl, tenant }: ICredentials & {
|
|
9
|
+
url: string;
|
|
10
|
+
}): Promise<Client>;
|
|
11
|
+
export declare function ensureUserHasRequiredPermissions(client: Client): Promise<void>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createClient = createClient;
|
|
4
|
+
exports.ensureUserHasRequiredPermissions = ensureUserHasRequiredPermissions;
|
|
5
|
+
const client_1 = require("@c8y/client");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
/**
|
|
8
|
+
* Creates client class instance for communicating with server (authentication, application upload).
|
|
9
|
+
*
|
|
10
|
+
* @param options - Authorization options.
|
|
11
|
+
* @returns A Promise that resolves to the created client.
|
|
12
|
+
*/
|
|
13
|
+
async function createClient({ user, password, url: baseUrl, tenant }) {
|
|
14
|
+
const basicAuth = {
|
|
15
|
+
user,
|
|
16
|
+
password,
|
|
17
|
+
tenant
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
return await client_1.Client.authenticate(basicAuth, baseUrl);
|
|
21
|
+
}
|
|
22
|
+
catch (ex) {
|
|
23
|
+
console.debug(ex);
|
|
24
|
+
throw new Error(constants_1.OPTIONS_CONSTANTS['TXT.INVALID_CREDENTIALS_BASEURL'](basicAuth.baseUrl));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function ensureUserHasRequiredPermissions(client) {
|
|
28
|
+
const { data: currentUser } = await client.user.current();
|
|
29
|
+
if (!client.user.hasRole(currentUser, 'ROLE_APPLICATION_MANAGEMENT_ADMIN')) {
|
|
30
|
+
throw new Error(constants_1.OPTIONS_CONSTANTS['TXT.USER_MISSES_PERMISSION_TO_DEPLOY']);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/utils/client.ts"],"names":[],"mappings":";;AASA,oCAiBC;AAED,4EAKC;AAjCD,wCAAmD;AACnD,4CAAiD;AAEjD;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,GAAG,EAAE,OAAO,EACZ,MAAM,EACyB;IAC/B,MAAM,SAAS,GAAiB;QAC9B,IAAI;QACJ,QAAQ;QACR,MAAM;KACP,CAAC;IACF,IAAI,CAAC;QACH,OAAO,MAAM,eAAM,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,6BAAiB,CAAC,iCAAiC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,gCAAgC,CAAC,MAAc;IACnE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,mCAAmC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,6BAAiB,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ReadStream } from 'fs';
|
|
2
|
+
import { DeploymentOptions, ManifestDetails } from './deploy.model';
|
|
3
|
+
export declare function deployZipFile(zipPath: string, options: {
|
|
4
|
+
user: string;
|
|
5
|
+
password: string;
|
|
6
|
+
url: string;
|
|
7
|
+
tenant?: string;
|
|
8
|
+
tags?: string;
|
|
9
|
+
rollingTags?: boolean;
|
|
10
|
+
addWebSdkStableTag?: boolean;
|
|
11
|
+
deleteExistingTags?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Reads zipped file by provided path, extracts application metadata, file metadata and file buffer (raw data).
|
|
15
|
+
*
|
|
16
|
+
* @param path - The path to the zip file.
|
|
17
|
+
* @returns A Promise that resolves to object representing the application.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAppAsZip(path: string): Promise<{
|
|
20
|
+
fileName: string;
|
|
21
|
+
json: ManifestDetails;
|
|
22
|
+
buffer: ReadStream;
|
|
23
|
+
size: number;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Uploads an application to server, make it active and subscribes tenant to this app.
|
|
27
|
+
*
|
|
28
|
+
* @param appToDeploy - The application to deploy.
|
|
29
|
+
* @returns A Promise that resolves when the deployment is complete.
|
|
30
|
+
*/
|
|
31
|
+
export declare function deploy(deployOptions: DeploymentOptions): Promise<void>;
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.deployZipFile = deployZipFile;
|
|
7
|
+
exports.getAppAsZip = getAppAsZip;
|
|
8
|
+
exports.deploy = deploy;
|
|
9
|
+
const client_1 = require("@c8y/client");
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const semver_1 = require("semver");
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const promises_1 = require("fs/promises");
|
|
15
|
+
const helpers_1 = require("./helpers");
|
|
16
|
+
const unzip_stream_1 = require("unzip-stream");
|
|
17
|
+
const path_1 = require("path");
|
|
18
|
+
const utils_1 = require("../utils");
|
|
19
|
+
async function deployZipFile(zipPath, options) {
|
|
20
|
+
const details = await getAppAsZip(zipPath);
|
|
21
|
+
const { user, password, url, tenant, tags, rollingTags, addWebSdkStableTag, deleteExistingTags } = options;
|
|
22
|
+
let client;
|
|
23
|
+
try {
|
|
24
|
+
client = await (0, utils_1.createClient)({ url, user, password, tenant });
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.error(e.message);
|
|
28
|
+
throw e;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
await (0, utils_1.ensureUserHasRequiredPermissions)(client);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.error(e.message);
|
|
35
|
+
throw e;
|
|
36
|
+
}
|
|
37
|
+
console.log('Deploying application...');
|
|
38
|
+
const actualTags = tags ? tags.split(',') : [];
|
|
39
|
+
const { buffer, json, fileName, size } = details;
|
|
40
|
+
await deploy({
|
|
41
|
+
buffer,
|
|
42
|
+
json,
|
|
43
|
+
size,
|
|
44
|
+
client,
|
|
45
|
+
tags: actualTags,
|
|
46
|
+
fileName,
|
|
47
|
+
rollingTags,
|
|
48
|
+
addWebSdkStableTag,
|
|
49
|
+
deleteExistingTags
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reads zipped file by provided path, extracts application metadata, file metadata and file buffer (raw data).
|
|
54
|
+
*
|
|
55
|
+
* @param path - The path to the zip file.
|
|
56
|
+
* @returns A Promise that resolves to object representing the application.
|
|
57
|
+
*/
|
|
58
|
+
async function getAppAsZip(path) {
|
|
59
|
+
const stats = await (0, promises_1.stat)(path);
|
|
60
|
+
const size = stats.size;
|
|
61
|
+
const json = await new Promise((resolve, reject) => {
|
|
62
|
+
const partialCumulocityJSONData = new Array();
|
|
63
|
+
(0, fs_1.createReadStream)(path)
|
|
64
|
+
.pipe((0, unzip_stream_1.Parse)())
|
|
65
|
+
.on('entry', (entry) => {
|
|
66
|
+
const fileName = entry.path;
|
|
67
|
+
const isCumulocity = !!fileName.match(constants_1.OPTIONS_CONSTANTS['PATH.BUILT_MANIFEST_FILE']);
|
|
68
|
+
const macTrash = !!fileName.match(/__MACOSX/);
|
|
69
|
+
const readFile = isCumulocity && !macTrash;
|
|
70
|
+
if (readFile) {
|
|
71
|
+
entry.on('data', (data) => partialCumulocityJSONData.push(data));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
entry.autodrain();
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
.on('close', () => {
|
|
78
|
+
if (partialCumulocityJSONData.length === 0) {
|
|
79
|
+
return reject('No manifest file found in zip file');
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
let partialCumulocityJSONString = '';
|
|
83
|
+
partialCumulocityJSONData.forEach(data => {
|
|
84
|
+
partialCumulocityJSONString += data.toString();
|
|
85
|
+
});
|
|
86
|
+
const fileData = JSON.parse(partialCumulocityJSONString);
|
|
87
|
+
const appDataFromFile = (0, helpers_1.dataToAppData)(fileData);
|
|
88
|
+
const name = (0, helpers_1.getName)(appDataFromFile, (0, path_1.basename)(path));
|
|
89
|
+
const key = (0, helpers_1.getKey)(appDataFromFile, name);
|
|
90
|
+
const contextPath = (0, helpers_1.getContextPath)(appDataFromFile, name);
|
|
91
|
+
Object.assign(appDataFromFile, { name, key, contextPath });
|
|
92
|
+
resolve(appDataFromFile);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
reject(e);
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
.on('error', e => reject(e));
|
|
99
|
+
});
|
|
100
|
+
json.type ??= client_1.ApplicationType.HOSTED;
|
|
101
|
+
return {
|
|
102
|
+
fileName: (0, path_1.basename)(path),
|
|
103
|
+
json,
|
|
104
|
+
buffer: (0, fs_1.createReadStream)(path),
|
|
105
|
+
size
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Uploads an application to server, make it active and subscribes tenant to this app.
|
|
110
|
+
*
|
|
111
|
+
* @param appToDeploy - The application to deploy.
|
|
112
|
+
* @returns A Promise that resolves when the deployment is complete.
|
|
113
|
+
*/
|
|
114
|
+
async function deploy(deployOptions) {
|
|
115
|
+
const { json, buffer, fileName, size } = deployOptions;
|
|
116
|
+
let application = await getApplicationOrCreateIfNotExists(deployOptions, json);
|
|
117
|
+
// removes old version(s) if limit of existing versions is reached
|
|
118
|
+
if (await reduceApplicationVersionsIfRequired(deployOptions, application)) {
|
|
119
|
+
application = await getApplicationOrCreateIfNotExists(deployOptions, json);
|
|
120
|
+
}
|
|
121
|
+
if (application.isPackage && deployOptions.addWebSdkStableTag && json.webSdkVersion) {
|
|
122
|
+
const majorVersion = json.webSdkVersion.split('.')[0];
|
|
123
|
+
const isActuallyANumberRegexp = /^\d+$/;
|
|
124
|
+
if (isActuallyANumberRegexp.test(majorVersion)) {
|
|
125
|
+
const tagToAdd = `${majorVersion}-stable`;
|
|
126
|
+
if (deployOptions.tags) {
|
|
127
|
+
deployOptions.tags.push(tagToAdd);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
deployOptions.tags = [tagToAdd];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.warn(`WebSDK version is not in the correct format. Expected format is <major>.<minor>.<patch>.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const uploadedFile = await uploadApplication(deployOptions, application, buffer, fileName, size);
|
|
138
|
+
// roll tags around after upload of version to ensure time where a certain tag does not exists is minimized
|
|
139
|
+
if (application.isPackage) {
|
|
140
|
+
await rollingTags(deployOptions, application);
|
|
141
|
+
}
|
|
142
|
+
const isFirstVersion = !application.applicationVersions || application.applicationVersions.length === 0;
|
|
143
|
+
const hasLatestTag = deployOptions.tags && deployOptions.tags.indexOf('latest') >= 0;
|
|
144
|
+
// packages will be only activated if tag is set to latest
|
|
145
|
+
// or if this is the first version of the package
|
|
146
|
+
if (application.isPackage && (isFirstVersion || hasLatestTag)) {
|
|
147
|
+
await deployOptions.client.application.update({
|
|
148
|
+
id: application.id,
|
|
149
|
+
activeVersionId: uploadedFile.binaryId
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (!application.isPackage) {
|
|
153
|
+
await activateBinary(deployOptions, uploadedFile, application);
|
|
154
|
+
}
|
|
155
|
+
if (json.type === 'HOSTED' && json.availability === client_1.ApplicationAvailability.MARKET) {
|
|
156
|
+
await subscribeTenantToApp(deployOptions, application);
|
|
157
|
+
console.info(chalk_1.default.blue('Subscribing app to current tenant.'));
|
|
158
|
+
}
|
|
159
|
+
const msg = constants_1.OPTIONS_CONSTANTS['TXT.APP_DEPLOYED'](application.contextPath);
|
|
160
|
+
console.info(chalk_1.default.green.bold(msg));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Removes tags from other versions of app and re-adds them to the new version
|
|
164
|
+
*/
|
|
165
|
+
async function rollingTags(deployOptions, application) {
|
|
166
|
+
if (!deployOptions.tags.length || !deployOptions.rollingTags) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const tags = deployOptions.tags;
|
|
170
|
+
const tagsToRemove = tags.filter(tag => tag !== 'latest');
|
|
171
|
+
for (const appVersion of application.applicationVersions || []) {
|
|
172
|
+
const tagsOfVersion = appVersion.tags || [];
|
|
173
|
+
const tagsToKeepForVersion = tagsOfVersion.filter(tag => !tagsToRemove.includes(tag));
|
|
174
|
+
const tagsToBeRemovedForVersion = tagsOfVersion.filter(tag => tagsToRemove.includes(tag));
|
|
175
|
+
if (tagsToKeepForVersion.length === tagsOfVersion.length) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
console.info(chalk_1.default.yellow(`Removing tags ${tagsToBeRemovedForVersion} from version ${appVersion.version} of application ${application.contextPath}`));
|
|
179
|
+
await deployOptions.client.application.setPackageVersionTag(application, appVersion.version, tagsToKeepForVersion);
|
|
180
|
+
}
|
|
181
|
+
const versionToBeTagged = application.version;
|
|
182
|
+
await deployOptions.client.application.setPackageVersionTag(application, versionToBeTagged, tags);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Picks oldest version of application
|
|
186
|
+
* First tries to find oldest version without a tag
|
|
187
|
+
* If no version without tag is found, it tries to find oldest version without latest tag
|
|
188
|
+
*/
|
|
189
|
+
function identifyApplicationVersionToBeRemoved(application) {
|
|
190
|
+
const appVersions = application.applicationVersions;
|
|
191
|
+
if (!appVersions || appVersions.length === 0) {
|
|
192
|
+
throw Error('No application versions found');
|
|
193
|
+
}
|
|
194
|
+
const versionsWithoutTag = appVersions.filter(version => !version.tags || version.tags.length === 0);
|
|
195
|
+
if (versionsWithoutTag.length > 0) {
|
|
196
|
+
try {
|
|
197
|
+
const sortedVersions = (0, semver_1.sort)(versionsWithoutTag.map(version => version.version));
|
|
198
|
+
return sortedVersions[0];
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
console.warn('Failed to sort versions without tags', e);
|
|
202
|
+
}
|
|
203
|
+
return versionsWithoutTag[0].version;
|
|
204
|
+
}
|
|
205
|
+
const versionsWithoutLatestTag = appVersions.filter(version => !version.tags || !version.tags.includes('latest'));
|
|
206
|
+
if (versionsWithoutLatestTag.length > 0) {
|
|
207
|
+
try {
|
|
208
|
+
const sortedVersions = (0, semver_1.sort)(versionsWithoutLatestTag.map(version => version.version));
|
|
209
|
+
return sortedVersions[0];
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
console.warn('Failed to sort versions without tags', e);
|
|
213
|
+
}
|
|
214
|
+
return versionsWithoutLatestTag[0].version;
|
|
215
|
+
}
|
|
216
|
+
throw Error('No application version to be removed found');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Removes old application versions if the limit of versions is reached.
|
|
220
|
+
* Returns Promise<false> if number of app versions is lower than max versions (20) and app needs no version reduction.
|
|
221
|
+
* Returns Promise<true> if number of app versions equals or is higher than max versions (20) and app versions have been reduced.
|
|
222
|
+
*/
|
|
223
|
+
async function reduceApplicationVersionsIfRequired(deployOptions, application) {
|
|
224
|
+
const maxVersions = 20;
|
|
225
|
+
const numberOfAppVersions = application.applicationVersions?.length || 0;
|
|
226
|
+
if (numberOfAppVersions < maxVersions) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
const appVersionToRemove = identifyApplicationVersionToBeRemoved(application);
|
|
230
|
+
console.info(chalk_1.default.yellow(`Application ${application.contextPath} has reached the maximum ${maxVersions} versions (${numberOfAppVersions}). Removing version "${appVersionToRemove}"`));
|
|
231
|
+
try {
|
|
232
|
+
await deployOptions.client.application.deleteVersionPackage(application, {
|
|
233
|
+
version: appVersionToRemove
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
console.error(`Failed to remove version "${appVersionToRemove}"`, e);
|
|
238
|
+
throw e;
|
|
239
|
+
}
|
|
240
|
+
const { data: refreshedApp } = await deployOptions.client.application.detail(application);
|
|
241
|
+
application = refreshedApp;
|
|
242
|
+
// do this recursively until we have less than 20 versions
|
|
243
|
+
await reduceApplicationVersionsIfRequired(deployOptions, application);
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Retrieves an existing application from server or creates a new one if it doesn't exist.
|
|
248
|
+
*
|
|
249
|
+
* @param application - The application to retrieve or create.
|
|
250
|
+
* @returns A Promise that resolves to the retrieved or created application.
|
|
251
|
+
*/
|
|
252
|
+
async function getApplicationOrCreateIfNotExists(deployOptions, application) {
|
|
253
|
+
const remoteApplication = await getApplication(deployOptions, application);
|
|
254
|
+
return !remoteApplication
|
|
255
|
+
? await createApplication(deployOptions, application)
|
|
256
|
+
: Object.assign(remoteApplication, application);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Uploads an application binary to the server.
|
|
260
|
+
*
|
|
261
|
+
* @param application - The application for which the binary is being uploaded.
|
|
262
|
+
* @param buffer - The binary data to upload.
|
|
263
|
+
* @param filePath - The file path for the binary (optional).
|
|
264
|
+
* @param size - The size of the binary (optional).
|
|
265
|
+
* @returns A Promise that resolves to the uploaded binary data.
|
|
266
|
+
*/
|
|
267
|
+
async function uploadApplication(deployOptions, application, buffer, filePath, size) {
|
|
268
|
+
if (!filePath) {
|
|
269
|
+
filePath = `${application.contextPath}.zip`;
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const msg = constants_1.OPTIONS_CONSTANTS['TXT.APP_UPLOADING'](buffer.length || size);
|
|
273
|
+
const { tags, deleteExistingTags } = deployOptions;
|
|
274
|
+
if (tags && !application.isPackage) {
|
|
275
|
+
console.info(chalk_1.default.yellow(constants_1.OPTIONS_CONSTANTS['TXT.NOT_PACKAGE_WARNING']));
|
|
276
|
+
}
|
|
277
|
+
console.info(chalk_1.default.green(msg));
|
|
278
|
+
if (tags && deleteExistingTags) {
|
|
279
|
+
console.info(chalk_1.default.yellow(constants_1.OPTIONS_CONSTANTS['TXT.DELETE_EXISTING_TAG_WARNING']));
|
|
280
|
+
const appVersions = application.applicationVersions?.filter(version => version.tags && version.tags.some(tag => tags.indexOf(tag) > -1));
|
|
281
|
+
if (appVersions && appVersions?.length > 0) {
|
|
282
|
+
for (const appVersion of appVersions) {
|
|
283
|
+
await deployOptions.client.application.deleteVersionPackage(application, appVersion);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const uploadOverrides = getPackageUploadOverrides(deployOptions, application);
|
|
288
|
+
const { data } = await deployOptions.client.application
|
|
289
|
+
.binary(application)
|
|
290
|
+
.upload(buffer, filePath, uploadOverrides);
|
|
291
|
+
return data;
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
console.debug(err);
|
|
295
|
+
console.error(`${constants_1.OPTIONS_CONSTANTS['TXT.APP_UPLOAD_ERROR']} ${err.res.status}`);
|
|
296
|
+
console.error(JSON.stringify(err.data, null, 2));
|
|
297
|
+
process.exit(9);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Activates a binary for an application.
|
|
302
|
+
*
|
|
303
|
+
* @param uploadedFile - The uploaded binary file.
|
|
304
|
+
* @param application - The application to activate the binary for.
|
|
305
|
+
*/
|
|
306
|
+
async function activateBinary(deployOptions, uploadedFile, application) {
|
|
307
|
+
application.activeVersionId = `${uploadedFile.id}`;
|
|
308
|
+
delete application.type;
|
|
309
|
+
try {
|
|
310
|
+
console.info(chalk_1.default.green(constants_1.OPTIONS_CONSTANTS['TXT.APP_ACTIVATING'](uploadedFile.id)));
|
|
311
|
+
await deployOptions.client.application.update(application);
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
console.debug(err);
|
|
315
|
+
const msg = constants_1.OPTIONS_CONSTANTS['TXT.APP_ACTIVATING_FAILED'](application.contextPath);
|
|
316
|
+
console.error(`${msg} ${err.res.status}`);
|
|
317
|
+
console.error(JSON.stringify(err.data, null, 2));
|
|
318
|
+
process.exit(9);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Subscribes a tenant to an application.
|
|
323
|
+
*
|
|
324
|
+
* @param app - The application to subscribe to.
|
|
325
|
+
*/
|
|
326
|
+
async function subscribeTenantToApp(deployOptions, app) {
|
|
327
|
+
await deployOptions.client.tenant.subscribeApplication({ name: deployOptions.client.core.tenant }, app);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Retrieves an application based on the provided application object.
|
|
331
|
+
*
|
|
332
|
+
* @param application - The application to retrieve.
|
|
333
|
+
* @returns A Promise that resolves to the retrieved application or null if not found.
|
|
334
|
+
*/
|
|
335
|
+
async function getApplication(deployOptions, application) {
|
|
336
|
+
const { tenant } = deployOptions.client.core;
|
|
337
|
+
try {
|
|
338
|
+
console.info(chalk_1.default.green(constants_1.OPTIONS_CONSTANTS['TXT.APP_FETCHING']));
|
|
339
|
+
const { data: applications } = await deployOptions.client.application.listByOwner(tenant, {
|
|
340
|
+
pageSize: 1000
|
|
341
|
+
});
|
|
342
|
+
return applications.find(v => v.owner?.tenant.id === tenant && v.contextPath === application.contextPath);
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
console.debug(err);
|
|
346
|
+
console.error(`${constants_1.OPTIONS_CONSTANTS['TXT.APP_FETCHING_FAILED']} ${err.res.status}`);
|
|
347
|
+
console.error(JSON.stringify(err.data, null, 2));
|
|
348
|
+
process.exit(9);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Creates a new application on the server.
|
|
353
|
+
*
|
|
354
|
+
* @param application - The application to create.
|
|
355
|
+
* @returns A Promise that resolves to the created application.
|
|
356
|
+
*/
|
|
357
|
+
async function createApplication(deployOptions, application) {
|
|
358
|
+
try {
|
|
359
|
+
console.info(chalk_1.default.green(constants_1.OPTIONS_CONSTANTS['TXT.APP_CREATING']));
|
|
360
|
+
const { data } = await deployOptions.client.application.create(application);
|
|
361
|
+
return data;
|
|
362
|
+
}
|
|
363
|
+
catch (err) {
|
|
364
|
+
console.debug(err);
|
|
365
|
+
console.error(`${constants_1.OPTIONS_CONSTANTS['TXT.APP_CREATE_FAILED']} ${err.res.status}`);
|
|
366
|
+
console.error(JSON.stringify(err.data, null, 2));
|
|
367
|
+
process.exit(9);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Generates upload overrides for package uploads.
|
|
372
|
+
*
|
|
373
|
+
* @param app - The application for which overrides are generated.
|
|
374
|
+
* @returns Upload overrides or undefined if the application is not a package.
|
|
375
|
+
*/
|
|
376
|
+
function getPackageUploadOverrides(deployOptions, app) {
|
|
377
|
+
if (!app.isPackage) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
let tags = deployOptions.tags;
|
|
381
|
+
// in case of rollingTags, we will add the tags later
|
|
382
|
+
if (deployOptions.rollingTags) {
|
|
383
|
+
tags = [];
|
|
384
|
+
}
|
|
385
|
+
const version = app.version;
|
|
386
|
+
return {
|
|
387
|
+
listUrl: 'versions',
|
|
388
|
+
headers: {
|
|
389
|
+
Accept: 'application/vnd.com.nsn.cumulocity.applicationVersion+json;charset=UTF-8;ver=0.9'
|
|
390
|
+
},
|
|
391
|
+
bodyFileProperty: 'applicationBinary',
|
|
392
|
+
requestBody: {
|
|
393
|
+
applicationVersion: Object.assign({ version, tags })
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/utils/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ApplicationAvailability, ApplicationType, Client } from '@c8y/client';
|
|
2
|
+
import { ReadStream } from 'fs';
|
|
3
|
+
export interface DeploymentOptions {
|
|
4
|
+
client: Client;
|
|
5
|
+
json: any;
|
|
6
|
+
buffer: ReadStream;
|
|
7
|
+
fileName?: string;
|
|
8
|
+
size?: number;
|
|
9
|
+
tags: string[];
|
|
10
|
+
rollingTags?: boolean;
|
|
11
|
+
addWebSdkStableTag?: boolean;
|
|
12
|
+
deleteExistingTags?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface ManifestDetails {
|
|
15
|
+
key: string;
|
|
16
|
+
name: string;
|
|
17
|
+
contextPath: string;
|
|
18
|
+
type: ApplicationType;
|
|
19
|
+
availability: ApplicationAvailability;
|
|
20
|
+
webSdkVersion: string;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.model.js","sourceRoot":"","sources":["../../src/utils/deploy.model.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IManifest } from '@c8y/client';
|
|
2
|
+
/**
|
|
3
|
+
* Converts the provided file data to application data.
|
|
4
|
+
*
|
|
5
|
+
* @param fileData - The file data to convert.
|
|
6
|
+
* @returns The application data.
|
|
7
|
+
*/
|
|
8
|
+
export declare function dataToAppData(fileData: any): any;
|
|
9
|
+
/**
|
|
10
|
+
* Gets the name from the application data.
|
|
11
|
+
*
|
|
12
|
+
* @param appData - The application data.
|
|
13
|
+
* @param fallbackStr - The fallback string to use if name is not found.
|
|
14
|
+
* @returns The name of the application.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getName(appData: IManifest, fallbackStr?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Gets the key from the application data.
|
|
19
|
+
*
|
|
20
|
+
* @param appData - The application data.
|
|
21
|
+
* @param name - The name to use in case the key is not found.
|
|
22
|
+
* @returns The key of the application.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getKey(appData: IManifest, name: string): string;
|
|
25
|
+
export declare function getContextPath(appData: IManifest, name: string): string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dataToAppData = dataToAppData;
|
|
4
|
+
exports.getName = getName;
|
|
5
|
+
exports.getKey = getKey;
|
|
6
|
+
exports.getContextPath = getContextPath;
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
/**
|
|
9
|
+
* Converts the provided file data to application data.
|
|
10
|
+
*
|
|
11
|
+
* @param fileData - The file data to convert.
|
|
12
|
+
* @returns The application data.
|
|
13
|
+
*/
|
|
14
|
+
function dataToAppData(fileData) {
|
|
15
|
+
return fileData.c8y && fileData.c8y.application ? fileData.c8y.application : fileData;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Gets the name from the application data.
|
|
19
|
+
*
|
|
20
|
+
* @param appData - The application data.
|
|
21
|
+
* @param fallbackStr - The fallback string to use if name is not found.
|
|
22
|
+
* @returns The name of the application.
|
|
23
|
+
*/
|
|
24
|
+
function getName(appData, fallbackStr = '') {
|
|
25
|
+
return (0, lodash_1.get)(appData, 'name', fallbackStr);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Gets the key from the application data.
|
|
29
|
+
*
|
|
30
|
+
* @param appData - The application data.
|
|
31
|
+
* @param name - The name to use in case the key is not found.
|
|
32
|
+
* @returns The key of the application.
|
|
33
|
+
*/
|
|
34
|
+
function getKey(appData, name) {
|
|
35
|
+
let key = (0, lodash_1.get)(appData, 'key');
|
|
36
|
+
if (!key) {
|
|
37
|
+
key = `${(0, lodash_1.kebabCase)(name)}-key`;
|
|
38
|
+
}
|
|
39
|
+
return key;
|
|
40
|
+
}
|
|
41
|
+
function getContextPath(appData, name) {
|
|
42
|
+
return (0, lodash_1.get)(appData, 'contextPath', name.toLowerCase());
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":";;AASA,sCAEC;AAQD,0BAEC;AAQD,wBAOC;AAED,wCAEC;AAvCD,mCAAwC;AAExC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,QAAa;IACzC,OAAO,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxF,CAAC;AACD;;;;;;GAMG;AACH,SAAgB,OAAO,CAAC,OAAkB,EAAE,WAAW,GAAG,EAAE;IAC1D,OAAO,IAAA,YAAG,EAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AACD;;;;;;GAMG;AACH,SAAgB,MAAM,CAAC,OAAkB,EAAE,IAAY;IACrD,IAAI,GAAG,GAAG,IAAA,YAAG,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,GAAG,IAAA,kBAAS,EAAC,IAAI,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,cAAc,CAAC,OAAkB,EAAE,IAAY;IAC7D,OAAO,IAAA,YAAG,EAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./client"), exports);
|
|
18
|
+
__exportStar(require("./deploy"), exports);
|
|
19
|
+
__exportStar(require("./helpers"), exports);
|
|
20
|
+
__exportStar(require("./deploy.model"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,4CAA0B;AAC1B,iDAA+B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@c8y/toolkit",
|
|
3
|
+
"version": "1021.55.1",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"author": "Cumulocity GmbH",
|
|
6
|
+
"description": "Toolkit for Cumulocity applications, allows to e.g. deploy an application to an instance of Cumulocity.",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"bin": {
|
|
9
|
+
"c8y-toolkit": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "rimraf dist && tsc",
|
|
13
|
+
"cli": "yarn build && node ./dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"Cumulocity",
|
|
17
|
+
"IoT",
|
|
18
|
+
"m2m"
|
|
19
|
+
],
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@c8y/client": "1021.55.1",
|
|
22
|
+
"chalk": "^4.1.2",
|
|
23
|
+
"commander": "13.1.0",
|
|
24
|
+
"lodash": "4.17.21",
|
|
25
|
+
"semver": "~7.7.1",
|
|
26
|
+
"tslib": "^2.6.3",
|
|
27
|
+
"unzip-stream": "0.3.4"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/lodash": "4.17.16",
|
|
31
|
+
"@types/semver": "^7.5.7",
|
|
32
|
+
"@types/unzip-stream": "0.3.4"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist"
|
|
36
|
+
]
|
|
37
|
+
}
|