@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.
- package/build/commands/add/addCredential.d.ts +2 -2
- package/build/commands/add/addCredential.js +26 -28
- package/build/commands/add/internal/input.js +15 -2
- package/build/commands/build/build.d.ts +1 -1
- package/build/commands/build/build.js +41 -19
- package/build/commands/build/internal/getLaunchPageCode.js +2 -1
- package/build/commands/compile/internal/compileServiceFile.js +11 -7
- package/build/commands/compile/internal/compileTestFile.js +1 -1
- package/build/commands/compile/internal/spec/compileTestFile.spec.js +16 -4
- package/build/commands/compile/spec/compile.spec.js +30 -0
- package/build/commands/compile/spec/loadDependencies.spec.js +3 -3
- package/build/commands/context/contextCommand.js +5 -5
- package/build/commands/deploy/deploy.d.ts +2 -1
- package/build/commands/deploy/deploy.js +92 -46
- package/build/commands/deploy/spec/cbd.spec.d.ts +1 -0
- package/build/commands/deploy/spec/cbd.spec.js +141 -0
- package/build/commands/deploy/spec/cbd.spec.server.js +6 -57
- package/build/commands/deploy/spec/utils.d.ts +6 -0
- package/build/commands/deploy/spec/utils.js +242 -0
- package/build/commands/flow/flowCommand.js +1 -1
- package/build/commands/flow/spec/flow.spec.server.js +1 -1
- package/build/commands/folder/folderCommand.js +2 -2
- package/build/commands/folder/spec/folder.spec.server.js +1 -1
- package/build/commands/job/internal/execute/index.d.ts +2 -0
- package/build/commands/job/internal/execute/index.js +14 -0
- package/build/commands/job/internal/execute/sasjs.d.ts +8 -0
- package/build/commands/job/internal/execute/sasjs.js +69 -0
- package/build/commands/job/{execute.d.ts → internal/execute/viya.d.ts} +1 -1
- package/build/commands/job/{execute.js → internal/execute/viya.js} +29 -68
- package/build/commands/job/internal/utils.d.ts +1 -0
- package/build/commands/job/internal/utils.js +81 -0
- package/build/commands/job/jobCommand.d.ts +2 -1
- package/build/commands/job/jobCommand.js +65 -23
- package/build/commands/job/spec/execute.spec.js +41 -21
- package/build/commands/job/spec/getContextName.spec.js +1 -1
- package/build/commands/job/spec/job.spec.server.js +4 -4
- package/build/commands/job/spec/jobCommand.spec.js +10 -10
- package/build/commands/request/request.js +1 -1
- package/build/commands/run/run.js +2 -2
- package/build/commands/servicepack/spec/servicepack.spec.server.js +0 -1
- package/build/commands/shared/deployToSasViyaWithServicePack.js +1 -1
- package/build/commands/testing/test.js +1 -1
- package/build/config.json +3 -1
- package/build/utils/config.js +104 -64
- package/build/utils/file.d.ts +1 -1
- package/build/utils/file.js +1 -1
- package/build/utils/spec/removeComments.spec.d.ts +1 -1
- package/build/utils/spec/removeComments.spec.js +1 -1
- package/build/utils/test.js +1 -1
- package/build/utils/utils.d.ts +1 -0
- package/build/utils/utils.js +8 -2
- 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,
|
|
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
|
-
|
|
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,
|
|
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,
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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 = [];
|
|
@@ -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 ===
|
|
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
|
|
249
|
-
case
|
|
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*/,
|
|
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
|
-
|
|
256
|
-
|
|
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
|
|
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*/,
|
|
272
|
-
case 1: return [4 /*yield*/, utils_1.readFile(config_1.getMacroCorePath() + "/viya/mv_createfile.sas")
|
|
273
|
-
|
|
274
|
-
|
|
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
|
|
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
|
|
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
|
|
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" +
|
|
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" +
|
|
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
|
|
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*/,
|
|
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*/,
|
|
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*/,
|
|
124
|
-
case 9:
|
|
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.
|
|
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(
|
|
317
|
-
expect(process.logger.info).toHaveBeenNthCalledWith(
|
|
318
|
-
expect(process.logger.info).toHaveBeenNthCalledWith(
|
|
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>
|
|
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>
|
|
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>
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
402
|
+
httpsAgentOptions: target.httpsAgentOptions,
|
|
403
403
|
appLoc: target.appLoc,
|
|
404
404
|
serverType: target.serverType
|
|
405
405
|
});
|