@sasjs/cli 3.19.6 → 3.20.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/build/commands/compile/spec/compile.spec.js +2 -1
- package/build/commands/deploy/deploy.js +54 -108
- package/build/commands/deploy/spec/cbd.spec.js +31 -8
- package/build/commands/fs/fsCommand.d.ts +11 -0
- package/build/commands/fs/fsCommand.js +335 -0
- package/build/commands/fs/internal/executeCode.d.ts +4 -0
- package/build/commands/fs/internal/executeCode.js +126 -0
- package/build/commands/fs/internal/extractHashArray.d.ts +1 -0
- package/build/commands/fs/internal/extractHashArray.js +20 -0
- package/build/commands/fs/spec/executeCode.spec.d.ts +1 -0
- package/build/commands/fs/spec/executeCode.spec.js +197 -0
- package/build/commands/fs/spec/extractHashArray.spec.d.ts +1 -0
- package/build/commands/fs/spec/extractHashArray.spec.js +14 -0
- package/build/commands/fs/spec/fsCommand.spec.d.ts +1 -0
- package/build/commands/fs/spec/fsCommand.spec.js +297 -0
- package/build/commands/help/help.js +14 -0
- package/build/commands/job/internal/execute/sas9.d.ts +1 -1
- package/build/commands/job/internal/execute/sasjs.d.ts +3 -4
- package/build/commands/job/internal/execute/sasjs.js +36 -20
- package/build/commands/job/jobCommand.d.ts +4 -8
- package/build/commands/job/jobCommand.js +71 -97
- package/build/commands/job/spec/execute.spec.js +52 -7
- package/build/commands/job/spec/jobCommand.spec.js +8 -3
- package/build/commands/request/spec/request.spec.server.sas9.js +2 -0
- package/build/commands/run/run.js +70 -107
- package/build/types/command/commandFactory.js +2 -0
- package/build/utils/config.d.ts +28 -1
- package/build/utils/config.js +71 -1
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.js +1 -0
- package/package.json +8 -7
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
33
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
34
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
35
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
36
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
37
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
38
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
42
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
43
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
44
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
45
|
+
function step(op) {
|
|
46
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
47
|
+
while (_) try {
|
|
48
|
+
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;
|
|
49
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
50
|
+
switch (op[0]) {
|
|
51
|
+
case 0: case 1: t = op; break;
|
|
52
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
53
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
54
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
55
|
+
default:
|
|
56
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
57
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
58
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
59
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
60
|
+
if (t[2]) _.ops.pop();
|
|
61
|
+
_.trys.pop(); continue;
|
|
62
|
+
}
|
|
63
|
+
op = body.call(thisArg, _);
|
|
64
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
65
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
69
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
70
|
+
};
|
|
71
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
72
|
+
var node_1 = __importDefault(require("@sasjs/adapter/node"));
|
|
73
|
+
var utils_1 = require("@sasjs/utils");
|
|
74
|
+
var executeCode_1 = require("../internal/executeCode");
|
|
75
|
+
var configUtils = __importStar(require("../../../utils/config"));
|
|
76
|
+
var utilsModule = __importStar(require("../../../utils/utils"));
|
|
77
|
+
var targetConfig = {
|
|
78
|
+
name: 'test',
|
|
79
|
+
appLoc: '/Public/test/',
|
|
80
|
+
serverType: utils_1.ServerType.Sasjs
|
|
81
|
+
};
|
|
82
|
+
var authConfig = {
|
|
83
|
+
access_token: '',
|
|
84
|
+
refresh_token: '',
|
|
85
|
+
client: '',
|
|
86
|
+
secret: ''
|
|
87
|
+
};
|
|
88
|
+
var mockedResponse = {
|
|
89
|
+
log: 'mocked response'
|
|
90
|
+
};
|
|
91
|
+
describe('executeCode', function () {
|
|
92
|
+
beforeAll(function () {
|
|
93
|
+
process.projectDir = __dirname;
|
|
94
|
+
});
|
|
95
|
+
describe('on viya', function () {
|
|
96
|
+
var target = new utils_1.Target(__assign(__assign({}, targetConfig), { serverType: utils_1.ServerType.SasViya }));
|
|
97
|
+
beforeEach(function () {
|
|
98
|
+
mockGetSASjsAndAuthConfig(target);
|
|
99
|
+
jest
|
|
100
|
+
.spyOn(node_1.default.prototype, 'executeScript')
|
|
101
|
+
.mockImplementation(function () { return Promise.resolve(mockedResponse); });
|
|
102
|
+
});
|
|
103
|
+
it('should execute code on SASViya', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
104
|
+
var result;
|
|
105
|
+
return __generator(this, function (_a) {
|
|
106
|
+
switch (_a.label) {
|
|
107
|
+
case 0: return [4 /*yield*/, (0, executeCode_1.executeCode)(target, '')];
|
|
108
|
+
case 1:
|
|
109
|
+
result = _a.sent();
|
|
110
|
+
expect(result).toEqual(mockedResponse);
|
|
111
|
+
return [2 /*return*/];
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}); });
|
|
115
|
+
});
|
|
116
|
+
describe('on sas9', function () {
|
|
117
|
+
var target = new utils_1.Target(__assign(__assign({}, targetConfig), { serverType: utils_1.ServerType.Sas9 }));
|
|
118
|
+
beforeEach(function () {
|
|
119
|
+
mockExecuteScript();
|
|
120
|
+
jest.spyOn(configUtils, 'getSASjsAndAuthConfig').mockImplementation(function () {
|
|
121
|
+
return Promise.resolve({
|
|
122
|
+
sasjs: configUtils.getSASjs(target),
|
|
123
|
+
authConfigSas9: {
|
|
124
|
+
userName: '',
|
|
125
|
+
password: ''
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it('should execute code on SAS9', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
131
|
+
var result;
|
|
132
|
+
return __generator(this, function (_a) {
|
|
133
|
+
switch (_a.label) {
|
|
134
|
+
case 0: return [4 /*yield*/, (0, executeCode_1.executeCode)(target, '')];
|
|
135
|
+
case 1:
|
|
136
|
+
result = _a.sent();
|
|
137
|
+
expect(result).toEqual(mockedResponse);
|
|
138
|
+
return [2 /*return*/];
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}); });
|
|
142
|
+
});
|
|
143
|
+
describe('on sasjs', function () {
|
|
144
|
+
var target = new utils_1.Target(__assign(__assign({}, targetConfig), { serverType: utils_1.ServerType.Sasjs }));
|
|
145
|
+
beforeEach(function () {
|
|
146
|
+
mockExecuteScript();
|
|
147
|
+
});
|
|
148
|
+
it('should execute code on SASjs Server when running in desktop mode', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
149
|
+
var result;
|
|
150
|
+
return __generator(this, function (_a) {
|
|
151
|
+
switch (_a.label) {
|
|
152
|
+
case 0:
|
|
153
|
+
jest
|
|
154
|
+
.spyOn(utilsModule, 'isSasJsServerInServerMode')
|
|
155
|
+
.mockImplementation(function () { return Promise.resolve(false); });
|
|
156
|
+
return [4 /*yield*/, (0, executeCode_1.executeCode)(target, '')];
|
|
157
|
+
case 1:
|
|
158
|
+
result = _a.sent();
|
|
159
|
+
expect(result).toEqual(mockedResponse);
|
|
160
|
+
return [2 /*return*/];
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}); });
|
|
164
|
+
it('should execute code on SASjs Server when running in server mode', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
165
|
+
var result;
|
|
166
|
+
return __generator(this, function (_a) {
|
|
167
|
+
switch (_a.label) {
|
|
168
|
+
case 0:
|
|
169
|
+
jest
|
|
170
|
+
.spyOn(utilsModule, 'isSasJsServerInServerMode')
|
|
171
|
+
.mockImplementation(function () { return Promise.resolve(true); });
|
|
172
|
+
jest
|
|
173
|
+
.spyOn(configUtils, 'getAuthConfig')
|
|
174
|
+
.mockImplementation(function () { return Promise.resolve(authConfig); });
|
|
175
|
+
return [4 /*yield*/, (0, executeCode_1.executeCode)(target, '')];
|
|
176
|
+
case 1:
|
|
177
|
+
result = _a.sent();
|
|
178
|
+
expect(result).toEqual(mockedResponse);
|
|
179
|
+
return [2 /*return*/];
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}); });
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
var mockExecuteScript = function () {
|
|
186
|
+
jest
|
|
187
|
+
.spyOn(node_1.default.prototype, 'executeScript')
|
|
188
|
+
.mockImplementation(function () { return Promise.resolve(mockedResponse.log); });
|
|
189
|
+
};
|
|
190
|
+
var mockGetSASjsAndAuthConfig = function (target) {
|
|
191
|
+
jest.spyOn(configUtils, 'getSASjsAndAuthConfig').mockImplementation(function () {
|
|
192
|
+
return Promise.resolve({
|
|
193
|
+
sasjs: configUtils.getSASjs(target),
|
|
194
|
+
authConfig: authConfig
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var extractHashArray_1 = require("../internal/extractHashArray");
|
|
4
|
+
var log = "\n>>weboutBEGIN<<\n{\n \"hashes\": [{\n \"FILE_HASH\": \"someCharacters\",\n \"FILE_PATH\": \"path/to/folder/file\"\n }]\n}\n>>weboutEND<<\n";
|
|
5
|
+
var logWithInvalidJsonInWebout = "\n>>weboutBEGIN<<\n{\n \"invalid Json\"\n}\n>>weboutEND<<\n";
|
|
6
|
+
describe('extractHashArray', function () {
|
|
7
|
+
it('should extract hashed array from webout', function () {
|
|
8
|
+
var hashes = (0, extractHashArray_1.extractHashArray)(log);
|
|
9
|
+
expect(hashes).toBeArrayOfSize(1);
|
|
10
|
+
});
|
|
11
|
+
it('should throw error when log does not contain webout', function () {
|
|
12
|
+
expect(function () { return (0, extractHashArray_1.extractHashArray)(logWithInvalidJsonInWebout); }).toThrow('An error occurred while extracting hashes array from webout.');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
31
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
32
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
33
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
34
|
+
function step(op) {
|
|
35
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
36
|
+
while (_) try {
|
|
37
|
+
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;
|
|
38
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
39
|
+
switch (op[0]) {
|
|
40
|
+
case 0: case 1: t = op; break;
|
|
41
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
42
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
43
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
44
|
+
default:
|
|
45
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
46
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
47
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
48
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
49
|
+
if (t[2]) _.ops.pop();
|
|
50
|
+
_.trys.pop(); continue;
|
|
51
|
+
}
|
|
52
|
+
op = body.call(thisArg, _);
|
|
53
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
54
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
58
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
59
|
+
if (!m) return o;
|
|
60
|
+
var i = m.call(o), r, ar = [], e;
|
|
61
|
+
try {
|
|
62
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
63
|
+
}
|
|
64
|
+
catch (error) { e = { error: error }; }
|
|
65
|
+
finally {
|
|
66
|
+
try {
|
|
67
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
68
|
+
}
|
|
69
|
+
finally { if (e) throw e.error; }
|
|
70
|
+
}
|
|
71
|
+
return ar;
|
|
72
|
+
};
|
|
73
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
74
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
75
|
+
if (ar || !(i in from)) {
|
|
76
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
77
|
+
ar[i] = from[i];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
81
|
+
};
|
|
82
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
83
|
+
var utils_1 = require("@sasjs/utils");
|
|
84
|
+
var command_1 = require("../../../types/command");
|
|
85
|
+
var fsCommand_1 = require("../fsCommand");
|
|
86
|
+
var utils_2 = require("../../../utils");
|
|
87
|
+
var FSModule = __importStar(require("@sasjs/utils/fs"));
|
|
88
|
+
var FileModule = __importStar(require("@sasjs/utils/file"));
|
|
89
|
+
var configUtils = __importStar(require("../../../utils/config"));
|
|
90
|
+
var executeCodeModule = __importStar(require("../internal/executeCode"));
|
|
91
|
+
var extractHashArrayModule = __importStar(require("../internal/extractHashArray"));
|
|
92
|
+
var defaultArgs = ['node', 'sasjs', 'fs'];
|
|
93
|
+
var target = new utils_1.Target({
|
|
94
|
+
name: 'test',
|
|
95
|
+
appLoc: '/Public/test/',
|
|
96
|
+
serverType: utils_1.ServerType.Sasjs
|
|
97
|
+
});
|
|
98
|
+
describe('FSCommand', function () {
|
|
99
|
+
beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
100
|
+
return __generator(this, function (_a) {
|
|
101
|
+
switch (_a.label) {
|
|
102
|
+
case 0: return [4 /*yield*/, (0, utils_2.setConstants)()];
|
|
103
|
+
case 1:
|
|
104
|
+
_a.sent();
|
|
105
|
+
process.projectDir = __dirname;
|
|
106
|
+
return [2 /*return*/];
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}); });
|
|
110
|
+
describe('compile', function () {
|
|
111
|
+
beforeEach(function () {
|
|
112
|
+
jest
|
|
113
|
+
.spyOn(FSModule, 'generateCompileProgram')
|
|
114
|
+
.mockImplementation(function () { return Promise.resolve(''); });
|
|
115
|
+
process.logger = new utils_1.Logger(utils_1.LogLevel.Off);
|
|
116
|
+
jest.spyOn(process.logger, 'error');
|
|
117
|
+
});
|
|
118
|
+
it('should compile a sas program for creating a copy of local folder on remote server', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
119
|
+
var returnCode;
|
|
120
|
+
return __generator(this, function (_a) {
|
|
121
|
+
switch (_a.label) {
|
|
122
|
+
case 0:
|
|
123
|
+
jest
|
|
124
|
+
.spyOn(FileModule, 'createFile')
|
|
125
|
+
.mockImplementation(function () { return Promise.resolve(); });
|
|
126
|
+
return [4 /*yield*/, executeCommandWrapper([
|
|
127
|
+
'compile',
|
|
128
|
+
'localFolder',
|
|
129
|
+
'-o',
|
|
130
|
+
'compiledProgram'
|
|
131
|
+
])];
|
|
132
|
+
case 1:
|
|
133
|
+
returnCode = _a.sent();
|
|
134
|
+
expect(returnCode).toEqual(command_1.ReturnCode.Success);
|
|
135
|
+
return [2 /*return*/];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}); });
|
|
139
|
+
it('should display an error message', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
140
|
+
var returnCode;
|
|
141
|
+
return __generator(this, function (_a) {
|
|
142
|
+
switch (_a.label) {
|
|
143
|
+
case 0:
|
|
144
|
+
jest
|
|
145
|
+
.spyOn(FileModule, 'createFile')
|
|
146
|
+
.mockImplementation(function () { return Promise.reject(); });
|
|
147
|
+
return [4 /*yield*/, executeCommandWrapper(['compile', 'localFolder'])];
|
|
148
|
+
case 1:
|
|
149
|
+
returnCode = _a.sent();
|
|
150
|
+
expect(returnCode).toEqual(command_1.ReturnCode.InternalError);
|
|
151
|
+
expect(process.logger.error).toHaveBeenCalledWith('An error has occurred when creating program file.\n');
|
|
152
|
+
return [2 /*return*/];
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}); });
|
|
156
|
+
});
|
|
157
|
+
describe('sync', function () {
|
|
158
|
+
beforeEach(function () {
|
|
159
|
+
process.logger = new utils_1.Logger(utils_1.LogLevel.Off);
|
|
160
|
+
jest.spyOn(process.logger, 'info');
|
|
161
|
+
jest
|
|
162
|
+
.spyOn(FileModule, 'createFile')
|
|
163
|
+
.mockImplementation(function () { return Promise.resolve(); });
|
|
164
|
+
jest
|
|
165
|
+
.spyOn(configUtils, 'findTargetInConfiguration')
|
|
166
|
+
.mockImplementation(function () {
|
|
167
|
+
return Promise.resolve({ target: target, isLocal: true });
|
|
168
|
+
});
|
|
169
|
+
jest
|
|
170
|
+
.spyOn(FSModule, 'generateProgramToGetRemoteHash')
|
|
171
|
+
.mockImplementation(function () { return Promise.resolve(''); });
|
|
172
|
+
jest
|
|
173
|
+
.spyOn(FSModule, 'generateProgramToSyncHashDiff')
|
|
174
|
+
.mockImplementation(function () { return Promise.resolve(''); });
|
|
175
|
+
jest
|
|
176
|
+
.spyOn(executeCodeModule, 'executeCode')
|
|
177
|
+
.mockImplementation(function () { return Promise.resolve({ log: '' }); });
|
|
178
|
+
jest.spyOn(FSModule, 'getHash').mockImplementation(function () {
|
|
179
|
+
return Promise.resolve({
|
|
180
|
+
absolutePath: '',
|
|
181
|
+
relativePath: '',
|
|
182
|
+
hash: '',
|
|
183
|
+
isFile: false,
|
|
184
|
+
members: []
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
jest.spyOn(FSModule, 'compareHashes').mockImplementation(function () { return ({
|
|
188
|
+
absolutePath: '',
|
|
189
|
+
relativePath: '',
|
|
190
|
+
hash: '',
|
|
191
|
+
isFile: false,
|
|
192
|
+
members: []
|
|
193
|
+
}); });
|
|
194
|
+
});
|
|
195
|
+
it('should sync a local folder with folder on remote server', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
196
|
+
var returnCode;
|
|
197
|
+
return __generator(this, function (_a) {
|
|
198
|
+
switch (_a.label) {
|
|
199
|
+
case 0:
|
|
200
|
+
jest
|
|
201
|
+
.spyOn(extractHashArrayModule, 'extractHashArray')
|
|
202
|
+
.mockImplementationOnce(function () { return [
|
|
203
|
+
{
|
|
204
|
+
FILE_PATH: 'mocked-file',
|
|
205
|
+
FILE_HASH: 'hashOfMockedFile'
|
|
206
|
+
}
|
|
207
|
+
]; });
|
|
208
|
+
jest
|
|
209
|
+
.spyOn(extractHashArrayModule, 'extractHashArray')
|
|
210
|
+
.mockImplementationOnce(function () { return [
|
|
211
|
+
{
|
|
212
|
+
FILE_PATH: 'synced-file',
|
|
213
|
+
FILE_HASH: 'hashOfSyncedFile'
|
|
214
|
+
}
|
|
215
|
+
]; });
|
|
216
|
+
return [4 /*yield*/, executeCommandWrapper([
|
|
217
|
+
'sync',
|
|
218
|
+
'localFolder',
|
|
219
|
+
'remoteFolder'
|
|
220
|
+
])];
|
|
221
|
+
case 1:
|
|
222
|
+
returnCode = _a.sent();
|
|
223
|
+
expect(returnCode).toEqual(command_1.ReturnCode.Success);
|
|
224
|
+
expect(process.logger.info).toHaveBeenCalledWith('generating program to get remote hash');
|
|
225
|
+
expect(process.logger.info).toHaveBeenCalledWith('executing program to get remote hash');
|
|
226
|
+
expect(process.logger.info).toHaveBeenCalledWith('extracting hashes from log');
|
|
227
|
+
expect(process.logger.info).toHaveBeenCalledWith('creating the hash of local folder');
|
|
228
|
+
expect(process.logger.info).toHaveBeenCalledWith('Extract differences from local and remote hash');
|
|
229
|
+
expect(process.logger.info).toHaveBeenCalledWith('generating program to sync differences');
|
|
230
|
+
expect(process.logger.info).toHaveBeenCalledWith('executing program to sync differences');
|
|
231
|
+
return [2 /*return*/];
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}); });
|
|
235
|
+
it('should not execute sync program when local and remote folders are already in sync', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
236
|
+
var returnCode;
|
|
237
|
+
return __generator(this, function (_a) {
|
|
238
|
+
switch (_a.label) {
|
|
239
|
+
case 0:
|
|
240
|
+
jest
|
|
241
|
+
.spyOn(extractHashArrayModule, 'extractHashArray')
|
|
242
|
+
.mockImplementation(function () { return [
|
|
243
|
+
{
|
|
244
|
+
FILE_PATH: 'mocked-file',
|
|
245
|
+
FILE_HASH: 'hashOfMockedFile'
|
|
246
|
+
}
|
|
247
|
+
]; });
|
|
248
|
+
jest.spyOn(FSModule, 'getHash').mockImplementation(function () {
|
|
249
|
+
return Promise.resolve({
|
|
250
|
+
absolutePath: '',
|
|
251
|
+
relativePath: FileModule.getRelativePath('remoteFolder', 'mocked-file'),
|
|
252
|
+
hash: 'hashOfMockedFile',
|
|
253
|
+
isFile: true,
|
|
254
|
+
members: []
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
return [4 /*yield*/, executeCommandWrapper([
|
|
258
|
+
'sync',
|
|
259
|
+
'localFolder',
|
|
260
|
+
'remoteFolder'
|
|
261
|
+
])];
|
|
262
|
+
case 1:
|
|
263
|
+
returnCode = _a.sent();
|
|
264
|
+
expect(returnCode).toEqual(command_1.ReturnCode.Success);
|
|
265
|
+
expect(process.logger.info).toHaveBeenCalledWith('There are no differences between Remote and Local directory. Already synced.');
|
|
266
|
+
return [2 /*return*/];
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}); });
|
|
270
|
+
});
|
|
271
|
+
describe('invalid subCommand', function () {
|
|
272
|
+
it('should return ReturnCode.InvalidCommand when subCommand is unknown', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
273
|
+
var returnCode;
|
|
274
|
+
return __generator(this, function (_a) {
|
|
275
|
+
switch (_a.label) {
|
|
276
|
+
case 0: return [4 /*yield*/, executeCommandWrapper(['subCommand'])];
|
|
277
|
+
case 1:
|
|
278
|
+
returnCode = _a.sent();
|
|
279
|
+
expect(returnCode).toEqual(command_1.ReturnCode.InvalidCommand);
|
|
280
|
+
return [2 /*return*/];
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}); });
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
var executeCommandWrapper = function (additionalParams) { return __awaiter(void 0, void 0, void 0, function () {
|
|
287
|
+
var args, command;
|
|
288
|
+
return __generator(this, function (_a) {
|
|
289
|
+
switch (_a.label) {
|
|
290
|
+
case 0:
|
|
291
|
+
args = __spreadArray(__spreadArray([], __read(defaultArgs), false), __read(additionalParams), false);
|
|
292
|
+
command = new fsCommand_1.FSCommand(args);
|
|
293
|
+
return [4 /*yield*/, command.execute()];
|
|
294
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}); };
|
|
@@ -246,6 +246,20 @@ function printHelpText() {
|
|
|
246
246
|
"[2spaces]command example: sasjs folder move /Public/sourceFolder /Public/targetFolder --target targetName"
|
|
247
247
|
]
|
|
248
248
|
},
|
|
249
|
+
{
|
|
250
|
+
name: 'fs',
|
|
251
|
+
title: 'fs <command>',
|
|
252
|
+
description: [
|
|
253
|
+
"Handles operations around file system synchronisation.",
|
|
254
|
+
"* ".concat(chalk_1.default.cyanBright('sync'), " - Synchronise the remote SAS file system with the local project folder according to the target 'syncDirectories' array."),
|
|
255
|
+
"[2spaces]command example: sasjs fs sync /Public/localFolder /Public/remoteFolder",
|
|
256
|
+
"",
|
|
257
|
+
"* ".concat(chalk_1.default.cyanBright('compile'), " - Compiles a SAS program with the contents of a local directory."),
|
|
258
|
+
"[2spaces]command example: sasjs fs compile /Public/folder --output ./outputProgram",
|
|
259
|
+
"",
|
|
260
|
+
"[2spaces]NOTE: If output flag (-o or --output) is not provided, output will be stored in './fs-compile/{timestamp}' directory relative to working directory."
|
|
261
|
+
]
|
|
262
|
+
},
|
|
249
263
|
{
|
|
250
264
|
name: 'job',
|
|
251
265
|
title: 'job <command>',
|
|
@@ -9,6 +9,6 @@ import SASjs from '@sasjs/adapter/node';
|
|
|
9
9
|
* @param {string | undefined} source - An optional path to a JSON file containing input macro variables.
|
|
10
10
|
*/
|
|
11
11
|
export declare function executeJobSas9(sasjs: SASjs, config: {
|
|
12
|
-
|
|
12
|
+
userName: string;
|
|
13
13
|
password: string;
|
|
14
14
|
}, jobPath: string, logFile?: string, output?: string, source?: string): Promise<any>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export declare function executeJobSasjs(sasjs: SASjs, jobPath: string, logFile?: string, output?: string, authConfig?: AuthConfig): Promise<{
|
|
1
|
+
import { Target } from '@sasjs/utils';
|
|
2
|
+
export declare function executeJobSasjs(target: Target, jobPath: string, logFile?: string, output?: string): Promise<{
|
|
4
3
|
result: any;
|
|
5
4
|
log: any;
|
|
6
|
-
}
|
|
5
|
+
}>;
|
|
@@ -37,31 +37,47 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.executeJobSasjs = void 0;
|
|
40
|
-
var
|
|
41
|
-
|
|
40
|
+
var node_1 = require("@sasjs/adapter/node");
|
|
41
|
+
var utils_1 = require("../../../../utils");
|
|
42
|
+
var utils_2 = require("../utils");
|
|
43
|
+
function executeJobSasjs(target, jobPath, logFile, output) {
|
|
44
|
+
var _a;
|
|
42
45
|
return __awaiter(this, void 0, void 0, function () {
|
|
43
|
-
var response;
|
|
44
|
-
return __generator(this, function (
|
|
45
|
-
switch (
|
|
46
|
-
case 0: return [4 /*yield*/,
|
|
47
|
-
_program: jobPath
|
|
48
|
-
}, authConfig)];
|
|
46
|
+
var authConfig, _b, sasjsApiClient, response;
|
|
47
|
+
return __generator(this, function (_c) {
|
|
48
|
+
switch (_c.label) {
|
|
49
|
+
case 0: return [4 /*yield*/, (0, utils_1.isSasJsServerInServerMode)(target)];
|
|
49
50
|
case 1:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
process.logger.success('Job executed successfully!');
|
|
53
|
-
if (!(!!logFile && response.log)) return [3 /*break*/, 3];
|
|
54
|
-
return [4 /*yield*/, (0, utils_1.saveLog)(response.log, logFile, jobPath, false)];
|
|
51
|
+
if (!(_c.sent())) return [3 /*break*/, 3];
|
|
52
|
+
return [4 /*yield*/, (0, utils_1.getAuthConfig)(target)];
|
|
55
53
|
case 2:
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
_b = _c.sent();
|
|
55
|
+
return [3 /*break*/, 4];
|
|
58
56
|
case 3:
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
_b = undefined;
|
|
58
|
+
_c.label = 4;
|
|
61
59
|
case 4:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
authConfig = _b;
|
|
61
|
+
sasjsApiClient = new node_1.SASjsApiClient(new node_1.SasjsRequestClient(target.serverUrl, target.httpsAgentOptions));
|
|
62
|
+
return [4 /*yield*/, sasjsApiClient.executeJob({
|
|
63
|
+
_program: jobPath
|
|
64
|
+
}, target.appLoc, authConfig)];
|
|
65
|
+
case 5:
|
|
66
|
+
response = _c.sent();
|
|
67
|
+
if (!response) return [3 /*break*/, 9];
|
|
68
|
+
(_a = process.logger) === null || _a === void 0 ? void 0 : _a.success('Job executed successfully!');
|
|
69
|
+
if (!(!!logFile && response.log)) return [3 /*break*/, 7];
|
|
70
|
+
return [4 /*yield*/, (0, utils_2.saveLog)(response.log, logFile, jobPath, false)];
|
|
71
|
+
case 6:
|
|
72
|
+
_c.sent();
|
|
73
|
+
_c.label = 7;
|
|
74
|
+
case 7:
|
|
75
|
+
if (!(!!output && response.result)) return [3 /*break*/, 9];
|
|
76
|
+
return [4 /*yield*/, (0, utils_2.saveOutput)(response.result, output, false)];
|
|
77
|
+
case 8:
|
|
78
|
+
_c.sent();
|
|
79
|
+
_c.label = 9;
|
|
80
|
+
case 9: return [2 /*return*/, response];
|
|
65
81
|
}
|
|
66
82
|
});
|
|
67
83
|
});
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { AuthConfig, Target } from '@sasjs/utils';
|
|
1
|
+
import { Target } from '@sasjs/utils';
|
|
3
2
|
import { ReturnCode } from '../../types/command';
|
|
4
3
|
import { TargetCommand } from '../../types/command/targetCommand';
|
|
5
4
|
export declare class JobCommand extends TargetCommand {
|
|
6
5
|
private jobSubCommands;
|
|
7
6
|
constructor(args: string[]);
|
|
8
7
|
execute(): Promise<ReturnCode>;
|
|
9
|
-
executeJobSasjs(
|
|
10
|
-
executeJobSas9(
|
|
11
|
-
|
|
12
|
-
password: string;
|
|
13
|
-
}): Promise<ReturnCode>;
|
|
14
|
-
executeJobViya(target: Target, sasjs: SASjs, authConfig: AuthConfig): Promise<ReturnCode>;
|
|
8
|
+
executeJobSasjs(target: Target): Promise<ReturnCode>;
|
|
9
|
+
executeJobSas9(target: Target): Promise<ReturnCode>;
|
|
10
|
+
executeJobViya(target: Target): Promise<ReturnCode>;
|
|
15
11
|
}
|