@sasjs/cli 4.4.1 → 4.5.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/build/commands/compile/internal/compileTestFile.d.ts +2 -2
- package/build/commands/compile/internal/compileTestFile.js +5 -5
- package/build/commands/compile/internal/spec/compileTestFile.spec.js +1 -1
- package/build/commands/help/help.js +4 -4
- package/build/commands/job/internal/execute/sas9.js +21 -11
- package/build/commands/job/internal/execute/sasjs.d.ts +8 -0
- package/build/commands/job/internal/execute/sasjs.js +13 -2
- package/build/commands/job/internal/execute/viya.d.ts +9 -4
- package/build/commands/job/internal/execute/viya.js +70 -45
- package/build/commands/job/internal/utils.d.ts +13 -2
- package/build/commands/job/internal/utils.js +19 -6
- package/build/commands/job/jobCommand.d.ts +19 -0
- package/build/commands/job/jobCommand.js +66 -31
- package/build/commands/job/spec/execute.spec.js +49 -5
- package/build/commands/job/spec/job.spec.server.viya.js +7 -12
- package/build/commands/job/spec/jobCommand.spec.js +27 -14
- package/build/commands/run/run.js +38 -29
- package/build/commands/run/spec/run.spec.d.ts +1 -0
- package/build/commands/run/spec/run.spec.js +149 -0
- package/build/utils/config.d.ts +3 -2
- package/build/utils/config.js +5 -3
- package/build/utils/saveLog.d.ts +8 -1
- package/build/utils/saveLog.js +10 -2
- package/build/utils/spec/config.spec.js +60 -1
- package/package.json +6 -6
|
@@ -0,0 +1,149 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
|
+
function step(op) {
|
|
39
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
40
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
41
|
+
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;
|
|
42
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
43
|
+
switch (op[0]) {
|
|
44
|
+
case 0: case 1: t = op; break;
|
|
45
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
46
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
47
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
48
|
+
default:
|
|
49
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
50
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
51
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
52
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
53
|
+
if (t[2]) _.ops.pop();
|
|
54
|
+
_.trys.pop(); continue;
|
|
55
|
+
}
|
|
56
|
+
op = body.call(thisArg, _);
|
|
57
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
58
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
62
|
+
var utils_1 = require("@sasjs/utils");
|
|
63
|
+
var run_1 = require("../run");
|
|
64
|
+
var utilsModule = __importStar(require("../../../utils/utils"));
|
|
65
|
+
var configModule = __importStar(require("../../../utils/config"));
|
|
66
|
+
var saveLogModule = __importStar(require("../../../utils/saveLog"));
|
|
67
|
+
var fileModule = __importStar(require("@sasjs/utils/file"));
|
|
68
|
+
var getAbsolutePathModule = __importStar(require("@sasjs/utils/file/getAbsolutePath"));
|
|
69
|
+
var node_1 = __importStar(require("@sasjs/adapter/node"));
|
|
70
|
+
var utils_2 = require("../../../utils");
|
|
71
|
+
var sasjs = new node_1.default();
|
|
72
|
+
describe('sasjs run', function () {
|
|
73
|
+
describe('SASJS', function () {
|
|
74
|
+
var target = new utils_1.Target({
|
|
75
|
+
name: 'test',
|
|
76
|
+
appLoc: '/Public/test/',
|
|
77
|
+
serverType: utils_1.ServerType.Sasjs,
|
|
78
|
+
contextName: 'test context'
|
|
79
|
+
});
|
|
80
|
+
var logData = 'SAS log';
|
|
81
|
+
var filePath = 'test.sas';
|
|
82
|
+
beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
83
|
+
return __generator(this, function (_a) {
|
|
84
|
+
switch (_a.label) {
|
|
85
|
+
case 0: return [4 /*yield*/, (0, utils_2.setConstants)(false)];
|
|
86
|
+
case 1:
|
|
87
|
+
_a.sent();
|
|
88
|
+
return [2 /*return*/];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}); });
|
|
92
|
+
beforeEach(function () {
|
|
93
|
+
setupMocks(filePath, logData);
|
|
94
|
+
});
|
|
95
|
+
it('should saveLog function with correct log data', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
96
|
+
return __generator(this, function (_a) {
|
|
97
|
+
switch (_a.label) {
|
|
98
|
+
case 0:
|
|
99
|
+
jest
|
|
100
|
+
.spyOn(sasjs, 'executeScript')
|
|
101
|
+
.mockImplementation(function () { return Promise.resolve({ log: logData }); });
|
|
102
|
+
jest.spyOn(saveLogModule, 'saveLog').mockImplementation();
|
|
103
|
+
process.sasjsConstants.buildDestinationResultsFolder = __dirname;
|
|
104
|
+
return [4 /*yield*/, (0, run_1.runSasCode)(target, filePath, false, '')];
|
|
105
|
+
case 1:
|
|
106
|
+
_a.sent();
|
|
107
|
+
expect(utils_2.saveLog).toHaveBeenCalledWith(logData, expect.stringMatching(/sasjs-run-\d{14}\.log$/), '', undefined);
|
|
108
|
+
return [2 /*return*/];
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}); });
|
|
112
|
+
it('should throw an error if log is not returned by @sasjs/adapter', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
113
|
+
var expectedError;
|
|
114
|
+
return __generator(this, function (_a) {
|
|
115
|
+
switch (_a.label) {
|
|
116
|
+
case 0:
|
|
117
|
+
jest
|
|
118
|
+
.spyOn(sasjs, 'executeScript')
|
|
119
|
+
.mockImplementation(function () { return Promise.resolve({}); });
|
|
120
|
+
expectedError = new node_1.ErrorResponse('We were not able to fetch the log this time.');
|
|
121
|
+
return [4 /*yield*/, expect((0, run_1.runSasCode)(target, filePath, false, '')).rejects.toEqual(expectedError)];
|
|
122
|
+
case 1:
|
|
123
|
+
_a.sent();
|
|
124
|
+
return [2 /*return*/];
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}); });
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
var setupMocks = function (filePath, logData) {
|
|
131
|
+
jest
|
|
132
|
+
.spyOn(getAbsolutePathModule, 'getAbsolutePath')
|
|
133
|
+
.mockImplementation(function () { return filePath; });
|
|
134
|
+
jest
|
|
135
|
+
.spyOn(fileModule, 'readFile')
|
|
136
|
+
.mockImplementation(function () { return Promise.resolve('test SAS code;'); });
|
|
137
|
+
jest
|
|
138
|
+
.spyOn(utilsModule, 'isSasJsServerInServerMode')
|
|
139
|
+
.mockImplementation(function () { return Promise.resolve(true); });
|
|
140
|
+
jest.spyOn(configModule, 'getAuthConfig').mockImplementation(function () {
|
|
141
|
+
return Promise.resolve({
|
|
142
|
+
access_token: 'test_access_token',
|
|
143
|
+
refresh_token: 'test_refresh_token',
|
|
144
|
+
client: 'test_client',
|
|
145
|
+
secret: ''
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
jest.spyOn(configModule, 'getSASjs').mockImplementation(function (target) { return sasjs; });
|
|
149
|
+
};
|
package/build/utils/config.d.ts
CHANGED
|
@@ -97,8 +97,9 @@ export declare const overrideEnvVariables: (targetName: string) => Promise<void>
|
|
|
97
97
|
export declare const getTestSetUp: (target: Target) => Promise<string | undefined>;
|
|
98
98
|
export declare const getTestTearDown: (target: Target) => Promise<string | undefined>;
|
|
99
99
|
/**
|
|
100
|
-
*
|
|
101
|
-
* @param
|
|
100
|
+
* Provides instance of @sasjs/adapter.
|
|
101
|
+
* @param target - server server.
|
|
102
|
+
* @returns - instance of @sasjs/adapter.
|
|
102
103
|
*/
|
|
103
104
|
export declare function getSASjs(target: Target): SASjs;
|
|
104
105
|
/**
|
package/build/utils/config.js
CHANGED
|
@@ -1143,8 +1143,9 @@ var getTestTearDown = function (target) { return __awaiter(void 0, void 0, void
|
|
|
1143
1143
|
}); };
|
|
1144
1144
|
exports.getTestTearDown = getTestTearDown;
|
|
1145
1145
|
/**
|
|
1146
|
-
*
|
|
1147
|
-
* @param
|
|
1146
|
+
* Provides instance of @sasjs/adapter.
|
|
1147
|
+
* @param target - server server.
|
|
1148
|
+
* @returns - instance of @sasjs/adapter.
|
|
1148
1149
|
*/
|
|
1149
1150
|
function getSASjs(target) {
|
|
1150
1151
|
return new node_1.default({
|
|
@@ -1154,7 +1155,8 @@ function getSASjs(target) {
|
|
|
1154
1155
|
contextName: target.contextName,
|
|
1155
1156
|
httpsAgentOptions: target.httpsAgentOptions,
|
|
1156
1157
|
debug: true,
|
|
1157
|
-
useComputeApi: target.serverType === utils_1.ServerType.SasViya
|
|
1158
|
+
useComputeApi: target.serverType === utils_1.ServerType.SasViya,
|
|
1159
|
+
verbose: !!process.env.VERBOSE // any not empty string should be considered as true
|
|
1158
1160
|
});
|
|
1159
1161
|
}
|
|
1160
1162
|
exports.getSASjs = getSASjs;
|
package/build/utils/saveLog.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
1
|
import { LogJson } from '../types';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Saves log to the log file.
|
|
4
|
+
* @param logData - log content.
|
|
5
|
+
* @param logFile - file path to log file.
|
|
6
|
+
* @param jobPath - file path to job, job name will be used as a fallback name for log file.
|
|
7
|
+
* @param silent - boolean indicating if additional info should be logged.
|
|
8
|
+
*/
|
|
9
|
+
export declare const saveLog: (logData: LogJson | string, logFile: string | undefined, jobPath: string, silent?: boolean) => Promise<void>;
|
package/build/utils/saveLog.js
CHANGED
|
@@ -43,7 +43,14 @@ exports.saveLog = void 0;
|
|
|
43
43
|
var utils_1 = require("@sasjs/utils");
|
|
44
44
|
var path_1 = __importDefault(require("path"));
|
|
45
45
|
var _1 = require(".");
|
|
46
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Saves log to the log file.
|
|
48
|
+
* @param logData - log content.
|
|
49
|
+
* @param logFile - file path to log file.
|
|
50
|
+
* @param jobPath - file path to job, job name will be used as a fallback name for log file.
|
|
51
|
+
* @param silent - boolean indicating if additional info should be logged.
|
|
52
|
+
*/
|
|
53
|
+
var saveLog = function (logData, logFile, jobPath, silent) {
|
|
47
54
|
if (silent === void 0) { silent = false; }
|
|
48
55
|
return __awaiter(void 0, void 0, void 0, function () {
|
|
49
56
|
var error, logPath, folderPath, parentFolderPath, logLines;
|
|
@@ -51,6 +58,7 @@ var saveLog = function (logData, logFile, jobPath, returnStatusOnly, silent) {
|
|
|
51
58
|
return __generator(this, function (_b) {
|
|
52
59
|
switch (_b.label) {
|
|
53
60
|
case 0:
|
|
61
|
+
// throw an error if log is an object containing error property
|
|
54
62
|
if (typeof logData !== 'string') {
|
|
55
63
|
error = logData.error;
|
|
56
64
|
if (error)
|
|
@@ -75,7 +83,7 @@ var saveLog = function (logData, logFile, jobPath, returnStatusOnly, silent) {
|
|
|
75
83
|
return [4 /*yield*/, (0, utils_1.createFile)(logPath, logLines)];
|
|
76
84
|
case 4:
|
|
77
85
|
_b.sent();
|
|
78
|
-
if (!
|
|
86
|
+
if (!silent)
|
|
79
87
|
(0, _1.displaySuccess)("Log saved to ".concat(logPath));
|
|
80
88
|
return [2 /*return*/];
|
|
81
89
|
}
|
|
@@ -70,7 +70,6 @@ var path_1 = __importDefault(require("path"));
|
|
|
70
70
|
var utils_1 = require("@sasjs/utils");
|
|
71
71
|
var test_1 = require("../test");
|
|
72
72
|
var setConstants_1 = require("../setConstants");
|
|
73
|
-
jest.mock('@sasjs/adapter/node');
|
|
74
73
|
describe('getAccessToken', function () {
|
|
75
74
|
beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
76
75
|
return __generator(this, function (_a) {
|
|
@@ -726,3 +725,63 @@ describe('removeFromLocalConfig', function () {
|
|
|
726
725
|
});
|
|
727
726
|
}); });
|
|
728
727
|
});
|
|
728
|
+
describe('getSASjs', function () {
|
|
729
|
+
it('should set sasjsConfig according to target', function () {
|
|
730
|
+
var target = {
|
|
731
|
+
serverUrl: 'test_serverUrl',
|
|
732
|
+
appLoc: 'test_appLoc',
|
|
733
|
+
serverType: utils_1.ServerType.SasViya,
|
|
734
|
+
contextName: 'test_contextName',
|
|
735
|
+
httpsAgentOptions: {
|
|
736
|
+
caPath: 'test_caPath',
|
|
737
|
+
keyPath: 'test_keyPath',
|
|
738
|
+
certPath: 'test_certPath',
|
|
739
|
+
allowInsecureRequests: false
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
var sasjs = (0, config_1.getSASjs)(target);
|
|
743
|
+
var sasjsConfig = sasjs.getSasjsConfig();
|
|
744
|
+
var serverUrl = sasjsConfig.serverUrl, appLoc = sasjsConfig.appLoc, serverType = sasjsConfig.serverType, contextName = sasjsConfig.contextName, httpsAgentOptions = sasjsConfig.httpsAgentOptions;
|
|
745
|
+
expect(serverUrl).toEqual(target.serverUrl);
|
|
746
|
+
expect(appLoc).toEqual(target.appLoc);
|
|
747
|
+
expect(serverType).toEqual(target.serverType);
|
|
748
|
+
expect(contextName).toEqual(target.contextName);
|
|
749
|
+
expect(httpsAgentOptions).toEqual(target.httpsAgentOptions);
|
|
750
|
+
});
|
|
751
|
+
it('should set debug to true by default', function () {
|
|
752
|
+
var sasjs = (0, config_1.getSASjs)({});
|
|
753
|
+
var sasjsConfig = sasjs.getSasjsConfig();
|
|
754
|
+
var debug = sasjsConfig.debug;
|
|
755
|
+
expect(debug).toEqual(true);
|
|
756
|
+
});
|
|
757
|
+
it('should set useComputeApi to true if server type is Viya', function () {
|
|
758
|
+
var sasjs = (0, config_1.getSASjs)({ serverType: utils_1.ServerType.SasViya });
|
|
759
|
+
var sasjsConfig = sasjs.getSasjsConfig();
|
|
760
|
+
var useComputeApi = sasjsConfig.useComputeApi;
|
|
761
|
+
expect(useComputeApi).toEqual(true);
|
|
762
|
+
});
|
|
763
|
+
it('should set useComputeApi to false if server type is not Viya', function () {
|
|
764
|
+
var sasjs = (0, config_1.getSASjs)({ serverType: utils_1.ServerType.Sas9 });
|
|
765
|
+
var sasjsConfig = sasjs.getSasjsConfig();
|
|
766
|
+
var useComputeApi = sasjsConfig.useComputeApi;
|
|
767
|
+
expect(useComputeApi).toEqual(false);
|
|
768
|
+
sasjs = (0, config_1.getSASjs)({ serverType: utils_1.ServerType.Sasjs });
|
|
769
|
+
sasjsConfig = sasjs.getSasjsConfig();
|
|
770
|
+
useComputeApi = sasjsConfig.useComputeApi;
|
|
771
|
+
expect(useComputeApi).toEqual(false);
|
|
772
|
+
});
|
|
773
|
+
it('should enable verbose mode if VERBOSE env is present', function () {
|
|
774
|
+
process.env.VERBOSE = 'on';
|
|
775
|
+
var sasjs = (0, config_1.getSASjs)({});
|
|
776
|
+
var sasjsConfig = sasjs.getSasjsConfig();
|
|
777
|
+
var verbose = sasjsConfig.verbose;
|
|
778
|
+
expect(verbose).toEqual(true);
|
|
779
|
+
});
|
|
780
|
+
it('should disable verbose mode if VERBOSE env is not present', function () {
|
|
781
|
+
process.env.VERBOSE = '';
|
|
782
|
+
var sasjs = (0, config_1.getSASjs)({});
|
|
783
|
+
var sasjsConfig = sasjs.getSasjsConfig();
|
|
784
|
+
var verbose = sasjsConfig.verbose;
|
|
785
|
+
expect(verbose).toEqual(false);
|
|
786
|
+
});
|
|
787
|
+
});
|
package/package.json
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"preinstall": "npm run nodeVersionMessage",
|
|
23
23
|
"prepare": "git rev-parse --git-dir && git config core.hooksPath ./.git-hooks || true"
|
|
24
24
|
},
|
|
25
|
-
"testServerTypes": "sasjs
|
|
25
|
+
"testServerTypes": "sasjs",
|
|
26
26
|
"release": {
|
|
27
27
|
"branches": [
|
|
28
28
|
"main"
|
|
@@ -50,13 +50,13 @@
|
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@sasjs/adapter": "4.
|
|
54
|
-
"@sasjs/core": "4.
|
|
55
|
-
"@sasjs/lint": "2.3.
|
|
53
|
+
"@sasjs/adapter": "4.8.0",
|
|
54
|
+
"@sasjs/core": "4.46.3",
|
|
55
|
+
"@sasjs/lint": "2.3.1",
|
|
56
56
|
"@sasjs/utils": "3.3.0",
|
|
57
57
|
"adm-zip": "0.5.9",
|
|
58
58
|
"chalk": "4.1.2",
|
|
59
|
-
"dotenv": "
|
|
59
|
+
"dotenv": "16.0.3",
|
|
60
60
|
"esm": "3.2.25",
|
|
61
61
|
"find": "0.3.0",
|
|
62
62
|
"js-base64": "3.7.2",
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
"typescript": "4.9.5",
|
|
103
103
|
"util": "0.12.4"
|
|
104
104
|
},
|
|
105
|
-
"version": "4.
|
|
105
|
+
"version": "4.5.0"
|
|
106
106
|
}
|