@trullock/page-manager 0.6.2 → 0.6.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trullock/page-manager",
3
- "version": "0.6.2",
3
+ "version": "0.6.7",
4
4
  "description": "Single page app manager",
5
5
  "exports": {
6
6
  ".": "./src/index.js",
@@ -17,7 +17,6 @@
17
17
  "access": "public"
18
18
  },
19
19
  "dependencies": {
20
- "@trullock/dollar": "^0.1.6",
21
20
  "@trullock/router": "^0.2.5"
22
21
  },
23
22
  "devDependencies": {
package/src/index.js CHANGED
@@ -14,7 +14,7 @@ var lastNavigationDirection = null;
14
14
  var goal = null;
15
15
  var backData = {};
16
16
  var options = {
17
- fetchPath: route => '/pages/' + route.routeName + '.html',
17
+ fetchPath: route => '/pages/' + (route.pageClass.constructor.htmlName || route.routeName) + '.html',
18
18
  fetchPageTemplate: route => {
19
19
  return fetch(options.fetchPath(route))
20
20
  .then(r => r.text())
@@ -40,14 +40,29 @@ var options = {
40
40
 
41
41
  export const pages = pageHash;
42
42
 
43
- export function registerPage(namedRoutes, pageClass) {
43
+ export function registerPage(argA, argB, argC) {
44
+
45
+ let namedRoutes = null,
46
+ pageClass = null;
47
+
48
+ if(argC == undefined)
49
+ {
50
+ namedRoutes = argA;
51
+ pageClass = argB;
52
+ } else {
53
+ namedRoutes = {
54
+ [argA]: argB
55
+ };
56
+ pageClass = argC;
57
+ }
58
+
44
59
 
45
60
  for (const [name, route] of Object.entries(namedRoutes)) {
46
61
  router.addRoute(name, route, pageClass);
47
62
 
48
63
  pageHash[name] = {
49
- url: route,
50
- pageClass: pageClass
64
+ url: route,
65
+ pageClass: pageClass
51
66
  }
52
67
  }
53
68
 
@@ -271,9 +286,17 @@ export function init(opts) {
271
286
  continue;
272
287
  }
273
288
 
274
- pageCache[pageHash[key].url] = {
275
- $html: $html,
276
- page: new (pageHash[key].pageClass)($html)
289
+ // if the route is parameterised
290
+ if(router.routesByName[key]._paramsIds.length > 1)
291
+ {
292
+ pageTemplateCache[router.routesByName[key]._pattern] = $html;
293
+ }
294
+ else
295
+ {
296
+ pageCache[pageHash[key].url] = {
297
+ $html: $html,
298
+ page: new (pageHash[key].pageClass)($html)
299
+ }
277
300
  }
278
301
  }
279
302
  }
@@ -425,10 +448,6 @@ export function navigate(url, data, checkBeforeUnload) {
425
448
  doNavigate(url, data);
426
449
  }
427
450
 
428
- export function update(opts) {
429
- state[statePointer].data = opts.data;
430
- }
431
-
432
451
  export function replace(url, data) {
433
452
  return showPage(url, data, { action: 'replace', distance: 0 });
434
453
  }
@@ -503,7 +503,8 @@ __webpack_require__.r(__webpack_exports__);
503
503
  /* harmony export */ "show": () => (/* binding */ show),
504
504
  /* harmony export */ "back": () => (/* binding */ back),
505
505
  /* harmony export */ "printStack": () => (/* binding */ printStack),
506
- /* harmony export */ "removeHistory": () => (/* binding */ removeHistory)
506
+ /* harmony export */ "removeHistory": () => (/* binding */ removeHistory),
507
+ /* harmony export */ "purgeCache": () => (/* binding */ purgeCache)
507
508
  /* harmony export */ });
508
509
  /* harmony import */ var _trullock_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @trullock/router */ "../node_modules/@trullock/router/src/index.js");
509
510
  /* harmony import */ var _pageshowerror_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pageshowerror.js */ "../src/pageshowerror.js");
@@ -514,7 +515,7 @@ var pageHash = {},
514
515
  pageTemplateCache = {},
515
516
  stack = [],
516
517
  stackPointer = -1;
517
- var _manuallyAdjustingHistory2 = false;
518
+ var _manuallyAdjustingHistory = false;
518
519
  var handlingBeforeUnload = false;
519
520
  var lastNavigationDirection = null;
520
521
  var goal = null;
@@ -536,6 +537,9 @@ var options = {
536
537
  return $template;
537
538
  });
538
539
  },
540
+ pageInterrupt: function pageInterrupt(route) {
541
+ return null;
542
+ },
539
543
  pageContainer: function pageContainer() {
540
544
  return document.body;
541
545
  },
@@ -611,14 +615,15 @@ function showPage(url, data, event) {
611
615
  routeName: route.routeName,
612
616
  params: route.params
613
617
  };
614
- data.event = event; // TODO: abstract
618
+ data.event = event;
619
+ var interrupt = options.pageInterrupt(route);
615
620
 
616
- if (route.pageClass.requireAuth && !firebase.auth().currentUser) {
621
+ if (interrupt) {
617
622
  goal = {
618
623
  url: url,
619
624
  data: data
620
625
  };
621
- return showPage(getPath('sign-in'), null, event);
626
+ return showPage(interrupt.url, null, event);
622
627
  }
623
628
 
624
629
  var getPage = showLoading().then(function () {
@@ -626,14 +631,22 @@ function showPage(url, data, event) {
626
631
  return loadPage(route, data);
627
632
  }); // handle initial page
628
633
 
629
- if (stackPointer == -1) {
634
+ if (event.action == 'load') {
630
635
  return getPage.then(function (page) {
631
- stack.push({
632
- uid: 0,
633
- data: data,
634
- page: page
635
- });
636
- stackPointer = 0;
636
+ // clean initial load
637
+ if (stackPointer == -1) {
638
+ stack.push({
639
+ uid: 0,
640
+ data: data,
641
+ page: page
642
+ });
643
+ stackPointer = 0;
644
+ } // page refresh
645
+ else {
646
+ stack[stackPointer].page = page;
647
+ stack[stackPointer].data = data;
648
+ }
649
+
637
650
  return page;
638
651
  }).then(function (page) {
639
652
  return doShow(page, data);
@@ -655,14 +668,14 @@ function showPage(url, data, event) {
655
668
  }).then(function (page) {
656
669
  handleHistoryAction(event, url, data, page);
657
670
  return doShow(page, data);
658
- }).catch(function (e) {
659
- // TODO: what case is this?
660
- _manuallyAdjustingHistory2 = function manuallyAdjustingHistory() {
661
- return _manuallyAdjustingHistory2 = false;
662
- };
663
-
664
- if (event.action == 'back') history.go(1);else if (event.action == 'fwd') history.go(-1);
665
- });
671
+ }); // .catch(e => {
672
+ // // TODO: what case is this?
673
+ // manuallyAdjustingHistory = () => manuallyAdjustingHistory = false;
674
+ // if (event.action == 'back')
675
+ // history.go(1);
676
+ // else if (event.action == 'fwd')
677
+ // history.go(-1);
678
+ // });
666
679
  }
667
680
 
668
681
  function doShow(page, data) {
@@ -674,6 +687,9 @@ function doShow(page, data) {
674
687
  }) // todo: hide() should be passed an event object
675
688
  .then(function () {
676
689
  return pageCache[pageHash[options.loadingPageName].url].page.hide();
690
+ }) // return page
691
+ .then(function () {
692
+ return page;
677
693
  });
678
694
  }
679
695
 
@@ -725,8 +741,31 @@ function doNavigate(url, data) {
725
741
  });
726
742
  }
727
743
 
744
+ function storageAvailable() {
745
+ try {
746
+ var x = '__storage_test__';
747
+ window.sessionStorage.setItem(x, x);
748
+ window.sessionStorage.removeItem(x);
749
+ return true;
750
+ } catch (e) {
751
+ return false;
752
+ }
753
+ }
754
+
728
755
  function init(opts) {
729
- Object.assign(options, opts); // handle pages whose markup is already loaded in the page
756
+ Object.assign(options, opts);
757
+
758
+ if (storageAvailable()) {
759
+ var storedStack = window.sessionStorage.getItem("stack");
760
+
761
+ if (storedStack) {
762
+ storedStack = JSON.parse(storedStack);
763
+ stack = storedStack.stack;
764
+ stackPointer = storedStack.stackPointer;
765
+ window.sessionStorage.removeItem("stack");
766
+ }
767
+ } // handle pages whose markup is already loaded in the page
768
+
730
769
 
731
770
  for (var key in pageHash) {
732
771
  if (pageHash[key].pageClass.existingDomSelector) {
@@ -756,8 +795,8 @@ function init(opts) {
756
795
  });
757
796
 
758
797
  function handlePopstate(context, direction, distance) {
759
- if (_manuallyAdjustingHistory2) {
760
- _manuallyAdjustingHistory2(context, {
798
+ if (_manuallyAdjustingHistory) {
799
+ _manuallyAdjustingHistory(context, {
761
800
  action: direction,
762
801
  distance: distance
763
802
  });
@@ -775,6 +814,9 @@ function init(opts) {
775
814
  if (e instanceof _pageshowerror_js__WEBPACK_IMPORTED_MODULE_1__.default) return showPage(e.url, e.data, {
776
815
  action: e.action || 'show'
777
816
  });
817
+ }).then(function (page) {
818
+ // set page as it can be missing in the case of refreshes
819
+ context.page = page;
778
820
  });
779
821
  }
780
822
 
@@ -835,6 +877,22 @@ function init(opts) {
835
877
  var context = findContext(newUid);
836
878
  handlePopstate(context, lastNavigationDirection, distance);
837
879
  });
880
+
881
+ if (storageAvailable()) {
882
+ window.addEventListener("beforeunload", function () {
883
+ var stackToSerialize = stack.map(function (s) {
884
+ return {
885
+ uid: s.uid,
886
+ data: s.data
887
+ };
888
+ });
889
+ var stackToStore = {
890
+ stack: stackToSerialize,
891
+ stackPointer: stackPointer
892
+ };
893
+ window.sessionStorage.setItem('stack', JSON.stringify(stackToStore));
894
+ });
895
+ }
838
896
  }
839
897
 
840
898
  function findContext(uid) {
@@ -900,7 +958,7 @@ function removeHistory(predicate) {
900
958
  var backsToDo = stackPointer - 1;
901
959
  var currentUid = -1; // TODO: handle stack pointer not being at the tail when this process starts
902
960
 
903
- _manuallyAdjustingHistory2 = function _manuallyAdjustingHistory(_) {
961
+ _manuallyAdjustingHistory = function manuallyAdjustingHistory(_) {
904
962
  // rewind to the first history position
905
963
  if (backsToDo > 0) {
906
964
  window.setTimeout(function () {
@@ -927,12 +985,22 @@ function removeHistory(predicate) {
927
985
  }
928
986
 
929
987
  stackPointer = stack.length - 1;
930
- _manuallyAdjustingHistory2 = false;
988
+ _manuallyAdjustingHistory = false;
931
989
  };
932
990
 
933
991
  history.back();
934
992
  });
935
993
  }
994
+ function purgeCache() {
995
+ for (var path in pageCache) {
996
+ pageCache[path].page.destroy && pageCache[path].page.destroy();
997
+
998
+ if (!pageCache[path].page.constructor.existingDomSelector) {
999
+ pageCache[path].$html.remove();
1000
+ delete pageCache[path];
1001
+ }
1002
+ }
1003
+ }
936
1004
 
937
1005
  /***/ }),
938
1006
 
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///../node_modules/@trullock/router/src/index.js","webpack:///../node_modules/@trullock/router/src/pattern-lexer.js","webpack:///../src/index.js","webpack:///../src/pageshowerror.js","webpack:///./page-loading.js","webpack:///./page-page1.js","webpack:///./page-page2.js","webpack:///./page-page3.js","webpack:///./page-page4.js","webpack:///./page.js","webpack:///./page1.htm","webpack:///./page2.htm","webpack:///./page3.htm","webpack:///./page4.htm","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///./lolpack.js"],"names":["pageHash","pageCache","pageTemplateCache","stack","stackPointer","manuallyAdjustingHistory","handlingBeforeUnload","lastNavigationDirection","goal","backData","options","fetchPath","route","routeName","fetchPageTemplate","fetch","then","r","text","html","$div","document","createElement","innerHTML","firstElementChild","$template","pattern","pageContainer","body","prepareMarkup","$html","loadingPageName","error404PageName","defaultPageName","beforeUnload","pages","registerPage","name","pageClass","router","url","getPath","values","hash","showLoading","page","data","scrollY","window","event","action","show","loadPage","fetchPage","Promise","resolve","cloneNode","appendChild","path","boot","showPage","console","error","reject","PageShowError","key","params","requireAuth","firebase","auth","currentUser","getPage","push","uid","doShow","currentState","handleHistoryAction","all","hide","results","catch","e","history","go","scroll","title","newUid","pushState","splice","length","currentUid","replaceState","pop","distance","doNavigate","fallback","init","opts","Object","assign","existingDomSelector","querySelector","location","pathname","search","handlePopstate","context","direction","handleBeforeUnloadPart1","interrupt","setTimeout","back","forward","handleBeforeUnloadPart2","result","addEventListener","interrupted","state","previousUid","Math","abs","findContext","i","navigate","checkBeforeUnload","update","statePointer","replace","printStack","log","removeHistory","predicate","statesToKeep","backsToDo","_","k","message","Error","captureStackTrace","$page","Page","pageManager","type","dataset","style","display","ctrlKey","metaKey","$a","target","matches","closest","href","preventDefault"],"mappings":";;;;;;;;;;;;;;;AAA6C;;AAE7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;;AAEA,iBAAiB;AACjB,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc,eAAe,6BAA6B;AAC1G;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;;;AAGA,iEAAe;AACf;AACA;AACA;AACA,sBAAsB,0DAAY;AAClC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,G;AACA,O;AACA,GAAG;AACH;;AAEA;AACA,qCAAqC,qBAAqB;;AAE1D;AACA;;AAEA;AACA;AACA,gDAAgD,KAAK;;AAErD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kB;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,CAAC,EAAE,E;;;;;;;;;;;;;;AC3NH,6BAAe,sCAAY;;AAE3B;AACA;AACA,2CAA2C;;AAE3C;AACA;AACA;;AAEA,kCAAkC,EAAE;AACpC,wBAAwB,OAAO,SAAS;;AAExC;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB,SAAS,UAAU;AACnE,cAAc,sBAAsB;AACpC,eAAe,IAAI;AACnB;AACA,IAAI;AACJ;AACA;AACA,sCAAsC,SAAS;AAC/C,cAAc,QAAQ;AACtB,eAAe,IAAI;AACnB;AACA,IAAI;AACJ;AACA,sDAAsD,GAAG;AACzD,YAAY,MAAM,KAAK;AACvB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,2CAA2C,GAAG;AAC9C,YAAY,IAAI,OAAO;AACvB;AACA,IAAI;AACJ;AACA;AACA,6CAA6C,EAAE;AAC/C,YAAY,IAAI,KAAK;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,IAAI;AACzD;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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","file":"main.js","sourcesContent":["import PatternLexer from './pattern-lexer.js'\r\n\r\nfunction isKind(val, kind) {\r\n\treturn '[object ' + kind + ']' === Object.prototype.toString.call(val);\r\n}\r\nfunction isRegExp(val) {\r\n\treturn isKind(val, 'RegExp');\r\n}\r\n\r\nfunction decodeQueryString(queryStr, shouldTypecast) {\r\n\tvar queryArr = (queryStr || '').replace('?', '').split('&'),\r\n\t\treg = /([^=]+)=(.+)/,\r\n\t\ti = -1,\r\n\t\tobj = {},\r\n\t\tequalIndex, cur, pValue, pName;\r\n\r\n\twhile ((cur = queryArr[++i])) {\r\n\t\tequalIndex = cur.indexOf('=');\r\n\t\tpName = cur.substring(0, equalIndex);\r\n\t\tpValue = decodeURIComponent(cur.substring(equalIndex + 1));\r\n\r\n\t\tif (pName in obj){\r\n\t\t\tif(isArray(obj[pName])){\r\n\t\t\t\tobj[pName].push(pValue);\r\n\t\t\t} else {\r\n\t\t\t\tobj[pName] = [obj[pName], pValue];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tobj[pName] = pValue;\r\n\t }\r\n\t}\r\n\treturn obj;\r\n}\r\n\r\nfunction Route(name, pattern, pageClass, priority, router) {\r\n\tvar isRegexPattern = isRegExp(pattern);\r\n\tthis._name = name;\r\n\tthis._router = router;\r\n\tthis._pattern = pattern;\r\n\tthis._paramsIds = isRegexPattern ? null : router.patternLexer.getParamIds(pattern);\r\n\tthis._optionalParamsIds = isRegexPattern ? null : router.patternLexer.getOptionalParamsIds(pattern);\r\n\tthis._matchRegexp = isRegexPattern ? pattern : router.patternLexer.compilePattern(pattern, router.ignoreCase);\r\n\tthis._pageClass = pageClass;\r\n\tthis._priority = priority || 0;\r\n}\r\n\r\nRoute.prototype = {\r\n\r\n\tmatch: function (request) {\r\n\t\treturn this._matchRegexp.test(request);\r\n\t},\r\n\r\n\t_isValidParam: function (request, prop, values) {\r\n\t\tvar validationRule = this.rules[prop],\r\n\t\t\tval = values[prop],\r\n\t\t\tisValid = false,\r\n\t\t\tisQuery = (prop.indexOf('?') === 0);\r\n\r\n\t\tif (val == null && this._optionalParamsIds && arrayIndexOf(this._optionalParamsIds, prop) !== -1) {\r\n\t\t\tisValid = true;\r\n\t\t}\r\n\t\telse if (isRegExp(validationRule)) {\r\n\t\t\tif (isQuery)\r\n\t\t\t\tval = values[prop + '_']; //use raw string\r\n\r\n\t\t\tisValid = validationRule.test(val);\r\n\t\t}\r\n\t\telse if (isArray(validationRule)) {\r\n\t\t\tif (isQuery)\r\n\t\t\t\tval = values[prop + '_']; //use raw string\r\n\r\n\t\t\tisValid = this._isValidArrayRule(validationRule, val);\r\n\t\t}\r\n\t\telse if (isFunction(validationRule)) {\r\n\t\t\tisValid = validationRule(val, request, values);\r\n\t\t}\r\n\r\n\t\treturn isValid; //fail silently if validationRule is from an unsupported type\r\n\t},\r\n\r\n\t_isValidArrayRule: function (arr, val) {\r\n\t\tif (!this._router.ignoreCase) {\r\n\t\t\treturn arrayIndexOf(arr, val) !== -1;\r\n\t\t}\r\n\r\n\t\tif (typeof val === 'string') {\r\n\t\t\tval = val.toLowerCase();\r\n\t\t}\r\n\r\n\t\tvar n = arr.length,\r\n\t\t\titem,\r\n\t\t\tcompareVal;\r\n\r\n\t\twhile (n--) {\r\n\t\t\titem = arr[n];\r\n\t\t\tcompareVal = (typeof item === 'string') ? item.toLowerCase() : item;\r\n\t\t\tif (compareVal === val) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_getParamsObject: function (request) {\r\n\t\tvar shouldTypecast = this._router.shouldTypecast,\r\n\t\t\tvalues = this._router.patternLexer.getParamValues(request, this._matchRegexp, shouldTypecast),\r\n\t\t\to = {},\r\n\t\t\tn = values.length,\r\n\t\t\tparam, val;\r\n\t\twhile (n--) {\r\n\t\t\tval = values[n];\r\n\t\t\tif (this._paramsIds) {\r\n\t\t\t\tparam = this._paramsIds[n];\r\n\t\t\t\tif (param.indexOf('?') === 0 && val) {\r\n\t\t\t\t\tval = decodeQueryString(val, shouldTypecast);\r\n\t\t\t\t\t\r\n\t\t\t\t\tfor(var key in val){\r\n\t\t\t\t\t\tif(!o[key])\r\n\t\t\t\t\t\t\to[key] = val[key];\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\to['?' + key] = val[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t\to[n] = val;\r\n\t\t\t\t} \r\n\t\t\t\telse \r\n\t\t\t\t\to[param] = val;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn o;\r\n\t},\r\n\r\n\tinterpolate: function (replacements) {\r\n\t\ttry {\r\n\t\t\tvar str = this._router.patternLexer.interpolate(this._pattern, replacements);\r\n\t\t\treturn str;\r\n\t\t}\r\n\t\tcatch(e) {\r\n\t\t\tthrow new Error(`Error interpolating route ${this._pattern} with values ${JSON.stringify(replacements)}\\n` + e);\r\n\t\t}\r\n\t},\r\n\r\n\ttoString: function () {\r\n\t\treturn '[Route pattern:\"' + this._pattern + '\", numListeners:' + this.matched.getNumListeners() + ']';\r\n\t}\r\n\r\n};\r\n\r\n\r\nexport default new class {\r\n\tconstructor() {\r\n\t\tthis.routes = [];\r\n\t\tthis.routesByName = {};\r\n\t\tthis.patternLexer = PatternLexer();\r\n\t}\r\n\r\n\taddRoute (name, pattern, pageClass, priority) {\r\n\t\tpattern += pattern.endsWith('/') ? ':?query:' : '/:?query:';\r\n\t\tvar route = new Route(name, pattern, pageClass, priority, this);\r\n\r\n\t\tvar n = this.routes.length;\r\n\t\tdo\r\n\t\t{ \r\n\t\t\t--n; \r\n\t\t} while (this.routes[n] && route._priority <= this.routes[n]._priority);\r\n\t\tthis.routes.splice(n + 1, 0, route);\r\n\r\n\t\tthis.routesByName[name] = route;\r\n\t\tObject.defineProperty(this, name, { get: () => pattern });\r\n\r\n\t\treturn route;\r\n\t}\r\n\r\n\tinterpolate(name, data){\r\n\t\tif(!this.routesByName[name])\r\n\t\t\tthrow new Error(`Cannot find route by name ${name}`);\r\n\t\t\t\r\n\t\treturn this.routesByName[name].interpolate(data);\r\n\t}\r\n\r\n\tparse (request) {\r\n\t\tvar n = this.routes.length;\r\n\t\tvar route, hash, path;\r\n\r\n\t\tvar index = request.indexOf('#');\r\n\t\tif(index > -1)\r\n\t\t{\r\n\t\t\thash = request.substr(index + 1);\r\n\t\t\trequest = request.substr(0, index);\r\n\t\t}\r\n\r\n\t\tindex = request.indexOf('?');\r\n\t\tif(index > -1)\r\n\t\t\tpath = request.substr(0, index)\r\n\t\telse\r\n\t\t\tpath = request;\t\r\n\t\t\r\n\r\n\t\twhile (route = this.routes[--n]) {\r\n\t\t\tif (route.match(request)) {\r\n\t\t\t\tvar params = route._getParamsObject(request);\r\n\t\t\t\tparams.hash = hash;\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tpath: path.toLowerCase(),\r\n\t\t\t\t\trouteName: route._name,\r\n\t\t\t\t\tpattern: route._pattern,\r\n\t\t\t\t\tpageClass: route._pageClass,\r\n\t\t\t\t\tparams: params\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\ttoString () {\r\n\t\treturn '[Router numRoutes:' + this.getNumRoutes() + ']';\r\n\t}\r\n}();","export default function () {\r\n\r\n\tvar\r\n\t\t//match chars that should be escaped on string regexp\r\n\t\tESCAPE_CHARS_REGEXP = /[\\\\.+*?\\^$\\[\\](){}\\/'#]/g,\r\n\r\n\t\t//trailing slashes (begin/end of string)\r\n\t\tLOOSE_SLASHES_REGEXP = /^\\/|\\/$/g,\r\n\t\tLEGACY_SLASHES_REGEXP = /\\/$/g,\r\n\r\n\t\t//params - everything between `{ }` or `: :`\r\n\t\tPARAMS_REGEXP = /(?:\\{|:)([^}:]+)(?:\\}|:)/g,\r\n\r\n\t\t//used to save params during compile (avoid escaping things that\r\n\t\t//shouldn't be escaped).\r\n\t\tTOKENS = {\r\n\t\t\t'OS': {\r\n\t\t\t\t//optional slashes\r\n\t\t\t\t//slash between `::` or `}:` or `\\w:` or `:{?` or `}{?` or `\\w{?`\r\n\t\t\t\trgx: /([:}]|\\w(?=\\/))\\/?(:|(?:\\{\\?))/g,\r\n\t\t\t\tsave: '$1{{id}}$2',\r\n\t\t\t\tres: '\\\\/?'\r\n\t\t\t},\r\n\t\t\t'RS': {\r\n\t\t\t\t//required slashes\r\n\t\t\t\t//used to insert slash between `:{` and `}{`\r\n\t\t\t\trgx: /([:}])\\/?(\\{)/g,\r\n\t\t\t\tsave: '$1{{id}}$2',\r\n\t\t\t\tres: '\\\\/'\r\n\t\t\t},\r\n\t\t\t'RQ': {\r\n\t\t\t\t//required query string - everything in between `{? }`\r\n\t\t\t\trgx: /\\{\\?([^}]+)\\}/g,\r\n\t\t\t\t//everything from `?` till `#` or end of string\r\n\t\t\t\tres: '\\\\?([^#]+)'\r\n\t\t\t},\r\n\t\t\t'OQ': {\r\n\t\t\t\t//optional query string - everything in between `:? :`\r\n\t\t\t\trgx: /:\\?([^:]+):/g,\r\n\t\t\t\t//everything from `?` till `#` or end of string\r\n\t\t\t\tres: '(?:\\\\?([^#]*))?'\r\n\t\t\t},\r\n\t\t\t'OR': {\r\n\t\t\t\t//optional rest - everything in between `: *:`\r\n\t\t\t\trgx: /:([^:]+)\\*:/g,\r\n\t\t\t\tres: '(.*)?' // optional group to avoid passing empty string as captured\r\n\t\t\t},\r\n\t\t\t'RR': {\r\n\t\t\t\t//rest param - everything in between `{ *}`\r\n\t\t\t\trgx: /\\{([^}]+)\\*\\}/g,\r\n\t\t\t\tres: '(.+)'\r\n\t\t\t},\r\n\t\t\t// required/optional params should come after rest segments\r\n\t\t\t'RP': {\r\n\t\t\t\t//required params - everything between `{ }`\r\n\t\t\t\trgx: /\\{([^}]+)\\}/g,\r\n\t\t\t\tres: '([^\\\\/?]+)'\r\n\t\t\t},\r\n\t\t\t'OP': {\r\n\t\t\t\t//optional params - everything between `: :`\r\n\t\t\t\trgx: /:([^:]+):/g,\r\n\t\t\t\tres: '([^\\\\/?]+)?\\/?'\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tLOOSE_SLASH = 1,\r\n\t\tSTRICT_SLASH = 2,\r\n\t\tLEGACY_SLASH = 3,\r\n\r\n\t\t_slashMode = LOOSE_SLASH;\r\n\r\n\r\n\tfunction precompileTokens() {\r\n\t\tvar key, cur;\r\n\t\tfor (key in TOKENS) {\r\n\t\t\tif (TOKENS.hasOwnProperty(key)) {\r\n\t\t\t\tcur = TOKENS[key];\r\n\t\t\t\tcur.id = '__CR_' + key + '__';\r\n\t\t\t\tcur.save = ('save' in cur) ? cur.save.replace('{{id}}', cur.id) : cur.id;\r\n\t\t\t\tcur.rRestore = new RegExp(cur.id, 'g');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tprecompileTokens();\r\n\r\n\r\n\tfunction captureVals(regex, pattern) {\r\n\t\tvar vals = [], match;\r\n\t\t// very important to reset lastIndex since RegExp can have \"g\" flag\r\n\t\t// and multiple runs might affect the result, specially if matching\r\n\t\t// same string multiple times on IE 7-8\r\n\t\tregex.lastIndex = 0;\r\n\t\twhile (match = regex.exec(pattern)) {\r\n\t\t\tvals.push(match[1]);\r\n\t\t}\r\n\t\treturn vals;\r\n\t}\r\n\r\n\tfunction getParamIds(pattern) {\r\n\t\treturn captureVals(PARAMS_REGEXP, pattern);\r\n\t}\r\n\r\n\tfunction getOptionalParamsIds(pattern) {\r\n\t\treturn captureVals(TOKENS.OP.rgx, pattern);\r\n\t}\r\n\r\n\tfunction compilePattern(pattern, ignoreCase) {\r\n\t\tpattern = pattern || '';\r\n\r\n\t\tif (pattern) {\r\n\t\t\tif (_slashMode === LOOSE_SLASH) {\r\n\t\t\t\tpattern = pattern.replace(LOOSE_SLASHES_REGEXP, '');\r\n\t\t\t}\r\n\t\t\telse if (_slashMode === LEGACY_SLASH) {\r\n\t\t\t\tpattern = pattern.replace(LEGACY_SLASHES_REGEXP, '');\r\n\t\t\t}\r\n\r\n\t\t\t//save tokens\r\n\t\t\tpattern = replaceTokens(pattern, 'rgx', 'save');\r\n\t\t\t//regexp escape\r\n\t\t\tpattern = pattern.replace(ESCAPE_CHARS_REGEXP, '\\\\$&');\r\n\t\t\t//restore tokens\r\n\t\t\tpattern = replaceTokens(pattern, 'rRestore', 'res');\r\n\r\n\t\t\tif (_slashMode === LOOSE_SLASH) {\r\n\t\t\t\tpattern = '\\\\/?' + pattern;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (_slashMode !== STRICT_SLASH) {\r\n\t\t\t//single slash is treated as empty and end slash is optional\r\n\t\t\tpattern += '\\\\/?';\r\n\t\t}\r\n\t\treturn new RegExp('^' + pattern + '$', ignoreCase ? 'i' : '');\r\n\t}\r\n\r\n\tfunction replaceTokens(pattern, regexpName, replaceName) {\r\n\t\tvar cur, key;\r\n\t\tfor (key in TOKENS) {\r\n\t\t\tif (TOKENS.hasOwnProperty(key)) {\r\n\t\t\t\tcur = TOKENS[key];\r\n\t\t\t\tpattern = pattern.replace(cur[regexpName], cur[replaceName]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn pattern;\r\n\t}\r\n\r\n\tfunction getParamValues(request, regexp, shouldTypecast) {\r\n\t\tvar vals = regexp.exec(request);\r\n\t\tif (vals) {\r\n\t\t\tvals.shift();\r\n\t\t\tif (shouldTypecast) {\r\n\t\t\t\tvals = typecastArrayValues(vals);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn vals;\r\n\t}\r\n\r\n\tfunction interpolate(pattern, replacements) {\r\n\t\t// default to an empty object because pattern might have just\r\n\t\t// optional arguments\r\n\t\treplacements = replacements || {};\r\n\t\tif (typeof pattern !== 'string') {\r\n\t\t\tthrow new Error('Route pattern should be a string.');\r\n\t\t}\r\n\t\t\r\n\t\tvar replaceFn = function (match, prop) {\r\n\t\t\tvar val;\r\n\t\t\tprop = (prop.substr(0, 1) === '?') ? prop.substr(1) : prop;\r\n\t\t\tif (replacements[prop] != null) {\r\n\t\t\t\tif (typeof replacements[prop] === 'object') {\r\n\t\t\t\t\tvar queryParts = [], rep;\r\n\t\t\t\t\tfor (var key in replacements[prop]) {\r\n\t\t\t\t\t\trep = replacements[prop][key];\r\n\t\t\t\t\t\tif (isArray(rep)) {\r\n\t\t\t\t\t\t\tfor (var k in rep) {\r\n\t\t\t\t\t\t\t\tif (key.slice(-2) == '[]') {\r\n\t\t\t\t\t\t\t\t\tqueryParts.push(encodeURIComponent(key.slice(0, -2)) + '[]=' + encodeURIComponent(rep[k]));\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tqueryParts.push(encodeURIComponent(key + '=' + rep[k]));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tqueryParts.push(encodeURIComponent(key + '=' + rep));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tval = '?' + queryParts.join('&');\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// make sure value is a string see #gh-54\r\n\t\t\t\t\tval = String(replacements[prop]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (match.indexOf('*') === -1 && val.indexOf('/') !== -1) {\r\n\t\t\t\t\tthrow new Error('Invalid value \"' + val + '\" for segment \"' + match + '\".');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (match.indexOf('{') !== -1) {\r\n\t\t\t\tthrow new Error('The segment ' + match + ' is required.');\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tval = '';\r\n\t\t\t}\r\n\t\t\treturn val;\r\n\t\t};\r\n\r\n\t\tif (!TOKENS.OS.trail) {\r\n\t\t\tTOKENS.OS.trail = new RegExp('(?:' + TOKENS.OS.id + ')+$');\r\n\t\t}\r\n\r\n\t\treturn pattern\r\n\t\t\t.replace(TOKENS.OS.rgx, TOKENS.OS.save)\r\n\t\t\t.replace(PARAMS_REGEXP, replaceFn)\r\n\t\t\t.replace(TOKENS.OS.trail, '') // remove trailing\r\n\t\t\t.replace(TOKENS.OS.rRestore, '/'); // add slash between segments\r\n\t}\r\n\r\n\t//API\r\n\treturn {\r\n\t\tstrict: function () {\r\n\t\t\t_slashMode = STRICT_SLASH;\r\n\t\t},\r\n\t\tloose: function () {\r\n\t\t\t_slashMode = LOOSE_SLASH;\r\n\t\t},\r\n\t\tlegacy: function () {\r\n\t\t\t_slashMode = LEGACY_SLASH;\r\n\t\t},\r\n\t\tgetParamIds: getParamIds,\r\n\t\tgetOptionalParamsIds: getOptionalParamsIds,\r\n\t\tgetParamValues: getParamValues,\r\n\t\tcompilePattern: compilePattern,\r\n\t\tinterpolate: interpolate\r\n\t};\r\n\r\n}","import router from '@trullock/router';\nimport PageShowError from './pageshowerror.js';\n\nvar pageHash = {},\n\tpageCache = {},\n\tpageTemplateCache = {},\n\tstack = [],\n\tstackPointer = -1;\n\nvar manuallyAdjustingHistory = false;\nvar handlingBeforeUnload = false;\nvar lastNavigationDirection = null;\n\nvar goal = null;\nvar backData = {};\nvar options = {\n\tfetchPath: route => '/pages/' + route.routeName + '.html',\n\tfetchPageTemplate: route => {\n\t\treturn fetch(options.fetchPath(route))\n\t\t\t.then(r => r.text())\n\t\t\t.then(html => {\n\t\t\t\tvar $div = document.createElement('div');\n\t\t\t\t$div.innerHTML = html;\n\t\t\t\t// Pages are assumed to have a single wrapping element\n\t\t\t\treturn $div.firstElementChild;\n\t\t\t})\n\t\t\t.then($template => {\n\t\t\t\tpageTemplateCache[route.pattern] = $template;\n\t\t\t\treturn $template;\n\t\t\t});\n\t},\n\tpageContainer: () => document.body,\n\tprepareMarkup: $html => { },\n\tloadingPageName: 'loading',\n\terror404PageName: 'error-404',\n\tdefaultPageName: 'root',\n\tbeforeUnload: null\n}\n\nexport const pages = pageHash;\n\nexport function registerPage(name, route, pageClass) {\n\trouter.addRoute(name, route, pageClass);\n\n\tpageHash[name] = {\n\t\turl: route,\n\t\tpageClass: pageClass\n\t}\n\n\treturn pageClass;\n}\n\nexport function getPath(name, values) {\n\tlet url = router.interpolate(name, values);\n\tif (values?.hash)\n\t\turl += '#' + values.hash;\n\treturn url;\n}\n\nfunction showLoading() {\n\tvar page = pageHash[options.loadingPageName];\n\tvar route = router.parse(page.url);\n\tvar data = {\n\t\troute: route,\n\t\tscrollY: window.scrollY,\n\t\tevent: {\n\t\t\taction: 'replace'\n\t\t}\n\t};\n\n\tvar page = pageCache[page.url].page;\n\n\treturn page.show(data);\n}\n\nfunction loadPage(route, data) {\n\n\tvar fetchPage = pageTemplateCache[route.pattern] ? Promise.resolve(pageTemplateCache[route.pattern]) : options.fetchPageTemplate(route);\n\n\treturn fetchPage.then($template => {\n\t\tvar $html = $template.cloneNode(true);\n\t\toptions.prepareMarkup($html);\n\t\toptions.pageContainer().appendChild($html);\n\t\tpageCache[route.path] = {\n\t\t\t$html,\n\t\t\tpage: new (route.pageClass)($html)\n\t\t}\n\n\t\tvar page = pageCache[route.path].page;\n\t\treturn page.boot(data).then(() => page);\n\t});\n}\n\nfunction showPage(url, data, event) {\n\tvar route = router.parse(url);\n\tif (route == null) {\n\t\tconsole.error(`Can't find page: '${url}'`);\n\t\treturn Promise.reject(new PageShowError(pageHash[options.error404PageName].url, `Can't find page: '${url}'`, {}, 'replace'));\n\t}\n\n\tdata = data || {};\n\tfor (let key in route.params)\n\t\tdata[key] = route.params[key];\n\n\tdata.route = {\n\t\turl: url,\n\t\tpath: route.path,\n\t\trouteName: route.routeName,\n\t\tparams: route.params\n\t};\n\tdata.event = event;\n\n\t// TODO: abstract\n\tif (route.pageClass.requireAuth && !firebase.auth().currentUser) {\n\t\tgoal = { url, data };\n\t\treturn showPage(getPath('sign-in'), null, event);\n\t}\n\n\tvar getPage = showLoading().then(() => {\n\t\tif (pageCache[route.path])\n\t\t\treturn pageCache[route.path].page;\n\n\t\treturn loadPage(route, data)\n\t});\n\n\t// handle initial page\n\tif (stackPointer == -1)\n\t{\n\t\treturn getPage\n\t\t\t\t\t.then(page => {\n\t\t\t\t\t\tstack.push({ uid: 0, data, page });\n\t\t\t\t\t\tstackPointer = 0;\n\t\t\t\t\t\treturn page;\n\t\t\t\t\t})\n\t\t\t\t\t.then(page => doShow(page, data));\n\t}\n\n\tlet currentState = stack[stackPointer];\n\n\tif (currentState.data.route.path == route.path) {\n\t\thandleHistoryAction(event, url, data, currentState.page);\n\t\treturn getPage.then(page => doShow(page, data));\n\t}\n\n\tcurrentState.data.scrollY = window.scrollY;\n\n\treturn Promise.all([\n\t\t\tcurrentState.page.hide(event),\n\t\t\tgetPage\n\t\t])\n\t\t\t.then(results => results[1])\n\t\t\t.then(page => {\n\t\t\t\thandleHistoryAction(event, url, data, page);\n\t\t\t\treturn doShow(page, data);\n\t\t\t}).catch(e => {\n\t\t\t\t// TODO: what case is this?\n\t\t\t\tmanuallyAdjustingHistory = () => manuallyAdjustingHistory = false;\n\t\t\t\tif (event.action == 'back')\n\t\t\t\t\thistory.go(1);\n\t\t\t\telse if (event.action == 'fwd')\n\t\t\t\t\thistory.go(-1);\n\t\t\t});\n}\n\nfunction doShow(page, data) {\n\n\twindow.scroll(0, 0);\n\n\treturn showLoading()\n\t\t.then(() => page.show(data))\n\t\t.then(() => document.title = page.title)\n\t\t// todo: hide() should be passed an event object\n\t\t.then(() => pageCache[pageHash[options.loadingPageName].url].page.hide());\n}\n\nfunction handleHistoryAction(event, url, data, page) {\n\tif (event.action == 'push') {\n\t\tlet newUid = stack[stackPointer].uid + 1;\n\n\t\twindow.history.pushState({ uid: newUid }, null, url);\n\t\t\n\t\t// remove future\n\t\tstack.splice(stackPointer + 1, stack.length - stackPointer);\n\n\t\tstack.push({ uid: newUid, data, page });\n\t\tstackPointer++;\n\t}\n\telse if (event.action == 'replace') {\n\t\t// TODO: this case may be buggy\n\n\t\tlet currentUid = stack[stackPointer].uid;\n\t\twindow.history.replaceState({ uid: currentUid }, null, url);\n\t\t\n\t\tstack.pop();\n\t\tstack.push({ uid: currentUid, data, page });\n\t}\n\telse if(event.action == 'back')\n\t{\n\t\tstackPointer -= event.distance;\n\t}\n\telse if (event.action == 'fwd')\n\t{\n\t\tstackPointer += event.distance;\n\t}\t\n}\n\nfunction doNavigate(url, data) {\n\n\tif (url === 'goal') {\n\t\turl = goal ? goal.url : data?.fallback || getPath(options.defaultPageName);\n\t\tdata = goal?.data || {}\n\t\tgoal = null;\n\t}\n\n\treturn showPage(url, data, { action: 'push', distance: 0 });\n}\n\nexport function init(opts) {\n\n\tObject.assign(options, opts);\n\n\t// handle pages whose markup is already loaded in the page\n\tfor (var key in pageHash) {\n\t\tif (pageHash[key].pageClass.existingDomSelector) {\n\t\t\tlet $html = document.querySelector(pageHash[key].pageClass.existingDomSelector)\n\t\t\tif(!$html)\n\t\t\t{\n\t\t\t\tconsole.error(`Unable to find DOM element '${pageHash[key].pageClass.existingDomSelector}' for page '${key}'`)\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpageCache[pageHash[key].url] = {\n\t\t\t\t$html: $html,\n\t\t\t\tpage: new (pageHash[key].pageClass)($html)\n\t\t\t}\n\t\t}\n\t}\n\n\t// set initial page\n\tshowPage(window.location.pathname + window.location.search + window.location.hash, null, { action: 'load', distance: 0 }).catch(e => {\n\t\tconsole.error(e);\n\t\tif (e instanceof PageShowError)\n\t\t\treturn showPage(e.url, e.data, { action: e.action || 'show' });\n\t});\n\n\tfunction handlePopstate(context, direction, distance) {\n\n\t\tif (manuallyAdjustingHistory) {\n\t\t\tmanuallyAdjustingHistory(context, { action: direction, distance });\n\t\t\treturn;\n\t\t}\n\n\t\tif (direction == 'back')\n\t\t\tObject.assign(context.data, backData);\n\t\tbackData = {};\n\n\t\tshowPage(context.data.route.url, context.data, { action: direction, distance }).catch(e => {\n\t\t\tconsole.error(e);\n\t\t\tif (e instanceof PageShowError)\n\t\t\t\treturn showPage(e.url, e.data, { action: e.action || 'show' });\n\t\t});\n\t}\n\n\tfunction handleBeforeUnloadPart1() {\n\t\t// if we're ignoring beforeUnload this navigation\n\t\tif (handlingBeforeUnload === 'ignore') {\n\t\t\thandlingBeforeUnload = false;\n\t\t\treturn false;\n\t\t}\n\n\t\t// if we have a before-unload confirm to show\n\t\tif (stack[stackPointer].page.beforeUnload && options.beforeUnload && handlingBeforeUnload === false) {\n\t\t\tvar interrupt = stack[stackPointer].page.beforeUnload();\n\t\t\tif (interrupt) {\n\t\t\t\thandlingBeforeUnload = 'step1';\n\n\t\t\t\t// do this in a new thread, you cant call history actions from inside a history-aciton-handler\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t// undo the navigation so the URL remains correct whilst we show the confirm dialog\n\t\t\t\t\tif (lastNavigationDirection == 'fwd')\n\t\t\t\t\t\thistory.back();\n\t\t\t\t\telse if (lastNavigationDirection == 'back')\n\t\t\t\t\t\thistory.forward();\n\t\t\t\t}, 1);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// we've finished beforeUnloading\n\t\tif (handlingBeforeUnload === 'step2')\n\t\t\thandlingBeforeUnload = false;\n\n\t\treturn false;\n\t}\n\n\tfunction handleBeforeUnloadPart2() {\n\t\tif (handlingBeforeUnload !== 'step1')\n\t\t\treturn false;\n\n\t\t// do the beforeUnload action, then...\n\t\toptions.beforeUnload(stack[stackPointer].page.beforeUnload()).then(result => {\n\n\t\t\t// if the user confirmed, redo the original action\n\t\t\tif (result) {\n\n\t\t\t\thandlingBeforeUnload = 'step2';\n\n\t\t\t\tif (lastNavigationDirection == 'fwd')\n\t\t\t\t\thistory.forward();\n\t\t\t\telse if (lastNavigationDirection == 'back')\n\t\t\t\t\thistory.back();\n\t\t\t} else {\n\t\t\t\thandlingBeforeUnload = false;\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t// listen for browser navigations\n\twindow.addEventListener(\"popstate\", e => {\n\t\tvar interrupted = handleBeforeUnloadPart2();\n\t\tif (interrupted)\n\t\t\treturn;\n\n\t\tlet newUid = e.state?.uid || 0;\n\t\tlet previousUid = stack[stackPointer].uid;\n\n\t\tlastNavigationDirection = newUid > previousUid ? 'fwd' : 'back';\n\t\tlet distance = Math.abs(newUid - previousUid);\n\n\t\tvar interrupted = handleBeforeUnloadPart1();\n\t\tif (interrupted)\n\t\t\treturn;\n\n\t\tvar context = findContext(newUid);\n\t\thandlePopstate(context, lastNavigationDirection, distance);\n\t});\n}\n\nfunction findContext(uid){\n\tfor (var i = 0; i < stack.length; i++) {\n\t\tif (stack[i].uid == uid)\n\t\t\treturn stack[i];\n\t}\n\treturn null;\n}\n\nexport function navigate(url, data, checkBeforeUnload) {\n\n\tif (checkBeforeUnload === true && stack[stackPointer].page.beforeUnload && options.beforeUnload) {\n\n\t\tvar interrupt = stack[stackPointer].page.beforeUnload();\n\t\tif (interrupt !== false) {\n\t\t\toptions.beforeUnload(interrupt).then(result => {\n\t\t\t\tif (result)\n\t\t\t\t\tdoNavigate(url, data);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t}\n\n\tdoNavigate(url, data);\n}\n\nexport function update(opts) {\n\tstate[statePointer].data = opts.data;\n}\n\nexport function replace(url, data) {\n\treturn showPage(url, data, { action: 'replace', distance: 0 });\n}\n\nexport function show(url, data) {\n\treturn showPage(url, data, { action: 'show', distance: 0 });\n}\n\nexport function back(data, checkBeforeUnload) {\n\tbackData = data || {};\n\thandlingBeforeUnload = checkBeforeUnload === false ? 'ignore' : false;\n\thistory.go(-1);\n}\n\nexport function printStack() {\n\tconsole.log(\"Stack length: \" + stack.length);\n\tconsole.log(\"Stack pointer: \" + stackPointer);\n\tfor(var i = 0; i < stack.length; i++)\n\t\tconsole.log(stack[i]);\n}\n\nexport function removeHistory(predicate)\n{\n\tlet statesToKeep = [];\n\n\tfor (var i = 0; i < stack.length; i++)\n\t{\n\t\tif (!predicate(stack[i]))\n\t\t\tstatesToKeep.push(stack[i]);\n\t}\n\n\t// TODO: ensure we always have at least 1 state to keep - must/can this always be the current page?\n\n\tif (statesToKeep.length == stack.length)\n\t\treturn Promise.resolve();\n\n\n\treturn new Promise((resolve, reject) => {\n\n\n\t\tlet backsToDo = stackPointer - 1;\n\t\tlet currentUid = -1;\n\n\t\t// TODO: handle stack pointer not being at the tail when this process starts\n\n\t\tmanuallyAdjustingHistory = _ => {\n\t\t\t// rewind to the first history position\n\t\t\tif(backsToDo > 0)\n\t\t\t{\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\tbacksToDo--;\n\t\t\t\t\thistory.back();\n\t\t\t\t}, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// reset the stack\n\t\t\tstack = [];\n\n\t\t\tfor (var k = 0; k < statesToKeep.length; k++) {\n\t\t\t\tlet currentState = statesToKeep[k];\n\t\t\t\tcurrentState.uid = ++currentUid;\n\n\t\t\t\tif (k == 0)\n\t\t\t\t\twindow.history.replaceState({ uid: currentState.uid }, null, currentState.data.route.url);\n\t\t\t\telse\n\t\t\t\t\twindow.history.pushState({ uid: currentState.uid }, null, currentState.data.route.url);\n\t\t\t\t\n\t\t\t\t\t// TODO: this doesnt seem to work when k=0\n\t\t\t\tdocument.title = currentState.page.title;\n\n\t\t\t\tstack.push(currentState);\n\t\t\t}\n\n\t\t\tstackPointer = stack.length - 1;\n\n\t\t\tmanuallyAdjustingHistory = false;\n\t\t};\n\n\t\thistory.back();\n\t});\n}","export default class PageShowError extends Error {\r\n\tconstructor(url, message, data, action) {\r\n\t\tsuper(message || 'Error showing requested page')\r\n\r\n\t\t// Maintains proper stack trace for where our error was thrown (only available on V8)\r\n\t\tif (Error.captureStackTrace)\r\n\t\t\tError.captureStackTrace(this, PageShowError)\r\n\r\n\t\tthis.name = 'PageShowError'\r\n\t\tthis.url = url;\r\n\t\tthis.data = data;\r\n\t\tthis.action = action;\r\n\t}\r\n}","import Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('loading', '/loading', class extends Page {\r\n\r\n\tstatic existingDomSelector = '#page-loading';\r\n\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","import './page1.htm'\r\nimport Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page1', '/page1', class extends Page {\r\n\r\n\ttitle = \"Page 1\";\r\n\r\n\ttype = 'A';\r\n\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","import './page2.htm'\r\nimport Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page2', '/page2', class extends Page {\r\n\r\n\ttitle = \"Page 2\";\r\n\r\n\ttype = 'A';\r\n\t\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","import './page3.htm'\r\nimport Page from './page.js';\r\nimport * as pageManager from '@trullock/page-manager';\r\n\r\nexport default pageManager.registerPage('page3', '/page3', class extends Page {\r\n\r\n\ttitle = \"Page 3\";\r\n\t\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\r\n\t\t$page.querySelector('.btnRemove').addEventListener('click', e => {\r\n\t\t\tpageManager.removeHistory(state => {\r\n\t\t\t\treturn state.page.type == 'A';\r\n\t\t\t})\r\n\t\t})\r\n\t}\r\n});","import './page4.htm'\r\nimport Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page4', '/page4', class extends Page {\r\n\r\n\ttitle = \"Page 4\";\r\n\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","export default class Page {\r\n\r\n\tdirty = false;\r\n\r\n\tconstructor($page){\r\n\t\tthis.$page = $page;\r\n\t}\r\n\r\n\tget title() {\r\n\t\treturn this.$page.dataset['title'] || 'PageManager'\r\n\t}\r\n\r\n\tboot(opts){\r\n\t\treturn Promise.resolve();\r\n\t}\r\n\r\n\tshow(opts) {\r\n\t\tthis.$page.style.display = 'block';\r\n\t\treturn Promise.resolve();\r\n\t}\r\n\r\n\thide() {\r\n\t\tthis.$page.style.display = 'none';\r\n\t\treturn Promise.resolve();\r\n\t}\r\n}","export default __webpack_public_path__ + \"page1.htm\";","export default __webpack_public_path__ + \"page2.htm\";","export default __webpack_public_path__ + \"page3.htm\";","export default __webpack_public_path__ + \"page4.htm\";","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","import * as pageManager from '../src/index.js'\r\n\r\nimport pageLoading from './page-loading.js'\r\nimport page1 from './page-page1.js'\r\nimport page2 from './page-page2.js'\r\nimport page3 from './page-page3.js'\r\nimport page4 from './page-page4.js'\r\n\r\nwindow.addEventListener('DOMContentLoaded', function () {\r\n\tpageManager.init({\r\n\t\tpageContainer: () => document.body,\r\n\t\tfetchPath: route => '/pages/' + route.routeName + '.htm',\r\n\t});\r\n\r\n\r\n\t// listen for navigations\r\n\tdocument.addEventListener('click', e => {\r\n\t\tif (e.ctrlKey || e.metaKey)\r\n\t\t\treturn;\r\n\r\n\t\tvar $a = e.target.matches('a') ? e.target : e.target.closest('a');\r\n\t\tif (!$a)\r\n\t\t\treturn;\r\n\r\n\t\tvar href = $a.pathname + $a.search + $a.hash;\r\n\t\tpageManager.navigate(href)\r\n\r\n\t\te.preventDefault();\r\n\t}, false);\r\n\r\n\tdocument.querySelector('.btnStack').addEventListener('click', e => {\r\n\t\tpageManager.printStack();\r\n\t})\r\n});"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///../node_modules/@trullock/router/src/index.js","webpack:///../node_modules/@trullock/router/src/pattern-lexer.js","webpack:///../src/index.js","webpack:///../src/pageshowerror.js","webpack:///./page-loading.js","webpack:///./page-page1.js","webpack:///./page-page2.js","webpack:///./page-page3.js","webpack:///./page-page4.js","webpack:///./page.js","webpack:///./page1.htm","webpack:///./page2.htm","webpack:///./page3.htm","webpack:///./page4.htm","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///./lolpack.js"],"names":["pageHash","pageCache","pageTemplateCache","stack","stackPointer","manuallyAdjustingHistory","handlingBeforeUnload","lastNavigationDirection","goal","backData","options","fetchPath","route","routeName","fetchPageTemplate","fetch","then","r","text","html","$div","document","createElement","innerHTML","firstElementChild","$template","pattern","pageInterrupt","pageContainer","body","prepareMarkup","$html","loadingPageName","error404PageName","defaultPageName","beforeUnload","pages","registerPage","name","pageClass","router","url","getPath","values","hash","showLoading","page","data","scrollY","window","event","action","show","loadPage","fetchPage","Promise","resolve","cloneNode","appendChild","path","boot","showPage","console","error","reject","PageShowError","key","params","interrupt","getPage","push","uid","doShow","currentState","handleHistoryAction","all","hide","results","scroll","title","newUid","history","pushState","splice","length","currentUid","replaceState","pop","distance","doNavigate","fallback","storageAvailable","x","sessionStorage","setItem","removeItem","e","init","opts","Object","assign","storedStack","getItem","JSON","parse","existingDomSelector","querySelector","location","pathname","search","catch","handlePopstate","context","direction","handleBeforeUnloadPart1","setTimeout","back","forward","handleBeforeUnloadPart2","result","addEventListener","interrupted","state","previousUid","Math","abs","findContext","stackToSerialize","map","s","stackToStore","stringify","i","navigate","checkBeforeUnload","update","statePointer","replace","go","printStack","log","removeHistory","predicate","statesToKeep","backsToDo","_","k","purgeCache","destroy","constructor","remove","message","Error","captureStackTrace","$page","Page","pageManager","type","dataset","style","display","ctrlKey","metaKey","$a","target","matches","closest","href","preventDefault"],"mappings":";;;;;;;;;;;;;;;AAA6C;;AAE7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;;AAEA,iBAAiB;AACjB,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc,eAAe,6BAA6B;AAC1G;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;;;AAGA,iEAAe;AACf;AACA;AACA;AACA,sBAAsB,0DAAY;AAClC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,G;AACA,O;AACA,GAAG;AACH;;AAEA;AACA,qCAAqC,qBAAqB;;AAE1D;AACA;;AAEA;AACA;AACA,gDAAgD,KAAK;;AAErD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kB;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,CAAC,EAAE,E;;;;;;;;;;;;;;AC3NH,6BAAe,sCAAY;;AAE3B;AACA;AACA,2CAA2C;;AAE3C;AACA;AACA;;AAEA,kCAAkC,EAAE;AACpC,wBAAwB,OAAO,SAAS;;AAExC;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB,SAAS,UAAU;AACnE,cAAc,sBAAsB;AACpC,eAAe,IAAI;AACnB;AACA,IAAI;AACJ;AACA;AACA,sCAAsC,SAAS;AAC/C,cAAc,QAAQ;AACtB,eAAe,IAAI;AACnB;AACA,IAAI;AACJ;AACA,sDAAsD,GAAG;AACzD,YAAY,MAAM,KAAK;AACvB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,2CAA2C,GAAG;AAC9C,YAAY,IAAI,OAAO;AACvB;AACA,IAAI;AACJ;AACA;AACA,6CAA6C,EAAE;AAC/C,YAAY,IAAI,KAAK;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,IAAI;AACzD;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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","file":"main.js","sourcesContent":["import PatternLexer from './pattern-lexer.js'\r\n\r\nfunction isKind(val, kind) {\r\n\treturn '[object ' + kind + ']' === Object.prototype.toString.call(val);\r\n}\r\nfunction isRegExp(val) {\r\n\treturn isKind(val, 'RegExp');\r\n}\r\n\r\nfunction decodeQueryString(queryStr, shouldTypecast) {\r\n\tvar queryArr = (queryStr || '').replace('?', '').split('&'),\r\n\t\treg = /([^=]+)=(.+)/,\r\n\t\ti = -1,\r\n\t\tobj = {},\r\n\t\tequalIndex, cur, pValue, pName;\r\n\r\n\twhile ((cur = queryArr[++i])) {\r\n\t\tequalIndex = cur.indexOf('=');\r\n\t\tpName = cur.substring(0, equalIndex);\r\n\t\tpValue = decodeURIComponent(cur.substring(equalIndex + 1));\r\n\r\n\t\tif (pName in obj){\r\n\t\t\tif(isArray(obj[pName])){\r\n\t\t\t\tobj[pName].push(pValue);\r\n\t\t\t} else {\r\n\t\t\t\tobj[pName] = [obj[pName], pValue];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tobj[pName] = pValue;\r\n\t }\r\n\t}\r\n\treturn obj;\r\n}\r\n\r\nfunction Route(name, pattern, pageClass, priority, router) {\r\n\tvar isRegexPattern = isRegExp(pattern);\r\n\tthis._name = name;\r\n\tthis._router = router;\r\n\tthis._pattern = pattern;\r\n\tthis._paramsIds = isRegexPattern ? null : router.patternLexer.getParamIds(pattern);\r\n\tthis._optionalParamsIds = isRegexPattern ? null : router.patternLexer.getOptionalParamsIds(pattern);\r\n\tthis._matchRegexp = isRegexPattern ? pattern : router.patternLexer.compilePattern(pattern, router.ignoreCase);\r\n\tthis._pageClass = pageClass;\r\n\tthis._priority = priority || 0;\r\n}\r\n\r\nRoute.prototype = {\r\n\r\n\tmatch: function (request) {\r\n\t\treturn this._matchRegexp.test(request);\r\n\t},\r\n\r\n\t_isValidParam: function (request, prop, values) {\r\n\t\tvar validationRule = this.rules[prop],\r\n\t\t\tval = values[prop],\r\n\t\t\tisValid = false,\r\n\t\t\tisQuery = (prop.indexOf('?') === 0);\r\n\r\n\t\tif (val == null && this._optionalParamsIds && arrayIndexOf(this._optionalParamsIds, prop) !== -1) {\r\n\t\t\tisValid = true;\r\n\t\t}\r\n\t\telse if (isRegExp(validationRule)) {\r\n\t\t\tif (isQuery)\r\n\t\t\t\tval = values[prop + '_']; //use raw string\r\n\r\n\t\t\tisValid = validationRule.test(val);\r\n\t\t}\r\n\t\telse if (isArray(validationRule)) {\r\n\t\t\tif (isQuery)\r\n\t\t\t\tval = values[prop + '_']; //use raw string\r\n\r\n\t\t\tisValid = this._isValidArrayRule(validationRule, val);\r\n\t\t}\r\n\t\telse if (isFunction(validationRule)) {\r\n\t\t\tisValid = validationRule(val, request, values);\r\n\t\t}\r\n\r\n\t\treturn isValid; //fail silently if validationRule is from an unsupported type\r\n\t},\r\n\r\n\t_isValidArrayRule: function (arr, val) {\r\n\t\tif (!this._router.ignoreCase) {\r\n\t\t\treturn arrayIndexOf(arr, val) !== -1;\r\n\t\t}\r\n\r\n\t\tif (typeof val === 'string') {\r\n\t\t\tval = val.toLowerCase();\r\n\t\t}\r\n\r\n\t\tvar n = arr.length,\r\n\t\t\titem,\r\n\t\t\tcompareVal;\r\n\r\n\t\twhile (n--) {\r\n\t\t\titem = arr[n];\r\n\t\t\tcompareVal = (typeof item === 'string') ? item.toLowerCase() : item;\r\n\t\t\tif (compareVal === val) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_getParamsObject: function (request) {\r\n\t\tvar shouldTypecast = this._router.shouldTypecast,\r\n\t\t\tvalues = this._router.patternLexer.getParamValues(request, this._matchRegexp, shouldTypecast),\r\n\t\t\to = {},\r\n\t\t\tn = values.length,\r\n\t\t\tparam, val;\r\n\t\twhile (n--) {\r\n\t\t\tval = values[n];\r\n\t\t\tif (this._paramsIds) {\r\n\t\t\t\tparam = this._paramsIds[n];\r\n\t\t\t\tif (param.indexOf('?') === 0 && val) {\r\n\t\t\t\t\tval = decodeQueryString(val, shouldTypecast);\r\n\t\t\t\t\t\r\n\t\t\t\t\tfor(var key in val){\r\n\t\t\t\t\t\tif(!o[key])\r\n\t\t\t\t\t\t\to[key] = val[key];\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\to['?' + key] = val[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t\to[n] = val;\r\n\t\t\t\t} \r\n\t\t\t\telse \r\n\t\t\t\t\to[param] = val;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn o;\r\n\t},\r\n\r\n\tinterpolate: function (replacements) {\r\n\t\ttry {\r\n\t\t\tvar str = this._router.patternLexer.interpolate(this._pattern, replacements);\r\n\t\t\treturn str;\r\n\t\t}\r\n\t\tcatch(e) {\r\n\t\t\tthrow new Error(`Error interpolating route ${this._pattern} with values ${JSON.stringify(replacements)}\\n` + e);\r\n\t\t}\r\n\t},\r\n\r\n\ttoString: function () {\r\n\t\treturn '[Route pattern:\"' + this._pattern + '\", numListeners:' + this.matched.getNumListeners() + ']';\r\n\t}\r\n\r\n};\r\n\r\n\r\nexport default new class {\r\n\tconstructor() {\r\n\t\tthis.routes = [];\r\n\t\tthis.routesByName = {};\r\n\t\tthis.patternLexer = PatternLexer();\r\n\t}\r\n\r\n\taddRoute (name, pattern, pageClass, priority) {\r\n\t\tpattern += pattern.endsWith('/') ? ':?query:' : '/:?query:';\r\n\t\tvar route = new Route(name, pattern, pageClass, priority, this);\r\n\r\n\t\tvar n = this.routes.length;\r\n\t\tdo\r\n\t\t{ \r\n\t\t\t--n; \r\n\t\t} while (this.routes[n] && route._priority <= this.routes[n]._priority);\r\n\t\tthis.routes.splice(n + 1, 0, route);\r\n\r\n\t\tthis.routesByName[name] = route;\r\n\t\tObject.defineProperty(this, name, { get: () => pattern });\r\n\r\n\t\treturn route;\r\n\t}\r\n\r\n\tinterpolate(name, data){\r\n\t\tif(!this.routesByName[name])\r\n\t\t\tthrow new Error(`Cannot find route by name ${name}`);\r\n\t\t\t\r\n\t\treturn this.routesByName[name].interpolate(data);\r\n\t}\r\n\r\n\tparse (request) {\r\n\t\tvar n = this.routes.length;\r\n\t\tvar route, hash, path;\r\n\r\n\t\tvar index = request.indexOf('#');\r\n\t\tif(index > -1)\r\n\t\t{\r\n\t\t\thash = request.substr(index + 1);\r\n\t\t\trequest = request.substr(0, index);\r\n\t\t}\r\n\r\n\t\tindex = request.indexOf('?');\r\n\t\tif(index > -1)\r\n\t\t\tpath = request.substr(0, index)\r\n\t\telse\r\n\t\t\tpath = request;\t\r\n\t\t\r\n\r\n\t\twhile (route = this.routes[--n]) {\r\n\t\t\tif (route.match(request)) {\r\n\t\t\t\tvar params = route._getParamsObject(request);\r\n\t\t\t\tparams.hash = hash;\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tpath: path.toLowerCase(),\r\n\t\t\t\t\trouteName: route._name,\r\n\t\t\t\t\tpattern: route._pattern,\r\n\t\t\t\t\tpageClass: route._pageClass,\r\n\t\t\t\t\tparams: params\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\ttoString () {\r\n\t\treturn '[Router numRoutes:' + this.getNumRoutes() + ']';\r\n\t}\r\n}();","export default function () {\r\n\r\n\tvar\r\n\t\t//match chars that should be escaped on string regexp\r\n\t\tESCAPE_CHARS_REGEXP = /[\\\\.+*?\\^$\\[\\](){}\\/'#]/g,\r\n\r\n\t\t//trailing slashes (begin/end of string)\r\n\t\tLOOSE_SLASHES_REGEXP = /^\\/|\\/$/g,\r\n\t\tLEGACY_SLASHES_REGEXP = /\\/$/g,\r\n\r\n\t\t//params - everything between `{ }` or `: :`\r\n\t\tPARAMS_REGEXP = /(?:\\{|:)([^}:]+)(?:\\}|:)/g,\r\n\r\n\t\t//used to save params during compile (avoid escaping things that\r\n\t\t//shouldn't be escaped).\r\n\t\tTOKENS = {\r\n\t\t\t'OS': {\r\n\t\t\t\t//optional slashes\r\n\t\t\t\t//slash between `::` or `}:` or `\\w:` or `:{?` or `}{?` or `\\w{?`\r\n\t\t\t\trgx: /([:}]|\\w(?=\\/))\\/?(:|(?:\\{\\?))/g,\r\n\t\t\t\tsave: '$1{{id}}$2',\r\n\t\t\t\tres: '\\\\/?'\r\n\t\t\t},\r\n\t\t\t'RS': {\r\n\t\t\t\t//required slashes\r\n\t\t\t\t//used to insert slash between `:{` and `}{`\r\n\t\t\t\trgx: /([:}])\\/?(\\{)/g,\r\n\t\t\t\tsave: '$1{{id}}$2',\r\n\t\t\t\tres: '\\\\/'\r\n\t\t\t},\r\n\t\t\t'RQ': {\r\n\t\t\t\t//required query string - everything in between `{? }`\r\n\t\t\t\trgx: /\\{\\?([^}]+)\\}/g,\r\n\t\t\t\t//everything from `?` till `#` or end of string\r\n\t\t\t\tres: '\\\\?([^#]+)'\r\n\t\t\t},\r\n\t\t\t'OQ': {\r\n\t\t\t\t//optional query string - everything in between `:? :`\r\n\t\t\t\trgx: /:\\?([^:]+):/g,\r\n\t\t\t\t//everything from `?` till `#` or end of string\r\n\t\t\t\tres: '(?:\\\\?([^#]*))?'\r\n\t\t\t},\r\n\t\t\t'OR': {\r\n\t\t\t\t//optional rest - everything in between `: *:`\r\n\t\t\t\trgx: /:([^:]+)\\*:/g,\r\n\t\t\t\tres: '(.*)?' // optional group to avoid passing empty string as captured\r\n\t\t\t},\r\n\t\t\t'RR': {\r\n\t\t\t\t//rest param - everything in between `{ *}`\r\n\t\t\t\trgx: /\\{([^}]+)\\*\\}/g,\r\n\t\t\t\tres: '(.+)'\r\n\t\t\t},\r\n\t\t\t// required/optional params should come after rest segments\r\n\t\t\t'RP': {\r\n\t\t\t\t//required params - everything between `{ }`\r\n\t\t\t\trgx: /\\{([^}]+)\\}/g,\r\n\t\t\t\tres: '([^\\\\/?]+)'\r\n\t\t\t},\r\n\t\t\t'OP': {\r\n\t\t\t\t//optional params - everything between `: :`\r\n\t\t\t\trgx: /:([^:]+):/g,\r\n\t\t\t\tres: '([^\\\\/?]+)?\\/?'\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tLOOSE_SLASH = 1,\r\n\t\tSTRICT_SLASH = 2,\r\n\t\tLEGACY_SLASH = 3,\r\n\r\n\t\t_slashMode = LOOSE_SLASH;\r\n\r\n\r\n\tfunction precompileTokens() {\r\n\t\tvar key, cur;\r\n\t\tfor (key in TOKENS) {\r\n\t\t\tif (TOKENS.hasOwnProperty(key)) {\r\n\t\t\t\tcur = TOKENS[key];\r\n\t\t\t\tcur.id = '__CR_' + key + '__';\r\n\t\t\t\tcur.save = ('save' in cur) ? cur.save.replace('{{id}}', cur.id) : cur.id;\r\n\t\t\t\tcur.rRestore = new RegExp(cur.id, 'g');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tprecompileTokens();\r\n\r\n\r\n\tfunction captureVals(regex, pattern) {\r\n\t\tvar vals = [], match;\r\n\t\t// very important to reset lastIndex since RegExp can have \"g\" flag\r\n\t\t// and multiple runs might affect the result, specially if matching\r\n\t\t// same string multiple times on IE 7-8\r\n\t\tregex.lastIndex = 0;\r\n\t\twhile (match = regex.exec(pattern)) {\r\n\t\t\tvals.push(match[1]);\r\n\t\t}\r\n\t\treturn vals;\r\n\t}\r\n\r\n\tfunction getParamIds(pattern) {\r\n\t\treturn captureVals(PARAMS_REGEXP, pattern);\r\n\t}\r\n\r\n\tfunction getOptionalParamsIds(pattern) {\r\n\t\treturn captureVals(TOKENS.OP.rgx, pattern);\r\n\t}\r\n\r\n\tfunction compilePattern(pattern, ignoreCase) {\r\n\t\tpattern = pattern || '';\r\n\r\n\t\tif (pattern) {\r\n\t\t\tif (_slashMode === LOOSE_SLASH) {\r\n\t\t\t\tpattern = pattern.replace(LOOSE_SLASHES_REGEXP, '');\r\n\t\t\t}\r\n\t\t\telse if (_slashMode === LEGACY_SLASH) {\r\n\t\t\t\tpattern = pattern.replace(LEGACY_SLASHES_REGEXP, '');\r\n\t\t\t}\r\n\r\n\t\t\t//save tokens\r\n\t\t\tpattern = replaceTokens(pattern, 'rgx', 'save');\r\n\t\t\t//regexp escape\r\n\t\t\tpattern = pattern.replace(ESCAPE_CHARS_REGEXP, '\\\\$&');\r\n\t\t\t//restore tokens\r\n\t\t\tpattern = replaceTokens(pattern, 'rRestore', 'res');\r\n\r\n\t\t\tif (_slashMode === LOOSE_SLASH) {\r\n\t\t\t\tpattern = '\\\\/?' + pattern;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (_slashMode !== STRICT_SLASH) {\r\n\t\t\t//single slash is treated as empty and end slash is optional\r\n\t\t\tpattern += '\\\\/?';\r\n\t\t}\r\n\t\treturn new RegExp('^' + pattern + '$', ignoreCase ? 'i' : '');\r\n\t}\r\n\r\n\tfunction replaceTokens(pattern, regexpName, replaceName) {\r\n\t\tvar cur, key;\r\n\t\tfor (key in TOKENS) {\r\n\t\t\tif (TOKENS.hasOwnProperty(key)) {\r\n\t\t\t\tcur = TOKENS[key];\r\n\t\t\t\tpattern = pattern.replace(cur[regexpName], cur[replaceName]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn pattern;\r\n\t}\r\n\r\n\tfunction getParamValues(request, regexp, shouldTypecast) {\r\n\t\tvar vals = regexp.exec(request);\r\n\t\tif (vals) {\r\n\t\t\tvals.shift();\r\n\t\t\tif (shouldTypecast) {\r\n\t\t\t\tvals = typecastArrayValues(vals);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn vals;\r\n\t}\r\n\r\n\tfunction interpolate(pattern, replacements) {\r\n\t\t// default to an empty object because pattern might have just\r\n\t\t// optional arguments\r\n\t\treplacements = replacements || {};\r\n\t\tif (typeof pattern !== 'string') {\r\n\t\t\tthrow new Error('Route pattern should be a string.');\r\n\t\t}\r\n\t\t\r\n\t\tvar replaceFn = function (match, prop) {\r\n\t\t\tvar val;\r\n\t\t\tprop = (prop.substr(0, 1) === '?') ? prop.substr(1) : prop;\r\n\t\t\tif (replacements[prop] != null) {\r\n\t\t\t\tif (typeof replacements[prop] === 'object') {\r\n\t\t\t\t\tvar queryParts = [], rep;\r\n\t\t\t\t\tfor (var key in replacements[prop]) {\r\n\t\t\t\t\t\trep = replacements[prop][key];\r\n\t\t\t\t\t\tif (isArray(rep)) {\r\n\t\t\t\t\t\t\tfor (var k in rep) {\r\n\t\t\t\t\t\t\t\tif (key.slice(-2) == '[]') {\r\n\t\t\t\t\t\t\t\t\tqueryParts.push(encodeURIComponent(key.slice(0, -2)) + '[]=' + encodeURIComponent(rep[k]));\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tqueryParts.push(encodeURIComponent(key + '=' + rep[k]));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tqueryParts.push(encodeURIComponent(key + '=' + rep));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tval = '?' + queryParts.join('&');\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// make sure value is a string see #gh-54\r\n\t\t\t\t\tval = String(replacements[prop]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (match.indexOf('*') === -1 && val.indexOf('/') !== -1) {\r\n\t\t\t\t\tthrow new Error('Invalid value \"' + val + '\" for segment \"' + match + '\".');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (match.indexOf('{') !== -1) {\r\n\t\t\t\tthrow new Error('The segment ' + match + ' is required.');\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tval = '';\r\n\t\t\t}\r\n\t\t\treturn val;\r\n\t\t};\r\n\r\n\t\tif (!TOKENS.OS.trail) {\r\n\t\t\tTOKENS.OS.trail = new RegExp('(?:' + TOKENS.OS.id + ')+$');\r\n\t\t}\r\n\r\n\t\treturn pattern\r\n\t\t\t.replace(TOKENS.OS.rgx, TOKENS.OS.save)\r\n\t\t\t.replace(PARAMS_REGEXP, replaceFn)\r\n\t\t\t.replace(TOKENS.OS.trail, '') // remove trailing\r\n\t\t\t.replace(TOKENS.OS.rRestore, '/'); // add slash between segments\r\n\t}\r\n\r\n\t//API\r\n\treturn {\r\n\t\tstrict: function () {\r\n\t\t\t_slashMode = STRICT_SLASH;\r\n\t\t},\r\n\t\tloose: function () {\r\n\t\t\t_slashMode = LOOSE_SLASH;\r\n\t\t},\r\n\t\tlegacy: function () {\r\n\t\t\t_slashMode = LEGACY_SLASH;\r\n\t\t},\r\n\t\tgetParamIds: getParamIds,\r\n\t\tgetOptionalParamsIds: getOptionalParamsIds,\r\n\t\tgetParamValues: getParamValues,\r\n\t\tcompilePattern: compilePattern,\r\n\t\tinterpolate: interpolate\r\n\t};\r\n\r\n}","import router from '@trullock/router';\nimport PageShowError from './pageshowerror.js';\n\nvar pageHash = {},\n\tpageCache = {},\n\tpageTemplateCache = {},\n\tstack = [],\n\tstackPointer = -1;\n\nvar manuallyAdjustingHistory = false;\nvar handlingBeforeUnload = false;\nvar lastNavigationDirection = null;\n\nvar goal = null;\nvar backData = {};\nvar options = {\n\tfetchPath: route => '/pages/' + route.routeName + '.html',\n\tfetchPageTemplate: route => {\n\t\treturn fetch(options.fetchPath(route))\n\t\t\t.then(r => r.text())\n\t\t\t.then(html => {\n\t\t\t\tvar $div = document.createElement('div');\n\t\t\t\t$div.innerHTML = html;\n\t\t\t\t// Pages are assumed to have a single wrapping element\n\t\t\t\treturn $div.firstElementChild;\n\t\t\t})\n\t\t\t.then($template => {\n\t\t\t\tpageTemplateCache[route.pattern] = $template;\n\t\t\t\treturn $template;\n\t\t\t});\n\t},\n\tpageInterrupt: route => null,\n\tpageContainer: () => document.body,\n\tprepareMarkup: $html => { },\n\tloadingPageName: 'loading',\n\terror404PageName: 'error-404',\n\tdefaultPageName: 'root',\n\tbeforeUnload: null\n}\n\nexport const pages = pageHash;\n\nexport function registerPage(name, route, pageClass) {\n\trouter.addRoute(name, route, pageClass);\n\n\tpageHash[name] = {\n\t\turl: route,\n\t\tpageClass: pageClass\n\t}\n\n\treturn pageClass;\n}\n\nexport function getPath(name, values) {\n\tlet url = router.interpolate(name, values);\n\tif (values?.hash)\n\t\turl += '#' + values.hash;\n\treturn url;\n}\n\nfunction showLoading() {\n\tvar page = pageHash[options.loadingPageName];\n\tvar route = router.parse(page.url);\n\tvar data = {\n\t\troute: route,\n\t\tscrollY: window.scrollY,\n\t\tevent: {\n\t\t\taction: 'replace'\n\t\t}\n\t};\n\n\tvar page = pageCache[page.url].page;\n\n\treturn page.show(data);\n}\n\nfunction loadPage(route, data) {\n\n\tvar fetchPage = pageTemplateCache[route.pattern] ? Promise.resolve(pageTemplateCache[route.pattern]) : options.fetchPageTemplate(route);\n\n\treturn fetchPage.then($template => {\n\t\tvar $html = $template.cloneNode(true);\n\t\toptions.prepareMarkup($html);\n\t\toptions.pageContainer().appendChild($html);\n\t\tpageCache[route.path] = {\n\t\t\t$html,\n\t\t\tpage: new (route.pageClass)($html)\n\t\t}\n\n\t\tvar page = pageCache[route.path].page;\n\t\treturn page.boot(data).then(() => page);\n\t});\n}\n\nfunction showPage(url, data, event) {\n\tvar route = router.parse(url);\n\tif (route == null) {\n\t\tconsole.error(`Can't find page: '${url}'`);\n\t\treturn Promise.reject(new PageShowError(pageHash[options.error404PageName].url, `Can't find page: '${url}'`, {}, 'replace'));\n\t}\n\n\tdata = data || {};\n\tfor (let key in route.params)\n\t\tdata[key] = route.params[key];\n\n\tdata.route = {\n\t\turl: url,\n\t\tpath: route.path,\n\t\trouteName: route.routeName,\n\t\tparams: route.params\n\t};\n\tdata.event = event;\n\n\tlet interrupt = options.pageInterrupt(route);\n\tif(interrupt)\n\t{\n\t\tgoal = { url, data };\n\t\treturn showPage(interrupt.url, null, event);\n\t}\n\t\n\n\tvar getPage = showLoading().then(() => {\n\t\tif (pageCache[route.path])\n\t\t\treturn pageCache[route.path].page;\n\n\t\treturn loadPage(route, data)\n\t});\n\n\t// handle initial page\n\tif (event.action == 'load')\n\t{\n\t\treturn getPage\n\t\t\t\t\t.then(page => {\n\t\t\t\t\t\t// clean initial load\n\t\t\t\t\t\tif(stackPointer == -1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstack.push({ uid: 0, data, page });\n\t\t\t\t\t\t\tstackPointer = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// page refresh\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstack[stackPointer].page = page;\n\t\t\t\t\t\t\tstack[stackPointer].data = data;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn page;\n\t\t\t\t\t})\n\t\t\t\t\t.then(page => doShow(page, data));\n\t}\n\n\tlet currentState = stack[stackPointer];\n\n\tif (currentState.data.route.path == route.path) {\n\t\thandleHistoryAction(event, url, data, currentState.page);\n\t\treturn getPage.then(page => doShow(page, data));\n\t}\n\n\tcurrentState.data.scrollY = window.scrollY;\n\n\treturn Promise.all([\n\t\t\tcurrentState.page.hide(event),\n\t\t\tgetPage\n\t\t])\n\t\t\t.then(results => results[1])\n\t\t\t.then(page => {\n\t\t\t\thandleHistoryAction(event, url, data, page);\n\t\t\t\treturn doShow(page, data);\n\t\t\t});\n\t\t\t// .catch(e => {\n\t\t\t// \t// TODO: what case is this?\n\t\t\t// \tmanuallyAdjustingHistory = () => manuallyAdjustingHistory = false;\n\t\t\t// \tif (event.action == 'back')\n\t\t\t// \t\thistory.go(1);\n\t\t\t// \telse if (event.action == 'fwd')\n\t\t\t// \t\thistory.go(-1);\n\t\t\t// });\n}\n\nfunction doShow(page, data) {\n\n\twindow.scroll(0, 0);\n\n\treturn showLoading()\n\t\t.then(() => page.show(data))\n\t\t.then(() => document.title = page.title)\n\t\t// todo: hide() should be passed an event object\n\t\t.then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())\n\t\t// return page\n\t\t.then(() => page);\n}\n\nfunction handleHistoryAction(event, url, data, page) {\n\tif (event.action == 'push') {\n\t\tlet newUid = stack[stackPointer].uid + 1;\n\n\t\twindow.history.pushState({ uid: newUid }, null, url);\n\t\t\n\t\t// remove future\n\t\tstack.splice(stackPointer + 1, stack.length - stackPointer);\n\n\t\tstack.push({ uid: newUid, data, page });\n\t\tstackPointer++;\n\t}\n\telse if (event.action == 'replace') {\n\t\t// TODO: this case may be buggy\n\n\t\tlet currentUid = stack[stackPointer].uid;\n\t\twindow.history.replaceState({ uid: currentUid }, null, url);\n\t\t\n\t\tstack.pop();\n\t\tstack.push({ uid: currentUid, data, page });\n\t}\n\telse if(event.action == 'back')\n\t{\n\t\tstackPointer -= event.distance;\n\t}\n\telse if (event.action == 'fwd')\n\t{\n\t\tstackPointer += event.distance;\n\t}\t\n}\n\nfunction doNavigate(url, data) {\n\n\tif (url === 'goal') {\n\t\turl = goal ? goal.url : data?.fallback || getPath(options.defaultPageName);\n\t\tdata = goal?.data || {}\n\t\tgoal = null;\n\t}\n\n\treturn showPage(url, data, { action: 'push', distance: 0 });\n}\n\nfunction storageAvailable() {\n try {\n var x = '__storage_test__';\n window.sessionStorage.setItem(x, x);\n window.sessionStorage.removeItem(x);\n return true;\n }\n catch(e) {\n return false;\n }\n}\n\nexport function init(opts) {\n\n\tObject.assign(options, opts);\n\n\tif(storageAvailable())\n\t{\n\t\tlet storedStack = window.sessionStorage.getItem(\"stack\");\n\t\tif(storedStack)\n\t\t{\n\t\t\tstoredStack = JSON.parse(storedStack);\n\t\t\tstack = storedStack.stack;\n\t\t\tstackPointer = storedStack.stackPointer;\n\t\t\twindow.sessionStorage.removeItem(\"stack\");\n\t\t}\n\t}\n\n\t// handle pages whose markup is already loaded in the page\n\tfor (var key in pageHash) {\n\t\tif (pageHash[key].pageClass.existingDomSelector) {\n\t\t\tlet $html = document.querySelector(pageHash[key].pageClass.existingDomSelector)\n\t\t\tif(!$html)\n\t\t\t{\n\t\t\t\tconsole.error(`Unable to find DOM element '${pageHash[key].pageClass.existingDomSelector}' for page '${key}'`)\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpageCache[pageHash[key].url] = {\n\t\t\t\t$html: $html,\n\t\t\t\tpage: new (pageHash[key].pageClass)($html)\n\t\t\t}\n\t\t}\n\t}\n\n\t// set initial page\n\tshowPage(window.location.pathname + window.location.search + window.location.hash, null, { action: 'load', distance: 0 }).catch(e => {\n\t\tconsole.error(e);\n\t\tif (e instanceof PageShowError)\n\t\t\treturn showPage(e.url, e.data, { action: e.action || 'show' });\n\t});\n\n\tfunction handlePopstate(context, direction, distance) {\n\n\t\tif (manuallyAdjustingHistory) {\n\t\t\tmanuallyAdjustingHistory(context, { action: direction, distance });\n\t\t\treturn;\n\t\t}\n\n\t\tif (direction == 'back')\n\t\t\tObject.assign(context.data, backData);\n\t\tbackData = {};\n\n\t\tshowPage(context.data.route.url, context.data, { action: direction, distance }).catch(e => {\n\t\t\tconsole.error(e);\n\t\t\tif (e instanceof PageShowError)\n\t\t\t\treturn showPage(e.url, e.data, { action: e.action || 'show' });\n\t\t}).then(page => {\n\t\t\t// set page as it can be missing in the case of refreshes\n\t\t\tcontext.page = page;\n\t\t})\n\t}\n\n\tfunction handleBeforeUnloadPart1() {\n\t\t// if we're ignoring beforeUnload this navigation\n\t\tif (handlingBeforeUnload === 'ignore') {\n\t\t\thandlingBeforeUnload = false;\n\t\t\treturn false;\n\t\t}\n\n\t\t// if we have a before-unload confirm to show\n\t\tif (stack[stackPointer].page.beforeUnload && options.beforeUnload && handlingBeforeUnload === false) {\n\t\t\tvar interrupt = stack[stackPointer].page.beforeUnload();\n\t\t\tif (interrupt) {\n\t\t\t\thandlingBeforeUnload = 'step1';\n\n\t\t\t\t// do this in a new thread, you cant call history actions from inside a history-aciton-handler\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t// undo the navigation so the URL remains correct whilst we show the confirm dialog\n\t\t\t\t\tif (lastNavigationDirection == 'fwd')\n\t\t\t\t\t\thistory.back();\n\t\t\t\t\telse if (lastNavigationDirection == 'back')\n\t\t\t\t\t\thistory.forward();\n\t\t\t\t}, 1);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// we've finished beforeUnloading\n\t\tif (handlingBeforeUnload === 'step2')\n\t\t\thandlingBeforeUnload = false;\n\n\t\treturn false;\n\t}\n\n\tfunction handleBeforeUnloadPart2() {\n\t\tif (handlingBeforeUnload !== 'step1')\n\t\t\treturn false;\n\n\t\t// do the beforeUnload action, then...\n\t\toptions.beforeUnload(stack[stackPointer].page.beforeUnload()).then(result => {\n\n\t\t\t// if the user confirmed, redo the original action\n\t\t\tif (result) {\n\n\t\t\t\thandlingBeforeUnload = 'step2';\n\n\t\t\t\tif (lastNavigationDirection == 'fwd')\n\t\t\t\t\thistory.forward();\n\t\t\t\telse if (lastNavigationDirection == 'back')\n\t\t\t\t\thistory.back();\n\t\t\t} else {\n\t\t\t\thandlingBeforeUnload = false;\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t// listen for browser navigations\n\twindow.addEventListener(\"popstate\", e => {\n\t\tvar interrupted = handleBeforeUnloadPart2();\n\t\tif (interrupted)\n\t\t\treturn;\n\n\t\tlet newUid = e.state?.uid || 0;\n\t\tlet previousUid = stack[stackPointer].uid;\n\n\t\tlastNavigationDirection = newUid > previousUid ? 'fwd' : 'back';\n\t\tlet distance = Math.abs(newUid - previousUid);\n\n\t\tvar interrupted = handleBeforeUnloadPart1();\n\t\tif (interrupted)\n\t\t\treturn;\n\n\t\tvar context = findContext(newUid);\n\t\thandlePopstate(context, lastNavigationDirection, distance);\n\t});\n\n\tif(storageAvailable())\n\t{\n\t\twindow.addEventListener(\"beforeunload\", () => {\n\n\t\t\tlet stackToSerialize = stack.map(s => ({\n\t\t\t\tuid: s.uid,\n\t\t\t\tdata: s.data\n\t\t\t}));\n\t\t\tlet stackToStore = {\n\t\t\t\tstack: stackToSerialize,\n\t\t\t\tstackPointer\n\t\t\t}\n\t\t\twindow.sessionStorage.setItem('stack', JSON.stringify(stackToStore));\n\t\t});\n\t}\n}\n\nfunction findContext(uid){\n\tfor (var i = 0; i < stack.length; i++) {\n\t\tif (stack[i].uid == uid)\n\t\t\treturn stack[i];\n\t}\n\treturn null;\n}\n\nexport function navigate(url, data, checkBeforeUnload) {\n\n\tif (checkBeforeUnload === true && stack[stackPointer].page.beforeUnload && options.beforeUnload) {\n\n\t\tvar interrupt = stack[stackPointer].page.beforeUnload();\n\t\tif (interrupt !== false) {\n\t\t\toptions.beforeUnload(interrupt).then(result => {\n\t\t\t\tif (result)\n\t\t\t\t\tdoNavigate(url, data);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t}\n\n\tdoNavigate(url, data);\n}\n\nexport function update(opts) {\n\tstate[statePointer].data = opts.data;\n}\n\nexport function replace(url, data) {\n\treturn showPage(url, data, { action: 'replace', distance: 0 });\n}\n\nexport function show(url, data) {\n\treturn showPage(url, data, { action: 'show', distance: 0 });\n}\n\nexport function back(data, checkBeforeUnload) {\n\tbackData = data || {};\n\thandlingBeforeUnload = checkBeforeUnload === false ? 'ignore' : false;\n\thistory.go(-1);\n}\n\nexport function printStack() {\n\tconsole.log(\"Stack length: \" + stack.length);\n\tconsole.log(\"Stack pointer: \" + stackPointer);\n\tfor(var i = 0; i < stack.length; i++)\n\t\tconsole.log(stack[i]);\n}\n\nexport function removeHistory(predicate)\n{\n\tlet statesToKeep = [];\n\n\tfor (var i = 0; i < stack.length; i++)\n\t{\n\t\tif (!predicate(stack[i]))\n\t\t\tstatesToKeep.push(stack[i]);\n\t}\n\n\t// TODO: ensure we always have at least 1 state to keep - must/can this always be the current page?\n\n\tif (statesToKeep.length == stack.length)\n\t\treturn Promise.resolve();\n\n\n\treturn new Promise((resolve, reject) => {\n\n\n\t\tlet backsToDo = stackPointer - 1;\n\t\tlet currentUid = -1;\n\n\t\t// TODO: handle stack pointer not being at the tail when this process starts\n\n\t\tmanuallyAdjustingHistory = _ => {\n\t\t\t// rewind to the first history position\n\t\t\tif(backsToDo > 0)\n\t\t\t{\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\tbacksToDo--;\n\t\t\t\t\thistory.back();\n\t\t\t\t}, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// reset the stack\n\t\t\tstack = [];\n\n\t\t\tfor (var k = 0; k < statesToKeep.length; k++) {\n\t\t\t\tlet currentState = statesToKeep[k];\n\t\t\t\tcurrentState.uid = ++currentUid;\n\n\t\t\t\tif (k == 0)\n\t\t\t\t\twindow.history.replaceState({ uid: currentState.uid }, null, currentState.data.route.url);\n\t\t\t\telse\n\t\t\t\t\twindow.history.pushState({ uid: currentState.uid }, null, currentState.data.route.url);\n\t\t\t\t\n\t\t\t\t\t// TODO: this doesnt seem to work when k=0\n\t\t\t\tdocument.title = currentState.page.title;\n\n\t\t\t\tstack.push(currentState);\n\t\t\t}\n\n\t\t\tstackPointer = stack.length - 1;\n\n\t\t\tmanuallyAdjustingHistory = false;\n\t\t};\n\n\t\thistory.back();\n\t});\n}\n\nexport function purgeCache() {\n\tfor (const path in pageCache)\n\t{\n\t\tpageCache[path].page.destroy && pageCache[path].page.destroy();\n\t\tif (!pageCache[path].page.constructor.existingDomSelector)\n\t\t{\n\t\t\tpageCache[path].$html.remove();\n\t\t\tdelete pageCache[path];\n\t\t}\n\t}\n}","export default class PageShowError extends Error {\r\n\tconstructor(url, message, data, action) {\r\n\t\tsuper(message || 'Error showing requested page')\r\n\r\n\t\t// Maintains proper stack trace for where our error was thrown (only available on V8)\r\n\t\tif (Error.captureStackTrace)\r\n\t\t\tError.captureStackTrace(this, PageShowError)\r\n\r\n\t\tthis.name = 'PageShowError'\r\n\t\tthis.url = url;\r\n\t\tthis.data = data;\r\n\t\tthis.action = action;\r\n\t}\r\n}","import Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('loading', '/loading', class extends Page {\r\n\r\n\tstatic existingDomSelector = '#page-loading';\r\n\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","import './page1.htm'\r\nimport Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page1', '/page1', class extends Page {\r\n\r\n\ttitle = \"Page 1\";\r\n\r\n\ttype = 'A';\r\n\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","import './page2.htm'\r\nimport Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page2', '/page2', class extends Page {\r\n\r\n\ttitle = \"Page 2\";\r\n\r\n\ttype = 'A';\r\n\t\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","import './page3.htm'\r\nimport Page from './page.js';\r\nimport * as pageManager from '@trullock/page-manager';\r\n\r\nexport default pageManager.registerPage('page3', '/page3', class extends Page {\r\n\r\n\ttitle = \"Page 3\";\r\n\t\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\r\n\t\t$page.querySelector('.btnRemove').addEventListener('click', e => {\r\n\t\t\tpageManager.removeHistory(state => {\r\n\t\t\t\treturn state.page.type == 'A';\r\n\t\t\t})\r\n\t\t})\r\n\t}\r\n});","import './page4.htm'\r\nimport Page from './page.js';\r\nimport {registerPage} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page4', '/page4', class extends Page {\r\n\r\n\ttitle = \"Page 4\";\r\n\r\n\tconstructor($page) {\r\n\t\tsuper($page);\r\n\t}\r\n});","export default class Page {\r\n\r\n\tdirty = false;\r\n\r\n\tconstructor($page){\r\n\t\tthis.$page = $page;\r\n\t}\r\n\r\n\tget title() {\r\n\t\treturn this.$page.dataset['title'] || 'PageManager'\r\n\t}\r\n\r\n\tboot(opts){\r\n\t\treturn Promise.resolve();\r\n\t}\r\n\r\n\tshow(opts) {\r\n\t\tthis.$page.style.display = 'block';\r\n\t\treturn Promise.resolve();\r\n\t}\r\n\r\n\thide() {\r\n\t\tthis.$page.style.display = 'none';\r\n\t\treturn Promise.resolve();\r\n\t}\r\n}","export default __webpack_public_path__ + \"page1.htm\";","export default __webpack_public_path__ + \"page2.htm\";","export default __webpack_public_path__ + \"page3.htm\";","export default __webpack_public_path__ + \"page4.htm\";","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","import * as pageManager from '../src/index.js'\r\n\r\nimport pageLoading from './page-loading.js'\r\nimport page1 from './page-page1.js'\r\nimport page2 from './page-page2.js'\r\nimport page3 from './page-page3.js'\r\nimport page4 from './page-page4.js'\r\n\r\nwindow.addEventListener('DOMContentLoaded', function () {\r\n\tpageManager.init({\r\n\t\tpageContainer: () => document.body,\r\n\t\tfetchPath: route => '/pages/' + route.routeName + '.htm',\r\n\t});\r\n\r\n\r\n\t// listen for navigations\r\n\tdocument.addEventListener('click', e => {\r\n\t\tif (e.ctrlKey || e.metaKey)\r\n\t\t\treturn;\r\n\r\n\t\tvar $a = e.target.matches('a') ? e.target : e.target.closest('a');\r\n\t\tif (!$a)\r\n\t\t\treturn;\r\n\r\n\t\tvar href = $a.pathname + $a.search + $a.hash;\r\n\t\tpageManager.navigate(href)\r\n\r\n\t\te.preventDefault();\r\n\t}, false);\r\n\r\n\tdocument.querySelector('.btnStack').addEventListener('click', e => {\r\n\t\tpageManager.printStack();\r\n\t})\r\n});"],"sourceRoot":""}