@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trullock/page-manager",
3
- "version": "0.11.2",
3
+ "version": "0.13.0",
4
4
  "description": "Single page app manager",
5
5
  "exports": {
6
6
  ".": "./src/index.js"
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
- url: route,
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 page = pageHash[options.loadingPageName];
87
- var route = router.parse(page.url);
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 page = pageHash[options.loadingPageName];
93
- var route = router.parse(page.url);
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[page.url].page;
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
- pageCache[route.path] = {
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: new (route.pageClass)($html)
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.url)
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
- .then(page => {
167
- // clean initial load
168
- if(stackPointer == -1)
169
- {
170
- stack.push({ uid: 0, data, page });
171
- stackPointer = 0;
172
- }
173
- // page refresh
174
- else
175
- {
176
- stack[stackPointer].page = page;
177
- stack[stackPointer].data = data;
178
- }
179
- return page;
180
- })
181
- .then(page => doShow(page, data));
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
- return Promise.resolve(page.show(data))
217
- .then(() => document.title = page.title)
218
- // todo: hide() should be passed an event object
219
- .then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())
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 pageCache[pageHash[options.loadingPageName].url].page.hide()
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
- if(goal)
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: stackPointer == -1 ? 'load' : e.action || 'show' }).then(page => {
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 path in pageCache)
615
+ for (const key in pageCache)
613
616
  {
614
- pageCache[path].page.destroy && pageCache[path].page.destroy();
615
- if (!pageCache[path].page.constructor.existingDomSelector)
617
+ pageCache[key].page.destroy && pageCache[key].page.destroy();
618
+ if (!pageCache[key].page.constructor.existingDomSelector)
616
619
  {
617
- pageCache[path].$html.remove();
618
- delete pageCache[path];
620
+ pageCache[key].$html.remove();
621
+ delete pageCache[key];
619
622
  }
620
623
  }
621
624
  }
package/src/page.js CHANGED
@@ -5,6 +5,8 @@ export default class Page {
5
5
  this.visible = false;
6
6
  }
7
7
 
8
+ cacheMarkupBy = 'route'
9
+
8
10
  invalidateCache(){
9
11
  // TODO: pagemanager doesnt currently read this
10
12
  this.dirty = true;
@@ -7,6 +7,8 @@
7
7
  <a href="/page2">Page 2</a>
8
8
  <a href="/page3">Page 3</a>
9
9
  <a href="/page4">Page 4</a>
10
+ <a href="/page/A">Page A</a>
11
+ <a href="/page/B">Page B</a>
10
12
  <a href="/404">404</a>
11
13
  <a href="/dont-exist">I dont exist</a>
12
14
  <a href="/show-fail">I fail to show</a>
@@ -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
- url: route,
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 page = pageHash[options.loadingPageName];
648
- var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(page.url);
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 page = pageHash[options.loadingPageName];
653
- var route = _trullock_router__WEBPACK_IMPORTED_MODULE_0__["default"].parse(page.url);
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[page.url].page;
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
- pageCache[route.path] = {
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: new route.pageClass($html)
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.url);
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
- return Promise.resolve(page.show(data)).then(() => document.title = page.title)
751
- // todo: hide() should be passed an event object
752
- .then(() => pageCache[pageHash[options.loadingPageName].url].page.hide())
753
- // return page
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 pageCache[pageHash[options.loadingPageName].url].page.hide();
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
- if (goal) {
804
- if (data?.fallback) {
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: stackPointer == -1 ? 'load' : e.action || 'show'
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 path in pageCache) {
1079
- pageCache[path].page.destroy && pageCache[path].page.destroy();
1080
- if (!pageCache[path].page.constructor.existingDomSelector) {
1081
- pageCache[path].$html.remove();
1082
- delete pageCache[path];
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 _page_page404_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./page-page404.js */ "./tests/page-page404.js");
1429
- /* harmony import */ var _page_show_fail_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./page-show-fail.js */ "./tests/page-show-fail.js");
1483
+ /* harmony import */ var _page_pageX_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./page-pageX.js */ "./tests/page-pageX.js");
1484
+ /* harmony import */ var _page_page404_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./page-page404.js */ "./tests/page-page404.js");
1485
+ /* harmony import */ var _page_show_fail_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./page-show-fail.js */ "./tests/page-show-fail.js");
1486
+
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
 
@@ -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":""}
@@ -0,0 +1,4 @@
1
+ <div style="display:none;">
2
+ <h1 id="PageX">Page 4</h1>
3
+ <div style="background-image: linear-gradient(blue, red); height: 200%"></div>
4
+ </div>
package/tests/index.html CHANGED
@@ -7,6 +7,8 @@
7
7
  <a href="/page2">Page 2</a>
8
8
  <a href="/page3">Page 3</a>
9
9
  <a href="/page4">Page 4</a>
10
+ <a href="/page/A">Page A</a>
11
+ <a href="/page/B">Page B</a>
10
12
  <a href="/404">404</a>
11
13
  <a href="/dont-exist">I dont exist</a>
12
14
  <a href="/show-fail">I fail to show</a>
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
@@ -2,6 +2,8 @@ export default class Page {
2
2
 
3
3
  dirty = false;
4
4
 
5
+ cacheMarkupBy = 'route'
6
+
5
7
  constructor($page){
6
8
  this.$page = $page;
7
9
  }
@@ -0,0 +1,4 @@
1
+ <div style="display:none;">
2
+ <h1 id="PageX">Page 4</h1>
3
+ <div style="background-image: linear-gradient(blue, red); height: 200%"></div>
4
+ </div>