@sasjs/cli 6.5.0 → 6.6.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.
@@ -0,0 +1,401 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var path_1 = __importDefault(require("path"));
54
+ var promises_1 = require("fs/promises");
55
+ var utils_1 = require("@sasjs/utils");
56
+ var utils_2 = require("../../../utils");
57
+ var test_1 = require("../../../utils/test");
58
+ var internal_1 = require("../internal");
59
+ describe('compile manifest', function () {
60
+ var folderPath;
61
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
62
+ return __generator(this, function (_a) {
63
+ switch (_a.label) {
64
+ case 0: return [4 /*yield*/, (0, utils_2.setConstants)(false)];
65
+ case 1:
66
+ _a.sent();
67
+ return [2 /*return*/];
68
+ }
69
+ });
70
+ }); });
71
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0:
75
+ folderPath = path_1.default.join(__dirname, "cli-tests-manifest-".concat((0, test_1.generateUniqueTimestamp)()));
76
+ return [4 /*yield*/, (0, utils_1.createFolder)(folderPath)];
77
+ case 1:
78
+ _a.sent();
79
+ return [2 /*return*/];
80
+ }
81
+ });
82
+ }); });
83
+ afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
84
+ return __generator(this, function (_a) {
85
+ switch (_a.label) {
86
+ case 0: return [4 /*yield*/, (0, utils_1.deleteFolder)(folderPath)];
87
+ case 1:
88
+ _a.sent();
89
+ return [2 /*return*/];
90
+ }
91
+ });
92
+ }); });
93
+ it('records what the compile read, and reports nothing when it is unchanged', function () { return __awaiter(void 0, void 0, void 0, function () {
94
+ var manifest;
95
+ return __generator(this, function (_a) {
96
+ switch (_a.label) {
97
+ case 0: return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'service.sas'), '%put hello;')];
98
+ case 1:
99
+ _a.sent();
100
+ return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])];
101
+ case 2:
102
+ _a.sent();
103
+ return [4 /*yield*/, (0, internal_1.readCompileManifest)()];
104
+ case 3:
105
+ manifest = _a.sent();
106
+ expect(manifest).not.toBeNull();
107
+ expect(Object.keys(manifest)).toHaveLength(1);
108
+ return [4 /*yield*/, expect((0, internal_1.getChangedFiles)([folderPath])).resolves.toEqual([])];
109
+ case 4:
110
+ _a.sent();
111
+ return [2 /*return*/];
112
+ }
113
+ });
114
+ }); });
115
+ it('reports a file whose content changed', function () { return __awaiter(void 0, void 0, void 0, function () {
116
+ var changed;
117
+ return __generator(this, function (_a) {
118
+ switch (_a.label) {
119
+ case 0: return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'service.sas'), '%put hello;')];
120
+ case 1:
121
+ _a.sent();
122
+ return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])];
123
+ case 2:
124
+ _a.sent();
125
+ return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'service.sas'), '%put goodbye;')];
126
+ case 3:
127
+ _a.sent();
128
+ return [4 /*yield*/, (0, internal_1.getChangedFiles)([folderPath])];
129
+ case 4:
130
+ changed = _a.sent();
131
+ expect(changed).toHaveLength(1);
132
+ expect(changed[0]).toEqual(path_1.default.join(folderPath, 'service.sas'));
133
+ return [2 /*return*/];
134
+ }
135
+ });
136
+ }); });
137
+ it('reports a file the manifest has never seen, including in a sub folder', function () { return __awaiter(void 0, void 0, void 0, function () {
138
+ var changed;
139
+ return __generator(this, function (_a) {
140
+ switch (_a.label) {
141
+ case 0: return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])];
142
+ case 1:
143
+ _a.sent();
144
+ return [4 /*yield*/, (0, utils_1.createFolder)(path_1.default.join(folderPath, 'editors'))];
145
+ case 2:
146
+ _a.sent();
147
+ return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'editors', 'getdata.js'), 'const a = 1')];
148
+ case 3:
149
+ _a.sent();
150
+ return [4 /*yield*/, (0, internal_1.getChangedFiles)([folderPath])];
151
+ case 4:
152
+ changed = _a.sent();
153
+ expect(changed).toHaveLength(1);
154
+ expect(changed[0]).toEqual(path_1.default.join(folderPath, 'editors', 'getdata.js'));
155
+ return [2 /*return*/];
156
+ }
157
+ });
158
+ }); });
159
+ it('hashes test files, which live in the service folders and are compiled too', function () { return __awaiter(void 0, void 0, void 0, function () {
160
+ var changed;
161
+ return __generator(this, function (_a) {
162
+ switch (_a.label) {
163
+ case 0: return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'getdata.test.1.sas'), '%put test;')];
164
+ case 1:
165
+ _a.sent();
166
+ return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])];
167
+ case 2:
168
+ _a.sent();
169
+ return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'getdata.test.1.sas'), '%put changed test;')];
170
+ case 3:
171
+ _a.sent();
172
+ return [4 /*yield*/, (0, internal_1.getChangedFiles)([folderPath])];
173
+ case 4:
174
+ changed = _a.sent();
175
+ expect(changed).toHaveLength(1);
176
+ expect(changed[0]).toContain('getdata.test.1.sas');
177
+ return [2 /*return*/];
178
+ }
179
+ });
180
+ }); });
181
+ it('reports a stamp file whose content changed', function () { return __awaiter(void 0, void 0, void 0, function () {
182
+ var stamp;
183
+ return __generator(this, function (_a) {
184
+ switch (_a.label) {
185
+ case 0:
186
+ stamp = path_1.default.join(folderPath, 'package.json');
187
+ return [4 /*yield*/, (0, utils_1.createFile)(stamp, '{"dependencies":{"@sasjs/core":"6.1.0"}}')];
188
+ case 1:
189
+ _a.sent();
190
+ return [4 /*yield*/, (0, internal_1.writeCompileManifest)([], [stamp])];
191
+ case 2:
192
+ _a.sent();
193
+ return [4 /*yield*/, (0, utils_1.createFile)(stamp, '{"dependencies":{"@sasjs/core":"6.2.0"}}')];
194
+ case 3:
195
+ _a.sent();
196
+ return [4 /*yield*/, expect((0, internal_1.getChangedFiles)([], [stamp])).resolves.toEqual([stamp])];
197
+ case 4:
198
+ _a.sent();
199
+ return [2 /*return*/];
200
+ }
201
+ });
202
+ }); });
203
+ it('reports a stamp file the manifest has never seen', function () { return __awaiter(void 0, void 0, void 0, function () {
204
+ var stamp;
205
+ return __generator(this, function (_a) {
206
+ switch (_a.label) {
207
+ case 0:
208
+ stamp = path_1.default.join(folderPath, 'package-lock.json');
209
+ return [4 /*yield*/, (0, internal_1.writeCompileManifest)([])];
210
+ case 1:
211
+ _a.sent();
212
+ return [4 /*yield*/, (0, utils_1.createFile)(stamp, '{}')];
213
+ case 2:
214
+ _a.sent();
215
+ return [4 /*yield*/, expect((0, internal_1.getChangedFiles)([], [stamp])).resolves.toEqual([stamp])];
216
+ case 3:
217
+ _a.sent();
218
+ return [2 /*return*/];
219
+ }
220
+ });
221
+ }); });
222
+ it('treats a corrupt manifest as a project that has not been compiled', function () { return __awaiter(void 0, void 0, void 0, function () {
223
+ var changed;
224
+ return __generator(this, function (_a) {
225
+ switch (_a.label) {
226
+ case 0: return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])];
227
+ case 1:
228
+ _a.sent();
229
+ return [4 /*yield*/, (0, utils_1.createFile)((0, internal_1.getManifestPath)(), 'not json at all')];
230
+ case 2:
231
+ _a.sent();
232
+ return [4 /*yield*/, (0, internal_1.getChangedFiles)([folderPath])];
233
+ case 3:
234
+ changed = _a.sent();
235
+ expect(changed).toHaveLength(1);
236
+ expect(changed[0]).toContain('no compile manifest');
237
+ return [2 /*return*/];
238
+ }
239
+ });
240
+ }); });
241
+ it('hashes a macro core that lives inside the project', function () { return __awaiter(void 0, void 0, void 0, function () {
242
+ var previousCorePath, folders;
243
+ return __generator(this, function (_a) {
244
+ switch (_a.label) {
245
+ case 0:
246
+ previousCorePath = process.sasjsConstants.macroCorePath;
247
+ process.sasjsConstants.macroCorePath = folderPath;
248
+ return [4 /*yield*/, (0, internal_1.getManifestFolders)({
249
+ name: 'core-in-project'
250
+ })];
251
+ case 1:
252
+ folders = _a.sent();
253
+ expect(folders).toContain(folderPath);
254
+ process.sasjsConstants.macroCorePath = previousCorePath;
255
+ return [2 /*return*/];
256
+ }
257
+ });
258
+ }); });
259
+ it('hashes the sync folder when the project syncs one', function () { return __awaiter(void 0, void 0, void 0, function () {
260
+ var previousConfig, folders;
261
+ return __generator(this, function (_a) {
262
+ switch (_a.label) {
263
+ case 0:
264
+ previousConfig = process.sasjsConfig;
265
+ process.sasjsConfig = __assign(__assign({}, (previousConfig || {})), { syncFolder: folderPath });
266
+ return [4 /*yield*/, (0, internal_1.getManifestFolders)({
267
+ name: 'sync-folder'
268
+ })];
269
+ case 1:
270
+ folders = _a.sent();
271
+ expect(folders.map(function (folder) { return path_1.default.resolve(folder); })).toContain(path_1.default.resolve(folderPath));
272
+ process.sasjsConfig = previousConfig;
273
+ return [2 /*return*/];
274
+ }
275
+ });
276
+ }); });
277
+ it('hashes the web source folder when the target streams the web', function () { return __awaiter(void 0, void 0, void 0, function () {
278
+ var folders;
279
+ return __generator(this, function (_a) {
280
+ switch (_a.label) {
281
+ case 0: return [4 /*yield*/, (0, internal_1.getManifestFolders)({
282
+ name: 'stream-web',
283
+ streamConfig: {
284
+ streamWeb: true,
285
+ streamWebFolder: 'web',
286
+ webSourcePath: folderPath,
287
+ streamServiceName: 'index'
288
+ }
289
+ })];
290
+ case 1:
291
+ folders = _a.sent();
292
+ expect(folders.map(function (folder) { return path_1.default.resolve(folder); })).toContain(path_1.default.resolve(folderPath));
293
+ return [2 /*return*/];
294
+ }
295
+ });
296
+ }); });
297
+ it('skips a file that cannot be read instead of failing the check', function () { return __awaiter(void 0, void 0, void 0, function () {
298
+ return __generator(this, function (_a) {
299
+ switch (_a.label) {
300
+ case 0: return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(folderPath, 'service.sas'), '%put hello;')];
301
+ case 1:
302
+ _a.sent();
303
+ return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])
304
+ // a broken link is listed but cannot be read: neither the write nor the
305
+ // check may throw over it
306
+ ];
307
+ case 2:
308
+ _a.sent();
309
+ // a broken link is listed but cannot be read: neither the write nor the
310
+ // check may throw over it
311
+ return [4 /*yield*/, (0, promises_1.symlink)(path_1.default.join(folderPath, 'no-such-target.sas'), path_1.default.join(folderPath, 'broken.sas'))];
312
+ case 3:
313
+ // a broken link is listed but cannot be read: neither the write nor the
314
+ // check may throw over it
315
+ _a.sent();
316
+ return [4 /*yield*/, expect((0, internal_1.writeCompileManifest)([folderPath])).resolves.toBeUndefined()];
317
+ case 4:
318
+ _a.sent();
319
+ return [4 /*yield*/, expect((0, internal_1.getChangedFiles)([folderPath])).resolves.toBeDefined()];
320
+ case 5:
321
+ _a.sent();
322
+ return [2 /*return*/];
323
+ }
324
+ });
325
+ }); });
326
+ it('does not fail the compile when the manifest cannot be written', function () { return __awaiter(void 0, void 0, void 0, function () {
327
+ var previous;
328
+ return __generator(this, function (_a) {
329
+ switch (_a.label) {
330
+ case 0:
331
+ previous = process.sasjsConstants.buildDestinationFolder;
332
+ // a file used as if it were a directory: the manifest write cannot succeed
333
+ process.sasjsConstants.buildDestinationFolder = path_1.default.join(__filename, 'no-such-folder');
334
+ return [4 /*yield*/, expect((0, internal_1.writeCompileManifest)([folderPath])).resolves.toBeUndefined()];
335
+ case 1:
336
+ _a.sent();
337
+ process.sasjsConstants.buildDestinationFolder = previous;
338
+ return [2 /*return*/];
339
+ }
340
+ });
341
+ }); });
342
+ it('treats a manifest that is not an object as unreadable', function () { return __awaiter(void 0, void 0, void 0, function () {
343
+ var changed;
344
+ return __generator(this, function (_a) {
345
+ switch (_a.label) {
346
+ case 0: return [4 /*yield*/, (0, internal_1.writeCompileManifest)([folderPath])];
347
+ case 1:
348
+ _a.sent();
349
+ return [4 /*yield*/, (0, utils_1.createFile)((0, internal_1.getManifestPath)(), '42')];
350
+ case 2:
351
+ _a.sent();
352
+ return [4 /*yield*/, (0, internal_1.getChangedFiles)([folderPath])];
353
+ case 3:
354
+ changed = _a.sent();
355
+ expect(changed[0]).toContain('no compile manifest');
356
+ return [2 /*return*/];
357
+ }
358
+ });
359
+ }); });
360
+ it('leaves out a configured folder that does not exist', function () { return __awaiter(void 0, void 0, void 0, function () {
361
+ var previousConfig, missing, folders;
362
+ return __generator(this, function (_a) {
363
+ switch (_a.label) {
364
+ case 0:
365
+ previousConfig = process.sasjsConfig;
366
+ missing = path_1.default.join(folderPath, 'not-created');
367
+ process.sasjsConfig = __assign(__assign({}, (previousConfig || {})), { syncFolder: missing });
368
+ return [4 /*yield*/, (0, internal_1.getManifestFolders)({
369
+ name: 'missing-sync-folder'
370
+ })];
371
+ case 1:
372
+ folders = _a.sent();
373
+ expect(folders.map(function (folder) { return path_1.default.resolve(folder); })).not.toContain(path_1.default.resolve(missing));
374
+ process.sasjsConfig = previousConfig;
375
+ return [2 /*return*/];
376
+ }
377
+ });
378
+ }); });
379
+ it('treats a missing manifest as a project that has not been compiled', function () { return __awaiter(void 0, void 0, void 0, function () {
380
+ var manifestPath, changed;
381
+ return __generator(this, function (_a) {
382
+ switch (_a.label) {
383
+ case 0:
384
+ manifestPath = (0, internal_1.getManifestPath)();
385
+ return [4 /*yield*/, (0, utils_1.fileExists)(manifestPath)];
386
+ case 1:
387
+ if (!_a.sent()) return [3 /*break*/, 3];
388
+ return [4 /*yield*/, (0, utils_1.deleteFile)(manifestPath)];
389
+ case 2:
390
+ _a.sent();
391
+ _a.label = 3;
392
+ case 3: return [4 /*yield*/, (0, internal_1.getChangedFiles)([folderPath])];
393
+ case 4:
394
+ changed = _a.sent();
395
+ expect(changed).toHaveLength(1);
396
+ expect(changed[0]).toContain('no compile manifest');
397
+ return [2 /*return*/];
398
+ }
399
+ });
400
+ }); });
401
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __values = (this && this.__values) || function(o) {
39
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
40
+ if (m) return m.call(o);
41
+ if (o && typeof o.length === "number") return {
42
+ next: function () {
43
+ if (o && i >= o.length) o = void 0;
44
+ return { value: o && o[i++], done: !o };
45
+ }
46
+ };
47
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var path_1 = __importDefault(require("path"));
54
+ var utils_1 = require("@sasjs/utils");
55
+ var utils_2 = require("@sasjs/utils");
56
+ var test_1 = require("../../../utils/test");
57
+ var utils_3 = require("../../../utils");
58
+ var internal_1 = require("../internal");
59
+ var jsService = "/**\n @file getdata.js\n @brief returns rows for a dropdown\n**/\n\nconst nodePath = require('path')\n\nfunction rows() {\n return [{ LIBDS: 'SASControlTable' }]\n}\n";
60
+ var buildTarget = function (serverType, name) {
61
+ return ({
62
+ name: name,
63
+ appLoc: '/Public/app',
64
+ serverType: serverType,
65
+ serviceConfig: {},
66
+ jobConfig: {},
67
+ buildConfig: {}
68
+ });
69
+ };
70
+ describe('pass-through files', function () {
71
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0: return [4 /*yield*/, (0, utils_3.setConstants)(false)];
75
+ case 1:
76
+ _a.sent();
77
+ return [2 /*return*/];
78
+ }
79
+ });
80
+ }); });
81
+ describe('shouldPassThrough', function () {
82
+ it('passes a .js file through', function () {
83
+ expect((0, internal_1.shouldPassThrough)('getdata.js')).toBe(true);
84
+ });
85
+ it('passes a file with no extension through', function () {
86
+ expect((0, internal_1.shouldPassThrough)('payload')).toBe(true);
87
+ });
88
+ it('does not pass a .sas file through', function () {
89
+ expect((0, internal_1.shouldPassThrough)('getdata.sas')).toBe(false);
90
+ });
91
+ });
92
+ describe('compileFile', function () {
93
+ var e_1, _a;
94
+ var folderPath;
95
+ var filePath;
96
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
97
+ return __generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0:
100
+ folderPath = path_1.default.join(__dirname, "cli-tests-pass-through-".concat((0, test_1.generateUniqueTimestamp)()));
101
+ return [4 /*yield*/, (0, utils_2.createFolder)(folderPath)];
102
+ case 1:
103
+ _a.sent();
104
+ filePath = path_1.default.join(folderPath, 'getdata.js');
105
+ return [4 /*yield*/, (0, utils_2.createFile)(filePath, jsService)];
106
+ case 2:
107
+ _a.sent();
108
+ return [2 /*return*/];
109
+ }
110
+ });
111
+ }); });
112
+ afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
113
+ return __generator(this, function (_a) {
114
+ switch (_a.label) {
115
+ case 0: return [4 /*yield*/, (0, utils_2.deleteFolder)(folderPath)];
116
+ case 1:
117
+ _a.sent();
118
+ return [2 /*return*/];
119
+ }
120
+ });
121
+ }); });
122
+ var _loop_1 = function (serverType) {
123
+ it("leaves the file untouched on ".concat(serverType), function () { return __awaiter(void 0, void 0, void 0, function () {
124
+ var target;
125
+ return __generator(this, function (_a) {
126
+ switch (_a.label) {
127
+ case 0:
128
+ target = buildTarget(serverType, 'pass-through-test');
129
+ return [4 /*yield*/, (0, internal_1.compileFile)(target, filePath, [], [], undefined, (0, internal_1.getCompileTree)(target), 'service', folderPath)];
130
+ case 1:
131
+ _a.sent();
132
+ return [4 /*yield*/, expect((0, utils_2.readFile)(filePath)).resolves.toEqual(jsService)];
133
+ case 2:
134
+ _a.sent();
135
+ return [2 /*return*/];
136
+ }
137
+ });
138
+ }); });
139
+ };
140
+ try {
141
+ // The same project must produce the same pack whatever the target: a file
142
+ // that is not SAS is shipped as written, not reinterpreted per server type.
143
+ for (var _b = __values([
144
+ utils_1.ServerType.Sasjs,
145
+ utils_1.ServerType.SasViya,
146
+ utils_1.ServerType.Sas9
147
+ ]), _c = _b.next(); !_c.done; _c = _b.next()) {
148
+ var serverType = _c.value;
149
+ _loop_1(serverType);
150
+ }
151
+ }
152
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
153
+ finally {
154
+ try {
155
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
156
+ }
157
+ finally { if (e_1) throw e_1.error; }
158
+ }
159
+ });
160
+ });
@@ -81,6 +81,7 @@ var test_1 = require("../../../utils/test");
81
81
  var utilsModule = __importStar(require("../../../utils/utils"));
82
82
  var types_1 = require("../../../types");
83
83
  var build_1 = require("../../build/build");
84
+ var compile_1 = require("../../compile/compile");
84
85
  var deploy_1 = require("../deploy");
85
86
  var utils_2 = require("./utils");
86
87
  var config_1 = require("../../../utils/config");
@@ -158,32 +159,35 @@ describe('sasjs cbd with server type SASJS', function () {
158
159
  return [4 /*yield*/, (0, config_1.findTargetInConfiguration)(target.name, types_1.TargetScope.Local)];
159
160
  case 4:
160
161
  customTarget = (_c.sent()).target;
161
- return [4 /*yield*/, expect((0, build_1.build)(customTarget)).toResolve()];
162
+ return [4 /*yield*/, (0, compile_1.compile)(customTarget)];
162
163
  case 5:
163
164
  _c.sent();
164
- return [4 /*yield*/, (0, deploy_1.deploy)(customTarget, true)];
165
+ return [4 /*yield*/, expect((0, build_1.build)(customTarget)).toResolve()];
165
166
  case 6:
167
+ _c.sent();
168
+ return [4 /*yield*/, (0, deploy_1.deploy)(customTarget, true)];
169
+ case 7:
166
170
  _c.sent();
167
171
  macroCorePath = process.sasjsConstants.macroCorePath;
168
172
  _b = utils_1.removeHeader;
169
173
  return [4 /*yield*/, (0, utils_1.readFile)("".concat(macroCorePath, "/base/mf_getuser.sas"))];
170
- case 7:
174
+ case 8:
171
175
  mf_getuser = _b.apply(void 0, [_c.sent()]);
172
176
  return [4 /*yield*/, (0, utils_1.readFile)("".concat(macroCorePath, "/base/mp_jsonout.sas"))];
173
- case 8:
177
+ case 9:
174
178
  mp_jsonout = _c.sent();
175
179
  return [4 /*yield*/, (0, utils_1.readFile)("".concat(macroCorePath, "/server/ms_webout.sas"))];
176
- case 9:
180
+ case 10:
177
181
  ms_webout = _c.sent();
178
182
  webout = "%macro webout(action,ds,dslabel=,fmt=,missing=NULL,showmeta=NO,maxobs=MAX);\n %ms_webout(&action,ds=&ds,dslabel=&dslabel,fmt=&fmt\n ,missing=&missing\n ,showmeta=&showmeta\n ,maxobs=&maxobs\n )\n%mend;\n";
179
183
  mocksPath = path_1.default.join(__dirname, appName, 'sasjs', 'mocks');
180
184
  appinitJSPath = path_1.default.join(mocksPath, 'services', 'common', 'appinit.js');
181
185
  getdataJSPath = path_1.default.join(mocksPath, 'services', 'common', 'getdata.js');
182
186
  return [4 /*yield*/, (0, utils_1.readFile)(appinitJSPath)];
183
- case 10:
187
+ case 11:
184
188
  appinitJSContents = _c.sent();
185
189
  return [4 /*yield*/, (0, utils_1.readFile)(getdataJSPath)];
186
- case 11:
190
+ case 12:
187
191
  getdataJSContents = _c.sent();
188
192
  depsInserts = "\n\n* Service Variables start;\n\n\n* Service Variables end;\n* SAS Macros start;\n\n\n\n* SAS Macros end;\n* SAS Includes start;\n\n* SAS Includes end;\n* Binary Files start;\n\n* Binary Files end;\n\n\n* Service start;\n";
189
193
  appinit = "/**\n @file appinit.sas\n @brief Initialisation service - runs on app startup\n @details This is always the first service called when the app is opened.\n\n <h4> SAS Macros </h4>\n\n**/\n\nproc sql;\ncreate table areas as select distinct area\n from mydb.springs;\n\n%webout(OPEN)\n%webout(OBJ,areas)\n%webout(CLOSE)\n\n";
@@ -116,8 +116,11 @@ describe('sasjs test', function () {
116
116
  return [4 /*yield*/, copyTestFiles(target.name)];
117
117
  case 2:
118
118
  _a.sent();
119
- return [4 /*yield*/, (0, __1.build)(target)];
119
+ return [4 /*yield*/, (0, __1.compile)(target)];
120
120
  case 3:
121
+ _a.sent();
122
+ return [4 /*yield*/, (0, __1.build)(target)];
123
+ case 4:
121
124
  _a.sent();
122
125
  process.logger = new utils_1.Logger(utils_1.LogLevel.Off);
123
126
  return [2 /*return*/];
@@ -443,8 +446,11 @@ describe('sasjs test', function () {
443
446
  return [4 /*yield*/, copyTestFiles(target.name)];
444
447
  case 2:
445
448
  _a.sent();
446
- return [4 /*yield*/, (0, __1.build)(target)];
449
+ return [4 /*yield*/, (0, __1.compile)(target)];
447
450
  case 3:
451
+ _a.sent();
452
+ return [4 /*yield*/, (0, __1.build)(target)];
453
+ case 4:
448
454
  _a.sent();
449
455
  process.logger = new utils_1.Logger(utils_1.LogLevel.Off);
450
456
  return [2 /*return*/];
package/package.json CHANGED
@@ -123,5 +123,5 @@
123
123
  "ws": "8.21.0",
124
124
  "nanoid": "3.3.18"
125
125
  },
126
- "version": "6.5.0"
126
+ "version": "6.6.0"
127
127
  }