simplyview 3.1.3 → 3.3.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/simply.app.js +115 -43
- package/dist/simply.app.min.js +1 -1
- package/dist/simply.app.min.js.map +3 -3
- package/dist/simply.everything.js +138 -45
- package/dist/simply.everything.min.js +1 -1
- package/dist/simply.everything.min.js.map +3 -3
- package/package.json +1 -1
- package/src/action.mjs +52 -19
- package/src/activate.mjs +24 -2
- package/src/app.mjs +47 -5
- package/src/key.mjs +1 -1
- package/src/route.mjs +27 -23
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/activate.mjs", "../src/action.mjs", "../src/route.mjs", "../src/command.mjs", "../src/key.mjs", "../src/view.mjs", "../src/app.mjs", "../src/include.mjs", "../src/render.mjs", "../src/everything.mjs"],
|
|
4
|
-
"sourcesContent": ["const listeners = new Map()\n\nexport const activate = {\n addListener: (name, callback) => {\n if (!listeners.has(name)) {\n listeners.set(name, [])\n }\n listeners.get(name).push(callback)\n initialCall(name)\n },\n removeListener: (name, callback) => {\n if (!listeners.has(name)) {\n return false\n }\n listeners.set(name, listeners.get(name).filter((listener) => {\n return listener!=callback\n }))\n }\n}\n\nfunction initialCall(name) {\n const nodes = document.querySelectorAll('[data-simply-activate=\"'+name+'\"]')\n if (nodes) {\n for( let node of nodes) {\n callListeners(node)\n }\n }\n}\n\nfunction callListeners(node) {\n const activate = node?.dataset?.simplyActivate\n if (activate && listeners.has(activate)) {\n for (let callback of listeners.get(activate)) {\n callback.call(node)\n }\n }\n}\n\nfunction handleChanges(changes) {\n let activateNodes = []\n for (let change of changes) {\n if (change.type == 'childList') {\n for (let node of change.addedNodes) {\n if (node.querySelectorAll) {\n var toActivate = Array.from(node.querySelectorAll('[data-simply-activate]'))\n if (node.matches('[data-simply-activate]')) {\n toActivate.push(node)\n }\n activateNodes = activateNodes.concat(toActivate)\n }\n }\n }\n }\n for (let node of activateNodes) {\n callListeners(node)\n }\n}\n\nconst observer = new MutationObserver(handleChanges)\nobserver.observe(document, {\n subtree: true,\n childList: true\n})", "export function actions(options, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = app\n\t}\n\tif (options.app) {\n\t\tconst actionHandler = {\n\t\t\tget(target, property) {\n\t\t\t\tif (!target[property]) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tif (target.catch) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), functionHandler)\n\t\t\t\t} else {\n\t\t\t\t\treturn target[property].bind(options.app)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Proxy(options.actions, actionHandler)\n\t} else {\n\t\treturn options\n\t}\n}\n\nconst functionHandler = {\n\tapply(target, thisArg, argumentsList) {\n\t\ttry {\n\t\t\tconst result = target(...argumentsList)\n\t\t\tif (result instanceof Promise) {\n\t\t\t\treturn result.catch(err => {\n\t\t\t\t\treturn thisArg.catch(err)\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn result\n\t\t} catch(err) {\n\t\t\treturn thisArg.catch(err)\n\t\t}\n\t}\n}", "export function routes(options, optionsCompat)\n{\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n return new SimplyRoute(options)\n}\n\nclass SimplyRoute\n{\n constructor(options={})\n {\n this.root = options.root || '/'\n this.app = options.app || {}\n this.addMissingSlash = !!options.addMissingSlash\n this.matchExact = !!options.matchExact\n this.clear()\n if (options.routes) {\n this.load(options.routes)\n }\n }\n\n load(routes)\n {\n parseRoutes(routes, this.routeInfo, this.matchExact)\n }\n\n clear()\n {\n this.routeInfo = []\n this.listeners = {\n match: {},\n call: {},\n goto: {},\n finish: {}\n }\n }\n\n match(path, options)\n {\n let args = {\n path,\n options\n }\n args = this.runListeners('match',args)\n path = args.path ? args.path : path;\n\n let matches;\n if (!path) {\n if (this.match(document.location.pathname+document.location.hash)) {\n return true;\n } else {\n return this.match(document.location.pathname);\n }\n }\n path = getPath(path);\n for ( let route of this.routeInfo) {\n matches = route.match.exec(path)\n if (this.addMissingSlash && !matches?.length) {\n if (path && path[path.length-1]!='/') {\n matches = route.match.exec(path+'/')\n if (matches) {\n path+='/'\n history.replaceState({}, '', getURL(path, this.root))\n }\n }\n }\n if (matches && matches.length) {\n let params = {};\n route.params.forEach((key, i) => {\n if (key=='*') {\n key = 'remainder'\n }\n params[key] = matches[i+1]\n })\n Object.assign(params, options)\n args.route = route\n args.params = params\n args = this.runListeners('call', args)\n params = args.params ? args.params : params\n const searchParams = new URLSearchParams(document.location.search)\n args.result = route.action.call(this.app, params, searchParams)\n this.runListeners('finish', args)\n return args.result\n }\n }\n return false\n }\n\n runListeners(action, params)\n {\n if (!Object.keys(this.listeners[action])) {\n return\n }\n Object.keys(this.listeners[action]).forEach((route) => {\n var routeRe = getRegexpFromRoute(route);\n if (routeRe.exec(params.path)) {\n var result;\n for (let callback of this.listeners[action][route]) {\n result = callback.call(this.app, params)\n if (result) {\n params = result\n }\n }\n }\n })\n return params\n }\n\n handleEvents()\n {\n globalThis.addEventListener('popstate', () => {\n if (this.match(getPath(document.location.pathname + document.location.hash, this.root)) === false) {\n this.match(getPath(document.location.pathname, this.root))\n }\n })\n this.app.container.addEventListener('click', (evt) => {\n if (evt.ctrlKey) {\n return;\n }\n if (evt.which != 1) {\n return; // not a 'left' mouse click\n }\n var link = evt.target;\n while (link && link.tagName!='A') {\n link = link.parentElement;\n }\n if (link \n && link.pathname \n && link.hostname==globalThis.location.hostname \n && !link.link\n && !link.dataset.simplyCommand\n ) {\n let path = getPath(link.pathname+link.hash, this.root);\n if ( !this.has(path) ) {\n path = getPath(link.pathname, this.root);\n }\n if ( this.has(path) ) {\n let params = this.runListeners('goto', { path: path});\n if (params.path) {\n if (this.goto(params.path)) {\n // now cancel the browser navigation, since a route handler was found\n evt.preventDefault();\n return false;\n }\n }\n }\n }\n })\n }\n\n goto(path)\n {\n history.pushState({},'',getURL(path, this.root))\n return this.match(path)\n }\n\n has(path)\n {\n path = getPath(path, this.root)\n for (let route of this.routeInfo) {\n var matches = route.match.exec(path)\n if (matches && matches.length) {\n return true\n }\n }\n return false\n }\n\n addListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n this.listeners[action][route] = []\n }\n this.listeners[action][route].push(callback)\n }\n\n removeListener(action, route, callback)\n {\n if (['match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n return\n }\n this.listeners[action][route] = this.listeners[action][route].filter((listener) => {\n return listener != callback\n })\n }\n\n init(options)\n {\n if (options.root) {\n this.root = options.root\n }\n }\n}\n\nfunction getPath(path, root='/')\n{\n if (path.substring(0,root.length)==root\n ||\n ( root[root.length-1]=='/' \n && path.length==(root.length-1)\n && path == root.substring(0,path.length)\n )\n ) {\n path = path.substring(root.length)\n }\n if (path[0]!='/' && path[0]!='#') {\n path = '/'+path\n }\n return path\n}\n\nfunction getURL(path, root)\n{\n path = getPath(path, root)\n if (root[root.length-1]==='/' && path[0]==='/') {\n path = path.substring(1)\n }\n return root + path;\n}\n\nfunction getRegexpFromRoute(route, exact=false)\n{\n if (exact) {\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)')+'(\\\\?|$)')\n }\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)'))\n}\n\nfunction parseRoutes(routes, routeInfo, exact=false)\n{\n const paths = Object.keys(routes)\n const matchParams = /:(\\w+|\\*)/g\n for (let path of paths) {\n let matches = []\n let params = []\n do {\n matches = matchParams.exec(path)\n if (matches) {\n params.push(matches[1])\n }\n } while(matches)\n routeInfo.push({\n match: getRegexpFromRoute(path, exact),\n params: params,\n action: routes[path]\n })\n }\n return routeInfo\n}", "class SimplyCommands {\n\tconstructor(options={}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n this.app = options.app\n\t\tthis.$handlers = options.handlers || defaultHandlers\n if (options.commands) {\n \t\tObject.assign(this, options.commands)\n }\n\n\t\tconst commandHandler = (evt) => {\n\t\t\tconst command = getCommand(evt, this.$handlers)\n\t\t\tif (!command) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this[command.name]) {\n console.error('simply.command: undefined command '+command.name, command.source);\n return\n\t\t\t}\n const shouldContinue = this[command.name].call(options.app, command.source, command.value)\n if (shouldContinue!==true) {\n evt.preventDefault()\n evt.stopPropagation()\n return false\n }\n\t\t}\n\n options.app.container.addEventListener('click', commandHandler)\n options.app.container.addEventListener('submit', commandHandler)\n options.app.container.addEventListener('change', commandHandler)\n options.app.container.addEventListener('input', commandHandler)\n\t}\n\n call(command, el, value) {\n if (!this[command]) {\n console.error('simply.command: undefined command '+command);\n return\n }\n return this[command].call(this.app, el, value)\n }\n\n action(name) {\n console.warn('deprecated call to `this.commands.action`')\n let params = Array.from(arguments).slice()\n params.shift()\n return this.app.actions[name](...params)\n }\n\n appendHandler(handler) {\n this.$handlers.push(handler)\n }\n\n prependHandler(handler) {\n this.$handlers.unshift(handler)\n }\n}\n\nexport function commands(options={}, optionsCompat) {\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n\treturn new SimplyCommands(options)\n}\n\nfunction getCommand(evt, handlers) {\n var el = evt.target.closest('[data-simply-command]')\n if (el) {\n for (let handler of handlers) {\n if (el.matches(handler.match)) {\n if (handler.check(el, evt)) {\n return {\n name: el.dataset.simplyCommand,\n source: el,\n value: handler.get(el)\n }\n }\n return null\n }\n }\n }\n return null\n}\n\nconst defaultHandlers = [\n {\n match: 'input,select,textarea',\n get: function(el) {\n if (el.tagName==='SELECT' && el.multiple) {\n let values = []\n for (let option of el.options) {\n if (option.selected) {\n values.push(option.value)\n }\n }\n return values\n }\n return el.dataset.simplyValue || el.value\n },\n check: function(el, evt) {\n return evt.type=='change' || (el.dataset.simplyImmediate && evt.type=='input')\n }\n },\n {\n match: 'a,button',\n get: function(el) {\n return el.dataset.simplyValue || el.href || el.value\n },\n check: function(el,evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n },\n {\n match: 'form',\n get: function(el) {\n let data = {}\n for (let input of Array.from(el.elements)) {\n if (input.tagName=='INPUT' \n && (input.type=='checkbox' || input.type=='radio')\n ) {\n if (!input.checked) {\n return;\n }\n }\n if (data[input.name] && !Array.isArray(data[input.name])) {\n data[input.name] = [data[input.name]]\n }\n if (Array.isArray(data[input.name])) {\n data[input.name].push(input.value)\n } else {\n data[input.name] = input.value\n }\n }\n return data\n },\n check: function(el,evt) {\n return evt.type=='submit'\n }\n },\n {\n \tmatch: '*',\n get: function(el) {\n return el.dataset.simplyValue\n },\n check: function(el, evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n }\n]", "const KEY = Object.freeze({\n\tCompose: 229,\n\tControl: 17,\n\tMeta: 224,\n\tAlt: 18,\n\tShift: 16\n})\n\nclass SimplyKey {\n\tconstructor(options = {}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n\t\tObject.assign(this, options.keys)\n\n\t\tconst keyHandler = (e) => {\n\t\t\tif (e.isComposing || e.keyCode === KEY.Compose) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (!e.target) {\n\t\t\t return\n\t\t\t}\n\n\t\t\tlet selectedKeyboard = 'default'\n\t\t\tif (e.target.closest('[data-simply-keyboard]')) {\n\t\t\t selectedKeyboard = e.target.closest('[data-simply-keyboard]')\n\t\t\t \t\t\t\t\t.dataset.simplyKeyboard\n\t\t\t}\n\t\t\tlet keyCombination = []\n\t\t\tif (e.ctrlKey && e.keyCode!=KEY.Control) {\n\t\t\t keyCombination.push('Control')\n\t\t\t}\n\t\t\tif (e.metaKey && e.keyCode!=KEY.Meta) {\n\t\t\t keyCombination.push('Meta')\n\t\t\t}\n\t\t\tif (e.altKey && e.keyCode!=KEY.Alt) {\n\t\t\t keyCombination.push('Alt')\n\t\t\t}\n\t\t\tif (e.shiftKey && e.keyCode!=KEY.Shift) {\n\t\t\t keyCombination.push('Shift')\n\t\t\t}\n\t\t\tkeyCombination.push(e.key.toLowerCase())\n\n\t\t\tlet keyboards = []\n\t\t\tlet keyboardElement = event.target.closest('[data-simply-keyboard]')\n\t\t\twhile (keyboardElement) {\n\t\t\t\tkeyboards.push(keyboardElement.dataset.simplyKeyboard)\n\t\t\t\tkeyboardElement = keyboardElement.parentNode.closest('[data-simply-keyboard]')\n\t\t\t}\n\t\t\tkeyboards.push('')\n\n\t\t\tlet keyboard, subkeyboard\n\t\t\tlet separators = ['+','-']\n\n\t\t\tfor (i in keyboards) {\n\t\t\t\tkeyboard = keyboards[i]\n\t\t\t\tif (keyboard == '') {\n\t\t\t\t\tsubkeyboard = 'default'\n\t\t\t\t} else {\n\t\t\t\t\tsubkeyboard = keyboard\n\t\t\t\t\tkeyboard += '.'\n\t\t\t\t}\n\t\t\t\tfor (let separator of separators) {\n\t\t\t\t\tlet keyString = keyCombination.join(separator)\n\n\t\t\t\t\tif (this[subkeyboard] && (typeof this[subkeyboard][keyString]=='function')) {\n\t\t\t\t\t\tlet _continue = this[subkeyboard][keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[subkeyboard + keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[subkeyboard + keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this[selectedKeyboard] && this[selectedKeyboard][keyString]) {\n\t\t\t\t\t\tlet targets = options.app.container.querySelectorAll('[data-simply-accesskey=\"'\n\t\t\t\t\t\t\t+ keyboard + keyString + '\"]')\n\t\t\t\t\t\tif (targets.length) {\n\t\t\t\t\t\t\ttargets.forEach(t => t.click())\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\toptions.app.container.addEventListener('keydown', keyHandler)\n\t}\n\n}\n\nexport function keys(options={}, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\treturn new SimplyKey(options)\n}\n\n", "export function view(options, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\tif (options.app) {\n\t\toptions.app.view = options.view || {}\n\n\t\tconst load = () => {\n\t\t\tconst data = options.app.view\n\t\t\tconst path = globalThis.editor.data.getDataPath(options.app.container || document.body)\n\t\t\toptions.app.view = globalThis.editor.currentData[path]\n\t\t\tObject.assign(options.app.view, data)\n\t\t}\n\t\tif (globalThis.editor && globalThis.editor.currentData) {\n\t\t\tload()\n\t\t} else {\n\t\t\tdocument.addEventListener('simply-content-loaded', load)\n\t\t}\n\t\treturn options.app.view\n\t} else {\n\t\treturn options.view\n\t}\n}", "import { routes } from './route.mjs'\nimport { commands } from './command.mjs'\nimport { actions } from './action.mjs'\nimport { keys } from './key.mjs'\nimport { view } from './view.mjs'\n\nclass SimplyApp {\n\tconstructor(options={}) {\n\t\tthis.container = options.container || document.body\n\t\tfor (let key in options) {\n\t\t\tswitch(key) {\n\t\t\t\tcase 'commands':\n\t\t\t\t\tthis.commands = commands({ app: this, container: this.container, commands: options.commands})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'keys':\n\t\t\t\tcase 'keyboard': // backwards compatible\n\t\t\t\t\tthis.keys = keys({ app: this, keys: options.keys })\n\t\t\t\t\tbreak\n\t\t\t\tcase 'routes':\n\t\t\t\t\tthis.routes = routes({ app: this, routes: options.routes})\n\t\t\t\t\tthis.routes.handleEvents();\n\t\t\t\t\tglobalThis.setTimeout(() => {\n\t\t\t\t\t\tthis.routes.match(globalThis.location?.pathname+globalThis.location?.hash);\n\t\t\t\t\t});\n\t\t\t\t\tbreak\n\t\t\t\tcase 'actions':\n\t\t\t\t\tthis.actions = actions({app: this, actions: options.actions})\n\t\t\t\t\tthis.action = function(name) { // backwards compatible wiht SimplyView2\n\t\t\t\t\t\tconsole.warn('deprecated call to `this.action`')\n\t\t\t\t\t\tlet params = Array.from(arguments).slice()\n\t\t\t\t params.shift()\n\t\t\t\t return this.actions[name](...params)\n\t\t\t\t }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'view':\n\t\t\t\t\tthis.view = view({app: this, view: options.view})\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tthis[key] = options[key] // allows easy additions\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tget app() {\n\t\treturn this\n\t}\n}\n\nexport function app(options={}) {\n\treturn new SimplyApp(options)\n}", "function throttle( callbackFunction, intervalTime ) {\n let eventId = 0\n return () => {\n const myArguments = arguments\n if ( eventId ) {\n return\n } else {\n eventId = globalThis.setTimeout( () => {\n callbackFunction.apply(this, myArguments)\n eventId = 0\n }, intervalTime )\n }\n }\n}\n\nconst runWhenIdle = (() => {\n if (globalThis.requestIdleCallback) {\n return (callback) => {\n globalThis.requestIdleCallback(callback, {timeout: 500})\n }\n }\n return globalThis.requestAnimationFrame\n})()\n\nfunction rebaseHref(relative, base) {\n let url = new URL(relative, base)\n if (include.cacheBuster) {\n url.searchParams.set('cb',include.cacheBuster)\n }\n return url.href\n}\n\nlet observer, loaded = {}\nlet head = globalThis.document.querySelector('head')\nlet currentScript = globalThis.document.currentScript\nlet getScriptURL, currentScriptURL\nif (!currentScript) {\n getScriptURL = (() => {\n var scripts = document.getElementsByTagName('script')\n var index = scripts.length - 1\n var myScript = scripts[index]\n return () => myScript.src\n })()\n currentScriptURL = getScriptURL()\n} else {\n currentScriptURL = currentScript.src\n}\n\nconst waitForPreviousScripts = async () => {\n // because of the async=false attribute, this script will run after\n // the previous scripts have been loaded and run\n // simply.include.next.js only fires the simply-next-script event\n // that triggers the Promise.resolve method\n return new Promise(function(resolve) {\n var next = globalThis.document.createElement('script')\n next.src = \"https://cdn.jsdelivr.net/gh/simplyedit/simplyview/dist/simply.include.next.js\"\n next.async = false\n globalThis.document.addEventListener('simply-include-next', () => {\n head.removeChild(next)\n resolve()\n }, { once: true, passive: true})\n head.appendChild(next)\n })\n}\n\nlet scriptLocations = []\n\nexport const include = {\n cacheBuster: null,\n scripts: (scripts, base) => {\n let arr = scripts.slice()\n const importScript = () => {\n const script = arr.shift()\n if (!script) {\n return\n }\n const attrs = [].map.call(script.attributes, (attr) => {\n return attr.name\n })\n let clone = globalThis.document.createElement('script')\n for (const attr of attrs) {\n clone.setAttribute(attr, script.getAttribute(attr))\n }\n clone.removeAttribute('data-simply-location')\n if (!clone.src) {\n // this is an inline script, so copy the content and wait for previous scripts to run\n clone.innerHTML = script.innerHTML\n waitForPreviousScripts()\n .then(() => {\n const node = scriptLocations[script.dataset.simplyLocation]\n node.parentNode.insertBefore(clone, node)\n node.parentNode.removeChild(node)\n importScript()\n })\n } else {\n clone.src = rebaseHref(clone.src, base)\n if (!clone.hasAttribute('async') && !clone.hasAttribute('defer')) {\n clone.async = false //important! do not use clone.setAttribute('async', false) - it has no effect\n }\n const node = scriptLocations[script.dataset.simplyLocation]\n node.parentNode.insertBefore(clone, node)\n node.parentNode.removeChild(node)\n loaded[clone.src]=true\n importScript()\n }\n }\n if (arr.length) {\n importScript()\n }\n },\n html: (html, link) => {\n let fragment = globalThis.document.createRange().createContextualFragment(html)\n const stylesheets = fragment.querySelectorAll('link[rel=\"stylesheet\"],style')\n // add all stylesheets to head\n for (let stylesheet of stylesheets) {\n if (stylesheet.href) {\n stylesheet.href = rebaseHref(stylesheet.href, link.href)\n }\n head.appendChild(stylesheet)\n }\n // remove the scripts from the fragment, as they will not run in the\n // order in which they are defined\n let scriptsFragment = globalThis.document.createDocumentFragment()\n const scripts = fragment.querySelectorAll('script')\n if (scripts.length) {\n for (let script of scripts) {\n let placeholder = globalThis.document.createComment(script.src || 'inline script')\n script.parentNode.insertBefore(placeholder, script)\n script.dataset.simplyLocation = scriptLocations.length\n scriptLocations.push(placeholder)\n scriptsFragment.appendChild(script)\n }\n globalThis.setTimeout(function() {\n include.scripts(Array.from(scriptsFragment.children), link ? link.href : globalThis.location.href )\n }, 10)\n }\n // add the remainder before the include link\n link.parentNode.insertBefore(fragment, link ? link : null)\n\n }\n}\n\nlet included = {}\nconst includeLinks = async (links) => {\n // mark them as in progress, so handleChanges doesn't find them again\n let remainingLinks = [].reduce.call(links, (remainder, link) => {\n if (link.rel=='simply-include-once' && included[link.href]) {\n link.parentNode.removeChild(link)\n } else {\n included[link.href]=true\n link.rel = 'simply-include-loading'\n remainder.push(link)\n }\n return remainder\n }, [])\n\n for (let link of remainingLinks) {\n if (!link.href) {\n return\n }\n // fetch the html\n const response = await fetch(link.href)\n if (!response.ok) {\n console.log('simply-include: failed to load '+link.href);\n continue\n }\n console.log('simply-include: loaded '+link.href);\n const html = await response.text()\n // if succesfull import the html\n include.html(html, link)\n // remove the include link\n link.parentNode.removeChild(link)\n }\n}\n\nconst handleChanges = throttle(() => {\n runWhenIdle(() => {\n var links = globalThis.document.querySelectorAll('link[rel=\"simply-include\"],link[rel=\"simply-include-once\"]')\n if (links.length) {\n includeLinks(links)\n }\n })\n})\n\nconst observe = () => {\n observer = new MutationObserver(handleChanges)\n observer.observe(globalThis.document, {\n subtree: true,\n childList: true,\n })\n}\n\nobserve()\nhandleChanges() // check if there are include links in the dom already\n", "export class SimplyRender extends HTMLElement \n{\n constructor()\n {\n super()\n let templateId = this.getAttribute(\"rel\")\n let template = document.getElementById(templateId)\n\n if (template) {\n let content = template.content.cloneNode(true)\n for (const node of content.childNodes) {\n const clone = node.cloneNode(true)\n if (clone.nodeType == document.ELEMENT_NODE) {\n clone.querySelectorAll(\"template\").forEach(function(t) {\n t.setAttribute(\"simply-render\", \"\")\n })\n }\n this.parentNode.insertBefore(clone, this)\n }\n this.parentNode.removeChild(this)\n }\n }\n}\n\nif (!customElements.get('simply-render')) {\n customElements.define('simply-render', SimplyRender);\n}\n", "import { activate } from './activate.mjs'\nimport { actions as action } from './action.mjs'\nimport { app } from './app.mjs'\nimport { commands as command } from './command.mjs'\nimport { include } from './include.mjs'\nimport { keys as key } from './key.mjs'\nimport { routes as route } from './route.mjs'\nimport { view } from './view.mjs'\nimport { SimplyRender } from './render.mjs'\n\nconst simply = {\n\tactivate,\n\taction,\n\tapp,\n\tcommand,\n\tinclude,\n\tkey,\n\troute,\n\tview\n}\n\nglobalThis.simply = simply\n\nexport default simply"],
|
|
5
|
-
"mappings": "MAAA,IAAMA,EAAY,IAAI,IAETC,EAAW,CACpB,YAAa,CAACC,EAAMC,IAAa,CACxBH,EAAU,IAAIE,CAAI,GACnBF,EAAU,IAAIE,EAAM,CAAC,CAAC,EAE1BF,EAAU,IAAIE,CAAI,EAAE,KAAKC,CAAQ,EACjCC,EAAYF,CAAI,CACpB,EACA,eAAgB,CAACA,EAAMC,IAAa,CAChC,GAAI,CAACH,EAAU,IAAIE,CAAI,EACnB,MAAO,GAEXF,EAAU,IAAIE,EAAMF,EAAU,IAAIE,CAAI,EAAE,OAAQG,GACrCA,GAAUF,CACpB,CAAC,CACN,CACJ,EAEA,SAASC,EAAYF,EAAM,CACvB,IAAMI,EAAQ,SAAS,iBAAiB,0BAA0BJ,EAAK,IAAI,EAC3E,GAAII,EACA,QAASC,KAAQD,EACbE,EAAcD,CAAI,CAG9B,CAEA,SAASC,EAAcD,EAAM,CACzB,IAAMN,EAAWM,GAAM,SAAS,eAChC,GAAIN,GAAYD,EAAU,IAAIC,CAAQ,EAClC,QAASE,KAAYH,EAAU,IAAIC,CAAQ,EACvCE,EAAS,KAAKI,CAAI,CAG9B,CAEA,SAASE,EAAcC,EAAS,CAC5B,IAAIC,EAAgB,CAAC,EACrB,QAASC,KAAUF,EACf,GAAIE,EAAO,MAAQ,aACf,QAASL,KAAQK,EAAO,WACpB,GAAIL,EAAK,iBAAkB,CACvB,IAAIM,EAAa,MAAM,KAAKN,EAAK,iBAAiB,wBAAwB,CAAC,EACvEA,EAAK,QAAQ,wBAAwB,GACrCM,EAAW,KAAKN,CAAI,EAExBI,EAAgBA,EAAc,OAAOE,CAAU,CACnD,EAIZ,QAASN,KAAQI,EACbH,EAAcD,CAAI,CAE1B,CAEA,IAAMO,EAAW,IAAI,iBAAiBL,CAAa,EACnDK,EAAS,QAAQ,SAAU,CACvB,QAAS,GACT,UAAW,EACf,CAAC,EC9DM,SAASC,EAAQC,EAASC,EAAe,CAC/C,GAAIA,EAAe,CAClB,IAAIC,EAAMF,EACVA,EAAUC,EACVD,EAAQ,IAAME,CACf,CACA,GAAIF,EAAQ,IAAK,CAChB,IAAMG,EAAgB,CACrB,IAAIC,EAAQC,EAAU,CACrB,GAAKD,EAAOC,CAAQ,EAGpB,OAAID,EAAO,MACH,IAAI,MAAMA,EAAOC,CAAQ,EAAE,KAAKL,EAAQ,GAAG,EAAGM,CAAe,EAE7DF,EAAOC,CAAQ,EAAE,KAAKL,EAAQ,GAAG,CAE1C,CACD,EACA,OAAO,IAAI,MAAMA,EAAQ,QAASG,CAAa,CAChD,KACC,QAAOH,CAET,CAEA,IAAMM,EAAkB,CACvB,MAAMF,EAAQG,EAASC,EAAe,CACrC,GAAI,CACH,IAAMC,EAASL,EAAO,GAAGI,CAAa,EACtC,OAAIC,aAAkB,QACdA,EAAO,MAAMC,GACZH,EAAQ,MAAMG,CAAG,CACxB,EAEKD,CACR,OAAQC,EAAK,CACZ,OAAOH,EAAQ,MAAMG,CAAG,CACzB,CACD,CACD,ECvCO,SAASC,EAAOC,EAASC,EAChC,CACI,GAAIA,EAAe,CACf,IAAIC,EAAMF,EACVA,EAAUC,EACVD,EAAQ,IAAMA,CAClB,CACA,OAAO,IAAIG,EAAYH,CAAO,CAClC,CAEA,IAAMG,EAAN,KACA,CACI,YAAYH,EAAQ,CAAC,EACrB,CACI,KAAK,KAAOA,EAAQ,MAAQ,IAC5B,KAAK,IAAMA,EAAQ,KAAO,CAAC,EAC3B,KAAK,gBAAkB,CAAC,CAACA,EAAQ,gBACjC,KAAK,WAAa,CAAC,CAACA,EAAQ,WAC5B,KAAK,MAAM,EACPA,EAAQ,QACR,KAAK,KAAKA,EAAQ,MAAM,CAEhC,CAEA,KAAKD,EACL,CACIK,EAAYL,EAAQ,KAAK,UAAW,KAAK,UAAU,CACvD,CAEA,OACA,CACI,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,CACb,MAAO,CAAC,EACR,KAAM,CAAC,EACP,KAAM,CAAC,EACP,OAAQ,CAAC,CACb,CACJ,CAEA,MAAMM,EAAML,EACZ,CACI,IAAIM,EAAO,CACP,KAAAD,EACA,QAAAL,CACJ,EACAM,EAAO,KAAK,aAAa,QAAQA,CAAI,EACrCD,EAAOC,EAAK,KAAOA,EAAK,KAAOD,EAE/B,IAAIE,EACJ,GAAI,CAACF,EACD,OAAI,KAAK,MAAM,SAAS,SAAS,SAAS,SAAS,SAAS,IAAI,EACrD,GAEA,KAAK,MAAM,SAAS,SAAS,QAAQ,EAGpDA,EAAOG,EAAQH,CAAI,EACnB,QAAUI,KAAS,KAAK,UAWpB,GAVAF,EAAUE,EAAM,MAAM,KAAKJ,CAAI,EAC3B,KAAK,iBAAmB,CAACE,GAAS,QAC9BF,GAAQA,EAAKA,EAAK,OAAO,CAAC,GAAG,MAC7BE,EAAUE,EAAM,MAAM,KAAKJ,EAAK,GAAG,EAC/BE,IACAF,GAAM,IACN,QAAQ,aAAa,CAAC,EAAG,GAAIK,EAAOL,EAAM,KAAK,IAAI,CAAC,IAI5DE,GAAWA,EAAQ,OAAQ,CAC3B,IAAII,EAAS,CAAC,EACdF,EAAM,OAAO,QAAQ,CAACG,EAAKC,IAAM,CACzBD,GAAK,MACLA,EAAM,aAEVD,EAAOC,CAAG,EAAIL,EAAQM,EAAE,CAAC,CAC7B,CAAC,EACD,OAAO,OAAOF,EAAQX,CAAO,EAC7BM,EAAK,MAAQG,EACbH,EAAK,OAASK,EACdL,EAAO,KAAK,aAAa,OAAQA,CAAI,EACrCK,EAASL,EAAK,OAASA,EAAK,OAASK,EACrC,IAAMG,EAAe,IAAI,gBAAgB,SAAS,SAAS,MAAM,EACjE,OAAAR,EAAK,OAASG,EAAM,OAAO,KAAK,KAAK,IAAKE,EAAQG,CAAY,EAC9D,KAAK,aAAa,SAAUR,CAAI,EACzBA,EAAK,MAChB,CAEJ,MAAO,EACX,CAEA,aAAaS,EAAQJ,EACrB,CACI,GAAK,OAAO,KAAK,KAAK,UAAUI,CAAM,CAAC,EAGvC,cAAO,KAAK,KAAK,UAAUA,CAAM,CAAC,EAAE,QAASN,GAAU,CACnD,IAAIO,EAAUC,EAAmBR,CAAK,EACtC,GAAIO,EAAQ,KAAKL,EAAO,IAAI,EAAG,CAC3B,IAAIO,EACJ,QAASC,KAAY,KAAK,UAAUJ,CAAM,EAAEN,CAAK,EAC7CS,EAASC,EAAS,KAAK,KAAK,IAAKR,CAAM,EACnCO,IACAP,EAASO,EAGrB,CACJ,CAAC,EACMP,CACX,CAEA,cACA,CACI,WAAW,iBAAiB,WAAY,IAAM,CACtC,KAAK,MAAMH,EAAQ,SAAS,SAAS,SAAW,SAAS,SAAS,KAAM,KAAK,IAAI,CAAC,IAAM,IACxF,KAAK,MAAMA,EAAQ,SAAS,SAAS,SAAU,KAAK,IAAI,CAAC,CAEjE,CAAC,EACD,KAAK,IAAI,UAAU,iBAAiB,QAAUY,GAAQ,CAClD,GAAI,CAAAA,EAAI,SAGJA,EAAI,OAAS,EAIjB,SADIC,EAAOD,EAAI,OACRC,GAAQA,EAAK,SAAS,KACzBA,EAAOA,EAAK,cAEhB,GAAIA,GACGA,EAAK,UACLA,EAAK,UAAU,WAAW,SAAS,UACnC,CAACA,EAAK,MACN,CAACA,EAAK,QAAQ,cACnB,CACE,IAAIhB,EAAOG,EAAQa,EAAK,SAASA,EAAK,KAAM,KAAK,IAAI,EAIrD,GAHM,KAAK,IAAIhB,CAAI,IACfA,EAAOG,EAAQa,EAAK,SAAU,KAAK,IAAI,GAEtC,KAAK,IAAIhB,CAAI,EAAI,CAClB,IAAIM,EAAS,KAAK,aAAa,OAAQ,CAAE,KAAMN,CAAI,CAAC,EACpD,GAAIM,EAAO,MACH,KAAK,KAAKA,EAAO,IAAI,EAErB,OAAAS,EAAI,eAAe,EACZ,EAGnB,CACJ,EACJ,CAAC,CACL,CAEA,KAAKf,EACL,CACI,eAAQ,UAAU,CAAC,EAAE,GAAGK,EAAOL,EAAM,KAAK,IAAI,CAAC,EACxC,KAAK,MAAMA,CAAI,CAC1B,CAEA,IAAIA,EACJ,CACIA,EAAOG,EAAQH,EAAM,KAAK,IAAI,EAC9B,QAASI,KAAS,KAAK,UAAW,CAC9B,IAAIF,EAAUE,EAAM,MAAM,KAAKJ,CAAI,EACnC,GAAIE,GAAWA,EAAQ,OACnB,MAAO,EAEf,CACA,MAAO,EACX,CAEA,YAAYQ,EAAQN,EAAOU,EAC3B,CACI,GAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,EAAE,QAAQJ,CAAM,GAAG,GAClD,MAAM,IAAI,MAAM,kBAAkBA,CAAM,EAEvC,KAAK,UAAUA,CAAM,EAAEN,CAAK,IAC7B,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAI,CAAC,GAErC,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAE,KAAKU,CAAQ,CAC/C,CAEA,eAAeJ,EAAQN,EAAOU,EAC9B,CACI,GAAI,CAAC,QAAQ,OAAO,QAAQ,EAAE,QAAQJ,CAAM,GAAG,GAC3C,MAAM,IAAI,MAAM,kBAAkBA,CAAM,EAEvC,KAAK,UAAUA,CAAM,EAAEN,CAAK,IAGjC,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAI,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAE,OAAQa,GAC3DA,GAAYH,CACtB,EACL,CAEA,KAAKnB,EACL,CACQA,EAAQ,OACR,KAAK,KAAOA,EAAQ,KAE5B,CACJ,EAEA,SAASQ,EAAQH,EAAMkB,EAAK,IAC5B,CACI,OAAIlB,EAAK,UAAU,EAAEkB,EAAK,MAAM,GAAGA,GAE7BA,EAAKA,EAAK,OAAO,CAAC,GAAG,KAChBlB,EAAK,QAASkB,EAAK,OAAO,GAC1BlB,GAAQkB,EAAK,UAAU,EAAElB,EAAK,MAAM,KAG3CA,EAAOA,EAAK,UAAUkB,EAAK,MAAM,GAEjClB,EAAK,CAAC,GAAG,KAAOA,EAAK,CAAC,GAAG,MACzBA,EAAO,IAAIA,GAERA,CACX,CAEA,SAASK,EAAOL,EAAMkB,EACtB,CACI,OAAAlB,EAAOG,EAAQH,EAAMkB,CAAI,EACrBA,EAAKA,EAAK,OAAO,CAAC,IAAI,KAAOlB,EAAK,CAAC,IAAI,MACvCA,EAAOA,EAAK,UAAU,CAAC,GAEpBkB,EAAOlB,CAClB,CAEA,SAASY,EAAmBR,EAAOe,EAAM,GACzC,CACI,OAAIA,EACO,IAAI,OAAO,IAAIf,EAAM,QAAQ,QAAS,SAAS,EAAE,QAAQ,MAAO,MAAM,EAAE,SAAS,EAErF,IAAI,OAAO,IAAIA,EAAM,QAAQ,QAAS,SAAS,EAAE,QAAQ,MAAO,MAAM,CAAC,CAClF,CAEA,SAASL,EAAYL,EAAQ0B,EAAWD,EAAM,GAC9C,CACI,IAAME,EAAQ,OAAO,KAAK3B,CAAM,EAC1B4B,EAAc,aACpB,QAAStB,KAAQqB,EAAO,CACpB,IAAInB,EAAU,CAAC,EACXI,EAAU,CAAC,EACf,GACIJ,EAAUoB,EAAY,KAAKtB,CAAI,EAC3BE,GACAI,EAAO,KAAKJ,EAAQ,CAAC,CAAC,QAEtBA,GACRkB,EAAU,KAAK,CACX,MAAQR,EAAmBZ,EAAMmB,CAAK,EACtC,OAAQb,EACR,OAAQZ,EAAOM,CAAI,CACvB,CAAC,CACL,CACA,OAAOoB,CACX,CCjQA,IAAMG,EAAN,KAAqB,CACpB,YAAYC,EAAQ,CAAC,EAAG,CAClBA,EAAQ,MACZA,EAAQ,IAAM,CAAC,GAEXA,EAAQ,IAAI,YAChBA,EAAQ,IAAI,UAAY,SAAS,MAE5B,KAAK,IAAMA,EAAQ,IACzB,KAAK,UAAYA,EAAQ,UAAYC,EAC3BD,EAAQ,UACd,OAAO,OAAO,KAAMA,EAAQ,QAAQ,EAGxC,IAAME,EAAkBC,GAAQ,CAC/B,IAAMC,EAAUC,EAAWF,EAAK,KAAK,SAAS,EAC9C,GAAI,CAACC,EACJ,OAED,GAAI,CAAC,KAAKA,EAAQ,IAAI,EAAG,CACZ,QAAQ,MAAM,qCAAqCA,EAAQ,KAAMA,EAAQ,MAAM,EAC/E,MACb,CAES,GADuB,KAAKA,EAAQ,IAAI,EAAE,KAAKJ,EAAQ,IAAKI,EAAQ,OAAQA,EAAQ,KAAK,IACpE,GACjB,OAAAD,EAAI,eAAe,EACnBA,EAAI,gBAAgB,EACb,EAErB,EAEMH,EAAQ,IAAI,UAAU,iBAAiB,QAASE,CAAc,EAC9DF,EAAQ,IAAI,UAAU,iBAAiB,SAAUE,CAAc,EAC/DF,EAAQ,IAAI,UAAU,iBAAiB,SAAUE,CAAc,EAC/DF,EAAQ,IAAI,UAAU,iBAAiB,QAASE,CAAc,CACrE,CAEG,KAAKE,EAASE,EAAIC,EAAO,CACrB,GAAI,CAAC,KAAKH,CAAO,EAAG,CAChB,QAAQ,MAAM,qCAAqCA,CAAO,EAC1D,MACJ,CACA,OAAO,KAAKA,CAAO,EAAE,KAAK,KAAK,IAAKE,EAAIC,CAAK,CACjD,CAEA,OAAOC,EAAM,CACT,QAAQ,KAAK,2CAA2C,EACxD,IAAIC,EAAS,MAAM,KAAK,SAAS,EAAE,MAAM,EACzC,OAAAA,EAAO,MAAM,EACN,KAAK,IAAI,QAAQD,CAAI,EAAE,GAAGC,CAAM,CAC3C,CAEA,cAAcC,EAAS,CACnB,KAAK,UAAU,KAAKA,CAAO,CAC/B,CAEA,eAAeA,EAAS,CACpB,KAAK,UAAU,QAAQA,CAAO,CAClC,CACJ,EAEO,SAASC,EAASX,EAAQ,CAAC,EAAGY,EAAe,CAChD,GAAIA,EAAe,CACf,IAAIC,EAAMb,EACVA,EAAUY,EACVZ,EAAQ,IAAMA,CAClB,CACH,OAAO,IAAID,EAAeC,CAAO,CAClC,CAEA,SAASK,EAAWF,EAAKW,EAAU,CAC/B,IAAIR,EAAKH,EAAI,OAAO,QAAQ,uBAAuB,EACnD,GAAIG,GACA,QAASI,KAAWI,EAChB,GAAIR,EAAG,QAAQI,EAAQ,KAAK,EACxB,OAAIA,EAAQ,MAAMJ,EAAIH,CAAG,EACd,CACH,KAAQG,EAAG,QAAQ,cACnB,OAAQA,EACR,MAAQI,EAAQ,IAAIJ,CAAE,CAC1B,EAEG,KAInB,OAAO,IACX,CAEA,IAAML,EAAkB,CACpB,CACI,MAAO,wBACP,IAAK,SAASK,EAAI,CACd,GAAIA,EAAG,UAAU,UAAYA,EAAG,SAAU,CACtC,IAAIS,EAAS,CAAC,EACd,QAASC,KAAUV,EAAG,QACdU,EAAO,UACPD,EAAO,KAAKC,EAAO,KAAK,EAGhC,OAAOD,CACX,CACA,OAAOT,EAAG,QAAQ,aAAeA,EAAG,KACxC,EACA,MAAO,SAASA,EAAIH,EAAK,CACrB,OAAOA,EAAI,MAAM,UAAaG,EAAG,QAAQ,iBAAmBH,EAAI,MAAM,OAC1E,CACJ,EACA,CACI,MAAO,WACP,IAAK,SAASG,EAAI,CACd,OAAOA,EAAG,QAAQ,aAAeA,EAAG,MAAQA,EAAG,KACnD,EACA,MAAO,SAASA,EAAGH,EAAK,CACpB,OAAOA,EAAI,MAAM,SAAWA,EAAI,SAAS,IAASA,EAAI,QAAQ,CAClE,CACJ,EACA,CACI,MAAO,OACP,IAAK,SAASG,EAAI,CACd,IAAIW,EAAO,CAAC,EACZ,QAASC,KAAS,MAAM,KAAKZ,EAAG,QAAQ,EAAG,CACvC,GAAIY,EAAM,SAAS,UACXA,EAAM,MAAM,YAAcA,EAAM,MAAM,UAEtC,CAACA,EAAM,QACP,OAGJD,EAAKC,EAAM,IAAI,GAAK,CAAC,MAAM,QAAQD,EAAKC,EAAM,IAAI,CAAC,IACnDD,EAAKC,EAAM,IAAI,EAAI,CAACD,EAAKC,EAAM,IAAI,CAAC,GAEpC,MAAM,QAAQD,EAAKC,EAAM,IAAI,CAAC,EAC9BD,EAAKC,EAAM,IAAI,EAAE,KAAKA,EAAM,KAAK,EAEjCD,EAAKC,EAAM,IAAI,EAAIA,EAAM,KAEjC,CACA,OAAOD,CACX,EACA,MAAO,SAASX,EAAGH,EAAK,CACpB,OAAOA,EAAI,MAAM,QACrB,CACJ,EACA,CACC,MAAO,IACJ,IAAK,SAASG,EAAI,CACd,OAAOA,EAAG,QAAQ,WACtB,EACA,MAAO,SAASA,EAAIH,EAAK,CACrB,OAAOA,EAAI,MAAM,SAAWA,EAAI,SAAS,IAASA,EAAI,QAAQ,CAClE,CACJ,CACJ,ECzJA,IAAMgB,EAAM,OAAO,OAAO,CACzB,QAAS,IACT,QAAS,GACT,KAAS,IACT,IAAS,GACT,MAAS,EACV,CAAC,EAEKC,EAAN,KAAgB,CACf,YAAYC,EAAU,CAAC,EAAG,CACpBA,EAAQ,MACZA,EAAQ,IAAM,CAAC,GAEXA,EAAQ,IAAI,YAChBA,EAAQ,IAAI,UAAY,SAAS,MAElC,OAAO,OAAO,KAAMA,EAAQ,IAAI,EAEhC,IAAMC,EAAcC,GAAM,CAOzB,GANIA,EAAE,aAAeA,EAAE,UAAYJ,EAAI,SAGnCI,EAAE,kBAGF,CAACA,EAAE,OACH,OAGJ,IAAIC,EAAmB,UACnBD,EAAE,OAAO,QAAQ,wBAAwB,IACzCC,EAAmBD,EAAE,OAAO,QAAQ,wBAAwB,EACtD,QAAQ,gBAElB,IAAIE,EAAiB,CAAC,EAClBF,EAAE,SAAWA,EAAE,SAASJ,EAAI,SAC5BM,EAAe,KAAK,SAAS,EAE7BF,EAAE,SAAWA,EAAE,SAASJ,EAAI,MAC5BM,EAAe,KAAK,MAAM,EAE1BF,EAAE,QAAUA,EAAE,SAASJ,EAAI,KAC3BM,EAAe,KAAK,KAAK,EAEzBF,EAAE,UAAYA,EAAE,SAASJ,EAAI,OAC7BM,EAAe,KAAK,OAAO,EAE/BA,EAAe,KAAKF,EAAE,IAAI,YAAY,CAAC,EAEvC,IAAIG,EAAY,CAAC,EACbC,EAAkB,MAAM,OAAO,QAAQ,wBAAwB,EACnE,KAAOA,GACND,EAAU,KAAKC,EAAgB,QAAQ,cAAc,EACrDA,EAAkBA,EAAgB,WAAW,QAAQ,wBAAwB,EAE9ED,EAAU,KAAK,EAAE,EAEjB,IAAIE,EAAUC,EACVC,EAAa,CAAC,IAAI,GAAG,EAEzB,IAAK,KAAKJ,EAAW,CACpBE,EAAWF,EAAU,CAAC,EAClBE,GAAY,GACfC,EAAc,WAEdA,EAAcD,EACdA,GAAY,KAEb,QAASG,KAAaD,EAAY,CACjC,IAAIE,EAAYP,EAAe,KAAKM,CAAS,EAE7C,GAAI,KAAKF,CAAW,GAAM,OAAO,KAAKA,CAAW,EAAEG,CAAS,GAAG,YAE1D,CADY,KAAKH,CAAW,EAAEG,CAAS,EAAE,KAAKX,EAAQ,IAAKE,CAAC,EAChD,CACfA,EAAE,eAAe,EACjB,MACD,CAED,GAAI,OAAO,KAAKM,EAAcG,CAAS,GAAK,YAEvC,CADY,KAAKH,EAAcG,CAAS,EAAE,KAAKX,EAAQ,IAAKE,CAAC,EACjD,CACfA,EAAE,eAAe,EACjB,MACD,CAGD,GAAI,KAAKC,CAAgB,GAAK,KAAKA,CAAgB,EAAEQ,CAAS,EAAG,CAChE,IAAIC,EAAUZ,EAAQ,IAAI,UAAU,iBAAiB,2BAClDO,EAAWI,EAAY,IAAI,EAC1BC,EAAQ,SACXA,EAAQ,QAAQC,GAAKA,EAAE,MAAM,CAAC,EAC9BX,EAAE,eAAe,EAEnB,CAED,CACD,CACD,EAEAF,EAAQ,IAAI,UAAU,iBAAiB,UAAWC,CAAU,CAC7D,CAED,EAEO,SAASa,EAAKd,EAAQ,CAAC,EAAGe,EAAe,CAC/C,GAAIA,EAAe,CAClB,IAAIC,EAAMhB,EACVA,EAAUe,EACVf,EAAQ,IAAMA,CACf,CACA,OAAO,IAAID,EAAUC,CAAO,CAC7B,CC/GO,SAASiB,EAAKC,EAASC,EAAe,CAC5C,GAAIA,EAAe,CAClB,IAAIC,EAAMF,EACVA,EAAUC,EACVD,EAAQ,IAAMA,CACf,CACA,GAAIA,EAAQ,IAAK,CAChBA,EAAQ,IAAI,KAAOA,EAAQ,MAAQ,CAAC,EAEpC,IAAMG,EAAO,IAAM,CAClB,IAAMC,EAAOJ,EAAQ,IAAI,KACnBK,EAAO,WAAW,OAAO,KAAK,YAAYL,EAAQ,IAAI,WAAa,SAAS,IAAI,EACtFA,EAAQ,IAAI,KAAO,WAAW,OAAO,YAAYK,CAAI,EACrD,OAAO,OAAOL,EAAQ,IAAI,KAAMI,CAAI,CACrC,EACA,OAAI,WAAW,QAAU,WAAW,OAAO,YAC1CD,EAAK,EAEL,SAAS,iBAAiB,wBAAyBA,CAAI,EAEjDH,EAAQ,IAAI,IACpB,KACC,QAAOA,EAAQ,IAEjB,CClBA,IAAMM,EAAN,KAAgB,CACf,YAAYC,EAAQ,CAAC,EAAG,CACvB,KAAK,UAAYA,EAAQ,WAAa,SAAS,KAC/C,QAASC,KAAOD,EACf,OAAOC,EAAK,CACX,IAAK,WACJ,KAAK,SAAWC,EAAS,CAAE,IAAK,KAAM,UAAW,KAAK,UAAW,SAAUF,EAAQ,QAAQ,CAAC,EAC5F,MACD,IAAK,OACL,IAAK,WACJ,KAAK,KAAOG,EAAK,CAAE,IAAK,KAAM,KAAMH,EAAQ,IAAK,CAAC,EAClD,MACD,IAAK,SACJ,KAAK,OAASI,EAAO,CAAE,IAAK,KAAM,OAAQJ,EAAQ,MAAM,CAAC,EACzD,KAAK,OAAO,aAAa,EACzB,WAAW,WAAW,IAAM,CAC3B,KAAK,OAAO,MAAM,WAAW,UAAU,SAAS,WAAW,UAAU,IAAI,CAC1E,CAAC,EACD,MACD,IAAK,UACJ,KAAK,QAAUK,EAAQ,CAAC,IAAK,KAAM,QAASL,EAAQ,OAAO,CAAC,EAC5D,KAAK,OAAS,SAASM,EAAM,CAC5B,QAAQ,KAAK,kCAAkC,EAC/C,IAAIC,EAAS,MAAM,KAAK,SAAS,EAAE,MAAM,EACnC,OAAAA,EAAO,MAAM,EACN,KAAK,QAAQD,CAAI,EAAE,GAAGC,CAAM,CACvC,EACH,MACD,IAAK,OACJ,KAAK,KAAOC,EAAK,CAAC,IAAK,KAAM,KAAMR,EAAQ,IAAI,CAAC,EAChD,MACD,QACC,KAAKC,CAAG,EAAID,EAAQC,CAAG,EACvB,KACF,CAEF,CACA,IAAI,KAAM,CACT,OAAO,IACR,CACD,EAEO,SAASQ,EAAIT,EAAQ,CAAC,EAAG,CAC/B,OAAO,IAAID,EAAUC,CAAO,CAC7B,CClDA,SAASU,EAAUC,EAAkBC,EAAe,CAChD,IAAIC,EAAU,EACd,MAAO,IAAM,CACT,IAAMC,EAAc,UACfD,IAGDA,EAAU,WAAW,WAAY,IAAM,CACnCF,EAAiB,MAAM,KAAMG,CAAW,EACxCD,EAAU,CACd,EAAGD,CAAa,EAExB,CACJ,CAEA,IAAMG,EACE,WAAW,oBACHC,GAAa,CACjB,WAAW,oBAAoBA,EAAU,CAAC,QAAS,GAAG,CAAC,CAC3D,EAEG,WAAW,sBAGtB,SAASC,EAAWC,EAAUC,EAAM,CAChC,IAAIC,EAAM,IAAI,IAAIF,EAAUC,CAAI,EAChC,OAAIE,EAAQ,aACRD,EAAI,aAAa,IAAI,KAAKC,EAAQ,WAAW,EAE1CD,EAAI,IACf,CAEA,IAAIE,EAAUC,GAAS,CAAC,EACpBC,EAAO,WAAW,SAAS,cAAc,MAAM,EAC/CC,EAAgB,WAAW,SAAS,cACpCC,EAAcC,EACbF,EASDE,EAAmBF,EAAc,KARjCC,GAAgB,IAAM,CAClB,IAAIE,EAAU,SAAS,qBAAqB,QAAQ,EAChDC,EAAQD,EAAQ,OAAS,EACzBE,EAAWF,EAAQC,CAAK,EAC5B,MAAO,IAAMC,EAAS,GAC1B,GAAG,EACHH,EAAmBD,EAAa,GAKpC,IAAMK,GAAyB,SAKpB,IAAI,QAAQ,SAASC,EAAS,CACjC,IAAIC,EAAO,WAAW,SAAS,cAAc,QAAQ,EACrDA,EAAK,IAAM,gFACXA,EAAK,MAAQ,GACb,WAAW,SAAS,iBAAiB,sBAAuB,IAAM,CAC9DT,EAAK,YAAYS,CAAI,EACrBD,EAAQ,CACZ,EAAG,CAAE,KAAM,GAAM,QAAS,EAAI,CAAC,EAC/BR,EAAK,YAAYS,CAAI,CACzB,CAAC,EAGDC,EAAkB,CAAC,EAEVb,EAAU,CACnB,YAAa,KACb,QAAS,CAACO,EAAST,IAAS,CACxB,IAAIgB,EAAMP,EAAQ,MAAM,EAClBQ,EAAe,IAAM,CACvB,IAAMC,EAASF,EAAI,MAAM,EACzB,GAAI,CAACE,EACD,OAEJ,IAAMC,EAAS,CAAC,EAAE,IAAI,KAAKD,EAAO,WAAaE,GACpCA,EAAK,IACf,EACGC,EAAS,WAAW,SAAS,cAAc,QAAQ,EACvD,QAAWD,KAAQD,EACfE,EAAM,aAAaD,EAAMF,EAAO,aAAaE,CAAI,CAAC,EAGtD,GADAC,EAAM,gBAAgB,sBAAsB,EACxC,CAACA,EAAM,IAEPA,EAAM,UAAYH,EAAO,UACzBN,GAAuB,EAClB,KAAK,IAAM,CACR,IAAMU,EAAOP,EAAgBG,EAAO,QAAQ,cAAc,EAC1DI,EAAK,WAAW,aAAaD,EAAOC,CAAI,EACxCA,EAAK,WAAW,YAAYA,CAAI,EAChCL,EAAa,CACjB,CAAC,MACF,CACHI,EAAM,IAAMvB,EAAWuB,EAAM,IAAKrB,CAAI,EAClC,CAACqB,EAAM,aAAa,OAAO,GAAK,CAACA,EAAM,aAAa,OAAO,IAC3DA,EAAM,MAAQ,IAElB,IAAMC,EAAOP,EAAgBG,EAAO,QAAQ,cAAc,EAC1DI,EAAK,WAAW,aAAaD,EAAOC,CAAI,EACxCA,EAAK,WAAW,YAAYA,CAAI,EAChClB,GAAOiB,EAAM,GAAG,EAAE,GAClBJ,EAAa,CACjB,CACJ,EACID,EAAI,QACJC,EAAa,CAErB,EACA,KAAM,CAACM,EAAMC,IAAS,CAClB,IAAIC,EAAW,WAAW,SAAS,YAAY,EAAE,yBAAyBF,CAAI,EACxEG,EAAcD,EAAS,iBAAiB,8BAA8B,EAE5E,QAASE,KAAcD,EACfC,EAAW,OACXA,EAAW,KAAO7B,EAAW6B,EAAW,KAAMH,EAAK,IAAI,GAE3DnB,EAAK,YAAYsB,CAAU,EAI/B,IAAIC,EAAkB,WAAW,SAAS,uBAAuB,EAC3DnB,EAAUgB,EAAS,iBAAiB,QAAQ,EAClD,GAAIhB,EAAQ,OAAQ,CAChB,QAASS,KAAUT,EAAS,CACxB,IAAIoB,EAAc,WAAW,SAAS,cAAcX,EAAO,KAAO,eAAe,EACjFA,EAAO,WAAW,aAAaW,EAAaX,CAAM,EAClDA,EAAO,QAAQ,eAAiBH,EAAgB,OAChDA,EAAgB,KAAKc,CAAW,EAChCD,EAAgB,YAAYV,CAAM,CACtC,CACA,WAAW,WAAW,UAAW,CAC7BhB,EAAQ,QAAQ,MAAM,KAAK0B,EAAgB,QAAQ,EAAGJ,EAAOA,EAAK,KAAO,WAAW,SAAS,IAAK,CACtG,EAAG,EAAE,CACT,CAEAA,EAAK,WAAW,aAAaC,EAAUD,GAAc,IAAI,CAE7D,CACJ,EAEIM,EAAW,CAAC,EACVC,GAAe,MAAOC,GAAU,CAElC,IAAIC,EAAiB,CAAC,EAAE,OAAO,KAAKD,EAAO,CAACE,EAAWV,KAC/CA,EAAK,KAAK,uBAAyBM,EAASN,EAAK,IAAI,EACrDA,EAAK,WAAW,YAAYA,CAAI,GAEhCM,EAASN,EAAK,IAAI,EAAE,GACpBA,EAAK,IAAM,yBACXU,EAAU,KAAKV,CAAI,GAEhBU,GACR,CAAC,CAAC,EAEL,QAASV,KAAQS,EAAgB,CAC7B,GAAI,CAACT,EAAK,KACN,OAGJ,IAAMW,EAAW,MAAM,MAAMX,EAAK,IAAI,EACtC,GAAI,CAACW,EAAS,GAAI,CACd,QAAQ,IAAI,kCAAkCX,EAAK,IAAI,EACvD,QACJ,CACA,QAAQ,IAAI,0BAA0BA,EAAK,IAAI,EAC/C,IAAMD,EAAO,MAAMY,EAAS,KAAK,EAEjCjC,EAAQ,KAAKqB,EAAMC,CAAI,EAEvBA,EAAK,WAAW,YAAYA,CAAI,CACpC,CACJ,EAEMY,EAAgB7C,EAAS,IAAM,CACjCK,EAAY,IAAM,CACd,IAAIoC,EAAQ,WAAW,SAAS,iBAAiB,4DAA4D,EACzGA,EAAM,QACND,GAAaC,CAAK,CAE1B,CAAC,CACL,CAAC,EAEKK,GAAU,IAAM,CAClBlC,EAAW,IAAI,iBAAiBiC,CAAa,EAC7CjC,EAAS,QAAQ,WAAW,SAAU,CAClC,QAAS,GACT,UAAW,EACf,CAAC,CACL,EAEAkC,GAAQ,EACRD,EAAc,ECjMP,IAAME,EAAN,cAA2B,WAClC,CACI,aACA,CACI,MAAM,EACN,IAAIC,EAAa,KAAK,aAAa,KAAK,EACpCC,EAAW,SAAS,eAAeD,CAAU,EAEjD,GAAIC,EAAU,CACV,IAAIC,EAAUD,EAAS,QAAQ,UAAU,EAAI,EAC7C,QAAWE,KAAQD,EAAQ,WAAY,CACnC,IAAME,EAAQD,EAAK,UAAU,EAAI,EAC7BC,EAAM,UAAY,SAAS,cAC3BA,EAAM,iBAAiB,UAAU,EAAE,QAAQ,SAASC,EAAG,CACnDA,EAAE,aAAa,gBAAiB,EAAE,CACtC,CAAC,EAEL,KAAK,WAAW,aAAaD,EAAO,IAAI,CAC5C,CACA,KAAK,WAAW,YAAY,IAAI,CACpC,CACJ,CACJ,EAEK,eAAe,IAAI,eAAe,GACnC,eAAe,OAAO,gBAAiBL,CAAY,ECfvD,IAAMO,EAAS,CACd,SAAAC,EACA,OAAAC,EACA,IAAAC,EACA,QAAAC,EACA,QAAAC,EACA,IAAAC,EACA,MAAAC,EACA,KAAAC,CACD,EAEA,WAAW,OAASR,EAEpB,IAAOS,GAAQT",
|
|
6
|
-
"names": ["listeners", "activate", "name", "callback", "initialCall", "listener", "nodes", "node", "callListeners", "handleChanges", "changes", "activateNodes", "change", "toActivate", "observer", "actions", "options", "optionsCompat", "app", "
|
|
4
|
+
"sourcesContent": ["if (!Symbol.onDestroy) {\n Symbol.onDestroy = Symbol('onDestroy')\n}\n\nconst listeners = new Map()\n\nexport const activate = {\n addListener: (name, callback) => {\n if (!listeners.has(name)) {\n listeners.set(name, [])\n }\n listeners.get(name).push(callback)\n initialCall(name)\n },\n removeListener: (name, callback) => {\n if (!listeners.has(name)) {\n return false\n }\n listeners.set(name, listeners.get(name).filter((listener) => {\n return listener!=callback\n }))\n }\n}\n\nfunction initialCall(name) {\n const nodes = document.querySelectorAll('[data-simply-activate=\"'+name+'\"]')\n if (nodes) {\n for( let node of nodes) {\n callListeners(node)\n }\n }\n}\n\nfunction callListeners(node) {\n const activate = node?.dataset?.simplyActivate\n if (activate && listeners.has(activate)) {\n for (let callback of listeners.get(activate)) {\n const onDestroy = callback.call(node)\n if (typeof onDestroy == 'function') {\n node[Symbol.onDestroy] = onDestroy\n } else if (typeof onDestroy != 'undefined') {\n console.warn('activate listener may only return a de-activate function, instead got', onDestroy)\n }\n }\n }\n}\n\nfunction handleChanges(changes) {\n let activateNodes = []\n for (let change of changes) {\n if (change.type == 'childList') {\n for (let node of change.addedNodes) {\n if (node.querySelectorAll) {\n let toActivate = Array.from(node.querySelectorAll('[data-simply-activate]'))\n if (node.matches('[data-simply-activate]')) {\n toActivate.push(node)\n }\n activateNodes = activateNodes.concat(toActivate)\n }\n }\n for (let node of change.removedNodes) {\n if (node.querySelectorAll) {\n let toDestroy = Array.from(node.querySelectorAll('[data-simply-activate]'))\n if (node.matches['[data-simply-activate']) {\n toDestroy.push(node)\n }\n for (let child of toDestroy) {\n if (child[Symbol.onDestroy]) {\n child[Symbol.onDestroy].call(child)\n }\n }\n }\n }\n }\n }\n for (let node of activateNodes) {\n callListeners(node)\n }\n}\n\nconst observer = new MutationObserver(handleChanges)\nobserver.observe(document, {\n subtree: true,\n childList: true\n})", "export function actions(options, optionsCompat) \n{\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = app\n\t}\n\n\tif (options.app) {\n\t\tconst waitHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\toptions.app.hooks.wait(true)\n\t\t\t\t\t\treturn result.finally(() => {\n\t\t\t\t\t\t\toptions.app.hooks.wait(false, target)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst functionHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tif (options.app.hooks.wait) {\n\t\t\t\t\t\t\toptions.app.hooks.wait(true, target)\n\t\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\toptions.app.hooks.wait(false, target)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t\t\t\t})\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst actionHandler = {\n\t\t\tget(target, property)\n\t\t\t{\n\t\t\t\tif (!target[property]) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tif (options.app.hooks?.error) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), functionHandler)\n\t\t\t\t} else if (options.app.hooks?.wait) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), waitHandler)\n\t\t\t\t} else {\n\t\t\t\t\treturn target[property].bind(options.app)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Proxy(options.actions, actionHandler)\n\t} else {\n\t\treturn options\n\t}\n}", "export function routes(options, optionsCompat)\n{\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n return new SimplyRoute(options)\n}\n\nclass SimplyRoute\n{\n constructor(options={})\n {\n this.baseURL = options.baseURL || '/'\n this.app = options.app || {}\n this.addMissingSlash = !!options.addMissingSlash\n this.matchExact = !!options.matchExact\n this.clear()\n if (options.routes) {\n this.load(options.routes)\n }\n }\n\n load(routes)\n {\n parseRoutes(routes, this.routeInfo, this.matchExact)\n }\n\n clear()\n {\n this.routeInfo = []\n this.listeners = {\n match: {},\n call: {},\n goto: {},\n finish: {}\n }\n }\n\n match(path, options)\n {\n let args = {\n path,\n options\n }\n args = this.runListeners('match',args)\n path = args.path ? args.path : path;\n\n let matches;\n if (!path) {\n if (this.match(document.location.pathname+document.location.hash)) {\n return true;\n } else {\n return this.match(document.location.pathname);\n }\n }\n path = getPath(path);\n for ( let route of this.routeInfo) {\n matches = route.match.exec(path)\n if (this.addMissingSlash && !matches?.length) {\n if (path && path[path.length-1]!='/') {\n matches = route.match.exec(path+'/')\n if (matches) {\n path+='/'\n history.replaceState({}, '', getURL(path, this.baseURL))\n }\n }\n }\n if (matches && matches.length) {\n let params = {};\n route.params.forEach((key, i) => {\n if (key=='*') {\n key = 'remainder'\n }\n params[key] = matches[i+1]\n })\n Object.assign(params, options)\n args.route = route\n args.params = params\n args = this.runListeners('call', args)\n params = args.params ? args.params : params\n const searchParams = new URLSearchParams(document.location.search)\n args.result = route.action.call(this.app, params, searchParams)\n this.runListeners('finish', args)\n return args.result\n }\n }\n return false\n }\n\n runListeners(action, params)\n {\n if (!this.listeners[action] || !Object.keys(this.listeners[action])) {\n return\n }\n Object.keys(this.listeners[action]).forEach((route) => {\n var routeRe = getRegexpFromRoute(route);\n if (routeRe.exec(params.path)) {\n var result;\n for (let callback of this.listeners[action][route]) {\n result = callback.call(this.app, params)\n if (result) {\n params = result\n }\n }\n }\n })\n return params\n }\n\n handleEvents()\n {\n globalThis.addEventListener('popstate', () => {\n if (this.match(getPath(document.location.pathname + document.location.hash, this.baseURL)) === false) {\n this.match(getPath(document.location.pathname, this.baseURL))\n }\n })\n this.app.container.addEventListener('click', (evt) => {\n if (evt.ctrlKey) {\n return;\n }\n if (evt.which != 1) {\n return; // not a 'left' mouse click\n }\n var link = evt.target;\n while (link && link.tagName!='A') {\n link = link.parentElement;\n }\n if (link \n && link.pathname \n && link.hostname==globalThis.location.hostname \n && !link.link\n && !link.dataset.simplyCommand\n ) {\n let check = [link.hash, link.pathname+link.hash, link.pathname]\n let path\n do {\n path = getPath(check.shift(), this.baseURL);\n } while(check.length && !this.has(path))\n if ( this.has(path) ) {\n let params = this.runListeners('goto', { path: path});\n if (params.path) {\n if (this.goto(params.path)) {\n // now cancel the browser navigation, since a route handler was found\n evt.preventDefault();\n return false;\n }\n }\n }\n }\n })\n }\n\n goto(path)\n {\n history.pushState({},'',getURL(path, this.baseURL))\n return this.match(path)\n }\n\n has(path)\n {\n path = getPath(path, this.baseURL)\n for (let route of this.routeInfo) {\n var matches = route.match.exec(path)\n if (matches && matches.length) {\n return true\n }\n }\n return false\n }\n\n addListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n this.listeners[action][route] = []\n }\n this.listeners[action][route].push(callback)\n }\n\n removeListener(action, route, callback)\n {\n if (['match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n return\n }\n this.listeners[action][route] = this.listeners[action][route].filter((listener) => {\n return listener != callback\n })\n }\n\n init(options)\n {\n if (options.baseURL) {\n this.baseURL = options.baseURL\n }\n }\n}\n\nfunction getPath(path, baseURL='/')\n{\n if (path.substring(0,baseURL.length)==baseURL\n ||\n ( baseURL[baseURL.length-1]=='/' \n && path.length==(baseURL.length-1)\n && path == baseURL.substring(0,path.length)\n )\n ) {\n path = path.substring(baseURL.length)\n }\n if (path[0]!='/' && path[0]!='#') {\n path = '/'+path\n }\n return path\n}\n\nfunction getURL(path, baseURL)\n{\n path = getPath(path, baseURL)\n if (baseURL[baseURL.length-1]==='/' && path[0]==='/') {\n path = path.substring(1)\n }\n if (path[0]=='#') {\n return path\n }\n return baseURL + path\n}\n\nfunction getRegexpFromRoute(route, exact=false)\n{\n if (exact) {\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)')+'(\\\\?|$)')\n }\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)'))\n}\n\nfunction parseRoutes(routes, routeInfo, exact=false)\n{\n const paths = Object.keys(routes)\n const matchParams = /:(\\w+|\\*)/g\n for (let path of paths) {\n let matches = []\n let params = []\n do {\n matches = matchParams.exec(path)\n if (matches) {\n params.push(matches[1])\n }\n } while(matches)\n routeInfo.push({\n match: getRegexpFromRoute(path, exact),\n params: params,\n action: routes[path]\n })\n }\n return routeInfo\n}", "class SimplyCommands {\n\tconstructor(options={}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n this.app = options.app\n\t\tthis.$handlers = options.handlers || defaultHandlers\n if (options.commands) {\n \t\tObject.assign(this, options.commands)\n }\n\n\t\tconst commandHandler = (evt) => {\n\t\t\tconst command = getCommand(evt, this.$handlers)\n\t\t\tif (!command) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this[command.name]) {\n console.error('simply.command: undefined command '+command.name, command.source);\n return\n\t\t\t}\n const shouldContinue = this[command.name].call(options.app, command.source, command.value)\n if (shouldContinue!==true) {\n evt.preventDefault()\n evt.stopPropagation()\n return false\n }\n\t\t}\n\n options.app.container.addEventListener('click', commandHandler)\n options.app.container.addEventListener('submit', commandHandler)\n options.app.container.addEventListener('change', commandHandler)\n options.app.container.addEventListener('input', commandHandler)\n\t}\n\n call(command, el, value) {\n if (!this[command]) {\n console.error('simply.command: undefined command '+command);\n return\n }\n return this[command].call(this.app, el, value)\n }\n\n action(name) {\n console.warn('deprecated call to `this.commands.action`')\n let params = Array.from(arguments).slice()\n params.shift()\n return this.app.actions[name](...params)\n }\n\n appendHandler(handler) {\n this.$handlers.push(handler)\n }\n\n prependHandler(handler) {\n this.$handlers.unshift(handler)\n }\n}\n\nexport function commands(options={}, optionsCompat) {\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n\treturn new SimplyCommands(options)\n}\n\nfunction getCommand(evt, handlers) {\n var el = evt.target.closest('[data-simply-command]')\n if (el) {\n for (let handler of handlers) {\n if (el.matches(handler.match)) {\n if (handler.check(el, evt)) {\n return {\n name: el.dataset.simplyCommand,\n source: el,\n value: handler.get(el)\n }\n }\n return null\n }\n }\n }\n return null\n}\n\nconst defaultHandlers = [\n {\n match: 'input,select,textarea',\n get: function(el) {\n if (el.tagName==='SELECT' && el.multiple) {\n let values = []\n for (let option of el.options) {\n if (option.selected) {\n values.push(option.value)\n }\n }\n return values\n }\n return el.dataset.simplyValue || el.value\n },\n check: function(el, evt) {\n return evt.type=='change' || (el.dataset.simplyImmediate && evt.type=='input')\n }\n },\n {\n match: 'a,button',\n get: function(el) {\n return el.dataset.simplyValue || el.href || el.value\n },\n check: function(el,evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n },\n {\n match: 'form',\n get: function(el) {\n let data = {}\n for (let input of Array.from(el.elements)) {\n if (input.tagName=='INPUT' \n && (input.type=='checkbox' || input.type=='radio')\n ) {\n if (!input.checked) {\n return;\n }\n }\n if (data[input.name] && !Array.isArray(data[input.name])) {\n data[input.name] = [data[input.name]]\n }\n if (Array.isArray(data[input.name])) {\n data[input.name].push(input.value)\n } else {\n data[input.name] = input.value\n }\n }\n return data\n },\n check: function(el,evt) {\n return evt.type=='submit'\n }\n },\n {\n \tmatch: '*',\n get: function(el) {\n return el.dataset.simplyValue\n },\n check: function(el, evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n }\n]", "const KEY = Object.freeze({\n\tCompose: 229,\n\tControl: 17,\n\tMeta: 224,\n\tAlt: 18,\n\tShift: 16\n})\n\nclass SimplyKey {\n\tconstructor(options = {}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n\t\tObject.assign(this, options.keys)\n\n\t\tconst keyHandler = (e) => {\n\t\t\tif (e.isComposing || e.keyCode === KEY.Compose) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (!e.target) {\n\t\t\t return\n\t\t\t}\n\n\t\t\tlet selectedKeyboard = 'default'\n\t\t\tif (e.target.closest('[data-simply-keyboard]')) {\n\t\t\t selectedKeyboard = e.target.closest('[data-simply-keyboard]')\n\t\t\t \t\t\t\t\t.dataset.simplyKeyboard\n\t\t\t}\n\t\t\tlet keyCombination = []\n\t\t\tif (e.ctrlKey && e.keyCode!=KEY.Control) {\n\t\t\t keyCombination.push('Control')\n\t\t\t}\n\t\t\tif (e.metaKey && e.keyCode!=KEY.Meta) {\n\t\t\t keyCombination.push('Meta')\n\t\t\t}\n\t\t\tif (e.altKey && e.keyCode!=KEY.Alt) {\n\t\t\t keyCombination.push('Alt')\n\t\t\t}\n\t\t\tif (e.shiftKey && e.keyCode!=KEY.Shift) {\n\t\t\t keyCombination.push('Shift')\n\t\t\t}\n\t\t\tkeyCombination.push(e.key.toLowerCase())\n\n\t\t\tlet keyboards = []\n\t\t\tlet keyboardElement = event.target.closest('[data-simply-keyboard]')\n\t\t\twhile (keyboardElement) {\n\t\t\t\tkeyboards.push(keyboardElement.dataset.simplyKeyboard)\n\t\t\t\tkeyboardElement = keyboardElement.parentNode.closest('[data-simply-keyboard]')\n\t\t\t}\n\t\t\tkeyboards.push('')\n\n\t\t\tlet keyboard, subkeyboard\n\t\t\tlet separators = ['+','-']\n\n\t\t\tfor (let i in keyboards) {\n\t\t\t\tkeyboard = keyboards[i]\n\t\t\t\tif (keyboard == '') {\n\t\t\t\t\tsubkeyboard = 'default'\n\t\t\t\t} else {\n\t\t\t\t\tsubkeyboard = keyboard\n\t\t\t\t\tkeyboard += '.'\n\t\t\t\t}\n\t\t\t\tfor (let separator of separators) {\n\t\t\t\t\tlet keyString = keyCombination.join(separator)\n\n\t\t\t\t\tif (this[subkeyboard] && (typeof this[subkeyboard][keyString]=='function')) {\n\t\t\t\t\t\tlet _continue = this[subkeyboard][keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[subkeyboard + keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[subkeyboard + keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this[selectedKeyboard] && this[selectedKeyboard][keyString]) {\n\t\t\t\t\t\tlet targets = options.app.container.querySelectorAll('[data-simply-accesskey=\"'\n\t\t\t\t\t\t\t+ keyboard + keyString + '\"]')\n\t\t\t\t\t\tif (targets.length) {\n\t\t\t\t\t\t\ttargets.forEach(t => t.click())\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\toptions.app.container.addEventListener('keydown', keyHandler)\n\t}\n\n}\n\nexport function keys(options={}, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\treturn new SimplyKey(options)\n}\n\n", "export function view(options, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\tif (options.app) {\n\t\toptions.app.view = options.view || {}\n\n\t\tconst load = () => {\n\t\t\tconst data = options.app.view\n\t\t\tconst path = globalThis.editor.data.getDataPath(options.app.container || document.body)\n\t\t\toptions.app.view = globalThis.editor.currentData[path]\n\t\t\tObject.assign(options.app.view, data)\n\t\t}\n\t\tif (globalThis.editor && globalThis.editor.currentData) {\n\t\t\tload()\n\t\t} else {\n\t\t\tdocument.addEventListener('simply-content-loaded', load)\n\t\t}\n\t\treturn options.app.view\n\t} else {\n\t\treturn options.view\n\t}\n}", "import { routes } from './route.mjs'\nimport { commands } from './command.mjs'\nimport { actions } from './action.mjs'\nimport { keys } from './key.mjs'\nimport { view } from './view.mjs'\n\nclass SimplyApp {\n\tconstructor(options={}) {\n\t\tthis.container = options.container || document.body\n\t\tfor (let key in options) {\n\t\t\tswitch(key) {\n\t\t\t\tcase 'commands':\n\t\t\t\t\tthis.commands = commands({ app: this, container: this.container, commands: options.commands})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'keys':\n\t\t\t\tcase 'keyboard': // backwards compatible\n\t\t\t\t\tthis.keys = keys({ app: this, keys: options.keys })\n\t\t\t\t\tbreak\n\t\t\t\tcase 'root': // backwards compatibility\n\t\t\t\tcase 'baseURL':\n\t\t\t\t\tthis.baseURL = options[key]\n\t\t\t\t\tbreak\n\t\t\t\tcase 'routes':\n\t\t\t\t\tthis.routes = routes({ app: this, routes: options.routes})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'actions':\n\t\t\t\t\tthis.actions = actions({app: this, actions: options.actions})\n\t\t\t\t\tthis.action = function(name) { // backwards compatible wiht SimplyView2\n\t\t\t\t\t\tconsole.warn('deprecated call to `this.action`')\n\t\t\t\t\t\tlet params = Array.from(arguments).slice()\n\t\t\t\t params.shift()\n\t\t\t\t return this.actions[name](...params)\n\t\t\t\t }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'view':\n\t\t\t\t\tthis.view = view({app: this, view: options.view})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'hooks':\n\t\t\t\t\tconst moduleHandler = {\n\t\t\t\t\t\tget: (target, property) => {\n\t\t\t\t\t\t\tif (!target[property]) {\n\t\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof target[property]=='function') {\n\t\t\t\t\t\t\t\treturn new Proxy(target[property], functionHandler)\n\t\t\t\t\t\t\t} else if (target[property] && typeof target[property]=='object') {\n\t\t\t\t\t\t\t\treturn new Proxy(target[property], moduleHandler)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn target[property]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst functionHandler = {\n\t\t\t\t\t\tapply: (target, thisArg, argumentsList) => {\n\t\t\t\t\t\t\t// note: must use short function syntax so this is set to the app\n\t\t\t\t\t\t\treturn target.apply(this, argumentsList)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis[key] = new Proxy(options[key], moduleHandler)\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('simply.app: unknown initialization option \"'+key+'\", added as-is')\n\t\t\t\t\tthis[key] = options[key]\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tget app() {\n\t\treturn this\n\t}\n\tasync start() {\n\t\tif (this.hooks?.start) {\n\t\t\tawait this.hooks.start()\n\t\t}\n\t\tif (this.routes) {\n\t\t\tif (this.baseURL) {\n\t\t\t\tthis.routes.init({ baseURL: this.baseURL })\n\t\t\t}\n\t\t\tthis.routes.handleEvents();\n\t\t\tglobalThis.setTimeout(() => {\n\t\t\t\tif (this.routes.has(globalThis.location?.hash)) {\n\t\t\t\t\tthis.routes.match(globalThis.location.hash)\n\t\t\t\t} else {\n\t\t\t\t\tthis.routes.match(globalThis.location?.pathname+globalThis.location?.hash)\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function app(options={}) {\n\treturn new SimplyApp(options)\n}", "function throttle( callbackFunction, intervalTime ) {\n let eventId = 0\n return () => {\n const myArguments = arguments\n if ( eventId ) {\n return\n } else {\n eventId = globalThis.setTimeout( () => {\n callbackFunction.apply(this, myArguments)\n eventId = 0\n }, intervalTime )\n }\n }\n}\n\nconst runWhenIdle = (() => {\n if (globalThis.requestIdleCallback) {\n return (callback) => {\n globalThis.requestIdleCallback(callback, {timeout: 500})\n }\n }\n return globalThis.requestAnimationFrame\n})()\n\nfunction rebaseHref(relative, base) {\n let url = new URL(relative, base)\n if (include.cacheBuster) {\n url.searchParams.set('cb',include.cacheBuster)\n }\n return url.href\n}\n\nlet observer, loaded = {}\nlet head = globalThis.document.querySelector('head')\nlet currentScript = globalThis.document.currentScript\nlet getScriptURL, currentScriptURL\nif (!currentScript) {\n getScriptURL = (() => {\n var scripts = document.getElementsByTagName('script')\n var index = scripts.length - 1\n var myScript = scripts[index]\n return () => myScript.src\n })()\n currentScriptURL = getScriptURL()\n} else {\n currentScriptURL = currentScript.src\n}\n\nconst waitForPreviousScripts = async () => {\n // because of the async=false attribute, this script will run after\n // the previous scripts have been loaded and run\n // simply.include.next.js only fires the simply-next-script event\n // that triggers the Promise.resolve method\n return new Promise(function(resolve) {\n var next = globalThis.document.createElement('script')\n next.src = \"https://cdn.jsdelivr.net/gh/simplyedit/simplyview/dist/simply.include.next.js\"\n next.async = false\n globalThis.document.addEventListener('simply-include-next', () => {\n head.removeChild(next)\n resolve()\n }, { once: true, passive: true})\n head.appendChild(next)\n })\n}\n\nlet scriptLocations = []\n\nexport const include = {\n cacheBuster: null,\n scripts: (scripts, base) => {\n let arr = scripts.slice()\n const importScript = () => {\n const script = arr.shift()\n if (!script) {\n return\n }\n const attrs = [].map.call(script.attributes, (attr) => {\n return attr.name\n })\n let clone = globalThis.document.createElement('script')\n for (const attr of attrs) {\n clone.setAttribute(attr, script.getAttribute(attr))\n }\n clone.removeAttribute('data-simply-location')\n if (!clone.src) {\n // this is an inline script, so copy the content and wait for previous scripts to run\n clone.innerHTML = script.innerHTML\n waitForPreviousScripts()\n .then(() => {\n const node = scriptLocations[script.dataset.simplyLocation]\n node.parentNode.insertBefore(clone, node)\n node.parentNode.removeChild(node)\n importScript()\n })\n } else {\n clone.src = rebaseHref(clone.src, base)\n if (!clone.hasAttribute('async') && !clone.hasAttribute('defer')) {\n clone.async = false //important! do not use clone.setAttribute('async', false) - it has no effect\n }\n const node = scriptLocations[script.dataset.simplyLocation]\n node.parentNode.insertBefore(clone, node)\n node.parentNode.removeChild(node)\n loaded[clone.src]=true\n importScript()\n }\n }\n if (arr.length) {\n importScript()\n }\n },\n html: (html, link) => {\n let fragment = globalThis.document.createRange().createContextualFragment(html)\n const stylesheets = fragment.querySelectorAll('link[rel=\"stylesheet\"],style')\n // add all stylesheets to head\n for (let stylesheet of stylesheets) {\n if (stylesheet.href) {\n stylesheet.href = rebaseHref(stylesheet.href, link.href)\n }\n head.appendChild(stylesheet)\n }\n // remove the scripts from the fragment, as they will not run in the\n // order in which they are defined\n let scriptsFragment = globalThis.document.createDocumentFragment()\n const scripts = fragment.querySelectorAll('script')\n if (scripts.length) {\n for (let script of scripts) {\n let placeholder = globalThis.document.createComment(script.src || 'inline script')\n script.parentNode.insertBefore(placeholder, script)\n script.dataset.simplyLocation = scriptLocations.length\n scriptLocations.push(placeholder)\n scriptsFragment.appendChild(script)\n }\n globalThis.setTimeout(function() {\n include.scripts(Array.from(scriptsFragment.children), link ? link.href : globalThis.location.href )\n }, 10)\n }\n // add the remainder before the include link\n link.parentNode.insertBefore(fragment, link ? link : null)\n\n }\n}\n\nlet included = {}\nconst includeLinks = async (links) => {\n // mark them as in progress, so handleChanges doesn't find them again\n let remainingLinks = [].reduce.call(links, (remainder, link) => {\n if (link.rel=='simply-include-once' && included[link.href]) {\n link.parentNode.removeChild(link)\n } else {\n included[link.href]=true\n link.rel = 'simply-include-loading'\n remainder.push(link)\n }\n return remainder\n }, [])\n\n for (let link of remainingLinks) {\n if (!link.href) {\n return\n }\n // fetch the html\n const response = await fetch(link.href)\n if (!response.ok) {\n console.log('simply-include: failed to load '+link.href);\n continue\n }\n console.log('simply-include: loaded '+link.href);\n const html = await response.text()\n // if succesfull import the html\n include.html(html, link)\n // remove the include link\n link.parentNode.removeChild(link)\n }\n}\n\nconst handleChanges = throttle(() => {\n runWhenIdle(() => {\n var links = globalThis.document.querySelectorAll('link[rel=\"simply-include\"],link[rel=\"simply-include-once\"]')\n if (links.length) {\n includeLinks(links)\n }\n })\n})\n\nconst observe = () => {\n observer = new MutationObserver(handleChanges)\n observer.observe(globalThis.document, {\n subtree: true,\n childList: true,\n })\n}\n\nobserve()\nhandleChanges() // check if there are include links in the dom already\n", "export class SimplyRender extends HTMLElement \n{\n constructor()\n {\n super()\n let templateId = this.getAttribute(\"rel\")\n let template = document.getElementById(templateId)\n\n if (template) {\n let content = template.content.cloneNode(true)\n for (const node of content.childNodes) {\n const clone = node.cloneNode(true)\n if (clone.nodeType == document.ELEMENT_NODE) {\n clone.querySelectorAll(\"template\").forEach(function(t) {\n t.setAttribute(\"simply-render\", \"\")\n })\n }\n this.parentNode.insertBefore(clone, this)\n }\n this.parentNode.removeChild(this)\n }\n }\n}\n\nif (!customElements.get('simply-render')) {\n customElements.define('simply-render', SimplyRender);\n}\n", "import { activate } from './activate.mjs'\nimport { actions as action } from './action.mjs'\nimport { app } from './app.mjs'\nimport { commands as command } from './command.mjs'\nimport { include } from './include.mjs'\nimport { keys as key } from './key.mjs'\nimport { routes as route } from './route.mjs'\nimport { view } from './view.mjs'\nimport { SimplyRender } from './render.mjs'\n\nconst simply = {\n\tactivate,\n\taction,\n\tapp,\n\tcommand,\n\tinclude,\n\tkey,\n\troute,\n\tview\n}\n\nglobalThis.simply = simply\n\nexport default simply"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["listeners", "activate", "name", "callback", "initialCall", "listener", "nodes", "node", "callListeners", "onDestroy", "handleChanges", "changes", "activateNodes", "change", "toActivate", "toDestroy", "child", "observer", "actions", "options", "optionsCompat", "app", "waitHandler", "target", "thisArg", "argumentsList", "result", "functionHandler", "err", "actionHandler", "property", "routes", "options", "optionsCompat", "app", "SimplyRoute", "parseRoutes", "path", "args", "matches", "getPath", "route", "getURL", "params", "key", "i", "searchParams", "action", "routeRe", "getRegexpFromRoute", "result", "callback", "evt", "link", "check", "listener", "baseURL", "exact", "routeInfo", "paths", "matchParams", "SimplyCommands", "options", "defaultHandlers", "commandHandler", "evt", "command", "getCommand", "el", "value", "name", "params", "handler", "commands", "optionsCompat", "app", "handlers", "values", "option", "data", "input", "KEY", "SimplyKey", "options", "keyHandler", "e", "selectedKeyboard", "keyCombination", "keyboards", "keyboardElement", "keyboard", "subkeyboard", "separators", "i", "separator", "keyString", "targets", "t", "keys", "optionsCompat", "app", "view", "options", "optionsCompat", "app", "load", "data", "path", "SimplyApp", "options", "key", "commands", "keys", "routes", "actions", "name", "params", "view", "moduleHandler", "target", "property", "functionHandler", "thisArg", "argumentsList", "app", "throttle", "callbackFunction", "intervalTime", "eventId", "myArguments", "runWhenIdle", "callback", "rebaseHref", "relative", "base", "url", "include", "observer", "loaded", "head", "currentScript", "getScriptURL", "currentScriptURL", "scripts", "index", "myScript", "waitForPreviousScripts", "resolve", "next", "scriptLocations", "arr", "importScript", "script", "attrs", "attr", "clone", "node", "html", "link", "fragment", "stylesheets", "stylesheet", "scriptsFragment", "placeholder", "included", "includeLinks", "links", "remainingLinks", "remainder", "response", "handleChanges", "observe", "SimplyRender", "templateId", "template", "content", "node", "clone", "t", "simply", "activate", "actions", "app", "commands", "include", "keys", "routes", "view", "everything_default"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/src/action.mjs
CHANGED
|
@@ -1,17 +1,66 @@
|
|
|
1
|
-
export function actions(options, optionsCompat)
|
|
1
|
+
export function actions(options, optionsCompat)
|
|
2
|
+
{
|
|
2
3
|
if (optionsCompat) {
|
|
3
4
|
let app = options
|
|
4
5
|
options = optionsCompat
|
|
5
6
|
options.app = app
|
|
6
7
|
}
|
|
8
|
+
|
|
7
9
|
if (options.app) {
|
|
10
|
+
const waitHandler = {
|
|
11
|
+
apply(target, thisArg, argumentsList)
|
|
12
|
+
{
|
|
13
|
+
try {
|
|
14
|
+
const result = target(...argumentsList)
|
|
15
|
+
if (result instanceof Promise) {
|
|
16
|
+
options.app.hooks.wait(true)
|
|
17
|
+
return result.finally(() => {
|
|
18
|
+
options.app.hooks.wait(false, target)
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
return result
|
|
22
|
+
} catch(err) {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const functionHandler = {
|
|
28
|
+
apply(target, thisArg, argumentsList)
|
|
29
|
+
{
|
|
30
|
+
try {
|
|
31
|
+
const result = target(...argumentsList)
|
|
32
|
+
if (result instanceof Promise) {
|
|
33
|
+
if (options.app.hooks.wait) {
|
|
34
|
+
options.app.hooks.wait(true, target)
|
|
35
|
+
return result.catch(err => {
|
|
36
|
+
return options.app.hooks.error(err, target)
|
|
37
|
+
})
|
|
38
|
+
.finally(() => {
|
|
39
|
+
options.app.hooks.wait(false, target)
|
|
40
|
+
})
|
|
41
|
+
} else {
|
|
42
|
+
return result.catch(err => {
|
|
43
|
+
return options.app.hooks.error(err, target)
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result
|
|
48
|
+
} catch(err) {
|
|
49
|
+
return options.app.hooks.error(err, target)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
8
54
|
const actionHandler = {
|
|
9
|
-
get(target, property)
|
|
55
|
+
get(target, property)
|
|
56
|
+
{
|
|
10
57
|
if (!target[property]) {
|
|
11
58
|
return undefined
|
|
12
59
|
}
|
|
13
|
-
if (
|
|
60
|
+
if (options.app.hooks?.error) {
|
|
14
61
|
return new Proxy(target[property].bind(options.app), functionHandler)
|
|
62
|
+
} else if (options.app.hooks?.wait) {
|
|
63
|
+
return new Proxy(target[property].bind(options.app), waitHandler)
|
|
15
64
|
} else {
|
|
16
65
|
return target[property].bind(options.app)
|
|
17
66
|
}
|
|
@@ -21,20 +70,4 @@ export function actions(options, optionsCompat) {
|
|
|
21
70
|
} else {
|
|
22
71
|
return options
|
|
23
72
|
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const functionHandler = {
|
|
27
|
-
apply(target, thisArg, argumentsList) {
|
|
28
|
-
try {
|
|
29
|
-
const result = target(...argumentsList)
|
|
30
|
-
if (result instanceof Promise) {
|
|
31
|
-
return result.catch(err => {
|
|
32
|
-
return thisArg.catch(err)
|
|
33
|
-
})
|
|
34
|
-
}
|
|
35
|
-
return result
|
|
36
|
-
} catch(err) {
|
|
37
|
-
return thisArg.catch(err)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
73
|
}
|
package/src/activate.mjs
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
if (!Symbol.onDestroy) {
|
|
2
|
+
Symbol.onDestroy = Symbol('onDestroy')
|
|
3
|
+
}
|
|
4
|
+
|
|
1
5
|
const listeners = new Map()
|
|
2
6
|
|
|
3
7
|
export const activate = {
|
|
@@ -31,7 +35,12 @@ function callListeners(node) {
|
|
|
31
35
|
const activate = node?.dataset?.simplyActivate
|
|
32
36
|
if (activate && listeners.has(activate)) {
|
|
33
37
|
for (let callback of listeners.get(activate)) {
|
|
34
|
-
callback.call(node)
|
|
38
|
+
const onDestroy = callback.call(node)
|
|
39
|
+
if (typeof onDestroy == 'function') {
|
|
40
|
+
node[Symbol.onDestroy] = onDestroy
|
|
41
|
+
} else if (typeof onDestroy != 'undefined') {
|
|
42
|
+
console.warn('activate listener may only return a de-activate function, instead got', onDestroy)
|
|
43
|
+
}
|
|
35
44
|
}
|
|
36
45
|
}
|
|
37
46
|
}
|
|
@@ -42,13 +51,26 @@ function handleChanges(changes) {
|
|
|
42
51
|
if (change.type == 'childList') {
|
|
43
52
|
for (let node of change.addedNodes) {
|
|
44
53
|
if (node.querySelectorAll) {
|
|
45
|
-
|
|
54
|
+
let toActivate = Array.from(node.querySelectorAll('[data-simply-activate]'))
|
|
46
55
|
if (node.matches('[data-simply-activate]')) {
|
|
47
56
|
toActivate.push(node)
|
|
48
57
|
}
|
|
49
58
|
activateNodes = activateNodes.concat(toActivate)
|
|
50
59
|
}
|
|
51
60
|
}
|
|
61
|
+
for (let node of change.removedNodes) {
|
|
62
|
+
if (node.querySelectorAll) {
|
|
63
|
+
let toDestroy = Array.from(node.querySelectorAll('[data-simply-activate]'))
|
|
64
|
+
if (node.matches['[data-simply-activate']) {
|
|
65
|
+
toDestroy.push(node)
|
|
66
|
+
}
|
|
67
|
+
for (let child of toDestroy) {
|
|
68
|
+
if (child[Symbol.onDestroy]) {
|
|
69
|
+
child[Symbol.onDestroy].call(child)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
52
74
|
}
|
|
53
75
|
}
|
|
54
76
|
for (let node of activateNodes) {
|
package/src/app.mjs
CHANGED
|
@@ -16,12 +16,12 @@ class SimplyApp {
|
|
|
16
16
|
case 'keyboard': // backwards compatible
|
|
17
17
|
this.keys = keys({ app: this, keys: options.keys })
|
|
18
18
|
break
|
|
19
|
+
case 'root': // backwards compatibility
|
|
20
|
+
case 'baseURL':
|
|
21
|
+
this.baseURL = options[key]
|
|
22
|
+
break
|
|
19
23
|
case 'routes':
|
|
20
24
|
this.routes = routes({ app: this, routes: options.routes})
|
|
21
|
-
this.routes.handleEvents();
|
|
22
|
-
globalThis.setTimeout(() => {
|
|
23
|
-
this.routes.match(globalThis.location?.pathname+globalThis.location?.hash);
|
|
24
|
-
});
|
|
25
25
|
break
|
|
26
26
|
case 'actions':
|
|
27
27
|
this.actions = actions({app: this, actions: options.actions})
|
|
@@ -35,8 +35,32 @@ class SimplyApp {
|
|
|
35
35
|
case 'view':
|
|
36
36
|
this.view = view({app: this, view: options.view})
|
|
37
37
|
break
|
|
38
|
+
case 'hooks':
|
|
39
|
+
const moduleHandler = {
|
|
40
|
+
get: (target, property) => {
|
|
41
|
+
if (!target[property]) {
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
44
|
+
if (typeof target[property]=='function') {
|
|
45
|
+
return new Proxy(target[property], functionHandler)
|
|
46
|
+
} else if (target[property] && typeof target[property]=='object') {
|
|
47
|
+
return new Proxy(target[property], moduleHandler)
|
|
48
|
+
} else {
|
|
49
|
+
return target[property]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const functionHandler = {
|
|
54
|
+
apply: (target, thisArg, argumentsList) => {
|
|
55
|
+
// note: must use short function syntax so this is set to the app
|
|
56
|
+
return target.apply(this, argumentsList)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
this[key] = new Proxy(options[key], moduleHandler)
|
|
60
|
+
break
|
|
38
61
|
default:
|
|
39
|
-
|
|
62
|
+
console.log('simply.app: unknown initialization option "'+key+'", added as-is')
|
|
63
|
+
this[key] = options[key]
|
|
40
64
|
break
|
|
41
65
|
}
|
|
42
66
|
}
|
|
@@ -44,6 +68,24 @@ class SimplyApp {
|
|
|
44
68
|
get app() {
|
|
45
69
|
return this
|
|
46
70
|
}
|
|
71
|
+
async start() {
|
|
72
|
+
if (this.hooks?.start) {
|
|
73
|
+
await this.hooks.start()
|
|
74
|
+
}
|
|
75
|
+
if (this.routes) {
|
|
76
|
+
if (this.baseURL) {
|
|
77
|
+
this.routes.init({ baseURL: this.baseURL })
|
|
78
|
+
}
|
|
79
|
+
this.routes.handleEvents();
|
|
80
|
+
globalThis.setTimeout(() => {
|
|
81
|
+
if (this.routes.has(globalThis.location?.hash)) {
|
|
82
|
+
this.routes.match(globalThis.location.hash)
|
|
83
|
+
} else {
|
|
84
|
+
this.routes.match(globalThis.location?.pathname+globalThis.location?.hash)
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
47
89
|
}
|
|
48
90
|
|
|
49
91
|
export function app(options={}) {
|
package/src/key.mjs
CHANGED
package/src/route.mjs
CHANGED
|
@@ -12,7 +12,7 @@ class SimplyRoute
|
|
|
12
12
|
{
|
|
13
13
|
constructor(options={})
|
|
14
14
|
{
|
|
15
|
-
this.
|
|
15
|
+
this.baseURL = options.baseURL || '/'
|
|
16
16
|
this.app = options.app || {}
|
|
17
17
|
this.addMissingSlash = !!options.addMissingSlash
|
|
18
18
|
this.matchExact = !!options.matchExact
|
|
@@ -63,7 +63,7 @@ class SimplyRoute
|
|
|
63
63
|
matches = route.match.exec(path+'/')
|
|
64
64
|
if (matches) {
|
|
65
65
|
path+='/'
|
|
66
|
-
history.replaceState({}, '', getURL(path, this.
|
|
66
|
+
history.replaceState({}, '', getURL(path, this.baseURL))
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -91,7 +91,7 @@ class SimplyRoute
|
|
|
91
91
|
|
|
92
92
|
runListeners(action, params)
|
|
93
93
|
{
|
|
94
|
-
if (!Object.keys(this.listeners[action])) {
|
|
94
|
+
if (!this.listeners[action] || !Object.keys(this.listeners[action])) {
|
|
95
95
|
return
|
|
96
96
|
}
|
|
97
97
|
Object.keys(this.listeners[action]).forEach((route) => {
|
|
@@ -112,8 +112,8 @@ class SimplyRoute
|
|
|
112
112
|
handleEvents()
|
|
113
113
|
{
|
|
114
114
|
globalThis.addEventListener('popstate', () => {
|
|
115
|
-
if (this.match(getPath(document.location.pathname + document.location.hash, this.
|
|
116
|
-
this.match(getPath(document.location.pathname, this.
|
|
115
|
+
if (this.match(getPath(document.location.pathname + document.location.hash, this.baseURL)) === false) {
|
|
116
|
+
this.match(getPath(document.location.pathname, this.baseURL))
|
|
117
117
|
}
|
|
118
118
|
})
|
|
119
119
|
this.app.container.addEventListener('click', (evt) => {
|
|
@@ -133,10 +133,11 @@ class SimplyRoute
|
|
|
133
133
|
&& !link.link
|
|
134
134
|
&& !link.dataset.simplyCommand
|
|
135
135
|
) {
|
|
136
|
-
let
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
let check = [link.hash, link.pathname+link.hash, link.pathname]
|
|
137
|
+
let path
|
|
138
|
+
do {
|
|
139
|
+
path = getPath(check.shift(), this.baseURL);
|
|
140
|
+
} while(check.length && !this.has(path))
|
|
140
141
|
if ( this.has(path) ) {
|
|
141
142
|
let params = this.runListeners('goto', { path: path});
|
|
142
143
|
if (params.path) {
|
|
@@ -153,13 +154,13 @@ class SimplyRoute
|
|
|
153
154
|
|
|
154
155
|
goto(path)
|
|
155
156
|
{
|
|
156
|
-
history.pushState({},'',getURL(path, this.
|
|
157
|
+
history.pushState({},'',getURL(path, this.baseURL))
|
|
157
158
|
return this.match(path)
|
|
158
159
|
}
|
|
159
160
|
|
|
160
161
|
has(path)
|
|
161
162
|
{
|
|
162
|
-
path = getPath(path, this.
|
|
163
|
+
path = getPath(path, this.baseURL)
|
|
163
164
|
for (let route of this.routeInfo) {
|
|
164
165
|
var matches = route.match.exec(path)
|
|
165
166
|
if (matches && matches.length) {
|
|
@@ -195,22 +196,22 @@ class SimplyRoute
|
|
|
195
196
|
|
|
196
197
|
init(options)
|
|
197
198
|
{
|
|
198
|
-
if (options.
|
|
199
|
-
this.
|
|
199
|
+
if (options.baseURL) {
|
|
200
|
+
this.baseURL = options.baseURL
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
203
|
}
|
|
203
204
|
|
|
204
|
-
function getPath(path,
|
|
205
|
+
function getPath(path, baseURL='/')
|
|
205
206
|
{
|
|
206
|
-
if (path.substring(0,
|
|
207
|
+
if (path.substring(0,baseURL.length)==baseURL
|
|
207
208
|
||
|
|
208
|
-
(
|
|
209
|
-
&& path.length==(
|
|
210
|
-
&& path ==
|
|
209
|
+
( baseURL[baseURL.length-1]=='/'
|
|
210
|
+
&& path.length==(baseURL.length-1)
|
|
211
|
+
&& path == baseURL.substring(0,path.length)
|
|
211
212
|
)
|
|
212
213
|
) {
|
|
213
|
-
path = path.substring(
|
|
214
|
+
path = path.substring(baseURL.length)
|
|
214
215
|
}
|
|
215
216
|
if (path[0]!='/' && path[0]!='#') {
|
|
216
217
|
path = '/'+path
|
|
@@ -218,13 +219,16 @@ function getPath(path, root='/')
|
|
|
218
219
|
return path
|
|
219
220
|
}
|
|
220
221
|
|
|
221
|
-
function getURL(path,
|
|
222
|
+
function getURL(path, baseURL)
|
|
222
223
|
{
|
|
223
|
-
path = getPath(path,
|
|
224
|
-
if (
|
|
224
|
+
path = getPath(path, baseURL)
|
|
225
|
+
if (baseURL[baseURL.length-1]==='/' && path[0]==='/') {
|
|
225
226
|
path = path.substring(1)
|
|
226
227
|
}
|
|
227
|
-
|
|
228
|
+
if (path[0]=='#') {
|
|
229
|
+
return path
|
|
230
|
+
}
|
|
231
|
+
return baseURL + path
|
|
228
232
|
}
|
|
229
233
|
|
|
230
234
|
function getRegexpFromRoute(route, exact=false)
|