1 | (function (global, factory) {
|
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs/operators')) :
|
3 | typeof define === 'function' && define.amd ? define('preboot', ['exports', '@angular/core', '@angular/common', 'rxjs/operators'], factory) :
|
4 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.preboot = {}, global.ng.core, global.ng.common, global.rxjs.operators));
|
5 | }(this, (function (exports, core, common, operators) { 'use strict';
|
6 |
|
7 | |
8 |
|
9 |
|
10 | function getNodeKeyForPreboot(nodeContext) {
|
11 | var ancestors = [];
|
12 | var root = nodeContext.root;
|
13 | var node = nodeContext.node;
|
14 | var temp = node;
|
15 |
|
16 | while (temp && temp !== root.serverNode && temp !== root.clientNode) {
|
17 | ancestors.push(temp);
|
18 | temp = temp.parentNode;
|
19 | }
|
20 |
|
21 | if (temp) {
|
22 | ancestors.push(temp);
|
23 | }
|
24 |
|
25 |
|
26 | var name = node.nodeName || 'unknown';
|
27 | var key = name;
|
28 | var len = ancestors.length;
|
29 | for (var i = len - 1; i >= 0; i--) {
|
30 | temp = ancestors[i];
|
31 | if (temp.childNodes && i > 0) {
|
32 | for (var j = 0; j < temp.childNodes.length; j++) {
|
33 | if (temp.childNodes[j] === ancestors[i - 1]) {
|
34 | key += '_s' + (j + 1);
|
35 | break;
|
36 | }
|
37 | }
|
38 | }
|
39 | }
|
40 | return key;
|
41 | }
|
42 |
|
43 | |
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | var PREBOOT_NONCE = new core.InjectionToken('PrebootNonce');
|
51 |
|
52 | |
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | |
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 | var extendStatics = function (d, b) {
|
76 | extendStatics = Object.setPrototypeOf ||
|
77 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
78 | function (d, b) { for (var p in b)
|
79 | if (Object.prototype.hasOwnProperty.call(b, p))
|
80 | d[p] = b[p]; };
|
81 | return extendStatics(d, b);
|
82 | };
|
83 | function __extends(d, b) {
|
84 | if (typeof b !== "function" && b !== null)
|
85 | throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
86 | extendStatics(d, b);
|
87 | function __() { this.constructor = d; }
|
88 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
89 | }
|
90 | var __assign = function () {
|
91 | __assign = Object.assign || function __assign(t) {
|
92 | for (var s, i = 1, n = arguments.length; i < n; i++) {
|
93 | s = arguments[i];
|
94 | for (var p in s)
|
95 | if (Object.prototype.hasOwnProperty.call(s, p))
|
96 | t[p] = s[p];
|
97 | }
|
98 | return t;
|
99 | };
|
100 | return __assign.apply(this, arguments);
|
101 | };
|
102 | function __rest(s, e) {
|
103 | var t = {};
|
104 | for (var p in s)
|
105 | if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
106 | t[p] = s[p];
|
107 | if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
108 | for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
109 | if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
110 | t[p[i]] = s[p[i]];
|
111 | }
|
112 | return t;
|
113 | }
|
114 | function __decorate(decorators, target, key, desc) {
|
115 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
116 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
117 | r = Reflect.decorate(decorators, target, key, desc);
|
118 | else
|
119 | for (var i = decorators.length - 1; i >= 0; i--)
|
120 | if (d = decorators[i])
|
121 | r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
122 | return c > 3 && r && Object.defineProperty(target, key, r), r;
|
123 | }
|
124 | function __param(paramIndex, decorator) {
|
125 | return function (target, key) { decorator(target, key, paramIndex); };
|
126 | }
|
127 | function __metadata(metadataKey, metadataValue) {
|
128 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
129 | return Reflect.metadata(metadataKey, metadataValue);
|
130 | }
|
131 | function __awaiter(thisArg, _arguments, P, generator) {
|
132 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
133 | return new (P || (P = Promise))(function (resolve, reject) {
|
134 | function fulfilled(value) { try {
|
135 | step(generator.next(value));
|
136 | }
|
137 | catch (e) {
|
138 | reject(e);
|
139 | } }
|
140 | function rejected(value) { try {
|
141 | step(generator["throw"](value));
|
142 | }
|
143 | catch (e) {
|
144 | reject(e);
|
145 | } }
|
146 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
147 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
148 | });
|
149 | }
|
150 | function __generator(thisArg, body) {
|
151 | var _ = { label: 0, sent: function () { if (t[0] & 1)
|
152 | throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
153 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
|
154 | function verb(n) { return function (v) { return step([n, v]); }; }
|
155 | function step(op) {
|
156 | if (f)
|
157 | throw new TypeError("Generator is already executing.");
|
158 | while (_)
|
159 | try {
|
160 | 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)
|
161 | return t;
|
162 | if (y = 0, t)
|
163 | op = [op[0] & 2, t.value];
|
164 | switch (op[0]) {
|
165 | case 0:
|
166 | case 1:
|
167 | t = op;
|
168 | break;
|
169 | case 4:
|
170 | _.label++;
|
171 | return { value: op[1], done: false };
|
172 | case 5:
|
173 | _.label++;
|
174 | y = op[1];
|
175 | op = [0];
|
176 | continue;
|
177 | case 7:
|
178 | op = _.ops.pop();
|
179 | _.trys.pop();
|
180 | continue;
|
181 | default:
|
182 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
183 | _ = 0;
|
184 | continue;
|
185 | }
|
186 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
|
187 | _.label = op[1];
|
188 | break;
|
189 | }
|
190 | if (op[0] === 6 && _.label < t[1]) {
|
191 | _.label = t[1];
|
192 | t = op;
|
193 | break;
|
194 | }
|
195 | if (t && _.label < t[2]) {
|
196 | _.label = t[2];
|
197 | _.ops.push(op);
|
198 | break;
|
199 | }
|
200 | if (t[2])
|
201 | _.ops.pop();
|
202 | _.trys.pop();
|
203 | continue;
|
204 | }
|
205 | op = body.call(thisArg, _);
|
206 | }
|
207 | catch (e) {
|
208 | op = [6, e];
|
209 | y = 0;
|
210 | }
|
211 | finally {
|
212 | f = t = 0;
|
213 | }
|
214 | if (op[0] & 5)
|
215 | throw op[1];
|
216 | return { value: op[0] ? op[1] : void 0, done: true };
|
217 | }
|
218 | }
|
219 | var __createBinding = Object.create ? (function (o, m, k, k2) {
|
220 | if (k2 === undefined)
|
221 | k2 = k;
|
222 | Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });
|
223 | }) : (function (o, m, k, k2) {
|
224 | if (k2 === undefined)
|
225 | k2 = k;
|
226 | o[k2] = m[k];
|
227 | });
|
228 | function __exportStar(m, o) {
|
229 | for (var p in m)
|
230 | if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
|
231 | __createBinding(o, m, p);
|
232 | }
|
233 | function __values(o) {
|
234 | var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
235 | if (m)
|
236 | return m.call(o);
|
237 | if (o && typeof o.length === "number")
|
238 | return {
|
239 | next: function () {
|
240 | if (o && i >= o.length)
|
241 | o = void 0;
|
242 | return { value: o && o[i++], done: !o };
|
243 | }
|
244 | };
|
245 | throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
246 | }
|
247 | function __read(o, n) {
|
248 | var m = typeof Symbol === "function" && o[Symbol.iterator];
|
249 | if (!m)
|
250 | return o;
|
251 | var i = m.call(o), r, ar = [], e;
|
252 | try {
|
253 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
|
254 | ar.push(r.value);
|
255 | }
|
256 | catch (error) {
|
257 | e = { error: error };
|
258 | }
|
259 | finally {
|
260 | try {
|
261 | if (r && !r.done && (m = i["return"]))
|
262 | m.call(i);
|
263 | }
|
264 | finally {
|
265 | if (e)
|
266 | throw e.error;
|
267 | }
|
268 | }
|
269 | return ar;
|
270 | }
|
271 |
|
272 | function __spread() {
|
273 | for (var ar = [], i = 0; i < arguments.length; i++)
|
274 | ar = ar.concat(__read(arguments[i]));
|
275 | return ar;
|
276 | }
|
277 |
|
278 | function __spreadArrays() {
|
279 | for (var s = 0, i = 0, il = arguments.length; i < il; i++)
|
280 | s += arguments[i].length;
|
281 | for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
282 | for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
283 | r[k] = a[j];
|
284 | return r;
|
285 | }
|
286 | function __spreadArray(to, from) {
|
287 | for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
288 | to[j] = from[i];
|
289 | return to;
|
290 | }
|
291 | function __await(v) {
|
292 | return this instanceof __await ? (this.v = v, this) : new __await(v);
|
293 | }
|
294 | function __asyncGenerator(thisArg, _arguments, generator) {
|
295 | if (!Symbol.asyncIterator)
|
296 | throw new TypeError("Symbol.asyncIterator is not defined.");
|
297 | var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
298 | return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
299 | function verb(n) { if (g[n])
|
300 | i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
301 | function resume(n, v) { try {
|
302 | step(g[n](v));
|
303 | }
|
304 | catch (e) {
|
305 | settle(q[0][3], e);
|
306 | } }
|
307 | function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
308 | function fulfill(value) { resume("next", value); }
|
309 | function reject(value) { resume("throw", value); }
|
310 | function settle(f, v) { if (f(v), q.shift(), q.length)
|
311 | resume(q[0][0], q[0][1]); }
|
312 | }
|
313 | function __asyncDelegator(o) {
|
314 | var i, p;
|
315 | return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
316 | function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
|
317 | }
|
318 | function __asyncValues(o) {
|
319 | if (!Symbol.asyncIterator)
|
320 | throw new TypeError("Symbol.asyncIterator is not defined.");
|
321 | var m = o[Symbol.asyncIterator], i;
|
322 | return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
323 | function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
324 | function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
|
325 | }
|
326 | function __makeTemplateObject(cooked, raw) {
|
327 | if (Object.defineProperty) {
|
328 | Object.defineProperty(cooked, "raw", { value: raw });
|
329 | }
|
330 | else {
|
331 | cooked.raw = raw;
|
332 | }
|
333 | return cooked;
|
334 | }
|
335 | ;
|
336 | var __setModuleDefault = Object.create ? (function (o, v) {
|
337 | Object.defineProperty(o, "default", { enumerable: true, value: v });
|
338 | }) : function (o, v) {
|
339 | o["default"] = v;
|
340 | };
|
341 | function __importStar(mod) {
|
342 | if (mod && mod.__esModule)
|
343 | return mod;
|
344 | var result = {};
|
345 | if (mod != null)
|
346 | for (var k in mod)
|
347 | if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
|
348 | __createBinding(result, mod, k);
|
349 | __setModuleDefault(result, mod);
|
350 | return result;
|
351 | }
|
352 | function __importDefault(mod) {
|
353 | return (mod && mod.__esModule) ? mod : { default: mod };
|
354 | }
|
355 | function __classPrivateFieldGet(receiver, privateMap) {
|
356 | if (!privateMap.has(receiver)) {
|
357 | throw new TypeError("attempted to get private field on non-instance");
|
358 | }
|
359 | return privateMap.get(receiver);
|
360 | }
|
361 | function __classPrivateFieldSet(receiver, privateMap, value) {
|
362 | if (!privateMap.has(receiver)) {
|
363 | throw new TypeError("attempted to set private field on non-instance");
|
364 | }
|
365 | privateMap.set(receiver, value);
|
366 | return value;
|
367 | }
|
368 |
|
369 | function _window() {
|
370 | return {
|
371 | prebootData: window['prebootData'],
|
372 | getComputedStyle: window.getComputedStyle,
|
373 | document: document
|
374 | };
|
375 | }
|
376 | var EventReplayer = (function () {
|
377 | function EventReplayer() {
|
378 | this.clientNodeCache = {};
|
379 | this.replayStarted = false;
|
380 | }
|
381 | |
382 |
|
383 |
|
384 |
|
385 | EventReplayer.prototype.setWindow = function (win) {
|
386 | this.win = win;
|
387 | };
|
388 | |
389 |
|
390 |
|
391 |
|
392 | EventReplayer.prototype.getWindow = function () {
|
393 | if (!this.win) {
|
394 | this.win = _window();
|
395 | }
|
396 | return this.win;
|
397 | };
|
398 | |
399 |
|
400 |
|
401 |
|
402 | EventReplayer.prototype.replayAll = function () {
|
403 | var _this = this;
|
404 | if (this.replayStarted) {
|
405 | return;
|
406 | }
|
407 | else {
|
408 | this.replayStarted = true;
|
409 | }
|
410 |
|
411 | var prebootData = this.getWindow().prebootData || {};
|
412 | var apps = prebootData.apps || [];
|
413 | apps.forEach(function (appData) { return _this.replayForApp(appData); });
|
414 |
|
415 | this.cleanup(prebootData);
|
416 | };
|
417 | |
418 |
|
419 |
|
420 |
|
421 | EventReplayer.prototype.replayForApp = function (appData) {
|
422 | var _this = this;
|
423 | appData = (appData || {});
|
424 |
|
425 | try {
|
426 | var events = appData.events || [];
|
427 |
|
428 | events.forEach(function (event) { return _this.replayEvent(appData, event); });
|
429 | }
|
430 | catch (ex) {
|
431 | console.error(ex);
|
432 | }
|
433 |
|
434 | this.switchBuffer(appData);
|
435 | };
|
436 | |
437 |
|
438 |
|
439 |
|
440 |
|
441 | EventReplayer.prototype.replayEvent = function (appData, prebootEvent) {
|
442 | appData = (appData || {});
|
443 | prebootEvent = (prebootEvent || {});
|
444 | var event = prebootEvent.event;
|
445 | var serverNode = prebootEvent.node || {};
|
446 | var nodeKey = prebootEvent.nodeKey;
|
447 | var clientNode = this.findClientNode({
|
448 | root: appData.root,
|
449 | node: serverNode,
|
450 | nodeKey: nodeKey
|
451 | });
|
452 |
|
453 | if (!clientNode) {
|
454 | console.warn("Trying to dispatch event " + event.type + " to node " + nodeKey + "\n but could not find client node. Server node is: " + serverNode);
|
455 | return;
|
456 | }
|
457 |
|
458 | clientNode.checked = serverNode.checked;
|
459 | clientNode.selected = serverNode.selected;
|
460 | clientNode.value = serverNode.value;
|
461 | clientNode.dispatchEvent(event);
|
462 | };
|
463 | |
464 |
|
465 |
|
466 |
|
467 |
|
468 | EventReplayer.prototype.switchBuffer = function (appData) {
|
469 | appData = (appData || {});
|
470 | var root = (appData.root || {});
|
471 | var serverView = root.serverNode;
|
472 | var clientView = root.clientNode;
|
473 |
|
474 |
|
475 | if (!clientView || !serverView || serverView === clientView || serverView.nodeName === 'BODY') {
|
476 | return;
|
477 | }
|
478 |
|
479 | try {
|
480 |
|
481 | var gcs = this.getWindow().getComputedStyle;
|
482 | var display = gcs(serverView).getPropertyValue('display') || 'block';
|
483 |
|
484 | serverView.remove ? serverView.remove() : (serverView.style.display = 'none');
|
485 |
|
486 | clientView.style.display = display;
|
487 | }
|
488 | catch (ex) {
|
489 | console.error(ex);
|
490 | }
|
491 | };
|
492 | |
493 |
|
494 |
|
495 |
|
496 |
|
497 | EventReplayer.prototype.cleanup = function (prebootData) {
|
498 | var e_1, _a;
|
499 | var _this = this;
|
500 | prebootData = prebootData || {};
|
501 | var listeners = prebootData.listeners || [];
|
502 |
|
503 |
|
504 | var activeNode = prebootData.activeNode;
|
505 | if (activeNode != null) {
|
506 | setTimeout(function () { return _this.setFocus(activeNode); }, 1);
|
507 | }
|
508 | try {
|
509 |
|
510 | for (var listeners_1 = __values(listeners), listeners_1_1 = listeners_1.next(); !listeners_1_1.done; listeners_1_1 = listeners_1.next()) {
|
511 | var listener = listeners_1_1.value;
|
512 | listener.node.removeEventListener(listener.eventName, listener.handler);
|
513 | }
|
514 | }
|
515 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
516 | finally {
|
517 | try {
|
518 | if (listeners_1_1 && !listeners_1_1.done && (_a = listeners_1.return)) _a.call(listeners_1);
|
519 | }
|
520 | finally { if (e_1) throw e_1.error; }
|
521 | }
|
522 |
|
523 | var doc = this.getWindow().document;
|
524 | var prebootOverlay = doc.getElementById('prebootOverlay');
|
525 | if (prebootOverlay) {
|
526 | prebootOverlay.remove ?
|
527 | prebootOverlay.remove() : prebootOverlay.parentNode !== null ?
|
528 | prebootOverlay.parentNode.removeChild(prebootOverlay) :
|
529 | prebootOverlay.style.display = 'none';
|
530 | }
|
531 |
|
532 | prebootData.apps = [];
|
533 | this.clientNodeCache = {};
|
534 |
|
535 |
|
536 |
|
537 | if (typeof CustomEvent === 'function') {
|
538 | var completeEvent = new CustomEvent('PrebootComplete');
|
539 | doc.dispatchEvent(completeEvent);
|
540 | }
|
541 | else {
|
542 | console.warn("Could not dispatch PrebootComplete event.\n You can fix this by including a polyfill for CustomEvent.");
|
543 | }
|
544 | };
|
545 | EventReplayer.prototype.setFocus = function (activeNode) {
|
546 |
|
547 | if (!activeNode || !activeNode.node || !activeNode.nodeKey) {
|
548 | return;
|
549 | }
|
550 |
|
551 | var clientNode = this.findClientNode(activeNode);
|
552 | if (clientNode) {
|
553 |
|
554 | clientNode.focus();
|
555 |
|
556 | var selection = activeNode.selection;
|
557 | if (clientNode.setSelectionRange && selection) {
|
558 | try {
|
559 | clientNode
|
560 | .setSelectionRange(selection.start, selection.end, selection.direction);
|
561 | }
|
562 | catch (ex) { }
|
563 | }
|
564 | }
|
565 | };
|
566 | |
567 |
|
568 |
|
569 |
|
570 |
|
571 |
|
572 |
|
573 |
|
574 |
|
575 |
|
576 |
|
577 |
|
578 |
|
579 |
|
580 |
|
581 | EventReplayer.prototype.findClientNode = function (serverNodeContext) {
|
582 | serverNodeContext = (serverNodeContext || {});
|
583 | var serverNode = serverNodeContext.node;
|
584 | var root = serverNodeContext.root;
|
585 |
|
586 | if (!root || !root.serverNode || !root.clientNode) {
|
587 | return null;
|
588 | }
|
589 |
|
590 |
|
591 | var serverNodeKey = serverNodeContext.nodeKey || getNodeKeyForPreboot(serverNodeContext);
|
592 |
|
593 | if (this.clientNodeCache[serverNodeKey]) {
|
594 | return this.clientNodeCache[serverNodeKey];
|
595 | }
|
596 |
|
597 | var className = (serverNode.className || '').replace('ng-binding', '').trim();
|
598 | var selector = serverNode.tagName;
|
599 | if (serverNode.id) {
|
600 | selector += "#" + serverNode.id;
|
601 | }
|
602 | else if (className) {
|
603 | selector += "." + className.replace(/ /g, '.');
|
604 | }
|
605 |
|
606 |
|
607 | var rootClientNode = root.clientNode;
|
608 | var clientNodes = rootClientNode.querySelectorAll(selector);
|
609 |
|
610 | if (!clientNodes.length) {
|
611 | console.log("nothing found for " + selector + " so using " + serverNode.tagName);
|
612 | clientNodes = rootClientNode.querySelectorAll(serverNode.tagName);
|
613 | }
|
614 | var length = clientNodes.length;
|
615 | for (var i = 0; i < length; i++) {
|
616 | var clientNode = clientNodes.item(i);
|
617 |
|
618 | var clientNodeKey = getNodeKeyForPreboot({
|
619 | root: root,
|
620 | node: clientNode
|
621 | });
|
622 |
|
623 |
|
624 | if (clientNodeKey === serverNodeKey) {
|
625 | this.clientNodeCache[serverNodeKey] = clientNode;
|
626 | return clientNode;
|
627 | }
|
628 | }
|
629 |
|
630 | if (clientNodes.length === 1) {
|
631 | this.clientNodeCache[serverNodeKey] = clientNodes[0];
|
632 | return clientNodes[0];
|
633 | }
|
634 |
|
635 |
|
636 | console.warn("No matching client node found for " + serverNodeKey + ".\n You can fix this by assigning this element a unique id attribute.");
|
637 | return null;
|
638 | };
|
639 | return EventReplayer;
|
640 | }());
|
641 |
|
642 | |
643 |
|
644 |
|
645 |
|
646 |
|
647 |
|
648 | function initAll(opts, win) {
|
649 | var theWindow = (win || window);
|
650 |
|
651 |
|
652 |
|
653 |
|
654 | var data = (theWindow.prebootData = {
|
655 | opts: opts,
|
656 | apps: [],
|
657 | listeners: []
|
658 | });
|
659 | return function () { return start(data, theWindow); };
|
660 | }
|
661 | |
662 |
|
663 |
|
664 |
|
665 |
|
666 |
|
667 |
|
668 |
|
669 |
|
670 | function start(prebootData, win) {
|
671 | var theWindow = (win || window);
|
672 | var _document = (theWindow.document || {});
|
673 |
|
674 |
|
675 |
|
676 | var currentScript = _document.currentScript ||
|
677 |
|
678 |
|
679 |
|
680 |
|
681 | [].slice.call(_document.getElementsByTagName('script'), -1)[0];
|
682 | if (!currentScript) {
|
683 | console.error('Preboot initialization failed, no currentScript has been detected.');
|
684 | return;
|
685 | }
|
686 | var serverNode = currentScript.parentNode;
|
687 | if (!serverNode) {
|
688 | console.error('Preboot initialization failed, the script is detached');
|
689 | return;
|
690 | }
|
691 | serverNode.removeChild(currentScript);
|
692 | var opts = prebootData.opts || {};
|
693 | var eventSelectors = opts.eventSelectors || [];
|
694 |
|
695 | var appRoot = prebootData.opts ? getAppRoot(_document, prebootData.opts, serverNode) : null;
|
696 |
|
697 |
|
698 | var appData = { root: appRoot, events: [] };
|
699 | if (prebootData.apps) {
|
700 | prebootData.apps.push(appData);
|
701 | }
|
702 | eventSelectors = eventSelectors.map(function (eventSelector) {
|
703 | if (!eventSelector.hasOwnProperty('replay')) {
|
704 | eventSelector.replay = true;
|
705 | }
|
706 | return eventSelector;
|
707 | });
|
708 |
|
709 | eventSelectors.forEach(function (eventSelector) { return handleEvents(_document, prebootData, appData, eventSelector); });
|
710 | }
|
711 | |
712 |
|
713 |
|
714 |
|
715 |
|
716 |
|
717 |
|
718 | function createOverlay(_document) {
|
719 | var overlay = _document.createElement('div');
|
720 | overlay.setAttribute('id', 'prebootOverlay');
|
721 | overlay.setAttribute('style', 'display:none;position:absolute;left:0;' +
|
722 | 'top:0;width:100%;height:100%;z-index:999999;background:black;opacity:.3');
|
723 | _document.documentElement.appendChild(overlay);
|
724 | return overlay;
|
725 | }
|
726 | |
727 |
|
728 |
|
729 |
|
730 |
|
731 |
|
732 |
|
733 |
|
734 |
|
735 |
|
736 |
|
737 | function getAppRoot(_document, opts, serverNode) {
|
738 | var root = { serverNode: serverNode };
|
739 |
|
740 |
|
741 | root.clientNode = opts.buffer ? createBuffer(root) : root.serverNode;
|
742 |
|
743 | if (!opts.disableOverlay) {
|
744 | root.overlay = createOverlay(_document);
|
745 | }
|
746 | return root;
|
747 | }
|
748 | |
749 |
|
750 |
|
751 |
|
752 |
|
753 |
|
754 |
|
755 |
|
756 | function handleEvents(_document, prebootData, appData, eventSelector) {
|
757 | var serverRoot = appData.root.serverNode;
|
758 |
|
759 | if (!serverRoot) {
|
760 | return;
|
761 | }
|
762 |
|
763 |
|
764 |
|
765 | eventSelector.events.forEach(function (eventName) {
|
766 |
|
767 | var handler = createListenHandler(_document, prebootData, eventSelector, appData);
|
768 |
|
769 |
|
770 | serverRoot.addEventListener(eventName, handler, true);
|
771 |
|
772 |
|
773 | if (prebootData.listeners) {
|
774 | prebootData.listeners.push({
|
775 | node: serverRoot,
|
776 | eventName: eventName,
|
777 | handler: handler
|
778 | });
|
779 | }
|
780 | });
|
781 | }
|
782 | |
783 |
|
784 |
|
785 | function createListenHandler(_document, prebootData, eventSelector, appData) {
|
786 | var CARET_EVENTS = ['keyup', 'keydown', 'focusin', 'mouseup', 'mousedown'];
|
787 | var CARET_NODES = ['INPUT', 'TEXTAREA'];
|
788 |
|
789 |
|
790 | var matches = _document.documentElement.matches ||
|
791 | _document.documentElement.msMatchesSelector;
|
792 | var opts = prebootData.opts;
|
793 | return function (event) {
|
794 | var node = event.target;
|
795 |
|
796 |
|
797 | if (!matches.call(node, eventSelector.selector)) {
|
798 | return;
|
799 | }
|
800 | var root = appData.root;
|
801 | var eventName = event.type;
|
802 |
|
803 | if (!node || !eventName) {
|
804 | return;
|
805 | }
|
806 |
|
807 |
|
808 | var keyCodes = eventSelector.keyCodes;
|
809 | if (keyCodes && keyCodes.length) {
|
810 | var matchingKeyCodes = keyCodes.filter(function (keyCode) { return event.which === keyCode; });
|
811 |
|
812 |
|
813 | if (!matchingKeyCodes.length) {
|
814 | return;
|
815 | }
|
816 | }
|
817 |
|
818 | if (eventSelector.preventDefault) {
|
819 | event.preventDefault();
|
820 | }
|
821 |
|
822 | if (eventSelector.action) {
|
823 | eventSelector.action(node, event);
|
824 | }
|
825 |
|
826 | var nodeKey = getNodeKeyForPreboot({ root: root, node: node });
|
827 |
|
828 | if (CARET_EVENTS.indexOf(eventName) >= 0) {
|
829 |
|
830 | var isCaretNode = CARET_NODES.indexOf(node.tagName ? node.tagName : '') >= 0;
|
831 | prebootData.activeNode = {
|
832 | root: root,
|
833 | node: node,
|
834 | nodeKey: nodeKey,
|
835 | selection: isCaretNode ? getSelection(node) : undefined
|
836 | };
|
837 | }
|
838 | else if (eventName !== 'change' && eventName !== 'focusout') {
|
839 | prebootData.activeNode = undefined;
|
840 | }
|
841 |
|
842 | if (opts && !opts.disableOverlay && eventSelector.freeze) {
|
843 | var overlay_1 = root.overlay;
|
844 |
|
845 | overlay_1.style.display = 'block';
|
846 |
|
847 |
|
848 | setTimeout(function () {
|
849 | overlay_1.style.display = 'none';
|
850 | }, 10000);
|
851 | }
|
852 |
|
853 |
|
854 | if (eventSelector.replay) {
|
855 | appData.events.push({
|
856 | node: node,
|
857 | nodeKey: nodeKey,
|
858 | event: event,
|
859 | name: eventName
|
860 | });
|
861 | }
|
862 | };
|
863 | }
|
864 | |
865 |
|
866 |
|
867 |
|
868 | function getSelection(node) {
|
869 | node = node || {};
|
870 | var nodeValue = node.value || '';
|
871 | var selection = {
|
872 | start: nodeValue.length,
|
873 | end: nodeValue.length,
|
874 | direction: 'forward'
|
875 | };
|
876 |
|
877 | try {
|
878 | if (node.selectionStart || node.selectionStart === 0) {
|
879 | selection.start = node.selectionStart;
|
880 | selection.end = node.selectionEnd ? node.selectionEnd : 0;
|
881 | selection.direction = node.selectionDirection ?
|
882 | node.selectionDirection : 'none';
|
883 | }
|
884 | }
|
885 | catch (ex) { }
|
886 | return selection;
|
887 | }
|
888 | |
889 |
|
890 |
|
891 |
|
892 |
|
893 |
|
894 | function createBuffer(root) {
|
895 | var serverNode = root.serverNode;
|
896 |
|
897 |
|
898 | if (!serverNode || !serverNode.parentNode ||
|
899 | serverNode === document.documentElement || serverNode === document.body) {
|
900 | return serverNode;
|
901 | }
|
902 |
|
903 | var rootClientNode = serverNode.cloneNode(false);
|
904 |
|
905 |
|
906 | rootClientNode.style.display = 'none';
|
907 |
|
908 | serverNode.parentNode.insertBefore(rootClientNode, serverNode);
|
909 |
|
910 | serverNode.setAttribute('ng-non-bindable', '');
|
911 |
|
912 | return rootClientNode;
|
913 | }
|
914 |
|
915 | var eventRecorder = {
|
916 | start: start,
|
917 | createOverlay: createOverlay,
|
918 | getAppRoot: getAppRoot,
|
919 | handleEvents: handleEvents,
|
920 | createListenHandler: createListenHandler,
|
921 | getSelection: getSelection,
|
922 | createBuffer: createBuffer
|
923 | };
|
924 | var initFunctionName = 'prebootInitFn';
|
925 |
|
926 |
|
927 | var defaultOptions = {
|
928 | buffer: true,
|
929 | replay: true,
|
930 | disableOverlay: false,
|
931 |
|
932 |
|
933 | eventSelectors: [
|
934 |
|
935 | {
|
936 | selector: 'input,textarea',
|
937 | events: ['keypress', 'keyup', 'keydown', 'input', 'change']
|
938 | },
|
939 | { selector: 'select,option', events: ['change'] },
|
940 |
|
941 | {
|
942 | selector: 'input',
|
943 | events: ['keyup'],
|
944 | preventDefault: true,
|
945 | keyCodes: [13],
|
946 | freeze: true
|
947 | },
|
948 |
|
949 | {
|
950 | selector: 'form',
|
951 | events: ['submit'],
|
952 | preventDefault: true,
|
953 | freeze: true
|
954 | },
|
955 |
|
956 | {
|
957 | selector: 'input,textarea',
|
958 | events: ['focusin', 'focusout', 'mousedown', 'mouseup'],
|
959 | replay: false
|
960 | },
|
961 |
|
962 | {
|
963 | selector: 'button',
|
964 | events: ['click'],
|
965 | preventDefault: true,
|
966 | freeze: true
|
967 | }
|
968 | ]
|
969 | };
|
970 | |
971 |
|
972 |
|
973 |
|
974 | function getEventRecorderCode() {
|
975 | var eventRecorderFunctions = [];
|
976 | for (var funcName in eventRecorder) {
|
977 | if (eventRecorder.hasOwnProperty(funcName)) {
|
978 | var fn = eventRecorder[funcName].toString();
|
979 | var fnCleaned = fn.replace('common_1.', '');
|
980 | eventRecorderFunctions.push(fnCleaned);
|
981 | }
|
982 | }
|
983 |
|
984 | eventRecorderFunctions.push(getNodeKeyForPreboot.toString());
|
985 |
|
986 | return '\n\n' + eventRecorderFunctions.join('\n\n') + '\n\n';
|
987 | }
|
988 | |
989 |
|
990 |
|
991 |
|
992 |
|
993 |
|
994 |
|
995 |
|
996 |
|
997 |
|
998 | function getInlineDefinition(customOptions) {
|
999 | var opts = assign({}, defaultOptions, customOptions);
|
1000 |
|
1001 | validateOptions(opts);
|
1002 | var scriptCode = getEventRecorderCode();
|
1003 | var optsStr = stringifyWithFunctions(opts);
|
1004 |
|
1005 | var initAllStr = initAll.toString();
|
1006 | return "var " + initFunctionName + " = (function() {\n " + scriptCode + "\n return (" + initAllStr.replace('common_1.', '') + ")(" + optsStr + ");\n })();";
|
1007 | }
|
1008 | |
1009 |
|
1010 |
|
1011 |
|
1012 |
|
1013 |
|
1014 |
|
1015 |
|
1016 |
|
1017 |
|
1018 | function getInlineInvocation() {
|
1019 | return initFunctionName + "();";
|
1020 | }
|
1021 | |
1022 |
|
1023 |
|
1024 |
|
1025 | function validateOptions(opts) {
|
1026 | if (!opts.appRoot || !opts.appRoot.length) {
|
1027 | throw new Error('The appRoot is missing from preboot options. ' +
|
1028 | 'This is needed to find the root of your application. ' +
|
1029 | 'Set this value in the preboot options to be a selector for the root element of your app.');
|
1030 | }
|
1031 | }
|
1032 | |
1033 |
|
1034 |
|
1035 |
|
1036 |
|
1037 |
|
1038 |
|
1039 |
|
1040 |
|
1041 | function assign(target) {
|
1042 | var optionSets = [];
|
1043 | for (var _i = 1; _i < arguments.length; _i++) {
|
1044 | optionSets[_i - 1] = arguments[_i];
|
1045 | }
|
1046 | if (target === undefined || target === null) {
|
1047 | throw new TypeError('Cannot convert undefined or null to object');
|
1048 | }
|
1049 | var output = Object(target);
|
1050 | for (var index = 0; index < optionSets.length; index++) {
|
1051 | var source = optionSets[index];
|
1052 | if (source !== undefined && source !== null) {
|
1053 | for (var nextKey in source) {
|
1054 | if (source.hasOwnProperty && source.hasOwnProperty(nextKey)) {
|
1055 | output[nextKey] = source[nextKey];
|
1056 | }
|
1057 | }
|
1058 | }
|
1059 | }
|
1060 | return output;
|
1061 | }
|
1062 | |
1063 |
|
1064 |
|
1065 |
|
1066 |
|
1067 |
|
1068 |
|
1069 |
|
1070 |
|
1071 | function stringifyWithFunctions(obj) {
|
1072 | var FUNC_START = 'START_FUNCTION_HERE';
|
1073 | var FUNC_STOP = 'STOP_FUNCTION_HERE';
|
1074 |
|
1075 | var str = JSON.stringify(obj, function (_key, value) {
|
1076 |
|
1077 | if (!!(value && value.constructor && value.call && value.apply)) {
|
1078 | return FUNC_START + value.toString() + FUNC_STOP;
|
1079 | }
|
1080 | else {
|
1081 | return value;
|
1082 | }
|
1083 | });
|
1084 |
|
1085 | var startFuncIdx = str.indexOf(FUNC_START);
|
1086 | var stopFuncIdx;
|
1087 | var fn;
|
1088 | while (startFuncIdx >= 0) {
|
1089 | stopFuncIdx = str.indexOf(FUNC_STOP);
|
1090 |
|
1091 | fn = str.substring(startFuncIdx + FUNC_START.length, stopFuncIdx);
|
1092 | fn = fn.replace(/\\n/g, '\n');
|
1093 | str = str.substring(0, startFuncIdx - 1) + fn +
|
1094 | str.substring(stopFuncIdx + FUNC_STOP.length + 1);
|
1095 | startFuncIdx = str.indexOf(FUNC_START);
|
1096 | }
|
1097 | return str;
|
1098 | }
|
1099 |
|
1100 | |
1101 |
|
1102 |
|
1103 |
|
1104 |
|
1105 |
|
1106 |
|
1107 |
|
1108 | |
1109 |
|
1110 |
|
1111 |
|
1112 |
|
1113 |
|
1114 |
|
1115 | var PREBOOT_SCRIPT_CLASS = 'preboot-inline-script';
|
1116 | var PREBOOT_OPTIONS = new core.InjectionToken('PrebootOptions');
|
1117 | function createScriptFromCode(doc, nonce, inlineCode) {
|
1118 | var script = doc.createElement('script');
|
1119 | if (nonce) {
|
1120 | script.nonce = nonce;
|
1121 | }
|
1122 | script.className = PREBOOT_SCRIPT_CLASS;
|
1123 | script.textContent = inlineCode;
|
1124 | return script;
|
1125 | }
|
1126 | function PREBOOT_FACTORY(doc, prebootOpts, nonce, platformId, appRef, eventReplayer) {
|
1127 | return function () {
|
1128 | validateOptions(prebootOpts);
|
1129 | if (common.isPlatformServer(platformId)) {
|
1130 | var inlineCodeDefinition = getInlineDefinition(prebootOpts);
|
1131 | var scriptWithDefinition = createScriptFromCode(doc, nonce, inlineCodeDefinition);
|
1132 | var inlineCodeInvocation_1 = getInlineInvocation();
|
1133 | var existingScripts = doc.getElementsByClassName(PREBOOT_SCRIPT_CLASS);
|
1134 |
|
1135 |
|
1136 | if (existingScripts.length === 0) {
|
1137 | var baseList = [];
|
1138 | var appRootSelectors = baseList.concat(prebootOpts.appRoot);
|
1139 | doc.head.appendChild(scriptWithDefinition);
|
1140 | appRootSelectors
|
1141 | .map(function (selector) { return ({
|
1142 | selector: selector,
|
1143 | appRootElem: doc.querySelector(selector)
|
1144 | }); })
|
1145 | .forEach(function (_a) {
|
1146 | var selector = _a.selector, appRootElem = _a.appRootElem;
|
1147 | if (!appRootElem) {
|
1148 | console.log("No server node found for selector: " + selector);
|
1149 | return;
|
1150 | }
|
1151 | var scriptWithInvocation = createScriptFromCode(doc, nonce, inlineCodeInvocation_1);
|
1152 | appRootElem.insertBefore(scriptWithInvocation, appRootElem.firstChild);
|
1153 | });
|
1154 | }
|
1155 | else if (existingScripts.length > 0 && nonce) {
|
1156 | existingScripts[0].nonce = nonce;
|
1157 | }
|
1158 | }
|
1159 | if (common.isPlatformBrowser(platformId)) {
|
1160 | var replay = prebootOpts.replay != null ? prebootOpts.replay : true;
|
1161 | if (replay) {
|
1162 | appRef.isStable
|
1163 | .pipe(operators.filter(function (stable) { return stable; }), operators.take(1)).subscribe(function () {
|
1164 | eventReplayer.replayAll();
|
1165 | });
|
1166 | }
|
1167 | }
|
1168 | };
|
1169 | }
|
1170 | var PREBOOT_PROVIDER = {
|
1171 | provide: core.APP_BOOTSTRAP_LISTENER,
|
1172 | useFactory: PREBOOT_FACTORY,
|
1173 | deps: [
|
1174 | common.DOCUMENT,
|
1175 | PREBOOT_OPTIONS,
|
1176 | [new core.Optional(), new core.Inject(PREBOOT_NONCE)],
|
1177 | core.PLATFORM_ID,
|
1178 | core.ApplicationRef,
|
1179 | EventReplayer,
|
1180 | ],
|
1181 | multi: true
|
1182 | };
|
1183 |
|
1184 | |
1185 |
|
1186 |
|
1187 |
|
1188 |
|
1189 |
|
1190 |
|
1191 | var PrebootModule = (function () {
|
1192 | function PrebootModule() {
|
1193 | }
|
1194 | PrebootModule.withConfig = function (opts) {
|
1195 | return {
|
1196 | ngModule: PrebootModule,
|
1197 | providers: [{ provide: PREBOOT_OPTIONS, useValue: opts }]
|
1198 | };
|
1199 | };
|
1200 | return PrebootModule;
|
1201 | }());
|
1202 | PrebootModule.decorators = [
|
1203 | { type: core.NgModule, args: [{
|
1204 | providers: [EventReplayer, PREBOOT_PROVIDER]
|
1205 | },] }
|
1206 | ];
|
1207 |
|
1208 | |
1209 |
|
1210 |
|
1211 |
|
1212 |
|
1213 |
|
1214 |
|
1215 |
|
1216 | |
1217 |
|
1218 |
|
1219 |
|
1220 | exports.EventReplayer = EventReplayer;
|
1221 | exports.PREBOOT_NONCE = PREBOOT_NONCE;
|
1222 | exports.PrebootModule = PrebootModule;
|
1223 | exports._window = _window;
|
1224 | exports.assign = assign;
|
1225 | exports.createBuffer = createBuffer;
|
1226 | exports.createListenHandler = createListenHandler;
|
1227 | exports.createOverlay = createOverlay;
|
1228 | exports.defaultOptions = defaultOptions;
|
1229 | exports.getAppRoot = getAppRoot;
|
1230 | exports.getEventRecorderCode = getEventRecorderCode;
|
1231 | exports.getInlineDefinition = getInlineDefinition;
|
1232 | exports.getInlineInvocation = getInlineInvocation;
|
1233 | exports.getNodeKeyForPreboot = getNodeKeyForPreboot;
|
1234 | exports.getSelection = getSelection;
|
1235 | exports.handleEvents = handleEvents;
|
1236 | exports.initAll = initAll;
|
1237 | exports.initFunctionName = initFunctionName;
|
1238 | exports.start = start;
|
1239 | exports.stringifyWithFunctions = stringifyWithFunctions;
|
1240 | exports.validateOptions = validateOptions;
|
1241 | exports.ɵa = PREBOOT_OPTIONS;
|
1242 | exports.ɵb = PREBOOT_FACTORY;
|
1243 | exports.ɵc = PREBOOT_PROVIDER;
|
1244 |
|
1245 | Object.defineProperty(exports, '__esModule', { value: true });
|
1246 |
|
1247 | })));
|
1248 |
|