@trullock/page-manager 0.14.1 → 0.14.2
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 +1 -1
- package/src/index.js +17 -16
- package/dist/main.js +0 -116
- package/tests/dist/index.html +0 -23
- package/tests/dist/main.js +0 -1525
- package/tests/dist/main.js.map +0 -1
- package/tests/dist/page1.htm +0 -6
- package/tests/dist/page2.htm +0 -4
- package/tests/dist/page3.htm +0 -5
- package/tests/dist/page4.htm +0 -4
- package/tests/dist/page404.htm +0 -3
- package/tests/dist/pageX.htm +0 -4
package/tests/dist/main.js
DELETED
|
@@ -1,1525 +0,0 @@
|
|
|
1
|
-
/******/ (() => { // webpackBootstrap
|
|
2
|
-
/******/ "use strict";
|
|
3
|
-
/******/ var __webpack_modules__ = ({
|
|
4
|
-
|
|
5
|
-
/***/ "./tests/page1.htm":
|
|
6
|
-
/*!*************************!*\
|
|
7
|
-
!*** ./tests/page1.htm ***!
|
|
8
|
-
\*************************/
|
|
9
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
10
|
-
|
|
11
|
-
__webpack_require__.r(__webpack_exports__);
|
|
12
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
13
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
14
|
-
/* harmony export */ });
|
|
15
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "page1.htm");
|
|
16
|
-
|
|
17
|
-
/***/ }),
|
|
18
|
-
|
|
19
|
-
/***/ "./tests/page2.htm":
|
|
20
|
-
/*!*************************!*\
|
|
21
|
-
!*** ./tests/page2.htm ***!
|
|
22
|
-
\*************************/
|
|
23
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
24
|
-
|
|
25
|
-
__webpack_require__.r(__webpack_exports__);
|
|
26
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
27
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
28
|
-
/* harmony export */ });
|
|
29
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "page2.htm");
|
|
30
|
-
|
|
31
|
-
/***/ }),
|
|
32
|
-
|
|
33
|
-
/***/ "./tests/page3.htm":
|
|
34
|
-
/*!*************************!*\
|
|
35
|
-
!*** ./tests/page3.htm ***!
|
|
36
|
-
\*************************/
|
|
37
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
38
|
-
|
|
39
|
-
__webpack_require__.r(__webpack_exports__);
|
|
40
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
41
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
42
|
-
/* harmony export */ });
|
|
43
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "page3.htm");
|
|
44
|
-
|
|
45
|
-
/***/ }),
|
|
46
|
-
|
|
47
|
-
/***/ "./tests/page4.htm":
|
|
48
|
-
/*!*************************!*\
|
|
49
|
-
!*** ./tests/page4.htm ***!
|
|
50
|
-
\*************************/
|
|
51
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
52
|
-
|
|
53
|
-
__webpack_require__.r(__webpack_exports__);
|
|
54
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
55
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
56
|
-
/* harmony export */ });
|
|
57
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "page4.htm");
|
|
58
|
-
|
|
59
|
-
/***/ }),
|
|
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
|
-
|
|
75
|
-
/***/ "./tests/pageX.htm":
|
|
76
|
-
/*!*************************!*\
|
|
77
|
-
!*** ./tests/pageX.htm ***!
|
|
78
|
-
\*************************/
|
|
79
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
80
|
-
|
|
81
|
-
__webpack_require__.r(__webpack_exports__);
|
|
82
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
83
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
84
|
-
/* harmony export */ });
|
|
85
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "pageX.htm");
|
|
86
|
-
|
|
87
|
-
/***/ }),
|
|
88
|
-
|
|
89
|
-
/***/ "./node_modules/@trullock/router/src/index.js":
|
|
90
|
-
/*!****************************************************!*\
|
|
91
|
-
!*** ./node_modules/@trullock/router/src/index.js ***!
|
|
92
|
-
\****************************************************/
|
|
93
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
94
|
-
|
|
95
|
-
__webpack_require__.r(__webpack_exports__);
|
|
96
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
97
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
98
|
-
/* harmony export */ });
|
|
99
|
-
/* harmony import */ var _pattern_lexer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pattern-lexer.js */ "./node_modules/@trullock/router/src/pattern-lexer.js");
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
function isKind(val, kind) {
|
|
103
|
-
return '[object ' + kind + ']' === Object.prototype.toString.call(val);
|
|
104
|
-
}
|
|
105
|
-
function isRegExp(val) {
|
|
106
|
-
return isKind(val, 'RegExp');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function decodeQueryString(queryStr, shouldTypecast) {
|
|
110
|
-
var queryArr = (queryStr || '').replace('?', '').split('&'),
|
|
111
|
-
reg = /([^=]+)=(.+)/,
|
|
112
|
-
i = -1,
|
|
113
|
-
obj = {},
|
|
114
|
-
equalIndex, cur, pValue, pName;
|
|
115
|
-
|
|
116
|
-
while ((cur = queryArr[++i])) {
|
|
117
|
-
equalIndex = cur.indexOf('=');
|
|
118
|
-
pName = cur.substring(0, equalIndex);
|
|
119
|
-
pValue = decodeURIComponent(cur.substring(equalIndex + 1));
|
|
120
|
-
|
|
121
|
-
if (pName in obj){
|
|
122
|
-
if(isArray(obj[pName])){
|
|
123
|
-
obj[pName].push(pValue);
|
|
124
|
-
} else {
|
|
125
|
-
obj[pName] = [obj[pName], pValue];
|
|
126
|
-
}
|
|
127
|
-
} else {
|
|
128
|
-
obj[pName] = pValue;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return obj;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function Route(name, pattern, pageClass, priority, router) {
|
|
135
|
-
var isRegexPattern = isRegExp(pattern);
|
|
136
|
-
this._name = name;
|
|
137
|
-
this._router = router;
|
|
138
|
-
this._pattern = pattern;
|
|
139
|
-
this._paramsIds = isRegexPattern ? null : router.patternLexer.getParamIds(pattern);
|
|
140
|
-
this._optionalParamsIds = isRegexPattern ? null : router.patternLexer.getOptionalParamsIds(pattern);
|
|
141
|
-
this._matchRegexp = isRegexPattern ? pattern : router.patternLexer.compilePattern(pattern, router.ignoreCase);
|
|
142
|
-
this._pageClass = pageClass;
|
|
143
|
-
this._priority = priority || 0;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
Route.prototype = {
|
|
147
|
-
|
|
148
|
-
match: function (request) {
|
|
149
|
-
return this._matchRegexp.test(request);
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
_isValidParam: function (request, prop, values) {
|
|
153
|
-
var validationRule = this.rules[prop],
|
|
154
|
-
val = values[prop],
|
|
155
|
-
isValid = false,
|
|
156
|
-
isQuery = (prop.indexOf('?') === 0);
|
|
157
|
-
|
|
158
|
-
if (val == null && this._optionalParamsIds && arrayIndexOf(this._optionalParamsIds, prop) !== -1) {
|
|
159
|
-
isValid = true;
|
|
160
|
-
}
|
|
161
|
-
else if (isRegExp(validationRule)) {
|
|
162
|
-
if (isQuery)
|
|
163
|
-
val = values[prop + '_']; //use raw string
|
|
164
|
-
|
|
165
|
-
isValid = validationRule.test(val);
|
|
166
|
-
}
|
|
167
|
-
else if (isArray(validationRule)) {
|
|
168
|
-
if (isQuery)
|
|
169
|
-
val = values[prop + '_']; //use raw string
|
|
170
|
-
|
|
171
|
-
isValid = this._isValidArrayRule(validationRule, val);
|
|
172
|
-
}
|
|
173
|
-
else if (isFunction(validationRule)) {
|
|
174
|
-
isValid = validationRule(val, request, values);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return isValid; //fail silently if validationRule is from an unsupported type
|
|
178
|
-
},
|
|
179
|
-
|
|
180
|
-
_isValidArrayRule: function (arr, val) {
|
|
181
|
-
if (!this._router.ignoreCase) {
|
|
182
|
-
return arrayIndexOf(arr, val) !== -1;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (typeof val === 'string') {
|
|
186
|
-
val = val.toLowerCase();
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
var n = arr.length,
|
|
190
|
-
item,
|
|
191
|
-
compareVal;
|
|
192
|
-
|
|
193
|
-
while (n--) {
|
|
194
|
-
item = arr[n];
|
|
195
|
-
compareVal = (typeof item === 'string') ? item.toLowerCase() : item;
|
|
196
|
-
if (compareVal === val) {
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return false;
|
|
201
|
-
},
|
|
202
|
-
|
|
203
|
-
_getParamsObject: function (request) {
|
|
204
|
-
var shouldTypecast = this._router.shouldTypecast,
|
|
205
|
-
values = this._router.patternLexer.getParamValues(request, this._matchRegexp, shouldTypecast),
|
|
206
|
-
o = {},
|
|
207
|
-
n = values.length,
|
|
208
|
-
param, val;
|
|
209
|
-
while (n--) {
|
|
210
|
-
val = values[n];
|
|
211
|
-
if (this._paramsIds) {
|
|
212
|
-
param = this._paramsIds[n];
|
|
213
|
-
if (param.indexOf('?') === 0 && val) {
|
|
214
|
-
val = decodeQueryString(val, shouldTypecast);
|
|
215
|
-
|
|
216
|
-
for(var key in val){
|
|
217
|
-
if(!o[key])
|
|
218
|
-
o[key] = val[key];
|
|
219
|
-
else
|
|
220
|
-
o['?' + key] = val[key];
|
|
221
|
-
}
|
|
222
|
-
o[n] = val;
|
|
223
|
-
}
|
|
224
|
-
else
|
|
225
|
-
o[param] = val;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return o;
|
|
230
|
-
},
|
|
231
|
-
|
|
232
|
-
interpolate: function (replacements) {
|
|
233
|
-
try {
|
|
234
|
-
var str = this._router.patternLexer.interpolate(this._pattern, replacements);
|
|
235
|
-
return str;
|
|
236
|
-
}
|
|
237
|
-
catch(e) {
|
|
238
|
-
throw new Error(`Error interpolating route ${this._pattern} with values ${JSON.stringify(replacements)}\n` + e);
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
|
-
|
|
242
|
-
toString: function () {
|
|
243
|
-
return '[Route pattern:"' + this._pattern + '", numListeners:' + this.matched.getNumListeners() + ']';
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new class {
|
|
250
|
-
constructor() {
|
|
251
|
-
this.routes = [];
|
|
252
|
-
this.routesByName = {};
|
|
253
|
-
this.patternLexer = (0,_pattern_lexer_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
addRoute (name, pattern, pageClass, priority) {
|
|
257
|
-
pattern += pattern.endsWith('/') ? ':?query:' : '/:?query:';
|
|
258
|
-
var route = new Route(name, pattern, pageClass, priority, this);
|
|
259
|
-
|
|
260
|
-
var n = this.routes.length;
|
|
261
|
-
do
|
|
262
|
-
{
|
|
263
|
-
--n;
|
|
264
|
-
} while (this.routes[n] && route._priority <= this.routes[n]._priority);
|
|
265
|
-
this.routes.splice(n + 1, 0, route);
|
|
266
|
-
|
|
267
|
-
this.routesByName[name] = route;
|
|
268
|
-
Object.defineProperty(this, name, { get: () => pattern });
|
|
269
|
-
|
|
270
|
-
return route;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
interpolate(name, data){
|
|
274
|
-
if(!this.routesByName[name])
|
|
275
|
-
throw new Error(`Cannot find route by name ${name}`);
|
|
276
|
-
|
|
277
|
-
return this.routesByName[name].interpolate(data);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
parse (request) {
|
|
281
|
-
var n = this.routes.length;
|
|
282
|
-
var route, hash, path;
|
|
283
|
-
|
|
284
|
-
var index = request.indexOf('#');
|
|
285
|
-
if(index > -1)
|
|
286
|
-
{
|
|
287
|
-
hash = request.substr(index + 1);
|
|
288
|
-
request = request.substr(0, index);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
index = request.indexOf('?');
|
|
292
|
-
if(index > -1)
|
|
293
|
-
path = request.substr(0, index)
|
|
294
|
-
else
|
|
295
|
-
path = request;
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
while (route = this.routes[--n]) {
|
|
299
|
-
if (route.match(request)) {
|
|
300
|
-
var params = route._getParamsObject(request);
|
|
301
|
-
params.hash = hash;
|
|
302
|
-
|
|
303
|
-
return {
|
|
304
|
-
path: path.toLowerCase(),
|
|
305
|
-
routeName: route._name,
|
|
306
|
-
pattern: route._pattern,
|
|
307
|
-
pageClass: route._pageClass,
|
|
308
|
-
params: params
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
return null;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
toString () {
|
|
317
|
-
return '[Router numRoutes:' + this.getNumRoutes() + ']';
|
|
318
|
-
}
|
|
319
|
-
}());
|
|
320
|
-
|
|
321
|
-
/***/ }),
|
|
322
|
-
|
|
323
|
-
/***/ "./node_modules/@trullock/router/src/pattern-lexer.js":
|
|
324
|
-
/*!************************************************************!*\
|
|
325
|
-
!*** ./node_modules/@trullock/router/src/pattern-lexer.js ***!
|
|
326
|
-
\************************************************************/
|
|
327
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
328
|
-
|
|
329
|
-
__webpack_require__.r(__webpack_exports__);
|
|
330
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
331
|
-
/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)
|
|
332
|
-
/* harmony export */ });
|
|
333
|
-
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
|
|
334
|
-
|
|
335
|
-
var
|
|
336
|
-
//match chars that should be escaped on string regexp
|
|
337
|
-
ESCAPE_CHARS_REGEXP = /[\\.+*?\^$\[\](){}\/'#]/g,
|
|
338
|
-
|
|
339
|
-
//trailing slashes (begin/end of string)
|
|
340
|
-
LOOSE_SLASHES_REGEXP = /^\/|\/$/g,
|
|
341
|
-
LEGACY_SLASHES_REGEXP = /\/$/g,
|
|
342
|
-
|
|
343
|
-
//params - everything between `{ }` or `: :`
|
|
344
|
-
PARAMS_REGEXP = /(?:\{|:)([^}:]+)(?:\}|:)/g,
|
|
345
|
-
|
|
346
|
-
//used to save params during compile (avoid escaping things that
|
|
347
|
-
//shouldn't be escaped).
|
|
348
|
-
TOKENS = {
|
|
349
|
-
'OS': {
|
|
350
|
-
//optional slashes
|
|
351
|
-
//slash between `::` or `}:` or `\w:` or `:{?` or `}{?` or `\w{?`
|
|
352
|
-
rgx: /([:}]|\w(?=\/))\/?(:|(?:\{\?))/g,
|
|
353
|
-
save: '$1{{id}}$2',
|
|
354
|
-
res: '\\/?'
|
|
355
|
-
},
|
|
356
|
-
'RS': {
|
|
357
|
-
//required slashes
|
|
358
|
-
//used to insert slash between `:{` and `}{`
|
|
359
|
-
rgx: /([:}])\/?(\{)/g,
|
|
360
|
-
save: '$1{{id}}$2',
|
|
361
|
-
res: '\\/'
|
|
362
|
-
},
|
|
363
|
-
'RQ': {
|
|
364
|
-
//required query string - everything in between `{? }`
|
|
365
|
-
rgx: /\{\?([^}]+)\}/g,
|
|
366
|
-
//everything from `?` till `#` or end of string
|
|
367
|
-
res: '\\?([^#]+)'
|
|
368
|
-
},
|
|
369
|
-
'OQ': {
|
|
370
|
-
//optional query string - everything in between `:? :`
|
|
371
|
-
rgx: /:\?([^:]+):/g,
|
|
372
|
-
//everything from `?` till `#` or end of string
|
|
373
|
-
res: '(?:\\?([^#]*))?'
|
|
374
|
-
},
|
|
375
|
-
'OR': {
|
|
376
|
-
//optional rest - everything in between `: *:`
|
|
377
|
-
rgx: /:([^:]+)\*:/g,
|
|
378
|
-
res: '(.*)?' // optional group to avoid passing empty string as captured
|
|
379
|
-
},
|
|
380
|
-
'RR': {
|
|
381
|
-
//rest param - everything in between `{ *}`
|
|
382
|
-
rgx: /\{([^}]+)\*\}/g,
|
|
383
|
-
res: '(.+)'
|
|
384
|
-
},
|
|
385
|
-
// required/optional params should come after rest segments
|
|
386
|
-
'RP': {
|
|
387
|
-
//required params - everything between `{ }`
|
|
388
|
-
rgx: /\{([^}]+)\}/g,
|
|
389
|
-
res: '([^\\/?]+)'
|
|
390
|
-
},
|
|
391
|
-
'OP': {
|
|
392
|
-
//optional params - everything between `: :`
|
|
393
|
-
rgx: /:([^:]+):/g,
|
|
394
|
-
res: '([^\\/?]+)?\/?'
|
|
395
|
-
}
|
|
396
|
-
},
|
|
397
|
-
|
|
398
|
-
LOOSE_SLASH = 1,
|
|
399
|
-
STRICT_SLASH = 2,
|
|
400
|
-
LEGACY_SLASH = 3,
|
|
401
|
-
|
|
402
|
-
_slashMode = LOOSE_SLASH;
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
function precompileTokens() {
|
|
406
|
-
var key, cur;
|
|
407
|
-
for (key in TOKENS) {
|
|
408
|
-
if (TOKENS.hasOwnProperty(key)) {
|
|
409
|
-
cur = TOKENS[key];
|
|
410
|
-
cur.id = '__CR_' + key + '__';
|
|
411
|
-
cur.save = ('save' in cur) ? cur.save.replace('{{id}}', cur.id) : cur.id;
|
|
412
|
-
cur.rRestore = new RegExp(cur.id, 'g');
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
precompileTokens();
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
function captureVals(regex, pattern) {
|
|
420
|
-
var vals = [], match;
|
|
421
|
-
// very important to reset lastIndex since RegExp can have "g" flag
|
|
422
|
-
// and multiple runs might affect the result, specially if matching
|
|
423
|
-
// same string multiple times on IE 7-8
|
|
424
|
-
regex.lastIndex = 0;
|
|
425
|
-
while (match = regex.exec(pattern)) {
|
|
426
|
-
vals.push(match[1]);
|
|
427
|
-
}
|
|
428
|
-
return vals;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
function getParamIds(pattern) {
|
|
432
|
-
return captureVals(PARAMS_REGEXP, pattern);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
function getOptionalParamsIds(pattern) {
|
|
436
|
-
return captureVals(TOKENS.OP.rgx, pattern);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
function compilePattern(pattern, ignoreCase) {
|
|
440
|
-
pattern = pattern || '';
|
|
441
|
-
|
|
442
|
-
if (pattern) {
|
|
443
|
-
if (_slashMode === LOOSE_SLASH) {
|
|
444
|
-
pattern = pattern.replace(LOOSE_SLASHES_REGEXP, '');
|
|
445
|
-
}
|
|
446
|
-
else if (_slashMode === LEGACY_SLASH) {
|
|
447
|
-
pattern = pattern.replace(LEGACY_SLASHES_REGEXP, '');
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
//save tokens
|
|
451
|
-
pattern = replaceTokens(pattern, 'rgx', 'save');
|
|
452
|
-
//regexp escape
|
|
453
|
-
pattern = pattern.replace(ESCAPE_CHARS_REGEXP, '\\$&');
|
|
454
|
-
//restore tokens
|
|
455
|
-
pattern = replaceTokens(pattern, 'rRestore', 'res');
|
|
456
|
-
|
|
457
|
-
if (_slashMode === LOOSE_SLASH) {
|
|
458
|
-
pattern = '\\/?' + pattern;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
if (_slashMode !== STRICT_SLASH) {
|
|
463
|
-
//single slash is treated as empty and end slash is optional
|
|
464
|
-
pattern += '\\/?';
|
|
465
|
-
}
|
|
466
|
-
return new RegExp('^' + pattern + '$', ignoreCase ? 'i' : '');
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
function replaceTokens(pattern, regexpName, replaceName) {
|
|
470
|
-
var cur, key;
|
|
471
|
-
for (key in TOKENS) {
|
|
472
|
-
if (TOKENS.hasOwnProperty(key)) {
|
|
473
|
-
cur = TOKENS[key];
|
|
474
|
-
pattern = pattern.replace(cur[regexpName], cur[replaceName]);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
return pattern;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
function getParamValues(request, regexp, shouldTypecast) {
|
|
481
|
-
var vals = regexp.exec(request);
|
|
482
|
-
if (vals) {
|
|
483
|
-
vals.shift();
|
|
484
|
-
if (shouldTypecast) {
|
|
485
|
-
vals = typecastArrayValues(vals);
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
return vals;
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
function interpolate(pattern, replacements) {
|
|
492
|
-
// default to an empty object because pattern might have just
|
|
493
|
-
// optional arguments
|
|
494
|
-
replacements = replacements || {};
|
|
495
|
-
if (typeof pattern !== 'string') {
|
|
496
|
-
throw new Error('Route pattern should be a string.');
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
var replaceFn = function (match, prop) {
|
|
500
|
-
var val;
|
|
501
|
-
prop = (prop.substr(0, 1) === '?') ? prop.substr(1) : prop;
|
|
502
|
-
if (replacements[prop] != null) {
|
|
503
|
-
if (typeof replacements[prop] === 'object') {
|
|
504
|
-
var queryParts = [], rep;
|
|
505
|
-
for (var key in replacements[prop]) {
|
|
506
|
-
rep = replacements[prop][key];
|
|
507
|
-
if (isArray(rep)) {
|
|
508
|
-
for (var k in rep) {
|
|
509
|
-
if (key.slice(-2) == '[]') {
|
|
510
|
-
queryParts.push(encodeURIComponent(key.slice(0, -2)) + '[]=' + encodeURIComponent(rep[k]));
|
|
511
|
-
} else {
|
|
512
|
-
queryParts.push(encodeURIComponent(key + '=' + rep[k]));
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
queryParts.push(encodeURIComponent(key + '=' + rep));
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
val = '?' + queryParts.join('&');
|
|
521
|
-
} else {
|
|
522
|
-
// make sure value is a string see #gh-54
|
|
523
|
-
val = String(replacements[prop]);
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
if (match.indexOf('*') === -1 && val.indexOf('/') !== -1) {
|
|
527
|
-
throw new Error('Invalid value "' + val + '" for segment "' + match + '".');
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
else if (match.indexOf('{') !== -1) {
|
|
531
|
-
throw new Error('The segment ' + match + ' is required.');
|
|
532
|
-
}
|
|
533
|
-
else {
|
|
534
|
-
val = '';
|
|
535
|
-
}
|
|
536
|
-
return val;
|
|
537
|
-
};
|
|
538
|
-
|
|
539
|
-
if (!TOKENS.OS.trail) {
|
|
540
|
-
TOKENS.OS.trail = new RegExp('(?:' + TOKENS.OS.id + ')+$');
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
return pattern
|
|
544
|
-
.replace(TOKENS.OS.rgx, TOKENS.OS.save)
|
|
545
|
-
.replace(PARAMS_REGEXP, replaceFn)
|
|
546
|
-
.replace(TOKENS.OS.trail, '') // remove trailing
|
|
547
|
-
.replace(TOKENS.OS.rRestore, '/'); // add slash between segments
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
//API
|
|
551
|
-
return {
|
|
552
|
-
strict: function () {
|
|
553
|
-
_slashMode = STRICT_SLASH;
|
|
554
|
-
},
|
|
555
|
-
loose: function () {
|
|
556
|
-
_slashMode = LOOSE_SLASH;
|
|
557
|
-
},
|
|
558
|
-
legacy: function () {
|
|
559
|
-
_slashMode = LEGACY_SLASH;
|
|
560
|
-
},
|
|
561
|
-
getParamIds: getParamIds,
|
|
562
|
-
getOptionalParamsIds: getOptionalParamsIds,
|
|
563
|
-
getParamValues: getParamValues,
|
|
564
|
-
compilePattern: compilePattern,
|
|
565
|
-
interpolate: interpolate
|
|
566
|
-
};
|
|
567
|
-
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
/***/ }),
|
|
571
|
-
|
|
572
|
-
/***/ "./src/index.js":
|
|
573
|
-
/*!**********************!*\
|
|
574
|
-
!*** ./src/index.js ***!
|
|
575
|
-
\**********************/
|
|
576
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
577
|
-
|
|
578
|
-
__webpack_require__.r(__webpack_exports__);
|
|
579
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
580
|
-
/* harmony export */ "PageShowError": () => (/* binding */ PageShowError),
|
|
581
|
-
/* harmony export */ "back": () => (/* binding */ back),
|
|
582
|
-
/* harmony export */ "getPath": () => (/* binding */ getPath),
|
|
583
|
-
/* harmony export */ "init": () => (/* binding */ init),
|
|
584
|
-
/* harmony export */ "navigate": () => (/* binding */ navigate),
|
|
585
|
-
/* harmony export */ "pages": () => (/* binding */ pages),
|
|
586
|
-
/* harmony export */ "printStack": () => (/* binding */ printStack),
|
|
587
|
-
/* harmony export */ "purgeCache": () => (/* binding */ purgeCache),
|
|
588
|
-
/* harmony export */ "refresh": () => (/* binding */ refresh),
|
|
589
|
-
/* harmony export */ "registerPage": () => (/* binding */ registerPage),
|
|
590
|
-
/* harmony export */ "removeHistory": () => (/* binding */ removeHistory),
|
|
591
|
-
/* harmony export */ "replace": () => (/* binding */ replace),
|
|
592
|
-
/* harmony export */ "show": () => (/* binding */ show)
|
|
593
|
-
/* harmony export */ });
|
|
594
|
-
/* harmony import */ var _trullock_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @trullock/router */ "./node_modules/@trullock/router/src/index.js");
|
|
595
|
-
|
|
596
|
-
var pageHash = {},
|
|
597
|
-
pageCache = {},
|
|
598
|
-
pageTemplateCache = {},
|
|
599
|
-
stack = [],
|
|
600
|
-
stackPointer = -1;
|
|
601
|
-
var manuallyAdjustingHistory = false;
|
|
602
|
-
var handlingBeforeHide = false;
|
|
603
|
-
var lastNavigationDirection = null;
|
|
604
|
-
var goal = null;
|
|
605
|
-
var backData = {};
|
|
606
|
-
var options = {
|
|
607
|
-
fetchPath: route => '/pages/' + route.routeName + '.html',
|
|
608
|
-
fetchPageTemplate: route => {
|
|
609
|
-
return fetch(options.fetchPath(route)).then(r => r.text()).then(html => {
|
|
610
|
-
var $div = document.createElement('div');
|
|
611
|
-
$div.innerHTML = html;
|
|
612
|
-
// Pages are assumed to have a single wrapping element
|
|
613
|
-
return $div.firstElementChild;
|
|
614
|
-
}).then($template => {
|
|
615
|
-
pageTemplateCache[route.pattern] = $template;
|
|
616
|
-
return $template;
|
|
617
|
-
});
|
|
618
|
-
},
|
|
619
|
-
pageInterrupt: route => null,
|
|
620
|
-
attachMarkup: $html => document.body.appendChild($html),
|
|
621
|
-
prepareMarkup: $html => {},
|
|
622
|
-
loadingPageName: 'loading',
|
|
623
|
-
error404PageName: 'error-404',
|
|
624
|
-
defaultPageName: 'root',
|
|
625
|
-
beforeHide: null
|
|
626
|
-
};
|
|
627
|
-
const pages = pageHash;
|
|
628
|
-
function registerPage(argA, argB, argC) {
|
|
629
|
-
let namedRoutes = null,
|
|
630
|
-
pageClass = null;
|
|
631
|
-
if (argC == undefined) {
|
|
632
|
-
namedRoutes = argA;
|
|
633
|
-
pageClass = argB;
|
|
634
|
-
} else {
|
|
635
|
-
namedRoutes = {
|
|
636
|
-
[argA]: argB
|
|
637
|
-
};
|
|
638
|
-
pageClass = argC;
|
|
639
|
-
}
|
|
640
|
-
for (const [name, route] of Object.entries(namedRoutes)) {
|
|
641
|
-
_trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].addRoute(name, route, pageClass);
|
|
642
|
-
pageHash[name] = {
|
|
643
|
-
route: route,
|
|
644
|
-
pageClass: pageClass
|
|
645
|
-
};
|
|
646
|
-
}
|
|
647
|
-
return pageClass;
|
|
648
|
-
}
|
|
649
|
-
function getPath(name, values) {
|
|
650
|
-
let url = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].interpolate(name, values);
|
|
651
|
-
if (values?.hash) url += '#' + values.hash;
|
|
652
|
-
return url;
|
|
653
|
-
}
|
|
654
|
-
function refresh() {
|
|
655
|
-
let frame = stack[stackPointer];
|
|
656
|
-
showPage(frame.data.route.url, frame.data, 'replace');
|
|
657
|
-
}
|
|
658
|
-
function emitUrlChanged(url) {
|
|
659
|
-
window.dispatchEvent(new CustomEvent('page-manager.url-changed', {
|
|
660
|
-
detail: {
|
|
661
|
-
url: url
|
|
662
|
-
},
|
|
663
|
-
bubbles: true
|
|
664
|
-
}));
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
// TODO: 404 and error too?
|
|
668
|
-
function initLoading() {
|
|
669
|
-
var entry = pageHash[options.loadingPageName];
|
|
670
|
-
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(entry.route);
|
|
671
|
-
return loadPage(route, {});
|
|
672
|
-
}
|
|
673
|
-
function showLoading() {
|
|
674
|
-
var pageLookup = pageHash[options.loadingPageName];
|
|
675
|
-
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(pageLookup.route);
|
|
676
|
-
var data = {
|
|
677
|
-
route: route,
|
|
678
|
-
scrollY: window.scrollY,
|
|
679
|
-
event: {
|
|
680
|
-
action: 'replace'
|
|
681
|
-
}
|
|
682
|
-
};
|
|
683
|
-
var page = pageCache[route.pattern].page;
|
|
684
|
-
return Promise.resolve(page.show(data));
|
|
685
|
-
}
|
|
686
|
-
function hideLoading() {
|
|
687
|
-
var pageLookup = pageHash[options.loadingPageName];
|
|
688
|
-
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(pageLookup.route);
|
|
689
|
-
var page = pageCache[route.pattern].page;
|
|
690
|
-
return Promise.resolve(page.hide());
|
|
691
|
-
}
|
|
692
|
-
function loadPage(route, data) {
|
|
693
|
-
var fetchPage = pageTemplateCache[route.pattern] ? Promise.resolve(pageTemplateCache[route.pattern]) : options.fetchPageTemplate(route);
|
|
694
|
-
return fetchPage.then($template => {
|
|
695
|
-
var $html = $template.cloneNode(true);
|
|
696
|
-
options.prepareMarkup($html);
|
|
697
|
-
options.attachMarkup($html);
|
|
698
|
-
let page = new route.pageClass($html);
|
|
699
|
-
let cacheKey = page.cacheMarkupBy == 'path' ? route.path : route.pattern;
|
|
700
|
-
pageCache[cacheKey] = {
|
|
701
|
-
$html,
|
|
702
|
-
page
|
|
703
|
-
};
|
|
704
|
-
let booted = new Promise(resolve => resolve(page.boot(data)));
|
|
705
|
-
return booted.then(() => page);
|
|
706
|
-
});
|
|
707
|
-
}
|
|
708
|
-
function showPage(url, data, event) {
|
|
709
|
-
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(url);
|
|
710
|
-
if (route == null) {
|
|
711
|
-
console.error(`Can't find page: '${url}'`);
|
|
712
|
-
let page404 = pageHash[options.error404PageName];
|
|
713
|
-
route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(page404.route);
|
|
714
|
-
}
|
|
715
|
-
data = data || {};
|
|
716
|
-
for (let key in route.params) data[key] = route.params[key];
|
|
717
|
-
data.route = {
|
|
718
|
-
url: url,
|
|
719
|
-
path: route.path,
|
|
720
|
-
routeName: route.routeName,
|
|
721
|
-
params: route.params
|
|
722
|
-
};
|
|
723
|
-
data.event = event;
|
|
724
|
-
let interrupt = options.pageInterrupt(route);
|
|
725
|
-
if (interrupt) {
|
|
726
|
-
goal = {
|
|
727
|
-
url,
|
|
728
|
-
data
|
|
729
|
-
};
|
|
730
|
-
return showPage(interrupt.url, null, event);
|
|
731
|
-
}
|
|
732
|
-
var getPage = showLoading().then(() => {
|
|
733
|
-
if (pageCache[route.path]) return pageCache[route.path].page;
|
|
734
|
-
if (pageCache[route.pattern]) return pageCache[route.pattern].page;
|
|
735
|
-
return loadPage(route, data);
|
|
736
|
-
});
|
|
737
|
-
|
|
738
|
-
// handle initial page
|
|
739
|
-
if (event.action == 'load') {
|
|
740
|
-
return getPage.then(page => doShow(page, data)).then(page => {
|
|
741
|
-
// clean initial load
|
|
742
|
-
if (stackPointer == -1) {
|
|
743
|
-
stack.push({
|
|
744
|
-
uid: 0,
|
|
745
|
-
data,
|
|
746
|
-
page
|
|
747
|
-
});
|
|
748
|
-
stackPointer = 0;
|
|
749
|
-
}
|
|
750
|
-
// page refresh
|
|
751
|
-
else {
|
|
752
|
-
stack[stackPointer].page = page;
|
|
753
|
-
stack[stackPointer].data = data;
|
|
754
|
-
}
|
|
755
|
-
return page;
|
|
756
|
-
});
|
|
757
|
-
}
|
|
758
|
-
let currentState = stack[stackPointer];
|
|
759
|
-
if (currentState.data.route.path == route.path) {
|
|
760
|
-
handleHistoryAction(event, url, data, currentState.page);
|
|
761
|
-
return getPage.then(page => doUpdate(page, data));
|
|
762
|
-
}
|
|
763
|
-
currentState.data.scrollY = window.scrollY;
|
|
764
|
-
return Promise.all([currentState.page.hide(event), getPage]).then(results => results[1]).then(page => {
|
|
765
|
-
handleHistoryAction(event, url, data, page);
|
|
766
|
-
return doShow(page, data);
|
|
767
|
-
});
|
|
768
|
-
// .catch(e => {
|
|
769
|
-
// // TODO: what case is this?
|
|
770
|
-
// manuallyAdjustingHistory = () => manuallyAdjustingHistory = false;
|
|
771
|
-
// if (event.action == 'back')
|
|
772
|
-
// history.go(1);
|
|
773
|
-
// else if (event.action == 'fwd')
|
|
774
|
-
// history.go(-1);
|
|
775
|
-
// });
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
async function doShow(page, data) {
|
|
779
|
-
window.scroll(0, 0);
|
|
780
|
-
await Promise.resolve(page.show(data));
|
|
781
|
-
document.title = page.title;
|
|
782
|
-
await hideLoading();
|
|
783
|
-
return page;
|
|
784
|
-
}
|
|
785
|
-
async function doUpdate(page, data) {
|
|
786
|
-
await Promise.resolve(page.update(data));
|
|
787
|
-
document.title = page.title;
|
|
788
|
-
// todo: hide() should be passed an event object
|
|
789
|
-
await hideLoading();
|
|
790
|
-
return page;
|
|
791
|
-
}
|
|
792
|
-
function handleHistoryAction(event, url, data, page) {
|
|
793
|
-
if (event.action == 'push') {
|
|
794
|
-
let newUid = stack[stackPointer].uid + 1;
|
|
795
|
-
window.history.pushState({
|
|
796
|
-
uid: newUid
|
|
797
|
-
}, null, url);
|
|
798
|
-
emitUrlChanged(url);
|
|
799
|
-
|
|
800
|
-
// remove future
|
|
801
|
-
stack.splice(stackPointer + 1, stack.length - stackPointer);
|
|
802
|
-
stack.push({
|
|
803
|
-
uid: newUid,
|
|
804
|
-
data,
|
|
805
|
-
page
|
|
806
|
-
});
|
|
807
|
-
stackPointer++;
|
|
808
|
-
} else if (event.action == 'replace') {
|
|
809
|
-
// TODO: this case may be buggy
|
|
810
|
-
|
|
811
|
-
// BUG: you can replace the current state with the same url as the previous state, which shouldnt be allowed,
|
|
812
|
-
// you cant have the same url in the history twice (next to each other).
|
|
813
|
-
// Update this to check for such a case and handle it
|
|
814
|
-
|
|
815
|
-
let currentUid = stack[stackPointer].uid;
|
|
816
|
-
window.history.replaceState({
|
|
817
|
-
uid: currentUid
|
|
818
|
-
}, null, url);
|
|
819
|
-
emitUrlChanged(url);
|
|
820
|
-
stack.pop();
|
|
821
|
-
stack.push({
|
|
822
|
-
uid: currentUid,
|
|
823
|
-
data,
|
|
824
|
-
page
|
|
825
|
-
});
|
|
826
|
-
} else if (event.action == 'back') {
|
|
827
|
-
stackPointer -= event.distance;
|
|
828
|
-
} else if (event.action == 'fwd') {
|
|
829
|
-
stackPointer += event.distance;
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
function doNavigate(url, data) {
|
|
833
|
-
if (url === 'goal') {
|
|
834
|
-
url = goal ? goal.url : data?.fallback || getPath(options.defaultPageName);
|
|
835
|
-
data = goal?.data || {};
|
|
836
|
-
goal = null;
|
|
837
|
-
}
|
|
838
|
-
return showPage(url, data, {
|
|
839
|
-
action: 'push',
|
|
840
|
-
distance: 0
|
|
841
|
-
});
|
|
842
|
-
}
|
|
843
|
-
function storageAvailable() {
|
|
844
|
-
try {
|
|
845
|
-
var x = '__storage_test__';
|
|
846
|
-
window.sessionStorage.setItem(x, x);
|
|
847
|
-
window.sessionStorage.removeItem(x);
|
|
848
|
-
return true;
|
|
849
|
-
} catch (e) {
|
|
850
|
-
return false;
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
async function init(opts) {
|
|
854
|
-
Object.assign(options, opts);
|
|
855
|
-
if (storageAvailable()) {
|
|
856
|
-
let storedStack = window.sessionStorage.getItem("stack");
|
|
857
|
-
if (storedStack) {
|
|
858
|
-
storedStack = JSON.parse(storedStack);
|
|
859
|
-
stack = storedStack.stack;
|
|
860
|
-
stackPointer = storedStack.stackPointer;
|
|
861
|
-
window.sessionStorage.removeItem("stack");
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
// handle pages whose markup is already loaded in the page
|
|
866
|
-
for (var key in pageHash) {
|
|
867
|
-
if (pageHash[key].pageClass.existingDomSelector) {
|
|
868
|
-
let $html = document.querySelector(pageHash[key].pageClass.existingDomSelector);
|
|
869
|
-
if (!$html) {
|
|
870
|
-
console.error(`Unable to find DOM element '${pageHash[key].pageClass.existingDomSelector}' for page '${key}'`);
|
|
871
|
-
continue;
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
// TODO: this is inefficient for non parameterised routes. There will always be HTML in memory and then copied for the page once loaded
|
|
875
|
-
pageTemplateCache[_trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].routesByName[key]._pattern] = $html;
|
|
876
|
-
$html.parentElement.removeChild($html);
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
await initLoading();
|
|
880
|
-
|
|
881
|
-
// set initial page
|
|
882
|
-
emitUrlChanged(window.location.pathname + window.location.search + window.location.hash);
|
|
883
|
-
showPage(window.location.pathname + window.location.search + window.location.hash, null, {
|
|
884
|
-
action: 'load',
|
|
885
|
-
distance: 0
|
|
886
|
-
}).catch(e => {
|
|
887
|
-
console.error(e);
|
|
888
|
-
if (e instanceof PageShowError) {
|
|
889
|
-
return showPage(e.url, e.data, {
|
|
890
|
-
action: 'load',
|
|
891
|
-
distance: 0
|
|
892
|
-
}).then(page => {
|
|
893
|
-
if (e.action == 'replace') handleHistoryAction({
|
|
894
|
-
action: e.action
|
|
895
|
-
}, e.url, e.data, page);
|
|
896
|
-
return page;
|
|
897
|
-
});
|
|
898
|
-
}
|
|
899
|
-
});
|
|
900
|
-
function handlePopstate(context, direction, distance) {
|
|
901
|
-
if (manuallyAdjustingHistory) {
|
|
902
|
-
manuallyAdjustingHistory(context, {
|
|
903
|
-
action: direction,
|
|
904
|
-
distance
|
|
905
|
-
});
|
|
906
|
-
return;
|
|
907
|
-
}
|
|
908
|
-
if (direction == 'back') Object.assign(context.data, backData);
|
|
909
|
-
backData = {};
|
|
910
|
-
emitUrlChanged(context.data.route.url);
|
|
911
|
-
showPage(context.data.route.url, context.data, {
|
|
912
|
-
action: direction,
|
|
913
|
-
distance
|
|
914
|
-
}).catch(e => {
|
|
915
|
-
console.error(e);
|
|
916
|
-
if (e instanceof PageShowError) return showPage(e.url, e.data, {
|
|
917
|
-
action: e.action || 'show'
|
|
918
|
-
});
|
|
919
|
-
}).then(page => {
|
|
920
|
-
// set page as it can be missing in the case of refreshes
|
|
921
|
-
context.page = page;
|
|
922
|
-
});
|
|
923
|
-
}
|
|
924
|
-
function handleBeforeHidePart1() {
|
|
925
|
-
// if we're ignoring beforeHide this navigation
|
|
926
|
-
if (handlingBeforeHide === 'ignore') {
|
|
927
|
-
handlingBeforeHide = false;
|
|
928
|
-
return false;
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
// if we have a before-unload confirm to show
|
|
932
|
-
if (stack[stackPointer].page.beforeHide && options.beforeHide && handlingBeforeHide === false) {
|
|
933
|
-
var interrupt = stack[stackPointer].page.beforeHide();
|
|
934
|
-
if (interrupt) {
|
|
935
|
-
handlingBeforeHide = 'step1';
|
|
936
|
-
|
|
937
|
-
// do this in a new thread, you cant call history actions from inside a history-aciton-handler
|
|
938
|
-
window.setTimeout(() => {
|
|
939
|
-
// undo the navigation so the URL remains correct whilst we show the confirm dialog
|
|
940
|
-
if (lastNavigationDirection == 'fwd') history.back();else if (lastNavigationDirection == 'back') history.forward();
|
|
941
|
-
}, 1);
|
|
942
|
-
return true;
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
// we've finished beforeHiding
|
|
947
|
-
if (handlingBeforeHide === 'step2') handlingBeforeHide = false;
|
|
948
|
-
return false;
|
|
949
|
-
}
|
|
950
|
-
function handleBeforeHidePart2() {
|
|
951
|
-
if (handlingBeforeHide !== 'step1') return false;
|
|
952
|
-
|
|
953
|
-
// do the beforeHide action, then...
|
|
954
|
-
options.beforeHide(stack[stackPointer].page.beforeHide()).then(result => {
|
|
955
|
-
// if the user confirmed, redo the original action
|
|
956
|
-
if (result) {
|
|
957
|
-
handlingBeforeHide = 'step2';
|
|
958
|
-
if (lastNavigationDirection == 'fwd') history.forward();else if (lastNavigationDirection == 'back') history.back();
|
|
959
|
-
} else {
|
|
960
|
-
handlingBeforeHide = false;
|
|
961
|
-
}
|
|
962
|
-
});
|
|
963
|
-
return true;
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
// listen for browser navigations
|
|
967
|
-
window.addEventListener("popstate", e => {
|
|
968
|
-
var interrupted = handleBeforeHidePart2();
|
|
969
|
-
if (interrupted) return;
|
|
970
|
-
let newUid = e.state?.uid || 0;
|
|
971
|
-
let previousUid = stack[stackPointer].uid;
|
|
972
|
-
lastNavigationDirection = newUid > previousUid ? 'fwd' : 'back';
|
|
973
|
-
let distance = Math.abs(newUid - previousUid);
|
|
974
|
-
var interrupted = handleBeforeHidePart1();
|
|
975
|
-
if (interrupted) return;
|
|
976
|
-
var context = findContext(newUid);
|
|
977
|
-
handlePopstate(context, lastNavigationDirection, distance);
|
|
978
|
-
});
|
|
979
|
-
if (storageAvailable()) {
|
|
980
|
-
window.addEventListener("beforeunload", () => {
|
|
981
|
-
let stackToSerialize = stack.map(s => ({
|
|
982
|
-
uid: s.uid,
|
|
983
|
-
data: s.data
|
|
984
|
-
}));
|
|
985
|
-
let stackToStore = {
|
|
986
|
-
stack: stackToSerialize,
|
|
987
|
-
stackPointer
|
|
988
|
-
};
|
|
989
|
-
window.sessionStorage.setItem('stack', JSON.stringify(stackToStore));
|
|
990
|
-
});
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
function findContext(uid) {
|
|
994
|
-
for (var i = 0; i < stack.length; i++) {
|
|
995
|
-
if (stack[i].uid == uid) return stack[i];
|
|
996
|
-
}
|
|
997
|
-
return null;
|
|
998
|
-
}
|
|
999
|
-
function expandOnlyHash(url) {
|
|
1000
|
-
if (url.startsWith('#')) {
|
|
1001
|
-
let currentState = stack[stackPointer];
|
|
1002
|
-
let currentUrl = currentState.data.route.url;
|
|
1003
|
-
let hashIndex = currentUrl.indexOf('#');
|
|
1004
|
-
if (hashIndex > -1) return currentUrl.substr(0, hashIndex);
|
|
1005
|
-
return currentUrl + url;
|
|
1006
|
-
}
|
|
1007
|
-
return url;
|
|
1008
|
-
}
|
|
1009
|
-
function navigate(url, data, checkBeforeHide = true) {
|
|
1010
|
-
url = expandOnlyHash(url);
|
|
1011
|
-
if (checkBeforeHide === true && stack[stackPointer].page.beforeHide && options.beforeHide) {
|
|
1012
|
-
var interrupt = stack[stackPointer].page.beforeHide();
|
|
1013
|
-
if (interrupt !== false) {
|
|
1014
|
-
options.beforeHide(interrupt).then(result => {
|
|
1015
|
-
if (result) doNavigate(url, data);
|
|
1016
|
-
});
|
|
1017
|
-
return;
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
doNavigate(url, data).catch(e => {
|
|
1021
|
-
console.error(e);
|
|
1022
|
-
if (e instanceof PageShowError) return showPage(e.url, e.data, {
|
|
1023
|
-
action: e.action || 'show'
|
|
1024
|
-
});
|
|
1025
|
-
});
|
|
1026
|
-
}
|
|
1027
|
-
function replace(url, data) {
|
|
1028
|
-
url = expandOnlyHash(url);
|
|
1029
|
-
return showPage(url, data, {
|
|
1030
|
-
action: 'replace',
|
|
1031
|
-
distance: 0
|
|
1032
|
-
});
|
|
1033
|
-
}
|
|
1034
|
-
function show(url, data) {
|
|
1035
|
-
return showPage(url, data, {
|
|
1036
|
-
action: 'show',
|
|
1037
|
-
distance: 0
|
|
1038
|
-
});
|
|
1039
|
-
}
|
|
1040
|
-
function back(data, checkBeforeHide) {
|
|
1041
|
-
backData = data || {};
|
|
1042
|
-
handlingBeforeHide = checkBeforeHide === false ? 'ignore' : false;
|
|
1043
|
-
history.go(-1);
|
|
1044
|
-
}
|
|
1045
|
-
function printStack() {
|
|
1046
|
-
console.log("Stack length: " + stack.length);
|
|
1047
|
-
console.log("Stack pointer: " + stackPointer);
|
|
1048
|
-
for (var i = 0; i < stack.length; i++) console.log(stack[i]);
|
|
1049
|
-
}
|
|
1050
|
-
function removeHistory(predicate) {
|
|
1051
|
-
let statesToKeep = [];
|
|
1052
|
-
for (var i = 0; i < stack.length; i++) {
|
|
1053
|
-
if (!predicate(stack[i], i)) statesToKeep.push(stack[i]);
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
// TODO: ensure we always have at least 1 state to keep - must/can this always be the current page?
|
|
1057
|
-
|
|
1058
|
-
if (statesToKeep.length == stack.length) return Promise.resolve();
|
|
1059
|
-
return new Promise((resolve, reject) => {
|
|
1060
|
-
let backsToDo = stackPointer - 1;
|
|
1061
|
-
let currentUid = -1;
|
|
1062
|
-
|
|
1063
|
-
// TODO: handle stack pointer not being at the tail when this process starts
|
|
1064
|
-
|
|
1065
|
-
manuallyAdjustingHistory = _ => {
|
|
1066
|
-
// rewind to the first history position
|
|
1067
|
-
if (backsToDo > 0) {
|
|
1068
|
-
window.setTimeout(() => {
|
|
1069
|
-
backsToDo--;
|
|
1070
|
-
history.back();
|
|
1071
|
-
}, 1);
|
|
1072
|
-
return;
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
// reset the stack
|
|
1076
|
-
stack = [];
|
|
1077
|
-
for (var k = 0; k < statesToKeep.length; k++) {
|
|
1078
|
-
let currentState = statesToKeep[k];
|
|
1079
|
-
currentState.uid = ++currentUid;
|
|
1080
|
-
if (k == 0) window.history.replaceState({
|
|
1081
|
-
uid: currentState.uid
|
|
1082
|
-
}, null, currentState.data.route.url);else window.history.pushState({
|
|
1083
|
-
uid: currentState.uid
|
|
1084
|
-
}, null, currentState.data.route.url);
|
|
1085
|
-
window.dispatchEvent(new CustomEvent('page-manager.url-changed', {
|
|
1086
|
-
url: currentState.data.route.url
|
|
1087
|
-
}));
|
|
1088
|
-
|
|
1089
|
-
// TODO: this doesnt seem to work when k=0
|
|
1090
|
-
document.title = currentState.page.title;
|
|
1091
|
-
stack.push(currentState);
|
|
1092
|
-
}
|
|
1093
|
-
stackPointer = stack.length - 1;
|
|
1094
|
-
manuallyAdjustingHistory = false;
|
|
1095
|
-
};
|
|
1096
|
-
history.back();
|
|
1097
|
-
});
|
|
1098
|
-
}
|
|
1099
|
-
function purgeCache() {
|
|
1100
|
-
for (const key in pageCache) {
|
|
1101
|
-
pageCache[key].page.destroy && pageCache[key].page.destroy();
|
|
1102
|
-
if (!pageCache[key].page.constructor.existingDomSelector) {
|
|
1103
|
-
pageCache[key].$html.remove();
|
|
1104
|
-
delete pageCache[key];
|
|
1105
|
-
}
|
|
1106
|
-
}
|
|
1107
|
-
}
|
|
1108
|
-
class PageShowError extends Error {
|
|
1109
|
-
constructor(url, message, data, action) {
|
|
1110
|
-
super(message || 'Error showing requested page');
|
|
1111
|
-
|
|
1112
|
-
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
1113
|
-
if (Error.captureStackTrace) Error.captureStackTrace(this, PageShowError);
|
|
1114
|
-
this.name = 'PageShowError';
|
|
1115
|
-
this.url = url;
|
|
1116
|
-
this.data = data;
|
|
1117
|
-
this.action = action;
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
/***/ }),
|
|
1122
|
-
|
|
1123
|
-
/***/ "./tests/page-loading.js":
|
|
1124
|
-
/*!*******************************!*\
|
|
1125
|
-
!*** ./tests/page-loading.js ***!
|
|
1126
|
-
\*******************************/
|
|
1127
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1128
|
-
|
|
1129
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1130
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1131
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1132
|
-
/* harmony export */ });
|
|
1133
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1134
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1135
|
-
var _class;
|
|
1136
|
-
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; }
|
|
1137
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1138
|
-
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); }
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_1__.registerPage)('loading', '/loading', (_class = class extends _page_js__WEBPACK_IMPORTED_MODULE_0__["default"] {
|
|
1142
|
-
constructor($page) {
|
|
1143
|
-
super($page);
|
|
1144
|
-
}
|
|
1145
|
-
}, _defineProperty(_class, "existingDomSelector", '#page-loading'), _class)));
|
|
1146
|
-
|
|
1147
|
-
/***/ }),
|
|
1148
|
-
|
|
1149
|
-
/***/ "./tests/page-page1.js":
|
|
1150
|
-
/*!*****************************!*\
|
|
1151
|
-
!*** ./tests/page-page1.js ***!
|
|
1152
|
-
\*****************************/
|
|
1153
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1154
|
-
|
|
1155
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1156
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1157
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1158
|
-
/* harmony export */ });
|
|
1159
|
-
/* harmony import */ var _page1_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page1.htm */ "./tests/page1.htm");
|
|
1160
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1161
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1162
|
-
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; }
|
|
1163
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1164
|
-
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); }
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage)('page1', '/page1', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1169
|
-
constructor($page) {
|
|
1170
|
-
super($page);
|
|
1171
|
-
_defineProperty(this, "title", "Page 1");
|
|
1172
|
-
_defineProperty(this, "type", 'A');
|
|
1173
|
-
$page.querySelector('button').addEventListener('click', e => {
|
|
1174
|
-
(0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.refresh)();
|
|
1175
|
-
});
|
|
1176
|
-
}
|
|
1177
|
-
update(data) {
|
|
1178
|
-
this.$page.querySelector('.js-time').textContent = new Date().getTime();
|
|
1179
|
-
}
|
|
1180
|
-
}));
|
|
1181
|
-
|
|
1182
|
-
/***/ }),
|
|
1183
|
-
|
|
1184
|
-
/***/ "./tests/page-page2.js":
|
|
1185
|
-
/*!*****************************!*\
|
|
1186
|
-
!*** ./tests/page-page2.js ***!
|
|
1187
|
-
\*****************************/
|
|
1188
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1189
|
-
|
|
1190
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1191
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1192
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1193
|
-
/* harmony export */ });
|
|
1194
|
-
/* harmony import */ var _page2_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page2.htm */ "./tests/page2.htm");
|
|
1195
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1196
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1197
|
-
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; }
|
|
1198
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1199
|
-
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); }
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage)('page2', '/page2', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1204
|
-
constructor($page) {
|
|
1205
|
-
super($page);
|
|
1206
|
-
_defineProperty(this, "title", "Page 2");
|
|
1207
|
-
_defineProperty(this, "type", 'A');
|
|
1208
|
-
}
|
|
1209
|
-
}));
|
|
1210
|
-
|
|
1211
|
-
/***/ }),
|
|
1212
|
-
|
|
1213
|
-
/***/ "./tests/page-page3.js":
|
|
1214
|
-
/*!*****************************!*\
|
|
1215
|
-
!*** ./tests/page-page3.js ***!
|
|
1216
|
-
\*****************************/
|
|
1217
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1218
|
-
|
|
1219
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1220
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1221
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1222
|
-
/* harmony export */ });
|
|
1223
|
-
/* harmony import */ var _page3_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page3.htm */ "./tests/page3.htm");
|
|
1224
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1225
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1226
|
-
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; }
|
|
1227
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1228
|
-
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); }
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage('page3', '/page3', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1233
|
-
constructor($page) {
|
|
1234
|
-
super($page);
|
|
1235
|
-
_defineProperty(this, "title", "Page 3");
|
|
1236
|
-
_defineProperty(this, "beforeHide", () => 'Are you sure?');
|
|
1237
|
-
$page.querySelector('.btnRemove').addEventListener('click', e => {
|
|
1238
|
-
_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.removeHistory(state => {
|
|
1239
|
-
return state.page.type == 'A';
|
|
1240
|
-
});
|
|
1241
|
-
});
|
|
1242
|
-
}
|
|
1243
|
-
}));
|
|
1244
|
-
|
|
1245
|
-
/***/ }),
|
|
1246
|
-
|
|
1247
|
-
/***/ "./tests/page-page4.js":
|
|
1248
|
-
/*!*****************************!*\
|
|
1249
|
-
!*** ./tests/page-page4.js ***!
|
|
1250
|
-
\*****************************/
|
|
1251
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1252
|
-
|
|
1253
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1254
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1255
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1256
|
-
/* harmony export */ });
|
|
1257
|
-
/* harmony import */ var _page4_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page4.htm */ "./tests/page4.htm");
|
|
1258
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1259
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1260
|
-
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; }
|
|
1261
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1262
|
-
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); }
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage)('page4', '/page4', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1267
|
-
constructor($page) {
|
|
1268
|
-
super($page);
|
|
1269
|
-
_defineProperty(this, "title", "Page 4");
|
|
1270
|
-
}
|
|
1271
|
-
show(opts) {
|
|
1272
|
-
throw new _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.PageShowError('/page1', 'Cant show page4, showing page1 instead', {}, 'replace');
|
|
1273
|
-
}
|
|
1274
|
-
}));
|
|
1275
|
-
|
|
1276
|
-
/***/ }),
|
|
1277
|
-
|
|
1278
|
-
/***/ "./tests/page-page404.js":
|
|
1279
|
-
/*!*******************************!*\
|
|
1280
|
-
!*** ./tests/page-page404.js ***!
|
|
1281
|
-
\*******************************/
|
|
1282
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1283
|
-
|
|
1284
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1285
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1286
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1287
|
-
/* harmony export */ });
|
|
1288
|
-
/* harmony import */ var _page404_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page404.htm */ "./tests/page404.htm");
|
|
1289
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1290
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1291
|
-
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; }
|
|
1292
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1293
|
-
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); }
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
/* 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"] {
|
|
1298
|
-
constructor($page) {
|
|
1299
|
-
super($page);
|
|
1300
|
-
_defineProperty(this, "title", "Page 404");
|
|
1301
|
-
}
|
|
1302
|
-
}));
|
|
1303
|
-
|
|
1304
|
-
/***/ }),
|
|
1305
|
-
|
|
1306
|
-
/***/ "./tests/page-pageX.js":
|
|
1307
|
-
/*!*****************************!*\
|
|
1308
|
-
!*** ./tests/page-pageX.js ***!
|
|
1309
|
-
\*****************************/
|
|
1310
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1311
|
-
|
|
1312
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1313
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1314
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1315
|
-
/* harmony export */ });
|
|
1316
|
-
/* harmony import */ var _pageX_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pageX.htm */ "./tests/pageX.htm");
|
|
1317
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1318
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1319
|
-
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; }
|
|
1320
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1321
|
-
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); }
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage)('pageX', '/page/{x}', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1326
|
-
constructor($page) {
|
|
1327
|
-
super($page);
|
|
1328
|
-
_defineProperty(this, "title", "Page X");
|
|
1329
|
-
}
|
|
1330
|
-
show(opts) {
|
|
1331
|
-
this.$page.querySelector('#PageX').textContent = "Page: " + opts.x;
|
|
1332
|
-
return super.show(opts);
|
|
1333
|
-
}
|
|
1334
|
-
}));
|
|
1335
|
-
|
|
1336
|
-
/***/ }),
|
|
1337
|
-
|
|
1338
|
-
/***/ "./tests/page-show-fail.js":
|
|
1339
|
-
/*!*********************************!*\
|
|
1340
|
-
!*** ./tests/page-show-fail.js ***!
|
|
1341
|
-
\*********************************/
|
|
1342
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1343
|
-
|
|
1344
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1345
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1346
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1347
|
-
/* harmony export */ });
|
|
1348
|
-
/* harmony import */ var _page404_htm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page404.htm */ "./tests/page404.htm");
|
|
1349
|
-
/* harmony import */ var _page_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page.js */ "./tests/page.js");
|
|
1350
|
-
/* harmony import */ var _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @trullock/page-manager */ "./src/index.js");
|
|
1351
|
-
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; }
|
|
1352
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1353
|
-
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); }
|
|
1354
|
-
// doesnt matter
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.registerPage)('pageShowFail', '/show-fail', class extends _page_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
|
|
1358
|
-
constructor($page) {
|
|
1359
|
-
super($page);
|
|
1360
|
-
_defineProperty(this, "title", "Page 4");
|
|
1361
|
-
}
|
|
1362
|
-
show(opts) {
|
|
1363
|
-
throw new _trullock_page_manager__WEBPACK_IMPORTED_MODULE_2__.PageShowError('/page1', 'Cant show pageShowFail, showing page1 instead', {}, 'replace');
|
|
1364
|
-
}
|
|
1365
|
-
}));
|
|
1366
|
-
|
|
1367
|
-
/***/ }),
|
|
1368
|
-
|
|
1369
|
-
/***/ "./tests/page.js":
|
|
1370
|
-
/*!***********************!*\
|
|
1371
|
-
!*** ./tests/page.js ***!
|
|
1372
|
-
\***********************/
|
|
1373
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1374
|
-
|
|
1375
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1376
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1377
|
-
/* harmony export */ "default": () => (/* binding */ Page)
|
|
1378
|
-
/* harmony export */ });
|
|
1379
|
-
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; }
|
|
1380
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
1381
|
-
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); }
|
|
1382
|
-
class Page {
|
|
1383
|
-
constructor($page) {
|
|
1384
|
-
_defineProperty(this, "dirty", false);
|
|
1385
|
-
_defineProperty(this, "cacheMarkupBy", 'route');
|
|
1386
|
-
this.$page = $page;
|
|
1387
|
-
}
|
|
1388
|
-
get title() {
|
|
1389
|
-
return this.$page.dataset['title'] || 'PageManager';
|
|
1390
|
-
}
|
|
1391
|
-
boot(opts) {
|
|
1392
|
-
return Promise.resolve();
|
|
1393
|
-
}
|
|
1394
|
-
show(opts) {
|
|
1395
|
-
this.$page.style.display = 'block';
|
|
1396
|
-
return Promise.resolve();
|
|
1397
|
-
}
|
|
1398
|
-
update() {
|
|
1399
|
-
return Promise.resolve();
|
|
1400
|
-
}
|
|
1401
|
-
hide() {
|
|
1402
|
-
this.$page.style.display = 'none';
|
|
1403
|
-
return Promise.resolve();
|
|
1404
|
-
}
|
|
1405
|
-
}
|
|
1406
|
-
|
|
1407
|
-
/***/ })
|
|
1408
|
-
|
|
1409
|
-
/******/ });
|
|
1410
|
-
/************************************************************************/
|
|
1411
|
-
/******/ // The module cache
|
|
1412
|
-
/******/ var __webpack_module_cache__ = {};
|
|
1413
|
-
/******/
|
|
1414
|
-
/******/ // The require function
|
|
1415
|
-
/******/ function __webpack_require__(moduleId) {
|
|
1416
|
-
/******/ // Check if module is in cache
|
|
1417
|
-
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
1418
|
-
/******/ if (cachedModule !== undefined) {
|
|
1419
|
-
/******/ return cachedModule.exports;
|
|
1420
|
-
/******/ }
|
|
1421
|
-
/******/ // Create a new module (and put it into the cache)
|
|
1422
|
-
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
1423
|
-
/******/ // no module.id needed
|
|
1424
|
-
/******/ // no module.loaded needed
|
|
1425
|
-
/******/ exports: {}
|
|
1426
|
-
/******/ };
|
|
1427
|
-
/******/
|
|
1428
|
-
/******/ // Execute the module function
|
|
1429
|
-
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
1430
|
-
/******/
|
|
1431
|
-
/******/ // Return the exports of the module
|
|
1432
|
-
/******/ return module.exports;
|
|
1433
|
-
/******/ }
|
|
1434
|
-
/******/
|
|
1435
|
-
/************************************************************************/
|
|
1436
|
-
/******/ /* webpack/runtime/define property getters */
|
|
1437
|
-
/******/ (() => {
|
|
1438
|
-
/******/ // define getter functions for harmony exports
|
|
1439
|
-
/******/ __webpack_require__.d = (exports, definition) => {
|
|
1440
|
-
/******/ for(var key in definition) {
|
|
1441
|
-
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
1442
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
1443
|
-
/******/ }
|
|
1444
|
-
/******/ }
|
|
1445
|
-
/******/ };
|
|
1446
|
-
/******/ })();
|
|
1447
|
-
/******/
|
|
1448
|
-
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
1449
|
-
/******/ (() => {
|
|
1450
|
-
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
1451
|
-
/******/ })();
|
|
1452
|
-
/******/
|
|
1453
|
-
/******/ /* webpack/runtime/make namespace object */
|
|
1454
|
-
/******/ (() => {
|
|
1455
|
-
/******/ // define __esModule on exports
|
|
1456
|
-
/******/ __webpack_require__.r = (exports) => {
|
|
1457
|
-
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
1458
|
-
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
1459
|
-
/******/ }
|
|
1460
|
-
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
1461
|
-
/******/ };
|
|
1462
|
-
/******/ })();
|
|
1463
|
-
/******/
|
|
1464
|
-
/******/ /* webpack/runtime/publicPath */
|
|
1465
|
-
/******/ (() => {
|
|
1466
|
-
/******/ __webpack_require__.p = "/";
|
|
1467
|
-
/******/ })();
|
|
1468
|
-
/******/
|
|
1469
|
-
/************************************************************************/
|
|
1470
|
-
var __webpack_exports__ = {};
|
|
1471
|
-
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
|
1472
|
-
(() => {
|
|
1473
|
-
/*!**************************!*\
|
|
1474
|
-
!*** ./tests/lolpack.js ***!
|
|
1475
|
-
\**************************/
|
|
1476
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1477
|
-
/* harmony import */ var _src_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/index.js */ "./src/index.js");
|
|
1478
|
-
/* harmony import */ var _page_loading_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./page-loading.js */ "./tests/page-loading.js");
|
|
1479
|
-
/* harmony import */ var _page_page1_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./page-page1.js */ "./tests/page-page1.js");
|
|
1480
|
-
/* harmony import */ var _page_page2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./page-page2.js */ "./tests/page-page2.js");
|
|
1481
|
-
/* harmony import */ var _page_page3_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./page-page3.js */ "./tests/page-page3.js");
|
|
1482
|
-
/* harmony import */ var _page_page4_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./page-page4.js */ "./tests/page-page4.js");
|
|
1483
|
-
/* harmony import */ var _page_pageX_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./page-pageX.js */ "./tests/page-pageX.js");
|
|
1484
|
-
/* harmony import */ var _page_page404_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./page-page404.js */ "./tests/page-page404.js");
|
|
1485
|
-
/* harmony import */ var _page_show_fail_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./page-show-fail.js */ "./tests/page-show-fail.js");
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
window.addEventListener('DOMContentLoaded', function () {
|
|
1496
|
-
_src_index_js__WEBPACK_IMPORTED_MODULE_0__.init({
|
|
1497
|
-
pageContainer: () => document.body,
|
|
1498
|
-
fetchPath: route => '/pages/' + route.routeName + '.htm',
|
|
1499
|
-
error404PageName: 'page404',
|
|
1500
|
-
beforeHide: message => new Promise(resolve => {
|
|
1501
|
-
resolve(confirm(message));
|
|
1502
|
-
})
|
|
1503
|
-
});
|
|
1504
|
-
|
|
1505
|
-
// listen for navigations
|
|
1506
|
-
document.addEventListener('click', e => {
|
|
1507
|
-
if (e.ctrlKey || e.metaKey) return;
|
|
1508
|
-
var $a = e.target.matches('a') ? e.target : e.target.closest('a');
|
|
1509
|
-
if (!$a) return;
|
|
1510
|
-
var href = $a.pathname + $a.search + $a.hash;
|
|
1511
|
-
_src_index_js__WEBPACK_IMPORTED_MODULE_0__.navigate(href);
|
|
1512
|
-
e.preventDefault();
|
|
1513
|
-
}, false);
|
|
1514
|
-
document.querySelector('.btnStack').addEventListener('click', e => {
|
|
1515
|
-
_src_index_js__WEBPACK_IMPORTED_MODULE_0__.printStack();
|
|
1516
|
-
});
|
|
1517
|
-
window.addEventListener("page-manager.url-changed", e => {
|
|
1518
|
-
console.log(e.detail.url);
|
|
1519
|
-
});
|
|
1520
|
-
});
|
|
1521
|
-
})();
|
|
1522
|
-
|
|
1523
|
-
/******/ })()
|
|
1524
|
-
;
|
|
1525
|
-
//# sourceMappingURL=main.js.map
|