wj-elements 0.1.196 → 0.1.198
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/wje-dialog.js
CHANGED
|
@@ -3,7 +3,7 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
|
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
4
|
import WJElement from "./wje-element.js";
|
|
5
5
|
import { event } from "./event.js";
|
|
6
|
-
const styles = "/*\n[ WJ Dialog ]\n*/\n\n:host {\n --wje-dialog-header-actions-gap: 0.5rem;\n\n .close {\n margin-left: auto;\n }\n\n .header-actions {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wje-dialog-header-actions-gap);\n }\n\n .modal-content {\n border-radius: 3px;\n box-shadow: none;\n }\n\n .dialog-header {\n position: relative;\n border-bottom: 0;\n padding-inline: var(--wje-dialog-padding);\n padding-top: var(--wje-dialog-padding);\n padding-bottom: var(--wje-dialog-padding);\n display: flex;\n align-items: center;\n span {\n font-family: var(--wje-font-family-secondary);\n font-size: var(--wje-dialog-headline-font-size);\n text-transform: var(--wje-dialog-headline-text-transform);\n display: inline-block;\n letter-spacing: var(--wje-dialog-headline-letter-spacing);\n font-weight: var(--wje-dialog-headline-font-weight);\n margin: 0;\n padding: 0;\n line-height: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n filter: alpha(opacity=40);\n }\n }\n\n .dialog-content {\n box-shadow: none;\n padding-inline: var(--wje-dialog-padding);\n white-space: normal;\n z-index: 1;\n }\n\n .dialog-footer {\n display: flex;\n justify-content: end;\n border-top: none;\n box-shadow: none;\n margin-top: 0;\n padding-inline: var(--wje-dialog-padding-inline);\n padding-top: var(--wje-dialog-padding-top);\n padding-bottom: var(--wje-dialog-padding-bottom);\n }\n}\n\n/*Blocking element styles*/\n.blocking-element {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--wje-color-contrast-0);\n opacity: 0.75;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n wje-icon {\n animation: loader 1s linear infinite;\n }\n}\n\n@keyframes loader {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\ndialog::backdrop {\n opacity: var(--wje-backdrop-opacity);\n background-color: var(--wje-backdrop);\n}\n\ndialog:focus-visible {\n outline: none;\n}\n\n:host(.separator) .dialog-header:after {\n content: '';\n height: 1px;\n background: rgba(0, 0, 0, 0.08);\n left: var(--wje-dialog-padding);\n right: var(--wje-dialog-padding);\n position: absolute;\n bottom: 0;\n}\n\n:host {\n dialog {\n box-sizing: border-box;\n transition: all 0.2s !important;\n width: var(--wje-dialog-width);\n height: var(--wje-dialog-height);\n box-shadow:
|
|
6
|
+
const styles = "/*\n[ WJ Dialog ]\n*/\n\n:host {\n --wje-dialog-header-actions-gap: 0.5rem;\n\n .close {\n margin-left: auto;\n }\n\n .header-actions {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wje-dialog-header-actions-gap);\n }\n\n .modal-content {\n border-radius: 3px;\n box-shadow: none;\n }\n\n .dialog-header {\n position: relative;\n border-bottom: 0;\n padding-inline: var(--wje-dialog-padding);\n padding-top: var(--wje-dialog-padding);\n padding-bottom: var(--wje-dialog-padding);\n display: flex;\n align-items: center;\n span {\n font-family: var(--wje-font-family-secondary);\n font-size: var(--wje-dialog-headline-font-size);\n text-transform: var(--wje-dialog-headline-text-transform);\n display: inline-block;\n letter-spacing: var(--wje-dialog-headline-letter-spacing);\n font-weight: var(--wje-dialog-headline-font-weight);\n margin: 0;\n padding: 0;\n line-height: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n filter: alpha(opacity=40);\n }\n }\n\n .dialog-content {\n box-shadow: none;\n padding-inline: var(--wje-dialog-padding);\n white-space: normal;\n z-index: 1;\n }\n\n .dialog-footer {\n display: flex;\n justify-content: end;\n border-top: none;\n box-shadow: none;\n margin-top: 0;\n padding-inline: var(--wje-dialog-padding-inline);\n padding-top: var(--wje-dialog-padding-top);\n padding-bottom: var(--wje-dialog-padding-bottom);\n }\n}\n\n/*Blocking element styles*/\n.blocking-element {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--wje-color-contrast-0);\n opacity: 0.75;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n wje-icon {\n animation: loader 1s linear infinite;\n }\n}\n\n@keyframes loader {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\ndialog::backdrop {\n opacity: var(--wje-backdrop-opacity);\n background-color: var(--wje-backdrop);\n}\n\ndialog:focus-visible {\n outline: none;\n}\n\n:host(.separator) .dialog-header:after {\n content: '';\n height: 1px;\n background: rgba(0, 0, 0, 0.08);\n left: var(--wje-dialog-padding);\n right: var(--wje-dialog-padding);\n position: absolute;\n bottom: 0;\n}\n\n:host {\n dialog {\n box-sizing: border-box;\n transition: all 0.2s !important;\n width: var(--wje-dialog-width);\n height: var(--wje-dialog-height);\n box-shadow: var(--wje-shadow-large);\n\n border-radius: var(--wje-dialog-border-radius);\n border-width: var(--wje-dialog-border-width);\n border-style: var(--wje-dialog-border-style);\n border-color: var(--wje-dialog-border-color);\n\n margin-top: var(--wje-dialog-margin-top);\n\n margin-bottom: var(--wje-dialog-margin-bottom);\n margin-inline: var(--wje-dialog-margin-start) var(--wje-dialog-margin-end);\n\n padding: 0;\n }\n}\n\n/*Top*/\n:host(.stick-up) {\n --wje-dialog-width: 300px;\n --wje-dialog-height: fit-content;\n --wje-dialog-border-radius: 0 0 var(--wje-border-radius-large) var(--wje-border-radius-large);\n --wje-dialog-border-width: 0 1px 1px 1px;\n --wje-dialog-margin-top: 0;\n --wje-dialog-translate-from: translateY(-110%);\n --wje-dialog-template-to: translateX(0);\n}\n\n/*Cenetered*/\n:host(.slide-up) {\n --wje-dialog-width: 300px;\n --wje-dialog-height: fit-content;\n --wje-dialog-border-radius: var(--wje-border-radius-large);\n --wje-dialog-border-width: 1px;\n --wje-dialog-opacity-from: 0;\n --wje-dialog-translate-from: scale(0.9);\n --wje-dialog-translate-to: scale(1);\n}\n\n/*Fullscreen*/\n:host(.fill-in) {\n --wje-dialog-width: 100%;\n --wje-dialog-height: 100%;\n --wje-dialog-border-radius: 0 0 0 0 !important;\n --wje-dialog-border-width: 0;\n --wje-dialog-margin-top: 0;\n --wje-dialog-margin-start: 0;\n --wje-dialog-margin-end: 0;\n --wje-dialog-margin-bottom: 0;\n --wje-dialog-translate-from: scale(0.95);\n --wje-dialog-translate-to: scale(1);\n dialog {\n min-width: var(--wje-dialog-width);\n min-height: var(--wje-dialog-height);\n }\n}\n\n/*Slide Left*/\n:host(.slide-left) {\n --wje-dialog-width: 300px;\n --wje-dialog-height: 100%;\n --wje-dialog-border-radius: 0;\n --wje-dialog-border-width: 0 1px 0 0;\n --wje-dialog-margin-top: 0;\n --wje-dialog-margin-start: 0;\n --wje-dialog-margin-end: auto;\n --wje-dialog-margin-bottom: 0;\n dialog {\n min-height: var(--wje-dialog-height);\n --wje-dialog-translate-from: translateX(-110%);\n --wje-dialog-template-to: translateX(0);\n }\n}\n\n/*Slide Right*/\n:host(.slide-right) {\n --wje-dialog-width: 300px !important;\n --wje-dialog-height: 100% !important;\n --wje-dialog-border-radius: 0;\n --wje-dialog-border-width: 0 0 0 1px;\n --wje-dialog-margin-top: 0;\n --wje-dialog-margin-start: auto;\n --wje-dialog-margin-end: 0;\n --wje-dialog-margin-bottom: 0;\n dialog {\n min-height: var(--wje-dialog-height);\n --wje-dialog-translate-from: translateX(110%);\n --wje-dialog-template-to: translateX(0);\n }\n}\n\n:host(.small) {\n --wje-dialog-width: 300px !important;\n}\n\n:host(.medium) {\n --wje-dialog-width: 500px !important;\n}\n\n:host(.large) {\n --wje-dialog-width: 600px !important;\n}\n\n:host(.ex-large) {\n --wje-dialog-width: 900px !important;\n}\n\ndialog[open] {\n animation: show 0.5s ease normal;\n}\n\n@keyframes show {\n from {\n opacity: var(--wje-dialog-opacity-from, 1);\n transform: var(--wje-dialog-translate-from);\n }\n to {\n opacity: 1;\n transform: var(--wje-dialog-translate-to);\n }\n}\n";
|
|
7
7
|
class Dialog extends WJElement {
|
|
8
8
|
/**
|
|
9
9
|
* @class
|
package/dist/wje-file-upload.js
CHANGED
|
@@ -375,9 +375,8 @@ class FileUpload extends WJElement {
|
|
|
375
375
|
native.classList.add("native-file-upload");
|
|
376
376
|
native.setAttribute("part", "native");
|
|
377
377
|
let label = document.createElement("div");
|
|
378
|
-
label.setAttribute("part", "label");
|
|
379
|
-
label.classList.add("file-label");
|
|
380
378
|
label.setAttribute("part", "file-label");
|
|
379
|
+
label.classList.add("file-label");
|
|
381
380
|
let fileList = document.createElement("slot");
|
|
382
381
|
fileList.setAttribute("name", "item");
|
|
383
382
|
fileList.setAttribute("part", "items");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wje-file-upload.js","sources":["../packages/wje-file-upload/service/service.js","../packages/wje-file-upload/file-upload.element.js","../packages/wje-file-upload/file-upload.js"],"sourcesContent":["/**\n * Returns a list of file type categories and their corresponding icon names.\n * @returns {Array<object>} An array of objects representing file type categories.\n * Each object contains the following properties:\n * - `type` {Array<string>} A list of file extensions associated with the category.\n * - `name` {string} The name of the icon representing the category.\n * @example\n * const types = fileType();\n * console.log(types);\n * // [\n * // { type: [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bpm\", \"tiff\", \"svg\"], name: \"photo\" },\n * // { type: [\"zip\", \"rar\", \"cab\", \"jar\", \"tar\", \"gzip\", \"uue\", \"bz2\", \"scorm\", \"war\"], name: \"file-type-zip\" },\n * // ...\n * // ]\n */\nfunction fileType() {\n return [\n {\n type: ['jpg', 'jpeg', 'png', 'gif', 'bpm', 'tiff', 'svg'],\n name: 'photo',\n },\n {\n type: ['zip', 'rar', 'cab', 'jar', 'tar', 'gzip', 'uue', 'bz2', 'scorm', 'war'],\n name: 'file-type-zip',\n },\n {\n type: ['mov', 'mp4', 'avi', 'flv'],\n name: 'video',\n },\n {\n type: ['m4a', 'mp3', 'wav'],\n name: 'audio',\n },\n {\n type: ['html', 'html'],\n name: 'file-type-html',\n },\n {\n type: ['css'],\n name: 'code',\n },\n {\n type: ['txt'],\n name: 'file-type-txt',\n },\n {\n type: ['doc', 'docx'],\n name: 'file-type-doc',\n },\n {\n type: ['xls', 'xlsx'],\n name: 'file-type-xls',\n },\n {\n type: ['pdf'],\n name: 'file-type-pdf',\n },\n {\n type: ['ppt', 'pptx', 'odp'],\n name: 'file-type-ppt',\n },\n ];\n}\n\n/**\n * Retrieves the icon name for a given file type.\n * @param {string} type The file type or category (e.g., \"pdf\", \"image\", \"folder\").\n * @returns {string} The name of the icon associated with the file type.\n * @example\n * getFileTypeIcon('pdf'); // Returns the icon name for PDF files.\n * getFileTypeIcon('folder'); // Returns 'folder'.\n */\nexport function getFileTypeIcon(type) {\n let searchType;\n if (type.toLowerCase() !== 'folder') {\n fileType().forEach((i) => {\n if (i.type.includes(type.toLowerCase())) {\n searchType = i.name;\n }\n });\n } else {\n searchType = 'folder';\n }\n\n return searchType;\n}\n\n/**\n * Checks if a given file matches any of the accepted file types.\n * @param {File} file The file to validate.\n * @param {string|string[]} acceptedFileTypes A comma-separated string or an array of accepted MIME types or file extensions.\n * @returns {boolean} Returns `true` if the file type is valid, otherwise `false`.\n * @throws {Error} Throws an error if `acceptedFileTypes` is empty.\n * @example\n * const file = new File([\"\"], \"example.png\", { type: \"image/png\" });\n * const isValid = isValidFileType(file, \"image/*,application/pdf\");\n * console.log(isValid); // true\n * @example\n * const file = new File([\"\"], \"example.txt\", { type: \"text/plain\" });\n * const isValid = isValidFileType(file, [\"text/plain\", \"application/json\"]);\n * console.log(isValid); // true\n */\nexport function isValidFileType(file, acceptedFileTypes) {\n // Get the base MIME type\n const baseMimeType = file.type.split('/')[0];\n // If acceptedFileTypes is a string, convert it to an array\n let acceptedTypes = Array.isArray(acceptedFileTypes) ? acceptedFileTypes : acceptedFileTypes.split(',');\n // If acceptedFileTypes is empty, throw an error\n if (acceptedTypes.length === 0) {\n throw new Error('acceptedFileTypes is empty');\n }\n\n // Iterate over acceptedFileTypes\n for (let type of acceptedTypes) {\n // ak type na image/* a file je napriklad image/png tak vratime true\n if (type.includes(baseMimeType + '/*')) {\n return true;\n }\n\n // Ak type suboru obsahuje konkretny typ a to bud ak je to zapisany napriklad image/png alebo len png tak vratime true\n if (type.includes(file.type) || type.includes(file.type.split('/')[1])) {\n return true;\n }\n }\n\n // Ak sme nic nenasli tak vratime false\n return false;\n}\n\n/**\n * Uploads a file in chunks using `XMLHttpRequest`, allowing for progress tracking.\n * @param {File} file The file to be uploaded.\n * @param {number} chunkSize The size of each chunk in bytes.\n * @param {HTMLElement} preview The element used to display upload progress.\n */\nexport function uploadFile(file, chunkSize, preview) {\n let offset = 0;\n const progressArray = new Array(Math.ceil(file.size / chunkSize)).fill(0);\n\n const readAndUploadChunk = (start, end) => {\n const reader = new FileReader();\n const chunkIndex = start / chunkSize;\n const chunk = file.slice(start, end);\n\n reader.onload = (e) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', '/upload', true);\n xhr.setRequestHeader('Content-Range', `${start}-${end}/${file.size}`);\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n const progress = (event.loaded / event.total) * 100;\n progressArray[chunkIndex] = progress;\n const totalProgress = progressArray.reduce((a, b) => a + b, 0) / progressArray.length;\n // this.updateOverallProgress(progressArray, file.lastModified);\n // preview.setAttribute(\"progress\", totalProgress);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status === 200 || xhr.status === 201) {\n progressArray[chunkIndex] = 100; // Táto časť je kompletná\n\n // Odoslanie ďalšej časti\n start += chunkSize;\n if (start < file.size) {\n preview.setAttribute('uploaded', start);\n readAndUploadChunk(start, Math.min(start + chunkSize, file.size));\n } else {\n preview.setAttribute('uploaded', start);\n }\n } else {\n console.error('Error during upload: ', xhr.statusText);\n }\n };\n xhr.send(e.target.result);\n };\n reader.readAsArrayBuffer(chunk);\n };\n\n readAndUploadChunk(offset, Math.min(offset + chunkSize, file.size));\n}\n\n/**\n * Returns a function for uploading files either in chunks or as a whole file, based on the provided options.\n * @param {string} url The URL to which the file will be uploaded.\n * @param {number} [chunkSize] The size of each chunk in bytes when uploading in chunks (default is 1MB).\n * @param {boolean} [wholeFile] Whether to upload the file as a whole. If `true`, the entire file is uploaded at once.\n * @returns {Function} A function that takes a file and a preview element as arguments and uploads the file.\n * @example\n * // Upload a file in chunks\n * const uploadInChunks = upload('/upload', 1024 * 512); // 512KB chunks\n * uploadInChunks(file, previewElement);\n * @example\n * // Upload a whole file\n * const uploadWhole = upload('/upload', undefined, true);\n * uploadWhole(file, previewElement);\n */\nexport function upload(url, chunkSize = 1024 * 1024, wholeFile = false) {\n if (wholeFile) {\n return (file, preview) => uploadWholeFile(url, file, preview);\n }\n return (file, preview) => uploadFileInChunks(url, file, preview, chunkSize);\n}\n\n/**\n * Uploads a file in chunks to a specified URL, allowing for progress tracking and resuming in case of errors.\n * @param {string} url The URL to which the file chunks will be uploaded.\n * @param {File} file The file to be uploaded in chunks.\n * @param {HTMLElement} preview The element used to display upload progress.\n * @param {number} [chunkSize] The size of each chunk in bytes (default is 1MB).\n * @returns {Promise<object>} Resolves with the response of the last chunk uploaded, parsed as JSON.\n * @throws {Error} - Throws an error if a chunk fails to upload.\n */\nexport async function uploadFileInChunks(url, file, preview, chunkSize = 1024 * 1024) {\n let offset = 0;\n const totalChunks = Math.ceil(file.size / chunkSize);\n const partResponses = [];\n\n while (offset < file.size) {\n const chunk = file.slice(offset, offset + chunkSize);\n\n // Creating a custom ReadableStream to track progress of the current chunk\n const stream = new ReadableStream({\n start(controller) {\n const reader = chunk.stream().getReader();\n let uploadedBytes = 0;\n\n reader.read().then(function process({ done, value }) {\n if (done) {\n controller.close();\n return Promise.resolve();\n }\n\n // Track progress\n uploadedBytes += value.byteLength;\n const percentComplete = ((offset + uploadedBytes) / file.size) * 100;\n preview.setAttribute('uploaded', offset + uploadedBytes);\n\n // Enqueue chunk data into the stream\n controller.enqueue(value);\n\n // Read the next chunk\n return reader.read().then(process);\n });\n },\n });\n\n const formData = new FormData();\n formData.append('file', new Blob([stream])); // Send the current stream (chunk)\n formData.append('chunkIndex', Math.floor(offset / chunkSize)); // Send chunk index\n formData.append('totalChunks', totalChunks); // Send total chunks\n formData.append('fileName', file.name); // Send file name\n\n try {\n // Send the current chunk via Fetch\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload chunk ${Math.floor(offset / chunkSize) + 1}: ${response.statusText}`);\n }\n\n partResponses.push(response);\n } catch (error) {\n console.error('Error uploading chunk:', error);\n break;\n }\n\n // Move to the next chunk\n offset += chunkSize;\n }\n\n const response = await partResponses.at(-1).json();\n\n return {\n data: response,\n file,\n };\n}\n\n/**\n * Uploads a file to a specified URL using a `POST` request and updates the preview element with the uploaded file size.\n * @param {string} url The URL to which the file will be uploaded.\n * @param {File} file The file to be uploaded.\n * @param {HTMLElement} preview The element that displays the upload preview. It will be updated with the file size.\n * @returns {Promise<{data: object, file: File}>} - A promise that resolves with the server response and the uploaded file.\n * @throws {Error} - Logs an error to the console if the request fails.\n */\nexport function uploadWholeFile(url, file, preview) {\n const formData = new FormData();\n formData.append('file', file);\n\n //use fetch\n return fetch(url, {\n method: 'POST',\n body: formData,\n })\n .then((response) => response.json())\n .then((data) => {\n preview.setAttribute('uploaded', file.size);\n return {\n data,\n file,\n };\n })\n .catch((error) => {\n console.error('Error:', error);\n });\n}\n","import { Localizer } from '../utils/localize.js';\nimport Button from '../wje-button/button.js';\nimport { default as WJElement } from '../wje-element/element.js';\nimport { getFileTypeIcon, isValidFileType, upload } from './service/service.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary FileUpload is a custom web component for uploading files.\n * It extends from WJElement and provides functionalities for file upload.\n * @documentation https://elements.webjet.sk/components/file-upload\n * @status stable\n * @augments WJElement\n * @slot - This is a default/unnamed slot.\n * @csspart native - The native file upload part.\n * @csspart file-list - The file list part.\n * @csspart upload-button - The label part.\n * @event change - Fires when the file input changes.\n * @event drop - Fires when a file is dropped into the component.\n * @attribute {string} accepted-types - The accepted file types for upload.\n * @attribute {number} chunk-size - The chunk size for file upload.\n * @attribute {number} max-file-size - The maximum file size for upload.\n * @attribute {string} upload-url - The URL to set as the upload URL.\n * @attribute {boolean} auto-process-files - The auto process files attribute.\n * @attribute {boolean} no-upload-button - The no upload button attribute.\n * @tag wje-file-upload\n */\nexport default class FileUpload extends WJElement {\n /**\n * Constructor for FileUpload.\n * Initializes a new instance of the Localizer.\n */\n constructor() {\n super();\n this.localizer = new Localizer(this);\n this._uploadedFiles = [];\n this._queuedFiles = [];\n }\n\n /**\n * Dependencies for the FileUpload component.\n * @type {object}\n */\n dependencies = {\n 'wje-button': Button,\n };\n\n /**\n * Setter for acceptedTypes attribute.\n * @param {string} value The accepted file types for upload.\n */\n set acceptedTypes(value) {\n this.setAttribute('accepted-types', value);\n }\n\n /**\n * Getter for acceptedTypes attribute.\n * @returns {string} The accepted file types for upload.\n */\n get acceptedTypes() {\n const accepted = this.getAttribute('accepted-types');\n return this.hasAttribute('accepted-types') ? accepted : '';\n }\n\n /**\n * Setter for chunkSize attribute.\n * @param {number} value The chunk size for file upload.\n */\n set chunkSize(value) {\n this.setAttribute('chunk-size', value);\n }\n\n /**\n * Getter for chunkSize attribute.\n * @returns {number} The chunk size for file upload.\n */\n get chunkSize() {\n const chunk = this.getAttribute('chunk-size');\n return this.hasAttribute('chunk-size') ? chunk : 1024 * 1024;\n }\n\n /**\n * Setter for maxFileSize attribute.\n * @param {number} value The maximum file size for upload.\n */\n set maxFileSize(value) {\n this.setAttribute('max-file-size', value);\n }\n\n /**\n * Getter for maxFileSize attribute.\n * @returns {number} The maximum file size for upload.\n */\n get maxFileSize() {\n const fileSize = this.getAttribute('max-file-size');\n return this.hasAttribute('max-file-size') ? fileSize * 1024 * 1024 : 1024 * 1024;\n }\n\n /**\n * Setter for label attribute.\n * @param {string} value The URL to set as the upload URL.\n */\n set uploadUrl(value) {\n this.setAttribute('upload-url', value);\n }\n\n /**\n * Gets the upload URL for the file upload element.\n * @returns {string} The upload URL for the file upload element.\n */\n get uploadUrl() {\n return this.getAttribute('upload-url') ?? '/upload';\n }\n\n /**\n * Sets the autoProcessFiles attribute.\n * @param value\n */\n set autoProcessFiles(value) {\n this.setAttribute('auto-process-files', value);\n }\n\n /**\n * Gets the autoProcessFiles attribute.\n * @returns {any|boolean}\n */\n get autoProcessFiles() {\n return JSON.parse(this.getAttribute('auto-process-files')) ?? true;\n }\n\n /**\n * Sets the noUploadButton attribute.\n * @param value\n */\n set noUploadButton(value) {\n this.setAttribute('no-upload-button', value);\n }\n\n /**\n * Gets the noUploadButton attribute.\n * @returns {boolean}\n */\n get noUploadButton() {\n return this.hasAttribute('no-upload-button');\n }\n\n /**\n * Sets the uploaded files.\n * @param value\n */\n set uploadedFiles(value) {\n this._uploadedFiles = value;\n }\n\n /**\n * Return the uploaded files.\n * @returns {[]}\n */\n get uploadedFiles() {\n return this._uploadedFiles;\n }\n\n /**\n * Sets the to-chunk attribute.\n * @param value\n */\n set toChunk(value) {\n this.setAttribute('to-chunk', value);\n }\n\n /**\n * Gets the to-chunk attribute.\n * @returns {boolean}\n */\n get toChunk() {\n return this.hasAttribute('to-chunk');\n }\n\n className = 'FileUpload';\n\n /**\n * Getter for cssStyleSheet.\n * @returns {string} The CSS styles for the component.\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Getter for observedAttributes.\n * @returns {Array} An empty array as no attributes are observed.\n */\n static get observedAttributes() {\n return [];\n }\n\n /**\n * Method to setup attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n }\n\n beforeDraw() {\n this.uploadFunction = upload(this.uploadUrl, this.chunkSize, !this.toChunk);\n }\n\n /**\n * Method to draw the component on the screen.\n * @returns {DocumentFragment} The fragment containing the component.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.classList.add('native-file-upload');\n native.setAttribute('part', 'native');\n\n let label = document.createElement('div');\n label.setAttribute('part', 'label');\n label.classList.add('file-label');\n label.setAttribute('part', 'file-label');\n\n let fileList = document.createElement('slot');\n fileList.setAttribute('name', 'item');\n fileList.setAttribute('part', 'items');\n fileList.classList.add('file-list');\n\n let slot = document.createElement('slot');\n label.appendChild(slot);\n\n let fileInput = document.createElement('input');\n fileInput.setAttribute('type', 'file');\n fileInput.setAttribute('multiple', '');\n fileInput.setAttribute('style', 'display:none;');\n\n if (!this.noUploadButton) {\n let button = document.createElement('wje-button');\n button.innerText = this.label || this.localizer.translate('wj.file.upload.button');\n button.setAttribute('part', 'upload-button');\n\n label.appendChild(button);\n\n this.button = button;\n }\n\n native.appendChild(fileInput);\n native.appendChild(label);\n native.appendChild(fileList);\n\n fragment.appendChild(native);\n\n this.native = native;\n this.fileList = fileList;\n this.fileInput = fileInput;\n\n return fragment;\n }\n\n /**\n * Method to perform actions after the component is drawn.\n */\n afterDraw() {\n this.button?.addEventListener('click', () => {\n this.fileInput.click();\n });\n\n this.fileInput.addEventListener('change', this.handleInputChange);\n this.native.addEventListener('drop', this.handleDrop);\n\n let dragEventCounter = 0;\n\n this.native.addEventListener('dragenter', (event) => {\n event.preventDefault();\n\n if (dragEventCounter === 0) {\n this.native.classList.add('highlight');\n }\n\n dragEventCounter += 1;\n });\n\n this.native.addEventListener('dragover', (event) => {\n event.preventDefault();\n\n if (dragEventCounter === 0) {\n dragEventCounter = 1;\n }\n });\n\n this.native.addEventListener('dragleave', (event) => {\n event.preventDefault();\n\n dragEventCounter -= 1;\n\n if (dragEventCounter <= 0) {\n dragEventCounter = 0;\n this.native.classList.remove('highlight');\n }\n });\n\n this.native.addEventListener('drop', (event) => {\n event.preventDefault();\n\n dragEventCounter = 0;\n this.native.classList.remove('highlight');\n });\n }\n\n /**\n * Method to handle form submission.\n * @param {Event} event The form submission event.\n */\n handleSubmit(event) {\n event.preventDefault();\n\n // TODO: TU TREBA PRIDAT ZOBRAZENIE SUBORU A JEHO PROCESSU\n\n this.addFilesToQueue(this.fileInput.files);\n }\n\n /**\n * Method to handle file drop event.\n * @param {Event} event The file drop event object.\n */\n handleDrop = (event) => {\n const fileList = event.dataTransfer.files;\n\n this.resetFormState();\n\n this.addFilesToQueue(fileList);\n };\n\n /**\n * Method to handle file input change event.\n * @param {Event} event The file input change event object.\n */\n handleInputChange = (event) => {\n this.resetFormState();\n\n try {\n this.handleSubmit(event);\n } catch (err) {}\n };\n\n /**\n * Method to add files to the queue.\n * @param files\n */\n addFilesToQueue(files) {\n this._queuedFiles = [...files];\n\n this.dispatchEvent(\n new CustomEvent('file-upload:files-added', { detail: files, bubbles: true, composed: true })\n );\n this.onAddedFiles?.();\n\n if (this.autoProcessFiles) {\n this.uploadFiles();\n }\n\n this.fileInput.value = '';\n }\n\n /**\n * Method to upload files.\n */\n uploadFiles() {\n if (this._queuedFiles.length === 0) {\n return;\n }\n\n const uploadPromises = this._queuedFiles.map((file) => this.createUploadPromise(file));\n uploadPromises\n .reduce((prev, curr) => {\n return prev.then(() => {\n return curr;\n });\n }, Promise.resolve())\n .then(() => {\n this.dispatchEvent(\n new CustomEvent('file-upload:all-files-uploaded', {\n detail: this.uploadedFiles,\n bubbles: true,\n composed: true,\n })\n );\n this.onAllFilesUploaded?.();\n this._queuedFiles = [];\n });\n }\n\n /**\n * Method to create an upload promise.\n * @param file\n * @returns {Promise<unknown>}\n */\n createUploadPromise = (file) => {\n return new Promise((resolve, reject) => {\n this.assertFilesValid(file);\n let preview;\n\n let reader = new FileReader();\n reader.onload = (e) => {\n this.dispatchEvent(\n new CustomEvent('file-upload:upload-started', { detail: file, bubbles: true, composed: true })\n );\n this.onUploadStarted?.(file);\n\n preview = this.createPreview(file, reader);\n this.appendChild(preview);\n\n this.uploadFunction(file, preview).then((res) => {\n this.dispatchEvent(\n new CustomEvent('file-upload:upladed-file-complete', {\n detail: res,\n bubbles: true,\n composed: true,\n })\n );\n this.onUploadedFileComplete?.(res);\n this.uploadedFiles.push(res.data);\n\n resolve(res);\n });\n };\n\n reader.readAsDataURL(file);\n });\n };\n\n /**\n * Method to create a preview for the file.\n * @param {File} file The file for which the preview is to be created.\n * @param {FileReader} reader The FileReader instance to read the file.\n * @returns {HTMLElement} The created preview.\n */\n createPreview(file, reader) {\n let preview = document.createElement('wje-file-upload-item');\n preview.setAttribute('slot', 'item');\n preview.setAttribute('name', file.name);\n preview.setAttribute('size', file.size);\n preview.setAttribute('uploaded', '0');\n preview.setAttribute('progress', '0');\n preview.innerHTML = `<wje-icon slot=\"img\" name=\"${getFileTypeIcon(file.type.split('/')[1])}\" size=\"large\"></wje-icon>`;\n\n return preview;\n }\n\n /**\n * Method to create a thumbnail for the file.\n * @param {File} file The file for which the thumbnail is to be created.\n * @param {FileReader} reader The FileReader instance to read the file.\n * @returns {HTMLElement} The created thumbnail.\n */\n createThumbnail(file, reader) {\n let img = document.createElement('img');\n img.setAttribute('src', reader.result);\n\n return img;\n }\n\n /**\n * Method to validate the files.\n * @param {File} file The file to be validated.\n * TODO: alowed types a size limit by malo byt cez attributy\n */\n assertFilesValid(file) {\n const { name: fileName, size: fileSize } = file;\n if (!isValidFileType(file, this.acceptedTypes)) {\n throw new Error(`❌ FILE: \"${fileName}\" Valid file types are: \"${this.acceptedTypes}\"`);\n }\n\n if (fileSize > this.maxFileSize) {\n throw new Error(\n `❌ File \"${fileName}\" could not be uploaded. Only images up to ${this.maxFileSize} MB are allowed. Nie je to ${fileSize}`\n );\n }\n }\n\n /**\n * Method to reset the form state.\n */\n resetFormState() {\n this.fileList.textContent = '';\n }\n}\n","import FileUpload from './file-upload.element.js';\n\nexport default FileUpload;\n\nFileUpload.define('wje-file-upload', FileUpload);\n"],"names":["response","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wje-file-upload.js","sources":["../packages/wje-file-upload/service/service.js","../packages/wje-file-upload/file-upload.element.js","../packages/wje-file-upload/file-upload.js"],"sourcesContent":["/**\n * Returns a list of file type categories and their corresponding icon names.\n * @returns {Array<object>} An array of objects representing file type categories.\n * Each object contains the following properties:\n * - `type` {Array<string>} A list of file extensions associated with the category.\n * - `name` {string} The name of the icon representing the category.\n * @example\n * const types = fileType();\n * console.log(types);\n * // [\n * // { type: [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bpm\", \"tiff\", \"svg\"], name: \"photo\" },\n * // { type: [\"zip\", \"rar\", \"cab\", \"jar\", \"tar\", \"gzip\", \"uue\", \"bz2\", \"scorm\", \"war\"], name: \"file-type-zip\" },\n * // ...\n * // ]\n */\nfunction fileType() {\n return [\n {\n type: ['jpg', 'jpeg', 'png', 'gif', 'bpm', 'tiff', 'svg'],\n name: 'photo',\n },\n {\n type: ['zip', 'rar', 'cab', 'jar', 'tar', 'gzip', 'uue', 'bz2', 'scorm', 'war'],\n name: 'file-type-zip',\n },\n {\n type: ['mov', 'mp4', 'avi', 'flv'],\n name: 'video',\n },\n {\n type: ['m4a', 'mp3', 'wav'],\n name: 'audio',\n },\n {\n type: ['html', 'html'],\n name: 'file-type-html',\n },\n {\n type: ['css'],\n name: 'code',\n },\n {\n type: ['txt'],\n name: 'file-type-txt',\n },\n {\n type: ['doc', 'docx'],\n name: 'file-type-doc',\n },\n {\n type: ['xls', 'xlsx'],\n name: 'file-type-xls',\n },\n {\n type: ['pdf'],\n name: 'file-type-pdf',\n },\n {\n type: ['ppt', 'pptx', 'odp'],\n name: 'file-type-ppt',\n },\n ];\n}\n\n/**\n * Retrieves the icon name for a given file type.\n * @param {string} type The file type or category (e.g., \"pdf\", \"image\", \"folder\").\n * @returns {string} The name of the icon associated with the file type.\n * @example\n * getFileTypeIcon('pdf'); // Returns the icon name for PDF files.\n * getFileTypeIcon('folder'); // Returns 'folder'.\n */\nexport function getFileTypeIcon(type) {\n let searchType;\n if (type.toLowerCase() !== 'folder') {\n fileType().forEach((i) => {\n if (i.type.includes(type.toLowerCase())) {\n searchType = i.name;\n }\n });\n } else {\n searchType = 'folder';\n }\n\n return searchType;\n}\n\n/**\n * Checks if a given file matches any of the accepted file types.\n * @param {File} file The file to validate.\n * @param {string|string[]} acceptedFileTypes A comma-separated string or an array of accepted MIME types or file extensions.\n * @returns {boolean} Returns `true` if the file type is valid, otherwise `false`.\n * @throws {Error} Throws an error if `acceptedFileTypes` is empty.\n * @example\n * const file = new File([\"\"], \"example.png\", { type: \"image/png\" });\n * const isValid = isValidFileType(file, \"image/*,application/pdf\");\n * console.log(isValid); // true\n * @example\n * const file = new File([\"\"], \"example.txt\", { type: \"text/plain\" });\n * const isValid = isValidFileType(file, [\"text/plain\", \"application/json\"]);\n * console.log(isValid); // true\n */\nexport function isValidFileType(file, acceptedFileTypes) {\n // Get the base MIME type\n const baseMimeType = file.type.split('/')[0];\n // If acceptedFileTypes is a string, convert it to an array\n let acceptedTypes = Array.isArray(acceptedFileTypes) ? acceptedFileTypes : acceptedFileTypes.split(',');\n // If acceptedFileTypes is empty, throw an error\n if (acceptedTypes.length === 0) {\n throw new Error('acceptedFileTypes is empty');\n }\n\n // Iterate over acceptedFileTypes\n for (let type of acceptedTypes) {\n // ak type na image/* a file je napriklad image/png tak vratime true\n if (type.includes(baseMimeType + '/*')) {\n return true;\n }\n\n // Ak type suboru obsahuje konkretny typ a to bud ak je to zapisany napriklad image/png alebo len png tak vratime true\n if (type.includes(file.type) || type.includes(file.type.split('/')[1])) {\n return true;\n }\n }\n\n // Ak sme nic nenasli tak vratime false\n return false;\n}\n\n/**\n * Uploads a file in chunks using `XMLHttpRequest`, allowing for progress tracking.\n * @param {File} file The file to be uploaded.\n * @param {number} chunkSize The size of each chunk in bytes.\n * @param {HTMLElement} preview The element used to display upload progress.\n */\nexport function uploadFile(file, chunkSize, preview) {\n let offset = 0;\n const progressArray = new Array(Math.ceil(file.size / chunkSize)).fill(0);\n\n const readAndUploadChunk = (start, end) => {\n const reader = new FileReader();\n const chunkIndex = start / chunkSize;\n const chunk = file.slice(start, end);\n\n reader.onload = (e) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', '/upload', true);\n xhr.setRequestHeader('Content-Range', `${start}-${end}/${file.size}`);\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n const progress = (event.loaded / event.total) * 100;\n progressArray[chunkIndex] = progress;\n const totalProgress = progressArray.reduce((a, b) => a + b, 0) / progressArray.length;\n // this.updateOverallProgress(progressArray, file.lastModified);\n // preview.setAttribute(\"progress\", totalProgress);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status === 200 || xhr.status === 201) {\n progressArray[chunkIndex] = 100; // Táto časť je kompletná\n\n // Odoslanie ďalšej časti\n start += chunkSize;\n if (start < file.size) {\n preview.setAttribute('uploaded', start);\n readAndUploadChunk(start, Math.min(start + chunkSize, file.size));\n } else {\n preview.setAttribute('uploaded', start);\n }\n } else {\n console.error('Error during upload: ', xhr.statusText);\n }\n };\n xhr.send(e.target.result);\n };\n reader.readAsArrayBuffer(chunk);\n };\n\n readAndUploadChunk(offset, Math.min(offset + chunkSize, file.size));\n}\n\n/**\n * Returns a function for uploading files either in chunks or as a whole file, based on the provided options.\n * @param {string} url The URL to which the file will be uploaded.\n * @param {number} [chunkSize] The size of each chunk in bytes when uploading in chunks (default is 1MB).\n * @param {boolean} [wholeFile] Whether to upload the file as a whole. If `true`, the entire file is uploaded at once.\n * @returns {Function} A function that takes a file and a preview element as arguments and uploads the file.\n * @example\n * // Upload a file in chunks\n * const uploadInChunks = upload('/upload', 1024 * 512); // 512KB chunks\n * uploadInChunks(file, previewElement);\n * @example\n * // Upload a whole file\n * const uploadWhole = upload('/upload', undefined, true);\n * uploadWhole(file, previewElement);\n */\nexport function upload(url, chunkSize = 1024 * 1024, wholeFile = false) {\n if (wholeFile) {\n return (file, preview) => uploadWholeFile(url, file, preview);\n }\n return (file, preview) => uploadFileInChunks(url, file, preview, chunkSize);\n}\n\n/**\n * Uploads a file in chunks to a specified URL, allowing for progress tracking and resuming in case of errors.\n * @param {string} url The URL to which the file chunks will be uploaded.\n * @param {File} file The file to be uploaded in chunks.\n * @param {HTMLElement} preview The element used to display upload progress.\n * @param {number} [chunkSize] The size of each chunk in bytes (default is 1MB).\n * @returns {Promise<object>} Resolves with the response of the last chunk uploaded, parsed as JSON.\n * @throws {Error} - Throws an error if a chunk fails to upload.\n */\nexport async function uploadFileInChunks(url, file, preview, chunkSize = 1024 * 1024) {\n let offset = 0;\n const totalChunks = Math.ceil(file.size / chunkSize);\n const partResponses = [];\n\n while (offset < file.size) {\n const chunk = file.slice(offset, offset + chunkSize);\n\n // Creating a custom ReadableStream to track progress of the current chunk\n const stream = new ReadableStream({\n start(controller) {\n const reader = chunk.stream().getReader();\n let uploadedBytes = 0;\n\n reader.read().then(function process({ done, value }) {\n if (done) {\n controller.close();\n return Promise.resolve();\n }\n\n // Track progress\n uploadedBytes += value.byteLength;\n const percentComplete = ((offset + uploadedBytes) / file.size) * 100;\n preview.setAttribute('uploaded', offset + uploadedBytes);\n\n // Enqueue chunk data into the stream\n controller.enqueue(value);\n\n // Read the next chunk\n return reader.read().then(process);\n });\n },\n });\n\n const formData = new FormData();\n formData.append('file', new Blob([stream])); // Send the current stream (chunk)\n formData.append('chunkIndex', Math.floor(offset / chunkSize)); // Send chunk index\n formData.append('totalChunks', totalChunks); // Send total chunks\n formData.append('fileName', file.name); // Send file name\n\n try {\n // Send the current chunk via Fetch\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload chunk ${Math.floor(offset / chunkSize) + 1}: ${response.statusText}`);\n }\n\n partResponses.push(response);\n } catch (error) {\n console.error('Error uploading chunk:', error);\n break;\n }\n\n // Move to the next chunk\n offset += chunkSize;\n }\n\n const response = await partResponses.at(-1).json();\n\n return {\n data: response,\n file,\n };\n}\n\n/**\n * Uploads a file to a specified URL using a `POST` request and updates the preview element with the uploaded file size.\n * @param {string} url The URL to which the file will be uploaded.\n * @param {File} file The file to be uploaded.\n * @param {HTMLElement} preview The element that displays the upload preview. It will be updated with the file size.\n * @returns {Promise<{data: object, file: File}>} - A promise that resolves with the server response and the uploaded file.\n * @throws {Error} - Logs an error to the console if the request fails.\n */\nexport function uploadWholeFile(url, file, preview) {\n const formData = new FormData();\n formData.append('file', file);\n\n //use fetch\n return fetch(url, {\n method: 'POST',\n body: formData,\n })\n .then((response) => response.json())\n .then((data) => {\n preview.setAttribute('uploaded', file.size);\n return {\n data,\n file,\n };\n })\n .catch((error) => {\n console.error('Error:', error);\n });\n}\n","import { Localizer } from '../utils/localize.js';\nimport Button from '../wje-button/button.js';\nimport { default as WJElement } from '../wje-element/element.js';\nimport { getFileTypeIcon, isValidFileType, upload } from './service/service.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary FileUpload is a custom web component for uploading files.\n * It extends from WJElement and provides functionalities for file upload.\n * @documentation https://elements.webjet.sk/components/file-upload\n * @status stable\n * @augments WJElement\n * @slot - This is a default/unnamed slot.\n * @csspart native - The native file upload part.\n * @csspart file-list - The file list part.\n * @csspart upload-button - The label part.\n * @event change - Fires when the file input changes.\n * @event drop - Fires when a file is dropped into the component.\n * @attribute {string} accepted-types - The accepted file types for upload.\n * @attribute {number} chunk-size - The chunk size for file upload.\n * @attribute {number} max-file-size - The maximum file size for upload.\n * @attribute {string} upload-url - The URL to set as the upload URL.\n * @attribute {boolean} auto-process-files - The auto process files attribute.\n * @attribute {boolean} no-upload-button - The no upload button attribute.\n * @tag wje-file-upload\n */\nexport default class FileUpload extends WJElement {\n /**\n * Constructor for FileUpload.\n * Initializes a new instance of the Localizer.\n */\n constructor() {\n super();\n this.localizer = new Localizer(this);\n this._uploadedFiles = [];\n this._queuedFiles = [];\n }\n\n /**\n * Dependencies for the FileUpload component.\n * @type {object}\n */\n dependencies = {\n 'wje-button': Button,\n };\n\n /**\n * Setter for acceptedTypes attribute.\n * @param {string} value The accepted file types for upload.\n */\n set acceptedTypes(value) {\n this.setAttribute('accepted-types', value);\n }\n\n /**\n * Getter for acceptedTypes attribute.\n * @returns {string} The accepted file types for upload.\n */\n get acceptedTypes() {\n const accepted = this.getAttribute('accepted-types');\n return this.hasAttribute('accepted-types') ? accepted : '';\n }\n\n /**\n * Setter for chunkSize attribute.\n * @param {number} value The chunk size for file upload.\n */\n set chunkSize(value) {\n this.setAttribute('chunk-size', value);\n }\n\n /**\n * Getter for chunkSize attribute.\n * @returns {number} The chunk size for file upload.\n */\n get chunkSize() {\n const chunk = this.getAttribute('chunk-size');\n return this.hasAttribute('chunk-size') ? chunk : 1024 * 1024;\n }\n\n /**\n * Setter for maxFileSize attribute.\n * @param {number} value The maximum file size for upload.\n */\n set maxFileSize(value) {\n this.setAttribute('max-file-size', value);\n }\n\n /**\n * Getter for maxFileSize attribute.\n * @returns {number} The maximum file size for upload.\n */\n get maxFileSize() {\n const fileSize = this.getAttribute('max-file-size');\n return this.hasAttribute('max-file-size') ? fileSize * 1024 * 1024 : 1024 * 1024;\n }\n\n /**\n * Setter for label attribute.\n * @param {string} value The URL to set as the upload URL.\n */\n set uploadUrl(value) {\n this.setAttribute('upload-url', value);\n }\n\n /**\n * Gets the upload URL for the file upload element.\n * @returns {string} The upload URL for the file upload element.\n */\n get uploadUrl() {\n return this.getAttribute('upload-url') ?? '/upload';\n }\n\n /**\n * Sets the autoProcessFiles attribute.\n * @param value\n */\n set autoProcessFiles(value) {\n this.setAttribute('auto-process-files', value);\n }\n\n /**\n * Gets the autoProcessFiles attribute.\n * @returns {any|boolean}\n */\n get autoProcessFiles() {\n return JSON.parse(this.getAttribute('auto-process-files')) ?? true;\n }\n\n /**\n * Sets the noUploadButton attribute.\n * @param value\n */\n set noUploadButton(value) {\n this.setAttribute('no-upload-button', value);\n }\n\n /**\n * Gets the noUploadButton attribute.\n * @returns {boolean}\n */\n get noUploadButton() {\n return this.hasAttribute('no-upload-button');\n }\n\n /**\n * Sets the uploaded files.\n * @param value\n */\n set uploadedFiles(value) {\n this._uploadedFiles = value;\n }\n\n /**\n * Return the uploaded files.\n * @returns {[]}\n */\n get uploadedFiles() {\n return this._uploadedFiles;\n }\n\n /**\n * Sets the to-chunk attribute.\n * @param value\n */\n set toChunk(value) {\n this.setAttribute('to-chunk', value);\n }\n\n /**\n * Gets the to-chunk attribute.\n * @returns {boolean}\n */\n get toChunk() {\n return this.hasAttribute('to-chunk');\n }\n\n className = 'FileUpload';\n\n /**\n * Getter for cssStyleSheet.\n * @returns {string} The CSS styles for the component.\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Getter for observedAttributes.\n * @returns {Array} An empty array as no attributes are observed.\n */\n static get observedAttributes() {\n return [];\n }\n\n /**\n * Method to setup attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n }\n\n beforeDraw() {\n this.uploadFunction = upload(this.uploadUrl, this.chunkSize, !this.toChunk);\n }\n\n /**\n * Method to draw the component on the screen.\n * @returns {DocumentFragment} The fragment containing the component.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.classList.add('native-file-upload');\n native.setAttribute('part', 'native');\n\n let label = document.createElement('div');\n label.setAttribute('part', 'file-label');\n label.classList.add('file-label');\n\n let fileList = document.createElement('slot');\n fileList.setAttribute('name', 'item');\n fileList.setAttribute('part', 'items');\n fileList.classList.add('file-list');\n\n let slot = document.createElement('slot');\n label.appendChild(slot);\n\n let fileInput = document.createElement('input');\n fileInput.setAttribute('type', 'file');\n fileInput.setAttribute('multiple', '');\n fileInput.setAttribute('style', 'display:none;');\n\n if (!this.noUploadButton) {\n let button = document.createElement('wje-button');\n button.innerText = this.label || this.localizer.translate('wj.file.upload.button');\n button.setAttribute('part', 'upload-button');\n\n label.appendChild(button);\n\n this.button = button;\n }\n\n native.appendChild(fileInput);\n native.appendChild(label);\n native.appendChild(fileList);\n\n fragment.appendChild(native);\n\n this.native = native;\n this.fileList = fileList;\n this.fileInput = fileInput;\n\n return fragment;\n }\n\n /**\n * Method to perform actions after the component is drawn.\n */\n afterDraw() {\n this.button?.addEventListener('click', () => {\n this.fileInput.click();\n });\n\n this.fileInput.addEventListener('change', this.handleInputChange);\n this.native.addEventListener('drop', this.handleDrop);\n\n let dragEventCounter = 0;\n\n this.native.addEventListener('dragenter', (event) => {\n event.preventDefault();\n\n if (dragEventCounter === 0) {\n this.native.classList.add('highlight');\n }\n\n dragEventCounter += 1;\n });\n\n this.native.addEventListener('dragover', (event) => {\n event.preventDefault();\n\n if (dragEventCounter === 0) {\n dragEventCounter = 1;\n }\n });\n\n this.native.addEventListener('dragleave', (event) => {\n event.preventDefault();\n\n dragEventCounter -= 1;\n\n if (dragEventCounter <= 0) {\n dragEventCounter = 0;\n this.native.classList.remove('highlight');\n }\n });\n\n this.native.addEventListener('drop', (event) => {\n event.preventDefault();\n\n dragEventCounter = 0;\n this.native.classList.remove('highlight');\n });\n }\n\n /**\n * Method to handle form submission.\n * @param {Event} event The form submission event.\n */\n handleSubmit(event) {\n event.preventDefault();\n\n // TODO: TU TREBA PRIDAT ZOBRAZENIE SUBORU A JEHO PROCESSU\n\n this.addFilesToQueue(this.fileInput.files);\n }\n\n /**\n * Method to handle file drop event.\n * @param {Event} event The file drop event object.\n */\n handleDrop = (event) => {\n const fileList = event.dataTransfer.files;\n\n this.resetFormState();\n\n this.addFilesToQueue(fileList);\n };\n\n /**\n * Method to handle file input change event.\n * @param {Event} event The file input change event object.\n */\n handleInputChange = (event) => {\n this.resetFormState();\n\n try {\n this.handleSubmit(event);\n } catch (err) {}\n };\n\n /**\n * Method to add files to the queue.\n * @param files\n */\n addFilesToQueue(files) {\n this._queuedFiles = [...files];\n\n this.dispatchEvent(\n new CustomEvent('file-upload:files-added', { detail: files, bubbles: true, composed: true })\n );\n this.onAddedFiles?.();\n\n if (this.autoProcessFiles) {\n this.uploadFiles();\n }\n\n this.fileInput.value = '';\n }\n\n /**\n * Method to upload files.\n */\n uploadFiles() {\n if (this._queuedFiles.length === 0) {\n return;\n }\n\n const uploadPromises = this._queuedFiles.map((file) => this.createUploadPromise(file));\n uploadPromises\n .reduce((prev, curr) => {\n return prev.then(() => {\n return curr;\n });\n }, Promise.resolve())\n .then(() => {\n this.dispatchEvent(\n new CustomEvent('file-upload:all-files-uploaded', {\n detail: this.uploadedFiles,\n bubbles: true,\n composed: true,\n })\n );\n this.onAllFilesUploaded?.();\n this._queuedFiles = [];\n });\n }\n\n /**\n * Method to create an upload promise.\n * @param file\n * @returns {Promise<unknown>}\n */\n createUploadPromise = (file) => {\n return new Promise((resolve, reject) => {\n this.assertFilesValid(file);\n let preview;\n\n let reader = new FileReader();\n reader.onload = (e) => {\n this.dispatchEvent(\n new CustomEvent('file-upload:upload-started', { detail: file, bubbles: true, composed: true })\n );\n this.onUploadStarted?.(file);\n\n preview = this.createPreview(file, reader);\n this.appendChild(preview);\n\n this.uploadFunction(file, preview).then((res) => {\n this.dispatchEvent(\n new CustomEvent('file-upload:upladed-file-complete', {\n detail: res,\n bubbles: true,\n composed: true,\n })\n );\n this.onUploadedFileComplete?.(res);\n this.uploadedFiles.push(res.data);\n\n resolve(res);\n });\n };\n\n reader.readAsDataURL(file);\n });\n };\n\n /**\n * Method to create a preview for the file.\n * @param {File} file The file for which the preview is to be created.\n * @param {FileReader} reader The FileReader instance to read the file.\n * @returns {HTMLElement} The created preview.\n */\n createPreview(file, reader) {\n let preview = document.createElement('wje-file-upload-item');\n preview.setAttribute('slot', 'item');\n preview.setAttribute('name', file.name);\n preview.setAttribute('size', file.size);\n preview.setAttribute('uploaded', '0');\n preview.setAttribute('progress', '0');\n preview.innerHTML = `<wje-icon slot=\"img\" name=\"${getFileTypeIcon(file.type.split('/')[1])}\" size=\"large\"></wje-icon>`;\n\n return preview;\n }\n\n /**\n * Method to create a thumbnail for the file.\n * @param {File} file The file for which the thumbnail is to be created.\n * @param {FileReader} reader The FileReader instance to read the file.\n * @returns {HTMLElement} The created thumbnail.\n */\n createThumbnail(file, reader) {\n let img = document.createElement('img');\n img.setAttribute('src', reader.result);\n\n return img;\n }\n\n /**\n * Method to validate the files.\n * @param {File} file The file to be validated.\n * TODO: alowed types a size limit by malo byt cez attributy\n */\n assertFilesValid(file) {\n const { name: fileName, size: fileSize } = file;\n if (!isValidFileType(file, this.acceptedTypes)) {\n throw new Error(`❌ FILE: \"${fileName}\" Valid file types are: \"${this.acceptedTypes}\"`);\n }\n\n if (fileSize > this.maxFileSize) {\n throw new Error(\n `❌ File \"${fileName}\" could not be uploaded. Only images up to ${this.maxFileSize} MB are allowed. Nie je to ${fileSize}`\n );\n }\n }\n\n /**\n * Method to reset the form state.\n */\n resetFormState() {\n this.fileList.textContent = '';\n }\n}\n","import FileUpload from './file-upload.element.js';\n\nexport default FileUpload;\n\nFileUpload.define('wje-file-upload', FileUpload);\n"],"names":["response","_a"],"mappings":"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"}
|
|
@@ -64,12 +64,12 @@ function whenTransitionEnds(el, cb) {
|
|
|
64
64
|
el.addEventListener(event, onEnd);
|
|
65
65
|
}
|
|
66
66
|
function getTransitionInfo(el) {
|
|
67
|
-
const
|
|
68
|
-
const transitionDelays = (
|
|
69
|
-
const transitionDurations = (
|
|
67
|
+
const styles2 = window.getComputedStyle(el);
|
|
68
|
+
const transitionDelays = (styles2[transitionProp + "Delay"] || "").split(", ");
|
|
69
|
+
const transitionDurations = (styles2[transitionProp + "Duration"] || "").split(", ");
|
|
70
70
|
const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
|
|
71
|
-
const animationDelays = (
|
|
72
|
-
const animationDurations = (
|
|
71
|
+
const animationDelays = (styles2[animationProp + "Delay"] || "").split(", ");
|
|
72
|
+
const animationDurations = (styles2[animationProp + "Duration"] || "").split(", ");
|
|
73
73
|
const animationTimeout = getTimeout(animationDelays, animationDurations);
|
|
74
74
|
const timeout = Math.max(transitionTimeout, animationTimeout);
|
|
75
75
|
const type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;
|
|
@@ -171,6 +171,7 @@ class AnimatedOutlet extends HTMLElement {
|
|
|
171
171
|
});
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
|
+
const styles = "/*\n[ WJ Router Outlet ]\n*/\n\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.5s;\n}\n.fade-enter {\n height: 0;\n overflow: hidden;\n}\n\n.fade-enter,\n.fade-leave-to {\n opacity: 0;\n}\n\n.slide-fade-enter-active {\n transition: all 0.3s ease;\n}\n\n.slide-fade-leave-active {\n transition: all 0.8s cubic-bezier(1, 0.5, 0.8, 1);\n}\n\n.slide-fade-enter,\n.slide-fade-leave-to {\n transform: translateX(100px);\n opacity: 0;\n}\n\n.bounce-enter {\n opacity: 0;\n}\n\n.bounce-enter-active {\n animation: bounce-in 0.5s;\n}\n\n.bounce-leave-active {\n animation: bounce-in 0.5s reverse;\n}\n\n@keyframes bounce-in {\n 0% {\n transform: scale(0);\n }\n 50% {\n transform: scale(1.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n\n";
|
|
174
175
|
setDefaultAnimation(GenericCSS);
|
|
175
176
|
class RouterOutlet extends AnimatedOutlet {
|
|
176
177
|
/**
|
|
@@ -183,6 +184,9 @@ class RouterOutlet extends AnimatedOutlet {
|
|
|
183
184
|
* @type {string}
|
|
184
185
|
*/
|
|
185
186
|
__publicField(this, "className", "RouterOutlet");
|
|
187
|
+
const styleEl = document.createElement("style");
|
|
188
|
+
styleEl.textContent = styles;
|
|
189
|
+
this.parentNode.insertBefore(styleEl, this);
|
|
186
190
|
}
|
|
187
191
|
}
|
|
188
192
|
WJElement.define("wje-router-outlet", RouterOutlet);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wje-router-outlet.js","sources":["../node_modules/slick-router/lib/components/animated-outlet.js","../packages/wje-router-outlet/router-outlet.element.js","../packages/wje-router-outlet/router-outlet.js"],"sourcesContent":["export class AnimationHook {\r\n constructor(options = {}) {\r\n this.options = options\r\n }\r\n\r\n getOption(outlet, name) {\r\n return outlet.hasAttribute(name) ? outlet.getAttribute(name) : this.options[name]\r\n }\r\n\r\n hasOption(outlet, name) {\r\n return outlet.hasAttribute(name) || this.options[name]\r\n }\r\n\r\n runParallel(outlet) {\r\n return this.hasOption(outlet, 'parallel')\r\n }\r\n\r\n beforeEnter(outlet, el) {}\r\n\r\n enter(outlet, el) {}\r\n\r\n leave(outlet, el, done) {\r\n done()\r\n }\r\n}\r\n\r\n// code extracted from vue\r\nconst raf = window.requestAnimationFrame\r\nconst TRANSITION = 'transition'\r\nconst ANIMATION = 'animation'\r\n\r\n// Transition property/event sniffing\r\nconst transitionProp = 'transition'\r\nconst transitionEndEvent = 'transitionend'\r\nconst animationProp = 'animation'\r\nconst animationEndEvent = 'animationend'\r\n\r\nfunction nextFrame(fn) {\r\n raf(function () {\r\n raf(fn)\r\n })\r\n}\r\n\r\nfunction whenTransitionEnds(el, cb) {\r\n const ref = getTransitionInfo(el)\r\n const type = ref.type\r\n const timeout = ref.timeout\r\n const propCount = ref.propCount\r\n if (!type) {\r\n return cb()\r\n }\r\n const event = type === TRANSITION ? transitionEndEvent : animationEndEvent\r\n let ended = 0\r\n const end = function () {\r\n el.removeEventListener(event, onEnd)\r\n cb()\r\n }\r\n const onEnd = function (e) {\r\n if (e.target === el) {\r\n if (++ended >= propCount) {\r\n end()\r\n }\r\n }\r\n }\r\n setTimeout(function () {\r\n if (ended < propCount) {\r\n end()\r\n }\r\n }, timeout + 1)\r\n el.addEventListener(event, onEnd)\r\n}\r\n\r\nfunction getTransitionInfo(el) {\r\n const styles = window.getComputedStyle(el)\r\n // JSDOM may return undefined for transition properties\r\n const transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ')\r\n const transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ')\r\n const transitionTimeout = getTimeout(transitionDelays, transitionDurations)\r\n const animationDelays = (styles[animationProp + 'Delay'] || '').split(', ')\r\n const animationDurations = (styles[animationProp + 'Duration'] || '').split(', ')\r\n const animationTimeout = getTimeout(animationDelays, animationDurations)\r\n\r\n const timeout = Math.max(transitionTimeout, animationTimeout)\r\n const type = timeout > 0 ? (transitionTimeout > animationTimeout ? TRANSITION : ANIMATION) : null\r\n const propCount = type\r\n ? type === TRANSITION\r\n ? transitionDurations.length\r\n : animationDurations.length\r\n : 0\r\n\r\n return {\r\n type,\r\n timeout,\r\n propCount,\r\n }\r\n}\r\n\r\nfunction getTimeout(delays, durations) {\r\n /* istanbul ignore next */\r\n while (delays.length < durations.length) {\r\n delays = delays.concat(delays)\r\n }\r\n\r\n return Math.max.apply(\r\n null,\r\n durations.map(function (d, i) {\r\n return toMs(d) + toMs(delays[i])\r\n }),\r\n )\r\n}\r\n\r\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\r\n// in a locale-dependent way, using a comma instead of a dot.\r\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\r\n// as a floor function) causing unexpected behaviors\r\nfunction toMs(s) {\r\n return Number(s.slice(0, -1).replace(',', '.')) * 1000\r\n}\r\n\r\nfunction runTransition(el, name, type, cb) {\r\n el.classList.add(`${name}-${type}-active`)\r\n nextFrame(function () {\r\n el.classList.remove(`${name}-${type}`)\r\n el.classList.add(`${name}-${type}-to`)\r\n whenTransitionEnds(el, function () {\r\n el.classList.remove(`${name}-${type}-active`, `${name}-${type}-to`)\r\n if (cb) cb()\r\n })\r\n })\r\n}\r\n\r\nexport class GenericCSS extends AnimationHook {\r\n beforeEnter(outlet, el) {\r\n const name = outlet.getAttribute('animation') || 'outlet'\r\n el.classList.add(`${name}-enter`)\r\n }\r\n\r\n enter(outlet, el) {\r\n const name = outlet.getAttribute('animation') || 'outlet'\r\n runTransition(el, name, 'enter')\r\n }\r\n\r\n leave(outlet, el, done) {\r\n const name = outlet.getAttribute('animation') || 'outlet'\r\n el.classList.add(`${name}-leave`)\r\n runTransition(el, name, 'leave', done)\r\n }\r\n}\r\n\r\nexport class AnimateCSS extends AnimationHook {\r\n beforeEnter(outlet, el) {\r\n const enter = this.getOption(outlet, 'enter')\r\n if (enter) {\r\n el.style.display = 'none'\r\n }\r\n }\r\n\r\n enter(outlet, el) {\r\n const enter = this.getOption(outlet, 'enter')\r\n if (!enter) return\r\n el.style.display = 'block'\r\n el.classList.add('animated', enter)\r\n el.addEventListener(\r\n 'animationend',\r\n () => {\r\n el.classList.remove('animated', enter)\r\n },\r\n { once: true },\r\n )\r\n }\r\n\r\n leave(outlet, el, done) {\r\n const leave = this.getOption(outlet, 'leave')\r\n if (!leave) {\r\n done()\r\n return\r\n }\r\n el.classList.add('animated', leave)\r\n el.addEventListener('animationend', done, { once: true })\r\n }\r\n}\r\n\r\nconst animationRegistry = {}\r\nlet defaultHook\r\n\r\nexport function registerAnimation(name, AnimationHookClass, options = {}) {\r\n animationRegistry[name] = new AnimationHookClass(options)\r\n}\r\n\r\nexport function setDefaultAnimation(AnimationHookClass, options = {}) {\r\n defaultHook = new AnimationHookClass(options)\r\n}\r\n\r\nfunction getAnimationHook(name) {\r\n return animationRegistry[name] || defaultHook || (defaultHook = new GenericCSS())\r\n}\r\n\r\nexport class AnimatedOutlet extends HTMLElement {\r\n appendChild(el) {\r\n if (!this.hasAttribute('animation')) {\r\n super.appendChild(el)\r\n return\r\n }\r\n const hook = getAnimationHook(this.getAttribute('animation'))\r\n const runParallel = hook.runParallel(this)\r\n\r\n hook.beforeEnter(this, el)\r\n super.appendChild(el)\r\n if (!runParallel && this.removing) {\r\n // when removing a previous el, append animation is run after remove one\r\n this.appending = el\r\n } else {\r\n hook.enter(this, el)\r\n }\r\n }\r\n\r\n removeChild(el) {\r\n if (!this.hasAttribute('animation')) {\r\n super.removeChild(el)\r\n return\r\n }\r\n const hook = getAnimationHook(this.getAttribute('animation'))\r\n\r\n if (this.removing && this.removing.parentNode === this) {\r\n super.removeChild(this.removing)\r\n }\r\n\r\n if (el === this.appending) {\r\n if (el.parentNode === this) {\r\n super.removeChild(el)\r\n }\r\n this.removing = null\r\n return\r\n }\r\n\r\n this.removing = el\r\n hook.leave(this, el, () => {\r\n if (this.removing && this.removing.parentNode === this) {\r\n super.removeChild(this.removing)\r\n }\r\n if (this.appending) hook.enter(this, this.appending)\r\n this.appending = null\r\n this.removing = null\r\n })\r\n }\r\n}\r\n","import { AnimatedOutlet, GenericCSS, setDefaultAnimation } from 'slick-router/components/animated-outlet.js';\n\nsetDefaultAnimation(GenericCSS);\n\n/**\n * `Route` is a custom web component that represents a route in a routing system.\n * @summary This element represents a route in a routing system.\n * @documentation https://elements.webjet.sk/components/route\n * @status stable\n * @augments AnimatedOutlet\n * @tag wje-router-outlet\n */\nexport default class RouterOutlet extends AnimatedOutlet {\n /**\n * Creates an instance of Route.\n */\n constructor() {\n super();\n }\n\n /**\n * The class name for the component.\n * @type {string}\n */\n className = 'RouterOutlet';\n}\n","import { default as WJElement } from '../wje-element/element.js';\nimport RouterOutlet from './router-outlet.element.js';\n\nexport default RouterOutlet;\n\nWJElement.define('wje-router-outlet', RouterOutlet);\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"wje-router-outlet.js","sources":["../node_modules/slick-router/lib/components/animated-outlet.js","../packages/wje-router-outlet/router-outlet.element.js","../packages/wje-router-outlet/router-outlet.js"],"sourcesContent":["export class AnimationHook {\r\n constructor(options = {}) {\r\n this.options = options\r\n }\r\n\r\n getOption(outlet, name) {\r\n return outlet.hasAttribute(name) ? outlet.getAttribute(name) : this.options[name]\r\n }\r\n\r\n hasOption(outlet, name) {\r\n return outlet.hasAttribute(name) || this.options[name]\r\n }\r\n\r\n runParallel(outlet) {\r\n return this.hasOption(outlet, 'parallel')\r\n }\r\n\r\n beforeEnter(outlet, el) {}\r\n\r\n enter(outlet, el) {}\r\n\r\n leave(outlet, el, done) {\r\n done()\r\n }\r\n}\r\n\r\n// code extracted from vue\r\nconst raf = window.requestAnimationFrame\r\nconst TRANSITION = 'transition'\r\nconst ANIMATION = 'animation'\r\n\r\n// Transition property/event sniffing\r\nconst transitionProp = 'transition'\r\nconst transitionEndEvent = 'transitionend'\r\nconst animationProp = 'animation'\r\nconst animationEndEvent = 'animationend'\r\n\r\nfunction nextFrame(fn) {\r\n raf(function () {\r\n raf(fn)\r\n })\r\n}\r\n\r\nfunction whenTransitionEnds(el, cb) {\r\n const ref = getTransitionInfo(el)\r\n const type = ref.type\r\n const timeout = ref.timeout\r\n const propCount = ref.propCount\r\n if (!type) {\r\n return cb()\r\n }\r\n const event = type === TRANSITION ? transitionEndEvent : animationEndEvent\r\n let ended = 0\r\n const end = function () {\r\n el.removeEventListener(event, onEnd)\r\n cb()\r\n }\r\n const onEnd = function (e) {\r\n if (e.target === el) {\r\n if (++ended >= propCount) {\r\n end()\r\n }\r\n }\r\n }\r\n setTimeout(function () {\r\n if (ended < propCount) {\r\n end()\r\n }\r\n }, timeout + 1)\r\n el.addEventListener(event, onEnd)\r\n}\r\n\r\nfunction getTransitionInfo(el) {\r\n const styles = window.getComputedStyle(el)\r\n // JSDOM may return undefined for transition properties\r\n const transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ')\r\n const transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ')\r\n const transitionTimeout = getTimeout(transitionDelays, transitionDurations)\r\n const animationDelays = (styles[animationProp + 'Delay'] || '').split(', ')\r\n const animationDurations = (styles[animationProp + 'Duration'] || '').split(', ')\r\n const animationTimeout = getTimeout(animationDelays, animationDurations)\r\n\r\n const timeout = Math.max(transitionTimeout, animationTimeout)\r\n const type = timeout > 0 ? (transitionTimeout > animationTimeout ? TRANSITION : ANIMATION) : null\r\n const propCount = type\r\n ? type === TRANSITION\r\n ? transitionDurations.length\r\n : animationDurations.length\r\n : 0\r\n\r\n return {\r\n type,\r\n timeout,\r\n propCount,\r\n }\r\n}\r\n\r\nfunction getTimeout(delays, durations) {\r\n /* istanbul ignore next */\r\n while (delays.length < durations.length) {\r\n delays = delays.concat(delays)\r\n }\r\n\r\n return Math.max.apply(\r\n null,\r\n durations.map(function (d, i) {\r\n return toMs(d) + toMs(delays[i])\r\n }),\r\n )\r\n}\r\n\r\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\r\n// in a locale-dependent way, using a comma instead of a dot.\r\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\r\n// as a floor function) causing unexpected behaviors\r\nfunction toMs(s) {\r\n return Number(s.slice(0, -1).replace(',', '.')) * 1000\r\n}\r\n\r\nfunction runTransition(el, name, type, cb) {\r\n el.classList.add(`${name}-${type}-active`)\r\n nextFrame(function () {\r\n el.classList.remove(`${name}-${type}`)\r\n el.classList.add(`${name}-${type}-to`)\r\n whenTransitionEnds(el, function () {\r\n el.classList.remove(`${name}-${type}-active`, `${name}-${type}-to`)\r\n if (cb) cb()\r\n })\r\n })\r\n}\r\n\r\nexport class GenericCSS extends AnimationHook {\r\n beforeEnter(outlet, el) {\r\n const name = outlet.getAttribute('animation') || 'outlet'\r\n el.classList.add(`${name}-enter`)\r\n }\r\n\r\n enter(outlet, el) {\r\n const name = outlet.getAttribute('animation') || 'outlet'\r\n runTransition(el, name, 'enter')\r\n }\r\n\r\n leave(outlet, el, done) {\r\n const name = outlet.getAttribute('animation') || 'outlet'\r\n el.classList.add(`${name}-leave`)\r\n runTransition(el, name, 'leave', done)\r\n }\r\n}\r\n\r\nexport class AnimateCSS extends AnimationHook {\r\n beforeEnter(outlet, el) {\r\n const enter = this.getOption(outlet, 'enter')\r\n if (enter) {\r\n el.style.display = 'none'\r\n }\r\n }\r\n\r\n enter(outlet, el) {\r\n const enter = this.getOption(outlet, 'enter')\r\n if (!enter) return\r\n el.style.display = 'block'\r\n el.classList.add('animated', enter)\r\n el.addEventListener(\r\n 'animationend',\r\n () => {\r\n el.classList.remove('animated', enter)\r\n },\r\n { once: true },\r\n )\r\n }\r\n\r\n leave(outlet, el, done) {\r\n const leave = this.getOption(outlet, 'leave')\r\n if (!leave) {\r\n done()\r\n return\r\n }\r\n el.classList.add('animated', leave)\r\n el.addEventListener('animationend', done, { once: true })\r\n }\r\n}\r\n\r\nconst animationRegistry = {}\r\nlet defaultHook\r\n\r\nexport function registerAnimation(name, AnimationHookClass, options = {}) {\r\n animationRegistry[name] = new AnimationHookClass(options)\r\n}\r\n\r\nexport function setDefaultAnimation(AnimationHookClass, options = {}) {\r\n defaultHook = new AnimationHookClass(options)\r\n}\r\n\r\nfunction getAnimationHook(name) {\r\n return animationRegistry[name] || defaultHook || (defaultHook = new GenericCSS())\r\n}\r\n\r\nexport class AnimatedOutlet extends HTMLElement {\r\n appendChild(el) {\r\n if (!this.hasAttribute('animation')) {\r\n super.appendChild(el)\r\n return\r\n }\r\n const hook = getAnimationHook(this.getAttribute('animation'))\r\n const runParallel = hook.runParallel(this)\r\n\r\n hook.beforeEnter(this, el)\r\n super.appendChild(el)\r\n if (!runParallel && this.removing) {\r\n // when removing a previous el, append animation is run after remove one\r\n this.appending = el\r\n } else {\r\n hook.enter(this, el)\r\n }\r\n }\r\n\r\n removeChild(el) {\r\n if (!this.hasAttribute('animation')) {\r\n super.removeChild(el)\r\n return\r\n }\r\n const hook = getAnimationHook(this.getAttribute('animation'))\r\n\r\n if (this.removing && this.removing.parentNode === this) {\r\n super.removeChild(this.removing)\r\n }\r\n\r\n if (el === this.appending) {\r\n if (el.parentNode === this) {\r\n super.removeChild(el)\r\n }\r\n this.removing = null\r\n return\r\n }\r\n\r\n this.removing = el\r\n hook.leave(this, el, () => {\r\n if (this.removing && this.removing.parentNode === this) {\r\n super.removeChild(this.removing)\r\n }\r\n if (this.appending) hook.enter(this, this.appending)\r\n this.appending = null\r\n this.removing = null\r\n })\r\n }\r\n}\r\n","import { AnimatedOutlet, GenericCSS, setDefaultAnimation } from 'slick-router/components/animated-outlet.js';\n\nimport styles from './styles/styles.css?inline';\n\nsetDefaultAnimation(GenericCSS);\n\n/**\n * `Route` is a custom web component that represents a route in a routing system.\n * @summary This element represents a route in a routing system.\n * @documentation https://elements.webjet.sk/components/route\n * @status stable\n * @augments AnimatedOutlet\n * @tag wje-router-outlet\n */\nexport default class RouterOutlet extends AnimatedOutlet {\n /**\n * Creates an instance of Route.\n */\n constructor() {\n super();\n\n const styleEl = document.createElement('style');\n styleEl.textContent = styles;\n this.parentNode.insertBefore(styleEl, this);\n }\n\n /**\n * The class name for the component.\n * @type {string}\n */\n className = 'RouterOutlet';\n}\n","import { default as WJElement } from '../wje-element/element.js';\nimport RouterOutlet from './router-outlet.element.js';\n\nexport default RouterOutlet;\n\nWJElement.define('wje-router-outlet', RouterOutlet);\n"],"names":["styles"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/wje-routerx.js
CHANGED
|
@@ -1374,7 +1374,7 @@ class Routerx extends WJElement {
|
|
|
1374
1374
|
const rootElement = htmlDocument.querySelector("wje-router");
|
|
1375
1375
|
const routes = this.parseElement(rootElement).root;
|
|
1376
1376
|
this.router = new Router2({
|
|
1377
|
-
outlet: this.outlet,
|
|
1377
|
+
outlet: this.outlet || "wje-router-outlet",
|
|
1378
1378
|
log: false,
|
|
1379
1379
|
logError: true,
|
|
1380
1380
|
root: this.root || "/",
|
package/dist/wje-routerx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wje-routerx.js","sources":["../node_modules/slick-router/lib/utils.js","../node_modules/slick-router/lib/invariant.js","../node_modules/slick-router/lib/function-dsl.js","../node_modules/slick-router/lib/array-dsl.js","../node_modules/slick-router/lib/path.js","../node_modules/slick-router/lib/events.js","../node_modules/slick-router/lib/locations/location-bar.js","../node_modules/slick-router/lib/locations/browser.js","../node_modules/slick-router/lib/locations/memory.js","../node_modules/slick-router/lib/constants.js","../node_modules/slick-router/lib/transition.js","../node_modules/slick-router/lib/links.js","../node_modules/slick-router/lib/logger.js","../node_modules/slick-router/lib/qs.js","../node_modules/regexparam/dist/index.mjs","../node_modules/slick-router/lib/patternCompiler.js","../node_modules/slick-router/lib/router.js","../node_modules/slick-router/lib/middlewares/wc.js","../node_modules/slick-router/lib/wc-router.js","../node_modules/slick-router/lib/middlewares/events.js","../packages/wje-router/router.element.js","../packages/wje-router/router.js"],"sourcesContent":["const assoc = (obj, attr, val) => {\r\n obj[attr] = val\r\n return obj\r\n}\r\nconst isArray = Array.isArray\r\n\r\nexport const keys = Object.keys\r\n\r\nexport const clone = (obj) => (obj ? (isArray(obj) ? obj.slice(0) : extend({}, obj)) : obj)\r\n\r\nexport const pick = (obj, attrs) =>\r\n attrs.reduce((acc, attr) => (obj[attr] === undefined ? acc : assoc(acc, attr, obj[attr])), {})\r\n\r\nexport const isEqual = (obj1, obj2) => {\r\n const keys1 = keys(obj1)\r\n return keys1.length === keys(obj2).length && keys1.every((key) => obj2[key] === obj1[key])\r\n}\r\n\r\nexport const extend = Object.assign\r\n","export default function invariant(condition, format, ...args) {\r\n if (!condition) {\r\n let argIndex = 0\r\n throw new Error('Invariant Violation: ' + format.replace(/%s/g, () => args[argIndex++]))\r\n }\r\n}\r\n","import invariant from './invariant.js'\r\n\r\n/**\r\n * @typedef {import(\"./router.js\").Route} Route\r\n */\r\n\r\n/**\r\n * @callback registerRoute\r\n * @param {string} name\r\n * @param {Object} options\r\n * @param {routeCallback} childrenCallback\r\n */\r\n\r\n/**\r\n * @callback routeCallback\r\n * @param {registerRoute} route\r\n */\r\n\r\n/**\r\n * @export\r\n * @param {routeCallback} callback\r\n * @return {Route[]}\r\n */\r\nexport default function functionDsl(callback) {\r\n let ancestors = []\r\n const matches = {}\r\n const names = {}\r\n\r\n callback(function route(name, options, childrenCallback) {\r\n let routes\r\n\r\n invariant(\r\n !names[name],\r\n 'Route names must be unique, but route \"%s\" is declared multiple times',\r\n name,\r\n )\r\n\r\n names[name] = true\r\n\r\n if (arguments.length === 1) {\r\n options = {}\r\n }\r\n\r\n if (arguments.length === 2 && typeof options === 'function') {\r\n childrenCallback = options\r\n options = {}\r\n }\r\n\r\n if (typeof options.path !== 'string') {\r\n const parts = name.split('.')\r\n options.path = parts[parts.length - 1]\r\n }\r\n\r\n // go to the next level\r\n if (childrenCallback) {\r\n ancestors = ancestors.concat(name)\r\n childrenCallback()\r\n routes = pop()\r\n ancestors.splice(-1)\r\n }\r\n\r\n // add the node to the tree\r\n push({\r\n name,\r\n path: options.path,\r\n routes: routes || [],\r\n options,\r\n })\r\n })\r\n\r\n function pop() {\r\n return matches[currentLevel()] || []\r\n }\r\n\r\n function push(route) {\r\n const level = currentLevel()\r\n matches[level] = matches[level] || []\r\n matches[level].push(route)\r\n }\r\n\r\n function currentLevel() {\r\n return ancestors.join('.')\r\n }\r\n\r\n return pop()\r\n}\r\n","/**\r\n * @typedef {import(\"./router.js\").Route} Route\r\n */\r\n\r\n/**\r\n * @typedef RouteDef\r\n * @property {string} name\r\n * @property {string} path\r\n * @property {RouteDef[]} children\r\n */\r\n\r\n/**\r\n * @export\r\n * @param {RouteDef[]} routes\r\n * @return {Route[]}\r\n */\r\nexport default function arrayDsl(routes) {\r\n const result = []\r\n\r\n routes.forEach(({ name, children, ...options }) => {\r\n if (typeof options.path !== 'string') {\r\n const parts = name.split('.')\r\n options.path = parts[parts.length - 1]\r\n }\r\n result.push({\r\n name,\r\n path: options.path,\r\n options,\r\n routes: children ? arrayDsl(children) : [],\r\n })\r\n })\r\n\r\n return result\r\n}\r\n","import invariant from './invariant.js'\r\n\r\nconst paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?+*]?)/g\r\nconst specialParamChars = /[+*?]$/g\r\nconst queryMatcher = /\\?(.+)/\r\n\r\nconst _compiledPatterns = {}\r\n\r\nfunction compilePattern(pattern, compiler) {\r\n if (!(pattern in _compiledPatterns)) {\r\n _compiledPatterns[pattern] = compiler(pattern)\r\n }\r\n\r\n return _compiledPatterns[pattern]\r\n}\r\n\r\nexport function clearPatternCompilerCache() {\r\n for (const x in _compiledPatterns) {\r\n delete _compiledPatterns[x]\r\n }\r\n}\r\n\r\n/**\r\n * Returns an array of the names of all parameters in the given pattern.\r\n */\r\nexport function extractParamNames(pattern, compiler) {\r\n return compilePattern(pattern, compiler).paramNames\r\n}\r\n\r\n/**\r\n * Extracts the portions of the given URL path that match the given pattern\r\n * and returns an object of param name => value pairs. Returns null if the\r\n * pattern does not match the given path.\r\n */\r\nexport function extractParams(pattern, path, compiler) {\r\n const cp = compilePattern(pattern, compiler)\r\n const matcher = cp.matcher\r\n const paramNames = cp.paramNames\r\n const match = path.match(matcher)\r\n\r\n if (!match) {\r\n return null\r\n }\r\n\r\n const params = {}\r\n\r\n paramNames.forEach(function (paramName, index) {\r\n params[paramName] = match[index + 1] && decodeURIComponent(match[index + 1])\r\n })\r\n\r\n return params\r\n}\r\n\r\n/**\r\n * Returns a version of the given route path with params interpolated. Throws\r\n * if there is a dynamic segment of the route path for which there is no param.\r\n */\r\nexport function injectParams(pattern, params) {\r\n params = params || {}\r\n\r\n return pattern.replace(paramInjectMatcher, function (match, param) {\r\n const paramName = param.replace(specialParamChars, '')\r\n const lastChar = param.slice(-1)\r\n\r\n // If param is optional don't check for existence\r\n if (lastChar === '?' || lastChar === '*') {\r\n if (params[paramName] == null) {\r\n return ''\r\n }\r\n } else {\r\n invariant(\r\n params[paramName] != null,\r\n \"Missing '%s' parameter for path '%s'\",\r\n paramName,\r\n pattern,\r\n )\r\n }\r\n\r\n let paramValue = encodeURIComponent(params[paramName])\r\n if (lastChar === '*' || lastChar === '+') {\r\n // restore / for splats\r\n paramValue = paramValue.replace('%2F', '/')\r\n }\r\n return paramValue\r\n })\r\n}\r\n\r\n/**\r\n * Returns an object that is the result of parsing any query string contained\r\n * in the given path, null if the path contains no query string.\r\n */\r\nexport function extractQuery(qs, path) {\r\n const match = path.match(queryMatcher)\r\n return match && qs.parse(match[1])\r\n}\r\n\r\n/**\r\n * Returns a version of the given path with the parameters in the given\r\n * query merged into the query string.\r\n */\r\nexport function withQuery(qs, path, query) {\r\n const queryString = qs.stringify(query, { indices: false })\r\n\r\n if (queryString) {\r\n return withoutQuery(path) + '?' + queryString\r\n }\r\n\r\n return path\r\n}\r\n\r\n/**\r\n * Returns a version of the given path without the query string.\r\n */\r\nexport function withoutQuery(path) {\r\n return path.replace(queryMatcher, '')\r\n}\r\n","/**\r\n * Bind `el` event `type` to `fn`.\r\n *\r\n * @param {Element} el\r\n * @param {String} type\r\n * @param {Function} fn\r\n * @return {Function}\r\n * @api public\r\n */\r\n\r\nexport function bindEvent(el, type, fn) {\r\n el.addEventListener(type, fn)\r\n return fn\r\n}\r\n\r\n/**\r\n * Unbind `el` event `type`'s callback `fn`.\r\n *\r\n * @param {Element} el\r\n * @param {String} type\r\n * @param {Function} fn\r\n * @return {Function}\r\n * @api public\r\n */\r\n\r\nexport function unbindEvent(el, type, fn) {\r\n el.removeEventListener(type, fn)\r\n return fn\r\n}\r\n","/* eslint-disable */\r\n// LocationBar module extracted from Backbone.js 1.1.0\r\n//\r\n// the dependency on backbone, underscore and jquery have been removed to turn\r\n// this into a small standalone library for handling browser's history API\r\n// cross browser and with a fallback to hashchange events or polling.\r\n\r\nimport {extend} from '../utils.js'\r\nimport {bindEvent, unbindEvent} from '../events.js'\r\n\r\n// this is mostly original code with minor modifications\r\n// to avoid dependency on 3rd party libraries\r\n//\r\n// Backbone.History\r\n// ----------------\r\n\r\n// Handles cross-browser history management, based on either\r\n// [pushState](http://diveintohtml5.info/history.html) and real URLs, or\r\n// [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\r\n// and URL fragments.\r\nclass History {\r\n constructor() {\r\n this.handlers = [];\r\n this.checkUrl = this.checkUrl.bind(this);\r\n this.location = window.location;\r\n this.history = window.history;\r\n }\r\n\r\n // Set up all inheritable **Backbone.History** properties and methods.\r\n // Are we at the app root?\r\n atRoot() {\r\n return this.location.pathname.replace(/[^\\/]$/, '$&/') === this.root;\r\n }\r\n\r\n // Gets the true hash value. Cannot use location.hash directly due to bug\r\n // in Firefox where location.hash will always be decoded.\r\n getHash() {\r\n const match = this.location.href.match(/#(.*)$/);\r\n return match ? match[1] : '';\r\n }\r\n\r\n // Get the cross-browser normalized URL fragment, either from the URL,\r\n // the hash, or the override.\r\n getFragment(fragment, forcePushState) {\r\n if (fragment == null) {\r\n if (this._hasPushState || !this._wantsHashChange || forcePushState) {\r\n fragment = decodeURI(this.location.pathname + this.location.search);\r\n const root = this.root.replace(trailingSlash, '');\r\n if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);\r\n } else {\r\n fragment = this.getHash();\r\n }\r\n }\r\n return fragment.replace(routeStripper, '');\r\n }\r\n\r\n // Start the hash change handling, returning `true` if the current URL matches\r\n // an existing route, and `false` otherwise.\r\n start(options = {}) {\r\n // MODIFICATION OF ORIGINAL BACKBONE.HISTORY\r\n // if (History.started) throw new Error(\"LocationBar has already been started\");\r\n // History.started = true;\r\n this.started = true;\r\n\r\n // Figure out the initial configuration.\r\n // Is pushState desired ... is it available?\r\n this.options = extend({root: '/'}, options);\r\n this.location = this.options.location || this.location;\r\n this.history = this.options.history || this.history;\r\n this.root = this.options.root;\r\n this._wantsHashChange = this.options.hashChange !== false;\r\n this._wantsPushState = !!this.options.pushState;\r\n this._hasPushState = this._wantsPushState;\r\n const fragment = this.getFragment();\r\n\r\n // Normalize root to always include a leading and trailing slash.\r\n this.root = (`/${this.root}/`).replace(rootStripper, '/');\r\n\r\n // Depending on whether we're using pushState or hashes, and whether\r\n // 'onhashchange' is supported, determine how we check the URL state.\r\n bindEvent(window, this._hasPushState ? 'popstate' : 'hashchange', this.checkUrl);\r\n\r\n // Determine if we need to change the base url, for a pushState link\r\n // opened by a non-pushState browser.\r\n this.fragment = fragment;\r\n const loc = this.location;\r\n\r\n // Transition from hashChange to pushState or vice versa if both are\r\n // requested.\r\n if (this._wantsHashChange && this._wantsPushState) {\r\n\r\n // If we've started off with a route from a `pushState`-enabled\r\n // browser, but we're currently in a browser that doesn't support it...\r\n if (!this._hasPushState && !this.atRoot()) {\r\n this.fragment = this.getFragment(null, true);\r\n this.location.replace(`${this.root}#${this.fragment}`);\r\n // Return immediately as browser will do redirect to new url\r\n return true;\r\n\r\n // Or if we've started out with a hash-based route, but we're currently\r\n // in a browser where it could be `pushState`-based instead...\r\n } else if (this._hasPushState && this.atRoot() && loc.hash) {\r\n this.fragment = this.getHash().replace(routeStripper, '');\r\n this.history.replaceState({}, document.title, this.root + this.fragment);\r\n }\r\n\r\n }\r\n\r\n if (!this.options.silent) return this.loadUrl();\r\n }\r\n\r\n // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\r\n // but possibly useful for unit testing Routers.\r\n stop() {\r\n unbindEvent(window, this._hasPushState ? 'popstate' : 'hashchange', this.checkUrl);\r\n this.started = false;\r\n }\r\n\r\n // Add a route to be tested when the fragment changes. Routes added later\r\n // may override previous routes.\r\n route(route, callback) {\r\n this.handlers.unshift({route, callback});\r\n }\r\n\r\n // Checks the current URL to see if it has changed, and if it has,\r\n // calls `loadUrl`.\r\n checkUrl() {\r\n const current = this.getFragment();\r\n if (current === this.fragment) return false;\r\n this.loadUrl();\r\n }\r\n\r\n // Attempt to load the current URL fragment. If a route succeeds with a\r\n // match, returns `true`. If no defined routes matches the fragment,\r\n // returns `false`.\r\n loadUrl(fragment) {\r\n fragment = this.fragment = this.getFragment(fragment);\r\n return this.handlers.some(handler => {\r\n if (handler.route.test(fragment)) {\r\n handler.callback(fragment);\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n // Save a fragment into the hash history, or replace the URL state if the\r\n // 'replace' option is passed. You are responsible for properly URL-encoding\r\n // the fragment in advance.\r\n //\r\n // The options object can contain `trigger: true` if you wish to have the\r\n // route callback be fired (not usually desirable), or `replace: true`, if\r\n // you wish to modify the current URL without adding an entry to the history.\r\n update(fragment, options) {\r\n if (!this.started) return false;\r\n if (!options || options === true) options = {trigger: !!options};\r\n\r\n let url = this.root + (fragment = this.getFragment(fragment || ''));\r\n\r\n // Strip the hash for matching.\r\n fragment = fragment.replace(pathStripper, '');\r\n\r\n if (this.fragment === fragment) return;\r\n this.fragment = fragment;\r\n\r\n // Don't include a trailing slash on the root.\r\n if (fragment === '' && url !== '/') url = url.slice(0, -1);\r\n\r\n // If pushState is available, we use it to set the fragment as a real URL.\r\n if (this._hasPushState) {\r\n this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\r\n\r\n // If hash changes haven't been explicitly disabled, update the hash\r\n // fragment to store history.\r\n } else if (this._wantsHashChange) {\r\n this._updateHash(this.location, fragment, options.replace);\r\n // If you've told us that you explicitly don't want fallback hashchange-\r\n // based history, then `update` becomes a page refresh.\r\n } else {\r\n return this.location.assign(url);\r\n }\r\n if (options.trigger) return this.loadUrl(fragment);\r\n }\r\n\r\n // Update the hash location, either replacing the current entry, or adding\r\n // a new one to the browser history.\r\n _updateHash(location, fragment, replace) {\r\n if (replace) {\r\n const href = location.href.replace(/(javascript:|#).*$/, '');\r\n location.replace(`${href}#${fragment}`);\r\n } else {\r\n // Some browsers require that `hash` contains a leading #.\r\n location.hash = `#${fragment}`;\r\n }\r\n }\r\n\r\n // add some features to History\r\n\r\n // a generic callback for any changes\r\n onChange(callback) {\r\n this.route(/^(.*?)$/, callback);\r\n }\r\n\r\n // checks if the browser has pushstate support\r\n hasPushState() {\r\n // MODIFICATION OF ORIGINAL BACKBONE.HISTORY\r\n if (!this.started) {\r\n throw new Error(\"only available after LocationBar.start()\");\r\n }\r\n return this._hasPushState;\r\n }\r\n}\r\n\r\n// Cached regex for stripping a leading hash/slash and trailing space.\r\nconst routeStripper = /^[#\\/]|\\s+$/g;\r\n\r\n// Cached regex for stripping leading and trailing slashes.\r\nconst rootStripper = /^\\/+|\\/+$/g;\r\n\r\n// Cached regex for removing a trailing slash.\r\nconst trailingSlash = /\\/$/;\r\n\r\n// Cached regex for stripping urls of hash.\r\nconst pathStripper = /#.*$/;\r\n\r\n\r\n// export\r\nexport default History;\r\n","import { extend } from '../utils.js'\r\nimport LocationBar from './location-bar.js'\r\n\r\nclass BrowserLocation {\r\n constructor(options = {}) {\r\n this.path = options.path || ''\r\n\r\n this.options = extend(\r\n {\r\n pushState: false,\r\n root: '/',\r\n },\r\n options,\r\n )\r\n\r\n // we're using the location-bar module for actual\r\n // URL management\r\n this.locationBar = new LocationBar()\r\n this.locationBar.onChange((path) => {\r\n this.handleURL(`/${path || ''}`)\r\n })\r\n\r\n this.locationBar.start(options)\r\n }\r\n\r\n /**\r\n * Get the current URL\r\n */\r\n\r\n getURL() {\r\n return this.path\r\n }\r\n\r\n /**\r\n * Set the current URL without triggering any events\r\n * back to the router. Add a new entry in browser's history.\r\n */\r\n\r\n setURL(path, options = {}) {\r\n if (this.path !== path) {\r\n this.path = path\r\n this.locationBar.update(path, extend({ trigger: true }, options))\r\n }\r\n }\r\n\r\n /**\r\n * Set the current URL without triggering any events\r\n * back to the router. Replace the latest entry in broser's history.\r\n */\r\n\r\n replaceURL(path, options = {}) {\r\n if (this.path !== path) {\r\n this.path = path\r\n this.locationBar.update(path, extend({ trigger: true, replace: true }, options))\r\n }\r\n }\r\n\r\n /**\r\n * Setup a URL change handler\r\n * @param {Function} callback\r\n */\r\n onChange(callback) {\r\n this.changeCallback = callback\r\n }\r\n\r\n /**\r\n * Given a path, generate a URL appending root\r\n * if pushState is used and # if hash state is used\r\n */\r\n formatURL(path) {\r\n if (this.locationBar.hasPushState()) {\r\n let rootURL = this.options.root\r\n if (path !== '') {\r\n rootURL = rootURL.replace(/\\/$/, '')\r\n }\r\n return rootURL + path\r\n } else {\r\n if (path[0] === '/') {\r\n path = path.substr(1)\r\n }\r\n return `#${path}`\r\n }\r\n }\r\n\r\n /**\r\n * When we use pushState with a custom root option,\r\n * we need to take care of removingRoot at certain points.\r\n * Specifically\r\n * - browserLocation.update() can be called with the full URL by router\r\n * - LocationBar expects all .update() calls to be called without root\r\n * - this method is public so that we could dispatch URLs without root in router\r\n */\r\n removeRoot(url) {\r\n if (this.options.pushState && this.options.root && this.options.root !== '/') {\r\n return url.replace(this.options.root, '')\r\n } else {\r\n return url\r\n }\r\n }\r\n\r\n /**\r\n * Stop listening to URL changes and link clicks\r\n */\r\n destroy() {\r\n this.locationBar.stop()\r\n }\r\n\r\n /**\r\n initially, the changeCallback won't be defined yet, but that's good\r\n because we dont' want to kick off routing right away, the router\r\n does that later by manually calling this handleURL method with the\r\n url it reads of the location. But it's important this is called\r\n first by Backbone, because we wanna set a correct this.path value\r\n\r\n @private\r\n */\r\n handleURL(url) {\r\n this.path = url\r\n if (this.changeCallback) {\r\n this.changeCallback(url)\r\n }\r\n }\r\n}\r\n\r\nexport default BrowserLocation\r\n","import { extend } from '../utils.js'\r\n\r\nclass MemoryLocation {\r\n constructor({ path }) {\r\n this.path = path || ''\r\n }\r\n\r\n getURL() {\r\n return this.path\r\n }\r\n\r\n setURL(path, options) {\r\n if (this.path !== path) {\r\n this.path = path\r\n this.handleURL(this.getURL(), options)\r\n }\r\n }\r\n\r\n replaceURL(path, options) {\r\n if (this.path !== path) {\r\n this.setURL(path, options)\r\n }\r\n }\r\n\r\n onChange(callback) {\r\n this.changeCallback = callback\r\n }\r\n\r\n handleURL(url, options = {}) {\r\n this.path = url\r\n options = extend({ trigger: true }, options)\r\n if (this.changeCallback && options.trigger) {\r\n this.changeCallback(url)\r\n }\r\n }\r\n\r\n removeRoot(url) {\r\n return url\r\n }\r\n\r\n formatURL(url) {\r\n return url\r\n }\r\n}\r\n\r\nexport default MemoryLocation\r\n","export const TRANSITION_REDIRECTED = 'TransitionRedirected'\r\n\r\nexport const TRANSITION_CANCELLED = 'TransitionCancelled'\r\n","import { clone } from './utils.js'\r\nimport invariant from './invariant.js'\r\nimport { TRANSITION_CANCELLED, TRANSITION_REDIRECTED } from './constants.js'\r\n\r\n/**\r\n * @typedef {import(\"./router.js\").Route} Route\r\n */\r\n\r\n/**\r\n * @typedef {Pick<Transition, 'routes' | 'pathname' | 'path' | 'params' | 'query' >} TransitionData\r\n */\r\n\r\n/**\r\n * @typedef Transition\r\n * @property {Route[]} routes\r\n * @property {string} pathname\r\n * @property {string} path\r\n * @property {Object} params\r\n * @property {Object} query\r\n * @property {TransitionData} prev\r\n * @property {(name: string, params?: any, query?: any) => Transition} redirectTo\r\n * @property {(name: string, params?: any, query?: any) => Transition} retry\r\n * @property {(error: string | Error) => void} cancel\r\n * @property {() => Promise<any>} followRedirects\r\n * @property {function} then\r\n * @property {function} catch\r\n * @property {boolean} noop\r\n * @property {boolean} isCancelled\r\n */\r\n\r\n/**\r\n * @param {*} router\r\n * @param {Transition} transition\r\n * @param {*} err\r\n */\r\nfunction runError(router, transition, err) {\r\n router.middleware.forEach((m) => {\r\n m.error && m.error(transition, err)\r\n })\r\n}\r\n\r\n/**\r\n * @export\r\n * @param {*} options\r\n * @return {Transition}\r\n */\r\nexport default function transition(options) {\r\n options = options || {}\r\n\r\n const router = options.router\r\n const log = router.log\r\n const logError = router.logError\r\n\r\n const path = options.path\r\n const match = options.match\r\n const routes = match.routes\r\n const params = match.params\r\n const pathname = match.pathname\r\n const query = match.query\r\n\r\n const id = options.id\r\n const startTime = Date.now()\r\n log('---')\r\n log('Transition #' + id, 'to', path)\r\n log(\r\n 'Transition #' + id,\r\n 'routes:',\r\n routes.map((r) => r.name),\r\n )\r\n log('Transition #' + id, 'params:', params)\r\n log('Transition #' + id, 'query:', query)\r\n\r\n // create the transition promise\r\n let resolve, reject\r\n const promise = new Promise(function (res, rej) {\r\n resolve = res\r\n reject = rej\r\n })\r\n\r\n // 1. make transition errors loud\r\n // 2. by adding this handler we make sure\r\n // we don't trigger the default 'Potentially\r\n // unhandled rejection' for cancellations\r\n promise\r\n .then(function () {\r\n log('Transition #' + id, 'completed in', Date.now() - startTime + 'ms')\r\n })\r\n .catch(function (err) {\r\n if (err.type !== TRANSITION_REDIRECTED && err.type !== TRANSITION_CANCELLED) {\r\n log('Transition #' + id, 'FAILED')\r\n logError(err)\r\n }\r\n })\r\n\r\n let cancelled = false\r\n\r\n const transition = {\r\n id,\r\n prev: {\r\n routes: clone(router.state.routes) || [],\r\n path: router.state.path || '',\r\n pathname: router.state.pathname || '',\r\n params: clone(router.state.params) || {},\r\n query: clone(router.state.query) || {},\r\n },\r\n routes: clone(routes),\r\n path,\r\n pathname,\r\n params: clone(params),\r\n query: clone(query),\r\n redirectTo: function (...args) {\r\n return router.transitionTo(...args)\r\n },\r\n retry: function () {\r\n return router.transitionTo(path)\r\n },\r\n cancel: function (err) {\r\n if (router.state.activeTransition !== transition) {\r\n return\r\n }\r\n\r\n if (transition.isCancelled) {\r\n return\r\n }\r\n\r\n router.state.activeTransition = null\r\n transition.isCancelled = true\r\n cancelled = true\r\n\r\n if (!err) {\r\n err = new Error(TRANSITION_CANCELLED)\r\n err.type = TRANSITION_CANCELLED\r\n }\r\n if (err.type === TRANSITION_CANCELLED) {\r\n log('Transition #' + id, 'cancelled')\r\n }\r\n if (err.type === TRANSITION_REDIRECTED) {\r\n log('Transition #' + id, 'redirected')\r\n }\r\n\r\n router.middleware.forEach((m) => {\r\n m.cancel && m.cancel(transition, err)\r\n })\r\n reject(err)\r\n },\r\n followRedirects: function () {\r\n return promise.catch(function (reason) {\r\n if (router.state.activeTransition) {\r\n return router.state.activeTransition.followRedirects()\r\n }\r\n return Promise.reject(reason)\r\n })\r\n },\r\n\r\n then: promise.then.bind(promise),\r\n catch: promise.catch.bind(promise),\r\n }\r\n\r\n router.middleware.forEach((m) => {\r\n m.before && m.before(transition)\r\n })\r\n\r\n // here we handle calls to all of the middlewares\r\n function callNext(i, prevResult) {\r\n let middleware\r\n let middlewareName\r\n // if transition has been cancelled - nothing left to do\r\n if (cancelled) {\r\n return\r\n }\r\n // done\r\n if (i < router.middleware.length) {\r\n middleware = router.middleware[i]\r\n middlewareName = middleware.name || 'anonymous'\r\n log('Transition #' + id, 'resolving middleware:', middlewareName)\r\n let middlewarePromise\r\n try {\r\n middlewarePromise = middleware.resolve\r\n ? middleware.resolve(transition, prevResult)\r\n : prevResult\r\n invariant(\r\n transition !== middlewarePromise,\r\n 'Middleware %s returned a transition which resulted in a deadlock',\r\n middlewareName,\r\n )\r\n } catch (err) {\r\n router.state.activeTransition = null\r\n runError(router, transition, err)\r\n return reject(err)\r\n }\r\n Promise.resolve(middlewarePromise)\r\n .then(function (result) {\r\n callNext(i + 1, result)\r\n })\r\n .catch(function (err) {\r\n log('Transition #' + id, 'resolving middleware:', middlewareName, 'FAILED')\r\n router.state.activeTransition = null\r\n runError(router, transition, err)\r\n reject(err)\r\n })\r\n } else {\r\n router.state = {\r\n activeTransition: null,\r\n routes,\r\n path,\r\n pathname,\r\n params,\r\n query,\r\n }\r\n router.middleware.forEach((m) => {\r\n m.done && m.done(transition)\r\n })\r\n resolve()\r\n }\r\n }\r\n\r\n if (!options.noop) {\r\n Promise.resolve().then(() => callNext(0))\r\n } else {\r\n resolve()\r\n }\r\n\r\n if (options.noop) {\r\n transition.noop = true\r\n }\r\n\r\n return transition\r\n}\r\n","import { bindEvent, unbindEvent } from './events.js'\r\n\r\n/**\r\n * Handle link delegation on `el` or the document,\r\n * and invoke `fn(e)` when clickable.\r\n *\r\n * @param {Element} el\r\n * @param {(e: Event, el: HTMLElement) => void} fn\r\n * @return {Function} dispose\r\n * @api public\r\n */\r\n\r\nexport function intercept(el, fn) {\r\n const cb = delegate(el, 'click', function (e, el) {\r\n if (clickable(e, el)) fn(e, el)\r\n })\r\n\r\n return function dispose() {\r\n unbindEvent(el, 'click', cb)\r\n }\r\n}\r\n\r\n/**\r\n * Delegate event `type` to links\r\n * and invoke `fn(e)`. A callback function\r\n * is returned which may be passed to `.unbind()`.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {String} selector\r\n * @param {String} type\r\n * @param {(e: Event, el: HTMLElement) => void} fn\r\n * @return {Function}\r\n * @api public\r\n */\r\n\r\nfunction delegate(el, type, fn) {\r\n return bindEvent(el, type, function (e) {\r\n const el = e.target.closest('a')\r\n if (el) {\r\n fn(e, el)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Check if `e` is clickable.\r\n */\r\n\r\n/**\r\n * @param {Event} e\r\n * @param {HTMLElement} el\r\n * @return {Boolean | undefined}\r\n */\r\nfunction clickable(e, el) {\r\n if (which(e) !== 1) return\r\n if (e.metaKey || e.ctrlKey || e.shiftKey) return\r\n if (e.defaultPrevented) return\r\n\r\n // check target\r\n if (el.target) return\r\n\r\n // check for data-bypass attribute\r\n if (el.getAttribute('data-bypass') !== null) return\r\n\r\n // inspect the href\r\n const href = el.getAttribute('href')\r\n if (!href || href.length === 0) return\r\n\r\n // don't handle hash links, external/absolute links, email links and javascript links\r\n if (/^(#|https{0,1}:\\/\\/|mailto|javascript:)/i.test(href)) return\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Event button.\r\n */\r\n\r\nfunction which(e) {\r\n e = e || window.event\r\n return e.which === null ? e.button : e.which\r\n}\r\n","export default function defineLogger(router, method, fn) {\r\n if (fn === true) return\r\n router[method] = typeof fn === 'function' ? fn : () => {}\r\n}\r\n","export default {\r\n parse(querystring) {\r\n return querystring.split('&').reduce((acc, pair) => {\r\n const parts = pair.split('=')\r\n acc[parts[0]] = decodeURIComponent(parts[1])\r\n return acc\r\n }, {})\r\n },\r\n\r\n stringify(params) {\r\n return Object.keys(params)\r\n .reduce((acc, key) => {\r\n if (params[key] !== undefined) {\r\n acc.push(key + '=' + encodeURIComponent(params[key]))\r\n }\r\n return acc\r\n }, [])\r\n .join('&')\r\n },\r\n}\r\n","/**\n * @param {string|RegExp} input The route pattern\n * @param {boolean} [loose] Allow open-ended matching. Ignored with `RegExp` input.\n */\nexport function parse(input, loose) {\n\tif (input instanceof RegExp) return { keys:false, pattern:input };\n\tvar c, o, tmp, ext, keys=[], pattern='', arr = input.split('/');\n\tarr[0] || arr.shift();\n\n\twhile (tmp = arr.shift()) {\n\t\tc = tmp[0];\n\t\tif (c === '*') {\n\t\t\tkeys.push(c);\n\t\t\tpattern += tmp[1] === '?' ? '(?:/(.*))?' : '/(.*)';\n\t\t} else if (c === ':') {\n\t\t\to = tmp.indexOf('?', 1);\n\t\t\text = tmp.indexOf('.', 1);\n\t\t\tkeys.push( tmp.substring(1, !!~o ? o : !!~ext ? ext : tmp.length) );\n\t\t\tpattern += !!~o && !~ext ? '(?:/([^/]+?))?' : '/([^/]+?)';\n\t\t\tif (!!~ext) pattern += (!!~o ? '?' : '') + '\\\\' + tmp.substring(ext);\n\t\t} else {\n\t\t\tpattern += '/' + tmp;\n\t\t}\n\t}\n\n\treturn {\n\t\tkeys: keys,\n\t\tpattern: new RegExp('^' + pattern + (loose ? '(?=$|\\/)' : '\\/?$'), 'i')\n\t};\n}\n\nvar RGX = /(\\/|^)([:*][^/]*?)(\\?)?(?=[/.]|$)/g;\n\n// error if key missing?\nexport function inject(route, values) {\n\treturn route.replace(RGX, (x, lead, key, optional) => {\n\t\tx = values[key=='*' ? key : key.substring(1)];\n\t\treturn x ? '/'+x : (optional || key=='*') ? '' : '/' + key;\n\t});\n}\n","import { parse } from 'regexparam'\r\n\r\nconst splatRegex = /:(\\w+)\\*/\r\n\r\nexport function patternCompiler(pattern) {\r\n // hack to add (partial) named splat support\r\n const splatMatch = splatRegex.exec(pattern)\r\n const normalizedPattern = splatMatch ? pattern.replace(splatRegex, '*') : pattern\r\n\r\n const { pattern: matcher, keys } = parse(normalizedPattern)\r\n\r\n const paramNames = splatMatch ? keys.map((key) => (key === '*' ? splatMatch[1] : key)) : keys\r\n\r\n return {\r\n matcher,\r\n paramNames,\r\n }\r\n}\r\n","/* eslint-disable array-callback-return */\r\nimport { pick, clone, extend, isEqual, keys } from './utils.js'\r\nimport functionDsl from './function-dsl.js'\r\nimport arrayDsl from './array-dsl.js'\r\nimport {\r\n withQuery,\r\n withoutQuery,\r\n injectParams,\r\n extractParams,\r\n extractParamNames,\r\n extractQuery,\r\n} from './path.js'\r\nimport invariant from './invariant.js'\r\nimport BrowserLocation from './locations/browser.js'\r\nimport MemoryLocation from './locations/memory.js'\r\nimport transition from './transition.js'\r\nimport { intercept } from './links.js'\r\nimport defineLogger from './logger.js'\r\nimport qs from './qs.js'\r\nimport { patternCompiler } from './patternCompiler.js'\r\nimport { TRANSITION_CANCELLED, TRANSITION_REDIRECTED } from './constants.js'\r\n\r\n/**\r\n * @typedef {import('./function-dsl.js').routeCallback} routeCallback\r\n * @typedef {import('./array-dsl.js').RouteDef} RouteDef\r\n * @typedef {import('./transition.js').Transition} Transition\r\n *\r\n * @typedef Route\r\n * @property {String} name\r\n * @property {String} path\r\n * @property {Object} options\r\n * @property {Route[]} routes\r\n *\r\n\r\n * @typedef {Object | 'browser' | 'memory'} LocationParam\r\n *\r\n *\r\n * @typedef RouterOptions\r\n * @property {routeCallback | RouteDef[]} [routes]\r\n * @property {LocationParam} [location]\r\n * @property {Boolean} [logError]\r\n * @property {Object} [qs]\r\n * @property {Object} [patternCompiler]\r\n *\r\n */\r\n\r\nclass Router {\r\n /**\r\n * @param {RouterOptions} [options]\r\n */\r\n constructor(options = {}) {\r\n this.nextId = 1\r\n this.state = {}\r\n this.middleware = []\r\n this.options = extend(\r\n {\r\n location: 'browser',\r\n logError: true,\r\n qs,\r\n patternCompiler,\r\n },\r\n options,\r\n )\r\n defineLogger(this, 'log', this.options.log)\r\n defineLogger(this, 'logError', this.options.logError)\r\n if (options.routes) {\r\n this.map(options.routes)\r\n }\r\n }\r\n\r\n /**\r\n * Add a middleware\r\n * @param {Function} middleware\r\n * @return {Router}\r\n * @api public\r\n */\r\n use(middleware, options = {}) {\r\n const m = typeof middleware === 'function' ? { resolve: middleware } : middleware\r\n typeof options.at === 'number'\r\n ? this.middleware.splice(options.at, 0, m)\r\n : this.middleware.push(m)\r\n m.create && m.create(this)\r\n return this\r\n }\r\n\r\n /**\r\n * Add the route map\r\n * @param {routeCallback | RouteDef[]} routes\r\n * @return {Router}\r\n * @api public\r\n */\r\n map(routes) {\r\n // create the route tree\r\n this.routes = Array.isArray(routes) ? arrayDsl(routes) : functionDsl(routes)\r\n\r\n // create the matcher list, which is like a flattened\r\n // list of routes = a list of all branches of the route tree\r\n const matchers = (this.matchers = [])\r\n // keep track of whether duplicate paths have been created,\r\n // in which case we'll warn the dev\r\n const dupes = {}\r\n // keep track of abstract routes to build index route forwarding\r\n const abstracts = {}\r\n\r\n eachBranch({ routes: this.routes }, [], (routes) => {\r\n // concatenate the paths of the list of routes\r\n let path = routes.reduce(\r\n (\r\n memo,\r\n r, // reset if there's a leading slash, otherwise concat\r\n ) =>\r\n // and keep resetting the trailing slash\r\n (r.path[0] === '/' ? r.path : `${memo}/${r.path}`).replace(/\\/$/, ''),\r\n '',\r\n )\r\n // ensure we have a leading slash\r\n if (path === '') {\r\n path = '/'\r\n }\r\n\r\n const lastRoute = routes[routes.length - 1]\r\n\r\n if (lastRoute.options.abstract) {\r\n abstracts[path] = lastRoute.name\r\n return\r\n }\r\n\r\n if (lastRoute.path === '') {\r\n let matcher\r\n matchers.some((m) => {\r\n if (m.path === path) {\r\n matcher = m\r\n return true\r\n }\r\n })\r\n\r\n if (matcher) {\r\n // remap the matcher of a parent route\r\n matcher.routes = routes\r\n } else if (abstracts[path]) {\r\n matchers.push({\r\n routes,\r\n name: abstracts[path],\r\n path,\r\n })\r\n }\r\n }\r\n\r\n // register routes\r\n matchers.push({\r\n routes,\r\n name: lastRoute.name,\r\n path,\r\n })\r\n\r\n // dupe detection\r\n if (dupes[path] && lastRoute.path !== '') {\r\n throw new Error(\r\n `Routes ${dupes[path]} and ${lastRoute.name} have the same url path '${path}'`,\r\n )\r\n }\r\n dupes[path] = lastRoute.name\r\n })\r\n\r\n function eachBranch(node, memo, fn) {\r\n node.routes.forEach((route) => {\r\n fn(memo.concat(route))\r\n\r\n if (route.routes.length) {\r\n eachBranch(route, memo.concat(route), fn)\r\n }\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Starts listening to the location changes.\r\n * @param {String} [path]\r\n * @return {Transition} initial transition\r\n *\r\n * @api public\r\n */\r\n listen(path) {\r\n const location = (this.location = this.createLocation(path || ''))\r\n // setup the location onChange handler\r\n location.onChange((url) => {\r\n const previousUrl = this.state.path\r\n this.dispatch(url).catch((err) => {\r\n if (err && err.type === TRANSITION_CANCELLED) {\r\n // reset the URL in case the transition has been cancelled\r\n this.location.replaceURL(previousUrl, { trigger: false })\r\n }\r\n return err\r\n })\r\n })\r\n // and also kick off the initial transition\r\n return this.dispatch(location.getURL())\r\n }\r\n\r\n /**\r\n * Transition to a different route. Passe in url or a route name followed by params and query\r\n * @param {String} name url or route name\r\n * @param {Object} [params] Optional\r\n * @param {Object} [query] Optional\r\n * @return {Transition} transition\r\n *\r\n * @api public\r\n */\r\n transitionTo(name, params, query) {\r\n if (this.state.activeTransition) {\r\n return this.replaceWith(name, params, query)\r\n }\r\n return this.doTransition('setURL', name, params, query)\r\n }\r\n\r\n /**\r\n * Like transitionTo, but doesn't leave an entry in the browser's history,\r\n * so clicking back will skip this route\r\n * @param {String} name url or route name followed by params and query\r\n * @param {Record<string, any>} [params]\r\n * @param {Record<string, any>} [query]\r\n * @return {Transition} transition\r\n *\r\n * @api public\r\n */\r\n replaceWith(name, params, query) {\r\n return this.doTransition('replaceURL', name, params, query)\r\n }\r\n\r\n /**\r\n * Create an href\r\n * @param {String} name target route name\r\n * @param {Object} [params]\r\n * @param {Object} [query]\r\n * @return {String} href\r\n *\r\n * @api public\r\n */\r\n generate(name, params, query) {\r\n invariant(this.location, 'call .listen() before using .generate()')\r\n let matcher\r\n\r\n query = query || {}\r\n\r\n this.matchers.forEach((m) => {\r\n if (m.name === name) {\r\n matcher = m\r\n }\r\n })\r\n\r\n if (!matcher) {\r\n throw new Error(`No route is named ${name}`)\r\n }\r\n\r\n const url = withQuery(this.options.qs, injectParams(matcher.path, params), query)\r\n return this.location.formatURL(url)\r\n }\r\n\r\n /**\r\n * Stop listening to URL changes\r\n * @api public\r\n */\r\n destroy() {\r\n if (this.location && this.location.destroy) {\r\n this.location.destroy()\r\n }\r\n if (this.state.activeTransition) {\r\n this.state.activeTransition.cancel()\r\n }\r\n this.state = {}\r\n this.middleware.forEach((m) => {\r\n m.destroy && m.destroy(this)\r\n })\r\n }\r\n\r\n /**\r\n * Check if the given route/params/query combo is active\r\n * @param {String} name target route name\r\n * @param {Record<string, any>} [params]\r\n * @param {Record<string, any>} [query]\r\n * @param {Boolean} [exact]\r\n * @return {Boolean}\r\n *\r\n * @api public\r\n */\r\n isActive(name, params, query, exact) {\r\n const activeRoutes = this.state.routes || []\r\n const activeParams = this.state.params\r\n const activeQuery = this.state.query\r\n\r\n let isActive =\r\n activeRoutes.some((route) => route.name === name) &&\r\n (!exact || activeRoutes[activeRoutes.length - 1].name === name)\r\n isActive =\r\n isActive && (!params || keys(params).every((key) => activeParams[key] === params[key]))\r\n isActive = isActive && (!query || keys(query).every((key) => activeQuery[key] === query[key]))\r\n\r\n return isActive\r\n }\r\n\r\n /**\r\n * @api private\r\n * @param {String} method pushState or replaceState\r\n * @param {String} name target route name\r\n * @param {Object} [params]\r\n * @param {Object} [query]\r\n * @return {Transition} transition\r\n */\r\n doTransition(method, name, params, query) {\r\n const previousUrl = this.location.getURL()\r\n\r\n let url = name\r\n if (url[0] !== '/') {\r\n url = this.generate(name, params, query)\r\n url = url.replace(/^#/, '/')\r\n }\r\n\r\n if (this.options.pushState) {\r\n url = this.location.removeRoot(url)\r\n }\r\n\r\n const transition = this.dispatch(url)\r\n\r\n transition.catch((err) => {\r\n if (err && err.type === TRANSITION_CANCELLED) {\r\n // reset the URL in case the transition has been cancelled\r\n this.location.replaceURL(previousUrl, { trigger: false })\r\n }\r\n return err\r\n })\r\n\r\n this.location[method](url, { trigger: false })\r\n\r\n return transition\r\n }\r\n\r\n /**\r\n * Match the path against the routes\r\n * @param {String} path\r\n * @return {Object} the list of matching routes and params\r\n *\r\n * @api private\r\n */\r\n match(path) {\r\n path = (path || '').replace(/\\/$/, '') || '/'\r\n let params\r\n let routes = []\r\n const pathWithoutQuery = withoutQuery(path)\r\n const { qs, patternCompiler } = this.options\r\n this.matchers.some((matcher) => {\r\n params = extractParams(matcher.path, pathWithoutQuery, patternCompiler)\r\n if (params) {\r\n routes = matcher.routes\r\n return true\r\n }\r\n })\r\n return {\r\n routes: routes.map(descriptor),\r\n params: params || {},\r\n pathname: pathWithoutQuery,\r\n query: extractQuery(qs, path) || {},\r\n }\r\n\r\n // clone the data (only a shallow clone of options)\r\n // to make sure the internal route store is not mutated\r\n // by the middleware. The middleware can mutate data\r\n // before it gets passed into the resolve middleware, but\r\n // only within the same transition. New transitions\r\n // will get to use pristine data.\r\n function descriptor(route) {\r\n return {\r\n name: route.name,\r\n path: route.path,\r\n params: pick(params, extractParamNames(route.path, patternCompiler)),\r\n options: clone(route.options),\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param {string} path\r\n * @returns {Transition}\r\n */\r\n dispatch(path) {\r\n const match = this.match(path)\r\n const query = match.query\r\n const pathname = match.pathname\r\n\r\n const activeTransition = this.state.activeTransition\r\n\r\n // if we already have an active transition with all the same\r\n // params - return that and don't do anything else\r\n if (\r\n activeTransition &&\r\n activeTransition.pathname === pathname &&\r\n isEqual(activeTransition.query, query)\r\n ) {\r\n return activeTransition\r\n }\r\n\r\n // otherwise, cancel the active transition since we're\r\n // redirecting (or initiating a brand new transition)\r\n if (activeTransition) {\r\n const err = new Error(TRANSITION_REDIRECTED)\r\n err.type = TRANSITION_REDIRECTED\r\n err.nextPath = path\r\n activeTransition.cancel(err)\r\n }\r\n\r\n // if there is no active transition, check if\r\n // this is a noop transition, in which case, return\r\n // a transition to respect the function signature,\r\n // but don't actually run any of the middleware\r\n if (!activeTransition) {\r\n if (this.state.pathname === pathname && isEqual(this.state.query, query)) {\r\n return transition({\r\n id: this.nextId++,\r\n path,\r\n match,\r\n noop: true,\r\n router: this,\r\n })\r\n }\r\n }\r\n\r\n const t = transition({\r\n id: this.nextId++,\r\n path,\r\n match,\r\n router: this,\r\n })\r\n\r\n this.state.activeTransition = t\r\n\r\n return t\r\n }\r\n\r\n /**\r\n * Create the default location.\r\n * This is used when no custom location is passed to\r\n * the listen call.\r\n * @param {LocationParam} path\r\n * @return {Object} location\r\n *\r\n * @api private\r\n */\r\n createLocation(path) {\r\n const location = this.options.location\r\n if (typeof location !== 'string') {\r\n return location\r\n }\r\n if (location === 'browser') {\r\n return new BrowserLocation(pick(this.options, ['pushState', 'root']))\r\n } else if (location === 'memory') {\r\n return new MemoryLocation({ path })\r\n } else {\r\n throw new Error('Location can be `browser`, `memory` or a custom implementation')\r\n }\r\n }\r\n\r\n log(...args) {\r\n console.info(...args)\r\n }\r\n\r\n logError(...args) {\r\n console.error(...args)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param {Event} event\r\n * @param {HTMLAnchorElement} link\r\n * @param {Router} router\r\n */\r\nfunction defaultClickHandler(event, link, router) {\r\n event.preventDefault()\r\n router.transitionTo(router.location.removeRoot(link.getAttribute('href')))\r\n}\r\n\r\n/**\r\n * @description Helper to intercept links when using pushState but server is not configured for it\r\n * Link clicks are handled via the router avoiding browser page reload\r\n * @param {Router} router\r\n * @param {HTMLElement} el\r\n * @param {(e: Event, link: HTMLAnchorElement, router: Router) => void} clickHandler\r\n * @returns {Function} dispose\r\n */\r\nfunction interceptLinks(router, el = document, clickHandler = defaultClickHandler) {\r\n return intercept(el, (event, link) => clickHandler(event, link, router))\r\n}\r\n\r\nexport { Router, interceptLinks }\r\n","const resolved = Promise.resolve()\r\nlet routeElMap = Object.create(null)\r\nlet routeComponentMap = Object.create(null)\r\nlet routePropertiesMap = Object.create(null)\r\n\r\nlet router, rootOutlet, rootOutletEl\r\n\r\n/**\r\n * @typedef {import(\"../transition.js\").Transition} Transition\r\n *\r\n * @typedef WCRouteDef\r\n * @property {string} name\r\n * @property {string} path\r\n * @property {string | Function} component\r\n * @property {Object.<string, PropertyHook | PropertyHook[]>} [properties]\r\n * @property {boolean} [reuse]\r\n * @property {function(Transition): Promise<boolean> | boolean} [beforeEnter]\r\n * @property {function(Transition): Promise<boolean> | boolean} [beforeLeave]\r\n * @property {function(Transition): Promise<void> | void} [afterEnter]\r\n * @property {function(Transition): Promise<void> | void} [afterLeave]\r\n */\r\n\r\n/**\r\n * @callback PropertySetter\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n\r\n/**\r\n * @typedef PropertyHook\r\n * @property {function(PropertySetter): void} [init]\r\n * @property {function(Transition, PropertySetter): void} [enter]\r\n * @property {function(Transition, PropertySetter): void} [leave]\r\n * @property {function(*, HTMLElement): void} [update]\r\n */\r\n\r\n/**\r\n * @param {*} value\r\n * @return {*}\r\n */\r\nfunction parseNumber(value) {\r\n const n = parseFloat(value)\r\n const isNumeric = value == n // eslint-disable-line eqeqeq\r\n return isNumeric ? n : value\r\n}\r\n\r\nfunction getFormattedValue(value, format) {\r\n let v = value\r\n if (v !== undefined) {\r\n if (format === 'number') {\r\n v = parseNumber(value)\r\n } else if (typeof format === 'function') {\r\n v = format(value)\r\n }\r\n }\r\n return v\r\n}\r\n\r\n/**\r\n * @param {*} value\r\n * @returns {PropertyHook}\r\n */\r\nexport function fromValue(value) {\r\n return {\r\n init(setValue) {\r\n setValue(value)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @param {string} key\r\n * @param {string | Function} [format]\r\n * @returns {PropertyHook}\r\n */\r\nexport function fromQuery(queryKey, format) {\r\n return {\r\n enter(transition, setValue) {\r\n setValue(transition.query[queryKey], format)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} paramKey\r\n * @param {string | Function} format\r\n * @returns {PropertyHook}\r\n */\r\nexport function fromParam(paramKey, format) {\r\n return {\r\n enter(transition, setValue) {\r\n setValue(transition.params[paramKey], format)\r\n },\r\n }\r\n}\r\n\r\nexport function getRouteEl(route) {\r\n return routeElMap[route.name]\r\n}\r\n\r\nfunction create(instance) {\r\n router = instance\r\n rootOutlet = instance.options.outlet\r\n}\r\n\r\nfunction destroy() {\r\n router = null\r\n routeElMap = Object.create(null)\r\n routeComponentMap = Object.create(null)\r\n routePropertiesMap = Object.create(null)\r\n rootOutletEl = null\r\n}\r\n\r\nfunction isEqual(obj1, obj2) {\r\n const keys1 = Object.keys(obj1)\r\n return keys1.length === Object.keys(obj2).length && keys1.every((key) => obj2[key] === obj1[key])\r\n}\r\n\r\nfunction getOutlet(el) {\r\n const renderRoot = el.shadowRoot || el\r\n return renderRoot.querySelector(el.constructor.outlet || 'router-outlet')\r\n}\r\n\r\nfunction resolveRootOutlet() {\r\n if (rootOutletEl) return rootOutletEl\r\n if (!rootOutlet) return document.body\r\n rootOutletEl = typeof rootOutlet === 'string' ? document.querySelector(rootOutlet) : rootOutlet\r\n if (!rootOutletEl) {\r\n throw new Error(`slick-router(wc): Invalid outlet option ${rootOutlet}`)\r\n }\r\n return rootOutletEl\r\n}\r\n\r\nfunction getParentEl(transition, parentIndex) {\r\n let parent = transition.routes[parentIndex]\r\n while (parent) {\r\n if (parent.options.component) {\r\n return routeElMap[parent.name]\r\n }\r\n parent = transition.routes[--parentIndex]\r\n }\r\n}\r\n\r\nfunction getChangingIndex(prevRoutes, currentRoutes) {\r\n let index, prev, current\r\n const count = Math.max(prevRoutes.length, currentRoutes.length)\r\n for (index = 0; index < count; index++) {\r\n prev = prevRoutes[index]\r\n current = currentRoutes[index]\r\n if (!(prev && current) || prev.name !== current.name || !isEqual(prev.params, current.params)) {\r\n break\r\n }\r\n }\r\n return index\r\n}\r\n\r\nfunction runPropertyHookMethod(transition, routes, method) {\r\n for (let i = 0; i < routes.length; i++) {\r\n const { route } = routes[i]\r\n const propertiesData = routePropertiesMap[route.name]\r\n for (const { hooks, set } of Object.values(propertiesData)) {\r\n hooks.forEach((hook) => {\r\n if (typeof hook[method] === 'function') {\r\n hook[method](transition, set)\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\nasync function runLifeCycle(transition, routes, prefix, suffix) {\r\n for (let i = 0; i < routes.length; i++) {\r\n let result\r\n const { route, el } = routes[i]\r\n const routeMethod = route.options[`${prefix}${suffix}`]\r\n if (typeof routeMethod === 'function') {\r\n result = await routeMethod(transition)\r\n if (result === false) {\r\n transition.cancel()\r\n }\r\n }\r\n if (transition.isCancelled) break\r\n const elMethod = el && el[`${prefix}Route${suffix}`]\r\n if (typeof elMethod === 'function') {\r\n result = await elMethod.call(el, transition)\r\n if (result === false) {\r\n transition.cancel()\r\n }\r\n }\r\n if (transition.isCancelled) break\r\n }\r\n}\r\n\r\nfunction resolveModule(value) {\r\n return value && value.__esModule ? value.default : value\r\n}\r\n\r\nfunction initPropertyHook(value) {\r\n if (value && typeof value === 'object') return value\r\n return fromValue(value)\r\n}\r\n\r\nfunction initProperties(route) {\r\n let propertiesData = routePropertiesMap[route.name]\r\n if (!propertiesData) {\r\n propertiesData = routePropertiesMap[route.name] = Object.create(null)\r\n const properties = route.options.properties\r\n if (properties) {\r\n for (const [name, hookOrValue] of Object.entries(properties)) {\r\n const hooks = Array.isArray(hookOrValue)\r\n ? hookOrValue.map(initPropertyHook)\r\n : [initPropertyHook(hookOrValue)]\r\n\r\n const set = (v, format) => {\r\n const propertyData = propertiesData[name]\r\n const newValue = getFormattedValue(v, format)\r\n if (propertyData.value === newValue) return\r\n propertyData.value = newValue\r\n const el = routeElMap[route.name]\r\n if (el) {\r\n el[name] = newValue\r\n }\r\n hooks.forEach((hook) => {\r\n if (typeof hook.update === 'function') {\r\n hook.update(newValue, el)\r\n }\r\n })\r\n }\r\n propertiesData[name] = { hooks, set }\r\n hooks.forEach((hook) => {\r\n if (typeof hook.init === 'function') {\r\n hook.init(set)\r\n }\r\n })\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function resolveRoutes(routes) {\r\n const result = []\r\n\r\n for (const route of routes) {\r\n let el = route.options.reuse ? routeElMap[route.name] : undefined\r\n let Component = route.options.component\r\n if (!el && Component) {\r\n if (typeof Component === 'function' && !(Component.prototype instanceof HTMLElement)) {\r\n Component =\r\n routeComponentMap[route.name] ||\r\n (routeComponentMap[route.name] = resolveModule(await Component(route)))\r\n }\r\n el = typeof Component === 'string' ? document.createElement(Component) : new Component()\r\n routeElMap[route.name] = el\r\n el.$router = router\r\n }\r\n\r\n initProperties(route)\r\n\r\n result.push({ el, route })\r\n }\r\n return result\r\n}\r\n\r\nfunction applyProperties(el, route) {\r\n const propertiesData = routePropertiesMap[route.name]\r\n Object.entries(propertiesData).forEach(([name, { value }]) => {\r\n el[name] = value\r\n })\r\n}\r\n\r\nconst removedEls = new WeakSet()\r\nconst outletCurrentEl = new WeakMap()\r\n\r\nasync function renderElements(transition, activated, changingIndex) {\r\n // set properties of not activated elements\r\n const { path, pathname, routes, params, query } = transition\r\n const routeState = { path, pathname, routes, params, query }\r\n for (let k = 0; k < changingIndex; k++) {\r\n const route = transition.routes[k]\r\n const el = routeElMap[route.name]\r\n if (el) {\r\n el.$route = routeState\r\n applyProperties(el, route)\r\n }\r\n }\r\n for (let i = 0; i < activated.length; i++) {\r\n const { el, route } = activated[i]\r\n if (el) {\r\n const parentEl = getParentEl(transition, changingIndex + i - 1)\r\n const outletEl = parentEl ? getOutlet(parentEl) : resolveRootOutlet()\r\n if (outletEl) {\r\n const currentEl = outletCurrentEl.get(outletEl) || outletEl.firstElementChild\r\n if (currentEl) {\r\n outletEl.removeChild(currentEl)\r\n removedEls.add(currentEl)\r\n }\r\n el.$route = routeState\r\n applyProperties(el, route)\r\n outletEl.appendChild(el)\r\n outletCurrentEl.set(outletEl, el)\r\n await (el.updateComplete || resolved)\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction updateDOMTree(activated, deactivated) {\r\n let parentElRemoved\r\n for (let routeIndex = deactivated.length - 1; routeIndex >= 0; routeIndex--) {\r\n const { route, el } = deactivated[routeIndex]\r\n if (!activated.some(({ route: activeRoute }) => activeRoute.name === route.name)) {\r\n if (el) {\r\n // removes only the parent el from the deactivated els\r\n // and don't remove elements that were queued to be removed\r\n // necessary for lazy removal done in animations\r\n if (!parentElRemoved && !removedEls.has(el)) el.remove()\r\n parentElRemoved = true\r\n }\r\n routeElMap[route.name] = undefined\r\n }\r\n }\r\n}\r\n\r\nasync function resolve(transition) {\r\n const prevRoutes = transition.prev.routes\r\n const changingIndex = getChangingIndex(prevRoutes, transition.routes)\r\n const deactivated = []\r\n\r\n // deactivate previous routes from child to parent\r\n for (let routeIndex = prevRoutes.length - 1; routeIndex >= changingIndex; routeIndex--) {\r\n const route = prevRoutes[routeIndex]\r\n deactivated.push({ el: routeElMap[route.name], route })\r\n }\r\n\r\n await runLifeCycle(transition, deactivated, 'before', 'Leave')\r\n\r\n if (transition.isCancelled) return\r\n\r\n const activated = await resolveRoutes(transition.routes.slice(changingIndex))\r\n\r\n await runLifeCycle(transition, activated, 'before', 'Enter')\r\n\r\n if (transition.isCancelled) return\r\n\r\n runPropertyHookMethod(transition, activated, 'enter')\r\n\r\n await renderElements(transition, activated, changingIndex)\r\n\r\n updateDOMTree(activated, deactivated)\r\n\r\n transition.activated = activated\r\n transition.deactivated = deactivated\r\n}\r\n\r\nfunction done(transition) {\r\n runPropertyHookMethod(transition, transition.deactivated, 'leave')\r\n runLifeCycle(transition, transition.deactivated, 'after', 'Leave')\r\n runLifeCycle(transition, transition.activated, 'after', 'Enter')\r\n}\r\n\r\nexport const wc = {\r\n create,\r\n destroy,\r\n resolve,\r\n done,\r\n}\r\n","import { Router as CoreRouter, interceptLinks } from './router.js'\r\nimport { wc, fromParam, fromQuery, fromValue, getRouteEl } from './middlewares/wc.js'\r\nimport { routerLinks } from './middlewares/router-links.js'\r\nimport './components/router-links.js'\r\n\r\n/**\r\n * @typedef {import(\"./middlewares/wc.js\").WCRouteDef} WCRouteDef\r\n * @typedef {import(\"./middlewares/wc.js\").PropertyHook} PropertyHook\r\n * @typedef {import(\"./transition.js\").Transition} Transition\r\n */\r\n\r\nclass Router extends CoreRouter {\r\n constructor(options) {\r\n super(options)\r\n this.use(wc)\r\n this.use(routerLinks)\r\n }\r\n}\r\n\r\nexport { Router, interceptLinks, fromParam, fromQuery, fromValue, getRouteEl }\r\n","let eventPrefix\r\n\r\nfunction trigger(name, detail) {\r\n window.dispatchEvent(new CustomEvent(`${eventPrefix}${name}`, { detail }))\r\n}\r\n\r\nexport const events = {\r\n create: function (router) {\r\n eventPrefix = router.options.eventPrefix || 'router-'\r\n },\r\n\r\n before: function (transition) {\r\n trigger('before:transition', { transition })\r\n },\r\n\r\n done: function (transition) {\r\n trigger('transition', { transition })\r\n },\r\n\r\n cancel: function (transition, error) {\r\n if (error.type !== 'TransitionRedirected') {\r\n trigger('abort', { transition, error })\r\n }\r\n },\r\n\r\n error: function (transition, error) {\r\n trigger('abort', { transition, error })\r\n trigger('error', { transition, error })\r\n },\r\n}\r\n","import { interceptLinks, Router } from 'slick-router';\n//import {Router as CoreRouter, interceptLinks} from 'slick-router/core.js';\nimport { events } from 'slick-router/middlewares/events.js';\n\nimport { default as WJElement } from '../wje-element/element.js';\n\n/**\n * `Routerx` is a custom web component that represents a router in a routing system.\n * @summary This element represents a router in a routing system.\n * @documentation https://elements.webjet.sk/components/router\n * @status stable\n * @augments {WJElement}\n * @tag wje-router\n */\nexport default class Routerx extends WJElement {\n\t/**\n\t * Creates an instance of Routerx.\n\t * @class\n\t */\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tclassName = 'Routerx';\n\n\t/**\n\t * Returns the list of attributes to observe for changes.\n\t * @static\n\t * @returns {Array<string>}\n\t */\n\tstatic get observedAttributes() {\n\t\treturn [];\n\t}\n\n\t/**\n\t * Sets up the attributes for the component.\n\t */\n\tsetupAttributes() {\n\t\tthis.isShadowRoot = 'open';\n\t}\n\n\t/**\n\t * Sets up the router after the component is drawn.\n\t */\n\tbeforeDraw() {\n\t\tconst htmlString = this.outerHTML;\n\n\t\tconst parser = new DOMParser();\n\t\tconst htmlDocument = parser.parseFromString(htmlString, 'text/html');\n\t\tconst rootElement = htmlDocument.querySelector('wje-router');\n\n\t\tconst routes = this.parseElement(rootElement).root;\n\n\t\tthis.router = new Router({\n\t\t\toutlet: this.outlet,\n\t\t\tlog: false,\n\t\t\tlogError: true,\n\t\t\troot: this.root || '/',\n\t\t\tpushState: true,\n\t\t});\n\n\t\tthis.router.map(routes);\n\t\tthis.router.use(this.setBreadcrumb);\n\t\tthis.router.use(events);\n\t\tthis.router.use(this.resetScrollPosition);\n\t\tthis.router.listen();\n\n\t\tthis.unbindIntercept = interceptLinks(this.router);\n\t}\n\n\t/**\n\t * Parses an element and returns an object representation.\n\t * @param {Element} element The element to parse.\n\t * @returns {object} The object representation of the element.\n\t */\n\tparseElement(element) {\n\t\tconst obj = {};\n\t\tconst attributes = element.attributes;\n\n\t\tfor (let i = 0; i < attributes.length; i++) {\n\t\t\tconst attributeName = attributes[i].name;\n\t\t\tconst attributeValue = attributes[i].value;\n\n\t\t\tif (attributeName === 'component' && attributeValue.indexOf('.js') > -1) {\n\t\t\t\t// eslint-disable-next-line jsdoc/no-bad-blocks\n\t\t\t\tobj.component = () => import(/* @vite-ignore */ attributeValue);\n\t\t\t} else {\n\t\t\t\tif (attributeName !== 'shadow') {\n\t\t\t\t\tconst camelCase = attributeName.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n\t\t\t\t\tobj[camelCase] = attributeValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst children = [];\n\t\tconst childElements = Array.from(element.children);\n\n\t\tchildElements.forEach((childElement) => {\n\t\t\tchildren.push(this.parseElement(childElement));\n\t\t});\n\n\t\tif (children.length > 0 && element.tagName === 'WJE-ROUTE') {\n\t\t\tobj.children = children;\n\t\t} else {\n\t\t\tobj.root = children;\n\t\t}\n\n\t\treturn obj;\n\t}\n\n\t/**\n\t * Sets the breadcrumb for the transition.\n\t * @param {object} transition The transition object.\n\t */\n\tsetBreadcrumb = (transition) => {\n\t\tlet breadcrumb = [\n\t\t\t...transition.routes\n\t\t\t\t.filter((obj) => 'breadcrumb' in obj.options)\n\t\t\t\t.map((b, i) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: b.options.breadcrumbPath || b.name,\n\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\tb.options.breadcrumb instanceof Function\n\t\t\t\t\t\t\t\t? b.options.breadcrumb?.(transition)\n\t\t\t\t\t\t\t\t: b.options.breadcrumb,\n\t\t\t\t\t\tparams: { ...b.params, ...transition.params },\n\t\t\t\t\t\tpath: this.router.generate(b.name, { ...b.params, ...transition.params }),\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t];\n\n\t\ttransition.breadcrumbs = breadcrumb;\n\t};\n\n\t/**\n\t * Resets the scroll position.\n\t * @param {object} transition The transition object.\n\t */\n\tresetScrollPosition = (transition) => {\n\t\twindow.scrollTo(0, 0);\n\t};\n\n\t/**\n\t * Cleans up before the component is disconnected.\n\t */\n\tbeforeDisconnect() {\n\t\tthis.unbindIntercept();\n\t\tthis.router.destroy();\n\t}\n}\n","import Routerx from './router.element.js';\n\nexport default Routerx;\n\nRouterx.define('wje-router', Routerx);\n"],"names":["isEqual","qs","LocationBar","router","transition","resolve","el","keys","routes","patternCompiler","Router","CoreRouter"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}
|
|
1
|
+
{"version":3,"file":"wje-routerx.js","sources":["../node_modules/slick-router/lib/utils.js","../node_modules/slick-router/lib/invariant.js","../node_modules/slick-router/lib/function-dsl.js","../node_modules/slick-router/lib/array-dsl.js","../node_modules/slick-router/lib/path.js","../node_modules/slick-router/lib/events.js","../node_modules/slick-router/lib/locations/location-bar.js","../node_modules/slick-router/lib/locations/browser.js","../node_modules/slick-router/lib/locations/memory.js","../node_modules/slick-router/lib/constants.js","../node_modules/slick-router/lib/transition.js","../node_modules/slick-router/lib/links.js","../node_modules/slick-router/lib/logger.js","../node_modules/slick-router/lib/qs.js","../node_modules/regexparam/dist/index.mjs","../node_modules/slick-router/lib/patternCompiler.js","../node_modules/slick-router/lib/router.js","../node_modules/slick-router/lib/middlewares/wc.js","../node_modules/slick-router/lib/wc-router.js","../node_modules/slick-router/lib/middlewares/events.js","../packages/wje-router/router.element.js","../packages/wje-router/router.js"],"sourcesContent":["const assoc = (obj, attr, val) => {\r\n obj[attr] = val\r\n return obj\r\n}\r\nconst isArray = Array.isArray\r\n\r\nexport const keys = Object.keys\r\n\r\nexport const clone = (obj) => (obj ? (isArray(obj) ? obj.slice(0) : extend({}, obj)) : obj)\r\n\r\nexport const pick = (obj, attrs) =>\r\n attrs.reduce((acc, attr) => (obj[attr] === undefined ? acc : assoc(acc, attr, obj[attr])), {})\r\n\r\nexport const isEqual = (obj1, obj2) => {\r\n const keys1 = keys(obj1)\r\n return keys1.length === keys(obj2).length && keys1.every((key) => obj2[key] === obj1[key])\r\n}\r\n\r\nexport const extend = Object.assign\r\n","export default function invariant(condition, format, ...args) {\r\n if (!condition) {\r\n let argIndex = 0\r\n throw new Error('Invariant Violation: ' + format.replace(/%s/g, () => args[argIndex++]))\r\n }\r\n}\r\n","import invariant from './invariant.js'\r\n\r\n/**\r\n * @typedef {import(\"./router.js\").Route} Route\r\n */\r\n\r\n/**\r\n * @callback registerRoute\r\n * @param {string} name\r\n * @param {Object} options\r\n * @param {routeCallback} childrenCallback\r\n */\r\n\r\n/**\r\n * @callback routeCallback\r\n * @param {registerRoute} route\r\n */\r\n\r\n/**\r\n * @export\r\n * @param {routeCallback} callback\r\n * @return {Route[]}\r\n */\r\nexport default function functionDsl(callback) {\r\n let ancestors = []\r\n const matches = {}\r\n const names = {}\r\n\r\n callback(function route(name, options, childrenCallback) {\r\n let routes\r\n\r\n invariant(\r\n !names[name],\r\n 'Route names must be unique, but route \"%s\" is declared multiple times',\r\n name,\r\n )\r\n\r\n names[name] = true\r\n\r\n if (arguments.length === 1) {\r\n options = {}\r\n }\r\n\r\n if (arguments.length === 2 && typeof options === 'function') {\r\n childrenCallback = options\r\n options = {}\r\n }\r\n\r\n if (typeof options.path !== 'string') {\r\n const parts = name.split('.')\r\n options.path = parts[parts.length - 1]\r\n }\r\n\r\n // go to the next level\r\n if (childrenCallback) {\r\n ancestors = ancestors.concat(name)\r\n childrenCallback()\r\n routes = pop()\r\n ancestors.splice(-1)\r\n }\r\n\r\n // add the node to the tree\r\n push({\r\n name,\r\n path: options.path,\r\n routes: routes || [],\r\n options,\r\n })\r\n })\r\n\r\n function pop() {\r\n return matches[currentLevel()] || []\r\n }\r\n\r\n function push(route) {\r\n const level = currentLevel()\r\n matches[level] = matches[level] || []\r\n matches[level].push(route)\r\n }\r\n\r\n function currentLevel() {\r\n return ancestors.join('.')\r\n }\r\n\r\n return pop()\r\n}\r\n","/**\r\n * @typedef {import(\"./router.js\").Route} Route\r\n */\r\n\r\n/**\r\n * @typedef RouteDef\r\n * @property {string} name\r\n * @property {string} path\r\n * @property {RouteDef[]} children\r\n */\r\n\r\n/**\r\n * @export\r\n * @param {RouteDef[]} routes\r\n * @return {Route[]}\r\n */\r\nexport default function arrayDsl(routes) {\r\n const result = []\r\n\r\n routes.forEach(({ name, children, ...options }) => {\r\n if (typeof options.path !== 'string') {\r\n const parts = name.split('.')\r\n options.path = parts[parts.length - 1]\r\n }\r\n result.push({\r\n name,\r\n path: options.path,\r\n options,\r\n routes: children ? arrayDsl(children) : [],\r\n })\r\n })\r\n\r\n return result\r\n}\r\n","import invariant from './invariant.js'\r\n\r\nconst paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?+*]?)/g\r\nconst specialParamChars = /[+*?]$/g\r\nconst queryMatcher = /\\?(.+)/\r\n\r\nconst _compiledPatterns = {}\r\n\r\nfunction compilePattern(pattern, compiler) {\r\n if (!(pattern in _compiledPatterns)) {\r\n _compiledPatterns[pattern] = compiler(pattern)\r\n }\r\n\r\n return _compiledPatterns[pattern]\r\n}\r\n\r\nexport function clearPatternCompilerCache() {\r\n for (const x in _compiledPatterns) {\r\n delete _compiledPatterns[x]\r\n }\r\n}\r\n\r\n/**\r\n * Returns an array of the names of all parameters in the given pattern.\r\n */\r\nexport function extractParamNames(pattern, compiler) {\r\n return compilePattern(pattern, compiler).paramNames\r\n}\r\n\r\n/**\r\n * Extracts the portions of the given URL path that match the given pattern\r\n * and returns an object of param name => value pairs. Returns null if the\r\n * pattern does not match the given path.\r\n */\r\nexport function extractParams(pattern, path, compiler) {\r\n const cp = compilePattern(pattern, compiler)\r\n const matcher = cp.matcher\r\n const paramNames = cp.paramNames\r\n const match = path.match(matcher)\r\n\r\n if (!match) {\r\n return null\r\n }\r\n\r\n const params = {}\r\n\r\n paramNames.forEach(function (paramName, index) {\r\n params[paramName] = match[index + 1] && decodeURIComponent(match[index + 1])\r\n })\r\n\r\n return params\r\n}\r\n\r\n/**\r\n * Returns a version of the given route path with params interpolated. Throws\r\n * if there is a dynamic segment of the route path for which there is no param.\r\n */\r\nexport function injectParams(pattern, params) {\r\n params = params || {}\r\n\r\n return pattern.replace(paramInjectMatcher, function (match, param) {\r\n const paramName = param.replace(specialParamChars, '')\r\n const lastChar = param.slice(-1)\r\n\r\n // If param is optional don't check for existence\r\n if (lastChar === '?' || lastChar === '*') {\r\n if (params[paramName] == null) {\r\n return ''\r\n }\r\n } else {\r\n invariant(\r\n params[paramName] != null,\r\n \"Missing '%s' parameter for path '%s'\",\r\n paramName,\r\n pattern,\r\n )\r\n }\r\n\r\n let paramValue = encodeURIComponent(params[paramName])\r\n if (lastChar === '*' || lastChar === '+') {\r\n // restore / for splats\r\n paramValue = paramValue.replace('%2F', '/')\r\n }\r\n return paramValue\r\n })\r\n}\r\n\r\n/**\r\n * Returns an object that is the result of parsing any query string contained\r\n * in the given path, null if the path contains no query string.\r\n */\r\nexport function extractQuery(qs, path) {\r\n const match = path.match(queryMatcher)\r\n return match && qs.parse(match[1])\r\n}\r\n\r\n/**\r\n * Returns a version of the given path with the parameters in the given\r\n * query merged into the query string.\r\n */\r\nexport function withQuery(qs, path, query) {\r\n const queryString = qs.stringify(query, { indices: false })\r\n\r\n if (queryString) {\r\n return withoutQuery(path) + '?' + queryString\r\n }\r\n\r\n return path\r\n}\r\n\r\n/**\r\n * Returns a version of the given path without the query string.\r\n */\r\nexport function withoutQuery(path) {\r\n return path.replace(queryMatcher, '')\r\n}\r\n","/**\r\n * Bind `el` event `type` to `fn`.\r\n *\r\n * @param {Element} el\r\n * @param {String} type\r\n * @param {Function} fn\r\n * @return {Function}\r\n * @api public\r\n */\r\n\r\nexport function bindEvent(el, type, fn) {\r\n el.addEventListener(type, fn)\r\n return fn\r\n}\r\n\r\n/**\r\n * Unbind `el` event `type`'s callback `fn`.\r\n *\r\n * @param {Element} el\r\n * @param {String} type\r\n * @param {Function} fn\r\n * @return {Function}\r\n * @api public\r\n */\r\n\r\nexport function unbindEvent(el, type, fn) {\r\n el.removeEventListener(type, fn)\r\n return fn\r\n}\r\n","/* eslint-disable */\r\n// LocationBar module extracted from Backbone.js 1.1.0\r\n//\r\n// the dependency on backbone, underscore and jquery have been removed to turn\r\n// this into a small standalone library for handling browser's history API\r\n// cross browser and with a fallback to hashchange events or polling.\r\n\r\nimport {extend} from '../utils.js'\r\nimport {bindEvent, unbindEvent} from '../events.js'\r\n\r\n// this is mostly original code with minor modifications\r\n// to avoid dependency on 3rd party libraries\r\n//\r\n// Backbone.History\r\n// ----------------\r\n\r\n// Handles cross-browser history management, based on either\r\n// [pushState](http://diveintohtml5.info/history.html) and real URLs, or\r\n// [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\r\n// and URL fragments.\r\nclass History {\r\n constructor() {\r\n this.handlers = [];\r\n this.checkUrl = this.checkUrl.bind(this);\r\n this.location = window.location;\r\n this.history = window.history;\r\n }\r\n\r\n // Set up all inheritable **Backbone.History** properties and methods.\r\n // Are we at the app root?\r\n atRoot() {\r\n return this.location.pathname.replace(/[^\\/]$/, '$&/') === this.root;\r\n }\r\n\r\n // Gets the true hash value. Cannot use location.hash directly due to bug\r\n // in Firefox where location.hash will always be decoded.\r\n getHash() {\r\n const match = this.location.href.match(/#(.*)$/);\r\n return match ? match[1] : '';\r\n }\r\n\r\n // Get the cross-browser normalized URL fragment, either from the URL,\r\n // the hash, or the override.\r\n getFragment(fragment, forcePushState) {\r\n if (fragment == null) {\r\n if (this._hasPushState || !this._wantsHashChange || forcePushState) {\r\n fragment = decodeURI(this.location.pathname + this.location.search);\r\n const root = this.root.replace(trailingSlash, '');\r\n if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);\r\n } else {\r\n fragment = this.getHash();\r\n }\r\n }\r\n return fragment.replace(routeStripper, '');\r\n }\r\n\r\n // Start the hash change handling, returning `true` if the current URL matches\r\n // an existing route, and `false` otherwise.\r\n start(options = {}) {\r\n // MODIFICATION OF ORIGINAL BACKBONE.HISTORY\r\n // if (History.started) throw new Error(\"LocationBar has already been started\");\r\n // History.started = true;\r\n this.started = true;\r\n\r\n // Figure out the initial configuration.\r\n // Is pushState desired ... is it available?\r\n this.options = extend({root: '/'}, options);\r\n this.location = this.options.location || this.location;\r\n this.history = this.options.history || this.history;\r\n this.root = this.options.root;\r\n this._wantsHashChange = this.options.hashChange !== false;\r\n this._wantsPushState = !!this.options.pushState;\r\n this._hasPushState = this._wantsPushState;\r\n const fragment = this.getFragment();\r\n\r\n // Normalize root to always include a leading and trailing slash.\r\n this.root = (`/${this.root}/`).replace(rootStripper, '/');\r\n\r\n // Depending on whether we're using pushState or hashes, and whether\r\n // 'onhashchange' is supported, determine how we check the URL state.\r\n bindEvent(window, this._hasPushState ? 'popstate' : 'hashchange', this.checkUrl);\r\n\r\n // Determine if we need to change the base url, for a pushState link\r\n // opened by a non-pushState browser.\r\n this.fragment = fragment;\r\n const loc = this.location;\r\n\r\n // Transition from hashChange to pushState or vice versa if both are\r\n // requested.\r\n if (this._wantsHashChange && this._wantsPushState) {\r\n\r\n // If we've started off with a route from a `pushState`-enabled\r\n // browser, but we're currently in a browser that doesn't support it...\r\n if (!this._hasPushState && !this.atRoot()) {\r\n this.fragment = this.getFragment(null, true);\r\n this.location.replace(`${this.root}#${this.fragment}`);\r\n // Return immediately as browser will do redirect to new url\r\n return true;\r\n\r\n // Or if we've started out with a hash-based route, but we're currently\r\n // in a browser where it could be `pushState`-based instead...\r\n } else if (this._hasPushState && this.atRoot() && loc.hash) {\r\n this.fragment = this.getHash().replace(routeStripper, '');\r\n this.history.replaceState({}, document.title, this.root + this.fragment);\r\n }\r\n\r\n }\r\n\r\n if (!this.options.silent) return this.loadUrl();\r\n }\r\n\r\n // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\r\n // but possibly useful for unit testing Routers.\r\n stop() {\r\n unbindEvent(window, this._hasPushState ? 'popstate' : 'hashchange', this.checkUrl);\r\n this.started = false;\r\n }\r\n\r\n // Add a route to be tested when the fragment changes. Routes added later\r\n // may override previous routes.\r\n route(route, callback) {\r\n this.handlers.unshift({route, callback});\r\n }\r\n\r\n // Checks the current URL to see if it has changed, and if it has,\r\n // calls `loadUrl`.\r\n checkUrl() {\r\n const current = this.getFragment();\r\n if (current === this.fragment) return false;\r\n this.loadUrl();\r\n }\r\n\r\n // Attempt to load the current URL fragment. If a route succeeds with a\r\n // match, returns `true`. If no defined routes matches the fragment,\r\n // returns `false`.\r\n loadUrl(fragment) {\r\n fragment = this.fragment = this.getFragment(fragment);\r\n return this.handlers.some(handler => {\r\n if (handler.route.test(fragment)) {\r\n handler.callback(fragment);\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n // Save a fragment into the hash history, or replace the URL state if the\r\n // 'replace' option is passed. You are responsible for properly URL-encoding\r\n // the fragment in advance.\r\n //\r\n // The options object can contain `trigger: true` if you wish to have the\r\n // route callback be fired (not usually desirable), or `replace: true`, if\r\n // you wish to modify the current URL without adding an entry to the history.\r\n update(fragment, options) {\r\n if (!this.started) return false;\r\n if (!options || options === true) options = {trigger: !!options};\r\n\r\n let url = this.root + (fragment = this.getFragment(fragment || ''));\r\n\r\n // Strip the hash for matching.\r\n fragment = fragment.replace(pathStripper, '');\r\n\r\n if (this.fragment === fragment) return;\r\n this.fragment = fragment;\r\n\r\n // Don't include a trailing slash on the root.\r\n if (fragment === '' && url !== '/') url = url.slice(0, -1);\r\n\r\n // If pushState is available, we use it to set the fragment as a real URL.\r\n if (this._hasPushState) {\r\n this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\r\n\r\n // If hash changes haven't been explicitly disabled, update the hash\r\n // fragment to store history.\r\n } else if (this._wantsHashChange) {\r\n this._updateHash(this.location, fragment, options.replace);\r\n // If you've told us that you explicitly don't want fallback hashchange-\r\n // based history, then `update` becomes a page refresh.\r\n } else {\r\n return this.location.assign(url);\r\n }\r\n if (options.trigger) return this.loadUrl(fragment);\r\n }\r\n\r\n // Update the hash location, either replacing the current entry, or adding\r\n // a new one to the browser history.\r\n _updateHash(location, fragment, replace) {\r\n if (replace) {\r\n const href = location.href.replace(/(javascript:|#).*$/, '');\r\n location.replace(`${href}#${fragment}`);\r\n } else {\r\n // Some browsers require that `hash` contains a leading #.\r\n location.hash = `#${fragment}`;\r\n }\r\n }\r\n\r\n // add some features to History\r\n\r\n // a generic callback for any changes\r\n onChange(callback) {\r\n this.route(/^(.*?)$/, callback);\r\n }\r\n\r\n // checks if the browser has pushstate support\r\n hasPushState() {\r\n // MODIFICATION OF ORIGINAL BACKBONE.HISTORY\r\n if (!this.started) {\r\n throw new Error(\"only available after LocationBar.start()\");\r\n }\r\n return this._hasPushState;\r\n }\r\n}\r\n\r\n// Cached regex for stripping a leading hash/slash and trailing space.\r\nconst routeStripper = /^[#\\/]|\\s+$/g;\r\n\r\n// Cached regex for stripping leading and trailing slashes.\r\nconst rootStripper = /^\\/+|\\/+$/g;\r\n\r\n// Cached regex for removing a trailing slash.\r\nconst trailingSlash = /\\/$/;\r\n\r\n// Cached regex for stripping urls of hash.\r\nconst pathStripper = /#.*$/;\r\n\r\n\r\n// export\r\nexport default History;\r\n","import { extend } from '../utils.js'\r\nimport LocationBar from './location-bar.js'\r\n\r\nclass BrowserLocation {\r\n constructor(options = {}) {\r\n this.path = options.path || ''\r\n\r\n this.options = extend(\r\n {\r\n pushState: false,\r\n root: '/',\r\n },\r\n options,\r\n )\r\n\r\n // we're using the location-bar module for actual\r\n // URL management\r\n this.locationBar = new LocationBar()\r\n this.locationBar.onChange((path) => {\r\n this.handleURL(`/${path || ''}`)\r\n })\r\n\r\n this.locationBar.start(options)\r\n }\r\n\r\n /**\r\n * Get the current URL\r\n */\r\n\r\n getURL() {\r\n return this.path\r\n }\r\n\r\n /**\r\n * Set the current URL without triggering any events\r\n * back to the router. Add a new entry in browser's history.\r\n */\r\n\r\n setURL(path, options = {}) {\r\n if (this.path !== path) {\r\n this.path = path\r\n this.locationBar.update(path, extend({ trigger: true }, options))\r\n }\r\n }\r\n\r\n /**\r\n * Set the current URL without triggering any events\r\n * back to the router. Replace the latest entry in broser's history.\r\n */\r\n\r\n replaceURL(path, options = {}) {\r\n if (this.path !== path) {\r\n this.path = path\r\n this.locationBar.update(path, extend({ trigger: true, replace: true }, options))\r\n }\r\n }\r\n\r\n /**\r\n * Setup a URL change handler\r\n * @param {Function} callback\r\n */\r\n onChange(callback) {\r\n this.changeCallback = callback\r\n }\r\n\r\n /**\r\n * Given a path, generate a URL appending root\r\n * if pushState is used and # if hash state is used\r\n */\r\n formatURL(path) {\r\n if (this.locationBar.hasPushState()) {\r\n let rootURL = this.options.root\r\n if (path !== '') {\r\n rootURL = rootURL.replace(/\\/$/, '')\r\n }\r\n return rootURL + path\r\n } else {\r\n if (path[0] === '/') {\r\n path = path.substr(1)\r\n }\r\n return `#${path}`\r\n }\r\n }\r\n\r\n /**\r\n * When we use pushState with a custom root option,\r\n * we need to take care of removingRoot at certain points.\r\n * Specifically\r\n * - browserLocation.update() can be called with the full URL by router\r\n * - LocationBar expects all .update() calls to be called without root\r\n * - this method is public so that we could dispatch URLs without root in router\r\n */\r\n removeRoot(url) {\r\n if (this.options.pushState && this.options.root && this.options.root !== '/') {\r\n return url.replace(this.options.root, '')\r\n } else {\r\n return url\r\n }\r\n }\r\n\r\n /**\r\n * Stop listening to URL changes and link clicks\r\n */\r\n destroy() {\r\n this.locationBar.stop()\r\n }\r\n\r\n /**\r\n initially, the changeCallback won't be defined yet, but that's good\r\n because we dont' want to kick off routing right away, the router\r\n does that later by manually calling this handleURL method with the\r\n url it reads of the location. But it's important this is called\r\n first by Backbone, because we wanna set a correct this.path value\r\n\r\n @private\r\n */\r\n handleURL(url) {\r\n this.path = url\r\n if (this.changeCallback) {\r\n this.changeCallback(url)\r\n }\r\n }\r\n}\r\n\r\nexport default BrowserLocation\r\n","import { extend } from '../utils.js'\r\n\r\nclass MemoryLocation {\r\n constructor({ path }) {\r\n this.path = path || ''\r\n }\r\n\r\n getURL() {\r\n return this.path\r\n }\r\n\r\n setURL(path, options) {\r\n if (this.path !== path) {\r\n this.path = path\r\n this.handleURL(this.getURL(), options)\r\n }\r\n }\r\n\r\n replaceURL(path, options) {\r\n if (this.path !== path) {\r\n this.setURL(path, options)\r\n }\r\n }\r\n\r\n onChange(callback) {\r\n this.changeCallback = callback\r\n }\r\n\r\n handleURL(url, options = {}) {\r\n this.path = url\r\n options = extend({ trigger: true }, options)\r\n if (this.changeCallback && options.trigger) {\r\n this.changeCallback(url)\r\n }\r\n }\r\n\r\n removeRoot(url) {\r\n return url\r\n }\r\n\r\n formatURL(url) {\r\n return url\r\n }\r\n}\r\n\r\nexport default MemoryLocation\r\n","export const TRANSITION_REDIRECTED = 'TransitionRedirected'\r\n\r\nexport const TRANSITION_CANCELLED = 'TransitionCancelled'\r\n","import { clone } from './utils.js'\r\nimport invariant from './invariant.js'\r\nimport { TRANSITION_CANCELLED, TRANSITION_REDIRECTED } from './constants.js'\r\n\r\n/**\r\n * @typedef {import(\"./router.js\").Route} Route\r\n */\r\n\r\n/**\r\n * @typedef {Pick<Transition, 'routes' | 'pathname' | 'path' | 'params' | 'query' >} TransitionData\r\n */\r\n\r\n/**\r\n * @typedef Transition\r\n * @property {Route[]} routes\r\n * @property {string} pathname\r\n * @property {string} path\r\n * @property {Object} params\r\n * @property {Object} query\r\n * @property {TransitionData} prev\r\n * @property {(name: string, params?: any, query?: any) => Transition} redirectTo\r\n * @property {(name: string, params?: any, query?: any) => Transition} retry\r\n * @property {(error: string | Error) => void} cancel\r\n * @property {() => Promise<any>} followRedirects\r\n * @property {function} then\r\n * @property {function} catch\r\n * @property {boolean} noop\r\n * @property {boolean} isCancelled\r\n */\r\n\r\n/**\r\n * @param {*} router\r\n * @param {Transition} transition\r\n * @param {*} err\r\n */\r\nfunction runError(router, transition, err) {\r\n router.middleware.forEach((m) => {\r\n m.error && m.error(transition, err)\r\n })\r\n}\r\n\r\n/**\r\n * @export\r\n * @param {*} options\r\n * @return {Transition}\r\n */\r\nexport default function transition(options) {\r\n options = options || {}\r\n\r\n const router = options.router\r\n const log = router.log\r\n const logError = router.logError\r\n\r\n const path = options.path\r\n const match = options.match\r\n const routes = match.routes\r\n const params = match.params\r\n const pathname = match.pathname\r\n const query = match.query\r\n\r\n const id = options.id\r\n const startTime = Date.now()\r\n log('---')\r\n log('Transition #' + id, 'to', path)\r\n log(\r\n 'Transition #' + id,\r\n 'routes:',\r\n routes.map((r) => r.name),\r\n )\r\n log('Transition #' + id, 'params:', params)\r\n log('Transition #' + id, 'query:', query)\r\n\r\n // create the transition promise\r\n let resolve, reject\r\n const promise = new Promise(function (res, rej) {\r\n resolve = res\r\n reject = rej\r\n })\r\n\r\n // 1. make transition errors loud\r\n // 2. by adding this handler we make sure\r\n // we don't trigger the default 'Potentially\r\n // unhandled rejection' for cancellations\r\n promise\r\n .then(function () {\r\n log('Transition #' + id, 'completed in', Date.now() - startTime + 'ms')\r\n })\r\n .catch(function (err) {\r\n if (err.type !== TRANSITION_REDIRECTED && err.type !== TRANSITION_CANCELLED) {\r\n log('Transition #' + id, 'FAILED')\r\n logError(err)\r\n }\r\n })\r\n\r\n let cancelled = false\r\n\r\n const transition = {\r\n id,\r\n prev: {\r\n routes: clone(router.state.routes) || [],\r\n path: router.state.path || '',\r\n pathname: router.state.pathname || '',\r\n params: clone(router.state.params) || {},\r\n query: clone(router.state.query) || {},\r\n },\r\n routes: clone(routes),\r\n path,\r\n pathname,\r\n params: clone(params),\r\n query: clone(query),\r\n redirectTo: function (...args) {\r\n return router.transitionTo(...args)\r\n },\r\n retry: function () {\r\n return router.transitionTo(path)\r\n },\r\n cancel: function (err) {\r\n if (router.state.activeTransition !== transition) {\r\n return\r\n }\r\n\r\n if (transition.isCancelled) {\r\n return\r\n }\r\n\r\n router.state.activeTransition = null\r\n transition.isCancelled = true\r\n cancelled = true\r\n\r\n if (!err) {\r\n err = new Error(TRANSITION_CANCELLED)\r\n err.type = TRANSITION_CANCELLED\r\n }\r\n if (err.type === TRANSITION_CANCELLED) {\r\n log('Transition #' + id, 'cancelled')\r\n }\r\n if (err.type === TRANSITION_REDIRECTED) {\r\n log('Transition #' + id, 'redirected')\r\n }\r\n\r\n router.middleware.forEach((m) => {\r\n m.cancel && m.cancel(transition, err)\r\n })\r\n reject(err)\r\n },\r\n followRedirects: function () {\r\n return promise.catch(function (reason) {\r\n if (router.state.activeTransition) {\r\n return router.state.activeTransition.followRedirects()\r\n }\r\n return Promise.reject(reason)\r\n })\r\n },\r\n\r\n then: promise.then.bind(promise),\r\n catch: promise.catch.bind(promise),\r\n }\r\n\r\n router.middleware.forEach((m) => {\r\n m.before && m.before(transition)\r\n })\r\n\r\n // here we handle calls to all of the middlewares\r\n function callNext(i, prevResult) {\r\n let middleware\r\n let middlewareName\r\n // if transition has been cancelled - nothing left to do\r\n if (cancelled) {\r\n return\r\n }\r\n // done\r\n if (i < router.middleware.length) {\r\n middleware = router.middleware[i]\r\n middlewareName = middleware.name || 'anonymous'\r\n log('Transition #' + id, 'resolving middleware:', middlewareName)\r\n let middlewarePromise\r\n try {\r\n middlewarePromise = middleware.resolve\r\n ? middleware.resolve(transition, prevResult)\r\n : prevResult\r\n invariant(\r\n transition !== middlewarePromise,\r\n 'Middleware %s returned a transition which resulted in a deadlock',\r\n middlewareName,\r\n )\r\n } catch (err) {\r\n router.state.activeTransition = null\r\n runError(router, transition, err)\r\n return reject(err)\r\n }\r\n Promise.resolve(middlewarePromise)\r\n .then(function (result) {\r\n callNext(i + 1, result)\r\n })\r\n .catch(function (err) {\r\n log('Transition #' + id, 'resolving middleware:', middlewareName, 'FAILED')\r\n router.state.activeTransition = null\r\n runError(router, transition, err)\r\n reject(err)\r\n })\r\n } else {\r\n router.state = {\r\n activeTransition: null,\r\n routes,\r\n path,\r\n pathname,\r\n params,\r\n query,\r\n }\r\n router.middleware.forEach((m) => {\r\n m.done && m.done(transition)\r\n })\r\n resolve()\r\n }\r\n }\r\n\r\n if (!options.noop) {\r\n Promise.resolve().then(() => callNext(0))\r\n } else {\r\n resolve()\r\n }\r\n\r\n if (options.noop) {\r\n transition.noop = true\r\n }\r\n\r\n return transition\r\n}\r\n","import { bindEvent, unbindEvent } from './events.js'\r\n\r\n/**\r\n * Handle link delegation on `el` or the document,\r\n * and invoke `fn(e)` when clickable.\r\n *\r\n * @param {Element} el\r\n * @param {(e: Event, el: HTMLElement) => void} fn\r\n * @return {Function} dispose\r\n * @api public\r\n */\r\n\r\nexport function intercept(el, fn) {\r\n const cb = delegate(el, 'click', function (e, el) {\r\n if (clickable(e, el)) fn(e, el)\r\n })\r\n\r\n return function dispose() {\r\n unbindEvent(el, 'click', cb)\r\n }\r\n}\r\n\r\n/**\r\n * Delegate event `type` to links\r\n * and invoke `fn(e)`. A callback function\r\n * is returned which may be passed to `.unbind()`.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {String} selector\r\n * @param {String} type\r\n * @param {(e: Event, el: HTMLElement) => void} fn\r\n * @return {Function}\r\n * @api public\r\n */\r\n\r\nfunction delegate(el, type, fn) {\r\n return bindEvent(el, type, function (e) {\r\n const el = e.target.closest('a')\r\n if (el) {\r\n fn(e, el)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Check if `e` is clickable.\r\n */\r\n\r\n/**\r\n * @param {Event} e\r\n * @param {HTMLElement} el\r\n * @return {Boolean | undefined}\r\n */\r\nfunction clickable(e, el) {\r\n if (which(e) !== 1) return\r\n if (e.metaKey || e.ctrlKey || e.shiftKey) return\r\n if (e.defaultPrevented) return\r\n\r\n // check target\r\n if (el.target) return\r\n\r\n // check for data-bypass attribute\r\n if (el.getAttribute('data-bypass') !== null) return\r\n\r\n // inspect the href\r\n const href = el.getAttribute('href')\r\n if (!href || href.length === 0) return\r\n\r\n // don't handle hash links, external/absolute links, email links and javascript links\r\n if (/^(#|https{0,1}:\\/\\/|mailto|javascript:)/i.test(href)) return\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Event button.\r\n */\r\n\r\nfunction which(e) {\r\n e = e || window.event\r\n return e.which === null ? e.button : e.which\r\n}\r\n","export default function defineLogger(router, method, fn) {\r\n if (fn === true) return\r\n router[method] = typeof fn === 'function' ? fn : () => {}\r\n}\r\n","export default {\r\n parse(querystring) {\r\n return querystring.split('&').reduce((acc, pair) => {\r\n const parts = pair.split('=')\r\n acc[parts[0]] = decodeURIComponent(parts[1])\r\n return acc\r\n }, {})\r\n },\r\n\r\n stringify(params) {\r\n return Object.keys(params)\r\n .reduce((acc, key) => {\r\n if (params[key] !== undefined) {\r\n acc.push(key + '=' + encodeURIComponent(params[key]))\r\n }\r\n return acc\r\n }, [])\r\n .join('&')\r\n },\r\n}\r\n","/**\n * @param {string|RegExp} input The route pattern\n * @param {boolean} [loose] Allow open-ended matching. Ignored with `RegExp` input.\n */\nexport function parse(input, loose) {\n\tif (input instanceof RegExp) return { keys:false, pattern:input };\n\tvar c, o, tmp, ext, keys=[], pattern='', arr = input.split('/');\n\tarr[0] || arr.shift();\n\n\twhile (tmp = arr.shift()) {\n\t\tc = tmp[0];\n\t\tif (c === '*') {\n\t\t\tkeys.push(c);\n\t\t\tpattern += tmp[1] === '?' ? '(?:/(.*))?' : '/(.*)';\n\t\t} else if (c === ':') {\n\t\t\to = tmp.indexOf('?', 1);\n\t\t\text = tmp.indexOf('.', 1);\n\t\t\tkeys.push( tmp.substring(1, !!~o ? o : !!~ext ? ext : tmp.length) );\n\t\t\tpattern += !!~o && !~ext ? '(?:/([^/]+?))?' : '/([^/]+?)';\n\t\t\tif (!!~ext) pattern += (!!~o ? '?' : '') + '\\\\' + tmp.substring(ext);\n\t\t} else {\n\t\t\tpattern += '/' + tmp;\n\t\t}\n\t}\n\n\treturn {\n\t\tkeys: keys,\n\t\tpattern: new RegExp('^' + pattern + (loose ? '(?=$|\\/)' : '\\/?$'), 'i')\n\t};\n}\n\nvar RGX = /(\\/|^)([:*][^/]*?)(\\?)?(?=[/.]|$)/g;\n\n// error if key missing?\nexport function inject(route, values) {\n\treturn route.replace(RGX, (x, lead, key, optional) => {\n\t\tx = values[key=='*' ? key : key.substring(1)];\n\t\treturn x ? '/'+x : (optional || key=='*') ? '' : '/' + key;\n\t});\n}\n","import { parse } from 'regexparam'\r\n\r\nconst splatRegex = /:(\\w+)\\*/\r\n\r\nexport function patternCompiler(pattern) {\r\n // hack to add (partial) named splat support\r\n const splatMatch = splatRegex.exec(pattern)\r\n const normalizedPattern = splatMatch ? pattern.replace(splatRegex, '*') : pattern\r\n\r\n const { pattern: matcher, keys } = parse(normalizedPattern)\r\n\r\n const paramNames = splatMatch ? keys.map((key) => (key === '*' ? splatMatch[1] : key)) : keys\r\n\r\n return {\r\n matcher,\r\n paramNames,\r\n }\r\n}\r\n","/* eslint-disable array-callback-return */\r\nimport { pick, clone, extend, isEqual, keys } from './utils.js'\r\nimport functionDsl from './function-dsl.js'\r\nimport arrayDsl from './array-dsl.js'\r\nimport {\r\n withQuery,\r\n withoutQuery,\r\n injectParams,\r\n extractParams,\r\n extractParamNames,\r\n extractQuery,\r\n} from './path.js'\r\nimport invariant from './invariant.js'\r\nimport BrowserLocation from './locations/browser.js'\r\nimport MemoryLocation from './locations/memory.js'\r\nimport transition from './transition.js'\r\nimport { intercept } from './links.js'\r\nimport defineLogger from './logger.js'\r\nimport qs from './qs.js'\r\nimport { patternCompiler } from './patternCompiler.js'\r\nimport { TRANSITION_CANCELLED, TRANSITION_REDIRECTED } from './constants.js'\r\n\r\n/**\r\n * @typedef {import('./function-dsl.js').routeCallback} routeCallback\r\n * @typedef {import('./array-dsl.js').RouteDef} RouteDef\r\n * @typedef {import('./transition.js').Transition} Transition\r\n *\r\n * @typedef Route\r\n * @property {String} name\r\n * @property {String} path\r\n * @property {Object} options\r\n * @property {Route[]} routes\r\n *\r\n\r\n * @typedef {Object | 'browser' | 'memory'} LocationParam\r\n *\r\n *\r\n * @typedef RouterOptions\r\n * @property {routeCallback | RouteDef[]} [routes]\r\n * @property {LocationParam} [location]\r\n * @property {Boolean} [logError]\r\n * @property {Object} [qs]\r\n * @property {Object} [patternCompiler]\r\n *\r\n */\r\n\r\nclass Router {\r\n /**\r\n * @param {RouterOptions} [options]\r\n */\r\n constructor(options = {}) {\r\n this.nextId = 1\r\n this.state = {}\r\n this.middleware = []\r\n this.options = extend(\r\n {\r\n location: 'browser',\r\n logError: true,\r\n qs,\r\n patternCompiler,\r\n },\r\n options,\r\n )\r\n defineLogger(this, 'log', this.options.log)\r\n defineLogger(this, 'logError', this.options.logError)\r\n if (options.routes) {\r\n this.map(options.routes)\r\n }\r\n }\r\n\r\n /**\r\n * Add a middleware\r\n * @param {Function} middleware\r\n * @return {Router}\r\n * @api public\r\n */\r\n use(middleware, options = {}) {\r\n const m = typeof middleware === 'function' ? { resolve: middleware } : middleware\r\n typeof options.at === 'number'\r\n ? this.middleware.splice(options.at, 0, m)\r\n : this.middleware.push(m)\r\n m.create && m.create(this)\r\n return this\r\n }\r\n\r\n /**\r\n * Add the route map\r\n * @param {routeCallback | RouteDef[]} routes\r\n * @return {Router}\r\n * @api public\r\n */\r\n map(routes) {\r\n // create the route tree\r\n this.routes = Array.isArray(routes) ? arrayDsl(routes) : functionDsl(routes)\r\n\r\n // create the matcher list, which is like a flattened\r\n // list of routes = a list of all branches of the route tree\r\n const matchers = (this.matchers = [])\r\n // keep track of whether duplicate paths have been created,\r\n // in which case we'll warn the dev\r\n const dupes = {}\r\n // keep track of abstract routes to build index route forwarding\r\n const abstracts = {}\r\n\r\n eachBranch({ routes: this.routes }, [], (routes) => {\r\n // concatenate the paths of the list of routes\r\n let path = routes.reduce(\r\n (\r\n memo,\r\n r, // reset if there's a leading slash, otherwise concat\r\n ) =>\r\n // and keep resetting the trailing slash\r\n (r.path[0] === '/' ? r.path : `${memo}/${r.path}`).replace(/\\/$/, ''),\r\n '',\r\n )\r\n // ensure we have a leading slash\r\n if (path === '') {\r\n path = '/'\r\n }\r\n\r\n const lastRoute = routes[routes.length - 1]\r\n\r\n if (lastRoute.options.abstract) {\r\n abstracts[path] = lastRoute.name\r\n return\r\n }\r\n\r\n if (lastRoute.path === '') {\r\n let matcher\r\n matchers.some((m) => {\r\n if (m.path === path) {\r\n matcher = m\r\n return true\r\n }\r\n })\r\n\r\n if (matcher) {\r\n // remap the matcher of a parent route\r\n matcher.routes = routes\r\n } else if (abstracts[path]) {\r\n matchers.push({\r\n routes,\r\n name: abstracts[path],\r\n path,\r\n })\r\n }\r\n }\r\n\r\n // register routes\r\n matchers.push({\r\n routes,\r\n name: lastRoute.name,\r\n path,\r\n })\r\n\r\n // dupe detection\r\n if (dupes[path] && lastRoute.path !== '') {\r\n throw new Error(\r\n `Routes ${dupes[path]} and ${lastRoute.name} have the same url path '${path}'`,\r\n )\r\n }\r\n dupes[path] = lastRoute.name\r\n })\r\n\r\n function eachBranch(node, memo, fn) {\r\n node.routes.forEach((route) => {\r\n fn(memo.concat(route))\r\n\r\n if (route.routes.length) {\r\n eachBranch(route, memo.concat(route), fn)\r\n }\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * Starts listening to the location changes.\r\n * @param {String} [path]\r\n * @return {Transition} initial transition\r\n *\r\n * @api public\r\n */\r\n listen(path) {\r\n const location = (this.location = this.createLocation(path || ''))\r\n // setup the location onChange handler\r\n location.onChange((url) => {\r\n const previousUrl = this.state.path\r\n this.dispatch(url).catch((err) => {\r\n if (err && err.type === TRANSITION_CANCELLED) {\r\n // reset the URL in case the transition has been cancelled\r\n this.location.replaceURL(previousUrl, { trigger: false })\r\n }\r\n return err\r\n })\r\n })\r\n // and also kick off the initial transition\r\n return this.dispatch(location.getURL())\r\n }\r\n\r\n /**\r\n * Transition to a different route. Passe in url or a route name followed by params and query\r\n * @param {String} name url or route name\r\n * @param {Object} [params] Optional\r\n * @param {Object} [query] Optional\r\n * @return {Transition} transition\r\n *\r\n * @api public\r\n */\r\n transitionTo(name, params, query) {\r\n if (this.state.activeTransition) {\r\n return this.replaceWith(name, params, query)\r\n }\r\n return this.doTransition('setURL', name, params, query)\r\n }\r\n\r\n /**\r\n * Like transitionTo, but doesn't leave an entry in the browser's history,\r\n * so clicking back will skip this route\r\n * @param {String} name url or route name followed by params and query\r\n * @param {Record<string, any>} [params]\r\n * @param {Record<string, any>} [query]\r\n * @return {Transition} transition\r\n *\r\n * @api public\r\n */\r\n replaceWith(name, params, query) {\r\n return this.doTransition('replaceURL', name, params, query)\r\n }\r\n\r\n /**\r\n * Create an href\r\n * @param {String} name target route name\r\n * @param {Object} [params]\r\n * @param {Object} [query]\r\n * @return {String} href\r\n *\r\n * @api public\r\n */\r\n generate(name, params, query) {\r\n invariant(this.location, 'call .listen() before using .generate()')\r\n let matcher\r\n\r\n query = query || {}\r\n\r\n this.matchers.forEach((m) => {\r\n if (m.name === name) {\r\n matcher = m\r\n }\r\n })\r\n\r\n if (!matcher) {\r\n throw new Error(`No route is named ${name}`)\r\n }\r\n\r\n const url = withQuery(this.options.qs, injectParams(matcher.path, params), query)\r\n return this.location.formatURL(url)\r\n }\r\n\r\n /**\r\n * Stop listening to URL changes\r\n * @api public\r\n */\r\n destroy() {\r\n if (this.location && this.location.destroy) {\r\n this.location.destroy()\r\n }\r\n if (this.state.activeTransition) {\r\n this.state.activeTransition.cancel()\r\n }\r\n this.state = {}\r\n this.middleware.forEach((m) => {\r\n m.destroy && m.destroy(this)\r\n })\r\n }\r\n\r\n /**\r\n * Check if the given route/params/query combo is active\r\n * @param {String} name target route name\r\n * @param {Record<string, any>} [params]\r\n * @param {Record<string, any>} [query]\r\n * @param {Boolean} [exact]\r\n * @return {Boolean}\r\n *\r\n * @api public\r\n */\r\n isActive(name, params, query, exact) {\r\n const activeRoutes = this.state.routes || []\r\n const activeParams = this.state.params\r\n const activeQuery = this.state.query\r\n\r\n let isActive =\r\n activeRoutes.some((route) => route.name === name) &&\r\n (!exact || activeRoutes[activeRoutes.length - 1].name === name)\r\n isActive =\r\n isActive && (!params || keys(params).every((key) => activeParams[key] === params[key]))\r\n isActive = isActive && (!query || keys(query).every((key) => activeQuery[key] === query[key]))\r\n\r\n return isActive\r\n }\r\n\r\n /**\r\n * @api private\r\n * @param {String} method pushState or replaceState\r\n * @param {String} name target route name\r\n * @param {Object} [params]\r\n * @param {Object} [query]\r\n * @return {Transition} transition\r\n */\r\n doTransition(method, name, params, query) {\r\n const previousUrl = this.location.getURL()\r\n\r\n let url = name\r\n if (url[0] !== '/') {\r\n url = this.generate(name, params, query)\r\n url = url.replace(/^#/, '/')\r\n }\r\n\r\n if (this.options.pushState) {\r\n url = this.location.removeRoot(url)\r\n }\r\n\r\n const transition = this.dispatch(url)\r\n\r\n transition.catch((err) => {\r\n if (err && err.type === TRANSITION_CANCELLED) {\r\n // reset the URL in case the transition has been cancelled\r\n this.location.replaceURL(previousUrl, { trigger: false })\r\n }\r\n return err\r\n })\r\n\r\n this.location[method](url, { trigger: false })\r\n\r\n return transition\r\n }\r\n\r\n /**\r\n * Match the path against the routes\r\n * @param {String} path\r\n * @return {Object} the list of matching routes and params\r\n *\r\n * @api private\r\n */\r\n match(path) {\r\n path = (path || '').replace(/\\/$/, '') || '/'\r\n let params\r\n let routes = []\r\n const pathWithoutQuery = withoutQuery(path)\r\n const { qs, patternCompiler } = this.options\r\n this.matchers.some((matcher) => {\r\n params = extractParams(matcher.path, pathWithoutQuery, patternCompiler)\r\n if (params) {\r\n routes = matcher.routes\r\n return true\r\n }\r\n })\r\n return {\r\n routes: routes.map(descriptor),\r\n params: params || {},\r\n pathname: pathWithoutQuery,\r\n query: extractQuery(qs, path) || {},\r\n }\r\n\r\n // clone the data (only a shallow clone of options)\r\n // to make sure the internal route store is not mutated\r\n // by the middleware. The middleware can mutate data\r\n // before it gets passed into the resolve middleware, but\r\n // only within the same transition. New transitions\r\n // will get to use pristine data.\r\n function descriptor(route) {\r\n return {\r\n name: route.name,\r\n path: route.path,\r\n params: pick(params, extractParamNames(route.path, patternCompiler)),\r\n options: clone(route.options),\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param {string} path\r\n * @returns {Transition}\r\n */\r\n dispatch(path) {\r\n const match = this.match(path)\r\n const query = match.query\r\n const pathname = match.pathname\r\n\r\n const activeTransition = this.state.activeTransition\r\n\r\n // if we already have an active transition with all the same\r\n // params - return that and don't do anything else\r\n if (\r\n activeTransition &&\r\n activeTransition.pathname === pathname &&\r\n isEqual(activeTransition.query, query)\r\n ) {\r\n return activeTransition\r\n }\r\n\r\n // otherwise, cancel the active transition since we're\r\n // redirecting (or initiating a brand new transition)\r\n if (activeTransition) {\r\n const err = new Error(TRANSITION_REDIRECTED)\r\n err.type = TRANSITION_REDIRECTED\r\n err.nextPath = path\r\n activeTransition.cancel(err)\r\n }\r\n\r\n // if there is no active transition, check if\r\n // this is a noop transition, in which case, return\r\n // a transition to respect the function signature,\r\n // but don't actually run any of the middleware\r\n if (!activeTransition) {\r\n if (this.state.pathname === pathname && isEqual(this.state.query, query)) {\r\n return transition({\r\n id: this.nextId++,\r\n path,\r\n match,\r\n noop: true,\r\n router: this,\r\n })\r\n }\r\n }\r\n\r\n const t = transition({\r\n id: this.nextId++,\r\n path,\r\n match,\r\n router: this,\r\n })\r\n\r\n this.state.activeTransition = t\r\n\r\n return t\r\n }\r\n\r\n /**\r\n * Create the default location.\r\n * This is used when no custom location is passed to\r\n * the listen call.\r\n * @param {LocationParam} path\r\n * @return {Object} location\r\n *\r\n * @api private\r\n */\r\n createLocation(path) {\r\n const location = this.options.location\r\n if (typeof location !== 'string') {\r\n return location\r\n }\r\n if (location === 'browser') {\r\n return new BrowserLocation(pick(this.options, ['pushState', 'root']))\r\n } else if (location === 'memory') {\r\n return new MemoryLocation({ path })\r\n } else {\r\n throw new Error('Location can be `browser`, `memory` or a custom implementation')\r\n }\r\n }\r\n\r\n log(...args) {\r\n console.info(...args)\r\n }\r\n\r\n logError(...args) {\r\n console.error(...args)\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param {Event} event\r\n * @param {HTMLAnchorElement} link\r\n * @param {Router} router\r\n */\r\nfunction defaultClickHandler(event, link, router) {\r\n event.preventDefault()\r\n router.transitionTo(router.location.removeRoot(link.getAttribute('href')))\r\n}\r\n\r\n/**\r\n * @description Helper to intercept links when using pushState but server is not configured for it\r\n * Link clicks are handled via the router avoiding browser page reload\r\n * @param {Router} router\r\n * @param {HTMLElement} el\r\n * @param {(e: Event, link: HTMLAnchorElement, router: Router) => void} clickHandler\r\n * @returns {Function} dispose\r\n */\r\nfunction interceptLinks(router, el = document, clickHandler = defaultClickHandler) {\r\n return intercept(el, (event, link) => clickHandler(event, link, router))\r\n}\r\n\r\nexport { Router, interceptLinks }\r\n","const resolved = Promise.resolve()\r\nlet routeElMap = Object.create(null)\r\nlet routeComponentMap = Object.create(null)\r\nlet routePropertiesMap = Object.create(null)\r\n\r\nlet router, rootOutlet, rootOutletEl\r\n\r\n/**\r\n * @typedef {import(\"../transition.js\").Transition} Transition\r\n *\r\n * @typedef WCRouteDef\r\n * @property {string} name\r\n * @property {string} path\r\n * @property {string | Function} component\r\n * @property {Object.<string, PropertyHook | PropertyHook[]>} [properties]\r\n * @property {boolean} [reuse]\r\n * @property {function(Transition): Promise<boolean> | boolean} [beforeEnter]\r\n * @property {function(Transition): Promise<boolean> | boolean} [beforeLeave]\r\n * @property {function(Transition): Promise<void> | void} [afterEnter]\r\n * @property {function(Transition): Promise<void> | void} [afterLeave]\r\n */\r\n\r\n/**\r\n * @callback PropertySetter\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n\r\n/**\r\n * @typedef PropertyHook\r\n * @property {function(PropertySetter): void} [init]\r\n * @property {function(Transition, PropertySetter): void} [enter]\r\n * @property {function(Transition, PropertySetter): void} [leave]\r\n * @property {function(*, HTMLElement): void} [update]\r\n */\r\n\r\n/**\r\n * @param {*} value\r\n * @return {*}\r\n */\r\nfunction parseNumber(value) {\r\n const n = parseFloat(value)\r\n const isNumeric = value == n // eslint-disable-line eqeqeq\r\n return isNumeric ? n : value\r\n}\r\n\r\nfunction getFormattedValue(value, format) {\r\n let v = value\r\n if (v !== undefined) {\r\n if (format === 'number') {\r\n v = parseNumber(value)\r\n } else if (typeof format === 'function') {\r\n v = format(value)\r\n }\r\n }\r\n return v\r\n}\r\n\r\n/**\r\n * @param {*} value\r\n * @returns {PropertyHook}\r\n */\r\nexport function fromValue(value) {\r\n return {\r\n init(setValue) {\r\n setValue(value)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @param {string} key\r\n * @param {string | Function} [format]\r\n * @returns {PropertyHook}\r\n */\r\nexport function fromQuery(queryKey, format) {\r\n return {\r\n enter(transition, setValue) {\r\n setValue(transition.query[queryKey], format)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} paramKey\r\n * @param {string | Function} format\r\n * @returns {PropertyHook}\r\n */\r\nexport function fromParam(paramKey, format) {\r\n return {\r\n enter(transition, setValue) {\r\n setValue(transition.params[paramKey], format)\r\n },\r\n }\r\n}\r\n\r\nexport function getRouteEl(route) {\r\n return routeElMap[route.name]\r\n}\r\n\r\nfunction create(instance) {\r\n router = instance\r\n rootOutlet = instance.options.outlet\r\n}\r\n\r\nfunction destroy() {\r\n router = null\r\n routeElMap = Object.create(null)\r\n routeComponentMap = Object.create(null)\r\n routePropertiesMap = Object.create(null)\r\n rootOutletEl = null\r\n}\r\n\r\nfunction isEqual(obj1, obj2) {\r\n const keys1 = Object.keys(obj1)\r\n return keys1.length === Object.keys(obj2).length && keys1.every((key) => obj2[key] === obj1[key])\r\n}\r\n\r\nfunction getOutlet(el) {\r\n const renderRoot = el.shadowRoot || el\r\n return renderRoot.querySelector(el.constructor.outlet || 'router-outlet')\r\n}\r\n\r\nfunction resolveRootOutlet() {\r\n if (rootOutletEl) return rootOutletEl\r\n if (!rootOutlet) return document.body\r\n rootOutletEl = typeof rootOutlet === 'string' ? document.querySelector(rootOutlet) : rootOutlet\r\n if (!rootOutletEl) {\r\n throw new Error(`slick-router(wc): Invalid outlet option ${rootOutlet}`)\r\n }\r\n return rootOutletEl\r\n}\r\n\r\nfunction getParentEl(transition, parentIndex) {\r\n let parent = transition.routes[parentIndex]\r\n while (parent) {\r\n if (parent.options.component) {\r\n return routeElMap[parent.name]\r\n }\r\n parent = transition.routes[--parentIndex]\r\n }\r\n}\r\n\r\nfunction getChangingIndex(prevRoutes, currentRoutes) {\r\n let index, prev, current\r\n const count = Math.max(prevRoutes.length, currentRoutes.length)\r\n for (index = 0; index < count; index++) {\r\n prev = prevRoutes[index]\r\n current = currentRoutes[index]\r\n if (!(prev && current) || prev.name !== current.name || !isEqual(prev.params, current.params)) {\r\n break\r\n }\r\n }\r\n return index\r\n}\r\n\r\nfunction runPropertyHookMethod(transition, routes, method) {\r\n for (let i = 0; i < routes.length; i++) {\r\n const { route } = routes[i]\r\n const propertiesData = routePropertiesMap[route.name]\r\n for (const { hooks, set } of Object.values(propertiesData)) {\r\n hooks.forEach((hook) => {\r\n if (typeof hook[method] === 'function') {\r\n hook[method](transition, set)\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\nasync function runLifeCycle(transition, routes, prefix, suffix) {\r\n for (let i = 0; i < routes.length; i++) {\r\n let result\r\n const { route, el } = routes[i]\r\n const routeMethod = route.options[`${prefix}${suffix}`]\r\n if (typeof routeMethod === 'function') {\r\n result = await routeMethod(transition)\r\n if (result === false) {\r\n transition.cancel()\r\n }\r\n }\r\n if (transition.isCancelled) break\r\n const elMethod = el && el[`${prefix}Route${suffix}`]\r\n if (typeof elMethod === 'function') {\r\n result = await elMethod.call(el, transition)\r\n if (result === false) {\r\n transition.cancel()\r\n }\r\n }\r\n if (transition.isCancelled) break\r\n }\r\n}\r\n\r\nfunction resolveModule(value) {\r\n return value && value.__esModule ? value.default : value\r\n}\r\n\r\nfunction initPropertyHook(value) {\r\n if (value && typeof value === 'object') return value\r\n return fromValue(value)\r\n}\r\n\r\nfunction initProperties(route) {\r\n let propertiesData = routePropertiesMap[route.name]\r\n if (!propertiesData) {\r\n propertiesData = routePropertiesMap[route.name] = Object.create(null)\r\n const properties = route.options.properties\r\n if (properties) {\r\n for (const [name, hookOrValue] of Object.entries(properties)) {\r\n const hooks = Array.isArray(hookOrValue)\r\n ? hookOrValue.map(initPropertyHook)\r\n : [initPropertyHook(hookOrValue)]\r\n\r\n const set = (v, format) => {\r\n const propertyData = propertiesData[name]\r\n const newValue = getFormattedValue(v, format)\r\n if (propertyData.value === newValue) return\r\n propertyData.value = newValue\r\n const el = routeElMap[route.name]\r\n if (el) {\r\n el[name] = newValue\r\n }\r\n hooks.forEach((hook) => {\r\n if (typeof hook.update === 'function') {\r\n hook.update(newValue, el)\r\n }\r\n })\r\n }\r\n propertiesData[name] = { hooks, set }\r\n hooks.forEach((hook) => {\r\n if (typeof hook.init === 'function') {\r\n hook.init(set)\r\n }\r\n })\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function resolveRoutes(routes) {\r\n const result = []\r\n\r\n for (const route of routes) {\r\n let el = route.options.reuse ? routeElMap[route.name] : undefined\r\n let Component = route.options.component\r\n if (!el && Component) {\r\n if (typeof Component === 'function' && !(Component.prototype instanceof HTMLElement)) {\r\n Component =\r\n routeComponentMap[route.name] ||\r\n (routeComponentMap[route.name] = resolveModule(await Component(route)))\r\n }\r\n el = typeof Component === 'string' ? document.createElement(Component) : new Component()\r\n routeElMap[route.name] = el\r\n el.$router = router\r\n }\r\n\r\n initProperties(route)\r\n\r\n result.push({ el, route })\r\n }\r\n return result\r\n}\r\n\r\nfunction applyProperties(el, route) {\r\n const propertiesData = routePropertiesMap[route.name]\r\n Object.entries(propertiesData).forEach(([name, { value }]) => {\r\n el[name] = value\r\n })\r\n}\r\n\r\nconst removedEls = new WeakSet()\r\nconst outletCurrentEl = new WeakMap()\r\n\r\nasync function renderElements(transition, activated, changingIndex) {\r\n // set properties of not activated elements\r\n const { path, pathname, routes, params, query } = transition\r\n const routeState = { path, pathname, routes, params, query }\r\n for (let k = 0; k < changingIndex; k++) {\r\n const route = transition.routes[k]\r\n const el = routeElMap[route.name]\r\n if (el) {\r\n el.$route = routeState\r\n applyProperties(el, route)\r\n }\r\n }\r\n for (let i = 0; i < activated.length; i++) {\r\n const { el, route } = activated[i]\r\n if (el) {\r\n const parentEl = getParentEl(transition, changingIndex + i - 1)\r\n const outletEl = parentEl ? getOutlet(parentEl) : resolveRootOutlet()\r\n if (outletEl) {\r\n const currentEl = outletCurrentEl.get(outletEl) || outletEl.firstElementChild\r\n if (currentEl) {\r\n outletEl.removeChild(currentEl)\r\n removedEls.add(currentEl)\r\n }\r\n el.$route = routeState\r\n applyProperties(el, route)\r\n outletEl.appendChild(el)\r\n outletCurrentEl.set(outletEl, el)\r\n await (el.updateComplete || resolved)\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction updateDOMTree(activated, deactivated) {\r\n let parentElRemoved\r\n for (let routeIndex = deactivated.length - 1; routeIndex >= 0; routeIndex--) {\r\n const { route, el } = deactivated[routeIndex]\r\n if (!activated.some(({ route: activeRoute }) => activeRoute.name === route.name)) {\r\n if (el) {\r\n // removes only the parent el from the deactivated els\r\n // and don't remove elements that were queued to be removed\r\n // necessary for lazy removal done in animations\r\n if (!parentElRemoved && !removedEls.has(el)) el.remove()\r\n parentElRemoved = true\r\n }\r\n routeElMap[route.name] = undefined\r\n }\r\n }\r\n}\r\n\r\nasync function resolve(transition) {\r\n const prevRoutes = transition.prev.routes\r\n const changingIndex = getChangingIndex(prevRoutes, transition.routes)\r\n const deactivated = []\r\n\r\n // deactivate previous routes from child to parent\r\n for (let routeIndex = prevRoutes.length - 1; routeIndex >= changingIndex; routeIndex--) {\r\n const route = prevRoutes[routeIndex]\r\n deactivated.push({ el: routeElMap[route.name], route })\r\n }\r\n\r\n await runLifeCycle(transition, deactivated, 'before', 'Leave')\r\n\r\n if (transition.isCancelled) return\r\n\r\n const activated = await resolveRoutes(transition.routes.slice(changingIndex))\r\n\r\n await runLifeCycle(transition, activated, 'before', 'Enter')\r\n\r\n if (transition.isCancelled) return\r\n\r\n runPropertyHookMethod(transition, activated, 'enter')\r\n\r\n await renderElements(transition, activated, changingIndex)\r\n\r\n updateDOMTree(activated, deactivated)\r\n\r\n transition.activated = activated\r\n transition.deactivated = deactivated\r\n}\r\n\r\nfunction done(transition) {\r\n runPropertyHookMethod(transition, transition.deactivated, 'leave')\r\n runLifeCycle(transition, transition.deactivated, 'after', 'Leave')\r\n runLifeCycle(transition, transition.activated, 'after', 'Enter')\r\n}\r\n\r\nexport const wc = {\r\n create,\r\n destroy,\r\n resolve,\r\n done,\r\n}\r\n","import { Router as CoreRouter, interceptLinks } from './router.js'\r\nimport { wc, fromParam, fromQuery, fromValue, getRouteEl } from './middlewares/wc.js'\r\nimport { routerLinks } from './middlewares/router-links.js'\r\nimport './components/router-links.js'\r\n\r\n/**\r\n * @typedef {import(\"./middlewares/wc.js\").WCRouteDef} WCRouteDef\r\n * @typedef {import(\"./middlewares/wc.js\").PropertyHook} PropertyHook\r\n * @typedef {import(\"./transition.js\").Transition} Transition\r\n */\r\n\r\nclass Router extends CoreRouter {\r\n constructor(options) {\r\n super(options)\r\n this.use(wc)\r\n this.use(routerLinks)\r\n }\r\n}\r\n\r\nexport { Router, interceptLinks, fromParam, fromQuery, fromValue, getRouteEl }\r\n","let eventPrefix\r\n\r\nfunction trigger(name, detail) {\r\n window.dispatchEvent(new CustomEvent(`${eventPrefix}${name}`, { detail }))\r\n}\r\n\r\nexport const events = {\r\n create: function (router) {\r\n eventPrefix = router.options.eventPrefix || 'router-'\r\n },\r\n\r\n before: function (transition) {\r\n trigger('before:transition', { transition })\r\n },\r\n\r\n done: function (transition) {\r\n trigger('transition', { transition })\r\n },\r\n\r\n cancel: function (transition, error) {\r\n if (error.type !== 'TransitionRedirected') {\r\n trigger('abort', { transition, error })\r\n }\r\n },\r\n\r\n error: function (transition, error) {\r\n trigger('abort', { transition, error })\r\n trigger('error', { transition, error })\r\n },\r\n}\r\n","import { interceptLinks, Router } from 'slick-router';\n//import {Router as CoreRouter, interceptLinks} from 'slick-router/core.js';\nimport { events } from 'slick-router/middlewares/events.js';\n\nimport { default as WJElement } from '../wje-element/element.js';\n\n/**\n * `Routerx` is a custom web component that represents a router in a routing system.\n * @summary This element represents a router in a routing system.\n * @documentation https://elements.webjet.sk/components/router\n * @status stable\n * @augments {WJElement}\n * @tag wje-router\n */\nexport default class Routerx extends WJElement {\n\t/**\n\t * Creates an instance of Routerx.\n\t * @class\n\t */\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tclassName = 'Routerx';\n\n\t/**\n\t * Returns the list of attributes to observe for changes.\n\t * @static\n\t * @returns {Array<string>}\n\t */\n\tstatic get observedAttributes() {\n\t\treturn [];\n\t}\n\n\t/**\n\t * Sets up the attributes for the component.\n\t */\n\tsetupAttributes() {\n\t\tthis.isShadowRoot = 'open';\n\t}\n\n\t/**\n\t * Sets up the router after the component is drawn.\n\t */\n\tbeforeDraw() {\n\t\tconst htmlString = this.outerHTML;\n\n\t\tconst parser = new DOMParser();\n\t\tconst htmlDocument = parser.parseFromString(htmlString, 'text/html');\n\t\tconst rootElement = htmlDocument.querySelector('wje-router');\n\n\t\tconst routes = this.parseElement(rootElement).root;\n\n\t\tthis.router = new Router({\n\t\t\toutlet: this.outlet || 'wje-router-outlet',\n\t\t\tlog: false,\n\t\t\tlogError: true,\n\t\t\troot: this.root || '/',\n\t\t\tpushState: true,\n\t\t});\n\n\t\tthis.router.map(routes);\n\t\tthis.router.use(this.setBreadcrumb);\n\t\tthis.router.use(events);\n\t\tthis.router.use(this.resetScrollPosition);\n\t\tthis.router.listen();\n\n\t\tthis.unbindIntercept = interceptLinks(this.router);\n\t}\n\n\t/**\n\t * Parses an element and returns an object representation.\n\t * @param {Element} element The element to parse.\n\t * @returns {object} The object representation of the element.\n\t */\n\tparseElement(element) {\n\t\tconst obj = {};\n\t\tconst attributes = element.attributes;\n\n\t\tfor (let i = 0; i < attributes.length; i++) {\n\t\t\tconst attributeName = attributes[i].name;\n\t\t\tconst attributeValue = attributes[i].value;\n\n\t\t\tif (attributeName === 'component' && attributeValue.indexOf('.js') > -1) {\n\t\t\t\t// eslint-disable-next-line jsdoc/no-bad-blocks\n\t\t\t\tobj.component = () => import(/* @vite-ignore */ attributeValue);\n\t\t\t} else {\n\t\t\t\tif (attributeName !== 'shadow') {\n\t\t\t\t\tconst camelCase = attributeName.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n\t\t\t\t\tobj[camelCase] = attributeValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst children = [];\n\t\tconst childElements = Array.from(element.children);\n\n\t\tchildElements.forEach((childElement) => {\n\t\t\tchildren.push(this.parseElement(childElement));\n\t\t});\n\n\t\tif (children.length > 0 && element.tagName === 'WJE-ROUTE') {\n\t\t\tobj.children = children;\n\t\t} else {\n\t\t\tobj.root = children;\n\t\t}\n\n\t\treturn obj;\n\t}\n\n\t/**\n\t * Sets the breadcrumb for the transition.\n\t * @param {object} transition The transition object.\n\t */\n\tsetBreadcrumb = (transition) => {\n\t\tlet breadcrumb = [\n\t\t\t...transition.routes\n\t\t\t\t.filter((obj) => 'breadcrumb' in obj.options)\n\t\t\t\t.map((b, i) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: b.options.breadcrumbPath || b.name,\n\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\tb.options.breadcrumb instanceof Function\n\t\t\t\t\t\t\t\t? b.options.breadcrumb?.(transition)\n\t\t\t\t\t\t\t\t: b.options.breadcrumb,\n\t\t\t\t\t\tparams: { ...b.params, ...transition.params },\n\t\t\t\t\t\tpath: this.router.generate(b.name, { ...b.params, ...transition.params }),\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t];\n\n\t\ttransition.breadcrumbs = breadcrumb;\n\t};\n\n\t/**\n\t * Resets the scroll position.\n\t * @param {object} transition The transition object.\n\t */\n\tresetScrollPosition = (transition) => {\n\t\twindow.scrollTo(0, 0);\n\t};\n\n\t/**\n\t * Cleans up before the component is disconnected.\n\t */\n\tbeforeDisconnect() {\n\t\tthis.unbindIntercept();\n\t\tthis.router.destroy();\n\t}\n}\n","import Routerx from './router.element.js';\n\nexport default Routerx;\n\nRouterx.define('wje-router', Routerx);\n"],"names":["isEqual","qs","LocationBar","router","transition","resolve","el","keys","routes","patternCompiler","Router","CoreRouter"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wj-elements",
|
|
3
3
|
"description": "WebJET Elements is a modern set of user interface tools harnessing the power of web components designed to simplify web application development.",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.198",
|
|
5
5
|
"homepage": "https://github.com/lencys/wj-elements",
|
|
6
6
|
"author": "Lukáš Ondrejček <lukas.ondrejcek@gmail.com>",
|
|
7
7
|
"license": "MIT",
|