@soft-artel/ci 1.0.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/k8s/App.d.ts +22 -0
- package/k8s/App.d.ts.map +1 -0
- package/k8s/App.js +130 -0
- package/k8s/App.js.map +1 -0
- package/k8s/DockerImage.d.ts +15 -0
- package/k8s/DockerImage.d.ts.map +1 -0
- package/k8s/DockerImage.js +108 -0
- package/k8s/DockerImage.js.map +1 -0
- package/k8s/Node.d.ts +17 -0
- package/k8s/Node.d.ts.map +1 -0
- package/k8s/Node.js +103 -0
- package/k8s/Node.js.map +1 -0
- package/libs/Exception.d.ts +5 -0
- package/libs/Exception.d.ts.map +1 -0
- package/libs/Exception.js +13 -0
- package/libs/Exception.js.map +1 -0
- package/libs/Git.d.ts +44 -0
- package/libs/Git.d.ts.map +1 -0
- package/libs/Git.js +160 -0
- package/libs/Git.js.map +1 -0
- package/libs/Gitlab.d.ts +12 -0
- package/libs/Gitlab.d.ts.map +1 -0
- package/libs/Gitlab.js +78 -0
- package/libs/Gitlab.js.map +1 -0
- package/libs/Jira.d.ts +31 -0
- package/libs/Jira.d.ts.map +1 -0
- package/libs/Jira.js +157 -0
- package/libs/Jira.js.map +1 -0
- package/libs/Project.d.ts +39 -0
- package/libs/Project.d.ts.map +1 -0
- package/libs/Project.js +177 -0
- package/libs/Project.js.map +1 -0
- package/libs/Reporter.d.ts +34 -0
- package/libs/Reporter.d.ts.map +1 -0
- package/libs/Reporter.js +135 -0
- package/libs/Reporter.js.map +1 -0
- package/libs/Shell.d.ts +39 -0
- package/libs/Shell.d.ts.map +1 -0
- package/libs/Shell.js +107 -0
- package/libs/Shell.js.map +1 -0
- package/libs/helpers.d.ts +29 -0
- package/libs/helpers.d.ts.map +1 -0
- package/libs/helpers.js +101 -0
- package/libs/helpers.js.map +1 -0
- package/libs/prototype.d.ts +6 -0
- package/libs/prototype.d.ts.map +1 -0
- package/libs/prototype.js +176 -0
- package/libs/prototype.js.map +1 -0
- package/package.json +53 -0
- package/sa-ci-k8s.d.ts +3 -0
- package/sa-ci-k8s.d.ts.map +1 -0
- package/sa-ci-k8s.js +183 -0
- package/sa-ci-k8s.js.map +1 -0
- package/sa-ci-xcode.d.ts +3 -0
- package/sa-ci-xcode.d.ts.map +1 -0
- package/sa-ci-xcode.js +163 -0
- package/sa-ci-xcode.js.map +1 -0
- package/upd_pkg.d.ts +3 -0
- package/upd_pkg.d.ts.map +1 -0
- package/upd_pkg.js +28 -0
- package/upd_pkg.js.map +1 -0
package/libs/Project.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Project = void 0;
|
|
16
|
+
const axios_1 = __importDefault(require("axios"));
|
|
17
|
+
const fs_1 = require("fs");
|
|
18
|
+
const Exception_1 = require("./Exception");
|
|
19
|
+
const helpers_1 = require("./helpers");
|
|
20
|
+
const Shell_1 = __importDefault(require("./Shell"));
|
|
21
|
+
const ENV = process.env;
|
|
22
|
+
const ALLOW_STAGES = {
|
|
23
|
+
dev: 'dev',
|
|
24
|
+
alpha: 'alpha',
|
|
25
|
+
rc: 'rc',
|
|
26
|
+
hotfix: 'hotfix',
|
|
27
|
+
prod: 'prod',
|
|
28
|
+
};
|
|
29
|
+
class Project {
|
|
30
|
+
constructor(workdir, stage) {
|
|
31
|
+
this.isRunner = ENV.CI_JOB_ID !== undefined;
|
|
32
|
+
this.id = (Number(ENV.CI_PROJECT_ID || 0));
|
|
33
|
+
this.path = ENV.CI_PROJECT_PATH || '';
|
|
34
|
+
this.url = ENV.CI_PROJECT_URL || '';
|
|
35
|
+
this.name = ENV.CI_PROJECT_NAME || '';
|
|
36
|
+
this.group = ENV.CI_PROJECT_NAMESPACE || '';
|
|
37
|
+
this.rootPath = '';
|
|
38
|
+
this.build = 0;
|
|
39
|
+
this.version = '0.0.0';
|
|
40
|
+
this.stage = 'dev';
|
|
41
|
+
this.$stages = ['dev'];
|
|
42
|
+
this.$stagesVersions = { dev: '0.0.0' };
|
|
43
|
+
this.job = {
|
|
44
|
+
id: ENV.CI_JOB_ID,
|
|
45
|
+
name: ENV.CI_JOB_NAME || 'No Job',
|
|
46
|
+
step: ENV.CI_JOB_STAGE || 'build',
|
|
47
|
+
branch: ENV.CI_COMMIT_REF_NAME || 'dev',
|
|
48
|
+
url: ENV.CI_JOB_URL || '',
|
|
49
|
+
pipline: ENV.CI_PIPELINE_URL || '',
|
|
50
|
+
user: {
|
|
51
|
+
ID: ENV.GITLAB_USER_ID || '',
|
|
52
|
+
login: ENV.GITLAB_USER_LOGIN || '',
|
|
53
|
+
name: ENV.GITLAB_USER_NAME || '',
|
|
54
|
+
email: ENV.GITLAB_USER_EMAIL || '',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
this.rootPath = (0, helpers_1.resolvePath)(workdir || ENV.CI_PROJECT_DIR || Shell_1.default.pwd().toString());
|
|
58
|
+
const branch = ENV.CI_COMMIT_REF_NAME || 'dev';
|
|
59
|
+
this.stage = stage || ALLOW_STAGES[branch] || 'dev';
|
|
60
|
+
try {
|
|
61
|
+
this.$stages = JSON.parse(ENV.CI_STAGES || '[dev]');
|
|
62
|
+
helpers_1.log.dbg('Allowed stages:', this.$stages);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
helpers_1.log.dbg('CI VARIABLE: CI_STAGES is invalid!');
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
this.$stagesVersions = JSON.parse(ENV.VERSIONS || '{}');
|
|
69
|
+
helpers_1.log.dbg('stagesVersions:', this.$stagesVersions);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
helpers_1.log.dbg('CI VARIABLE:VERSIONS is invalid!');
|
|
73
|
+
}
|
|
74
|
+
this.build = Number(ENV.LAST_BUILD) || 0;
|
|
75
|
+
this.version = '0.0.' + this.build;
|
|
76
|
+
Shell_1.default.cd(this.rootPath);
|
|
77
|
+
helpers_1.log.dbg(`[${this.stage}, ${this.version}] ` + this.rootPath);
|
|
78
|
+
}
|
|
79
|
+
get shortVersion() {
|
|
80
|
+
return this.version.split('.').splice(0, 2).join('.');
|
|
81
|
+
}
|
|
82
|
+
get prevVersion() {
|
|
83
|
+
const pV = this.$stagesVersions[this.stage];
|
|
84
|
+
return pV !== '0.0.0' ? pV : undefined;
|
|
85
|
+
}
|
|
86
|
+
incrementBuild(newBuild) {
|
|
87
|
+
if (newBuild) {
|
|
88
|
+
this.build = newBuild;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.build += 1;
|
|
92
|
+
}
|
|
93
|
+
this.version = `${this.shortVersion}.${this.build}`;
|
|
94
|
+
}
|
|
95
|
+
saveGitLabBuild() {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
yield saveGitLabVariable(this, 'LAST_BUILD', this.build);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
saveGitLabStagesVersions() {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
this.$stagesVersions[this.stage] = this.version;
|
|
103
|
+
yield saveGitLabVariable(this, 'VERSIONS', JSON.stringify(this.$stagesVersions, null, 3));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
updateChangeLog(whatsNewHtml, filename = 'CHANGELOG.md') {
|
|
107
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const filePath = `${this.rootPath}/${filename}`;
|
|
109
|
+
let title = `# ${(0, helpers_1.capitalizeFirstLetter)(this.group)}: **${this.name.toUpperCase()}**`;
|
|
110
|
+
helpers_1.log.info(`Update ${filename}:\n${title}`);
|
|
111
|
+
let changeLog = (yield Shell_1.default.cat(filePath, { silent: true, ignoreError: true })) || '';
|
|
112
|
+
const lines = changeLog.split('\n');
|
|
113
|
+
if (Array.isArray(lines) && lines.length > 1) {
|
|
114
|
+
title = lines.shift() || title;
|
|
115
|
+
changeLog = lines.join('\n');
|
|
116
|
+
}
|
|
117
|
+
const dateTime = new Date().toLocaleString('ru-RU', {
|
|
118
|
+
weekday: 'long',
|
|
119
|
+
year: 'numeric',
|
|
120
|
+
month: 'short',
|
|
121
|
+
day: 'numeric',
|
|
122
|
+
timeZone: 'Europe/Moscow',
|
|
123
|
+
hour12: false,
|
|
124
|
+
hour: 'numeric',
|
|
125
|
+
minute: 'numeric',
|
|
126
|
+
});
|
|
127
|
+
const whatsNewMd = (0, helpers_1.htmlToMd)(whatsNewHtml);
|
|
128
|
+
changeLog = `${title}
|
|
129
|
+
## **${this.version}**
|
|
130
|
+
${(0, helpers_1.capitalizeFirstLetter)(dateTime)}
|
|
131
|
+
|
|
132
|
+
${whatsNewMd}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
${changeLog}
|
|
138
|
+
`;
|
|
139
|
+
yield fs_1.promises.writeFile(filePath, changeLog, { encoding: 'utf8', flag: 'w+' });
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.Project = Project;
|
|
144
|
+
function saveGitLabVariable(prj, name, value) {
|
|
145
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
146
|
+
try {
|
|
147
|
+
const resp = yield (0, axios_1.default)({
|
|
148
|
+
method: 'PUT',
|
|
149
|
+
timeout: 6000,
|
|
150
|
+
url: `${ENV.CONFIG_GITLAB_URL || 'https://gitlab.soft-artel.com'}/api/v4/projects/${prj.id}/variables/${name}`,
|
|
151
|
+
headers: { 'PRIVATE-TOKEN': ENV.GITLAB_API_TOKEN || '' },
|
|
152
|
+
data: {
|
|
153
|
+
value,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
helpers_1.log.dbg(resp.data);
|
|
157
|
+
return JSON.parse(resp.data.value);
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
const errTitle = `GitLab project [${prj.id}] has not`;
|
|
161
|
+
if (e.response && (e.response.status === 401 || e.response.status === 403)) {
|
|
162
|
+
const err = new Exception_1.Exception(`${errTitle} access, HTTP-401`);
|
|
163
|
+
err.params = e.config;
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
if (e.response && e.response.status === 404) {
|
|
167
|
+
const err = new Exception_1.Exception(`${errTitle} CI VARIABLE: ${name}`);
|
|
168
|
+
err.params = e.config;
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
e.request = '...';
|
|
172
|
+
e.connection = '...';
|
|
173
|
+
throw e;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=Project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Project.js","sourceRoot":"","sources":["../../libs/Project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import './prototype';
|
|
2
|
+
import TelegramBot from 'node-telegram-bot-api';
|
|
3
|
+
import { Project } from './Project';
|
|
4
|
+
declare type PipelineTypes = 'build' | 'deploy' | 'setup';
|
|
5
|
+
export interface ReporterOptions {
|
|
6
|
+
chat_id: number;
|
|
7
|
+
chat_rel?: number;
|
|
8
|
+
token: string;
|
|
9
|
+
showGroup?: boolean;
|
|
10
|
+
shortVersion?: boolean;
|
|
11
|
+
showBuild?: boolean;
|
|
12
|
+
preTitle?: string;
|
|
13
|
+
postTitle?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class Reporter {
|
|
16
|
+
$bot: TelegramBot;
|
|
17
|
+
$chat_id: number;
|
|
18
|
+
$message_id: number;
|
|
19
|
+
$message_text: string;
|
|
20
|
+
title: string;
|
|
21
|
+
stage: string | undefined;
|
|
22
|
+
$prj: Project;
|
|
23
|
+
$build: number;
|
|
24
|
+
$version: string;
|
|
25
|
+
$chat_rel: number;
|
|
26
|
+
constructor(prj: Project, opt: ReporterOptions);
|
|
27
|
+
updateTitle(): void;
|
|
28
|
+
start(pipeline: PipelineTypes, stage?: string, showTitle?: boolean): Promise<void>;
|
|
29
|
+
fail(err: Error): Promise<void>;
|
|
30
|
+
release(changelog: string): Promise<void>;
|
|
31
|
+
send(text: string, appendExist?: string, chat_id_opt?: number): Promise<number>;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=Reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reporter.d.ts","sourceRoot":"","sources":["../../libs/Reporter.ts"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,aAAK,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAIlD,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,QAAQ;IAEpB,IAAI,cAAC;IACL,QAAQ,SAAK;IACb,WAAW,SAAK;IAChB,aAAa,SAAM;IAEnB,KAAK,SAAM;IACX,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,SAAK;IACX,QAAQ,SAAM;IACd,SAAS,SAAK;gBAIF,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe;IA+B9C,WAAW;IAQL,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe;IAqBzE,IAAI,CAAC,GAAG,EAAE,KAAK;IAWf,OAAO,CAAC,SAAS,EAAE,MAAM;IAsBzB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,SAAQ,EAAE,WAAW,SAAgB;CAuCzE"}
|
package/libs/Reporter.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Reporter = void 0;
|
|
16
|
+
const ENV = process.env;
|
|
17
|
+
ENV.NTBA_FIX_319 = 'true';
|
|
18
|
+
require("./prototype");
|
|
19
|
+
const node_telegram_bot_api_1 = __importDefault(require("node-telegram-bot-api"));
|
|
20
|
+
const helpers_1 = require("../libs/helpers");
|
|
21
|
+
class Reporter {
|
|
22
|
+
constructor(prj, opt) {
|
|
23
|
+
this.$chat_id = 0;
|
|
24
|
+
this.$message_id = 0;
|
|
25
|
+
this.$message_text = '';
|
|
26
|
+
this.title = '';
|
|
27
|
+
this.$build = 0;
|
|
28
|
+
this.$version = '';
|
|
29
|
+
this.$chat_rel = 0;
|
|
30
|
+
this.$prj = prj;
|
|
31
|
+
this.$chat_id = opt.chat_id;
|
|
32
|
+
this.$build = prj.build;
|
|
33
|
+
this.$version = prj.version;
|
|
34
|
+
this.$bot = new node_telegram_bot_api_1.default(opt.token);
|
|
35
|
+
if (opt.chat_rel) {
|
|
36
|
+
this.$chat_rel = opt.chat_rel;
|
|
37
|
+
}
|
|
38
|
+
if (opt.preTitle) {
|
|
39
|
+
this.title += opt.preTitle + ' ';
|
|
40
|
+
}
|
|
41
|
+
if (opt.showGroup) {
|
|
42
|
+
this.title += this.$prj.group.toUpperCase() + ': ';
|
|
43
|
+
}
|
|
44
|
+
this.title += this.$prj.name.toUpperCase();
|
|
45
|
+
if (opt.postTitle) {
|
|
46
|
+
this.title += ' ' + opt.postTitle;
|
|
47
|
+
}
|
|
48
|
+
this.title = `<b>${this.title} v${opt.shortVersion ? this.$prj.shortVersion : this.$prj.version}${opt.showBuild ? ` #${this.$prj.build}` : ''}</b>`;
|
|
49
|
+
}
|
|
50
|
+
updateTitle() {
|
|
51
|
+
this.title = this.title.replace(`#${this.$build}`, `#${this.$prj.build}`);
|
|
52
|
+
this.$build = this.$prj.build;
|
|
53
|
+
this.title = this.title.replace(this.$version, this.$prj.version);
|
|
54
|
+
this.$version = this.$prj.version;
|
|
55
|
+
}
|
|
56
|
+
start(pipeline, stage, showTitle = false) {
|
|
57
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
+
this.updateTitle();
|
|
59
|
+
const icon = pipeline ? pipeline === 'build' ? '📦' : '🚀' : '';
|
|
60
|
+
let msg = `${showTitle ? this.title : ''} \n\n${icon} <a href="${this.$prj.job.url}">${pipeline.toUpperCase()}</a>`;
|
|
61
|
+
if (stage) {
|
|
62
|
+
this.stage = stage.toUpperCase();
|
|
63
|
+
if (pipeline === 'deploy') {
|
|
64
|
+
msg += `: <b>${this.$prj.job.branch.toUpperCase()}</b> to <b>${this.stage}</b>`;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
msg += `: <b>${this.stage}</b>`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
yield this.send(msg);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
fail(err) {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
let msg = '\n';
|
|
76
|
+
if (this.$message_id === 0) {
|
|
77
|
+
msg = `${this.$prj.group.toUpperCase()}: <b>${this.$prj.name.toUpperCase()} v${this.$prj.version}</b>\n`;
|
|
78
|
+
}
|
|
79
|
+
msg += `‼️ <b><a href="${this.$prj.job.url}">FAIL</a></b>\n${htmlEntities(err.stack || err.message)}`;
|
|
80
|
+
yield this.send(msg, ' ');
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
release(changelog) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
const prj = this.$prj;
|
|
86
|
+
yield this.send(`\n✅ RELEASED: <b>${prj.shortVersion} #${prj.build}</b>${this.stage ? `to ${this.stage}` : ''}`, ' ');
|
|
87
|
+
const msg = `🎉 ${this.title} ${this.stage ? ` [ ${this.stage} ]` : ``}
|
|
88
|
+
---------------------
|
|
89
|
+
${changelog}`;
|
|
90
|
+
if (this.$chat_rel !== 0) {
|
|
91
|
+
yield this.send(msg, '', this.$chat_rel);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
yield this.send(msg, '', this.$chat_id);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
send(text, appendExist = '...', chat_id_opt = this.$chat_id) {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
const chat_id = chat_id_opt;
|
|
101
|
+
const message_id = this.$message_id;
|
|
102
|
+
try {
|
|
103
|
+
if (message_id && message_id !== 0 && appendExist) {
|
|
104
|
+
let fullMsg = this.$message_text + '\n' + text;
|
|
105
|
+
fullMsg = fullMsg.length < 4090 ? fullMsg : fullMsg.slice(0, 4090);
|
|
106
|
+
yield this.$bot.editMessageText(fullMsg + '\n' + appendExist, {
|
|
107
|
+
chat_id, message_id, parse_mode: 'HTML', disable_web_page_preview: true,
|
|
108
|
+
});
|
|
109
|
+
this.$message_text = fullMsg;
|
|
110
|
+
return this.$message_id;
|
|
111
|
+
}
|
|
112
|
+
text = text.length < 4090 ? text : text.slice(0, 4090);
|
|
113
|
+
const res = yield this.$bot.sendMessage(chat_id, appendExist && appendExist.length > 0 ? text + '\n' + appendExist : text, { parse_mode: 'HTML', disable_web_page_preview: true });
|
|
114
|
+
if (appendExist) {
|
|
115
|
+
this.$message_id = res.message_id;
|
|
116
|
+
this.$message_text = text;
|
|
117
|
+
}
|
|
118
|
+
return res.message_id;
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
err.message = 'ERROR Sending message\n' + err.message;
|
|
122
|
+
helpers_1.log.error(err.message);
|
|
123
|
+
helpers_1.log.error(err, { chat_id, message_id, text });
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.Reporter = Reporter;
|
|
130
|
+
function htmlEntities(rawStr) {
|
|
131
|
+
return rawStr.replace(/[\u00A0-\u9999<>\&]/g, function (i) {
|
|
132
|
+
return '&#' + i.charCodeAt(0) + ';';
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=Reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reporter.js","sourceRoot":"","sources":["../../libs/Reporter.ts"],"names":[],"mappings":"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"}
|
package/libs/Shell.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import shelljs from 'shelljs';
|
|
2
|
+
declare function exec(cmd: string, opt?: ExecOptions): Promise<string>;
|
|
3
|
+
declare function execRepeat(cmd: string, repeats?: number, sleep?: number, opt?: {
|
|
4
|
+
silent: boolean;
|
|
5
|
+
ignoreError: boolean;
|
|
6
|
+
}): Promise<string>;
|
|
7
|
+
declare function mkdir(dir: string, opt?: ExecOptions): Promise<string>;
|
|
8
|
+
declare function cat(file: string, opt?: {
|
|
9
|
+
silent: boolean;
|
|
10
|
+
ignoreError: boolean;
|
|
11
|
+
}): Promise<string | undefined>;
|
|
12
|
+
declare function find(where: string, filename?: string, maxdepth?: number, ignore?: string[], pars?: string, opt?: {
|
|
13
|
+
silent: boolean;
|
|
14
|
+
ignoreError: boolean;
|
|
15
|
+
}): Promise<string[]>;
|
|
16
|
+
declare function ls(where: string, pars?: string, opt?: {
|
|
17
|
+
silent: boolean;
|
|
18
|
+
ignoreError: boolean;
|
|
19
|
+
}): Promise<string[]>;
|
|
20
|
+
export interface ExecOptions {
|
|
21
|
+
silent?: boolean;
|
|
22
|
+
ignoreError?: boolean;
|
|
23
|
+
}
|
|
24
|
+
declare const _default: {
|
|
25
|
+
cd: typeof shelljs.cd;
|
|
26
|
+
chmod: shelljs.ChmodFunction;
|
|
27
|
+
grep: shelljs.GrepFunction;
|
|
28
|
+
pwd: typeof shelljs.pwd;
|
|
29
|
+
sed: shelljs.SedFunction;
|
|
30
|
+
test: typeof shelljs.test;
|
|
31
|
+
exec: typeof exec;
|
|
32
|
+
execRepeat: typeof execRepeat;
|
|
33
|
+
mkdir: typeof mkdir;
|
|
34
|
+
cat: typeof cat;
|
|
35
|
+
find: typeof find;
|
|
36
|
+
ls: typeof ls;
|
|
37
|
+
};
|
|
38
|
+
export default _default;
|
|
39
|
+
//# sourceMappingURL=Shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Shell.d.ts","sourceRoot":"","sources":["../../libs/Shell.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAM9B,iBAAS,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,WAAwD,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BzG;AAID,iBAAe,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAK,EAAE,KAAK,SAAK,EAAE,GAAG;;;CAA6C,mBAyBhH;AAID,iBAAe,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,mBAElD;AAED,iBAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;;;CAAuC,+BAM1E;AAED,iBAAe,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAK,EAAE,QAAQ,SAAI,EAAE,MAAM,GAAE,MAAM,EAAO,EAAE,IAAI,SAAK,EAAE,GAAG;;;CAAuC,qBAY3I;AAED,iBAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,EAAE,GAAG;;;CAAuC,qBAErF;AAED,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;;;;;;;;;;;;;;;AAED,wBAcE"}
|
package/libs/Shell.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const shelljs_1 = __importDefault(require("shelljs"));
|
|
16
|
+
const helpers_1 = require("../libs/helpers");
|
|
17
|
+
function exec(cmd, opt = { silent: !helpers_1.log.debug, ignoreError: false }) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
if (opt.silent === undefined) {
|
|
20
|
+
opt.silent = true;
|
|
21
|
+
}
|
|
22
|
+
if (opt.silent === false) {
|
|
23
|
+
helpers_1.log.dbg(cmd);
|
|
24
|
+
}
|
|
25
|
+
shelljs_1.default.exec(cmd, opt, (code, stdout, stderr) => {
|
|
26
|
+
if (code === 0) {
|
|
27
|
+
resolve(stdout.trim());
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (code !== 0 && opt.ignoreError) {
|
|
31
|
+
resolve('');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const e = new Error();
|
|
35
|
+
e.message = cmd + '\n' + (stderr.length > 0 ? stderr : stdout);
|
|
36
|
+
e.name = String(code);
|
|
37
|
+
reject(e);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function execRepeat(cmd, repeats = 10, sleep = 10, opt = { silent: !helpers_1.log.debug, ignoreError: false }) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
let tryCount = repeats;
|
|
44
|
+
let e = new Error();
|
|
45
|
+
while (tryCount > 0) {
|
|
46
|
+
tryCount -= 1;
|
|
47
|
+
try {
|
|
48
|
+
return yield exec(cmd, { silent: opt.silent, ignoreError: false });
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
e = err;
|
|
52
|
+
helpers_1.log.error(`Exec Repeats [${tryCount + 1}] FAIL: ${cmd}`);
|
|
53
|
+
helpers_1.log.error(err);
|
|
54
|
+
yield (0, helpers_1.asyncSleep)(sleep);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (opt.ignoreError) {
|
|
58
|
+
return e.message;
|
|
59
|
+
}
|
|
60
|
+
throw e;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function mkdir(dir, opt) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
return exec(`mkdir -p ${(0, helpers_1.resolvePath)(dir)}`, opt);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function cat(file, opt = { silent: true, ignoreError: false }) {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const filePath = (0, helpers_1.resolvePath)(file);
|
|
71
|
+
if (shelljs_1.default.test('-e', filePath) === false && opt && opt.ignoreError === true) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return exec('cat ' + filePath, opt);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function find(where, filename = '', maxdepth = 3, ignore = [], pars = '', opt = { silent: true, ignoreError: false }) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
let cmd = `find ${where} ${pars}`;
|
|
80
|
+
for (const path of ignore) {
|
|
81
|
+
cmd += ` -not -path '${path}'`;
|
|
82
|
+
}
|
|
83
|
+
cmd += ` -maxdepth ${maxdepth}`;
|
|
84
|
+
cmd += ` -name ${filename}`;
|
|
85
|
+
return (yield exec(cmd, opt)).split('\n').filter((f) => f.length > 2);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function ls(where, pars = '', opt = { silent: true, ignoreError: false }) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
return (yield exec(`ls ${where} ${pars}`, opt)).split('\n').filter((f) => f.length > 2);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
exports.default = {
|
|
94
|
+
cd: shelljs_1.default.cd,
|
|
95
|
+
chmod: shelljs_1.default.chmod,
|
|
96
|
+
grep: shelljs_1.default.grep,
|
|
97
|
+
pwd: shelljs_1.default.pwd,
|
|
98
|
+
sed: shelljs_1.default.sed,
|
|
99
|
+
test: shelljs_1.default.test,
|
|
100
|
+
exec,
|
|
101
|
+
execRepeat,
|
|
102
|
+
mkdir,
|
|
103
|
+
cat,
|
|
104
|
+
find,
|
|
105
|
+
ls,
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=Shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Shell.js","sourceRoot":"","sources":["../../libs/Shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export declare function checkVarsExisting(variables: {
|
|
3
|
+
field: any;
|
|
4
|
+
exceptionMessage: string;
|
|
5
|
+
}[]): void;
|
|
6
|
+
export declare function checkEnvVars(variables: string[]): void;
|
|
7
|
+
export declare function capitalizeFirstLetter(str: string): string;
|
|
8
|
+
export declare function htmlToMd(html: string): string;
|
|
9
|
+
export declare const log: {
|
|
10
|
+
dbg: {
|
|
11
|
+
(...data: any[]): void;
|
|
12
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
13
|
+
};
|
|
14
|
+
info: {
|
|
15
|
+
(...data: any[]): void;
|
|
16
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
17
|
+
};
|
|
18
|
+
error: {
|
|
19
|
+
(...data: any[]): void;
|
|
20
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
21
|
+
};
|
|
22
|
+
debug: boolean;
|
|
23
|
+
};
|
|
24
|
+
export declare function resolvePath(filepath: string): string;
|
|
25
|
+
export declare function asyncSleep(sec: number, fn?: (id: NodeJS.Timeout) => void): Promise<unknown>;
|
|
26
|
+
export declare function stripTags(html: string): string;
|
|
27
|
+
export declare const md5: (contents: string) => string;
|
|
28
|
+
export declare function objectFromIniFile(path: string): Promise<Record<string, any> | undefined>;
|
|
29
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../libs/helpers.ts"],"names":[],"mappings":";AASA,wBAAgB,iBAAiB,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EAAE,QAMtF;AAID,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAM/C;AAID,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,UAEhD;AAQD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,UAEpC;AAID,eAAO,MAAM,GAAG;;;;;;;;;;;;;;CAGf,CAAC;AAIF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,UAK3C;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,oBAOxE;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,UAMrC;AAID,eAAO,MAAM,GAAG,aAAc,MAAM,WAA4D,CAAC;AAIjG,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,CAyB9F"}
|