ssh-delivery 0.0.1 → 0.2.2

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 ADDED
@@ -0,0 +1,117 @@
1
+ # SSH-Delivery
2
+
3
+ Do fast files deploy with SFTP. Support servers chain.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npm install -g ssh-delivery
9
+ ```
10
+
11
+ ## Configure
12
+
13
+ Create config with tasks and servers declaration. Default config file names :
14
+
15
+ ```
16
+ .deliveryrc
17
+ .deliveryrc.js
18
+ .delivery.config.js
19
+ delivery.config.js
20
+ ```
21
+
22
+ ```js
23
+ const fs = require('fs');
24
+ const path = require('path');
25
+
26
+ module.exports = {
27
+ // SSH servers (all server options see at https://github.com/mscdex/ssh2#client-methods `connect` method)
28
+ // Upload destination servers should support SFTP. Gateway servers should support port forwarding.
29
+ servers: {
30
+ gate: {
31
+ alias: 'gate',
32
+ host: 'gate.myweb.com',
33
+ username: 'root',
34
+ password: 'secret',
35
+ },
36
+ web: {
37
+ host: 'myweb.com',
38
+ port: 41022,
39
+ username: 'root',
40
+ privateKey: fs.readFileSync(path.resolve(os.homedir(), '.ssh', 'id_rsa')),
41
+ passphrase: 'secret',
42
+ via: 'gate', // Connection to this server will be made via 'gate' server
43
+ },
44
+ },
45
+
46
+ // Delivery tasks
47
+ tasks: {
48
+ deployToWebServer: {
49
+ // Commands before uploading
50
+ before: {
51
+ run: ['npm run build'],
52
+ },
53
+
54
+ // Files to upload
55
+ src: {
56
+ path: './build/',
57
+ },
58
+
59
+ // Where should upload
60
+ dst: {
61
+ server: 'web', // server name from servers-section
62
+ path: '/var/www/html', // path on remote server
63
+ },
64
+
65
+ // Commands after uploading
66
+ after: {
67
+ run: ['rm -rf ./build'],
68
+ },
69
+ },
70
+ },
71
+ };
72
+ ```
73
+
74
+ You can keep servers options secure in your home directory. Create `$HOME/.delivery.js` with content like this:
75
+
76
+ ```js
77
+ const fs = require('fs');
78
+ const os = require('os');
79
+ const path = require('path');
80
+
81
+ module.exports = {
82
+ servers: {
83
+ gate: {
84
+ alias: 'gate',
85
+ host: 'gate.myweb.com',
86
+ username: 'root',
87
+ password: 'secret',
88
+ },
89
+ web: {
90
+ host: 'myweb.com',
91
+ port: 41022,
92
+ username: 'root',
93
+ privateKey: fs.readFileSync(path.resolve(os.homedir(), '.ssh', 'id_rsa')),
94
+ passphrase: 'secret',
95
+ via: 'gate', // Connection to this server will be made via 'gate' server
96
+ },
97
+ },
98
+ }
99
+ ```
100
+
101
+ and use serves `gate` and `web` in your separate configs without redeclaration.
102
+
103
+ ## Run
104
+
105
+ Run `static` task with
106
+
107
+ ```sh
108
+ delivery deployToWebServer
109
+ ```
110
+
111
+ or with custom config path
112
+
113
+ ```sh
114
+ delivery deployToWebServer -c ./custom-config.js
115
+ ```
116
+
117
+ You can keep servers options with credentials in separate config
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
27
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
28
+ return new (P || (P = Promise))(function (resolve, reject) {
29
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
30
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
31
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
32
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
33
+ });
34
+ };
35
+ var __generator = (this && this.__generator) || function (thisArg, body) {
36
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
37
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
38
+ function verb(n) { return function (v) { return step([n, v]); }; }
39
+ function step(op) {
40
+ if (f) throw new TypeError("Generator is already executing.");
41
+ while (_) try {
42
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
43
+ if (y = 0, t) op = [op[0] & 2, t.value];
44
+ switch (op[0]) {
45
+ case 0: case 1: t = op; break;
46
+ case 4: _.label++; return { value: op[1], done: false };
47
+ case 5: _.label++; y = op[1]; op = [0]; continue;
48
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
49
+ default:
50
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
51
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
52
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
53
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
54
+ if (t[2]) _.ops.pop();
55
+ _.trys.pop(); continue;
56
+ }
57
+ op = body.call(thisArg, _);
58
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
59
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
60
+ }
61
+ };
62
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
63
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
64
+ if (ar || !(i in from)) {
65
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
66
+ ar[i] = from[i];
67
+ }
68
+ }
69
+ return to.concat(ar || Array.prototype.slice.call(from));
70
+ };
71
+ var __importDefault = (this && this.__importDefault) || function (mod) {
72
+ return (mod && mod.__esModule) ? mod : { "default": mod };
73
+ };
74
+ Object.defineProperty(exports, "__esModule", { value: true });
75
+ var path = __importStar(require("path"));
76
+ var os = __importStar(require("os"));
77
+ var fs = __importStar(require("fs"));
78
+ var delivery_1 = require("./delivery");
79
+ var yargs_1 = __importDefault(require("yargs/yargs"));
80
+ var validation_1 = require("./validation");
81
+ var merge_1 = __importDefault(require("lodash/merge"));
82
+ var defaultConfigNames = ['.deliveryrc', '.deliveryrc.js', '.delivery.config.js', 'delivery.config.js'];
83
+ void (function () { return __awaiter(void 0, void 0, void 0, function () {
84
+ var argv_1, argvConfig, taskName, configPaths_1, config, delivery, e_1;
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ _a.trys.push([0, 3, , 4]);
89
+ return [4 /*yield*/, (0, yargs_1.default)(process.argv.slice(2)).options({
90
+ config: { type: 'string', alias: 'c', default: defaultConfigNames },
91
+ }).argv];
92
+ case 1:
93
+ argv_1 = _a.sent();
94
+ argvConfig = (function () {
95
+ if (typeof argv_1.config === 'string') {
96
+ return [argv_1.config];
97
+ }
98
+ return argv_1.config;
99
+ })();
100
+ taskName = argv_1._[0];
101
+ configPaths_1 = __spreadArray(__spreadArray([], defaultConfigNames.map(function (fileName) { return path.resolve(os.homedir(), fileName); }), true), argvConfig, true);
102
+ config = (function () {
103
+ var configObj = {
104
+ servers: {},
105
+ tasks: {},
106
+ };
107
+ var someConfigFound = false;
108
+ for (var _i = 0, configPaths_2 = configPaths_1; _i < configPaths_2.length; _i++) {
109
+ var configPath = configPaths_2[_i];
110
+ if (!fs.existsSync(configPath)) {
111
+ continue;
112
+ }
113
+ configObj = (0, merge_1.default)(configObj, require(path.resolve(configPath)));
114
+ someConfigFound = true;
115
+ }
116
+ if (!someConfigFound) {
117
+ throw new Error('Config not found');
118
+ }
119
+ var validationResult = (0, validation_1.validateConfig)(configObj);
120
+ if (!validationResult.valid) {
121
+ console.warn(validationResult.errors);
122
+ throw new Error('Wrong config');
123
+ }
124
+ return configObj;
125
+ })();
126
+ delivery = new delivery_1.Delivery(config);
127
+ return [4 /*yield*/, delivery.run(taskName)];
128
+ case 2:
129
+ _a.sent();
130
+ console.info('\n• Delivery successfully done!\n');
131
+ return [3 /*break*/, 4];
132
+ case 3:
133
+ e_1 = _a.sent();
134
+ console.error('!!!', (e_1 === null || e_1 === void 0 ? void 0 : e_1.message) || e_1);
135
+ process.exit(1);
136
+ return [3 /*break*/, 4];
137
+ case 4: return [2 /*return*/];
138
+ }
139
+ });
140
+ }); })();
141
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAA6B;AAC7B,qCAAyB;AACzB,qCAAyB;AACzB,uCAAsC;AAEtC,sDAAgC;AAChC,2CAA8C;AAC9C,uDAAiC;AAEjC,IAAM,kBAAkB,GAAG,CAAC,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;AAE1G,KAAK,CAAC;;;;;;gBAEW,qBAAM,IAAA,eAAK,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;wBACtD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE;qBACpE,CAAC,CAAC,IAAI,EAAA;;gBAFD,SAAO,SAEN;gBAED,UAAU,GAAG,CAAC;oBAClB,IAAI,OAAO,MAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;wBACnC,OAAO,CAAC,MAAI,CAAC,MAAM,CAAC,CAAC;qBACtB;oBACD,OAAO,MAAI,CAAC,MAAM,CAAC;gBACrB,CAAC,CAAC,EAAE,CAAC;gBAEC,QAAQ,GAAG,MAAI,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;gBAC/B,gDAAkB,kBAAkB,CAAC,GAAG,CAAC,UAAC,QAAQ,IAAK,OAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAApC,CAAoC,CAAC,SAAK,UAAU,OAAC,CAAC;gBAE7G,MAAM,GAAG,CAAC;oBACd,IAAI,SAAS,GAAoB;wBAC/B,OAAO,EAAE,EAAE;wBACX,KAAK,EAAE,EAAE;qBACV,CAAC;oBAEF,IAAI,eAAe,GAAG,KAAK,CAAC;oBAE5B,KAAyB,UAAW,EAAX,gBAAA,aAAW,EAAX,yBAAW,EAAX,IAAW,EAAE;wBAAjC,IAAM,UAAU,oBAAA;wBACnB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;4BAC9B,SAAS;yBACV;wBACD,SAAS,GAAG,IAAA,eAAK,EAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAA6B,CAAC,CAAC;wBAC5F,eAAe,GAAG,IAAI,CAAC;qBACxB;oBAED,IAAI,CAAC,eAAe,EAAE;wBACpB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;qBACrC;oBAED,IAAM,gBAAgB,GAAG,IAAA,2BAAc,EAAC,SAAS,CAAC,CAAC;oBACnD,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;wBAC3B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;qBACjC;oBAED,OAAO,SAAS,CAAC;gBACnB,CAAC,CAAC,EAAE,CAAC;gBAEC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,MAAM,CAAC,CAAC;gBACtC,qBAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAA;;gBAA5B,SAA4B,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;;;;gBAElD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAW,aAAX,GAAC,uBAAD,GAAC,CAAY,OAAO,KAAI,GAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;;;KAEnB,CAAC,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { DeliveryOptions, ServerOptions, TaskOptions } from './types';
2
+ import { Client } from 'ssh2';
3
+ export declare class Delivery {
4
+ private options;
5
+ constructor(options: DeliveryOptions);
6
+ /**
7
+ * Выполнить команду по доставке файлов
8
+ * @param taskName
9
+ */
10
+ run(taskName: string): Promise<void>;
11
+ runShellCommands(commands: string | string[]): Promise<void>;
12
+ /**
13
+ * Приготовить подключение к целевому серверу (при необходимости построить цепочку туннелей)
14
+ * @param serverOptions
15
+ */
16
+ createSshConnection(serverOptions: ServerOptions): Promise<Client>;
17
+ /**
18
+ * Подготовить архив для загрузки
19
+ * @param taskOptions
20
+ */
21
+ prepareUploadArchive(taskOptions: TaskOptions): Promise<string>;
22
+ /**
23
+ * Загрузить файл по SFTP
24
+ * @param sshConnection
25
+ * @param srcPath
26
+ * @param dstPath
27
+ */
28
+ uploadFile({ sshConnection, srcPath, dstPath }: {
29
+ sshConnection: Client;
30
+ srcPath: string;
31
+ dstPath: string;
32
+ }): Promise<void>;
33
+ unpackArchiveOnRemoteServer({ sshConnection, archivePath, dstPath, }: {
34
+ sshConnection: Client;
35
+ archivePath: string;
36
+ dstPath: string;
37
+ }): Promise<void>;
38
+ }
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (_) try {
52
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ var __importDefault = (this && this.__importDefault) || function (mod) {
73
+ return (mod && mod.__esModule) ? mod : { "default": mod };
74
+ };
75
+ Object.defineProperty(exports, "__esModule", { value: true });
76
+ exports.Delivery = void 0;
77
+ var tunnel_1 = __importDefault(require("./tunnel"));
78
+ var ssh2_1 = require("ssh2");
79
+ var path_1 = __importDefault(require("path"));
80
+ var fs_1 = __importDefault(require("fs"));
81
+ var tar = __importStar(require("tar"));
82
+ var string_1 = require("./utils/string");
83
+ var child_process_1 = require("child_process");
84
+ var Delivery = /** @class */ (function () {
85
+ function Delivery(options) {
86
+ Object.keys(options.servers).forEach(function (key) {
87
+ var _a;
88
+ options.servers[key].name = key;
89
+ (_a = options.servers[key]).port || (_a.port = 22);
90
+ });
91
+ Object.keys(options.tasks).forEach(function (key) {
92
+ options.tasks[key].name = key;
93
+ });
94
+ this.options = options;
95
+ }
96
+ /**
97
+ * Выполнить команду по доставке файлов
98
+ * @param taskName
99
+ */
100
+ Delivery.prototype.run = function (taskName) {
101
+ var _a;
102
+ return __awaiter(this, void 0, void 0, function () {
103
+ var taskOptions, dstServerOptions, dstSshConnection, uploadingArchivePath, remoteArchivePath;
104
+ return __generator(this, function (_b) {
105
+ switch (_b.label) {
106
+ case 0:
107
+ taskOptions = this.options.tasks[taskName];
108
+ if (!taskOptions) {
109
+ throw new Error('unknown task');
110
+ }
111
+ dstServerOptions = this.options.servers[taskOptions.dst.server];
112
+ if (!dstServerOptions) {
113
+ throw new Error('unknown dst server');
114
+ }
115
+ if (!((_a = taskOptions.before) === null || _a === void 0 ? void 0 : _a.run)) return [3 /*break*/, 2];
116
+ return [4 /*yield*/, this.runShellCommands(taskOptions.before.run)];
117
+ case 1:
118
+ _b.sent();
119
+ _b.label = 2;
120
+ case 2: return [4 /*yield*/, this.createSshConnection(dstServerOptions)];
121
+ case 3:
122
+ dstSshConnection = _b.sent();
123
+ return [4 /*yield*/, this.prepareUploadArchive(taskOptions)];
124
+ case 4:
125
+ uploadingArchivePath = _b.sent();
126
+ remoteArchivePath = "/tmp/".concat(uploadingArchivePath.split(path_1.default.sep).slice(-1)[0]);
127
+ return [4 /*yield*/, this.uploadFile({
128
+ sshConnection: dstSshConnection,
129
+ srcPath: uploadingArchivePath,
130
+ dstPath: remoteArchivePath,
131
+ })];
132
+ case 5:
133
+ _b.sent();
134
+ return [4 /*yield*/, this.unpackArchiveOnRemoteServer({
135
+ sshConnection: dstSshConnection,
136
+ archivePath: remoteArchivePath,
137
+ dstPath: taskOptions.dst.path,
138
+ })];
139
+ case 6:
140
+ _b.sent();
141
+ fs_1.default.unlinkSync(uploadingArchivePath);
142
+ dstSshConnection.end();
143
+ if (!taskOptions.after) return [3 /*break*/, 8];
144
+ return [4 /*yield*/, this.runShellCommands(taskOptions.after.run)];
145
+ case 7:
146
+ _b.sent();
147
+ _b.label = 8;
148
+ case 8: return [2 /*return*/];
149
+ }
150
+ });
151
+ });
152
+ };
153
+ Delivery.prototype.runShellCommands = function (commands) {
154
+ return __awaiter(this, void 0, void 0, function () {
155
+ var line1, line2, _loop_1, _i, commands_1, command;
156
+ return __generator(this, function (_a) {
157
+ switch (_a.label) {
158
+ case 0:
159
+ if (typeof commands === 'string') {
160
+ commands = [commands];
161
+ }
162
+ line1 = '================================';
163
+ line2 = '--------------------------------';
164
+ _loop_1 = function (command) {
165
+ return __generator(this, function (_b) {
166
+ switch (_b.label) {
167
+ case 0:
168
+ console.info("".concat(line1, "\n\u2022 Run: ").concat(command, "\n").concat(line2));
169
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
170
+ var _a = command.split(' '), mainCommand = _a[0], args = _a.slice(1);
171
+ var proc = (0, child_process_1.spawn)(mainCommand, args);
172
+ proc.stdout.on('data', function (data) {
173
+ console.info('\x1b[1m', data.toString(), '\x1b[0m');
174
+ });
175
+ proc.stderr.on('data', function (data) {
176
+ console.error('\x1b[31m', data.toString(), '\x1b[0m');
177
+ });
178
+ proc.on('exit', function (code) {
179
+ if (code === 0) {
180
+ resolve();
181
+ }
182
+ else {
183
+ reject();
184
+ }
185
+ });
186
+ })];
187
+ case 1:
188
+ _b.sent();
189
+ console.info("".concat(line1, "\n\n"));
190
+ return [2 /*return*/];
191
+ }
192
+ });
193
+ };
194
+ _i = 0, commands_1 = commands;
195
+ _a.label = 1;
196
+ case 1:
197
+ if (!(_i < commands_1.length)) return [3 /*break*/, 4];
198
+ command = commands_1[_i];
199
+ return [5 /*yield**/, _loop_1(command)];
200
+ case 2:
201
+ _a.sent();
202
+ _a.label = 3;
203
+ case 3:
204
+ _i++;
205
+ return [3 /*break*/, 1];
206
+ case 4: return [2 /*return*/];
207
+ }
208
+ });
209
+ });
210
+ };
211
+ /**
212
+ * Приготовить подключение к целевому серверу (при необходимости построить цепочку туннелей)
213
+ * @param serverOptions
214
+ */
215
+ Delivery.prototype.createSshConnection = function (serverOptions) {
216
+ return __awaiter(this, void 0, void 0, function () {
217
+ var serversChain, dstConnectionTarget, tunnelsChain, i, gateServer, targetServer, prevTunnelAddress, tunnel, lastTunnelAddress, sshConnection;
218
+ var _this = this;
219
+ return __generator(this, function (_a) {
220
+ switch (_a.label) {
221
+ case 0:
222
+ process.stdout.write('• Prepare SSH connection... ');
223
+ serversChain = (function () {
224
+ var result = [];
225
+ var addServerToChain = function (server) {
226
+ result.push(server);
227
+ if (server.via) {
228
+ var viaServer = _this.options.servers[server.via];
229
+ if (!viaServer) {
230
+ throw new Error("via server \"".concat(server.via, "\" for dst server \"").concat(server.name, "\" not found"));
231
+ }
232
+ addServerToChain(viaServer);
233
+ }
234
+ };
235
+ addServerToChain(serverOptions);
236
+ return result;
237
+ })().reverse();
238
+ dstConnectionTarget = {
239
+ host: serverOptions.host,
240
+ port: serverOptions.port,
241
+ };
242
+ if (!(serversChain.length > 1)) return [3 /*break*/, 5];
243
+ tunnelsChain = [];
244
+ i = 0;
245
+ _a.label = 1;
246
+ case 1:
247
+ if (!(i <= serversChain.length - 2)) return [3 /*break*/, 4];
248
+ gateServer = serversChain[i];
249
+ targetServer = serversChain[i + 1];
250
+ if (i > 0) {
251
+ prevTunnelAddress = tunnelsChain[i - 1].address();
252
+ gateServer.host = prevTunnelAddress.address;
253
+ gateServer.port = prevTunnelAddress.port;
254
+ }
255
+ return [4 /*yield*/, (0, tunnel_1.default)({
256
+ username: gateServer.username,
257
+ password: gateServer.password,
258
+ host: gateServer.host,
259
+ port: gateServer.port,
260
+ dstHost: targetServer.host,
261
+ dstPort: targetServer.port,
262
+ localHost: '127.0.0.1',
263
+ localPort: 0,
264
+ })];
265
+ case 2:
266
+ tunnel = _a.sent();
267
+ tunnelsChain.push(tunnel);
268
+ _a.label = 3;
269
+ case 3:
270
+ i++;
271
+ return [3 /*break*/, 1];
272
+ case 4:
273
+ lastTunnelAddress = tunnelsChain[tunnelsChain.length - 1].address();
274
+ dstConnectionTarget.host = lastTunnelAddress.address;
275
+ dstConnectionTarget.port = lastTunnelAddress.port;
276
+ _a.label = 5;
277
+ case 5:
278
+ sshConnection = new ssh2_1.Client();
279
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
280
+ sshConnection
281
+ .on('ready', function () { return resolve(); })
282
+ // TODO on fail
283
+ .connect(__assign(__assign({}, serverOptions), dstConnectionTarget));
284
+ })];
285
+ case 6:
286
+ _a.sent();
287
+ process.stdout.write('DONE\n');
288
+ return [2 /*return*/, sshConnection];
289
+ }
290
+ });
291
+ });
292
+ };
293
+ /**
294
+ * Подготовить архив для загрузки
295
+ * @param taskOptions
296
+ */
297
+ Delivery.prototype.prepareUploadArchive = function (taskOptions) {
298
+ return __awaiter(this, void 0, void 0, function () {
299
+ var archivePath, srcPath, result;
300
+ return __generator(this, function (_a) {
301
+ switch (_a.label) {
302
+ case 0:
303
+ process.stdout.write('• Prepare archive... ');
304
+ archivePath = path_1.default.resolve(process.cwd(), "".concat((0, string_1.makeRandomFileName)(), ".tgz"));
305
+ srcPath = path_1.default.resolve(taskOptions.src.path);
306
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
307
+ tar.c({
308
+ gzip: true,
309
+ file: archivePath,
310
+ cwd: srcPath,
311
+ }, fs_1.default.readdirSync(srcPath), function (err) {
312
+ if (err) {
313
+ return reject(err);
314
+ }
315
+ return resolve(archivePath);
316
+ });
317
+ })];
318
+ case 1:
319
+ result = _a.sent();
320
+ process.stdout.write('DONE\n');
321
+ return [2 /*return*/, result];
322
+ }
323
+ });
324
+ });
325
+ };
326
+ /**
327
+ * Загрузить файл по SFTP
328
+ * @param sshConnection
329
+ * @param srcPath
330
+ * @param dstPath
331
+ */
332
+ Delivery.prototype.uploadFile = function (_a) {
333
+ var sshConnection = _a.sshConnection, srcPath = _a.srcPath, dstPath = _a.dstPath;
334
+ return __awaiter(this, void 0, void 0, function () {
335
+ return __generator(this, function (_b) {
336
+ switch (_b.label) {
337
+ case 0:
338
+ process.stdout.write('• Upload archive... ');
339
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
340
+ sshConnection.sftp(function (err, sftp) {
341
+ if (err) {
342
+ return reject(err);
343
+ }
344
+ var readStream = fs_1.default.createReadStream(srcPath);
345
+ var writeStream = sftp.createWriteStream(dstPath);
346
+ writeStream.on('close', function () {
347
+ resolve();
348
+ });
349
+ readStream.pipe(writeStream);
350
+ });
351
+ })];
352
+ case 1:
353
+ _b.sent();
354
+ process.stdout.write('DONE\n');
355
+ return [2 /*return*/];
356
+ }
357
+ });
358
+ });
359
+ };
360
+ Delivery.prototype.unpackArchiveOnRemoteServer = function (_a) {
361
+ var sshConnection = _a.sshConnection, archivePath = _a.archivePath, dstPath = _a.dstPath;
362
+ process.stdout.write('• Unpack archive on server: \n');
363
+ return new Promise(function (resolve, reject) {
364
+ sshConnection.exec("mkdir -p ".concat(dstPath, " && umask 0000 && mkdir -p ").concat(archivePath, "_extr\ntar zxf ").concat(archivePath, " -C ").concat(archivePath, "_extr && cp -r ").concat(archivePath, "_extr/* ").concat(dstPath, " && rm ").concat(archivePath, "* -rf &&\necho ").concat(dstPath, " && ls -alh ").concat(dstPath, " "), function (err, stream) {
365
+ if (err) {
366
+ return reject(err);
367
+ }
368
+ stream
369
+ .on('close', function () {
370
+ resolve();
371
+ })
372
+ .on('data', function (data) {
373
+ process.stdout.write(data);
374
+ })
375
+ .stderr.on('data', function (data) {
376
+ process.stderr.write(data);
377
+ });
378
+ });
379
+ });
380
+ };
381
+ return Delivery;
382
+ }());
383
+ exports.Delivery = Delivery;
384
+ //# sourceMappingURL=delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './delivery';
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("./delivery"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B"}
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" />
2
+ import { ConnectConfig } from 'ssh2';
3
+ import { Server } from 'net';
4
+ declare type TunnelConfig = ConnectConfig & {
5
+ dstHost: string;
6
+ dstPort: number;
7
+ localHost: string;
8
+ localPort: number;
9
+ srcHost: string;
10
+ srcPort: number;
11
+ };
12
+ declare function createTunnel(configArgs: Partial<TunnelConfig>): Promise<Server>;
13
+ export default createTunnel;
package/dist/tunnel.js ADDED
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ var net = __importStar(require("net"));
38
+ var events = __importStar(require("events"));
39
+ var ssh2_1 = require("ssh2");
40
+ function bindSSHConnection(config, netConnection) {
41
+ var sshConnection = new ssh2_1.Client();
42
+ netConnection.on('close', sshConnection.end.bind(sshConnection));
43
+ sshConnection.on('ready', function () {
44
+ netConnection.emit('sshConnection', sshConnection, netConnection);
45
+ sshConnection.forwardOut(config.srcHost, config.srcPort, config.dstHost, config.dstPort, function (err, sshStream) {
46
+ if (err) {
47
+ // Bubble up the error => netConnection => server
48
+ netConnection.emit('error', err);
49
+ return;
50
+ }
51
+ netConnection.emit('sshStream', sshStream);
52
+ netConnection.pipe(sshStream).pipe(netConnection);
53
+ });
54
+ });
55
+ return sshConnection;
56
+ }
57
+ function omit(obj, keys) {
58
+ return keys.reduce(function (copyObj, key) {
59
+ delete copyObj[key];
60
+ return copyObj;
61
+ }, Object.assign({}, obj));
62
+ }
63
+ function createServer(config) {
64
+ var connections = [];
65
+ var connectionCount = 0;
66
+ var server = net.createServer(function (netConnection) {
67
+ connectionCount++;
68
+ netConnection.on('error', function () {
69
+ server.emit('error');
70
+ });
71
+ netConnection.on('close', function () {
72
+ connectionCount--;
73
+ if (connectionCount === 0) {
74
+ setTimeout(function () {
75
+ if (connectionCount === 0) {
76
+ server.close();
77
+ }
78
+ }, 2);
79
+ }
80
+ });
81
+ server.emit('netConnection', netConnection, server);
82
+ var sshConnection = bindSSHConnection(config, netConnection);
83
+ sshConnection.on('error', function () {
84
+ server.emit('error');
85
+ });
86
+ netConnection.on('sshStream', function (sshStream) {
87
+ sshStream.on('error', function () {
88
+ server.close();
89
+ });
90
+ });
91
+ connections.push(sshConnection, netConnection);
92
+ try {
93
+ sshConnection.connect(omit(config, ['localPort', 'localHost']));
94
+ }
95
+ catch (error) {
96
+ server.emit('error', error);
97
+ }
98
+ });
99
+ server.on('close', function () {
100
+ connections.forEach(function (connection) {
101
+ connection.end();
102
+ });
103
+ });
104
+ return server;
105
+ }
106
+ function createTunnel(configArgs) {
107
+ return new Promise(function (resolve, reject) {
108
+ try {
109
+ var env = process.env;
110
+ var config = __assign({ username: env.TUNNELSSH_USER || env.USER || env.USERNAME || 'root', port: 22, srcPort: 0, srcHost: '127.0.0.1', dstHost: '127.0.0.1', dstPort: 22, localHost: '127.0.0.1', localPort: 0, agent: env.SSH_AUTH_SOCK }, configArgs);
111
+ var server_1 = createServer(config);
112
+ server_1.listen(config.localPort, config.localHost, function () {
113
+ resolve(server_1);
114
+ });
115
+ }
116
+ catch (error) {
117
+ var server_2 = new events.EventEmitter();
118
+ setImmediate(function () {
119
+ server_2.emit('error', error);
120
+ reject(error);
121
+ });
122
+ }
123
+ });
124
+ }
125
+ exports.default = createTunnel;
126
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { ConnectConfig } from 'ssh2';
2
+ export declare type ServerOptions = ConnectConfig & {
3
+ name: string;
4
+ via?: string;
5
+ };
6
+ export declare type TaskOptions = {
7
+ name: string;
8
+ before?: {
9
+ run: string[];
10
+ };
11
+ after?: {
12
+ run: string[];
13
+ };
14
+ src: {
15
+ path: string;
16
+ };
17
+ dst: {
18
+ server: string;
19
+ path: string;
20
+ };
21
+ };
22
+ export declare type DeliveryOptions = {
23
+ servers: Record<string, ServerOptions>;
24
+ tasks: Record<string, TaskOptions>;
25
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare const makeRandomFileName: (length?: number) => string;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRandomFileName = void 0;
4
+ var makeRandomFileName = function (length) {
5
+ if (length === void 0) { length = 10; }
6
+ var result = '';
7
+ var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
8
+ var charactersLength = characters.length;
9
+ for (var i = 0; i < length; i += 1) {
10
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
11
+ }
12
+ return "".concat(result, "_").concat(+new Date());
13
+ };
14
+ exports.makeRandomFileName = makeRandomFileName;
15
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":";;;AAAO,IAAM,kBAAkB,GAAG,UAAC,MAAW;IAAX,uBAAA,EAAA,WAAW;IAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAM,UAAU,GAAG,gEAAgE,CAAC;IACpF,IAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAClC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;KAC3E;IACD,OAAO,UAAG,MAAM,cAAI,CAAC,IAAI,IAAI,EAAE,CAAE,CAAC;AACpC,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="revalidator" />
2
+ import { DeliveryOptions } from './types';
3
+ export declare const validateConfig: (config: DeliveryOptions) => Revalidator.IReturnMessage;
@@ -0,0 +1,112 @@
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.validateConfig = void 0;
7
+ var revalidator_1 = __importDefault(require("revalidator"));
8
+ var validateConfig = function (config) {
9
+ return revalidator_1.default.validate(config, {
10
+ properties: {
11
+ servers: {
12
+ description: 'Servers',
13
+ type: 'object',
14
+ items: {
15
+ description: 'Server options',
16
+ type: 'object',
17
+ properties: {
18
+ alias: {
19
+ description: 'Alias',
20
+ type: 'string',
21
+ required: true,
22
+ },
23
+ host: {
24
+ description: 'Host',
25
+ type: 'string',
26
+ required: true,
27
+ },
28
+ port: {
29
+ description: 'Port',
30
+ type: 'number',
31
+ required: false,
32
+ },
33
+ },
34
+ },
35
+ },
36
+ tasks: {
37
+ description: 'Tasks',
38
+ type: 'object',
39
+ items: {
40
+ description: 'Task options',
41
+ type: 'object',
42
+ properties: {
43
+ alias: {
44
+ description: 'Task alias',
45
+ type: 'string',
46
+ required: true,
47
+ },
48
+ src: {
49
+ description: 'Source files options',
50
+ type: 'object',
51
+ required: true,
52
+ properties: {
53
+ path: {
54
+ description: 'Source files path',
55
+ type: 'string',
56
+ required: true,
57
+ },
58
+ },
59
+ },
60
+ dst: {
61
+ description: 'Destination files options',
62
+ type: 'object',
63
+ required: true,
64
+ properties: {
65
+ path: {
66
+ description: 'Destination files path on remote server',
67
+ type: 'string',
68
+ required: true,
69
+ },
70
+ server: {
71
+ description: 'Destination server name',
72
+ type: 'string',
73
+ required: true,
74
+ },
75
+ },
76
+ },
77
+ before: {
78
+ description: 'Commands before upload',
79
+ type: 'object',
80
+ required: false,
81
+ properties: {
82
+ run: {
83
+ description: 'Commands to run array',
84
+ type: 'array',
85
+ items: {
86
+ type: 'string',
87
+ },
88
+ },
89
+ },
90
+ },
91
+ after: {
92
+ description: 'Commands after upload',
93
+ type: 'object',
94
+ required: false,
95
+ properties: {
96
+ run: {
97
+ description: 'Commands to run array',
98
+ type: 'array',
99
+ items: {
100
+ type: 'string',
101
+ },
102
+ },
103
+ },
104
+ },
105
+ },
106
+ },
107
+ },
108
+ },
109
+ });
110
+ };
111
+ exports.validateConfig = validateConfig;
112
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":";;;;;;AACA,4DAAsC;AAE/B,IAAM,cAAc,GAAG,UAAC,MAAuB;IACpD,OAAO,qBAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;QAClC,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE;oBACL,WAAW,EAAE,gBAAgB;oBAC7B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,WAAW,EAAE,OAAO;4BACpB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;yBACf;wBACD,IAAI,EAAE;4BACJ,WAAW,EAAE,MAAM;4BACnB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;yBACf;wBACD,IAAI,EAAE;4BACJ,WAAW,EAAE,MAAM;4BACnB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,KAAK;yBAChB;qBACF;iBACF;aACF;YACD,KAAK,EAAE;gBACL,WAAW,EAAE,OAAO;gBACpB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE;oBACL,WAAW,EAAE,cAAc;oBAC3B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE;4BACL,WAAW,EAAE,YAAY;4BACzB,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;yBACf;wBACD,GAAG,EAAE;4BACH,WAAW,EAAE,sBAAsB;4BACnC,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE;gCACV,IAAI,EAAE;oCACJ,WAAW,EAAE,mBAAmB;oCAChC,IAAI,EAAE,QAAQ;oCACd,QAAQ,EAAE,IAAI;iCACf;6BACF;yBACF;wBACD,GAAG,EAAE;4BACH,WAAW,EAAE,2BAA2B;4BACxC,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE;gCACV,IAAI,EAAE;oCACJ,WAAW,EAAE,yCAAyC;oCACtD,IAAI,EAAE,QAAQ;oCACd,QAAQ,EAAE,IAAI;iCACf;gCACD,MAAM,EAAE;oCACN,WAAW,EAAE,yBAAyB;oCACtC,IAAI,EAAE,QAAQ;oCACd,QAAQ,EAAE,IAAI;iCACf;6BACF;yBACF;wBACD,MAAM,EAAE;4BACN,WAAW,EAAE,wBAAwB;4BACrC,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE;gCACV,GAAG,EAAE;oCACH,WAAW,EAAE,uBAAuB;oCACpC,IAAI,EAAE,OAAO;oCACb,KAAK,EAAE;wCACL,IAAI,EAAE,QAAQ;qCACf;iCACF;6BACF;yBACF;wBACD,KAAK,EAAE;4BACL,WAAW,EAAE,uBAAuB;4BACpC,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE;gCACV,GAAG,EAAE;oCACH,WAAW,EAAE,uBAAuB;oCACpC,IAAI,EAAE,OAAO;oCACb,KAAK,EAAE;wCACL,IAAI,EAAE,QAAQ;qCACf;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAtGW,QAAA,cAAc,kBAsGzB"}
package/package.json CHANGED
@@ -1,11 +1,54 @@
1
1
  {
2
2
  "name": "ssh-delivery",
3
- "version": "0.0.1",
4
- "description": "",
5
- "main": "index.js",
3
+ "version": "0.2.2",
4
+ "author": "Avin Lambrero",
5
+ "main": "./dist/index.js",
6
+ "bin": {
7
+ "d": "./dist/cli.js",
8
+ "delivery": "./dist/cli.js"
9
+ },
10
+ "types": "./dist/index.d.ts",
6
11
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
12
+ "build": "tsc",
13
+ "start": "ts-node ./src/cli.ts",
14
+ "prepublishOnly": "npm run build",
15
+ "format": "prettier --write \"**/*.{js,ts,md,cjs}\" -c"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/avin/ssh-delivery.git"
24
+ },
25
+ "keywords": [
26
+ "ssh",
27
+ "sftp",
28
+ "upload"
29
+ ],
30
+ "devDependencies": {
31
+ "@types/node": "^17.0.42",
32
+ "@types/ssh2": "^0.5.52",
33
+ "@types/tar": "^6.1.1",
34
+ "@types/yargs": "^17.0.10",
35
+ "@types/lodash": "^4.14.182",
36
+ "@types/revalidator": "^0.3.8",
37
+ "@typescript-eslint/eslint-plugin": "^5.27.1",
38
+ "@typescript-eslint/parser": "^5.27.1",
39
+ "eslint": "^8.17.0",
40
+ "prettier": "^2.6.2",
41
+ "ts-node": "^10.8.1",
42
+ "typescript": "^4.7.3"
43
+ },
44
+ "volta": {
45
+ "node": "16.13.2"
8
46
  },
9
- "author": "a.vinogradov",
10
- "license": "ISC"
47
+ "dependencies": {
48
+ "lodash": "^4.17.21",
49
+ "revalidator": "^0.3.1",
50
+ "ssh2": "^1.11.0",
51
+ "tar": "^6.1.11",
52
+ "yargs": "^17.5.1"
53
+ }
11
54
  }