@sasjs/cli 3.7.6 → 3.7.9

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.
@@ -77,8 +77,7 @@ var web_1 = require("../web/web");
77
77
  var file_1 = require("../../utils/file");
78
78
  var checkCompileStatus_1 = require("./internal/checkCompileStatus");
79
79
  var compileModule = __importStar(require("./compile"));
80
- var getAllJobFolders_1 = require("./internal/getAllJobFolders");
81
- var getAllServiceFolders_1 = require("./internal/getAllServiceFolders");
80
+ var getAllFolders_1 = require("./internal/getAllFolders");
82
81
  var compileServiceFile_1 = require("./internal/compileServiceFile");
83
82
  var compileJobFile_1 = require("./internal/compileJobFile");
84
83
  var compileTestFile_1 = require("./internal/compileTestFile");
@@ -171,10 +170,10 @@ function copyFilesToBuildFolder(target) {
171
170
  _c.label = 2;
172
171
  case 2:
173
172
  _c.trys.push([2, 7, , 8]);
174
- return [4 /*yield*/, (0, getAllServiceFolders_1.getAllServiceFolders)(target)];
173
+ return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Service)];
175
174
  case 3:
176
175
  serviceFolders = _c.sent();
177
- return [4 /*yield*/, (0, getAllJobFolders_1.getAllJobFolders)(target)
176
+ return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Job)
178
177
  // REFACTOR
179
178
  ];
180
179
  case 4:
@@ -231,10 +230,10 @@ function compileJobsServicesTests(target) {
231
230
  switch (_b.label) {
232
231
  case 0:
233
232
  _b.trys.push([0, 13, , 14]);
234
- return [4 /*yield*/, (0, getAllServiceFolders_1.getAllServiceFolders)(target)];
233
+ return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Service)];
235
234
  case 1:
236
235
  serviceFolders = _b.sent();
237
- return [4 /*yield*/, (0, getAllJobFolders_1.getAllJobFolders)(target)];
236
+ return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Job)];
238
237
  case 2:
239
238
  jobFolders = _b.sent();
240
239
  return [4 /*yield*/, (0, config_1.getMacroFolders)(target)];
@@ -39,8 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.checkCompileStatus = void 0;
40
40
  var utils_1 = require("@sasjs/utils");
41
41
  var compareFolders_1 = require("./compareFolders");
42
- var getAllJobFolders_1 = require("./getAllJobFolders");
43
- var getAllServiceFolders_1 = require("./getAllServiceFolders");
42
+ var getAllFolders_1 = require("./getAllFolders");
44
43
  var getDestinationPath_1 = require("./getDestinationPath");
45
44
  function checkCompileStatus(target, exceptions) {
46
45
  return __awaiter(this, void 0, void 0, function () {
@@ -87,7 +86,7 @@ var checkServiceFolders = function (target, exceptions) { return __awaiter(void
87
86
  var serviceFolders, areServiceFoldersMatching, reasons;
88
87
  return __generator(this, function (_a) {
89
88
  switch (_a.label) {
90
- case 0: return [4 /*yield*/, (0, getAllServiceFolders_1.getAllServiceFolders)(target)];
89
+ case 0: return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Service)];
91
90
  case 1:
92
91
  serviceFolders = _a.sent();
93
92
  areServiceFoldersMatching = true;
@@ -126,7 +125,7 @@ var checkJobFolders = function (target, exceptions) { return __awaiter(void 0, v
126
125
  var jobFolders, areJobFoldersMatching, reasons;
127
126
  return __generator(this, function (_a) {
128
127
  switch (_a.label) {
129
- case 0: return [4 /*yield*/, (0, getAllJobFolders_1.getAllJobFolders)(target)];
128
+ case 0: return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Job)];
130
129
  case 1:
131
130
  jobFolders = _a.sent();
132
131
  areJobFoldersMatching = true;
@@ -1,5 +1,6 @@
1
- import { Target } from '@sasjs/utils';
1
+ import { TestFlow } from '../../../types';
2
+ import { Target, Configuration } from '@sasjs/utils';
2
3
  export declare function compileTestFile(target: Target, filePath: string, testVar?: string, saveToRoot?: boolean, removeOriginalFile?: boolean): Promise<void>;
3
4
  export declare function moveTestFile(filePath: string): Promise<void>;
4
5
  export declare function copyTestMacroFiles(folderAbsolutePath: string): Promise<void>;
5
- export declare const compileTestFlow: (target: Target) => Promise<void>;
6
+ export declare const compileTestFlow: (target: Target, config?: Configuration | undefined) => Promise<TestFlow | undefined>;
@@ -200,22 +200,35 @@ function copyTestMacroFiles(folderAbsolutePath) {
200
200
  });
201
201
  }
202
202
  exports.copyTestMacroFiles = copyTestMacroFiles;
203
- var compileTestFlow = function (target) { return __awaiter(void 0, void 0, void 0, function () {
204
- var _a, buildDestinationFolder, buildDestinationTestFolder, testFiles, testFlow, testSetUp, testTearDown, testSetUpFileName_1, testTearDownFileName_1;
205
- var _b, _c;
206
- return __generator(this, function (_d) {
207
- switch (_d.label) {
203
+ var compileTestFlow = function (target, config) { return __awaiter(void 0, void 0, void 0, function () {
204
+ var _a, buildDestinationFolder, buildDestinationTestFolder, testFiles, _b, testFlow, testSetUp, testTearDown, testSetUpFileName_1, testTearDownFileName_1;
205
+ var _c, _d, _e, _f;
206
+ return __generator(this, function (_g) {
207
+ switch (_g.label) {
208
208
  case 0:
209
+ if (target.testConfig &&
210
+ Object.keys(target.testConfig).includes('testFolders')) {
211
+ process.logger.warn("'testFolders' is not supported 'testConfig' entry, please use 'serviceFolders' entry in 'serviceConfig' or 'jobFolders' entry in 'jobConfig'.");
212
+ }
209
213
  _a = process.sasjsConstants, buildDestinationFolder = _a.buildDestinationFolder, buildDestinationTestFolder = _a.buildDestinationTestFolder;
210
214
  return [4 /*yield*/, (0, utils_1.folderExists)(buildDestinationTestFolder)];
211
215
  case 1:
212
- if (!_d.sent()) return [3 /*break*/, 4];
216
+ if (!_g.sent()) return [3 /*break*/, 7];
213
217
  return [4 /*yield*/, (0, utils_1.listFilesAndSubFoldersInFolder)(buildDestinationTestFolder)];
214
218
  case 2:
215
- testFiles = (_d.sent()).map(function (file) { return path_1.default.join('tests', file); });
219
+ testFiles = (_g.sent()).map(function (file) { return path_1.default.join('tests', file); });
220
+ _b = config;
221
+ if (_b) return [3 /*break*/, 5];
222
+ return [4 /*yield*/, (0, config_1.getLocalOrGlobalConfig)()];
223
+ case 3: return [4 /*yield*/, (_g.sent()).configuration];
224
+ case 4:
225
+ _b = (_g.sent());
226
+ _g.label = 5;
227
+ case 5:
228
+ config = _b;
216
229
  testFlow = { tests: [] };
217
- testSetUp = (_b = target.testConfig) === null || _b === void 0 ? void 0 : _b.testSetUp;
218
- testTearDown = (_c = target.testConfig) === null || _c === void 0 ? void 0 : _c.testTearDown;
230
+ testSetUp = ((_c = target.testConfig) === null || _c === void 0 ? void 0 : _c.testSetUp) || ((_d = config.testConfig) === null || _d === void 0 ? void 0 : _d.testSetUp);
231
+ testTearDown = ((_e = target.testConfig) === null || _e === void 0 ? void 0 : _e.testTearDown) || ((_f = config.testConfig) === null || _f === void 0 ? void 0 : _f.testTearDown);
219
232
  if (testFiles.length) {
220
233
  if (testSetUp) {
221
234
  testSetUpFileName_1 = getFileName(testSetUp);
@@ -236,10 +249,10 @@ var compileTestFlow = function (target) { return __awaiter(void 0, void 0, void
236
249
  return file.split(path_1.default.sep).join('/');
237
250
  });
238
251
  return [4 /*yield*/, printTestCoverage(testFlow, buildDestinationFolder, target)];
239
- case 3:
240
- _d.sent();
241
- _d.label = 4;
242
- case 4: return [2 /*return*/];
252
+ case 6:
253
+ _g.sent();
254
+ return [2 /*return*/, Promise.resolve(testFlow)];
255
+ case 7: return [2 /*return*/];
243
256
  }
244
257
  });
245
258
  }); };
@@ -0,0 +1,6 @@
1
+ import { Target, Configuration } from '@sasjs/utils';
2
+ export declare enum SasFileType {
3
+ Service = "service",
4
+ Job = "job"
5
+ }
6
+ export declare const getAllFolders: (target: Target, type: SasFileType, rootConfig?: Configuration | undefined) => Promise<string[]>;
@@ -61,29 +61,55 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
61
61
  return to.concat(ar || Array.prototype.slice.call(from));
62
62
  };
63
63
  Object.defineProperty(exports, "__esModule", { value: true });
64
- exports.getAllJobFolders = void 0;
64
+ exports.getAllFolders = exports.SasFileType = void 0;
65
65
  var utils_1 = require("@sasjs/utils");
66
66
  var config_1 = require("../../../utils/config");
67
- function getAllJobFolders(target) {
68
- var _a, _b;
69
- return __awaiter(this, void 0, void 0, function () {
70
- var configuration, allJobs, buildSourceFolder;
71
- return __generator(this, function (_c) {
72
- switch (_c.label) {
73
- case 0: return [4 /*yield*/, (0, config_1.getLocalOrGlobalConfig)()];
74
- case 1:
75
- configuration = (_c.sent()).configuration;
76
- allJobs = [];
77
- if ((_a = configuration === null || configuration === void 0 ? void 0 : configuration.jobConfig) === null || _a === void 0 ? void 0 : _a.jobFolders)
78
- allJobs = __spreadArray([], __read(configuration.jobConfig.jobFolders), false);
79
- if ((_b = target === null || target === void 0 ? void 0 : target.jobConfig) === null || _b === void 0 ? void 0 : _b.jobFolders)
80
- allJobs = __spreadArray(__spreadArray([], __read(allJobs), false), __read(target.jobConfig.jobFolders), false);
81
- allJobs = allJobs.filter(function (s) { return !!s; });
82
- buildSourceFolder = process.sasjsConstants.buildSourceFolder;
83
- allJobs = allJobs.map(function (job) { return (0, utils_1.getAbsolutePath)(job, buildSourceFolder); });
84
- return [2 /*return*/, __spreadArray([], __read(new Set(allJobs)), false)];
85
- }
86
- });
67
+ var SasFileType;
68
+ (function (SasFileType) {
69
+ SasFileType["Service"] = "service";
70
+ SasFileType["Job"] = "job";
71
+ })(SasFileType = exports.SasFileType || (exports.SasFileType = {}));
72
+ var getAllFolders = function (target, type, rootConfig) { return __awaiter(void 0, void 0, void 0, function () {
73
+ var configuration, _a, allFolders, config, folders, addFolders, buildSourceFolder;
74
+ return __generator(this, function (_b) {
75
+ switch (_b.label) {
76
+ case 0:
77
+ _a = rootConfig;
78
+ if (_a) return [3 /*break*/, 3];
79
+ return [4 /*yield*/, (0, config_1.getLocalOrGlobalConfig)()];
80
+ case 1: return [4 /*yield*/, (_b.sent()).configuration];
81
+ case 2:
82
+ _a = (_b.sent());
83
+ _b.label = 3;
84
+ case 3:
85
+ configuration = _a;
86
+ addFolders = function (folders) {
87
+ allFolders = __spreadArray(__spreadArray([], __read((allFolders || [])), false), __read((folders || [])), false);
88
+ };
89
+ if (type === SasFileType.Service) {
90
+ config = configuration.serviceConfig;
91
+ folders = config === null || config === void 0 ? void 0 : config.serviceFolders;
92
+ addFolders(folders);
93
+ config = target.serviceConfig;
94
+ folders = config === null || config === void 0 ? void 0 : config.serviceFolders;
95
+ }
96
+ else {
97
+ config = configuration.jobConfig;
98
+ folders = config === null || config === void 0 ? void 0 : config.jobFolders;
99
+ addFolders(folders);
100
+ config = target.jobConfig;
101
+ folders = config === null || config === void 0 ? void 0 : config.jobFolders;
102
+ }
103
+ addFolders(folders);
104
+ if (!allFolders)
105
+ return [2 /*return*/, []];
106
+ allFolders = allFolders.filter(function (p) { return !!p; });
107
+ buildSourceFolder = process.sasjsConstants.buildSourceFolder;
108
+ allFolders = allFolders.map(function (sasFile) {
109
+ return (0, utils_1.getAbsolutePath)(sasFile, buildSourceFolder);
110
+ });
111
+ return [2 /*return*/, __spreadArray([], __read(new Set(allFolders)), false)];
112
+ }
87
113
  });
88
- }
89
- exports.getAllJobFolders = getAllJobFolders;
114
+ }); };
115
+ exports.getAllFolders = getAllFolders;
@@ -37,19 +37,18 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.identifySasFile = void 0;
40
- var getAllJobFolders_1 = require("./getAllJobFolders");
41
- var getAllServiceFolders_1 = require("./getAllServiceFolders");
40
+ var getAllFolders_1 = require("./getAllFolders");
42
41
  var identifySasFile = function (target, sourcePath) { return __awaiter(void 0, void 0, void 0, function () {
43
42
  var serviceFolders, isService, jobFolders, isJob;
44
43
  return __generator(this, function (_a) {
45
44
  switch (_a.label) {
46
- case 0: return [4 /*yield*/, (0, getAllServiceFolders_1.getAllServiceFolders)(target)];
45
+ case 0: return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Service)];
47
46
  case 1:
48
47
  serviceFolders = _a.sent();
49
48
  isService = serviceFolders.find(function (folder) { return sourcePath.includes(folder); });
50
49
  if (isService)
51
50
  return [2 /*return*/, 'service'];
52
- return [4 /*yield*/, (0, getAllJobFolders_1.getAllJobFolders)(target)];
51
+ return [4 /*yield*/, (0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Job)];
53
52
  case 2:
54
53
  jobFolders = _a.sent();
55
54
  isJob = jobFolders.find(function (folder) { return sourcePath.includes(folder); });
@@ -330,6 +330,43 @@ describe('compileTestFile', function () {
330
330
  }
331
331
  });
332
332
  }); });
333
+ it('should log a warning is testFolders was used in root or target configuration', function () { return __awaiter(void 0, void 0, void 0, function () {
334
+ var testTarget, testConfig, expectedWarn;
335
+ return __generator(this, function (_a) {
336
+ testTarget = {
337
+ name: 'viya',
338
+ serverUrl: '',
339
+ serverType: utils_1.ServerType.SasViya,
340
+ appLoc: '/Public/sasjs/jobs',
341
+ macroFolders: [],
342
+ programFolders: [],
343
+ binaryFolders: [],
344
+ testConfig: {
345
+ testSetUp: '',
346
+ testTearDown: '',
347
+ macroVars: {},
348
+ initProgram: '',
349
+ termProgram: '',
350
+ testFolders: ['tests']
351
+ }
352
+ };
353
+ testConfig = {
354
+ macroFolders: ['macros'],
355
+ testConfig: {
356
+ testFolders: ['tests']
357
+ },
358
+ defaultTarget: 'viya',
359
+ targets: [testTarget]
360
+ };
361
+ expectedWarn = "'testFolders' is not supported 'testConfig' entry, please use 'serviceFolders' entry in 'serviceConfig' or 'jobFolders' entry in 'jobConfig'.";
362
+ jest.spyOn(process.logger, 'warn');
363
+ (0, compileTestFile_1.compileTestFlow)(testTarget);
364
+ expect(process.logger.warn).toHaveBeenCalledWith(expectedWarn);
365
+ (0, compileTestFile_1.compileTestFlow)(testTarget, testConfig);
366
+ expect(process.logger.warn).toHaveBeenCalledWith(expectedWarn);
367
+ return [2 /*return*/];
368
+ });
369
+ }); });
333
370
  });
334
371
  });
335
372
  describe('isTestFile', function () {
@@ -0,0 +1,184 @@
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 __read = (this && this.__read) || function (o, n) {
69
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
70
+ if (!m) return o;
71
+ var i = m.call(o), r, ar = [], e;
72
+ try {
73
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
74
+ }
75
+ catch (error) { e = { error: error }; }
76
+ finally {
77
+ try {
78
+ if (r && !r.done && (m = i["return"])) m.call(i);
79
+ }
80
+ finally { if (e) throw e.error; }
81
+ }
82
+ return ar;
83
+ };
84
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
85
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
86
+ if (ar || !(i in from)) {
87
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
88
+ ar[i] = from[i];
89
+ }
90
+ }
91
+ return to.concat(ar || Array.prototype.slice.call(from));
92
+ };
93
+ var __importDefault = (this && this.__importDefault) || function (mod) {
94
+ return (mod && mod.__esModule) ? mod : { "default": mod };
95
+ };
96
+ Object.defineProperty(exports, "__esModule", { value: true });
97
+ var getAllFolders_1 = require("../getAllFolders");
98
+ var utils_1 = require("@sasjs/utils");
99
+ var test_1 = require("../../../../utils/test");
100
+ var configUtils = __importStar(require("../../../../utils/config"));
101
+ var utils_2 = require("../../../../utils");
102
+ var path_1 = __importDefault(require("path"));
103
+ describe('getAllFolders', function () {
104
+ var config;
105
+ var target;
106
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
107
+ var _a, _b, temp;
108
+ var _c, _d;
109
+ return __generator(this, function (_e) {
110
+ switch (_e.label) {
111
+ case 0: return [4 /*yield*/, (0, utils_2.setConstants)()];
112
+ case 1:
113
+ _e.sent();
114
+ _b = (_a = JSON).parse;
115
+ return [4 /*yield*/, (0, utils_1.readFile)(path_1.default.join(__dirname, '..', '..', '..', '..', 'config.json'))];
116
+ case 2:
117
+ (config = _b.apply(_a, [_e.sent()]).config);
118
+ config.jobConfig = {
119
+ jobFolders: ['sasjs/targets/viya/jobs'],
120
+ initProgram: '',
121
+ termProgram: '',
122
+ macroVars: {}
123
+ };
124
+ temp = (0, test_1.generateTestTarget)('testTarget', '/Public/app', {
125
+ serviceFolders: [
126
+ path_1.default.join('sasjs', 'targetServices'),
127
+ (_c = config.serviceConfig) === null || _c === void 0 ? void 0 : _c.serviceFolders[0] // duplicate
128
+ ],
129
+ initProgram: '',
130
+ termProgram: '',
131
+ macroVars: {}
132
+ }, utils_1.ServerType.SasViya, {
133
+ jobFolders: [
134
+ path_1.default.join('sasjs', 'targetJobs'),
135
+ (_d = config.jobConfig) === null || _d === void 0 ? void 0 : _d.jobFolders[0] // duplicate
136
+ ],
137
+ initProgram: '',
138
+ termProgram: '',
139
+ macroVars: {}
140
+ });
141
+ target = new utils_1.Target(__assign({}, temp.toJson()));
142
+ return [2 /*return*/];
143
+ }
144
+ });
145
+ }); });
146
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
147
+ return [2 /*return*/];
148
+ }); }); });
149
+ it('should get all service and job folders', function () { return __awaiter(void 0, void 0, void 0, function () {
150
+ var buildSourceFolder;
151
+ var _a, _b, _c, _d;
152
+ return __generator(this, function (_e) {
153
+ switch (_e.label) {
154
+ case 0:
155
+ jest
156
+ .spyOn(configUtils, 'getLocalOrGlobalConfig')
157
+ .mockImplementation(function () { return __awaiter(void 0, void 0, void 0, function () {
158
+ return __generator(this, function (_a) {
159
+ return [2 /*return*/, Promise.resolve({
160
+ configuration: config,
161
+ isLocal: true
162
+ })];
163
+ });
164
+ }); });
165
+ buildSourceFolder = process.sasjsConstants.buildSourceFolder;
166
+ return [4 /*yield*/, expect((0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Service, config)).resolves.toEqual(__spreadArray([], __read(new Set(Array.prototype.concat((_a = config.serviceConfig) === null || _a === void 0 ? void 0 : _a.serviceFolders.map(function (folder) {
167
+ return path_1.default.join(buildSourceFolder, folder);
168
+ }), (_b = target.serviceConfig) === null || _b === void 0 ? void 0 : _b.serviceFolders.map(function (folder) {
169
+ return path_1.default.join(buildSourceFolder, folder);
170
+ })))), false))];
171
+ case 1:
172
+ _e.sent();
173
+ return [4 /*yield*/, expect((0, getAllFolders_1.getAllFolders)(target, getAllFolders_1.SasFileType.Job, config)).resolves.toEqual(__spreadArray([], __read(new Set(Array.prototype.concat((_c = config.jobConfig) === null || _c === void 0 ? void 0 : _c.jobFolders.map(function (folder) {
174
+ return path_1.default.join(buildSourceFolder, folder);
175
+ }), (_d = target.jobConfig) === null || _d === void 0 ? void 0 : _d.jobFolders.map(function (folder) {
176
+ return path_1.default.join(buildSourceFolder, folder);
177
+ })))), false))];
178
+ case 2:
179
+ _e.sent();
180
+ return [2 /*return*/];
181
+ }
182
+ });
183
+ }); });
184
+ });
@@ -58,7 +58,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
58
58
  var config_1 = require("../../../utils/config");
59
59
  var test_1 = require("../../../utils/test");
60
60
  var utils_1 = require("@sasjs/utils");
61
- var getAllServiceFoldersModule = __importStar(require("../internal/getAllServiceFolders"));
61
+ var getAllFoldersModule = __importStar(require("../internal/getAllFolders"));
62
62
  var compileModule = __importStar(require("../compile"));
63
63
  describe('copyFilesToBuildFolder', function () {
64
64
  var appName;
@@ -106,9 +106,7 @@ describe('copyFilesToBuildFolder', function () {
106
106
  return __generator(this, function (_a) {
107
107
  switch (_a.label) {
108
108
  case 0:
109
- jest
110
- .spyOn(getAllServiceFoldersModule, 'getAllServiceFolders')
111
- .mockImplementation(function () {
109
+ jest.spyOn(getAllFoldersModule, 'getAllFolders').mockImplementation(function () {
112
110
  throw new Error('Test Error');
113
111
  });
114
112
  return [4 /*yield*/, (0, config_1.findTargetInConfiguration)('viya')];
@@ -259,11 +259,11 @@ function deployToSasViya(deployScriptName, target, isLocal, linesToExecute, logF
259
259
  * for printing web app url on console.
260
260
  */
261
261
  function deployToSas9(deployScriptName, target, linesToExecute, logFolder, streamConfig) {
262
- var _a, _b, _c, _d;
262
+ var _a, _b, _c, _d, _e;
263
263
  return __awaiter(this, void 0, void 0, function () {
264
- var username, password, sas9CredentialsError, sasjs, executionResult, appLoc, webAppStreamUrl;
265
- return __generator(this, function (_e) {
266
- switch (_e.label) {
264
+ var username, password, sas9CredentialsError, sasjs, completedWithError, executionResult, logContent, logFilePath, appLoc, webAppStreamUrl;
265
+ return __generator(this, function (_f) {
266
+ switch (_f.label) {
267
267
  case 0:
268
268
  if (target.authConfigSas9) {
269
269
  username = target.authConfigSas9.userName;
@@ -284,6 +284,7 @@ function deployToSas9(deployScriptName, target, linesToExecute, logFolder, strea
284
284
  appLoc: target.appLoc,
285
285
  serverType: target.serverType
286
286
  });
287
+ completedWithError = false;
287
288
  return [4 /*yield*/, sasjs
288
289
  .executeScriptSAS9(linesToExecute, username, password)
289
290
  .catch(function (err) {
@@ -292,30 +293,35 @@ function deployToSas9(deployScriptName, target, linesToExecute, logFolder, strea
292
293
  if (err && err.errorCode === 404) {
293
294
  (0, utils_1.displaySasjsRunnerError)(username);
294
295
  }
296
+ completedWithError = true;
297
+ return err;
295
298
  })];
296
299
  case 1:
297
- executionResult = _e.sent();
298
- if (!executionResult) return [3 /*break*/, 5];
299
- if (!logFolder) return [3 /*break*/, 3];
300
- return [4 /*yield*/, (0, utils_2.createFile)(path_1.default.join(logFolder, "".concat(deployScriptName.replace('.sas', ''), ".log")), executionResult !== null && executionResult !== void 0 ? executionResult : '')];
300
+ executionResult = _f.sent();
301
+ if (!executionResult) {
302
+ return [2 /*return*/, (_a = process.logger) === null || _a === void 0 ? void 0 : _a.error('Error getting execution log')];
303
+ }
304
+ if (!logFolder) {
305
+ return [2 /*return*/, (_b = process.logger) === null || _b === void 0 ? void 0 : _b.error('Unable to create log file.')];
306
+ }
307
+ logContent = completedWithError
308
+ ? executionResult.result
309
+ : executionResult;
310
+ logFilePath = path_1.default.join(logFolder, "".concat(deployScriptName.replace('.sas', ''), ".log"));
311
+ return [4 /*yield*/, (0, utils_2.createFile)(logFilePath, logContent !== null && logContent !== void 0 ? logContent : '')];
301
312
  case 2:
302
- _e.sent();
303
- (_a = process.logger) === null || _a === void 0 ? void 0 : _a.success("Deployment completed! Log is available at ".concat(path_1.default.join(logFolder, "".concat(deployScriptName.replace('.sas', ''), ".log"))));
304
- return [3 /*break*/, 4];
305
- case 3:
306
- (_b = process.logger) === null || _b === void 0 ? void 0 : _b.error('Unable to create log file.');
307
- _e.label = 4;
308
- case 4:
313
+ _f.sent();
314
+ if (completedWithError) {
315
+ (_c = process.logger) === null || _c === void 0 ? void 0 : _c.error("Deployment failed with errors! Log is available at ".concat(logFilePath));
316
+ throw new Error("Deployment failed.");
317
+ }
318
+ (_d = process.logger) === null || _d === void 0 ? void 0 : _d.success("Deployment completed! Log is available at ".concat(logFilePath));
309
319
  if (streamConfig === null || streamConfig === void 0 ? void 0 : streamConfig.streamWeb) {
310
320
  appLoc = target.appLoc.replace(/\ /g, '%20');
311
321
  webAppStreamUrl = "".concat(target.serverUrl, "/SASStoredProcess/?_PROGRAM=").concat(appLoc, "/services/").concat(streamConfig.streamServiceName);
312
- (_c = process.logger) === null || _c === void 0 ? void 0 : _c.info("Web app is available at ".concat(webAppStreamUrl));
322
+ (_e = process.logger) === null || _e === void 0 ? void 0 : _e.info("Web app is available at ".concat(webAppStreamUrl));
313
323
  }
314
- return [3 /*break*/, 6];
315
- case 5:
316
- (_d = process.logger) === null || _d === void 0 ? void 0 : _d.error('Error getting execution log');
317
- _e.label = 6;
318
- case 6: return [2 /*return*/];
324
+ return [2 /*return*/];
319
325
  }
320
326
  });
321
327
  });
@@ -225,13 +225,14 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath) {
225
225
  printTestUrl = function () { return process.logger.info("Test URL: ".concat(testUrl)); };
226
226
  printTestUrl();
227
227
  handleRes = function (res) { return __awaiter(_this, void 0, void 0, function () {
228
- var lineBreak, existingTestTarget, existingTestTarget;
228
+ var lineBreak, test_results, existingTestTarget, existingTestTarget;
229
229
  var _a, _b;
230
230
  return __generator(this, function (_c) {
231
231
  switch (_c.label) {
232
232
  case 0:
233
233
  lineBreak = true;
234
- if (!res.result) {
234
+ test_results = (_a = res.result) === null || _a === void 0 ? void 0 : _a.test_results;
235
+ if (!test_results) {
235
236
  (0, displayResult_1.displayError)({}, "Job did not return a response, to debug click ".concat(testUrl));
236
237
  printCodeExample();
237
238
  lineBreak = false;
@@ -258,8 +259,6 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath) {
258
259
  });
259
260
  }
260
261
  }
261
- if (!((_a = res.result) === null || _a === void 0 ? void 0 : _a.test_results))
262
- lineBreak = false;
263
262
  if (!res.log) return [3 /*break*/, 2];
264
263
  return [4 /*yield*/, (0, saveOutput_1.saveLog)(outDirectory, test, res.log, lineBreak)];
265
264
  case 1:
@@ -1,13 +1,13 @@
1
1
  /// <reference types="jest" />
2
2
  import { ServerType, Target, TargetJson, Configuration } from '@sasjs/utils/types';
3
3
  import { Folder } from '../types';
4
- import { ServiceConfig } from '@sasjs/utils/types/config';
4
+ import { ServiceConfig, JobConfig } from '@sasjs/utils/types/config';
5
5
  export declare const createTestApp: (parentFolder: string, appName: string) => Promise<void>;
6
6
  export declare const createTestJobsApp: (parentFolder: string, appName: string) => Promise<void>;
7
7
  export declare const createTestMinimalApp: (parentFolder: string, appName: string) => Promise<void>;
8
8
  export declare const removeTestApp: (parentFolder: string, appName: string) => Promise<void>;
9
9
  export declare const removeTestServerFolder: (folderPath: string, target: Target) => Promise<void>;
10
- export declare const generateTestTarget: (targetName: string, appLoc: string, serviceConfig?: ServiceConfig, serverType?: ServerType) => Target;
10
+ export declare const generateTestTarget: (targetName: string, appLoc: string, serviceConfig?: ServiceConfig, serverType?: ServerType, jobConfig?: JobConfig) => Target;
11
11
  export declare const createTestGlobalTarget: (targetName: string, appLoc: string, serviceConfig?: ServiceConfig, serverType?: ServerType) => Promise<Target>;
12
12
  export declare const verifyStep: (step?: 'db' | 'compile' | 'build', buildFileName?: string, customFiles?: 'custom' | 'no') => Promise<void>;
13
13
  export declare const mockProcessExit: () => jest.SpyInstance<never, [code?: number | undefined]>;
@@ -160,7 +160,7 @@ var removeTestServerFolder = function (folderPath, target) { return __awaiter(vo
160
160
  });
161
161
  }); };
162
162
  exports.removeTestServerFolder = removeTestServerFolder;
163
- var generateTestTarget = function (targetName, appLoc, serviceConfig, serverType) {
163
+ var generateTestTarget = function (targetName, appLoc, serviceConfig, serverType, jobConfig) {
164
164
  if (serviceConfig === void 0) { serviceConfig = {
165
165
  serviceFolders: [path_1.default.join('sasjs', 'services')],
166
166
  initProgram: '',
@@ -168,6 +168,12 @@ var generateTestTarget = function (targetName, appLoc, serviceConfig, serverType
168
168
  macroVars: {}
169
169
  }; }
170
170
  if (serverType === void 0) { serverType = types_1.ServerType.SasViya; }
171
+ if (jobConfig === void 0) { jobConfig = {
172
+ jobFolders: [],
173
+ initProgram: '',
174
+ termProgram: '',
175
+ macroVars: {}
176
+ }; }
171
177
  dotenv_1.default.config();
172
178
  var target = new types_1.Target({
173
179
  name: targetName,
@@ -183,12 +189,9 @@ var generateTestTarget = function (targetName, appLoc, serviceConfig, serverType
183
189
  access_token: process.env.ACCESS_TOKEN,
184
190
  refresh_token: process.env.REFRESH_TOKEN
185
191
  },
186
- jobConfig: {
187
- jobFolders: []
188
- },
192
+ jobConfig: jobConfig,
189
193
  serviceConfig: serviceConfig,
190
194
  testConfig: {
191
- testFolders: ['tests'],
192
195
  initProgram: path_1.default.join('tests', 'testinit.sas'),
193
196
  termProgram: path_1.default.join('tests', 'testterm.sas'),
194
197
  macroVars: {
package/package.json CHANGED
@@ -47,8 +47,8 @@
47
47
  "access": "public"
48
48
  },
49
49
  "dependencies": {
50
- "@sasjs/adapter": "^3.7.3",
51
- "@sasjs/core": "4.9.0",
50
+ "@sasjs/adapter": "3.7.6",
51
+ "@sasjs/core": "4.9.3",
52
52
  "@sasjs/lint": "1.11.2",
53
53
  "@sasjs/utils": "2.36.0",
54
54
  "chalk": "4.1.2",
@@ -94,5 +94,5 @@
94
94
  "typescript": "4.5.4",
95
95
  "util": "0.12.4"
96
96
  },
97
- "version": "3.7.6"
97
+ "version": "3.7.9"
98
98
  }
@@ -1,2 +0,0 @@
1
- import { Target } from '@sasjs/utils';
2
- export declare function getAllJobFolders(target: Target): Promise<string[]>;
@@ -1,2 +0,0 @@
1
- import { Target } from '@sasjs/utils';
2
- export declare function getAllServiceFolders(target: Target): Promise<string[]>;
@@ -1,91 +0,0 @@
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 __read = (this && this.__read) || function (o, n) {
39
- var m = typeof Symbol === "function" && o[Symbol.iterator];
40
- if (!m) return o;
41
- var i = m.call(o), r, ar = [], e;
42
- try {
43
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
44
- }
45
- catch (error) { e = { error: error }; }
46
- finally {
47
- try {
48
- if (r && !r.done && (m = i["return"])) m.call(i);
49
- }
50
- finally { if (e) throw e.error; }
51
- }
52
- return ar;
53
- };
54
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
55
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
56
- if (ar || !(i in from)) {
57
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
58
- ar[i] = from[i];
59
- }
60
- }
61
- return to.concat(ar || Array.prototype.slice.call(from));
62
- };
63
- Object.defineProperty(exports, "__esModule", { value: true });
64
- exports.getAllServiceFolders = void 0;
65
- var utils_1 = require("@sasjs/utils");
66
- var config_1 = require("../../../utils/config");
67
- function getAllServiceFolders(target) {
68
- var _a, _b;
69
- return __awaiter(this, void 0, void 0, function () {
70
- var configuration, allServices, buildSourceFolder;
71
- return __generator(this, function (_c) {
72
- switch (_c.label) {
73
- case 0: return [4 /*yield*/, (0, config_1.getLocalOrGlobalConfig)()];
74
- case 1:
75
- configuration = (_c.sent()).configuration;
76
- allServices = [];
77
- if ((_a = configuration === null || configuration === void 0 ? void 0 : configuration.serviceConfig) === null || _a === void 0 ? void 0 : _a.serviceFolders)
78
- allServices = __spreadArray([], __read(configuration.serviceConfig.serviceFolders), false);
79
- if ((_b = target === null || target === void 0 ? void 0 : target.serviceConfig) === null || _b === void 0 ? void 0 : _b.serviceFolders)
80
- allServices = __spreadArray(__spreadArray([], __read(allServices), false), __read(target.serviceConfig.serviceFolders), false);
81
- allServices = allServices.filter(function (p) { return !!p; });
82
- buildSourceFolder = process.sasjsConstants.buildSourceFolder;
83
- allServices = allServices.map(function (service) {
84
- return (0, utils_1.getAbsolutePath)(service, buildSourceFolder);
85
- });
86
- return [2 /*return*/, __spreadArray([], __read(new Set(allServices)), false)];
87
- }
88
- });
89
- });
90
- }
91
- exports.getAllServiceFolders = getAllServiceFolders;