@trullock/page-manager 0.7.0 → 0.7.1
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 +2 -3
- package/readme.md +119 -0
- package/src/index.js +22 -4
- package/src/page.js +48 -0
- package/tests/dist/index.html +1 -0
- package/tests/dist/main.js +62 -23
- package/tests/dist/main.js.map +1 -1
- package/tests/dist/page404.htm +3 -0
- package/tests/index.html +1 -0
- package/tests/lolpack.js +2 -0
- package/tests/page-page4.js +6 -1
- package/tests/page-page404.js +12 -0
- package/tests/page404.htm +3 -0
- package/src/pageshowerror.js +0 -14
package/package.json
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trullock/page-manager",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Single page app manager",
|
|
5
5
|
"exports": {
|
|
6
|
-
".": "./src/index.js"
|
|
7
|
-
"./pageshowerror": "./src/pageshowerror.js"
|
|
6
|
+
".": "./src/index.js"
|
|
8
7
|
},
|
|
9
8
|
"module": "./src/index.js",
|
|
10
9
|
"type": "module",
|
package/readme.md
CHANGED
|
@@ -1,3 +1,122 @@
|
|
|
1
|
+
# Page Manager
|
|
2
|
+
|
|
3
|
+
This project provides a skeleton for building single page webapps, with a focus on advanced browser navigation support and history manipulation.
|
|
4
|
+
|
|
5
|
+
## Pages
|
|
6
|
+
|
|
7
|
+
Create a basic page like this:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
import {registerPage, Page} from '@trullock/page-manager';
|
|
11
|
+
registerPage('view-thing', '/things/{thingId}', class extends Page {
|
|
12
|
+
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The first argument `'view-thing'` is the name of the page, this can be used to build/look-up its url later without needing to hardcode url strings everywhere
|
|
18
|
+
|
|
19
|
+
The second argument `'/things/{thingId}'` is the url (route) of the page
|
|
20
|
+
|
|
21
|
+
The third arguent is a class definition for the page.
|
|
22
|
+
|
|
23
|
+
### Routing
|
|
24
|
+
|
|
25
|
+
Routes are definied in a simple way, e.g.
|
|
26
|
+
|
|
27
|
+
* `/path/to/my/page`
|
|
28
|
+
* `/things/{thingId}`
|
|
29
|
+
* `/parentThings/{parentId}/childThings/{childId}`
|
|
30
|
+
|
|
31
|
+
Query strings are always decoded and captured, they do not need specifying in the route.
|
|
32
|
+
|
|
33
|
+
To build a URL from a route and some parameters, do this:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
import { getPath, registerPage } from '@trullock/page-manager';
|
|
37
|
+
|
|
38
|
+
registerPage('view-thing', '/things/{thingId}', class extends Page { } );
|
|
39
|
+
|
|
40
|
+
let url = getPath('view-thing', { thingId: 1 })
|
|
41
|
+
// url == '/things/1'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Page methods
|
|
45
|
+
|
|
46
|
+
#### Constructor
|
|
47
|
+
|
|
48
|
+
A page's constructor is called when an instance of the page is first created. Assuming the default caching policy this will only happen once per route definition. See the Caching section for more info.
|
|
49
|
+
|
|
50
|
+
The constructor is called without any knowledge of the URL it was requested on, for that use `boot(opts)`.
|
|
51
|
+
|
|
52
|
+
The page markup is accessible in the constructor but it has not yet been attached to the main page DOM.
|
|
53
|
+
|
|
54
|
+
e.g.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
constructor($page){
|
|
58
|
+
super($page);
|
|
59
|
+
|
|
60
|
+
this.$thingName = $page.getElementById('ThingName');
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
#### Boot
|
|
65
|
+
|
|
66
|
+
`boot(opts)` is called once the page has been attached to the DOM and is about to be shown for the first time. Assuming the default caching policy this will only happen once per route definition. See the Caching section for more info.
|
|
67
|
+
|
|
68
|
+
`opts` contains information about the request that was made to the page:
|
|
69
|
+
|
|
70
|
+
`opts.event` contains information about the navigation which occurred to this page.
|
|
71
|
+
|
|
72
|
+
`opts.hash` contains any hash fragment from the request url
|
|
73
|
+
|
|
74
|
+
`opts.route` contains information about the route and the request url and parameters
|
|
75
|
+
|
|
76
|
+
Any query or url parameters will also be present on opts. Currently these are at the top level meaning you could get conflicts between the formally defined properties above and any parameters. For now, avoid creating conflicting parameters with these names.
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
e.g. get a `Thing` from the database based on a url parameter and update the page markup with details of the `Thing`
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
async boot(opts){
|
|
83
|
+
let thing = await getThing(opts.thingId);
|
|
84
|
+
this.$thingName.textContent = thing.name;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### Show
|
|
89
|
+
|
|
90
|
+
`show(opts)` is called before the page is shown. This may happen multiple times in a page's life.
|
|
91
|
+
|
|
92
|
+
Assuming the default caching strategy, the markup for a page will remain between consecutive show/hide events. Consequently any content which is present on one show which should not be on the next show will need manually adjusting.
|
|
93
|
+
|
|
94
|
+
e.g. Update the time the page was shown, every time its shown
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
constructor($page){
|
|
98
|
+
super($page);
|
|
99
|
+
this.$time = $page.getElementById('Time');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async show(opts){
|
|
103
|
+
this.$time.textContent = new Date().getTime();
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Update
|
|
108
|
+
|
|
109
|
+
`update(opts)` is similar to show. If `pageManager.navigate()` is called to the same url (route) as the current page, `show` and `hide` are not called as you might expect, instead `update(opts)` gets called where you can update the page with the new information from `opts`
|
|
110
|
+
|
|
111
|
+
#### Hide
|
|
112
|
+
`hide()` is called when the page needs hiding, i.e. the user has navigated away and the next page is about to be shown.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
async hide(){
|
|
117
|
+
// Do some clean up, like stopping any animations which may be happening
|
|
118
|
+
}
|
|
119
|
+
```
|
|
1
120
|
|
|
2
121
|
|
|
3
122
|
## Page Container
|
package/src/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import router from '@trullock/router';
|
|
2
|
-
import PageShowError from './pageshowerror.js';
|
|
3
2
|
|
|
4
3
|
var pageHash = {},
|
|
5
4
|
pageCache = {},
|
|
@@ -102,7 +101,7 @@ function showLoading() {
|
|
|
102
101
|
|
|
103
102
|
var page = pageCache[page.url].page;
|
|
104
103
|
|
|
105
|
-
return page.show(data);
|
|
104
|
+
return Promise.resolve(page.show(data));
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
function loadPage(route, data) {
|
|
@@ -216,7 +215,7 @@ function doShow(page, data) {
|
|
|
216
215
|
|
|
217
216
|
window.scroll(0, 0);
|
|
218
217
|
|
|
219
|
-
return page.show(data)
|
|
218
|
+
return Promise.resolve(page.show(data))
|
|
220
219
|
.then(() => document.title = page.title)
|
|
221
220
|
// todo: hide() should be passed an event object
|
|
222
221
|
.then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())
|
|
@@ -493,7 +492,11 @@ export function navigate(url, data, checkBeforeUnload) {
|
|
|
493
492
|
}
|
|
494
493
|
}
|
|
495
494
|
|
|
496
|
-
doNavigate(url, data)
|
|
495
|
+
doNavigate(url, data).catch(e => {
|
|
496
|
+
console.error(e);
|
|
497
|
+
if (e instanceof PageShowError)
|
|
498
|
+
return showPage(e.url, e.data, { action: e.action || 'show' });
|
|
499
|
+
});
|
|
497
500
|
}
|
|
498
501
|
|
|
499
502
|
export function replace(url, data) {
|
|
@@ -589,4 +592,19 @@ export function purgeCache() {
|
|
|
589
592
|
delete pageCache[path];
|
|
590
593
|
}
|
|
591
594
|
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
export class PageShowError extends Error {
|
|
598
|
+
constructor(url, message, data, action) {
|
|
599
|
+
super(message || 'Error showing requested page')
|
|
600
|
+
|
|
601
|
+
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
602
|
+
if (Error.captureStackTrace)
|
|
603
|
+
Error.captureStackTrace(this, PageShowError)
|
|
604
|
+
|
|
605
|
+
this.name = 'PageShowError'
|
|
606
|
+
this.url = url;
|
|
607
|
+
this.data = data;
|
|
608
|
+
this.action = action;
|
|
609
|
+
}
|
|
592
610
|
}
|
package/src/page.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export default class Page {
|
|
2
|
+
|
|
3
|
+
constructor($page){
|
|
4
|
+
this.$page = $page;
|
|
5
|
+
this.visible = false;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
invalidateCache(){
|
|
9
|
+
// TODO: pagemanager doesnt currently read this
|
|
10
|
+
this.dirty = true;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
_title = null;
|
|
14
|
+
get title() {
|
|
15
|
+
return this._title;
|
|
16
|
+
}
|
|
17
|
+
set title(value) {
|
|
18
|
+
this._title = value;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
boot(opts){
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
update(data) {
|
|
26
|
+
return Promise.resolve();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
show(opts) {
|
|
30
|
+
if(!this.visible)
|
|
31
|
+
{
|
|
32
|
+
this.$page.style.display = 'block';
|
|
33
|
+
this.visible = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return Promise.resolve();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
hide() {
|
|
40
|
+
if(this.visible)
|
|
41
|
+
{
|
|
42
|
+
this.$page.style.display = 'none';
|
|
43
|
+
this.visible = false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
}
|
|
48
|
+
}
|
package/tests/dist/index.html
CHANGED
package/tests/dist/main.js
CHANGED
|
@@ -58,6 +58,20 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
58
58
|
|
|
59
59
|
/***/ }),
|
|
60
60
|
|
|
61
|
+
/***/ "./tests/page404.htm":
|
|
62
|
+
/*!***************************!*\
|
|
63
|
+
!*** ./tests/page404.htm ***!
|
|
64
|
+
\***************************/
|
|
65
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
66
|
+
|
|
67
|
+
__webpack_require__.r(__webpack_exports__);
|
|
68
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
69
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
70
|
+
/* harmony export */ });
|
|
71
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "page404.htm");
|
|
72
|
+
|
|
73
|
+
/***/ }),
|
|
74
|
+
|
|
61
75
|
/***/ "./node_modules/@trullock/router/src/index.js":
|
|
62
76
|
/*!****************************************************!*\
|
|
63
77
|
!*** ./node_modules/@trullock/router/src/index.js ***!
|
|
@@ -549,6 +563,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
549
563
|
|
|
550
564
|
__webpack_require__.r(__webpack_exports__);
|
|
551
565
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
566
|
+
/* harmony export */ "PageShowError": () => (/* binding */ PageShowError),
|
|
552
567
|
/* harmony export */ "back": () => (/* binding */ back),
|
|
553
568
|
/* harmony export */ "getPath": () => (/* binding */ getPath),
|
|
554
569
|
/* harmony export */ "init": () => (/* binding */ init),
|
|
@@ -563,8 +578,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
563
578
|
/* harmony export */ "show": () => (/* binding */ show)
|
|
564
579
|
/* harmony export */ });
|
|
565
580
|
/* harmony import */ var _trullock_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @trullock/router */ "./node_modules/@trullock/router/src/index.js");
|
|
566
|
-
/* harmony import */ var _pageshowerror_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pageshowerror.js */ "./src/pageshowerror.js");
|
|
567
|
-
|
|
568
581
|
|
|
569
582
|
var pageHash = {},
|
|
570
583
|
pageCache = {},
|
|
@@ -646,7 +659,7 @@ function showLoading() {
|
|
|
646
659
|
}
|
|
647
660
|
};
|
|
648
661
|
var page = pageCache[page.url].page;
|
|
649
|
-
return page.show(data);
|
|
662
|
+
return Promise.resolve(page.show(data));
|
|
650
663
|
}
|
|
651
664
|
function loadPage(route, data) {
|
|
652
665
|
var fetchPage = pageTemplateCache[route.pattern] ? Promise.resolve(pageTemplateCache[route.pattern]) : options.fetchPageTemplate(route);
|
|
@@ -668,8 +681,8 @@ function showPage(url, data, event) {
|
|
|
668
681
|
if (route == null) {
|
|
669
682
|
console.error(`Can't find page: '${url}'`);
|
|
670
683
|
let page404 = pageHash[options.error404PageName];
|
|
671
|
-
if (!page404) return Promise.reject(new
|
|
672
|
-
return Promise.reject(new
|
|
684
|
+
if (!page404) return Promise.reject(new PageShowError('/', `Can't find page: '${url}'. Also can't find 404 page: '${options.error404PageName}'`, {}, 'replace'));
|
|
685
|
+
return Promise.reject(new PageShowError(page404.url, `Can't find page: '${url}'`, {}, 'replace'));
|
|
673
686
|
}
|
|
674
687
|
data = data || {};
|
|
675
688
|
for (let key in route.params) data[key] = route.params[key];
|
|
@@ -735,7 +748,7 @@ function showPage(url, data, event) {
|
|
|
735
748
|
|
|
736
749
|
function doShow(page, data) {
|
|
737
750
|
window.scroll(0, 0);
|
|
738
|
-
return page.show(data).then(() => document.title = page.title)
|
|
751
|
+
return Promise.resolve(page.show(data)).then(() => document.title = page.title)
|
|
739
752
|
// todo: hide() should be passed an event object
|
|
740
753
|
.then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())
|
|
741
754
|
// return page
|
|
@@ -838,7 +851,7 @@ async function init(opts) {
|
|
|
838
851
|
distance: 0
|
|
839
852
|
}).catch(e => {
|
|
840
853
|
console.error(e);
|
|
841
|
-
if (e instanceof
|
|
854
|
+
if (e instanceof PageShowError) {
|
|
842
855
|
return showPage(e.url, e.data, {
|
|
843
856
|
action: stackPointer == -1 ? 'load' : e.action || 'show'
|
|
844
857
|
}).then(page => {
|
|
@@ -864,7 +877,7 @@ async function init(opts) {
|
|
|
864
877
|
distance
|
|
865
878
|
}).catch(e => {
|
|
866
879
|
console.error(e);
|
|
867
|
-
if (e instanceof
|
|
880
|
+
if (e instanceof PageShowError) return showPage(e.url, e.data, {
|
|
868
881
|
action: e.action || 'show'
|
|
869
882
|
});
|
|
870
883
|
}).then(page => {
|
|
@@ -968,7 +981,12 @@ function navigate(url, data, checkBeforeUnload) {
|
|
|
968
981
|
return;
|
|
969
982
|
}
|
|
970
983
|
}
|
|
971
|
-
doNavigate(url, data)
|
|
984
|
+
doNavigate(url, data).catch(e => {
|
|
985
|
+
console.error(e);
|
|
986
|
+
if (e instanceof PageShowError) return showPage(e.url, e.data, {
|
|
987
|
+
action: e.action || 'show'
|
|
988
|
+
});
|
|
989
|
+
});
|
|
972
990
|
}
|
|
973
991
|
function replace(url, data) {
|
|
974
992
|
url = expandOnlyHash(url);
|
|
@@ -1048,19 +1066,6 @@ function purgeCache() {
|
|
|
1048
1066
|
}
|
|
1049
1067
|
}
|
|
1050
1068
|
}
|
|
1051
|
-
|
|
1052
|
-
/***/ }),
|
|
1053
|
-
|
|
1054
|
-
/***/ "./src/pageshowerror.js":
|
|
1055
|
-
/*!******************************!*\
|
|
1056
|
-
!*** ./src/pageshowerror.js ***!
|
|
1057
|
-
\******************************/
|
|
1058
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1059
|
-
|
|
1060
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1061
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1062
|
-
/* harmony export */ "default": () => (/* binding */ PageShowError)
|
|
1063
|
-
/* harmony export */ });
|
|
1064
1069
|
class PageShowError extends Error {
|
|
1065
1070
|
constructor(url, message, data, action) {
|
|
1066
1071
|
super(message || 'Error showing requested page');
|
|
@@ -1223,6 +1228,37 @@ function _toPrimitive(input, hint) { if (typeof input !== "object" || input ===
|
|
|
1223
1228
|
super($page);
|
|
1224
1229
|
_defineProperty(this, "title", "Page 4");
|
|
1225
1230
|
}
|
|
1231
|
+
show(opts) {
|
|
1232
|
+
throw new _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.PageShowError('/page1', 'Cant show page4, showing page1 instead', {}, 'replace');
|
|
1233
|
+
}
|
|
1234
|
+
}));
|
|
1235
|
+
|
|
1236
|
+
/***/ }),
|
|
1237
|
+
|
|
1238
|
+
/***/ "./tests/page-page404.js":
|
|
1239
|
+
/*!*******************************!*\
|
|
1240
|
+
!*** ./tests/page-page404.js ***!
|
|
1241
|
+
\*******************************/
|
|
1242
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1243
|
+
|
|
1244
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1245
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1246
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1247
|
+
/* harmony export */ });
|
|
1248
|
+
/* harmony import */ var _page404_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page404.htm */ "./tests/page404.htm");
|
|
1249
|
+
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1250
|
+
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1251
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
1252
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1253
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage)('page404', '/404', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1258
|
+
constructor($page) {
|
|
1259
|
+
super($page);
|
|
1260
|
+
_defineProperty(this, "title", "Page 404");
|
|
1261
|
+
}
|
|
1226
1262
|
}));
|
|
1227
1263
|
|
|
1228
1264
|
/***/ }),
|
|
@@ -1340,6 +1376,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1340
1376
|
/* harmony import */ var _page_page2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./page-page2.js */ "./tests/page-page2.js");
|
|
1341
1377
|
/* harmony import */ var _page_page3_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./page-page3.js */ "./tests/page-page3.js");
|
|
1342
1378
|
/* harmony import */ var _page_page4_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./page-page4.js */ "./tests/page-page4.js");
|
|
1379
|
+
/* harmony import */ var _page_page404_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./page-page404.js */ "./tests/page-page404.js");
|
|
1380
|
+
|
|
1343
1381
|
|
|
1344
1382
|
|
|
1345
1383
|
|
|
@@ -1349,7 +1387,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1349
1387
|
window.addEventListener('DOMContentLoaded', function () {
|
|
1350
1388
|
_src_index_js__WEBPACK_IMPORTED_MODULE_0__.init({
|
|
1351
1389
|
pageContainer: () => document.body,
|
|
1352
|
-
fetchPath: route => '/pages/' + route.routeName + '.htm'
|
|
1390
|
+
fetchPath: route => '/pages/' + route.routeName + '.htm',
|
|
1391
|
+
error404PageName: 'page404'
|
|
1353
1392
|
});
|
|
1354
1393
|
|
|
1355
1394
|
// listen for navigations
|
package/tests/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","mappings":";;;;;;;;;;;;;;AAAA,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;;ACAP;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe,cAAc,6BAA6B;AAC1G;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe;AACf;AACA;AACA;AACA,sBAAsB,6DAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,KAAK;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;;;;;;;;;;;;;;AC3NH,6BAAe,sCAAY;AAC3B;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,wBAAwB,OAAO,SAAS;AACxC;AACA;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,4CAA4C,EAAE;AAC9C,YAAY,IAAI,OAAO;AACvB;AACA,IAAI;AACJ;AACA;AACA,+CAA+C;AAC/C,YAAY,IAAI,KAAK;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3OsC;AACS;AAE/C,IAAIE,QAAQ,GAAG,CAAC,CAAC;EAChBC,SAAS,GAAG,CAAC,CAAC;EACdC,iBAAiB,GAAG,CAAC,CAAC;EACtBC,KAAK,GAAG,EAAE;EACVC,YAAY,GAAG,CAAC,CAAC;AAElB,IAAIC,wBAAwB,GAAG,KAAK;AACpC,IAAIC,oBAAoB,GAAG,KAAK;AAChC,IAAIC,uBAAuB,GAAG,IAAI;AAElC,IAAIC,IAAI,GAAG,IAAI;AACf,IAAIC,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAIC,OAAO,GAAG;EACbC,SAAS,EAAEC,KAAK,IAAI,SAAS,GAAGA,KAAK,CAACC,SAAS,GAAG,OAAO;EACzDC,iBAAiB,EAAEF,KAAK,IAAI;IAC3B,OAAOG,KAAK,CAACL,OAAO,CAACC,SAAS,CAACC,KAAK,CAAC,CAAC,CACpCI,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,EAAE,CAAC,CACnBF,IAAI,CAACG,IAAI,IAAI;MACb,IAAIC,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MACxCF,IAAI,CAACG,SAAS,GAAGJ,IAAI;MACrB;MACA,OAAO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","sources":["webpack://@trullock/page-manager/./tests/page1.htm","webpack://@trullock/page-manager/./tests/page2.htm","webpack://@trullock/page-manager/./tests/page3.htm","webpack://@trullock/page-manager/./tests/page4.htm","webpack://@trullock/page-manager/./node_modules/@trullock/router/src/index.js","webpack://@trullock/page-manager/./node_modules/@trullock/router/src/pattern-lexer.js","webpack://@trullock/page-manager/./src/index.js","webpack://@trullock/page-manager/./src/pageshowerror.js","webpack://@trullock/page-manager/./tests/page-loading.js","webpack://@trullock/page-manager/./tests/page-page1.js","webpack://@trullock/page-manager/./tests/page-page2.js","webpack://@trullock/page-manager/./tests/page-page3.js","webpack://@trullock/page-manager/./tests/page-page4.js","webpack://@trullock/page-manager/./tests/page.js","webpack://@trullock/page-manager/webpack/bootstrap","webpack://@trullock/page-manager/webpack/runtime/define property getters","webpack://@trullock/page-manager/webpack/runtime/hasOwnProperty shorthand","webpack://@trullock/page-manager/webpack/runtime/make namespace object","webpack://@trullock/page-manager/webpack/runtime/publicPath","webpack://@trullock/page-manager/./tests/lolpack.js"],"sourcesContent":["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\";","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\tattachMarkup: $html => document.body.appendChild($html),\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(argA, argB, argC) {\n\n\tlet namedRoutes = null, \n\t\tpageClass = null;\n\n\tif(argC == undefined)\n\t{\n\t\tnamedRoutes = argA;\n\t\tpageClass = argB;\n\t} else {\n\t\tnamedRoutes = {\n\t\t\t[argA]: argB\n\t\t};\n\t\tpageClass = argC;\n\t}\n\t\n\n\tfor (const [name, route] of Object.entries(namedRoutes)) {\n\t\trouter.addRoute(name, route, pageClass);\n\n\t\tpageHash[name] = {\n\t\t\turl: route,\n\t\t\tpageClass: pageClass\n\t\t}\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\nexport function refresh() {\n\tlet frame = stack[stackPointer];\n\tshowPage(frame.data.route.url, frame.data, 'replace');\n}\n\n// TODO: 404 and error too?\nfunction initLoading()\n{\n\tvar page = pageHash[options.loadingPageName];\n\tvar route = router.parse(page.url);\n\treturn loadPage(route, {});\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.attachMarkup($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\t\n\t\tlet booted = new Promise(resolve => resolve(page.boot(data)));\n\t\treturn booted.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\tlet page404 = pageHash[options.error404PageName];\n\t\tif(!page404)\n\t\t\treturn Promise.reject(new PageShowError('/', `Can't find page: '${url}'. Also can't find 404 page: '${options.error404PageName}'`, {}, 'replace'));\n\n\t\treturn Promise.reject(new PageShowError(page404.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\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 => doShow(page, data))\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}\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 => doUpdate(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 page.show(data)\n\t\t\t.then(() => document.title = page.title)\n\t\t\t// todo: hide() should be passed an event object\n\t\t\t.then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())\n\t\t\t// return page\n\t\t\t.then(() => page);\n}\n\n\nasync function doUpdate(page, data) {\n\n\tawait Promise.resolve(page.update(data));\n\n\tdocument.title = page.title\n\t// todo: hide() should be passed an event object\n\tawait pageCache[pageHash[options.loadingPageName].url].page.hide()\n\treturn 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\treturn false;\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 async 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\t\t\t\n\t\t\t// TODO: this is inefficient for non parameterised routes. There will always be HTML in memory and then copied for the page once loaded\n\t\t\tpageTemplateCache[router.routesByName[key]._pattern] = $html;\n\t\t\t$html.parentElement.removeChild($html);\t\n\t\t}\n\t}\n\n\tawait initLoading();\n\t\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\t\n\t\tif (e instanceof PageShowError)\n\t\t{\n\t\t\treturn showPage(e.url, e.data, { action: stackPointer == -1 ? 'load' : e.action || 'show' }).then(page => {\n\t\t\t\tif(e.action == 'replace')\n\t\t\t\t\thandleHistoryAction({ action: e.action }, e.url, e.data, page);\n\t\t\t\treturn page;\n\t\t\t});\n\t\t\t\n\t\t}\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\nfunction expandOnlyHash(url)\n{\n\tif(url.startsWith('#'))\n\t{\n\t\tlet currentState = stack[stackPointer];\n\t\tlet currentUrl = currentState.data.route.url;\n\t\tlet hashIndex = currentUrl.indexOf('#');\n\t\tif(hashIndex > -1)\n\t\t\treturn currentUrl.substr(0, hashIndex);\n\t\treturn currentUrl + url;\n\t}\n\n\treturn url;\n}\n\nexport function navigate(url, data, checkBeforeUnload) {\n\n\turl = expandOnlyHash(url);\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 replace(url, data) {\n\turl = expandOnlyHash(url);\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\tfor (var i = 0; i < stack.length; i++)\n\t{\n\t\tif (!predicate(stack[i], 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, refresh} 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\r\n\t\t$page.querySelector('button').addEventListener('click', e => {\r\n\t\t\trefresh();\r\n\t\t})\r\n\t}\r\n\r\n\tupdate(data) {\r\n\t\tthis.$page.querySelector('.js-time').textContent = new Date().getTime();\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\tupdate() {\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}","// 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});"],"names":["router","PageShowError","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","attachMarkup","$html","body","appendChild","prepareMarkup","loadingPageName","error404PageName","defaultPageName","beforeUnload","pages","registerPage","argA","argB","argC","namedRoutes","pageClass","undefined","name","Object","entries","addRoute","url","getPath","values","interpolate","hash","refresh","frame","showPage","data","initLoading","page","parse","loadPage","showLoading","scrollY","window","event","action","show","fetchPage","Promise","resolve","cloneNode","path","booted","boot","console","error","page404","reject","key","params","interrupt","getPage","doShow","push","uid","currentState","handleHistoryAction","doUpdate","all","hide","results","scroll","title","update","newUid","history","pushState","splice","length","currentUid","replaceState","pop","distance","doNavigate","fallback","storageAvailable","x","sessionStorage","setItem","removeItem","e","init","opts","assign","storedStack","getItem","JSON","existingDomSelector","querySelector","routesByName","_pattern","parentElement","removeChild","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","expandOnlyHash","startsWith","currentUrl","hashIndex","indexOf","substr","navigate","checkBeforeUnload","replace","go","printStack","log","removeHistory","predicate","statesToKeep","backsToDo","_","k","purgeCache","destroy","constructor","remove","Error","message","captureStackTrace","Page","_class","$page","_defineProperty","textContent","Date","getTime","pageManager","type","dataset","style","display","pageLoading","page1","page2","page3","page4","pageContainer","ctrlKey","metaKey","$a","target","matches","closest","href","preventDefault"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"main.js","mappings":";;;;;;;;;;;;;;AAAA,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,cAAc;;;;;;;;;;;;;;ACApD,iEAAe,qBAAuB,gBAAgB;;;;;;;;;;;;;;;ACAT;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe,cAAc,6BAA6B;AAC1G;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe;AACf;AACA;AACA;AACA,sBAAsB,6DAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,sCAAsC,oBAAoB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,KAAK;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE;;;;;;;;;;;;;;AC3NH,6BAAe,sCAAY;AAC3B;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,wBAAwB,OAAO,SAAS;AACxC;AACA;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,4CAA4C,EAAE;AAC9C,YAAY,IAAI,OAAO;AACvB;AACA,IAAI;AACJ;AACA;AACA,+CAA+C;AAC/C,YAAY,IAAI,KAAK;AACrB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,IAAI;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3OsC;AAEtC,IAAIC,QAAQ,GAAG,CAAC,CAAC;EAChBC,SAAS,GAAG,CAAC,CAAC;EACdC,iBAAiB,GAAG,CAAC,CAAC;EACtBC,KAAK,GAAG,EAAE;EACVC,YAAY,GAAG,CAAC,CAAC;AAElB,IAAIC,wBAAwB,GAAG,KAAK;AACpC,IAAIC,oBAAoB,GAAG,KAAK;AAChC,IAAIC,uBAAuB,GAAG,IAAI;AAElC,IAAIC,IAAI,GAAG,IAAI;AACf,IAAIC,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAIC,OAAO,GAAG;EACbC,SAAS,EAAEC,KAAK,IAAI,SAAS,GAAGA,KAAK,CAACC,SAAS,GAAG,OAAO;EACzDC,iBAAiB,EAAEF,KAAK,IAAI;IAC3B,OAAOG,KAAK,CAACL,OAAO,CAACC,SAAS,CAACC,KAAK,CAAC,CAAC,CACpCI,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,EAAE,CAAC,CACnBF,IAAI,CAACG,IAAI,IAAI;MACb,IAAIC,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MACxCF,IAAI,CAA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","sources":["webpack://@trullock/page-manager/./tests/page1.htm","webpack://@trullock/page-manager/./tests/page2.htm","webpack://@trullock/page-manager/./tests/page3.htm","webpack://@trullock/page-manager/./tests/page4.htm","webpack://@trullock/page-manager/./tests/page404.htm","webpack://@trullock/page-manager/./node_modules/@trullock/router/src/index.js","webpack://@trullock/page-manager/./node_modules/@trullock/router/src/pattern-lexer.js","webpack://@trullock/page-manager/./src/index.js","webpack://@trullock/page-manager/./tests/page-loading.js","webpack://@trullock/page-manager/./tests/page-page1.js","webpack://@trullock/page-manager/./tests/page-page2.js","webpack://@trullock/page-manager/./tests/page-page3.js","webpack://@trullock/page-manager/./tests/page-page4.js","webpack://@trullock/page-manager/./tests/page-page404.js","webpack://@trullock/page-manager/./tests/page.js","webpack://@trullock/page-manager/webpack/bootstrap","webpack://@trullock/page-manager/webpack/runtime/define property getters","webpack://@trullock/page-manager/webpack/runtime/hasOwnProperty shorthand","webpack://@trullock/page-manager/webpack/runtime/make namespace object","webpack://@trullock/page-manager/webpack/runtime/publicPath","webpack://@trullock/page-manager/./tests/lolpack.js"],"sourcesContent":["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\";","export default __webpack_public_path__ + \"page404.htm\";","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';\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\tattachMarkup: $html => document.body.appendChild($html),\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(argA, argB, argC) {\n\n\tlet namedRoutes = null, \n\t\tpageClass = null;\n\n\tif(argC == undefined)\n\t{\n\t\tnamedRoutes = argA;\n\t\tpageClass = argB;\n\t} else {\n\t\tnamedRoutes = {\n\t\t\t[argA]: argB\n\t\t};\n\t\tpageClass = argC;\n\t}\n\t\n\n\tfor (const [name, route] of Object.entries(namedRoutes)) {\n\t\trouter.addRoute(name, route, pageClass);\n\n\t\tpageHash[name] = {\n\t\t\turl: route,\n\t\t\tpageClass: pageClass\n\t\t}\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\nexport function refresh() {\n\tlet frame = stack[stackPointer];\n\tshowPage(frame.data.route.url, frame.data, 'replace');\n}\n\n// TODO: 404 and error too?\nfunction initLoading()\n{\n\tvar page = pageHash[options.loadingPageName];\n\tvar route = router.parse(page.url);\n\treturn loadPage(route, {});\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 Promise.resolve(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.attachMarkup($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\t\n\t\tlet booted = new Promise(resolve => resolve(page.boot(data)));\n\t\treturn booted.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\tlet page404 = pageHash[options.error404PageName];\n\t\tif(!page404)\n\t\t\treturn Promise.reject(new PageShowError('/', `Can't find page: '${url}'. Also can't find 404 page: '${options.error404PageName}'`, {}, 'replace'));\n\n\t\treturn Promise.reject(new PageShowError(page404.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\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 => doShow(page, data))\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}\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 => doUpdate(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 Promise.resolve(page.show(data))\n\t\t\t.then(() => document.title = page.title)\n\t\t\t// todo: hide() should be passed an event object\n\t\t\t.then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())\n\t\t\t// return page\n\t\t\t.then(() => page);\n}\n\n\nasync function doUpdate(page, data) {\n\n\tawait Promise.resolve(page.update(data));\n\n\tdocument.title = page.title\n\t// todo: hide() should be passed an event object\n\tawait pageCache[pageHash[options.loadingPageName].url].page.hide()\n\treturn 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\treturn false;\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 async 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\t\t\t\n\t\t\t// TODO: this is inefficient for non parameterised routes. There will always be HTML in memory and then copied for the page once loaded\n\t\t\tpageTemplateCache[router.routesByName[key]._pattern] = $html;\n\t\t\t$html.parentElement.removeChild($html);\t\n\t\t}\n\t}\n\n\tawait initLoading();\n\t\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\t\n\t\tif (e instanceof PageShowError)\n\t\t{\n\t\t\treturn showPage(e.url, e.data, { action: stackPointer == -1 ? 'load' : e.action || 'show' }).then(page => {\n\t\t\t\tif(e.action == 'replace')\n\t\t\t\t\thandleHistoryAction({ action: e.action }, e.url, e.data, page);\n\t\t\t\treturn page;\n\t\t\t});\n\t\t\t\n\t\t}\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\nfunction expandOnlyHash(url)\n{\n\tif(url.startsWith('#'))\n\t{\n\t\tlet currentState = stack[stackPointer];\n\t\tlet currentUrl = currentState.data.route.url;\n\t\tlet hashIndex = currentUrl.indexOf('#');\n\t\tif(hashIndex > -1)\n\t\t\treturn currentUrl.substr(0, hashIndex);\n\t\treturn currentUrl + url;\n\t}\n\n\treturn url;\n}\n\nexport function navigate(url, data, checkBeforeUnload) {\n\n\turl = expandOnlyHash(url);\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).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\nexport function replace(url, data) {\n\turl = expandOnlyHash(url);\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\tfor (var i = 0; i < stack.length; i++)\n\t{\n\t\tif (!predicate(stack[i], 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}\n\nexport class PageShowError extends Error {\n\tconstructor(url, message, data, action) {\n\t\tsuper(message || 'Error showing requested page')\n\n\t\t// Maintains proper stack trace for where our error was thrown (only available on V8)\n\t\tif (Error.captureStackTrace)\n\t\t\tError.captureStackTrace(this, PageShowError)\n\n\t\tthis.name = 'PageShowError'\n\t\tthis.url = url;\n\t\tthis.data = data;\n\t\tthis.action = action;\n\t}\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, refresh} 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\r\n\t\t$page.querySelector('button').addEventListener('click', e => {\r\n\t\t\trefresh();\r\n\t\t})\r\n\t}\r\n\r\n\tupdate(data) {\r\n\t\tthis.$page.querySelector('.js-time').textContent = new Date().getTime();\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, PageShowError} 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\r\n\tshow(opts)\r\n\t{\r\n\t\tthrow new PageShowError('/page1', 'Cant show page4, showing page1 instead', {}, 'replace')\r\n\t}\r\n});","import './page404.htm'\r\nimport Page from './page.js';\r\nimport {registerPage, PageShowError} from '@trullock/page-manager';\r\n\r\nexport default registerPage('page404', '/404', class extends Page {\r\n\r\n\ttitle = \"Page 404\";\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\tupdate() {\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}","// 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\nimport page404 from './page-page404.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\terror404PageName: 'page404'\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});"],"names":["router","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","attachMarkup","$html","body","appendChild","prepareMarkup","loadingPageName","error404PageName","defaultPageName","beforeUnload","pages","registerPage","argA","argB","argC","namedRoutes","pageClass","undefined","name","Object","entries","addRoute","url","getPath","values","interpolate","hash","refresh","frame","showPage","data","initLoading","page","parse","loadPage","showLoading","scrollY","window","event","action","Promise","resolve","show","fetchPage","cloneNode","path","booted","boot","console","error","page404","reject","PageShowError","key","params","interrupt","getPage","doShow","push","uid","currentState","handleHistoryAction","doUpdate","all","hide","results","scroll","title","update","newUid","history","pushState","splice","length","currentUid","replaceState","pop","distance","doNavigate","fallback","storageAvailable","x","sessionStorage","setItem","removeItem","e","init","opts","assign","storedStack","getItem","JSON","existingDomSelector","querySelector","routesByName","_pattern","parentElement","removeChild","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","expandOnlyHash","startsWith","currentUrl","hashIndex","indexOf","substr","navigate","checkBeforeUnload","replace","go","printStack","log","removeHistory","predicate","statesToKeep","backsToDo","_","k","purgeCache","destroy","constructor","remove","Error","message","captureStackTrace","Page","_class","$page","_defineProperty","textContent","Date","getTime","pageManager","type","dataset","style","display","pageLoading","page1","page2","page3","page4","pageContainer","ctrlKey","metaKey","$a","target","matches","closest","href","preventDefault"],"sourceRoot":""}
|
package/tests/index.html
CHANGED
package/tests/lolpack.js
CHANGED
|
@@ -5,11 +5,13 @@ import page1 from './page-page1.js'
|
|
|
5
5
|
import page2 from './page-page2.js'
|
|
6
6
|
import page3 from './page-page3.js'
|
|
7
7
|
import page4 from './page-page4.js'
|
|
8
|
+
import page404 from './page-page404.js'
|
|
8
9
|
|
|
9
10
|
window.addEventListener('DOMContentLoaded', function () {
|
|
10
11
|
pageManager.init({
|
|
11
12
|
pageContainer: () => document.body,
|
|
12
13
|
fetchPath: route => '/pages/' + route.routeName + '.htm',
|
|
14
|
+
error404PageName: 'page404'
|
|
13
15
|
});
|
|
14
16
|
|
|
15
17
|
|
package/tests/page-page4.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './page4.htm'
|
|
2
2
|
import Page from './page.js';
|
|
3
|
-
import {registerPage} from '@trullock/page-manager';
|
|
3
|
+
import {registerPage, PageShowError} from '@trullock/page-manager';
|
|
4
4
|
|
|
5
5
|
export default registerPage('page4', '/page4', class extends Page {
|
|
6
6
|
|
|
@@ -9,4 +9,9 @@ export default registerPage('page4', '/page4', class extends Page {
|
|
|
9
9
|
constructor($page) {
|
|
10
10
|
super($page);
|
|
11
11
|
}
|
|
12
|
+
|
|
13
|
+
show(opts)
|
|
14
|
+
{
|
|
15
|
+
throw new PageShowError('/page1', 'Cant show page4, showing page1 instead', {}, 'replace')
|
|
16
|
+
}
|
|
12
17
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import './page404.htm'
|
|
2
|
+
import Page from './page.js';
|
|
3
|
+
import {registerPage, PageShowError} from '@trullock/page-manager';
|
|
4
|
+
|
|
5
|
+
export default registerPage('page404', '/404', class extends Page {
|
|
6
|
+
|
|
7
|
+
title = "Page 404";
|
|
8
|
+
|
|
9
|
+
constructor($page) {
|
|
10
|
+
super($page);
|
|
11
|
+
}
|
|
12
|
+
});
|
package/src/pageshowerror.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default class PageShowError extends Error {
|
|
2
|
-
constructor(url, message, data, action) {
|
|
3
|
-
super(message || 'Error showing requested page')
|
|
4
|
-
|
|
5
|
-
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
6
|
-
if (Error.captureStackTrace)
|
|
7
|
-
Error.captureStackTrace(this, PageShowError)
|
|
8
|
-
|
|
9
|
-
this.name = 'PageShowError'
|
|
10
|
-
this.url = url;
|
|
11
|
-
this.data = data;
|
|
12
|
-
this.action = action;
|
|
13
|
-
}
|
|
14
|
-
}
|