@sasjs/cli 3.18.2 → 3.19.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.
@@ -59,76 +59,66 @@ function runSasCode(target, filePath, compile) {
59
59
  var _a;
60
60
  if (compile === void 0) { compile = false; }
61
61
  return __awaiter(this, void 0, void 0, function () {
62
- var isFileCreated, tempFilePath, sourcefilePathParts, sourceFolderPath, sasFilePath, sasFileContent, linesToExecute;
63
- var _this = this;
64
- return __generator(this, function (_b) {
65
- switch (_b.label) {
62
+ var isTempFile, sourcefilePathParts, sourceFolderPath, sasFilePath, sasFileContent, linesToExecute, result;
63
+ var _b;
64
+ return __generator(this, function (_c) {
65
+ switch (_c.label) {
66
66
  case 0:
67
- isFileCreated = false;
68
- tempFilePath = path_1.default.join(process.projectDir, 'temp-' + Date.now() + '.sas');
69
- if (!(filePath.startsWith('https://') || filePath.startsWith('http://'))) return [3 /*break*/, 2];
70
- return [4 /*yield*/, axios_1.default
71
- .get(filePath)
72
- .then(function (res) { return __awaiter(_this, void 0, void 0, function () {
73
- var invalidSasError, content;
74
- return __generator(this, function (_a) {
75
- switch (_a.label) {
76
- case 0:
77
- invalidSasError = process.sasjsConstants.invalidSasError;
78
- if (typeof res.data !== 'string') {
79
- throw new Error(invalidSasError);
80
- }
81
- content = res.data.trim();
82
- if (content && content.startsWith('<')) {
83
- throw new Error(invalidSasError);
84
- }
85
- return [4 /*yield*/, (0, utils_1.createFile)(tempFilePath, content)];
86
- case 1:
87
- _a.sent();
88
- isFileCreated = true;
89
- return [2 /*return*/];
90
- }
91
- });
92
- }); })
93
- .catch(function (err) {
94
- throw new Error("".concat(err.message, "\nUrl: ").concat(filePath));
95
- })];
67
+ isTempFile = false;
68
+ if (!isUrl(filePath)) return [3 /*break*/, 2];
69
+ ;
70
+ return [4 /*yield*/, createFileFromUrl(filePath)];
96
71
  case 1:
97
- _b.sent();
98
- _b.label = 2;
72
+ (_b = _c.sent(), isTempFile = _b.isTempFile, filePath = _b.tempFilePath);
73
+ _c.label = 2;
99
74
  case 2:
100
- if (isFileCreated) {
101
- filePath = tempFilePath;
102
- }
103
- if (!/\.sas$/i.test(filePath)) {
104
- throw new Error("'sasjs run' command supports only *.sas files.");
105
- }
106
- if (!compile) return [3 /*break*/, 4];
75
+ if (!compile) return [3 /*break*/, 5];
76
+ if (!/\.sas$/i.test(filePath)) return [3 /*break*/, 4];
107
77
  sourcefilePathParts = path_1.default.normalize(filePath).split(path_1.default.sep);
108
78
  sourcefilePathParts.splice(-1, 1);
109
79
  sourceFolderPath = sourcefilePathParts.join(path_1.default.sep);
110
80
  return [4 /*yield*/, (0, __1.compileSingleFile)(target, 'identify', filePath, (0, getDestinationPath_1.getDestinationServicePath)(sourceFolderPath), true)];
111
81
  case 3:
112
- (filePath = (_b.sent()).destinationPath);
82
+ (filePath = (_c.sent()).destinationPath);
113
83
  (_a = process.logger) === null || _a === void 0 ? void 0 : _a.success("File Compiled and placed at: ".concat(filePath, " ."));
114
- _b.label = 4;
84
+ return [3 /*break*/, 5];
115
85
  case 4:
86
+ process.logger.info('Compile flag has no effect on files with extension type other than sas');
87
+ _c.label = 5;
88
+ case 5:
116
89
  sasFilePath = (0, utils_1.getAbsolutePath)(filePath, process.currentDir);
117
90
  return [4 /*yield*/, (0, utils_1.readFile)(sasFilePath)];
118
- case 5:
119
- sasFileContent = _b.sent();
91
+ case 6:
92
+ sasFileContent = _c.sent();
120
93
  linesToExecute = sasFileContent.replace(/\r\n/g, '\n').split('\n');
121
- if (!(target.serverType === utils_1.ServerType.SasViya)) return [3 /*break*/, 7];
122
- return [4 /*yield*/, executeOnSasViya(filePath, isFileCreated, target, linesToExecute)];
123
- case 6: return [2 /*return*/, _b.sent()];
124
- case 7: return [4 /*yield*/, executeOnSas9(filePath, isFileCreated, target, linesToExecute)];
125
- case 8: return [2 /*return*/, _b.sent()];
94
+ if (!(target.serverType === utils_1.ServerType.SasViya)) return [3 /*break*/, 8];
95
+ return [4 /*yield*/, executeOnSasViya(filePath, target, linesToExecute)];
96
+ case 7:
97
+ result = _c.sent();
98
+ return [3 /*break*/, 12];
99
+ case 8:
100
+ if (!(target.serverType === utils_1.ServerType.Sas9)) return [3 /*break*/, 10];
101
+ return [4 /*yield*/, executeOnSas9(target, linesToExecute)];
102
+ case 9:
103
+ result = _c.sent();
104
+ return [3 /*break*/, 12];
105
+ case 10: return [4 /*yield*/, executeOnSasJS(filePath, target, linesToExecute)];
106
+ case 11:
107
+ result = _c.sent();
108
+ _c.label = 12;
109
+ case 12:
110
+ if (!isTempFile) return [3 /*break*/, 14];
111
+ return [4 /*yield*/, (0, utils_1.deleteFile)(filePath)];
112
+ case 13:
113
+ _c.sent();
114
+ _c.label = 14;
115
+ case 14: return [2 /*return*/, result];
126
116
  }
127
117
  });
128
118
  });
129
119
  }
130
120
  exports.runSasCode = runSasCode;
131
- function executeOnSasViya(filePath, isTempFile, target, linesToExecute) {
121
+ function executeOnSasViya(filePath, target, linesToExecute) {
132
122
  var _a, _b, _c, _d, _e;
133
123
  return __awaiter(this, void 0, void 0, function () {
134
124
  var sasjs, contextName, authConfig, executionResult, log, isOutput, buildDestinationResultsFolder, createdFilePath;
@@ -192,17 +182,12 @@ function executeOnSasViya(filePath, isTempFile, target, linesToExecute) {
192
182
  case 3:
193
183
  createdFilePath = _f.sent();
194
184
  (_e = process.logger) === null || _e === void 0 ? void 0 : _e.success("".concat(isOutput ? 'Output' : 'Log', " file has been created at ").concat(createdFilePath, " ."));
195
- if (!isTempFile) return [3 /*break*/, 5];
196
- return [4 /*yield*/, (0, utils_1.deleteFile)(filePath)];
197
- case 4:
198
- _f.sent();
199
- _f.label = 5;
200
- case 5: return [2 /*return*/, { log: log }];
185
+ return [2 /*return*/, { log: log }];
201
186
  }
202
187
  });
203
188
  });
204
189
  }
205
- function executeOnSas9(filePath, isTempFile, target, linesToExecute) {
190
+ function executeOnSas9(target, linesToExecute) {
206
191
  var _a, _b, _c;
207
192
  return __awaiter(this, void 0, void 0, function () {
208
193
  var username, password, sas9CredentialsError, sasjs, buildDestinationResultsFolder, executionResult, createdFilePath;
@@ -263,12 +248,44 @@ function executeOnSas9(filePath, isTempFile, target, linesToExecute) {
263
248
  case 2:
264
249
  createdFilePath = _d.sent();
265
250
  (_c = process.logger) === null || _c === void 0 ? void 0 : _c.success("Log file has been created at ".concat(createdFilePath, " ."));
266
- if (!isTempFile) return [3 /*break*/, 4];
267
- return [4 /*yield*/, (0, utils_1.deleteFile)(filePath)];
251
+ return [2 /*return*/, { log: executionResult }];
252
+ }
253
+ });
254
+ });
255
+ }
256
+ function executeOnSasJS(filePath, target, linesToExecute) {
257
+ var _a, _b, _c;
258
+ return __awaiter(this, void 0, void 0, function () {
259
+ var authConfig, buildDestinationResultsFolder, sasjs, fileExtension, executionResult, createdFilePath;
260
+ return __generator(this, function (_d) {
261
+ switch (_d.label) {
262
+ case 0: return [4 /*yield*/, (0, utils_2.isSasJsServerInServerMode)(target)];
263
+ case 1:
264
+ if (!_d.sent()) return [3 /*break*/, 3];
265
+ return [4 /*yield*/, (0, config_1.getAuthConfig)(target)];
266
+ case 2:
267
+ authConfig = _d.sent();
268
+ _d.label = 3;
268
269
  case 3:
269
- _d.sent();
270
- _d.label = 4;
271
- case 4: return [2 /*return*/, { log: executionResult }];
270
+ buildDestinationResultsFolder = process.sasjsConstants.buildDestinationResultsFolder;
271
+ sasjs = new node_1.default({
272
+ serverUrl: target.serverUrl,
273
+ httpsAgentOptions: target.httpsAgentOptions,
274
+ appLoc: target.appLoc,
275
+ serverType: target.serverType,
276
+ debug: true
277
+ });
278
+ fileExtension = path_1.default.extname(filePath).slice(1);
279
+ return [4 /*yield*/, sasjs.executeScriptSASjs(linesToExecute.join('\n'), fileExtension, authConfig)];
280
+ case 4:
281
+ executionResult = _d.sent();
282
+ (_a = process.logger) === null || _a === void 0 ? void 0 : _a.success('Job execution completed!');
283
+ (_b = process.logger) === null || _b === void 0 ? void 0 : _b.info("Creating log file in ".concat(buildDestinationResultsFolder, " ."));
284
+ return [4 /*yield*/, createOutputFile(executionResult || '')];
285
+ case 5:
286
+ createdFilePath = _d.sent();
287
+ (_c = process.logger) === null || _c === void 0 ? void 0 : _c.success("Log file has been created at ".concat(createdFilePath, " ."));
288
+ return [2 /*return*/, { log: executionResult }];
272
289
  }
273
290
  });
274
291
  });
@@ -290,3 +307,44 @@ function createOutputFile(log) {
290
307
  });
291
308
  });
292
309
  }
310
+ function isUrl(filePath) {
311
+ return filePath.startsWith('https://') || filePath.startsWith('http://');
312
+ }
313
+ function createFileFromUrl(url) {
314
+ return __awaiter(this, void 0, void 0, function () {
315
+ var _this = this;
316
+ return __generator(this, function (_a) {
317
+ switch (_a.label) {
318
+ case 0: return [4 /*yield*/, axios_1.default
319
+ .get(url)
320
+ .then(function (res) { return __awaiter(_this, void 0, void 0, function () {
321
+ var invalidSasError, content, urlWithoutQueryParams, fileExtension, tempFilePath;
322
+ return __generator(this, function (_a) {
323
+ switch (_a.label) {
324
+ case 0:
325
+ invalidSasError = process.sasjsConstants.invalidSasError;
326
+ if (typeof res.data !== 'string') {
327
+ throw new Error(invalidSasError);
328
+ }
329
+ content = res.data.trim();
330
+ if (content && content.startsWith('<')) {
331
+ throw new Error(invalidSasError);
332
+ }
333
+ urlWithoutQueryParams = url.split('?')[0];
334
+ fileExtension = path_1.default.extname(urlWithoutQueryParams);
335
+ tempFilePath = path_1.default.join(process.projectDir, "temp-".concat(Date.now()).concat(fileExtension));
336
+ return [4 /*yield*/, (0, utils_1.createFile)(tempFilePath, content)];
337
+ case 1:
338
+ _a.sent();
339
+ return [2 /*return*/, { isTempFile: true, tempFilePath: tempFilePath }];
340
+ }
341
+ });
342
+ }); })
343
+ .catch(function (err) {
344
+ throw new Error("".concat(err.message, "\nUrl: ").concat(url));
345
+ })];
346
+ case 1: return [2 /*return*/, _a.sent()];
347
+ }
348
+ });
349
+ });
350
+ }
@@ -83,7 +83,7 @@ var RunCommand = /** @class */ (function (_super) {
83
83
  type: 'boolean',
84
84
  alias: 'c',
85
85
  default: false,
86
- description: 'Used to force a deploy, eg even if the folders / services already exist (they will then be overwritten)'
86
+ description: 'Used to compile the program prior to execution. Useful for including dependent macros and includes. More info here: https://cli.sasjs.io/compile'
87
87
  }
88
88
  },
89
89
  syntax: syntax,
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var path_1 = __importDefault(require("path"));
43
+ var __1 = require("../..");
44
+ var utils_1 = require("@sasjs/utils");
45
+ var test_1 = require("../../../utils/test");
46
+ describe('sasjs run with server type sasjs', function () {
47
+ var target;
48
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
49
+ var appName;
50
+ return __generator(this, function (_a) {
51
+ switch (_a.label) {
52
+ case 0:
53
+ appName = 'cli-tests-run-sasjs' + (0, utils_1.generateTimestamp)();
54
+ return [4 /*yield*/, (0, test_1.createTestApp)(__dirname, appName)];
55
+ case 1:
56
+ _a.sent();
57
+ target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName), {
58
+ serviceFolders: ['sasjs/testServices'],
59
+ initProgram: '',
60
+ termProgram: '',
61
+ macroVars: {}
62
+ }, utils_1.ServerType.Sasjs);
63
+ return [4 /*yield*/, (0, utils_1.copy)(path_1.default.join(__dirname, 'testServices'), path_1.default.join(process.projectDir, 'sasjs', 'testServices'))];
64
+ case 2:
65
+ _a.sent();
66
+ return [2 /*return*/];
67
+ }
68
+ });
69
+ }); });
70
+ afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
71
+ return __generator(this, function (_a) {
72
+ switch (_a.label) {
73
+ case 0: return [4 /*yield*/, (0, test_1.removeTestApp)(__dirname, target.name)];
74
+ case 1:
75
+ _a.sent();
76
+ return [2 /*return*/];
77
+ }
78
+ });
79
+ }); });
80
+ it('should run a file when a relative path is provided', function () { return __awaiter(void 0, void 0, void 0, function () {
81
+ return __generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0: return [4 /*yield*/, expect((0, __1.runSasCode)(target, 'sasjs/testServices/logJob.js')).toResolve()];
84
+ case 1:
85
+ _a.sent();
86
+ return [2 /*return*/];
87
+ }
88
+ });
89
+ }); });
90
+ it('should run a file when an absolute path is provided', function () { return __awaiter(void 0, void 0, void 0, function () {
91
+ return __generator(this, function (_a) {
92
+ switch (_a.label) {
93
+ case 0: return [4 /*yield*/, expect((0, __1.runSasCode)(target, "".concat(process.projectDir, "/sasjs/testServices/logJob.js"))).toResolve()];
94
+ case 1:
95
+ _a.sent();
96
+ return [2 /*return*/];
97
+ }
98
+ });
99
+ }); });
100
+ });
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Array(100)
3
+ .fill()
4
+ .forEach(function (_, i) { return console.log(i); });
@@ -163,11 +163,11 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
163
163
  case utils_1.ServerType.Sas9: return [3 /*break*/, 4];
164
164
  case utils_1.ServerType.Sasjs: return [3 /*break*/, 5];
165
165
  }
166
- return [3 /*break*/, 9];
166
+ return [3 /*break*/, 11];
167
167
  case 2: return [4 /*yield*/, (0, config_1.getAuthConfig)(target)];
168
168
  case 3:
169
169
  authConfig = _e.sent();
170
- return [3 /*break*/, 9];
170
+ return [3 /*break*/, 11];
171
171
  case 4:
172
172
  if (target.authConfigSas9) {
173
173
  username = target.authConfigSas9.userName;
@@ -182,19 +182,23 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
182
182
  throw new Error(sas9CredentialsError);
183
183
  }
184
184
  password = (0, utils_1.decodeFromBase64)(password);
185
- return [3 /*break*/, 9];
185
+ return [3 /*break*/, 11];
186
186
  case 5:
187
- _e.trys.push([5, 7, , 8]);
188
- return [4 /*yield*/, (0, config_1.getAuthConfig)(target)];
187
+ _e.trys.push([5, 9, , 10]);
188
+ return [4 /*yield*/, (0, utils_2.isSasJsServerInServerMode)(target)];
189
189
  case 6:
190
- authConfig = _e.sent();
191
- return [3 /*break*/, 8];
190
+ if (!_e.sent()) return [3 /*break*/, 8];
191
+ return [4 /*yield*/, (0, config_1.getAuthConfig)(target)];
192
192
  case 7:
193
- e_1 = _e.sent();
194
- return [3 /*break*/, 8];
195
- case 8: // FIXME: handle error properly
196
- return [3 /*break*/, 9];
193
+ authConfig = _e.sent();
194
+ _e.label = 8;
195
+ case 8: return [3 /*break*/, 10];
197
196
  case 9:
197
+ e_1 = _e.sent();
198
+ return [3 /*break*/, 10];
199
+ case 10: // FIXME: handle error properly
200
+ return [3 /*break*/, 11];
201
+ case 11:
198
202
  result = {
199
203
  sasjs_test_meta: []
200
204
  };
@@ -337,21 +341,21 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
337
341
  }
338
342
  });
339
343
  }); })];
340
- case 10:
344
+ case 12:
341
345
  _e.sent();
342
346
  return [4 /*yield*/, (0, saveOutput_1.saveResultJson)(outDirectory, result)];
343
- case 11:
347
+ case 13:
344
348
  jsonPath = _e.sent();
345
349
  if (!jsonPath)
346
350
  return [2 /*return*/];
347
351
  return [4 /*yield*/, (0, saveOutput_1.saveResultXml)(outDirectory, result)];
348
- case 12:
352
+ case 14:
349
353
  xmlPath = _e.sent();
350
354
  return [4 /*yield*/, (0, saveOutput_1.saveResultCsv)(outDirectory, result)];
351
- case 13:
355
+ case 15:
352
356
  _d = _e.sent(), csvData = _d.csvData, csvPath = _d.csvPath;
353
357
  return [4 /*yield*/, (0, saveOutput_1.saveCoverageLcov)(outDirectory, flow)];
354
- case 14:
358
+ case 16:
355
359
  coverageReportPath = _e.sent();
356
360
  resultTable = {};
357
361
  if (Array.isArray(csvData)) {
@@ -177,12 +177,15 @@ var generateTestTarget = function (targetName, appLoc, serviceConfig, serverType
177
177
  macroVars: {}
178
178
  }; }
179
179
  dotenv_1.default.config();
180
+ var serverUrl = process.env.SASJS_SERVER_URL;
181
+ if (serverType === types_1.ServerType.SasViya)
182
+ serverUrl = process.env.VIYA_SERVER_URL;
183
+ if (serverType === types_1.ServerType.Sas9)
184
+ serverUrl = process.env.SAS9_SERVER_URL;
180
185
  var target = new types_1.Target({
181
186
  name: targetName,
182
187
  serverType: serverType,
183
- serverUrl: (serverType === types_1.ServerType.SasViya
184
- ? process.env.VIYA_SERVER_URL
185
- : process.env.SAS9_SERVER_URL),
188
+ serverUrl: serverUrl,
186
189
  contextName: setConstants_1.contextName,
187
190
  appLoc: appLoc,
188
191
  authConfig: {
package/package.json CHANGED
@@ -48,7 +48,7 @@
48
48
  "access": "public"
49
49
  },
50
50
  "dependencies": {
51
- "@sasjs/adapter": "3.10.11",
51
+ "@sasjs/adapter": "3.10.15",
52
52
  "@sasjs/core": "4.35.3",
53
53
  "@sasjs/lint": "1.12.0",
54
54
  "@sasjs/utils": "2.47.0",
@@ -97,5 +97,5 @@
97
97
  "typescript": "4.5.4",
98
98
  "util": "0.12.4"
99
99
  },
100
- "version": "3.18.2"
100
+ "version": "3.19.0"
101
101
  }