@sasjs/cli 6.0.0 → 6.1.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.
- package/build/commands/build/build.js +20 -10
- package/build/commands/build/internal/mockSite/assets/intercept.js +172 -0
- package/build/commands/build/internal/mockSite/assets/md5.js +75 -0
- package/build/commands/build/internal/mockSite/assets/persist.js +215 -0
- package/build/commands/build/internal/mockSite/assets/runtime-core.js +616 -0
- package/build/commands/build/internal/mockSite/assets/sw.js +228 -0
- package/build/commands/build/internal/mockSite/mockSite.d.ts +27 -0
- package/build/commands/build/internal/mockSite/mockSite.js +408 -0
- package/build/commands/build/internal/mockSite/spec/intercept.spec.d.ts +1 -0
- package/build/commands/build/internal/mockSite/spec/intercept.spec.js +267 -0
- package/build/commands/build/internal/mockSite/spec/mockSite.spec.d.ts +1 -0
- package/build/commands/build/internal/mockSite/spec/mockSite.spec.js +405 -0
- package/build/commands/build/internal/mockSite/spec/persist.spec.d.ts +1 -0
- package/build/commands/build/internal/mockSite/spec/persist.spec.js +418 -0
- package/build/commands/build/internal/mockSite/spec/runtime-core.spec.d.ts +1 -0
- package/build/commands/build/internal/mockSite/spec/runtime-core.spec.js +296 -0
- package/build/commands/build/internal/mockSite/spec/sw.spec.d.ts +1 -0
- package/build/commands/build/internal/mockSite/spec/sw.spec.js +361 -0
- package/build/commands/index.d.ts +1 -0
- package/build/commands/index.js +3 -1
- package/package.json +8 -7
|
@@ -0,0 +1,418 @@
|
|
|
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 __read = (this && this.__read) || function (o, n) {
|
|
39
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
+
if (!m) return o;
|
|
41
|
+
var i = m.call(o), r, ar = [], e;
|
|
42
|
+
try {
|
|
43
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
+
}
|
|
45
|
+
catch (error) { e = { error: error }; }
|
|
46
|
+
finally {
|
|
47
|
+
try {
|
|
48
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
+
}
|
|
50
|
+
finally { if (e) throw e.error; }
|
|
51
|
+
}
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
55
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
56
|
+
if (ar || !(i in from)) {
|
|
57
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
58
|
+
ar[i] = from[i];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
62
|
+
};
|
|
63
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
64
|
+
/**
|
|
65
|
+
* The page-side store: it owns the drive and asks the worker for snapshots. What
|
|
66
|
+
* matters here is the ask/reply plumbing and the IndexedDB round trip - a
|
|
67
|
+
* listener that outlives its request fires for a reply nobody reads, and a
|
|
68
|
+
* timeout that reads like a snapshot empties the drive on download.
|
|
69
|
+
*/
|
|
70
|
+
/** Enough of IndexedDB to exercise the store: one store, no indexes. */
|
|
71
|
+
var createIndexedDB = function () {
|
|
72
|
+
var rows = new Map();
|
|
73
|
+
var data = function () { return rows; };
|
|
74
|
+
var request = function (run) {
|
|
75
|
+
var req = { result: undefined, onsuccess: null, onerror: null };
|
|
76
|
+
setTimeout(function () {
|
|
77
|
+
try {
|
|
78
|
+
req.result = run();
|
|
79
|
+
if (req.onsuccess)
|
|
80
|
+
req.onsuccess();
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
if (req.onerror)
|
|
84
|
+
req.onerror();
|
|
85
|
+
}
|
|
86
|
+
}, 0);
|
|
87
|
+
return req;
|
|
88
|
+
};
|
|
89
|
+
var objectStore = {
|
|
90
|
+
put: function (value, key) {
|
|
91
|
+
data().set(key, value);
|
|
92
|
+
},
|
|
93
|
+
delete: function (key) {
|
|
94
|
+
data().delete(key);
|
|
95
|
+
},
|
|
96
|
+
clear: function () { return data().clear(); },
|
|
97
|
+
getAllKeys: function () { return request(function () { return __spreadArray([], __read(data().keys()), false); }); },
|
|
98
|
+
getAll: function () { return request(function () { return __spreadArray([], __read(data().values()), false); }); }
|
|
99
|
+
};
|
|
100
|
+
var db = {
|
|
101
|
+
objectStoreNames: { contains: function () { return true; } },
|
|
102
|
+
createObjectStore: function () { return objectStore; },
|
|
103
|
+
transaction: function (_store, _mode) {
|
|
104
|
+
var tx = {
|
|
105
|
+
oncomplete: null,
|
|
106
|
+
onerror: null,
|
|
107
|
+
onabort: null,
|
|
108
|
+
objectStore: function () { return objectStore; }
|
|
109
|
+
};
|
|
110
|
+
setTimeout(function () { return tx.oncomplete && tx.oncomplete(); }, 0);
|
|
111
|
+
return tx;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var open = function () {
|
|
115
|
+
var req = {
|
|
116
|
+
result: db,
|
|
117
|
+
onsuccess: null,
|
|
118
|
+
onerror: null,
|
|
119
|
+
onupgradeneeded: null
|
|
120
|
+
};
|
|
121
|
+
setTimeout(function () {
|
|
122
|
+
if (req.onupgradeneeded)
|
|
123
|
+
req.onupgradeneeded();
|
|
124
|
+
if (req.onsuccess)
|
|
125
|
+
req.onsuccess();
|
|
126
|
+
}, 0);
|
|
127
|
+
return req;
|
|
128
|
+
};
|
|
129
|
+
return { open: open, rows: rows };
|
|
130
|
+
};
|
|
131
|
+
var loadPersist = function (options) {
|
|
132
|
+
if (options === void 0) { options = {}; }
|
|
133
|
+
jest.resetModules();
|
|
134
|
+
var posted = [];
|
|
135
|
+
var listeners = [];
|
|
136
|
+
var removed = [];
|
|
137
|
+
var controller = options.controller === undefined
|
|
138
|
+
? { postMessage: function (message) { return posted.push(message); } }
|
|
139
|
+
: options.controller;
|
|
140
|
+
var serviceWorker = {
|
|
141
|
+
controller: controller,
|
|
142
|
+
// Never resolves by default: the boot sequence then stops before it touches
|
|
143
|
+
// IndexedDB, leaving the ask/reply tests to drive it directly.
|
|
144
|
+
ready: options.ready || new Promise(function () { }),
|
|
145
|
+
addEventListener: function (type, fn) {
|
|
146
|
+
if (type === 'message')
|
|
147
|
+
listeners.push(fn);
|
|
148
|
+
},
|
|
149
|
+
removeEventListener: function (type, fn) {
|
|
150
|
+
if (type !== 'message')
|
|
151
|
+
return;
|
|
152
|
+
removed.push(fn);
|
|
153
|
+
var index = listeners.indexOf(fn);
|
|
154
|
+
if (index >= 0)
|
|
155
|
+
listeners.splice(index, 1);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
var window = {};
|
|
159
|
+
global.window = window;
|
|
160
|
+
global.navigator = { serviceWorker: serviceWorker };
|
|
161
|
+
var idb = options.seeded
|
|
162
|
+
? (function () {
|
|
163
|
+
var fake = createIndexedDB();
|
|
164
|
+
Object.entries(options.seeded).forEach(function (_a) {
|
|
165
|
+
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
166
|
+
return fake.rows.set(key, value);
|
|
167
|
+
});
|
|
168
|
+
return fake;
|
|
169
|
+
})()
|
|
170
|
+
: createIndexedDB();
|
|
171
|
+
global.indexedDB = idb;
|
|
172
|
+
require('../assets/persist.js');
|
|
173
|
+
var reply = function (data) { return __spreadArray([], __read(listeners), false).forEach(function (fn) { return fn({ data: data }); }); };
|
|
174
|
+
return { window: window, listeners: listeners, removed: removed, posted: posted, reply: reply, rows: idb.rows };
|
|
175
|
+
};
|
|
176
|
+
describe('page-side store', function () {
|
|
177
|
+
afterEach(function () {
|
|
178
|
+
jest.useRealTimers();
|
|
179
|
+
delete global.window;
|
|
180
|
+
delete global.navigator;
|
|
181
|
+
delete global.indexedDB;
|
|
182
|
+
});
|
|
183
|
+
it('asks the worker for a snapshot and drops the listener when it replies', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
184
|
+
var _a, window, listeners, removed, reply, before, pending;
|
|
185
|
+
return __generator(this, function (_b) {
|
|
186
|
+
switch (_b.label) {
|
|
187
|
+
case 0:
|
|
188
|
+
_a = loadPersist(), window = _a.window, listeners = _a.listeners, removed = _a.removed, reply = _a.reply;
|
|
189
|
+
before = listeners.length;
|
|
190
|
+
pending = window.SASjsMock.snapshot();
|
|
191
|
+
return [4 /*yield*/, Promise.resolve()];
|
|
192
|
+
case 1:
|
|
193
|
+
_b.sent();
|
|
194
|
+
reply({ type: 'sasjs-snapshot', files: { '/sasjs/drive/a.txt': 'a' } });
|
|
195
|
+
return [4 /*yield*/, expect(pending).resolves.toEqual({
|
|
196
|
+
type: 'sasjs-snapshot',
|
|
197
|
+
files: { '/sasjs/drive/a.txt': 'a' }
|
|
198
|
+
})];
|
|
199
|
+
case 2:
|
|
200
|
+
_b.sent();
|
|
201
|
+
expect(removed).toHaveLength(1);
|
|
202
|
+
expect(listeners.length).toBe(before);
|
|
203
|
+
return [2 /*return*/];
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}); });
|
|
207
|
+
it('reports a timeout as an error and leaves no listener behind', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
208
|
+
var _a, window, listeners, reply, before, pending;
|
|
209
|
+
return __generator(this, function (_b) {
|
|
210
|
+
switch (_b.label) {
|
|
211
|
+
case 0:
|
|
212
|
+
jest.useFakeTimers();
|
|
213
|
+
_a = loadPersist(), window = _a.window, listeners = _a.listeners, reply = _a.reply;
|
|
214
|
+
before = listeners.length;
|
|
215
|
+
pending = window.SASjsMock.snapshot();
|
|
216
|
+
return [4 /*yield*/, jest.advanceTimersByTimeAsync(20000)];
|
|
217
|
+
case 1:
|
|
218
|
+
_b.sent();
|
|
219
|
+
return [4 /*yield*/, expect(pending).resolves.toEqual({
|
|
220
|
+
error: 'timed out waiting for sasjs-snapshot'
|
|
221
|
+
})];
|
|
222
|
+
case 2:
|
|
223
|
+
_b.sent();
|
|
224
|
+
expect(listeners.length).toBe(before);
|
|
225
|
+
// a reply that arrives after the timeout goes nowhere: the listener is gone
|
|
226
|
+
reply({ type: 'sasjs-snapshot', files: { late: 'x' } });
|
|
227
|
+
return [4 /*yield*/, expect(pending).resolves.toEqual({
|
|
228
|
+
error: 'timed out waiting for sasjs-snapshot'
|
|
229
|
+
})];
|
|
230
|
+
case 3:
|
|
231
|
+
_b.sent();
|
|
232
|
+
expect(listeners.length).toBe(before);
|
|
233
|
+
return [2 /*return*/];
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}); });
|
|
237
|
+
it('reports a missing controller as an error', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
238
|
+
var _a, window, listeners, before, pending;
|
|
239
|
+
return __generator(this, function (_b) {
|
|
240
|
+
switch (_b.label) {
|
|
241
|
+
case 0:
|
|
242
|
+
jest.useFakeTimers();
|
|
243
|
+
_a = loadPersist({ controller: null }), window = _a.window, listeners = _a.listeners;
|
|
244
|
+
before = listeners.length;
|
|
245
|
+
pending = window.SASjsMock.snapshot();
|
|
246
|
+
return [4 /*yield*/, jest.advanceTimersByTimeAsync(11000)];
|
|
247
|
+
case 1:
|
|
248
|
+
_b.sent();
|
|
249
|
+
return [4 /*yield*/, expect(pending).resolves.toEqual({
|
|
250
|
+
error: 'no service worker controller'
|
|
251
|
+
})];
|
|
252
|
+
case 2:
|
|
253
|
+
_b.sent();
|
|
254
|
+
expect(listeners.length).toBe(before);
|
|
255
|
+
return [2 /*return*/];
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}); });
|
|
259
|
+
it('writes, reads back and clears the drive', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
260
|
+
var window;
|
|
261
|
+
return __generator(this, function (_a) {
|
|
262
|
+
switch (_a.label) {
|
|
263
|
+
case 0:
|
|
264
|
+
window = loadPersist().window;
|
|
265
|
+
return [4 /*yield*/, expect(window.SASjsMock.writeFiles({ '/sasjs/drive/a.txt': 'a' })).resolves.toEqual({ written: 1, deleted: 0 })];
|
|
266
|
+
case 1:
|
|
267
|
+
_a.sent();
|
|
268
|
+
return [4 /*yield*/, expect(window.SASjsMock.readAll()).resolves.toEqual({
|
|
269
|
+
'/sasjs/drive/a.txt': 'a'
|
|
270
|
+
})];
|
|
271
|
+
case 2:
|
|
272
|
+
_a.sent();
|
|
273
|
+
return [4 /*yield*/, expect(window.SASjsMock.writeFiles({ '/sasjs/drive/a.txt': null })).resolves.toEqual({ written: 0, deleted: 1 })];
|
|
274
|
+
case 3:
|
|
275
|
+
_a.sent();
|
|
276
|
+
return [4 /*yield*/, expect(window.SASjsMock.readAll()).resolves.toEqual({})];
|
|
277
|
+
case 4:
|
|
278
|
+
_a.sent();
|
|
279
|
+
return [4 /*yield*/, window.SASjsMock.writeFiles({ '/sasjs/drive/b.txt': 'bb' })];
|
|
280
|
+
case 5:
|
|
281
|
+
_a.sent();
|
|
282
|
+
return [4 /*yield*/, expect(window.SASjsMock.stats()).resolves.toEqual({
|
|
283
|
+
files: 1,
|
|
284
|
+
bytes: 2
|
|
285
|
+
})];
|
|
286
|
+
case 6:
|
|
287
|
+
_a.sent();
|
|
288
|
+
return [4 /*yield*/, window.SASjsMock.clear()];
|
|
289
|
+
case 7:
|
|
290
|
+
_a.sent();
|
|
291
|
+
return [4 /*yield*/, expect(window.SASjsMock.readAll()).resolves.toEqual({})];
|
|
292
|
+
case 8:
|
|
293
|
+
_a.sent();
|
|
294
|
+
return [2 /*return*/];
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}); });
|
|
298
|
+
it('writes nothing when a change set is empty', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
299
|
+
var window;
|
|
300
|
+
return __generator(this, function (_a) {
|
|
301
|
+
switch (_a.label) {
|
|
302
|
+
case 0:
|
|
303
|
+
window = loadPersist().window;
|
|
304
|
+
return [4 /*yield*/, expect(window.SASjsMock.writeFiles({})).resolves.toEqual({
|
|
305
|
+
written: 0,
|
|
306
|
+
deleted: 0
|
|
307
|
+
})];
|
|
308
|
+
case 1:
|
|
309
|
+
_a.sent();
|
|
310
|
+
return [4 /*yield*/, expect(window.SASjsMock.writeFiles(undefined)).resolves.toEqual({
|
|
311
|
+
written: 0,
|
|
312
|
+
deleted: 0
|
|
313
|
+
})];
|
|
314
|
+
case 2:
|
|
315
|
+
_a.sent();
|
|
316
|
+
return [2 /*return*/];
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}); });
|
|
320
|
+
it('persists the files the worker reports as changed', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
321
|
+
var _a, window, reply, rows;
|
|
322
|
+
return __generator(this, function (_b) {
|
|
323
|
+
switch (_b.label) {
|
|
324
|
+
case 0:
|
|
325
|
+
_a = loadPersist(), window = _a.window, reply = _a.reply, rows = _a.rows;
|
|
326
|
+
reply({ type: 'sasjs-persist', files: { '/sasjs/drive/c.txt': 'ccc' } });
|
|
327
|
+
return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 20); })];
|
|
328
|
+
case 1:
|
|
329
|
+
_b.sent();
|
|
330
|
+
expect(rows.get('/sasjs/drive/c.txt')).toBe('ccc');
|
|
331
|
+
return [2 /*return*/];
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}); });
|
|
335
|
+
it('resets the worker and the stored drive together', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
336
|
+
var _a, window, posted, reply, rows, pending;
|
|
337
|
+
return __generator(this, function (_b) {
|
|
338
|
+
switch (_b.label) {
|
|
339
|
+
case 0:
|
|
340
|
+
_a = loadPersist({
|
|
341
|
+
seeded: { '/sasjs/drive/old.txt': 'old' }
|
|
342
|
+
}), window = _a.window, posted = _a.posted, reply = _a.reply, rows = _a.rows;
|
|
343
|
+
pending = window.SASjsMock.reset();
|
|
344
|
+
return [4 /*yield*/, Promise.resolve()];
|
|
345
|
+
case 1:
|
|
346
|
+
_b.sent();
|
|
347
|
+
expect(posted.some(function (m) { return m.type === 'sasjs-reset'; })).toBe(true);
|
|
348
|
+
reply({ type: 'sasjs-reset-ack' });
|
|
349
|
+
return [4 /*yield*/, expect(pending).resolves.toBe(true)];
|
|
350
|
+
case 2:
|
|
351
|
+
_b.sent();
|
|
352
|
+
expect(rows.has('/sasjs/drive/old.txt')).toBe(false);
|
|
353
|
+
return [2 /*return*/];
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}); });
|
|
357
|
+
it('hands a stored drive to the worker at boot', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
358
|
+
var controller, _a, window, listeners, answering, info;
|
|
359
|
+
return __generator(this, function (_b) {
|
|
360
|
+
switch (_b.label) {
|
|
361
|
+
case 0:
|
|
362
|
+
controller = { postMessage: jest.fn() };
|
|
363
|
+
_a = loadPersist({
|
|
364
|
+
controller: controller,
|
|
365
|
+
ready: Promise.resolve({}),
|
|
366
|
+
seeded: { '/sasjs/drive/stored.txt': 'stored' }
|
|
367
|
+
}), window = _a.window, listeners = _a.listeners;
|
|
368
|
+
answering = setInterval(function () {
|
|
369
|
+
var asked = controller.postMessage.mock.calls;
|
|
370
|
+
if (!asked.length)
|
|
371
|
+
return;
|
|
372
|
+
var type = asked[0][0].type;
|
|
373
|
+
__spreadArray([], __read(listeners), false).forEach(function (fn) {
|
|
374
|
+
return fn({ data: { type: type + '-ack', booted: true } });
|
|
375
|
+
});
|
|
376
|
+
}, 5);
|
|
377
|
+
return [4 /*yield*/, window.__sasjsMockReady];
|
|
378
|
+
case 1:
|
|
379
|
+
info = _b.sent();
|
|
380
|
+
clearInterval(answering);
|
|
381
|
+
expect(controller.postMessage).toHaveBeenCalledWith(expect.objectContaining({
|
|
382
|
+
type: 'sasjs-load',
|
|
383
|
+
files: { '/sasjs/drive/stored.txt': 'stored' }
|
|
384
|
+
}));
|
|
385
|
+
expect(info).toEqual({ type: 'sasjs-load-ack', booted: true });
|
|
386
|
+
return [2 /*return*/];
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}); });
|
|
390
|
+
it('asks for a seed at boot when nothing is stored', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
391
|
+
var controller, _a, window, listeners, answering;
|
|
392
|
+
return __generator(this, function (_b) {
|
|
393
|
+
switch (_b.label) {
|
|
394
|
+
case 0:
|
|
395
|
+
controller = { postMessage: jest.fn() };
|
|
396
|
+
_a = loadPersist({
|
|
397
|
+
controller: controller,
|
|
398
|
+
ready: Promise.resolve({})
|
|
399
|
+
}), window = _a.window, listeners = _a.listeners;
|
|
400
|
+
answering = setInterval(function () {
|
|
401
|
+
var asked = controller.postMessage.mock.calls;
|
|
402
|
+
if (!asked.length)
|
|
403
|
+
return;
|
|
404
|
+
var type = asked[0][0].type;
|
|
405
|
+
__spreadArray([], __read(listeners), false).forEach(function (fn) { return fn({ data: { type: type + '-ack' } }); });
|
|
406
|
+
}, 5);
|
|
407
|
+
return [4 /*yield*/, window.__sasjsMockReady];
|
|
408
|
+
case 1:
|
|
409
|
+
_b.sent();
|
|
410
|
+
clearInterval(answering);
|
|
411
|
+
expect(controller.postMessage).toHaveBeenCalledWith({
|
|
412
|
+
type: 'sasjs-seed'
|
|
413
|
+
});
|
|
414
|
+
return [2 /*return*/];
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
}); });
|
|
418
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|