@sasjs/cli 3.0.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/build/commands/add/addCredential.d.ts +6 -2
  2. package/build/commands/add/addCredential.js +79 -47
  3. package/build/commands/add/addTarget.js +32 -20
  4. package/build/commands/add/internal/input.d.ts +7 -0
  5. package/build/commands/add/internal/input.js +53 -8
  6. package/build/commands/add/spec/addTarget.spec.js +78 -0
  7. package/build/commands/build/build.js +11 -11
  8. package/build/commands/build/internal/config.d.ts +1 -1
  9. package/build/commands/build/internal/config.js +5 -6
  10. package/build/commands/compile/compile.js +4 -4
  11. package/build/commands/compile/compileCommand.js +2 -1
  12. package/build/commands/compile/compileSingleFile.d.ts +1 -1
  13. package/build/commands/compile/compileSingleFile.js +6 -7
  14. package/build/commands/compile/internal/compareFolders.js +1 -2
  15. package/build/commands/compile/internal/compileJobFile.js +1 -1
  16. package/build/commands/compile/internal/compileServiceFile.js +32 -16
  17. package/build/commands/compile/internal/compileTestFile.d.ts +0 -2
  18. package/build/commands/compile/internal/compileTestFile.js +10 -14
  19. package/build/commands/compile/internal/getAllJobFolders.js +1 -1
  20. package/build/commands/compile/internal/getAllServiceFolders.js +1 -1
  21. package/build/commands/compile/internal/loadDependencies.d.ts +2 -3
  22. package/build/commands/compile/internal/loadDependencies.js +43 -230
  23. package/build/commands/compile/internal/spec/compileTestFile.spec.js +8 -8
  24. package/build/commands/compile/spec/compileJobFile.spec.js +3 -3
  25. package/build/commands/compile/spec/compileServiceFile.spec.js +3 -3
  26. package/build/commands/compile/spec/loadDependencies.spec.js +37 -37
  27. package/build/commands/create/spec/reactAppFiles.js +5 -5
  28. package/build/commands/deploy/deploy.js +1 -1
  29. package/build/commands/deploy/spec/cbd.spec.js +19 -3
  30. package/build/commands/docs/generateDocs.js +4 -5
  31. package/build/commands/docs/internal/getFileInputs.d.ts +1 -1
  32. package/build/commands/docs/internal/getFileInputs.js +2 -2
  33. package/build/commands/docs/internal/getFileOutputs.d.ts +1 -1
  34. package/build/commands/docs/internal/getFileOutputs.js +2 -2
  35. package/build/commands/docs/internal/getFoldersForDocs.d.ts +1 -1
  36. package/build/commands/docs/internal/getFoldersForDocs.js +1 -1
  37. package/build/commands/job/internal/execute/viya.js +0 -6
  38. package/build/commands/job/internal/utils.js +6 -8
  39. package/build/commands/job/jobCommand.d.ts +1 -0
  40. package/build/commands/job/jobCommand.js +8 -3
  41. package/build/commands/job/spec/jobCommand.spec.js +10 -3
  42. package/build/commands/request/request.js +2 -2
  43. package/build/commands/run/run.js +1 -1
  44. package/build/commands/servicepack/deploy.js +1 -1
  45. package/build/commands/shared/fetchLogFileContent.js +6 -8
  46. package/build/commands/testing/test.js +1 -1
  47. package/build/commands/web/internal/getTags.d.ts +2 -1
  48. package/build/commands/web/internal/getTags.js +10 -12
  49. package/build/commands/web/internal/getWebServiceContent.js +1 -2
  50. package/build/commands/web/internal/sasjsout.d.ts +1 -1
  51. package/build/commands/web/internal/sasjsout.js +1 -1
  52. package/build/commands/web/internal/spec/updateLinkTag.spec.d.ts +4 -0
  53. package/build/commands/web/internal/spec/updateLinkTag.spec.js +32 -0
  54. package/build/commands/web/internal/updateAllTags.js +33 -8
  55. package/build/commands/web/internal/updateLinkTag.d.ts +4 -0
  56. package/build/commands/web/internal/updateLinkTag.js +24 -0
  57. package/build/commands/web/web.js +12 -13
  58. package/build/utils/auth.d.ts +10 -4
  59. package/build/utils/auth.js +17 -15
  60. package/build/utils/config.d.ts +2 -3
  61. package/build/utils/config.js +14 -16
  62. package/build/utils/file.d.ts +0 -6
  63. package/build/utils/file.js +1 -43
  64. package/build/utils/setConstants.js +1 -1
  65. package/build/utils/spec/utils.spec.js +31 -5
  66. package/build/utils/utils.d.ts +0 -2
  67. package/build/utils/utils.js +2 -21
  68. package/package.json +8 -14
  69. package/CHANGELOG.md +0 -30
  70. package/build/commands/compile/internal/config.d.ts +0 -25
  71. package/build/commands/compile/internal/config.js +0 -259
  72. package/build/commands/compile/spec/getDependencyPaths.spec.d.ts +0 -1
  73. package/build/commands/compile/spec/getDependencyPaths.spec.js +0 -263
  74. package/build/commands/compile/spec/getProgramDependencies.spec.d.ts +0 -1
  75. package/build/commands/compile/spec/getProgramDependencies.spec.js +0 -403
  76. package/build/commands/shared/dependencies.d.ts +0 -12
  77. package/build/commands/shared/dependencies.js +0 -332
  78. package/build/commands/web/internal/updateLinkHref.d.ts +0 -4
  79. package/build/commands/web/internal/updateLinkHref.js +0 -18
  80. package/build/utils/spec/utils.spec.server.d.ts +0 -1
  81. package/build/utils/spec/utils.spec.server.js +0 -72
@@ -1,4 +1,4 @@
1
- import { SasAuthResponse, Target, HttpsAgentOptions } from '@sasjs/utils/types';
1
+ import { 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,10 @@ 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, httpsAgentOptions?: HttpsAgentOptions | undefined) => Promise<SasAuthResponse>;
13
+ export declare const getTokens: (target: Target, client: string, secret: string, httpsAgentOptions?: HttpsAgentOptions | undefined) => Promise<{
14
+ access_token: string;
15
+ refresh_token: string;
16
+ }>;
14
17
  export declare const createEnvFileForViya: (targetName: string, client: string, secret: string, accessToken: string, refreshToken: string) => Promise<void>;
15
18
  export declare const createEnvFileForSas9: (targetName: string, userName: string, password: string) => Promise<void>;
19
+ export declare const createEnvFileForSasjs: (targetName: string, client: string, accessToken: string, refreshToken: string) => Promise<void>;
@@ -50,7 +50,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
50
50
  return (mod && mod.__esModule) ? mod : { "default": mod };
51
51
  };
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
- exports.createEnvFileForSas9 = exports.createEnvFileForViya = exports.getTokens = exports.validateTargetName = exports.addCredential = void 0;
53
+ exports.createEnvFileForSasjs = exports.createEnvFileForSas9 = exports.createEnvFileForViya = exports.getTokens = exports.validateTargetName = exports.addCredential = void 0;
54
54
  var path_1 = __importDefault(require("path"));
55
55
  var logger_1 = require("@sasjs/utils/logger");
56
56
  var types_1 = require("@sasjs/utils/types");
@@ -69,66 +69,81 @@ 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 httpsAgentOptions, serverUrl, filePath, _a, client, secret, _b, access_token, refresh_token, filePath, _c, userName, password, filePath;
73
- var _d, _e, _f, _g;
74
- return __generator(this, function (_h) {
75
- switch (_h.label) {
72
+ var httpsAgentOptions, serverUrl, filePath_1, _a, _b, client, secret, _c, access_token, refresh_token, _d, userName, password, client, _e, access_token, refresh_token, filePath;
73
+ var _f, _g, _h;
74
+ return __generator(this, function (_j) {
75
+ switch (_j.label) {
76
76
  case 0:
77
77
  httpsAgentOptions = insecure
78
78
  ? __assign(__assign({}, target.httpsAgentOptions), { allowInsecureRequests: true, rejectUnauthorized: false }) : target.httpsAgentOptions;
79
79
  if (insecure)
80
- (_d = process.logger) === null || _d === void 0 ? void 0 : _d.warn('Executing with insecure connection.');
80
+ (_f = process.logger) === null || _f === void 0 ? void 0 : _f.warn('Executing with insecure connection.');
81
81
  if (!!target.serverUrl) return [3 /*break*/, 3];
82
82
  return [4 /*yield*/, input_1.getAndValidateServerUrl(target)];
83
83
  case 1:
84
- serverUrl = _h.sent();
84
+ serverUrl = _j.sent();
85
85
  target = new types_1.Target(__assign(__assign({}, target.toJson(false)), { serverUrl: serverUrl }));
86
86
  return [4 /*yield*/, saveConfig_1.saveConfig(targetScope, target, false, false)];
87
87
  case 2:
88
- filePath = _h.sent();
89
- (_e = process.logger) === null || _e === void 0 ? void 0 : _e.info("Target configuration has been saved to " + filePath + " .");
90
- _h.label = 3;
88
+ filePath_1 = _j.sent();
89
+ (_g = process.logger) === null || _g === void 0 ? void 0 : _g.info("Target configuration has been saved to " + filePath_1 + " .");
90
+ _j.label = 3;
91
91
  case 3:
92
- if (!(target.serverType === types_1.ServerType.SasViya)) return [3 /*break*/, 10];
93
- return [4 /*yield*/, input_1.getCredentialsInputForViya(target.name)];
94
- case 4:
95
- _a = _h.sent(), client = _a.client, secret = _a.secret;
96
- return [4 /*yield*/, exports.getTokens(target, client, secret, httpsAgentOptions)];
92
+ _a = target.serverType;
93
+ switch (_a) {
94
+ case types_1.ServerType.SasViya: return [3 /*break*/, 4];
95
+ case types_1.ServerType.Sas9: return [3 /*break*/, 10];
96
+ case types_1.ServerType.Sasjs: return [3 /*break*/, 15];
97
+ }
98
+ return [3 /*break*/, 21];
99
+ case 4: return [4 /*yield*/, input_1.getCredentialsInputForViya(target.name)];
97
100
  case 5:
98
- _b = _h.sent(), access_token = _b.access_token, refresh_token = _b.refresh_token;
99
- if (!(targetScope === targetScope_1.TargetScope.Local)) return [3 /*break*/, 7];
100
- return [4 /*yield*/, exports.createEnvFileForViya(target.name, client, secret, access_token, refresh_token)];
101
+ _b = _j.sent(), client = _b.client, secret = _b.secret;
102
+ return [4 /*yield*/, exports.getTokens(target, client, secret, httpsAgentOptions)];
101
103
  case 6:
102
- _h.sent();
103
- return [3 /*break*/, 8];
104
+ _c = _j.sent(), access_token = _c.access_token, refresh_token = _c.refresh_token;
105
+ if (!(targetScope === targetScope_1.TargetScope.Local)) return [3 /*break*/, 8];
106
+ return [4 /*yield*/, exports.createEnvFileForViya(target.name, client, secret, access_token, refresh_token)];
104
107
  case 7:
108
+ _j.sent();
109
+ return [3 /*break*/, 9];
110
+ case 8:
105
111
  target = new types_1.Target(__assign(__assign({}, target.toJson(false)), { authConfig: { client: client, secret: secret, access_token: access_token, refresh_token: refresh_token } }));
106
- _h.label = 8;
107
- case 8: return [4 /*yield*/, saveConfig_1.saveConfig(targetScope, target, false, false)];
108
- case 9:
109
- filePath = _h.sent();
110
- (_f = process.logger) === null || _f === void 0 ? void 0 : _f.info("Target configuration has been saved to " + filePath + " .");
111
- return [3 /*break*/, 17];
112
- case 10:
113
- if (!(target.serverType === types_1.ServerType.Sas9)) return [3 /*break*/, 16];
114
- return [4 /*yield*/, input_1.getCredentialsInputSas9(target, targetScope)];
112
+ _j.label = 9;
113
+ case 9: return [3 /*break*/, 22];
114
+ case 10: return [4 /*yield*/, input_1.getCredentialsInputSas9(target, targetScope)];
115
115
  case 11:
116
- _c = _h.sent(), userName = _c.userName, password = _c.password;
116
+ _d = _j.sent(), userName = _d.userName, password = _d.password;
117
117
  if (!(targetScope === targetScope_1.TargetScope.Local)) return [3 /*break*/, 13];
118
118
  return [4 /*yield*/, exports.createEnvFileForSas9(target.name, userName, password)];
119
119
  case 12:
120
- _h.sent();
120
+ _j.sent();
121
121
  return [3 /*break*/, 14];
122
122
  case 13:
123
123
  target = new types_1.Target(__assign(__assign({}, target.toJson(false)), { authConfigSas9: { userName: userName, password: password } }));
124
- _h.label = 14;
125
- case 14: return [4 /*yield*/, saveConfig_1.saveConfig(targetScope, target, false, false)];
126
- case 15:
127
- filePath = _h.sent();
128
- (_g = process.logger) === null || _g === void 0 ? void 0 : _g.info("Target configuration has been saved to " + filePath + " .");
129
- return [3 /*break*/, 17];
130
- case 16: throw new Error('Target contains invalid serverType. Possible types could be SASVIYA and SAS9.');
131
- case 17: return [2 /*return*/, target];
124
+ _j.label = 14;
125
+ case 14: return [3 /*break*/, 22];
126
+ case 15: return [4 /*yield*/, input_1.getCredentialsInputSasjs(target)];
127
+ case 16:
128
+ client = (_j.sent()).client;
129
+ return [4 /*yield*/, exports.getTokens(target, client, '', httpsAgentOptions)];
130
+ case 17:
131
+ _e = _j.sent(), access_token = _e.access_token, refresh_token = _e.refresh_token;
132
+ if (!(targetScope === targetScope_1.TargetScope.Local)) return [3 /*break*/, 19];
133
+ return [4 /*yield*/, exports.createEnvFileForSasjs(target.name, client, access_token, refresh_token)];
134
+ case 18:
135
+ _j.sent();
136
+ return [3 /*break*/, 20];
137
+ case 19:
138
+ target = new types_1.Target(__assign(__assign({}, target.toJson(false)), { authConfig: { client: client, secret: '', access_token: access_token, refresh_token: refresh_token } }));
139
+ _j.label = 20;
140
+ case 20: return [3 /*break*/, 22];
141
+ case 21: throw new Error('Target contains invalid serverType. Possible types could be SASVIYA, SAS9 and SASJS');
142
+ case 22: return [4 /*yield*/, saveConfig_1.saveConfig(targetScope, target, false, false)];
143
+ case 23:
144
+ filePath = _j.sent();
145
+ (_h = process.logger) === null || _h === void 0 ? void 0 : _h.info("Target configuration has been saved to " + filePath + " .");
146
+ return [2 /*return*/, target];
132
147
  }
133
148
  });
134
149
  }); };
@@ -146,25 +161,25 @@ var validateTargetName = function (targetName) {
146
161
  };
147
162
  exports.validateTargetName = validateTargetName;
148
163
  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) {
164
+ var adapter, _a, access_token, refresh_token;
165
+ var _b;
166
+ return __generator(this, function (_c) {
167
+ switch (_c.label) {
153
168
  case 0:
154
169
  adapter = new node_1.default({
155
170
  serverUrl: target.serverUrl,
156
171
  serverType: target.serverType,
157
172
  httpsAgentOptions: httpsAgentOptions,
158
- debug: ((_a = process.logger) === null || _a === void 0 ? void 0 : _a.logLevel) === logger_1.LogLevel.Debug
173
+ debug: ((_b = process.logger) === null || _b === void 0 ? void 0 : _b.logLevel) === logger_1.LogLevel.Debug
159
174
  });
160
175
  return [4 /*yield*/, auth_1.getNewAccessToken(adapter, client, secret, target).catch(function (e) {
161
176
  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");
177
+ (_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 " + (target.serverType === types_1.ServerType.Sasjs ? '' : 'and Client Secret ') + "and try again.\n");
163
178
  throw e;
164
179
  })];
165
180
  case 1:
166
- authResponse = _b.sent();
167
- return [2 /*return*/, authResponse];
181
+ _a = _c.sent(), access_token = _a.access_token, refresh_token = _a.refresh_token;
182
+ return [2 /*return*/, { access_token: access_token, refresh_token: refresh_token }];
168
183
  }
169
184
  });
170
185
  }); };
@@ -203,3 +218,20 @@ var createEnvFileForSas9 = function (targetName, userName, password) { return __
203
218
  });
204
219
  }); };
205
220
  exports.createEnvFileForSas9 = createEnvFileForSas9;
221
+ var createEnvFileForSasjs = function (targetName, client, accessToken, refreshToken) { return __awaiter(void 0, void 0, void 0, function () {
222
+ var envFileContent, envFilePath;
223
+ var _a;
224
+ return __generator(this, function (_b) {
225
+ switch (_b.label) {
226
+ case 0:
227
+ envFileContent = "CLIENT=" + client + "\nACCESS_TOKEN=" + accessToken + "\nREFRESH_TOKEN=" + refreshToken + "\n";
228
+ envFilePath = path_1.default.join(process.projectDir, ".env." + targetName);
229
+ return [4 /*yield*/, utils_1.createFile(envFilePath, envFileContent)];
230
+ case 1:
231
+ _b.sent();
232
+ (_a = process.logger) === null || _a === void 0 ? void 0 : _a.success("Environment file saved at " + envFilePath);
233
+ return [2 /*return*/];
234
+ }
235
+ });
236
+ }); };
237
+ exports.createEnvFileForSasjs = createEnvFileForSasjs;
@@ -60,26 +60,32 @@ var addCredential_1 = require("./addCredential");
60
60
  function addTarget(insecure) {
61
61
  var _a, _b, _c;
62
62
  return __awaiter(this, void 0, void 0, function () {
63
- var _d, scope, serverType, name, appLoc, serverUrl, existingTarget, saveWithDefaultValues, targetJson, target, filePath, _e, serverName, repositoryName, userName, password, _f, contextName, updatedTarget, isDefault;
64
- return __generator(this, function (_g) {
65
- switch (_g.label) {
63
+ var _d, scope, serverType, name, appLoc, serverUrl, existingTarget, saveWithDefaultValues, targetJson, target, filePath, _e, _f, serverName, repositoryName, userName, password, _g, contextName, updatedViyaTarget, updatedSasjsTarget, isDefault;
64
+ return __generator(this, function (_h) {
65
+ switch (_h.label) {
66
66
  case 0:
67
67
  if (insecure)
68
68
  (_a = process.logger) === null || _a === void 0 ? void 0 : _a.warn('Executing with insecure connection.');
69
69
  return [4 /*yield*/, input_1.getCommonFields()];
70
70
  case 1:
71
- _d = _g.sent(), scope = _d.scope, serverType = _d.serverType, name = _d.name, appLoc = _d.appLoc, serverUrl = _d.serverUrl, existingTarget = _d.existingTarget;
71
+ _d = _h.sent(), scope = _d.scope, serverType = _d.serverType, name = _d.name, appLoc = _d.appLoc, serverUrl = _d.serverUrl, existingTarget = _d.existingTarget;
72
72
  saveWithDefaultValues = !existingTarget;
73
73
  targetJson = __assign(__assign({}, existingTarget), { name: name, serverType: serverType, serverUrl: serverUrl, appLoc: appLoc });
74
74
  target = new types_1.Target(targetJson);
75
75
  return [4 /*yield*/, saveConfig_1.saveConfig(scope, target, false, saveWithDefaultValues)];
76
76
  case 2:
77
- filePath = _g.sent();
77
+ filePath = _h.sent();
78
78
  (_b = process.logger) === null || _b === void 0 ? void 0 : _b.info("Target configuration has been saved to " + filePath + " .");
79
- if (!(serverType === types_1.ServerType.Sas9)) return [3 /*break*/, 4];
80
- return [4 /*yield*/, input_1.getAndValidateSas9Fields(target, scope)];
81
- case 3:
82
- _e = _g.sent(), serverName = _e.serverName, repositoryName = _e.repositoryName, userName = _e.userName, password = _e.password;
79
+ _e = serverType;
80
+ switch (_e) {
81
+ case types_1.ServerType.Sas9: return [3 /*break*/, 3];
82
+ case types_1.ServerType.SasViya: return [3 /*break*/, 5];
83
+ case types_1.ServerType.Sasjs: return [3 /*break*/, 7];
84
+ }
85
+ return [3 /*break*/, 9];
86
+ case 3: return [4 /*yield*/, input_1.getAndValidateSas9Fields(target, scope)];
87
+ case 4:
88
+ _f = _h.sent(), serverName = _f.serverName, repositoryName = _f.repositoryName, userName = _f.userName, password = _f.password;
83
89
  targetJson = __assign(__assign({}, targetJson), { serverName: serverName, repositoryName: repositoryName });
84
90
  if (scope === targetScope_1.TargetScope.Local) {
85
91
  addCredential_1.createEnvFileForSas9(name, userName, password);
@@ -87,10 +93,10 @@ function addTarget(insecure) {
87
93
  else {
88
94
  targetJson = __assign(__assign({}, targetJson), { authConfigSas9: { userName: userName, password: password } });
89
95
  }
90
- return [3 /*break*/, 6];
91
- case 4: return [4 /*yield*/, input_1.getAndValidateSasViyaFields(target, scope, serverUrl, insecure, addCredential_1.addCredential)];
92
- case 5:
93
- _f = _g.sent(), contextName = _f.contextName, updatedTarget = _f.target;
96
+ return [3 /*break*/, 10];
97
+ case 5: return [4 /*yield*/, input_1.getAndValidateSasViyaFields(target, scope, serverUrl, insecure, addCredential_1.addCredential)];
98
+ case 6:
99
+ _g = _h.sent(), contextName = _g.contextName, updatedViyaTarget = _g.target;
94
100
  targetJson = {
95
101
  contextName: contextName,
96
102
  deployConfig: {
@@ -98,14 +104,20 @@ function addTarget(insecure) {
98
104
  deployScripts: []
99
105
  }
100
106
  };
101
- targetJson = __assign(__assign({}, updatedTarget.toJson(false)), targetJson);
102
- _g.label = 6;
103
- case 6: return [4 /*yield*/, input_1.getIsDefault()];
104
- case 7:
105
- isDefault = _g.sent();
106
- return [4 /*yield*/, saveConfig_1.saveConfig(scope, new types_1.Target(targetJson), isDefault, saveWithDefaultValues)];
107
+ targetJson = __assign(__assign({}, updatedViyaTarget.toJson(false)), targetJson);
108
+ return [3 /*break*/, 10];
109
+ case 7: return [4 /*yield*/, input_1.getAndValidateSasjsFields(target, scope, insecure, addCredential_1.addCredential)];
107
110
  case 8:
108
- filePath = _g.sent();
111
+ updatedSasjsTarget = (_h.sent()).target;
112
+ targetJson = updatedSasjsTarget.toJson(false);
113
+ return [3 /*break*/, 10];
114
+ case 9: throw new Error('Target contains invalid serverType. Possible types could be SASVIYA, SAS9 and SASJS');
115
+ case 10: return [4 /*yield*/, input_1.getIsDefault()];
116
+ case 11:
117
+ isDefault = _h.sent();
118
+ return [4 /*yield*/, saveConfig_1.saveConfig(scope, new types_1.Target(targetJson), isDefault, saveWithDefaultValues)];
119
+ case 12:
120
+ filePath = _h.sent();
109
121
  (_c = process.logger) === null || _c === void 0 ? void 0 : _c.info("Target configuration has been saved to " + filePath);
110
122
  return [2 /*return*/, true];
111
123
  }
@@ -9,14 +9,21 @@ export declare function getAndValidateSas9Fields(target: Target, scope: TargetSc
9
9
  userName: string;
10
10
  password: string;
11
11
  }>;
12
+ export declare const shouldAuthenticate: () => Promise<boolean>;
12
13
  export declare function getAndValidateSasViyaFields(target: Target, scope: TargetScope, serverUrl: string, insecure: boolean, authenticateCallback: (target: Target, insecure: boolean, targetScope: TargetScope) => Promise<Target>): Promise<{
13
14
  contextName: string;
14
15
  target: Target;
15
16
  }>;
17
+ export declare function getAndValidateSasjsFields(target: Target, scope: TargetScope, insecure: boolean, authenticateCallback: (target: Target, insecure: boolean, targetScope: TargetScope) => Promise<Target>): Promise<{
18
+ target: Target;
19
+ }>;
16
20
  export declare const getCredentialsInputForViya: (targetName: string) => Promise<{
17
21
  client: string;
18
22
  secret: string;
19
23
  }>;
24
+ export declare const getCredentialsInputSasjs: (target: Target) => Promise<{
25
+ client: string;
26
+ }>;
20
27
  export declare const getCredentialsInputSas9: (target: Target, scope: TargetScope) => Promise<{
21
28
  userName: string;
22
29
  password: string;
@@ -50,7 +50,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
50
50
  return (mod && mod.__esModule) ? mod : { "default": mod };
51
51
  };
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
- exports.getIsDefault = exports.getDefaultValues = exports.getCredentialsInputSas9 = exports.getCredentialsInputForViya = exports.getAndValidateSasViyaFields = exports.getAndValidateSas9Fields = exports.getAndValidateServerUrl = exports.getCommonFields = void 0;
53
+ exports.getIsDefault = exports.getDefaultValues = exports.getCredentialsInputSas9 = exports.getCredentialsInputSasjs = exports.getCredentialsInputForViya = exports.getAndValidateSasjsFields = exports.getAndValidateSasViyaFields = exports.shouldAuthenticate = exports.getAndValidateSas9Fields = exports.getAndValidateServerUrl = exports.getCommonFields = void 0;
54
54
  var input_1 = require("@sasjs/utils/input");
55
55
  var types_1 = require("@sasjs/utils/types");
56
56
  var logger_1 = require("@sasjs/utils/logger");
@@ -134,11 +134,20 @@ function getAndValidateServerType() {
134
134
  switch (_a.label) {
135
135
  case 0: return [4 /*yield*/, input_1.getChoice('Please pick a server type: ', 'Please choose either option 1 or 2.', [
136
136
  { title: '1. SAS Viya', value: 1 },
137
- { title: '2. SAS 9', value: 2 }
137
+ { title: '2. SAS 9', value: 2 },
138
+ { title: '3. SAS JS', value: 3 }
138
139
  ])];
139
140
  case 1:
140
141
  serverType = _a.sent();
141
- return [2 /*return*/, serverType === 1 ? types_1.ServerType.SasViya : types_1.ServerType.Sas9];
142
+ switch (serverType) {
143
+ case 1:
144
+ return [2 /*return*/, types_1.ServerType.SasViya];
145
+ case 2:
146
+ return [2 /*return*/, types_1.ServerType.Sas9];
147
+ default:
148
+ return [2 /*return*/, types_1.ServerType.Sasjs];
149
+ }
150
+ return [2 /*return*/];
142
151
  }
143
152
  });
144
153
  });
@@ -177,7 +186,11 @@ function getAndValidateTargetName(serverType) {
177
186
  return [2 /*return*/, true];
178
187
  });
179
188
  }); };
180
- defaultName = serverType === types_1.ServerType.SasViya ? 'viya' : 'sas9';
189
+ defaultName = serverType === types_1.ServerType.SasViya
190
+ ? 'viya'
191
+ : serverType === types_1.ServerType.Sas9
192
+ ? 'sas9'
193
+ : 'server';
181
194
  return [4 /*yield*/, input_1.getString('Please enter a target name: ', validator, defaultName)];
182
195
  case 1:
183
196
  targetName = _a.sent();
@@ -237,18 +250,21 @@ function getAndValidateSas9Fields(target, scope) {
237
250
  });
238
251
  }
239
252
  exports.getAndValidateSas9Fields = getAndValidateSas9Fields;
253
+ var shouldAuthenticate = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
254
+ return [2 /*return*/, input_1.getConfirmation('Would you like to authenticate against this target?', true)];
255
+ }); }); };
256
+ exports.shouldAuthenticate = shouldAuthenticate;
240
257
  function getAndValidateSasViyaFields(target, scope, serverUrl, insecure, authenticateCallback) {
241
258
  var _a;
242
259
  return __awaiter(this, void 0, void 0, function () {
243
- var contextName, shouldAuthenticate, httpsAgentOptions, sasjs, contexts, contextNumberErrorMessage, contextNumber;
260
+ var contextName, httpsAgentOptions, sasjs, contexts, contextNumberErrorMessage, contextNumber;
244
261
  return __generator(this, function (_b) {
245
262
  switch (_b.label) {
246
263
  case 0:
247
264
  contextName = 'SAS Job Execution compute context';
248
- return [4 /*yield*/, input_1.getConfirmation('Would you like to authenticate against this target?', true)];
265
+ return [4 /*yield*/, exports.shouldAuthenticate()];
249
266
  case 1:
250
- shouldAuthenticate = _b.sent();
251
- if (!shouldAuthenticate) return [3 /*break*/, 8];
267
+ if (!_b.sent()) return [3 /*break*/, 8];
252
268
  return [4 /*yield*/, authenticateCallback(target, insecure, scope)];
253
269
  case 2:
254
270
  target = _b.sent();
@@ -293,6 +309,23 @@ function getAndValidateSasViyaFields(target, scope, serverUrl, insecure, authent
293
309
  });
294
310
  }
295
311
  exports.getAndValidateSasViyaFields = getAndValidateSasViyaFields;
312
+ function getAndValidateSasjsFields(target, scope, insecure, authenticateCallback) {
313
+ return __awaiter(this, void 0, void 0, function () {
314
+ return __generator(this, function (_a) {
315
+ switch (_a.label) {
316
+ case 0: return [4 /*yield*/, exports.shouldAuthenticate()];
317
+ case 1:
318
+ if (!_a.sent()) return [3 /*break*/, 3];
319
+ return [4 /*yield*/, authenticateCallback(target, insecure, scope)];
320
+ case 2:
321
+ target = _a.sent();
322
+ _a.label = 3;
323
+ case 3: return [2 /*return*/, { target: target }];
324
+ }
325
+ });
326
+ });
327
+ }
328
+ exports.getAndValidateSasjsFields = getAndValidateSasjsFields;
296
329
  function getAndValidateAppLoc(targetName, target) {
297
330
  var _a;
298
331
  return __awaiter(this, void 0, void 0, function () {
@@ -326,6 +359,18 @@ var getCredentialsInputForViya = function (targetName) { return __awaiter(void 0
326
359
  });
327
360
  }); };
328
361
  exports.getCredentialsInputForViya = getCredentialsInputForViya;
362
+ var getCredentialsInputSasjs = function (target) { return __awaiter(void 0, void 0, void 0, function () {
363
+ var client;
364
+ return __generator(this, function (_a) {
365
+ switch (_a.label) {
366
+ case 0: return [4 /*yield*/, input_1.getString('Please enter your Client ID: ', function (v) { return !!v || 'Client ID is required.'; }, exports.getDefaultValues(target.name).client)];
367
+ case 1:
368
+ client = _a.sent();
369
+ return [2 /*return*/, { client: client }];
370
+ }
371
+ });
372
+ }); };
373
+ exports.getCredentialsInputSasjs = getCredentialsInputSasjs;
329
374
  var getCredentialsInputSas9 = function (target, scope) { return __awaiter(void 0, void 0, void 0, function () {
330
375
  var targetName, name, result, userName, password;
331
376
  var _a, _b, _c, _d;
@@ -81,6 +81,7 @@ describe('addTarget', function () {
81
81
  var appName = "cli-tests-add-" + utils_1.generateTimestamp();
82
82
  var viyaTargetName = "test-viya-" + utils_1.generateTimestamp();
83
83
  var sas9TargetName = "test-sas9-" + utils_1.generateTimestamp();
84
+ var sasjsTargetName = "test-server-" + utils_1.generateTimestamp();
84
85
  var globalTestTarget;
85
86
  beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
86
87
  return __generator(this, function (_a) {
@@ -164,6 +165,42 @@ describe('addTarget', function () {
164
165
  }
165
166
  });
166
167
  }); });
168
+ it('should create a SASJS target in the local sasjsconfig.json file', function () { return __awaiter(void 0, void 0, void 0, function () {
169
+ var commonFields;
170
+ return __generator(this, function (_a) {
171
+ switch (_a.label) {
172
+ case 0:
173
+ commonFields = {
174
+ scope: targetScope_1.TargetScope.Local,
175
+ serverType: utils_1.ServerType.Sasjs,
176
+ name: sasjsTargetName,
177
+ appLoc: '/Public/app',
178
+ serverUrl: process.env.SASJS_SERVER_URL || '',
179
+ existingTarget: {}
180
+ };
181
+ jest
182
+ .spyOn(inputModule, 'getCommonFields')
183
+ .mockImplementation(function () { return Promise.resolve(commonFields); });
184
+ jest
185
+ .spyOn(inputModule, 'getIsDefault')
186
+ .mockImplementation(function () { return Promise.resolve(false); });
187
+ jest
188
+ .spyOn(inputModule, 'getAndValidateSasjsFields')
189
+ .mockImplementation(function () {
190
+ return Promise.resolve({
191
+ target: new utils_1.Target(commonFields)
192
+ });
193
+ });
194
+ return [4 /*yield*/, expect(addTarget_1.addTarget(false)).resolves.toEqual(true)];
195
+ case 1:
196
+ _a.sent();
197
+ return [4 /*yield*/, verifyTarget(commonFields, true)];
198
+ case 2:
199
+ _a.sent();
200
+ return [2 /*return*/];
201
+ }
202
+ });
203
+ }); });
167
204
  it('should create a SAS9 target in the local sasjsconfig.json file', function () { return __awaiter(void 0, void 0, void 0, function () {
168
205
  var commonFields;
169
206
  return __generator(this, function (_a) {
@@ -322,6 +359,47 @@ describe('addTarget', function () {
322
359
  }
323
360
  });
324
361
  }); });
362
+ it('should update a SASJS target in the local sasjsconfig.json file', function () { return __awaiter(void 0, void 0, void 0, function () {
363
+ var buildSourceFolder, config, targetJson, commonFields;
364
+ return __generator(this, function (_a) {
365
+ switch (_a.label) {
366
+ case 0:
367
+ buildSourceFolder = process.sasjsConstants.buildSourceFolder;
368
+ return [4 /*yield*/, config_1.getConfiguration(path_1.default.join(buildSourceFolder, 'sasjs', 'sasjsconfig.json'))];
369
+ case 1:
370
+ config = _a.sent();
371
+ targetJson = (config.targets || []).find(function (t) { return t.name === 'server'; });
372
+ commonFields = {
373
+ scope: targetScope_1.TargetScope.Local,
374
+ serverType: utils_1.ServerType.Sasjs,
375
+ name: 'server',
376
+ appLoc: '/Public/app/new/location/2',
377
+ serverUrl: process.env.SASJS_SERVER_URL || '',
378
+ existingTarget: targetJson
379
+ };
380
+ jest
381
+ .spyOn(inputModule, 'getCommonFields')
382
+ .mockImplementation(function () { return Promise.resolve(commonFields); });
383
+ jest
384
+ .spyOn(inputModule, 'getIsDefault')
385
+ .mockImplementation(function () { return Promise.resolve(false); });
386
+ jest
387
+ .spyOn(inputModule, 'getAndValidateSasjsFields')
388
+ .mockImplementation(function () {
389
+ return Promise.resolve({
390
+ target: new utils_1.Target(__assign(__assign({}, targetJson), commonFields))
391
+ });
392
+ });
393
+ return [4 /*yield*/, expect(addTarget_1.addTarget(false)).resolves.toEqual(true)];
394
+ case 2:
395
+ _a.sent();
396
+ return [4 /*yield*/, verifyTarget(commonFields, true)];
397
+ case 3:
398
+ _a.sent();
399
+ return [2 /*return*/];
400
+ }
401
+ });
402
+ }); });
325
403
  it('should update a target in the global .sasjsrc file', function () { return __awaiter(void 0, void 0, void 0, function () {
326
404
  var commonFields;
327
405
  return __generator(this, function (_a) {
@@ -92,8 +92,6 @@ var config_1 = require("../../utils/config");
92
92
  var compile_1 = require("../compile/compile");
93
93
  var config_2 = require("./internal/config");
94
94
  var getLaunchPageCode_1 = require("./internal/getLaunchPageCode");
95
- var dependencies_1 = require("../shared/dependencies");
96
- var compileTestFile_1 = require("../compile/internal/compileTestFile");
97
95
  function build(target) {
98
96
  return __awaiter(this, void 0, void 0, function () {
99
97
  return __generator(this, function (_a) {
@@ -132,7 +130,7 @@ function createFinalSasFiles(target) {
132
130
  function createFinalSasFile(target, streamConfig) {
133
131
  var _a, _b, _c, _d, _e, _f;
134
132
  return __awaiter(this, void 0, void 0, function () {
135
- var streamWeb, buildConfig, serverType, name, macroFolders, buildOutputFileName, buildDestinationFolder, finalSasFileContent, finalFilePath, finalFilePathJSON, buildInfo, buildInit, buildTerm, dependencyFilePaths, dependenciesContent, _g, folderContent, folderContentJSON;
133
+ var streamWeb, buildConfig, serverType, name, macroFolders, buildOutputFileName, buildDestinationFolder, finalSasFileContent, finalFilePath, finalFilePathJSON, buildInfo, buildInit, buildTerm, macroCorePath, dependencyFilePaths, dependenciesContent, _g, folderContent, folderContentJSON;
136
134
  return __generator(this, function (_h) {
137
135
  switch (_h.label) {
138
136
  case 0:
@@ -156,7 +154,8 @@ function createFinalSasFile(target, streamConfig) {
156
154
  return [4 /*yield*/, config_2.getBuildTerm(target)];
157
155
  case 4:
158
156
  buildTerm = _h.sent();
159
- return [4 /*yield*/, dependencies_1.getDependencyPaths(buildTerm + "\n" + buildInit, macroFolders)];
157
+ macroCorePath = config_1.getMacroCorePath();
158
+ return [4 /*yield*/, utils_1.getDependencyPaths(buildTerm + "\n" + buildInit, macroFolders, macroCorePath)];
160
159
  case 5:
161
160
  dependencyFilePaths = _h.sent();
162
161
  return [4 /*yield*/, getDependencies(dependencyFilePaths)];
@@ -189,7 +188,7 @@ function createFinalSasFile(target, streamConfig) {
189
188
  }
190
189
  function getBuildInfo(target, streamWeb) {
191
190
  return __awaiter(this, void 0, void 0, function () {
192
- var buildConfig, serverType, appLoc, macroFolders, createWebServiceScript, dependencyFilePaths, createFileScript, dependencyFilePathsForCreateFile, gsubScript, dependencyFilePathsForGsubScript, dependenciesContent, buildVars;
191
+ var buildConfig, serverType, appLoc, macroFolders, createWebServiceScript, macroCorePath, dependencyFilePaths, createFileScript, dependencyFilePathsForCreateFile, gsubScript, dependencyFilePathsForGsubScript, dependenciesContent, buildVars;
193
192
  return __generator(this, function (_a) {
194
193
  switch (_a.label) {
195
194
  case 0:
@@ -201,8 +200,9 @@ function getBuildInfo(target, streamWeb) {
201
200
  return [4 /*yield*/, getCreateWebServiceScript(serverType)];
202
201
  case 2:
203
202
  createWebServiceScript = _a.sent();
203
+ macroCorePath = config_1.getMacroCorePath();
204
204
  buildConfig += createWebServiceScript + "\n";
205
- return [4 /*yield*/, dependencies_1.getDependencyPaths(buildConfig, macroFolders)];
205
+ return [4 /*yield*/, utils_1.getDependencyPaths(buildConfig, macroFolders, macroCorePath)];
206
206
  case 3:
207
207
  dependencyFilePaths = _a.sent();
208
208
  if (!(target.serverType === utils_1.ServerType.SasViya && streamWeb)) return [3 /*break*/, 8];
@@ -210,7 +210,7 @@ function getBuildInfo(target, streamWeb) {
210
210
  case 4:
211
211
  createFileScript = _a.sent();
212
212
  buildConfig += createFileScript + "\n";
213
- return [4 /*yield*/, dependencies_1.getDependencyPaths(createFileScript, macroFolders)
213
+ return [4 /*yield*/, utils_1.getDependencyPaths(createFileScript, macroFolders, macroCorePath)
214
214
  // The gsubScript is used to perform the replacement of the appLoc within
215
215
  // the deployed index.html file. This only happens when deploying using the
216
216
  // SAS Program (build.sas) approach.
@@ -221,7 +221,7 @@ function getBuildInfo(target, streamWeb) {
221
221
  case 6:
222
222
  gsubScript = _a.sent();
223
223
  buildConfig += gsubScript + "\n";
224
- return [4 /*yield*/, dependencies_1.getDependencyPaths(gsubScript, macroFolders)];
224
+ return [4 /*yield*/, utils_1.getDependencyPaths(gsubScript, macroFolders, macroCorePath)];
225
225
  case 7:
226
226
  dependencyFilePathsForGsubScript = _a.sent();
227
227
  dependencyFilePaths = __spreadArray([], __read(new Set(__spreadArray(__spreadArray(__spreadArray([], __read(dependencyFilePaths)), __read(dependencyFilePathsForCreateFile)), __read(dependencyFilePathsForGsubScript)))));
@@ -482,7 +482,7 @@ function getServiceText(serviceFileName, fileContent, serverType, testPath) {
482
482
  }
483
483
  });
484
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 : '')
485
+ ? getWebServiceScriptInvocation(serverType, utils_1.isTestFile(serviceFileName) && testPath ? "" + testPath : '')
486
486
  : '') + "\nfilename sascode clear;\n";
487
487
  }
488
488
  function getFileText(fileName, fileContent, serverType) {
@@ -494,7 +494,7 @@ function getFileText(fileName, fileContent, serverType) {
494
494
  }
495
495
  function getWebFileContent(filecontent, type) {
496
496
  var parsedContent = '';
497
- var chunkedLines = utils_2.chunk(filecontent);
497
+ var chunkedLines = utils_1.chunk(filecontent);
498
498
  if (chunkedLines.length === 1) {
499
499
  parsedContent = " put '" + chunkedLines[0].split("'").join("''") + "';\n";
500
500
  }
@@ -548,7 +548,7 @@ var convertVarsToSasFormat = function (vars) {
548
548
  try {
549
549
  for (var entries_1 = __values(entries), entries_1_1 = entries_1.next(); !entries_1_1.done; entries_1_1 = entries_1.next()) {
550
550
  var _b = __read(entries_1_1.value, 2), name_1 = _b[0], value = _b[1];
551
- var chunks = utils_2.chunk(value);
551
+ var chunks = utils_1.chunk(value);
552
552
  var chunkedString = chunks.join('%trim(\n)');
553
553
  varsContent += "%let " + name_1 + "=" + chunkedString + ";\n";
554
554
  }
@@ -1,3 +1,3 @@
1
- import { Target } from '@sasjs/utils/types';
1
+ import { Target } from '@sasjs/utils';
2
2
  export declare const getBuildInit: (target: Target) => Promise<string>;
3
3
  export declare const getBuildTerm: (target: Target) => Promise<string>;