@sasjs/cli 2.38.8 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/build/commands/add/addCredential.d.ts +2 -2
  2. package/build/commands/add/addCredential.js +26 -28
  3. package/build/commands/add/internal/input.js +15 -2
  4. package/build/commands/build/build.d.ts +1 -1
  5. package/build/commands/build/build.js +41 -19
  6. package/build/commands/build/internal/getLaunchPageCode.js +2 -1
  7. package/build/commands/compile/internal/compileServiceFile.js +11 -7
  8. package/build/commands/compile/internal/compileTestFile.js +1 -1
  9. package/build/commands/compile/internal/spec/compileTestFile.spec.js +16 -4
  10. package/build/commands/compile/spec/compile.spec.js +30 -0
  11. package/build/commands/compile/spec/loadDependencies.spec.js +3 -3
  12. package/build/commands/context/contextCommand.js +5 -5
  13. package/build/commands/deploy/deploy.d.ts +2 -1
  14. package/build/commands/deploy/deploy.js +92 -46
  15. package/build/commands/deploy/spec/cbd.spec.d.ts +1 -0
  16. package/build/commands/deploy/spec/cbd.spec.js +141 -0
  17. package/build/commands/deploy/spec/cbd.spec.server.js +6 -57
  18. package/build/commands/deploy/spec/utils.d.ts +6 -0
  19. package/build/commands/deploy/spec/utils.js +242 -0
  20. package/build/commands/flow/flowCommand.js +1 -1
  21. package/build/commands/flow/spec/flow.spec.server.js +1 -1
  22. package/build/commands/folder/folderCommand.js +2 -2
  23. package/build/commands/folder/spec/folder.spec.server.js +1 -1
  24. package/build/commands/job/internal/execute/index.d.ts +2 -0
  25. package/build/commands/job/internal/execute/index.js +14 -0
  26. package/build/commands/job/internal/execute/sasjs.d.ts +8 -0
  27. package/build/commands/job/internal/execute/sasjs.js +69 -0
  28. package/build/commands/job/{execute.d.ts → internal/execute/viya.d.ts} +1 -1
  29. package/build/commands/job/{execute.js → internal/execute/viya.js} +29 -68
  30. package/build/commands/job/internal/utils.d.ts +1 -0
  31. package/build/commands/job/internal/utils.js +81 -0
  32. package/build/commands/job/jobCommand.d.ts +2 -1
  33. package/build/commands/job/jobCommand.js +65 -23
  34. package/build/commands/job/spec/execute.spec.js +41 -21
  35. package/build/commands/job/spec/getContextName.spec.js +1 -1
  36. package/build/commands/job/spec/job.spec.server.js +4 -4
  37. package/build/commands/job/spec/jobCommand.spec.js +10 -10
  38. package/build/commands/request/request.js +1 -1
  39. package/build/commands/run/run.js +2 -2
  40. package/build/commands/servicepack/spec/servicepack.spec.server.js +0 -1
  41. package/build/commands/shared/deployToSasViyaWithServicePack.js +1 -1
  42. package/build/commands/testing/test.js +1 -1
  43. package/build/config.json +3 -1
  44. package/build/utils/config.js +104 -64
  45. package/build/utils/file.d.ts +1 -1
  46. package/build/utils/file.js +1 -1
  47. package/build/utils/spec/removeComments.spec.d.ts +1 -1
  48. package/build/utils/spec/removeComments.spec.js +1 -1
  49. package/build/utils/test.js +1 -1
  50. package/build/utils/utils.d.ts +1 -0
  51. package/build/utils/utils.js +8 -2
  52. package/package.json +13 -13
@@ -1,4 +1,4 @@
1
- import { SasAuthResponse, Target } from '@sasjs/utils/types';
1
+ import { SasAuthResponse, Target, HttpsAgentOptions } from '@sasjs/utils/types';
2
2
  import { TargetScope } from '../../types/targetScope';
3
3
  /**
4
4
  * Creates a .env file for the specified target.
@@ -10,6 +10,6 @@ import { TargetScope } from '../../types/targetScope';
10
10
  */
11
11
  export declare const addCredential: (target: Target, insecure: boolean, targetScope: TargetScope) => Promise<Target>;
12
12
  export declare const validateTargetName: (targetName: string) => string;
13
- export declare const getTokens: (target: Target, client: string, secret: string, insecure?: boolean) => Promise<SasAuthResponse>;
13
+ export declare const getTokens: (target: Target, client: string, secret: string, httpsAgentOptions?: HttpsAgentOptions | undefined) => Promise<SasAuthResponse>;
14
14
  export declare const createEnvFileForViya: (targetName: string, client: string, secret: string, accessToken: string, refreshToken: string) => Promise<void>;
15
15
  export declare const createEnvFileForSas9: (targetName: string, userName: string, password: string) => Promise<void>;
@@ -69,12 +69,13 @@ var saveConfig_1 = require("./internal/saveConfig");
69
69
  * @param {boolean} insecure- boolean to use insecure connection, default is false. lf true the server will not reject any connection which is not authorized with the list of supplied CAs
70
70
  */
71
71
  var addCredential = function (target, insecure, targetScope) { return __awaiter(void 0, void 0, void 0, function () {
72
- var serverUrl, filePath, _a, client, secret, _b, access_token, refresh_token, filePath, _c, userName, password, filePath;
72
+ var httpsAgentOptions, serverUrl, filePath, _a, client, secret, _b, access_token, refresh_token, filePath, _c, userName, password, filePath;
73
73
  var _d, _e, _f, _g;
74
74
  return __generator(this, function (_h) {
75
75
  switch (_h.label) {
76
76
  case 0:
77
- insecure = insecure || target.allowInsecureRequests;
77
+ httpsAgentOptions = insecure
78
+ ? __assign(__assign({}, target.httpsAgentOptions), { allowInsecureRequests: true, rejectUnauthorized: false }) : target.httpsAgentOptions;
78
79
  if (insecure)
79
80
  (_d = process.logger) === null || _d === void 0 ? void 0 : _d.warn('Executing with insecure connection.');
80
81
  if (!!target.serverUrl) return [3 /*break*/, 3];
@@ -92,7 +93,7 @@ var addCredential = function (target, insecure, targetScope) { return __awaiter(
92
93
  return [4 /*yield*/, input_1.getCredentialsInputForViya(target.name)];
93
94
  case 4:
94
95
  _a = _h.sent(), client = _a.client, secret = _a.secret;
95
- return [4 /*yield*/, exports.getTokens(target, client, secret, insecure)];
96
+ return [4 /*yield*/, exports.getTokens(target, client, secret, httpsAgentOptions)];
96
97
  case 5:
97
98
  _b = _h.sent(), access_token = _b.access_token, refresh_token = _b.refresh_token;
98
99
  if (!(targetScope === targetScope_1.TargetScope.Local)) return [3 /*break*/, 7];
@@ -144,32 +145,29 @@ var validateTargetName = function (targetName) {
144
145
  return targetName;
145
146
  };
146
147
  exports.validateTargetName = validateTargetName;
147
- var getTokens = function (target, client, secret, insecure) {
148
- if (insecure === void 0) { insecure = false; }
149
- return __awaiter(void 0, void 0, void 0, function () {
150
- var adapter, authResponse;
151
- var _a;
152
- return __generator(this, function (_b) {
153
- switch (_b.label) {
154
- case 0:
155
- adapter = new node_1.default({
156
- serverUrl: target.serverUrl,
157
- serverType: target.serverType,
158
- allowInsecureRequests: insecure,
159
- debug: ((_a = process.logger) === null || _a === void 0 ? void 0 : _a.logLevel) === logger_1.LogLevel.Debug
160
- });
161
- return [4 /*yield*/, auth_1.getNewAccessToken(adapter, client, secret, target).catch(function (e) {
162
- var _a;
163
- (_a = process.logger) === null || _a === void 0 ? void 0 : _a.error("An error has occurred while validating your credentials: " + e + "\nPlease check your Client ID and Client Secret and try again.\n");
164
- throw e;
165
- })];
166
- case 1:
167
- authResponse = _b.sent();
168
- return [2 /*return*/, authResponse];
169
- }
170
- });
148
+ var getTokens = function (target, client, secret, httpsAgentOptions) { return __awaiter(void 0, void 0, void 0, function () {
149
+ var adapter, authResponse;
150
+ var _a;
151
+ return __generator(this, function (_b) {
152
+ switch (_b.label) {
153
+ case 0:
154
+ adapter = new node_1.default({
155
+ serverUrl: target.serverUrl,
156
+ serverType: target.serverType,
157
+ httpsAgentOptions: httpsAgentOptions,
158
+ debug: ((_a = process.logger) === null || _a === void 0 ? void 0 : _a.logLevel) === logger_1.LogLevel.Debug
159
+ });
160
+ return [4 /*yield*/, auth_1.getNewAccessToken(adapter, client, secret, target).catch(function (e) {
161
+ var _a;
162
+ (_a = process.logger) === null || _a === void 0 ? void 0 : _a.error("An error has occurred while validating your credentials: " + e + "\nPlease check your Client ID and Client Secret and try again.\n");
163
+ throw e;
164
+ })];
165
+ case 1:
166
+ authResponse = _b.sent();
167
+ return [2 /*return*/, authResponse];
168
+ }
171
169
  });
172
- };
170
+ }); };
173
171
  exports.getTokens = getTokens;
174
172
  var createEnvFileForViya = function (targetName, client, secret, accessToken, refreshToken) { return __awaiter(void 0, void 0, void 0, function () {
175
173
  var envFileContent, envFilePath;
@@ -1,4 +1,15 @@
1
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
+ };
2
13
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
14
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
15
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -229,7 +240,7 @@ exports.getAndValidateSas9Fields = getAndValidateSas9Fields;
229
240
  function getAndValidateSasViyaFields(target, scope, serverUrl, insecure, authenticateCallback) {
230
241
  var _a;
231
242
  return __awaiter(this, void 0, void 0, function () {
232
- var contextName, shouldAuthenticate, sasjs, contexts, contextNumberErrorMessage, contextNumber;
243
+ var contextName, shouldAuthenticate, httpsAgentOptions, sasjs, contexts, contextNumberErrorMessage, contextNumber;
233
244
  return __generator(this, function (_b) {
234
245
  switch (_b.label) {
235
246
  case 0:
@@ -241,10 +252,12 @@ function getAndValidateSasViyaFields(target, scope, serverUrl, insecure, authent
241
252
  return [4 /*yield*/, authenticateCallback(target, insecure, scope)];
242
253
  case 2:
243
254
  target = _b.sent();
255
+ httpsAgentOptions = insecure
256
+ ? __assign(__assign({}, target.httpsAgentOptions), { allowInsecureRequests: true, rejectUnauthorized: false }) : target.httpsAgentOptions;
244
257
  sasjs = new node_1.default({
245
258
  serverUrl: serverUrl,
246
259
  serverType: types_1.ServerType.SasViya,
247
- allowInsecureRequests: insecure,
260
+ httpsAgentOptions: httpsAgentOptions,
248
261
  debug: ((_a = process.logger) === null || _a === void 0 ? void 0 : _a.logLevel) === logger_1.LogLevel.Debug
249
262
  });
250
263
  contexts = [];
@@ -1,3 +1,3 @@
1
- import { Target } from '@sasjs/utils/types';
1
+ import { Target } from '@sasjs/utils';
2
2
  export declare function build(target: Target): Promise<void>;
3
3
  export declare function getBuildVars(target: Target): Promise<string>;
@@ -84,8 +84,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
84
84
  Object.defineProperty(exports, "__esModule", { value: true });
85
85
  exports.getBuildVars = exports.build = void 0;
86
86
  var path_1 = __importDefault(require("path"));
87
- var types_1 = require("@sasjs/utils/types");
88
87
  var utils_1 = require("@sasjs/utils");
88
+ var error_1 = require("@sasjs/utils/error");
89
89
  var utils_2 = require("../../utils/utils");
90
90
  var file_1 = require("../../utils/file");
91
91
  var config_1 = require("../../utils/config");
@@ -205,7 +205,7 @@ function getBuildInfo(target, streamWeb) {
205
205
  return [4 /*yield*/, dependencies_1.getDependencyPaths(buildConfig, macroFolders)];
206
206
  case 3:
207
207
  dependencyFilePaths = _a.sent();
208
- if (!(target.serverType === types_1.ServerType.SasViya && streamWeb)) return [3 /*break*/, 8];
208
+ if (!(target.serverType === utils_1.ServerType.SasViya && streamWeb)) return [3 /*break*/, 8];
209
209
  return [4 /*yield*/, getCreateFileScript(serverType)];
210
210
  case 4:
211
211
  createFileScript = _a.sent();
@@ -245,15 +245,22 @@ function getCreateWebServiceScript(serverType) {
245
245
  case 0:
246
246
  _a = serverType;
247
247
  switch (_a) {
248
- case types_1.ServerType.SasViya: return [3 /*break*/, 1];
249
- case types_1.ServerType.Sas9: return [3 /*break*/, 3];
248
+ case utils_1.ServerType.SasViya: return [3 /*break*/, 1];
249
+ case utils_1.ServerType.Sas9: return [3 /*break*/, 3];
250
+ case utils_1.ServerType.Sasjs: return [3 /*break*/, 5];
250
251
  }
251
- return [3 /*break*/, 5];
252
+ return [3 /*break*/, 7];
252
253
  case 1: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/viya/mv_createwebservice.sas")];
253
254
  case 2: return [2 /*return*/, _b.sent()];
254
- case 3: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/meta/mm_createwebservice.sas")];
255
- case 4: return [2 /*return*/, _b.sent()];
256
- case 5: throw new Error("Invalid server type: valid options are " + types_1.ServerType.SasViya + " and " + types_1.ServerType.Sas9);
255
+ case 3: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/meta/mm_createwebservice.sas")
256
+ // FIXME: use sasjs/mv_createwebservice.sas ones created
257
+ ];
258
+ case 4: return [2 /*return*/, _b.sent()
259
+ // FIXME: use sasjs/mv_createwebservice.sas ones created
260
+ ];
261
+ case 5: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/viya/mv_createwebservice.sas")];
262
+ case 6: return [2 /*return*/, _b.sent()];
263
+ case 7: throw new error_1.ServerTypeError();
257
264
  }
258
265
  });
259
266
  });
@@ -266,12 +273,19 @@ function getCreateFileScript(serverType) {
266
273
  case 0:
267
274
  _a = serverType;
268
275
  switch (_a) {
269
- case types_1.ServerType.SasViya: return [3 /*break*/, 1];
276
+ case utils_1.ServerType.SasViya: return [3 /*break*/, 1];
277
+ case utils_1.ServerType.Sasjs: return [3 /*break*/, 3];
270
278
  }
271
- return [3 /*break*/, 3];
272
- case 1: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/viya/mv_createfile.sas")];
273
- case 2: return [2 /*return*/, _b.sent()];
274
- case 3: throw new Error("Invalid server type: valid option is " + types_1.ServerType.SasViya);
279
+ return [3 /*break*/, 5];
280
+ case 1: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/viya/mv_createfile.sas")
281
+ // FIXME: use sasjs/mv_createfile.sas ones created
282
+ ];
283
+ case 2: return [2 /*return*/, _b.sent()
284
+ // FIXME: use sasjs/mv_createfile.sas ones created
285
+ ];
286
+ case 3: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/viya/mv_createfile.sas")];
287
+ case 4: return [2 /*return*/, _b.sent()];
288
+ case 5: throw new error_1.ServerTypeError([utils_1.ServerType.SasViya, utils_1.ServerType.Sasjs]);
275
289
  }
276
290
  });
277
291
  });
@@ -281,16 +295,20 @@ function getWebServiceScriptInvocation(serverType, filePath, isSASFile, encoded)
281
295
  if (isSASFile === void 0) { isSASFile = true; }
282
296
  if (encoded === void 0) { encoded = false; }
283
297
  var loc = filePath === '' ? 'services' : 'tests';
298
+ var encodedParam = encoded ? ', intype=BASE64' : '';
284
299
  switch (serverType) {
285
- case types_1.ServerType.SasViya:
286
- var encodedParam = encoded ? ', intype=BASE64' : '';
300
+ case utils_1.ServerType.SasViya:
287
301
  return isSASFile
288
302
  ? "%mv_createwebservice(path=&appLoc/" + loc + "/&path, name=&service, code=sascode ,replace=yes)"
289
303
  : "%mv_createfile(path=&appLoc/" + loc + "/&path, name=&filename, inref=filecode" + encodedParam + ")";
290
- case types_1.ServerType.Sas9:
304
+ case utils_1.ServerType.Sas9:
291
305
  return "%mm_createwebservice(path=&appLoc/" + loc + "/&path, name=&service, code=sascode ,replace=yes)";
306
+ case utils_1.ServerType.Sasjs:
307
+ return isSASFile
308
+ ? "%mv_createwebservice(path=&appLoc/" + loc + "/&path, name=&service, code=sascode ,replace=yes)"
309
+ : "%mv_createfile(path=&appLoc/" + loc + "/&path, name=&filename, inref=filecode" + encodedParam + ")";
292
310
  default:
293
- throw new Error("Invalid server type: valid options are " + types_1.ServerType.SasViya + " and " + types_1.ServerType.Sas9);
311
+ throw new error_1.ServerTypeError();
294
312
  }
295
313
  }
296
314
  /**
@@ -463,12 +481,16 @@ function getServiceText(serviceFileName, fileContent, serverType, testPath) {
463
481
  content += "\n put '" + escapedLine.trim() + "';";
464
482
  }
465
483
  });
466
- return "%let service=" + serviceName + ";\nfilename sascode temp lrecl=32767;\ndata _null_;\nfile sascode;\n" + content + "\n\nrun;\n" + getWebServiceScriptInvocation(serverType, compileTestFile_1.isTestFile(serviceFileName) && testPath ? "" + testPath : '') + "\nfilename sascode clear;\n";
484
+ return "%let service=" + serviceName + ";\nfilename sascode temp lrecl=32767;\ndata _null_;\nfile sascode;\n" + content + "\n\nrun;\n" + (serverType !== utils_1.ServerType.Sasjs
485
+ ? getWebServiceScriptInvocation(serverType, compileTestFile_1.isTestFile(serviceFileName) && testPath ? "" + testPath : '')
486
+ : '') + "\nfilename sascode clear;\n";
467
487
  }
468
488
  function getFileText(fileName, fileContent, serverType) {
469
489
  var fileExtension = path_1.default.extname(fileName).substring(1).toUpperCase();
470
490
  var _a = getWebFileContent(fileContent, fileExtension), content = _a.content, maxLineLength = _a.maxLineLength;
471
- return "%let filename=" + fileName + ";\nfilename filecode temp lrecl=" + maxLineLength + ";\ndata _null_;\nfile filecode;\n" + content + "\n\nrun;\n" + getWebServiceScriptInvocation(serverType, undefined, false, true) + "\nfilename filecode clear;\n";
491
+ return "%let filename=" + fileName + ";\nfilename filecode temp lrecl=" + maxLineLength + ";\ndata _null_;\nfile filecode;\n" + content + "\n\nrun;\n" + (serverType !== utils_1.ServerType.Sasjs
492
+ ? getWebServiceScriptInvocation(serverType, undefined, false, true)
493
+ : '') + "\nfilename filecode clear;\n";
472
494
  }
473
495
  function getWebFileContent(filecontent, type) {
474
496
  var parsedContent = '';
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getLaunchPageCode = void 0;
4
+ var error_1 = require("@sasjs/utils/error");
4
5
  var types_1 = require("@sasjs/utils/types");
5
6
  var SAS9Code = function (streamServiceName) { return "\noptions notes;\ndata _null_;\n format url $256.;\n rc=METADATA_GETURI(\"Stored Process Web App\",url);\n url=coalescec(url,\"localhost/SASStoredProcess\");\n urlEscaped = tranwrd(trim(url),\" \",\"%20\");\n putlog \"NOTE: SASjs Streaming App Created! Check it out here:\" ;\n putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";\n putlog \"NOTE- \" urlEscaped +(-1) \"?_program=&appLoc/services/" + streamServiceName + "\" ;\n putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";\nrun;\n"; };
6
7
  var SASViyaCode = function (streamServiceName) { return "\n\n/**\n * The streamService we just deployed (as a _FILE) had the compile-time appLoc\n * In this section we replace with the deploy-time appLoc\n */\n\nfilename _homein filesrvc\n folderPath=\"&apploc/services\"\n filename=\"" + streamServiceName + ".html\"\n recfm=v\n lrecl=1048544;\n\n%let local_file=%sysfunc(pathname(work))/service.html;\nfilename _homeout \"&local_file\";\n\ndata _null_;\n rc=fcopy('_homein','_homeout');\n put rc=;\nrun;\n\n%mp_gsubfile(file=&local_file, patternvar=compiled_apploc, replacevar=apploc)\n\ndata _null_;\n rc=fcopy('_homeout','_homein');\n put rc=;\nrun;\n\n/* Tell the user where the app was deployed so they can open it */\noptions notes;\ndata _null_;\n if symexist('_baseurl') then do;\n url=symget('_baseurl');\n if subpad(url,length(url)-9,9)='SASStudio'\n then url=substr(url,1,length(url)-11);\n else url=\"&systcpiphostname\";\n end;\n else url=\"&systcpiphostname\";\n url=cats(url,\"/SASJobExecution?_FILE=&appLoc/services/\");\n urlEscaped = tranwrd(trim(url),\" \",\"%20\");\n putlog \"NOTE: SASjs Streaming App Created! Check it out here:\" ;\n putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";\n putlog \"NOTE- \" urlEscaped +(-1) '" + streamServiceName + ".html&_debug=2' ;\n putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";putlog \"NOTE- \";\nrun;\n"; };
@@ -11,7 +12,7 @@ var getLaunchPageCode = function (serverType, streamServiceName) {
11
12
  case types_1.ServerType.Sas9:
12
13
  return SAS9Code(streamServiceName);
13
14
  default:
14
- throw new Error("Invalid server type: valid options are " + types_1.ServerType.SasViya + " and " + types_1.ServerType.Sas9);
15
+ throw new error_1.ServerTypeError([types_1.ServerType.SasViya, types_1.ServerType.Sas9]);
15
16
  }
16
17
  };
17
18
  exports.getLaunchPageCode = getLaunchPageCode;
@@ -37,18 +37,20 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.getPreCodeForServicePack = exports.compileServiceFile = void 0;
40
- var types_1 = require("@sasjs/utils/types");
41
40
  var config_1 = require("../../../utils/config");
42
41
  var utils_1 = require("@sasjs/utils");
42
+ var types_1 = require("@sasjs/utils/types");
43
+ var error_1 = require("@sasjs/utils/error");
43
44
  var loadDependencies_1 = require("./loadDependencies");
44
45
  var getServerType_1 = require("./getServerType");
46
+ var compileTestFile_1 = require("./compileTestFile");
45
47
  function compileServiceFile(target, filePath, macroFolders, programFolders, programVar) {
46
48
  if (programVar === void 0) { programVar = ''; }
47
49
  return __awaiter(this, void 0, void 0, function () {
48
50
  var dependencies, serverType, preCode;
49
51
  return __generator(this, function (_a) {
50
52
  switch (_a.label) {
51
- case 0: return [4 /*yield*/, loadDependencies_1.loadDependencies(target, filePath, macroFolders, programFolders)];
53
+ case 0: return [4 /*yield*/, loadDependencies_1.loadDependencies(target, filePath, macroFolders, programFolders, compileTestFile_1.isTestFile(filePath) ? 'test' : undefined)];
52
54
  case 1:
53
55
  dependencies = _a.sent();
54
56
  return [4 /*yield*/, getServerType_1.getServerType(target)];
@@ -79,8 +81,9 @@ function getPreCodeForServicePack(serverType) {
79
81
  switch (_a) {
80
82
  case types_1.ServerType.SasViya: return [3 /*break*/, 1];
81
83
  case types_1.ServerType.Sas9: return [3 /*break*/, 5];
84
+ case types_1.ServerType.Sasjs: return [3 /*break*/, 9];
82
85
  }
83
- return [3 /*break*/, 9];
86
+ return [3 /*break*/, 10];
84
87
  case 1:
85
88
  _b = content;
86
89
  return [4 /*yield*/, utils_1.readFile(macroCorePath + "/base/mf_getuser.sas")];
@@ -102,7 +105,7 @@ function getPreCodeForServicePack(serverType) {
102
105
  '%macro webout(action,ds,dslabel=,fmt=);\n' +
103
106
  '%mv_webout(&action,ds=&ds,dslabel=&dslabel,fmt=&fmt)\n' +
104
107
  '%mend;\n';
105
- return [3 /*break*/, 10];
108
+ return [3 /*break*/, 11];
106
109
  case 5:
107
110
  _e = content;
108
111
  return [4 /*yield*/, utils_1.readFile(macroCorePath + "/base/mf_getuser.sas")];
@@ -120,9 +123,10 @@ function getPreCodeForServicePack(serverType) {
120
123
  ' %macro webout(action,ds,dslabel=,fmt=);\n' +
121
124
  ' %mm_webout(&action,ds=&ds,dslabel=&dslabel,fmt=&fmt)\n' +
122
125
  ' %mend;\n';
123
- return [3 /*break*/, 10];
124
- case 9: throw new Error("Invalid server type: valid options are 'SASVIYA' and 'SAS9'.");
125
- case 10:
126
+ return [3 /*break*/, 11];
127
+ case 9: return [3 /*break*/, 11];
128
+ case 10: throw new error_1.ServerTypeError();
129
+ case 11:
126
130
  content +=
127
131
  '/* provide additional debug info */\n' +
128
132
  '%global _program;\n' +
@@ -71,7 +71,7 @@ var config_1 = require("../../../utils/config");
71
71
  var compileServiceFile_1 = require("./compileServiceFile");
72
72
  var utils_2 = require("../../../utils/utils");
73
73
  var testsBuildFolder = function () {
74
- return path_1.default.join(process.currentDir, 'sasjsbuild', 'tests');
74
+ return path_1.default.join(process.projectDir, 'sasjsbuild', 'tests');
75
75
  };
76
76
  var getFileName = function (filePath) { return path_1.default.parse(filePath).base; };
77
77
  function compileTestFile(target, filePath, testVar, saveToRoot, removeOriginalFile) {
@@ -66,7 +66,7 @@ describe('compileTestFile', function () {
66
66
  }, utils_1.ServerType.SasViya);
67
67
  var target = new utils_1.Target(__assign(__assign({}, temp.toJson()), { jobConfig: {
68
68
  jobFolders: [path_1.default.join('sasjs', 'jobs')]
69
- } }));
69
+ }, macroFolders: ['sasjs/macros'] }));
70
70
  var sasjsPath;
71
71
  var testBody;
72
72
  var buildPath;
@@ -151,6 +151,9 @@ describe('compileTestFile', function () {
151
151
  _a.sent();
152
152
  return [4 /*yield*/, testContent(path_1.default.join('testteardown.sas'))];
153
153
  case 5:
154
+ _a.sent();
155
+ return [4 /*yield*/, testContent(path_1.default.join('macros', 'testMacro.test.sas'))];
156
+ case 6:
154
157
  _a.sent();
155
158
  return [2 /*return*/];
156
159
  }
@@ -236,6 +239,7 @@ describe('compileTestFile', function () {
236
239
  expectedTestFlow = {
237
240
  tests: [
238
241
  ['tests', 'jobs', 'jobs', 'testJob.test.sas'].join('/'),
242
+ ['tests', 'macros', 'testMacro.test.sas'].join('/'),
239
243
  ['tests', 'services', 'services', 'admin', 'random.test.sas'].join('/'),
240
244
  ['tests', 'services', 'services', 'admin', 'random.test.0.sas'].join('/')
241
245
  ].sort(),
@@ -290,6 +294,11 @@ describe('compileTestFile', function () {
290
294
  'test',
291
295
  'standalone'
292
296
  ],
297
+ [
298
+ ['tests', 'macros', 'testMacro.test.sas'].join('/'),
299
+ 'test',
300
+ 'standalone'
301
+ ],
293
302
  [
294
303
  ['tests', 'services', 'services', 'admin', 'random.test.sas'].join('/'),
295
304
  'test',
@@ -313,9 +322,9 @@ describe('compileTestFile', function () {
313
322
  return [4 /*yield*/, compile_1.compile(target)];
314
323
  case 1:
315
324
  _a.sent();
316
- expect(process.logger.info).toHaveBeenCalledTimes(14);
317
- expect(process.logger.info).toHaveBeenNthCalledWith(12, "Test coverage:");
318
- expect(process.logger.info).toHaveBeenNthCalledWith(13, "Services coverage: 0/4 (" + chalk_1.default.greenBright('0%') + ")");
325
+ expect(process.logger.info).toHaveBeenCalledTimes(15);
326
+ expect(process.logger.info).toHaveBeenNthCalledWith(13, "Test coverage:");
327
+ expect(process.logger.info).toHaveBeenNthCalledWith(14, "Services coverage: 0/4 (" + chalk_1.default.greenBright('0%') + ")");
319
328
  expect(process.logger.info).toHaveBeenLastCalledWith("Overall coverage: 0/4 (" + chalk_1.default.greenBright('0%') + ")");
320
329
  return [2 /*return*/];
321
330
  }
@@ -348,6 +357,9 @@ var copyTestFiles = function (appName) { return __awaiter(void 0, void 0, void 0
348
357
  _a.sent();
349
358
  return [4 /*yield*/, utils_1.copy(path_1.default.join(__dirname, 'testFiles', 'jobs'), path_1.default.join(__dirname, appName, 'sasjs', 'jobs'))];
350
359
  case 3:
360
+ _a.sent();
361
+ return [4 /*yield*/, utils_1.copy(path_1.default.join(__dirname, 'testFiles', 'macros'), path_1.default.join(__dirname, appName, 'sasjs', 'macros'))];
362
+ case 4:
351
363
  _a.sent();
352
364
  return [2 /*return*/];
353
365
  }
@@ -133,6 +133,36 @@ describe('sasjs compile', function () {
133
133
  }
134
134
  });
135
135
  }); });
136
+ it('it should compile project from sub folder', function () { return __awaiter(void 0, void 0, void 0, function () {
137
+ var serviceFolder, testFile, wrongSasjsBuildFolder, correctSasjsBuildFolder, correctBuildFile;
138
+ return __generator(this, function (_a) {
139
+ switch (_a.label) {
140
+ case 0:
141
+ serviceFolder = path_1.default.join(process.projectDir, 'sasjs', 'services', 'admin');
142
+ testFile = 'dostuff.test.sas';
143
+ wrongSasjsBuildFolder = path_1.default.join(serviceFolder, 'sasjsbuild');
144
+ correctSasjsBuildFolder = path_1.default.join(process.currentDir, 'sasjsbuild');
145
+ correctBuildFile = path_1.default.join(correctSasjsBuildFolder, 'tests', 'services', 'admin', testFile);
146
+ return [4 /*yield*/, utils_1.createFile(path_1.default.join(serviceFolder, testFile), '')];
147
+ case 1:
148
+ _a.sent();
149
+ process.currentDir = serviceFolder;
150
+ return [4 /*yield*/, expect(compileModule.compile(target)).toResolve()];
151
+ case 2:
152
+ _a.sent();
153
+ return [4 /*yield*/, expect(utils_1.folderExists(wrongSasjsBuildFolder)).resolves.toEqual(false)];
154
+ case 3:
155
+ _a.sent();
156
+ return [4 /*yield*/, expect(utils_1.folderExists(correctSasjsBuildFolder)).resolves.toEqual(true)];
157
+ case 4:
158
+ _a.sent();
159
+ return [4 /*yield*/, expect(utils_1.fileExists(correctBuildFile)).resolves.toEqual(true)];
160
+ case 5:
161
+ _a.sent();
162
+ return [2 /*return*/];
163
+ }
164
+ });
165
+ }); });
136
166
  it('should compile an uncompiled project', function () { return __awaiter(void 0, void 0, void 0, function () {
137
167
  return __generator(this, function (_a) {
138
168
  switch (_a.label) {
@@ -74,8 +74,8 @@ var utils_1 = require("@sasjs/utils");
74
74
  var internalModule = __importStar(require("../internal/config"));
75
75
  var test_1 = require("../../../utils/test");
76
76
  var loadDependencies_1 = require("../internal/loadDependencies");
77
- var fakeInit = "/**\n @file serviceinit.sas\n @brief this file is called with every service\n @details This file is included in *every* service, *after* the macros and *before* the service code.\n\n <h4> Dependencies </h4>\n @li mf_abort.sas\n\n**/\n\noptions\n DATASTMTCHK=ALLKEYWORDS /* some sites have this enabled */\n PS=MAX /* reduce log size slightly */\n;\n%put service is starting!!;";
78
- var fakeTerm = "/**\n @file serviceterm.sas\n @brief this file is called at the end of every service\n @details This file is included at the *end* of every service.\n\n <h4> Dependencies </h4>\n @li mf_abort.sas\n @li mf_existds.sas\n\n**/\n\n%put service is finishing. Thanks, SASjs!;";
77
+ var fakeInit = "/**\n @file serviceinit.sas\n @brief this file is called with every service\n @details This file is included in *every* service, *after* the macros and *before* the service code.\n\n <h4> SAS Macros </h4>\n @li mf_abort.sas\n\n**/\n\noptions\n DATASTMTCHK=ALLKEYWORDS /* some sites have this enabled */\n PS=MAX /* reduce log size slightly */\n;\n%put service is starting!!;";
78
+ var fakeTerm = "/**\n @file serviceterm.sas\n @brief this file is called at the end of every service\n @details This file is included at the *end* of every service.\n\n <h4> SAS Macros </h4>\n @li mf_abort.sas\n @li mf_existds.sas\n\n**/\n\n%put service is finishing. Thanks, SASjs!;";
79
79
  var fakeInit2 = "/**\n @file serviceinit.sas\n @brief this file is called with every service\n @details This file is included in *every* service, *after* the macros and *before* the service code.\n\n <h4> SAS Macros </h4>\n @li mf_abort.sas\n\n**/\n\noptions\n DATASTMTCHK=ALLKEYWORDS /* some sites have this enabled */\n PS=MAX /* reduce log size slightly */\n;\n%put service is starting!!;";
80
80
  var fakeTerm2 = "/**\n @file serviceterm.sas\n @brief this file is called at the end of every service\n @details This file is included at the *end* of every service.\n\n <h4> SAS Macros </h4>\n @li mf_abort.sas\n @li mf_existds.sas\n\n**/\n\n%put service is finishing. Thanks, SASjs!;";
81
81
  var fakeJobInit = "/**\n @file\n @brief This code is inserted into the beginning of each Viya Job.\n @details Inserted during the `sasjs compile` step. Add any code here that\n should go at the beginning of every deployed job.\n\n The path to this file should be listed in the `jobInit` property of the\n sasjsconfig file.\n\n <h4> SAS Programs </h4>\n @li test.sas TEST\n\n <h4> SAS Macros </h4>\n @li examplemacro.sas\n\n**/\n\n%example(Job Init is executing!)\n\n%let mylib=WORK;";
@@ -188,7 +188,7 @@ describe('loadDependencies', function () {
188
188
  }
189
189
  });
190
190
  }); });
191
- test('it should load dependencies for a job <h4> Dependencies </h4>', function () { return __awaiter(void 0, void 0, void 0, function () {
191
+ test('it should load dependencies for a job <h4> SAS Macros </h4>', function () { return __awaiter(void 0, void 0, void 0, function () {
192
192
  var dependencies;
193
193
  return __generator(this, function (_a) {
194
194
  switch (_a.label) {
@@ -221,7 +221,7 @@ var ContextCommand = /** @class */ (function (_super) {
221
221
  target = (_a.sent()).target;
222
222
  sasjs = new node_1.default({
223
223
  serverUrl: target.serverUrl,
224
- allowInsecureRequests: target.allowInsecureRequests,
224
+ httpsAgentOptions: target.httpsAgentOptions,
225
225
  appLoc: target.appLoc,
226
226
  serverType: target.serverType
227
227
  });
@@ -269,7 +269,7 @@ var ContextCommand = /** @class */ (function (_super) {
269
269
  target = (_a.sent()).target;
270
270
  sasjs = new node_1.default({
271
271
  serverUrl: target.serverUrl,
272
- allowInsecureRequests: target.allowInsecureRequests,
272
+ httpsAgentOptions: target.httpsAgentOptions,
273
273
  appLoc: target.appLoc,
274
274
  serverType: target.serverType
275
275
  });
@@ -308,7 +308,7 @@ var ContextCommand = /** @class */ (function (_super) {
308
308
  target = (_a.sent()).target;
309
309
  sasjs = new node_1.default({
310
310
  serverUrl: target.serverUrl,
311
- allowInsecureRequests: target.allowInsecureRequests,
311
+ httpsAgentOptions: target.httpsAgentOptions,
312
312
  appLoc: target.appLoc,
313
313
  serverType: target.serverType
314
314
  });
@@ -356,7 +356,7 @@ var ContextCommand = /** @class */ (function (_super) {
356
356
  target = (_a.sent()).target;
357
357
  sasjs = new node_1.default({
358
358
  serverUrl: target.serverUrl,
359
- allowInsecureRequests: target.allowInsecureRequests,
359
+ httpsAgentOptions: target.httpsAgentOptions,
360
360
  appLoc: target.appLoc,
361
361
  serverType: target.serverType
362
362
  });
@@ -399,7 +399,7 @@ var ContextCommand = /** @class */ (function (_super) {
399
399
  }
400
400
  sasjs = new node_1.default({
401
401
  serverUrl: target.serverUrl,
402
- allowInsecureRequests: target.allowInsecureRequests,
402
+ httpsAgentOptions: target.httpsAgentOptions,
403
403
  appLoc: target.appLoc,
404
404
  serverType: target.serverType
405
405
  });
@@ -1,2 +1,3 @@
1
+ import SASjs from '@sasjs/adapter/node';
1
2
  import { Target } from '@sasjs/utils';
2
- export declare function deploy(target: Target, isLocal: boolean): Promise<void>;
3
+ export declare function deploy(target: Target, isLocal: boolean, sasjs?: SASjs): Promise<void>;