@trullock/page-manager 0.11.2 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +116 -0
- package/package.json +1 -1
- package/readme.md +11 -0
- package/src/index.js +74 -71
- package/src/page.js +2 -0
- package/tests/dist/index.html +2 -0
- package/tests/dist/main.js +102 -42
- package/tests/dist/main.js.map +1 -1
- package/tests/dist/pageX.htm +4 -0
- package/tests/index.html +2 -0
- package/tests/lolpack.js +7 -1
- package/tests/page-pageX.js +18 -0
- package/tests/page.js +2 -0
- package/tests/pageX.htm +4 -0
package/dist/main.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
3
|
+
* This devtool is neither made for production nor for readable output files.
|
|
4
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
5
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
6
|
+
* or disable the default devtool with "devtool: false".
|
|
7
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
8
|
+
*/
|
|
9
|
+
/******/ (() => { // webpackBootstrap
|
|
10
|
+
/******/ "use strict";
|
|
11
|
+
/******/ var __webpack_modules__ = ({
|
|
12
|
+
|
|
13
|
+
/***/ "./node_modules/@trullock/router/src/index.js":
|
|
14
|
+
/*!****************************************************!*\
|
|
15
|
+
!*** ./node_modules/@trullock/router/src/index.js ***!
|
|
16
|
+
\****************************************************/
|
|
17
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
18
|
+
|
|
19
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _pattern_lexer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pattern-lexer.js */ \"./node_modules/@trullock/router/src/pattern-lexer.js\");\n\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\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new class {\r\n\tconstructor() {\r\n\t\tthis.routes = [];\r\n\t\tthis.routesByName = {};\r\n\t\tthis.patternLexer = (0,_pattern_lexer_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\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}());\n\n//# sourceURL=webpack://@trullock/page-manager/./node_modules/@trullock/router/src/index.js?");
|
|
20
|
+
|
|
21
|
+
/***/ }),
|
|
22
|
+
|
|
23
|
+
/***/ "./node_modules/@trullock/router/src/pattern-lexer.js":
|
|
24
|
+
/*!************************************************************!*\
|
|
25
|
+
!*** ./node_modules/@trullock/router/src/pattern-lexer.js ***!
|
|
26
|
+
\************************************************************/
|
|
27
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
28
|
+
|
|
29
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {\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}\n\n//# sourceURL=webpack://@trullock/page-manager/./node_modules/@trullock/router/src/pattern-lexer.js?");
|
|
30
|
+
|
|
31
|
+
/***/ }),
|
|
32
|
+
|
|
33
|
+
/***/ "./src/index.js":
|
|
34
|
+
/*!**********************!*\
|
|
35
|
+
!*** ./src/index.js ***!
|
|
36
|
+
\**********************/
|
|
37
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
38
|
+
|
|
39
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"back\": () => (/* binding */ back),\n/* harmony export */ \"getPath\": () => (/* binding */ getPath),\n/* harmony export */ \"init\": () => (/* binding */ init),\n/* harmony export */ \"navigate\": () => (/* binding */ navigate),\n/* harmony export */ \"pages\": () => (/* binding */ pages),\n/* harmony export */ \"printStack\": () => (/* binding */ printStack),\n/* harmony export */ \"purgeCache\": () => (/* binding */ purgeCache),\n/* harmony export */ \"registerPage\": () => (/* binding */ registerPage),\n/* harmony export */ \"removeHistory\": () => (/* binding */ removeHistory),\n/* harmony export */ \"replace\": () => (/* binding */ replace),\n/* harmony export */ \"show\": () => (/* binding */ show)\n/* harmony export */ });\n/* harmony import */ var _trullock_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @trullock/router */ \"./node_modules/@trullock/router/src/index.js\");\n/* harmony import */ var _pageshowerror_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pageshowerror.js */ \"./src/pageshowerror.js\");\n\n\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\nconst pages = pageHash;\n\nfunction 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\t_trullock_router__WEBPACK_IMPORTED_MODULE_0__[\"default\"].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\nfunction getPath(name, values) {\n\tlet url = _trullock_router__WEBPACK_IMPORTED_MODULE_0__[\"default\"].interpolate(name, values);\n\tif (values?.hash)\n\t\turl += '#' + values.hash;\n\treturn url;\n}\n\n// TODO: 404 and error too?\nfunction initLoading()\n{\n\tvar page = pageHash[options.loadingPageName];\n\tvar route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__[\"default\"].parse(page.url);\n\treturn loadPage(route, {});\n}\n\nfunction showLoading() {\n\tvar page = pageHash[options.loadingPageName];\n\tvar route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__[\"default\"].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 = _trullock_router__WEBPACK_IMPORTED_MODULE_0__[\"default\"].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_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]('/', `Can't find page: '${url}'. Also can't find 404 page: '${options.error404PageName}'`, {}, 'replace'));\n\n\t\treturn Promise.reject(new _pageshowerror_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](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\nfunction doUpdate(page, data) {\n\n\treturn page.update(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\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\nasync 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[_trullock_router__WEBPACK_IMPORTED_MODULE_0__[\"default\"].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_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])\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_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])\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\nfunction 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\nfunction replace(url, data) {\n\turl = expandOnlyHash(url);\n\treturn showPage(url, data, { action: 'replace', distance: 0 });\n}\n\nfunction show(url, data) {\n\treturn showPage(url, data, { action: 'show', distance: 0 });\n}\n\nfunction back(data, checkBeforeUnload) {\n\tbackData = data || {};\n\thandlingBeforeUnload = checkBeforeUnload === false ? 'ignore' : false;\n\thistory.go(-1);\n}\n\nfunction 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\nfunction 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\nfunction 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\n//# sourceURL=webpack://@trullock/page-manager/./src/index.js?");
|
|
40
|
+
|
|
41
|
+
/***/ }),
|
|
42
|
+
|
|
43
|
+
/***/ "./src/pageshowerror.js":
|
|
44
|
+
/*!******************************!*\
|
|
45
|
+
!*** ./src/pageshowerror.js ***!
|
|
46
|
+
\******************************/
|
|
47
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
48
|
+
|
|
49
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PageShowError)\n/* harmony export */ });\nclass 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}\n\n//# sourceURL=webpack://@trullock/page-manager/./src/pageshowerror.js?");
|
|
50
|
+
|
|
51
|
+
/***/ })
|
|
52
|
+
|
|
53
|
+
/******/ });
|
|
54
|
+
/************************************************************************/
|
|
55
|
+
/******/ // The module cache
|
|
56
|
+
/******/ var __webpack_module_cache__ = {};
|
|
57
|
+
/******/
|
|
58
|
+
/******/ // The require function
|
|
59
|
+
/******/ function __webpack_require__(moduleId) {
|
|
60
|
+
/******/ // Check if module is in cache
|
|
61
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
62
|
+
/******/ if (cachedModule !== undefined) {
|
|
63
|
+
/******/ return cachedModule.exports;
|
|
64
|
+
/******/ }
|
|
65
|
+
/******/ // Create a new module (and put it into the cache)
|
|
66
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
67
|
+
/******/ // no module.id needed
|
|
68
|
+
/******/ // no module.loaded needed
|
|
69
|
+
/******/ exports: {}
|
|
70
|
+
/******/ };
|
|
71
|
+
/******/
|
|
72
|
+
/******/ // Execute the module function
|
|
73
|
+
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
74
|
+
/******/
|
|
75
|
+
/******/ // Return the exports of the module
|
|
76
|
+
/******/ return module.exports;
|
|
77
|
+
/******/ }
|
|
78
|
+
/******/
|
|
79
|
+
/************************************************************************/
|
|
80
|
+
/******/ /* webpack/runtime/define property getters */
|
|
81
|
+
/******/ (() => {
|
|
82
|
+
/******/ // define getter functions for harmony exports
|
|
83
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
84
|
+
/******/ for(var key in definition) {
|
|
85
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
86
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
87
|
+
/******/ }
|
|
88
|
+
/******/ }
|
|
89
|
+
/******/ };
|
|
90
|
+
/******/ })();
|
|
91
|
+
/******/
|
|
92
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
93
|
+
/******/ (() => {
|
|
94
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
95
|
+
/******/ })();
|
|
96
|
+
/******/
|
|
97
|
+
/******/ /* webpack/runtime/make namespace object */
|
|
98
|
+
/******/ (() => {
|
|
99
|
+
/******/ // define __esModule on exports
|
|
100
|
+
/******/ __webpack_require__.r = (exports) => {
|
|
101
|
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
102
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
103
|
+
/******/ }
|
|
104
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
105
|
+
/******/ };
|
|
106
|
+
/******/ })();
|
|
107
|
+
/******/
|
|
108
|
+
/************************************************************************/
|
|
109
|
+
/******/
|
|
110
|
+
/******/ // startup
|
|
111
|
+
/******/ // Load entry module and return exports
|
|
112
|
+
/******/ // This entry module can't be inlined because the eval devtool is used.
|
|
113
|
+
/******/ var __webpack_exports__ = __webpack_require__("./src/index.js");
|
|
114
|
+
/******/
|
|
115
|
+
/******/ })()
|
|
116
|
+
;
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -324,3 +324,14 @@ PageManager is built so that it can lazily fetch page markup. To do this, use th
|
|
|
324
324
|
prepareMarkup: $html => { },
|
|
325
325
|
```
|
|
326
326
|
|
|
327
|
+
## Events
|
|
328
|
+
|
|
329
|
+
When the URL has changed (including the first-load of the page), a custom DOM event is fired.
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
window.addEventListener("page-manager.url-changed", e => {
|
|
333
|
+
console.log(e.detail.url);
|
|
334
|
+
});
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
This can be useful for update the active link in navigations, for example.
|
package/src/index.js
CHANGED
|
@@ -60,7 +60,7 @@ export function registerPage(argA, argB, argC) {
|
|
|
60
60
|
router.addRoute(name, route, pageClass);
|
|
61
61
|
|
|
62
62
|
pageHash[name] = {
|
|
63
|
-
|
|
63
|
+
route: route,
|
|
64
64
|
pageClass: pageClass
|
|
65
65
|
}
|
|
66
66
|
}
|
|
@@ -80,17 +80,27 @@ export function refresh() {
|
|
|
80
80
|
showPage(frame.data.route.url, frame.data, 'replace');
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
function emitUrlChanged(url)
|
|
84
|
+
{
|
|
85
|
+
window.dispatchEvent(new CustomEvent('page-manager.url-changed', {
|
|
86
|
+
detail: {
|
|
87
|
+
url: url
|
|
88
|
+
},
|
|
89
|
+
bubbles: true
|
|
90
|
+
}))
|
|
91
|
+
}
|
|
92
|
+
|
|
83
93
|
// TODO: 404 and error too?
|
|
84
94
|
function initLoading()
|
|
85
95
|
{
|
|
86
|
-
var
|
|
87
|
-
var route = router.parse(
|
|
96
|
+
var entry = pageHash[options.loadingPageName];
|
|
97
|
+
var route = router.parse(entry.route);
|
|
88
98
|
return loadPage(route, {});
|
|
89
99
|
}
|
|
90
100
|
|
|
91
101
|
function showLoading() {
|
|
92
|
-
var
|
|
93
|
-
var route = router.parse(
|
|
102
|
+
var pageLookup = pageHash[options.loadingPageName];
|
|
103
|
+
var route = router.parse(pageLookup.route);
|
|
94
104
|
var data = {
|
|
95
105
|
route: route,
|
|
96
106
|
scrollY: window.scrollY,
|
|
@@ -99,11 +109,18 @@ function showLoading() {
|
|
|
99
109
|
}
|
|
100
110
|
};
|
|
101
111
|
|
|
102
|
-
var page = pageCache[
|
|
112
|
+
var page = pageCache[route.pattern].page;
|
|
103
113
|
|
|
104
114
|
return Promise.resolve(page.show(data));
|
|
105
115
|
}
|
|
106
116
|
|
|
117
|
+
function hideLoading() {
|
|
118
|
+
var pageLookup = pageHash[options.loadingPageName];
|
|
119
|
+
var route = router.parse(pageLookup.route);
|
|
120
|
+
var page = pageCache[route.pattern].page;
|
|
121
|
+
return Promise.resolve(page.hide());
|
|
122
|
+
}
|
|
123
|
+
|
|
107
124
|
function loadPage(route, data) {
|
|
108
125
|
|
|
109
126
|
var fetchPage = pageTemplateCache[route.pattern] ? Promise.resolve(pageTemplateCache[route.pattern]) : options.fetchPageTemplate(route);
|
|
@@ -112,12 +129,14 @@ function loadPage(route, data) {
|
|
|
112
129
|
var $html = $template.cloneNode(true);
|
|
113
130
|
options.prepareMarkup($html);
|
|
114
131
|
options.attachMarkup($html);
|
|
115
|
-
|
|
132
|
+
|
|
133
|
+
let page = new (route.pageClass)($html);
|
|
134
|
+
|
|
135
|
+
let cacheKey = page.cacheMarkupBy == 'path' ? route.path : route.pattern;
|
|
136
|
+
pageCache[cacheKey] = {
|
|
116
137
|
$html,
|
|
117
|
-
page
|
|
138
|
+
page
|
|
118
139
|
}
|
|
119
|
-
|
|
120
|
-
var page = pageCache[route.path].page;
|
|
121
140
|
|
|
122
141
|
let booted = new Promise(resolve => resolve(page.boot(data)));
|
|
123
142
|
return booted.then(() => page);
|
|
@@ -130,7 +149,7 @@ function showPage(url, data, event) {
|
|
|
130
149
|
console.error(`Can't find page: '${url}'`);
|
|
131
150
|
|
|
132
151
|
let page404 = pageHash[options.error404PageName];
|
|
133
|
-
route = router.parse(page404.
|
|
152
|
+
route = router.parse(page404.route)
|
|
134
153
|
}
|
|
135
154
|
|
|
136
155
|
data = data || {};
|
|
@@ -156,6 +175,9 @@ function showPage(url, data, event) {
|
|
|
156
175
|
if (pageCache[route.path])
|
|
157
176
|
return pageCache[route.path].page;
|
|
158
177
|
|
|
178
|
+
if (pageCache[route.pattern])
|
|
179
|
+
return pageCache[route.pattern].page;
|
|
180
|
+
|
|
159
181
|
return loadPage(route, data)
|
|
160
182
|
});
|
|
161
183
|
|
|
@@ -163,22 +185,22 @@ function showPage(url, data, event) {
|
|
|
163
185
|
if (event.action == 'load')
|
|
164
186
|
{
|
|
165
187
|
return getPage
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
188
|
+
.then(page => doShow(page, data))
|
|
189
|
+
.then(page => {
|
|
190
|
+
// clean initial load
|
|
191
|
+
if(stackPointer == -1)
|
|
192
|
+
{
|
|
193
|
+
stack.push({ uid: 0, data, page });
|
|
194
|
+
stackPointer = 0;
|
|
195
|
+
}
|
|
196
|
+
// page refresh
|
|
197
|
+
else
|
|
198
|
+
{
|
|
199
|
+
stack[stackPointer].page = page;
|
|
200
|
+
stack[stackPointer].data = data;
|
|
201
|
+
}
|
|
202
|
+
return page;
|
|
203
|
+
});
|
|
182
204
|
}
|
|
183
205
|
|
|
184
206
|
let currentState = stack[stackPointer];
|
|
@@ -209,26 +231,23 @@ function showPage(url, data, event) {
|
|
|
209
231
|
// });
|
|
210
232
|
}
|
|
211
233
|
|
|
212
|
-
function doShow(page, data) {
|
|
234
|
+
async function doShow(page, data) {
|
|
213
235
|
|
|
214
236
|
window.scroll(0, 0);
|
|
215
237
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
// return page
|
|
221
|
-
.then(() => page);
|
|
238
|
+
await Promise.resolve(page.show(data));
|
|
239
|
+
document.title = page.title;
|
|
240
|
+
await hideLoading();
|
|
241
|
+
return page;
|
|
222
242
|
}
|
|
223
243
|
|
|
224
244
|
|
|
225
245
|
async function doUpdate(page, data) {
|
|
226
246
|
|
|
227
247
|
await Promise.resolve(page.update(data));
|
|
228
|
-
|
|
229
248
|
document.title = page.title
|
|
230
249
|
// todo: hide() should be passed an event object
|
|
231
|
-
await
|
|
250
|
+
await hideLoading();
|
|
232
251
|
return page;
|
|
233
252
|
}
|
|
234
253
|
|
|
@@ -237,7 +256,8 @@ function handleHistoryAction(event, url, data, page) {
|
|
|
237
256
|
let newUid = stack[stackPointer].uid + 1;
|
|
238
257
|
|
|
239
258
|
window.history.pushState({ uid: newUid }, null, url);
|
|
240
|
-
|
|
259
|
+
emitUrlChanged(url);
|
|
260
|
+
|
|
241
261
|
// remove future
|
|
242
262
|
stack.splice(stackPointer + 1, stack.length - stackPointer);
|
|
243
263
|
|
|
@@ -253,7 +273,8 @@ function handleHistoryAction(event, url, data, page) {
|
|
|
253
273
|
|
|
254
274
|
let currentUid = stack[stackPointer].uid;
|
|
255
275
|
window.history.replaceState({ uid: currentUid }, null, url);
|
|
256
|
-
|
|
276
|
+
emitUrlChanged(url);
|
|
277
|
+
|
|
257
278
|
stack.pop();
|
|
258
279
|
stack.push({ uid: currentUid, data, page });
|
|
259
280
|
}
|
|
@@ -270,33 +291,8 @@ function handleHistoryAction(event, url, data, page) {
|
|
|
270
291
|
function doNavigate(url, data) {
|
|
271
292
|
|
|
272
293
|
if (url === 'goal') {
|
|
273
|
-
|
|
274
|
-
{
|
|
275
|
-
if(data?.fallback)
|
|
276
|
-
{
|
|
277
|
-
if(goal.url == getPath(options.defaultPageName))
|
|
278
|
-
{
|
|
279
|
-
url = data.fallback
|
|
280
|
-
data = data || {}
|
|
281
|
-
}
|
|
282
|
-
else
|
|
283
|
-
{
|
|
284
|
-
url = goal.url;
|
|
285
|
-
data = data || goal.data || {};
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
else
|
|
289
|
-
{
|
|
290
|
-
url == goal.url
|
|
291
|
-
data = data || goal.data || {};
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
else
|
|
295
|
-
{
|
|
296
|
-
url = getPath(options.defaultPageName)
|
|
297
|
-
data = data || {}
|
|
298
|
-
}
|
|
299
|
-
|
|
294
|
+
url = goal ? goal.url : data?.fallback || getPath(options.defaultPageName);
|
|
295
|
+
data = goal?.data || {}
|
|
300
296
|
goal = null;
|
|
301
297
|
}
|
|
302
298
|
|
|
@@ -350,12 +346,13 @@ export async function init(opts) {
|
|
|
350
346
|
await initLoading();
|
|
351
347
|
|
|
352
348
|
// set initial page
|
|
349
|
+
emitUrlChanged(window.location.pathname + window.location.search + window.location.hash);
|
|
353
350
|
showPage(window.location.pathname + window.location.search + window.location.hash, null, { action: 'load', distance: 0 }).catch(e => {
|
|
354
351
|
console.error(e);
|
|
355
352
|
|
|
356
353
|
if (e instanceof PageShowError)
|
|
357
354
|
{
|
|
358
|
-
return showPage(e.url, e.data, { action:
|
|
355
|
+
return showPage(e.url, e.data, { action: 'load', distance: 0 }).then(page => {
|
|
359
356
|
if(e.action == 'replace')
|
|
360
357
|
handleHistoryAction({ action: e.action }, e.url, e.data, page);
|
|
361
358
|
return page;
|
|
@@ -375,6 +372,8 @@ export async function init(opts) {
|
|
|
375
372
|
Object.assign(context.data, backData);
|
|
376
373
|
backData = {};
|
|
377
374
|
|
|
375
|
+
emitUrlChanged(context.data.route.url);
|
|
376
|
+
|
|
378
377
|
showPage(context.data.route.url, context.data, { action: direction, distance }).catch(e => {
|
|
379
378
|
console.error(e);
|
|
380
379
|
if (e instanceof PageShowError)
|
|
@@ -593,6 +592,10 @@ export function removeHistory(predicate)
|
|
|
593
592
|
else
|
|
594
593
|
window.history.pushState({ uid: currentState.uid }, null, currentState.data.route.url);
|
|
595
594
|
|
|
595
|
+
window.dispatchEvent(new CustomEvent('page-manager.url-changed', {
|
|
596
|
+
url: currentState.data.route.url
|
|
597
|
+
}))
|
|
598
|
+
|
|
596
599
|
// TODO: this doesnt seem to work when k=0
|
|
597
600
|
document.title = currentState.page.title;
|
|
598
601
|
|
|
@@ -609,13 +612,13 @@ export function removeHistory(predicate)
|
|
|
609
612
|
}
|
|
610
613
|
|
|
611
614
|
export function purgeCache() {
|
|
612
|
-
for (const
|
|
615
|
+
for (const key in pageCache)
|
|
613
616
|
{
|
|
614
|
-
pageCache[
|
|
615
|
-
if (!pageCache[
|
|
617
|
+
pageCache[key].page.destroy && pageCache[key].page.destroy();
|
|
618
|
+
if (!pageCache[key].page.constructor.existingDomSelector)
|
|
616
619
|
{
|
|
617
|
-
pageCache[
|
|
618
|
-
delete pageCache[
|
|
620
|
+
pageCache[key].$html.remove();
|
|
621
|
+
delete pageCache[key];
|
|
619
622
|
}
|
|
620
623
|
}
|
|
621
624
|
}
|
package/src/page.js
CHANGED
package/tests/dist/index.html
CHANGED
package/tests/dist/main.js
CHANGED
|
@@ -72,6 +72,20 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
72
72
|
|
|
73
73
|
/***/ }),
|
|
74
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
|
+
|
|
75
89
|
/***/ "./node_modules/@trullock/router/src/index.js":
|
|
76
90
|
/*!****************************************************!*\
|
|
77
91
|
!*** ./node_modules/@trullock/router/src/index.js ***!
|
|
@@ -626,7 +640,7 @@ function registerPage(argA, argB, argC) {
|
|
|
626
640
|
for (const [name, route] of Object.entries(namedRoutes)) {
|
|
627
641
|
_trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].addRoute(name, route, pageClass);
|
|
628
642
|
pageHash[name] = {
|
|
629
|
-
|
|
643
|
+
route: route,
|
|
630
644
|
pageClass: pageClass
|
|
631
645
|
};
|
|
632
646
|
}
|
|
@@ -641,16 +655,24 @@ function refresh() {
|
|
|
641
655
|
let frame = stack[stackPointer];
|
|
642
656
|
showPage(frame.data.route.url, frame.data, 'replace');
|
|
643
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
|
+
}
|
|
644
666
|
|
|
645
667
|
// TODO: 404 and error too?
|
|
646
668
|
function initLoading() {
|
|
647
|
-
var
|
|
648
|
-
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(
|
|
669
|
+
var entry = pageHash[options.loadingPageName];
|
|
670
|
+
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(entry.route);
|
|
649
671
|
return loadPage(route, {});
|
|
650
672
|
}
|
|
651
673
|
function showLoading() {
|
|
652
|
-
var
|
|
653
|
-
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(
|
|
674
|
+
var pageLookup = pageHash[options.loadingPageName];
|
|
675
|
+
var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(pageLookup.route);
|
|
654
676
|
var data = {
|
|
655
677
|
route: route,
|
|
656
678
|
scrollY: window.scrollY,
|
|
@@ -658,20 +680,27 @@ function showLoading() {
|
|
|
658
680
|
action: 'replace'
|
|
659
681
|
}
|
|
660
682
|
};
|
|
661
|
-
var page = pageCache[
|
|
683
|
+
var page = pageCache[route.pattern].page;
|
|
662
684
|
return Promise.resolve(page.show(data));
|
|
663
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
|
+
}
|
|
664
692
|
function loadPage(route, data) {
|
|
665
693
|
var fetchPage = pageTemplateCache[route.pattern] ? Promise.resolve(pageTemplateCache[route.pattern]) : options.fetchPageTemplate(route);
|
|
666
694
|
return fetchPage.then($template => {
|
|
667
695
|
var $html = $template.cloneNode(true);
|
|
668
696
|
options.prepareMarkup($html);
|
|
669
697
|
options.attachMarkup($html);
|
|
670
|
-
|
|
698
|
+
let page = new route.pageClass($html);
|
|
699
|
+
let cacheKey = page.cacheMarkupBy == 'path' ? route.path : route.pattern;
|
|
700
|
+
pageCache[cacheKey] = {
|
|
671
701
|
$html,
|
|
672
|
-
page
|
|
702
|
+
page
|
|
673
703
|
};
|
|
674
|
-
var page = pageCache[route.path].page;
|
|
675
704
|
let booted = new Promise(resolve => resolve(page.boot(data)));
|
|
676
705
|
return booted.then(() => page);
|
|
677
706
|
});
|
|
@@ -681,7 +710,7 @@ function showPage(url, data, event) {
|
|
|
681
710
|
if (route == null) {
|
|
682
711
|
console.error(`Can't find page: '${url}'`);
|
|
683
712
|
let page404 = pageHash[options.error404PageName];
|
|
684
|
-
route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(page404.
|
|
713
|
+
route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(page404.route);
|
|
685
714
|
}
|
|
686
715
|
data = data || {};
|
|
687
716
|
for (let key in route.params) data[key] = route.params[key];
|
|
@@ -702,6 +731,7 @@ function showPage(url, data, event) {
|
|
|
702
731
|
}
|
|
703
732
|
var getPage = showLoading().then(() => {
|
|
704
733
|
if (pageCache[route.path]) return pageCache[route.path].page;
|
|
734
|
+
if (pageCache[route.pattern]) return pageCache[route.pattern].page;
|
|
705
735
|
return loadPage(route, data);
|
|
706
736
|
});
|
|
707
737
|
|
|
@@ -745,19 +775,18 @@ function showPage(url, data, event) {
|
|
|
745
775
|
// });
|
|
746
776
|
}
|
|
747
777
|
|
|
748
|
-
function doShow(page, data) {
|
|
778
|
+
async function doShow(page, data) {
|
|
749
779
|
window.scroll(0, 0);
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
.then(() => page);
|
|
780
|
+
await Promise.resolve(page.show(data));
|
|
781
|
+
document.title = page.title;
|
|
782
|
+
await hideLoading();
|
|
783
|
+
return page;
|
|
755
784
|
}
|
|
756
785
|
async function doUpdate(page, data) {
|
|
757
786
|
await Promise.resolve(page.update(data));
|
|
758
787
|
document.title = page.title;
|
|
759
788
|
// todo: hide() should be passed an event object
|
|
760
|
-
await
|
|
789
|
+
await hideLoading();
|
|
761
790
|
return page;
|
|
762
791
|
}
|
|
763
792
|
function handleHistoryAction(event, url, data, page) {
|
|
@@ -766,6 +795,7 @@ function handleHistoryAction(event, url, data, page) {
|
|
|
766
795
|
window.history.pushState({
|
|
767
796
|
uid: newUid
|
|
768
797
|
}, null, url);
|
|
798
|
+
emitUrlChanged(url);
|
|
769
799
|
|
|
770
800
|
// remove future
|
|
771
801
|
stack.splice(stackPointer + 1, stack.length - stackPointer);
|
|
@@ -786,6 +816,7 @@ function handleHistoryAction(event, url, data, page) {
|
|
|
786
816
|
window.history.replaceState({
|
|
787
817
|
uid: currentUid
|
|
788
818
|
}, null, url);
|
|
819
|
+
emitUrlChanged(url);
|
|
789
820
|
stack.pop();
|
|
790
821
|
stack.push({
|
|
791
822
|
uid: currentUid,
|
|
@@ -800,23 +831,8 @@ function handleHistoryAction(event, url, data, page) {
|
|
|
800
831
|
}
|
|
801
832
|
function doNavigate(url, data) {
|
|
802
833
|
if (url === 'goal') {
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
if (goal.url == getPath(options.defaultPageName)) {
|
|
806
|
-
url = data.fallback;
|
|
807
|
-
data = data || {};
|
|
808
|
-
} else {
|
|
809
|
-
url = goal.url;
|
|
810
|
-
data = data || goal.data || {};
|
|
811
|
-
}
|
|
812
|
-
} else {
|
|
813
|
-
url == goal.url;
|
|
814
|
-
data = data || goal.data || {};
|
|
815
|
-
}
|
|
816
|
-
} else {
|
|
817
|
-
url = getPath(options.defaultPageName);
|
|
818
|
-
data = data || {};
|
|
819
|
-
}
|
|
834
|
+
url = goal ? goal.url : data?.fallback || getPath(options.defaultPageName);
|
|
835
|
+
data = goal?.data || {};
|
|
820
836
|
goal = null;
|
|
821
837
|
}
|
|
822
838
|
return showPage(url, data, {
|
|
@@ -863,6 +879,7 @@ async function init(opts) {
|
|
|
863
879
|
await initLoading();
|
|
864
880
|
|
|
865
881
|
// set initial page
|
|
882
|
+
emitUrlChanged(window.location.pathname + window.location.search + window.location.hash);
|
|
866
883
|
showPage(window.location.pathname + window.location.search + window.location.hash, null, {
|
|
867
884
|
action: 'load',
|
|
868
885
|
distance: 0
|
|
@@ -870,7 +887,8 @@ async function init(opts) {
|
|
|
870
887
|
console.error(e);
|
|
871
888
|
if (e instanceof PageShowError) {
|
|
872
889
|
return showPage(e.url, e.data, {
|
|
873
|
-
action:
|
|
890
|
+
action: 'load',
|
|
891
|
+
distance: 0
|
|
874
892
|
}).then(page => {
|
|
875
893
|
if (e.action == 'replace') handleHistoryAction({
|
|
876
894
|
action: e.action
|
|
@@ -889,6 +907,7 @@ async function init(opts) {
|
|
|
889
907
|
}
|
|
890
908
|
if (direction == 'back') Object.assign(context.data, backData);
|
|
891
909
|
backData = {};
|
|
910
|
+
emitUrlChanged(context.data.route.url);
|
|
892
911
|
showPage(context.data.route.url, context.data, {
|
|
893
912
|
action: direction,
|
|
894
913
|
distance
|
|
@@ -1063,6 +1082,9 @@ function removeHistory(predicate) {
|
|
|
1063
1082
|
}, null, currentState.data.route.url);else window.history.pushState({
|
|
1064
1083
|
uid: currentState.uid
|
|
1065
1084
|
}, null, currentState.data.route.url);
|
|
1085
|
+
window.dispatchEvent(new CustomEvent('page-manager.url-changed', {
|
|
1086
|
+
url: currentState.data.route.url
|
|
1087
|
+
}));
|
|
1066
1088
|
|
|
1067
1089
|
// TODO: this doesnt seem to work when k=0
|
|
1068
1090
|
document.title = currentState.page.title;
|
|
@@ -1075,11 +1097,11 @@ function removeHistory(predicate) {
|
|
|
1075
1097
|
});
|
|
1076
1098
|
}
|
|
1077
1099
|
function purgeCache() {
|
|
1078
|
-
for (const
|
|
1079
|
-
pageCache[
|
|
1080
|
-
if (!pageCache[
|
|
1081
|
-
pageCache[
|
|
1082
|
-
delete pageCache[
|
|
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];
|
|
1083
1105
|
}
|
|
1084
1106
|
}
|
|
1085
1107
|
}
|
|
@@ -1281,6 +1303,38 @@ function _toPrimitive(input, hint) { if (typeof input !== "object" || input ===
|
|
|
1281
1303
|
|
|
1282
1304
|
/***/ }),
|
|
1283
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
|
+
|
|
1284
1338
|
/***/ "./tests/page-show-fail.js":
|
|
1285
1339
|
/*!*********************************!*\
|
|
1286
1340
|
!*** ./tests/page-show-fail.js ***!
|
|
@@ -1328,6 +1382,7 @@ function _toPrimitive(input, hint) { if (typeof input !== "object" || input ===
|
|
|
1328
1382
|
class Page {
|
|
1329
1383
|
constructor($page) {
|
|
1330
1384
|
_defineProperty(this, "dirty", false);
|
|
1385
|
+
_defineProperty(this, "cacheMarkupBy", 'route');
|
|
1331
1386
|
this.$page = $page;
|
|
1332
1387
|
}
|
|
1333
1388
|
get title() {
|
|
@@ -1425,8 +1480,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1425
1480
|
/* harmony import */ var _page_page2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./page-page2.js */ "./tests/page-page2.js");
|
|
1426
1481
|
/* harmony import */ var _page_page3_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./page-page3.js */ "./tests/page-page3.js");
|
|
1427
1482
|
/* harmony import */ var _page_page4_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./page-page4.js */ "./tests/page-page4.js");
|
|
1428
|
-
/* harmony import */ var
|
|
1429
|
-
/* harmony import */ var
|
|
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
|
+
|
|
1430
1487
|
|
|
1431
1488
|
|
|
1432
1489
|
|
|
@@ -1457,6 +1514,9 @@ window.addEventListener('DOMContentLoaded', function () {
|
|
|
1457
1514
|
document.querySelector('.btnStack').addEventListener('click', e => {
|
|
1458
1515
|
_src_index_js__WEBPACK_IMPORTED_MODULE_0__.printStack();
|
|
1459
1516
|
});
|
|
1517
|
+
window.addEventListener("page-manager.url-changed", e => {
|
|
1518
|
+
console.log(e.detail.url);
|
|
1519
|
+
});
|
|
1460
1520
|
});
|
|
1461
1521
|
})();
|
|
1462
1522
|
|
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;;;;;;;;;;;;;;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,kBAAkB,GAAG,KAAK;AAC9B,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-show-fail.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 handlingBeforeHide = 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\tbeforeHide: 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\t\n\t\tlet page404 = pageHash[options.error404PageName];\n\t\troute = router.parse(page404.url)\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\t// BUG: you can replace the current state with the same url as the previous state, which shouldnt be allowed, \n\t\t// you cant have the same url in the history twice (next to each other).\n\t\t// Update this to check for such a case and handle it\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\tif(goal)\n\t\t{\n\t\t\tif(data?.fallback)\n\t\t\t{\n\t\t\t\tif(goal.url == getPath(options.defaultPageName))\n\t\t\t\t{\n\t\t\t\t\turl = data.fallback\n\t\t\t\t\tdata = data || {}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\turl = goal.url;\n\t\t\t\t\tdata = data || goal.data || {};\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\turl == goal.url\n\t\t\t\tdata = data || goal.data || {};\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\turl = getPath(options.defaultPageName)\n\t\t\tdata = data || {}\n\t\t}\n\t\t\n\t\tgoal = null;\n\t}\n\n\treturn showPage(url, data, { action: 'push', distance: 0 });\n}\n\nfunction storageAvailable() {\n try {\n var x = '__storage_test__';\n window.sessionStorage.setItem(x, x);\n window.sessionStorage.removeItem(x);\n return true;\n }\n catch(e) {\n return false;\n }\n}\n\nexport 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 handleBeforeHidePart1() {\n\t\t// if we're ignoring beforeHide this navigation\n\t\tif (handlingBeforeHide === 'ignore') {\n\t\t\thandlingBeforeHide = 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.beforeHide && options.beforeHide && handlingBeforeHide === false) {\n\t\t\tvar interrupt = stack[stackPointer].page.beforeHide();\n\t\t\tif (interrupt) {\n\t\t\t\thandlingBeforeHide = '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 beforeHiding\n\t\tif (handlingBeforeHide === 'step2')\n\t\t\thandlingBeforeHide = false;\n\n\t\treturn false;\n\t}\n\n\tfunction handleBeforeHidePart2() {\n\t\tif (handlingBeforeHide !== 'step1')\n\t\t\treturn false;\n\n\t\t// do the beforeHide action, then...\n\t\toptions.beforeHide(stack[stackPointer].page.beforeHide()).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\thandlingBeforeHide = '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\thandlingBeforeHide = 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 = handleBeforeHidePart2();\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 = handleBeforeHidePart1();\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, checkBeforeHide = true) {\n\n\turl = expandOnlyHash(url);\n\n\tif (checkBeforeHide === true && stack[stackPointer].page.beforeHide && options.beforeHide) {\n\n\t\tvar interrupt = stack[stackPointer].page.beforeHide();\n\t\tif (interrupt !== false) {\n\t\t\toptions.beforeHide(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, checkBeforeHide) {\n\tbackData = data || {};\n\thandlingBeforeHide = checkBeforeHide === 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\tbeforeHide = () => 'Are you sure?'\r\n\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});","import './page404.htm' // doesnt matter\r\nimport Page from './page.js';\r\nimport {registerPage, PageShowError} from '@trullock/page-manager';\r\n\r\nexport default registerPage('pageShowFail', '/show-fail', 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 pageShowFail, showing page1 instead', {}, 'replace')\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\nimport pageShowFail from './page-show-fail.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\tbeforeHide: message => new Promise(resolve => {\r\n\t\t\tresolve(confirm(message))\r\n\t\t})\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","handlingBeforeHide","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","beforeHide","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","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","PageShowError","handlePopstate","context","direction","handleBeforeHidePart1","setTimeout","back","forward","handleBeforeHidePart2","result","addEventListener","interrupted","state","previousUid","Math","abs","findContext","stackToSerialize","map","s","stackToStore","stringify","i","expandOnlyHash","startsWith","currentUrl","hashIndex","indexOf","substr","navigate","checkBeforeHide","replace","go","printStack","log","removeHistory","predicate","statesToKeep","reject","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","pageShowFail","pageContainer","confirm","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;;;;;;;;;;;;;;ACAtD,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;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,kBAAkB,GAAG,KAAK;AAC9B,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,CAAC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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/./tests/pageX.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-pageX.js","webpack://@trullock/page-manager/./tests/page-show-fail.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\";","export default __webpack_public_path__ + \"pageX.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 handlingBeforeHide = 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\tbeforeHide: 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\troute: 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\nfunction emitUrlChanged(url)\n{\n\twindow.dispatchEvent(new CustomEvent('page-manager.url-changed', { \n\t\tdetail: {\n\t\t\turl: url\n\t\t},\n\t\tbubbles: true\n\t}))\n}\n\n// TODO: 404 and error too?\nfunction initLoading()\n{\n\tvar entry = pageHash[options.loadingPageName];\n\tvar route = router.parse(entry.route);\n\treturn loadPage(route, {});\n}\n\nfunction showLoading() {\n\tvar pageLookup = pageHash[options.loadingPageName];\n\tvar route = router.parse(pageLookup.route);\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[route.pattern].page;\n\n\treturn Promise.resolve(page.show(data));\n}\n\nfunction hideLoading() {\n\tvar pageLookup = pageHash[options.loadingPageName];\n\tvar route = router.parse(pageLookup.route);\n\tvar page = pageCache[route.pattern].page;\n\treturn Promise.resolve(page.hide());\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\n\t\tlet page = new (route.pageClass)($html);\n\n\t\tlet cacheKey = page.cacheMarkupBy == 'path' ? route.path : route.pattern;\n\t\tpageCache[cacheKey] = {\n\t\t\t$html,\n\t\t\tpage\n\t\t}\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\t\n\t\tlet page404 = pageHash[options.error404PageName];\n\t\troute = router.parse(page404.route)\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\tif (pageCache[route.pattern])\n\t\t\treturn pageCache[route.pattern].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\nasync function doShow(page, data) {\n\n\twindow.scroll(0, 0);\n\n\tawait Promise.resolve(page.show(data));\n\tdocument.title = page.title;\n\tawait hideLoading();\n\treturn page;\n}\n\n\nasync function doUpdate(page, data) {\n\n\tawait Promise.resolve(page.update(data));\n\tdocument.title = page.title\n\t// todo: hide() should be passed an event object\n\tawait hideLoading();\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\temitUrlChanged(url);\n\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\t// BUG: you can replace the current state with the same url as the previous state, which shouldnt be allowed, \n\t\t// you cant have the same url in the history twice (next to each other).\n\t\t// Update this to check for such a case and handle it\n\n\t\tlet currentUid = stack[stackPointer].uid;\n\t\twindow.history.replaceState({ uid: currentUid }, null, url);\n\t\temitUrlChanged(url);\n\n\t\tstack.pop();\n\t\tstack.push({ uid: currentUid, data, page });\n\t}\n\telse if(event.action == 'back')\n\t{\n\t\tstackPointer -= event.distance;\n\t}\n\telse if (event.action == 'fwd')\n\t{\n\t\tstackPointer += event.distance;\n\t}\t\n}\n\nfunction doNavigate(url, data) {\n\n\tif (url === 'goal') {\n\t\turl = goal ? goal.url : data?.fallback || getPath(options.defaultPageName);\n\t\tdata = goal?.data || {}\n\t\tgoal = null;\n\t}\n\n\treturn showPage(url, data, { action: 'push', distance: 0 });\n}\n\nfunction storageAvailable() {\n try {\n var x = '__storage_test__';\n window.sessionStorage.setItem(x, x);\n window.sessionStorage.removeItem(x);\n return true;\n }\n catch(e) {\n return false;\n }\n}\n\nexport 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\temitUrlChanged(window.location.pathname + window.location.search + window.location.hash);\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: 'load', distance: 0 }).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\temitUrlChanged(context.data.route.url);\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 handleBeforeHidePart1() {\n\t\t// if we're ignoring beforeHide this navigation\n\t\tif (handlingBeforeHide === 'ignore') {\n\t\t\thandlingBeforeHide = 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.beforeHide && options.beforeHide && handlingBeforeHide === false) {\n\t\t\tvar interrupt = stack[stackPointer].page.beforeHide();\n\t\t\tif (interrupt) {\n\t\t\t\thandlingBeforeHide = '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 beforeHiding\n\t\tif (handlingBeforeHide === 'step2')\n\t\t\thandlingBeforeHide = false;\n\n\t\treturn false;\n\t}\n\n\tfunction handleBeforeHidePart2() {\n\t\tif (handlingBeforeHide !== 'step1')\n\t\t\treturn false;\n\n\t\t// do the beforeHide action, then...\n\t\toptions.beforeHide(stack[stackPointer].page.beforeHide()).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\thandlingBeforeHide = '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\thandlingBeforeHide = 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 = handleBeforeHidePart2();\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 = handleBeforeHidePart1();\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, checkBeforeHide = true) {\n\n\turl = expandOnlyHash(url);\n\n\tif (checkBeforeHide === true && stack[stackPointer].page.beforeHide && options.beforeHide) {\n\n\t\tvar interrupt = stack[stackPointer].page.beforeHide();\n\t\tif (interrupt !== false) {\n\t\t\toptions.beforeHide(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, checkBeforeHide) {\n\tbackData = data || {};\n\thandlingBeforeHide = checkBeforeHide === 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\twindow.dispatchEvent(new CustomEvent('page-manager.url-changed', { \n\t\t\t\t\turl: currentState.data.route.url\n\t\t\t\t}))\n\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 key in pageCache)\n\t{\n\t\tpageCache[key].page.destroy && pageCache[key].page.destroy();\n\t\tif (!pageCache[key].page.constructor.existingDomSelector)\n\t\t{\n\t\t\tpageCache[key].$html.remove();\n\t\t\tdelete pageCache[key];\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\tbeforeHide = () => 'Are you sure?'\r\n\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});","import './pageX.htm'\r\nimport Page from './page.js';\r\nimport {registerPage, PageShowError} from '@trullock/page-manager';\r\n\r\nexport default registerPage('pageX', '/page/{x}', class extends Page {\r\n\r\n\ttitle = \"Page X\";\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\tthis.$page.querySelector('#PageX').textContent = \"Page: \" + opts.x;\r\n\t\treturn super.show(opts);\r\n\t}\r\n});","import './page404.htm' // doesnt matter\r\nimport Page from './page.js';\r\nimport {registerPage, PageShowError} from '@trullock/page-manager';\r\n\r\nexport default registerPage('pageShowFail', '/show-fail', 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 pageShowFail, showing page1 instead', {}, 'replace')\r\n\t}\r\n});","export default class Page {\r\n\r\n\tdirty = false;\r\n\r\n\tcacheMarkupBy = 'route'\r\n\t\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 pageX from './page-pageX.js'\r\nimport page404 from './page-page404.js'\r\nimport pageShowFail from './page-show-fail.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\tbeforeHide: message => new Promise(resolve => {\r\n\t\t\tresolve(confirm(message))\r\n\t\t})\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\t\t\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\r\n\t\r\n\twindow.addEventListener(\"page-manager.url-changed\", e => {\r\n\t\tconsole.log(e.detail.url);\r\n\t});\r\n});"],"names":["router","pageHash","pageCache","pageTemplateCache","stack","stackPointer","manuallyAdjustingHistory","handlingBeforeHide","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","beforeHide","pages","registerPage","argA","argB","argC","namedRoutes","pageClass","undefined","name","Object","entries","addRoute","getPath","values","url","interpolate","hash","refresh","frame","showPage","data","emitUrlChanged","window","dispatchEvent","CustomEvent","detail","bubbles","initLoading","entry","parse","loadPage","showLoading","pageLookup","scrollY","event","action","page","Promise","resolve","show","hideLoading","hide","fetchPage","cloneNode","cacheKey","cacheMarkupBy","path","booted","boot","console","error","page404","key","params","interrupt","getPage","doShow","push","uid","currentState","handleHistoryAction","doUpdate","all","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","PageShowError","handlePopstate","context","direction","handleBeforeHidePart1","setTimeout","back","forward","handleBeforeHidePart2","result","addEventListener","interrupted","state","previousUid","Math","abs","findContext","stackToSerialize","map","s","stackToStore","stringify","i","expandOnlyHash","startsWith","currentUrl","hashIndex","indexOf","substr","navigate","checkBeforeHide","replace","go","printStack","log","removeHistory","predicate","statesToKeep","reject","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","pageX","pageShowFail","pageContainer","confirm","ctrlKey","metaKey","$a","target","matches","closest","href","preventDefault"],"sourceRoot":""}
|
package/tests/index.html
CHANGED
package/tests/lolpack.js
CHANGED
|
@@ -5,6 +5,7 @@ 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 pageX from './page-pageX.js'
|
|
8
9
|
import page404 from './page-page404.js'
|
|
9
10
|
import pageShowFail from './page-show-fail.js'
|
|
10
11
|
|
|
@@ -30,11 +31,16 @@ window.addEventListener('DOMContentLoaded', function () {
|
|
|
30
31
|
|
|
31
32
|
var href = $a.pathname + $a.search + $a.hash;
|
|
32
33
|
pageManager.navigate(href)
|
|
33
|
-
|
|
34
|
+
|
|
34
35
|
e.preventDefault();
|
|
35
36
|
}, false);
|
|
36
37
|
|
|
37
38
|
document.querySelector('.btnStack').addEventListener('click', e => {
|
|
38
39
|
pageManager.printStack();
|
|
39
40
|
})
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
window.addEventListener("page-manager.url-changed", e => {
|
|
44
|
+
console.log(e.detail.url);
|
|
45
|
+
});
|
|
40
46
|
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import './pageX.htm'
|
|
2
|
+
import Page from './page.js';
|
|
3
|
+
import {registerPage, PageShowError} from '@trullock/page-manager';
|
|
4
|
+
|
|
5
|
+
export default registerPage('pageX', '/page/{x}', class extends Page {
|
|
6
|
+
|
|
7
|
+
title = "Page X";
|
|
8
|
+
|
|
9
|
+
constructor($page) {
|
|
10
|
+
super($page);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
show(opts)
|
|
14
|
+
{
|
|
15
|
+
this.$page.querySelector('#PageX').textContent = "Page: " + opts.x;
|
|
16
|
+
return super.show(opts);
|
|
17
|
+
}
|
|
18
|
+
});
|
package/tests/page.js
CHANGED
package/tests/pageX.htm
ADDED