@jadis/core
Version:
Jadis is a minimal JavaScript library for building web interfaces using native Web Components.
1 lines • 34.1 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../build/helpers/assert.helper.js","../../build/helpers/string.helper.js","../../build/helpers/element.helper.js","../../build/base-component.js","../../build/router/router.js","../../build/router/route-group.js","../../build/helpers/template.helper.js","../../build/helpers/bus.helper.js","../../build/helpers/component.helper.js"],"sourcesContent":["/**\n * A helper function to assert conditions in the code.\n * It throws an error if the condition is not met.\n * @param condition The condition to check\n * @param message The error message to throw if the condition is not met\n * @throws Will throw an error if the condition is false\n */\nexport function assert(condition, message) {\n if (!condition) {\n throw new Error(message);\n }\n}\n","/**\n * Converts a string to kebab-case.\n * This function replaces uppercase letters with their lowercase equivalents,\n * prefixing them with a hyphen if they are not at the start of the string.\n * @example\n * toKebabCase('myVariableName'); // 'my-variable-name'\n * toKebabCase('MyVariableName'); // 'my-variable-name'\n * @param str The input string\n * @returns The kebab-cased string\n */\nexport const toKebabCase = (str) => {\n return str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\n};\n","import { toKebabCase } from './string.helper';\nexport function createElement(tag, attributes = {}, appendTo) {\n const el = document.createElement(tag);\n Object.entries(attributes).forEach(([key, value]) => el.setAttribute(toKebabCase(key), value));\n appendTo?.appendChild(el);\n return el;\n}\n","import { assert } from './helpers/assert.helper';\nimport { createElement } from './helpers/element.helper';\n/**\n * Base class for all Jadis components.\n * It provides a structure for creating web components with a shadow DOM,\n * event handling, and attribute management.\n */\nexport class Jadis extends HTMLElement {\n static selector;\n static template = '';\n static observedAttributes = [];\n shadowRoot;\n attributesCallback = {};\n _abortController = new AbortController();\n _isConnected = false;\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(this.buildTemplate());\n }\n /**\n * Creates a new instance of the component.\n * @param attributes The attributes to set on the component\n * @param appendTo The element to append the component to\n * @returns The created component instance\n */\n static createElement(attributes = {}, appendTo) {\n return createElement(this.selector, attributes, appendTo);\n }\n /**\n * Registers the component as a custom element.\n * This method should be called once to define the custom element in the browser.\n * It checks if the selector is defined and if the custom element is not already registered.\n * @throws Will throw an error if the selector is not defined for the component\n */\n static register() {\n assert(this.selector, `selector is not defined for ${this.name}`);\n if (!customElements.get(this.typeOfClass.selector)) {\n customElements.define(this.typeOfClass.selector, this.typeOfClass);\n }\n }\n /**\n * Checks if the component is connected to the DOM.\n * @returns True if the component is connected, false otherwise\n */\n get isConnected() {\n return this._isConnected;\n }\n connectedCallback() {\n this._isConnected = true;\n setTimeout(() => this.onConnect?.());\n }\n disconnectedCallback() {\n this._abortController.abort();\n this.onDisconnect?.();\n }\n attributeChangedCallback(name, oldValue, newValue) {\n this.attributesCallback[name]?.(newValue, oldValue);\n }\n /**\n * Returns the AbortSignal associated with this component.\n * This signal can be used to cancel ongoing operations or event listeners.\n * @returns The AbortSignal for this component\n */\n get killSignal() {\n return this._abortController.signal;\n }\n /**\n * Retrieves an element from the component's template.\n * @param query The query string to find the element\n * @returns The found element\n * @throws Will throw an error if the element is not found\n */\n getElement(query) {\n const el = query\n .split('>>>')\n .reduce((nextEl, nextQuery) => {\n return (nextEl.shadowRoot ?? nextEl).querySelector(nextQuery);\n }, this);\n assert(el, `${query} element is not reachable`);\n return el;\n }\n /**\n * Toggles a class on the component based on a condition.\n * If the condition is true, the class will be added; if false, it will be removed.\n * @param className The name of the class to toggle\n * @param condition The binary condition to determine whether to add or remove the class\n */\n toggleClass(className, condition) {\n condition\n ? this.classList.add(className)\n : this.classList.remove(className);\n }\n /**\n * Registers a callback for a specific event on a bus.\n * @param bus The event bus to register the callback on\n * @param event The event key to listen for\n * @param callback The callback to invoke when the event is emitted\n */\n onBus(bus, event, callback) {\n bus.register(event, callback, this.killSignal);\n }\n /**\n * Creates a handler for events on the component.\n * This handler allows registering and emitting events in a type-safe manner.\n * @template EventType The type of events to handle\n * @returns An object with methods to register and emit events\n * @example\n * // Typescript usage:\n * const events = this.useEvents<{ someEvent: string }>();\n * events.register('someEvent', (detail) => {\n * console.log('Event detail:', detail);\n * });\n * events.emit('someEvent', 'Hello World');\n *\n * // Javascript usage:\n * const events = this.useEvents({someEvent: String});\n * events.register('someEvent', (detail) => {\n * console.log('Event detail:', detail);\n * });\n * events.emit('someEvent', 'Hello World');\n */\n useEvents(_schema) {\n return {\n register: (event, callback) => {\n const listener = ({ detail, }) => callback(detail);\n this.addEventListener(event, listener, {\n signal: this.killSignal,\n });\n },\n emit: (event, ...params) => {\n this.dispatchEvent(new CustomEvent(event, { detail: params[0] }));\n },\n };\n }\n /**\n * Registers a callback for a specific event on an element.\n * @param element The element to listen for events on\n * @param event The event key to listen for\n * @param callback The callback to invoke when the event is emitted\n */\n on(element, event, callback) {\n element.addEventListener(event, callback, {\n signal: this.killSignal,\n });\n }\n buildTemplate() {\n const style = document.createElement('style');\n style.textContent = this.templateCss?.() ?? '';\n const fragment = document.createDocumentFragment();\n fragment.appendChild(style);\n const htmlContent = this.templateHtml?.();\n if (htmlContent) {\n fragment.appendChild(htmlContent);\n }\n return fragment;\n }\n static get typeOfClass() {\n return this.prototype.constructor;\n }\n get typeOfConstructor() {\n return this.constructor;\n }\n}\n","import { assert } from '../helpers/assert.helper';\nimport { createElement } from '../helpers/element.helper';\nconst ROUTER_PARAMETER_PREFIX = ':';\nconst defaultOptions = {\n mode: 'history',\n baseUrl: '/',\n};\n/**\n * Router class for managing navigation and routing in a web application.\n * It supports both hash and history modes for navigation.\n * It allows defining routes, navigating to them, and mounting components based on the current URL.\n */\nexport class Router {\n _routes = [];\n _mode;\n _baseUrl;\n _parametersRegexp = new RegExp(`${ROUTER_PARAMETER_PREFIX}\\\\w+`, 'g');\n _mount;\n _currentRoute;\n constructor(options) {\n this._mode = options?.mode ?? defaultOptions.mode;\n this._baseUrl = options?.baseUrl ?? defaultOptions.baseUrl;\n window.addEventListener(this.eventName, (evt) => {\n evt.preventDefault();\n this.onUrlChange();\n });\n }\n get config() {\n return {\n mode: this._mode,\n baseUrl: this._baseUrl,\n };\n }\n /**\n * Gets the current route.\n * @throws Will throw an error if no route is found\n * @returns The current route\n */\n get currentRoute() {\n assert(this._currentRoute, 'No route found');\n return this._currentRoute;\n }\n /**\n * Adds a new route to the router.\n * @param path The path of the route\n * @param componentSelector The selector of the component to mount for this route\n * @param name An optional name for the route\n * @example\n * router.addRoute('/home', 'home-component', 'home');\n * @returns this\n */\n addRoute(path, componentSelector, name) {\n const pathWithoutParameters = path.replace(this._parametersRegexp, '(.+)');\n this._routes.push({\n name,\n path,\n componentSelector,\n regexp: new RegExp(`^${pathWithoutParameters}$`),\n });\n return this;\n }\n /**\n * Adds a group of routes defined in a RouteGroup.\n * This allows for organizing routes under a common prefix.\n * @param routeGroup The RouteGroup containing routes to add\n * @example\n * const group = RouteGroup.create('/api')\n * .addRoute('/users', 'user-list')\n * .addRoute('/users/:id', 'user-detail');\n * router.addGroup(group);\n * @returns this\n */\n addGroup(routeGroup) {\n routeGroup\n .getRoutes()\n .forEach(({ path, componentSelector, name }) => this.addRoute(path, componentSelector, name));\n return this;\n }\n /**\n * Mounts the router on a specific HTML element.\n * @param el The element to mount the router on\n */\n mountOn(el) {\n this._mount = el;\n this.onUrlChange();\n }\n /**\n * Navigates to a route by its name.\n * @param name The name of the route to navigate to\n * @param params The parameters to include with the route\n */\n gotoName(name, params) {\n const route = this.getRouteByName(name);\n assert(route, `No route found for name: ${name}`);\n this.gotoPath(this.formatPath(route.path, params));\n }\n /**\n * Navigates to a route by its path.\n * @param path The path of the route to navigate to\n */\n gotoPath(path) {\n const urlPath = this._mode === 'hash' ? `#${path}` : path;\n window.history.pushState({}, '', `${this.baseUrl}/${urlPath}`.replace(/\\/{2,}/g, '/'));\n this.onUrlChange();\n }\n get baseUrl() {\n return this._baseUrl.endsWith('/')\n ? this._baseUrl.slice(0, -1)\n : this._baseUrl;\n }\n get mountPoint() {\n assert(this._mount, 'No mount point defined');\n return this._mount;\n }\n get eventName() {\n return this._mode === 'hash' ? 'hashchange' : 'popstate';\n }\n get currentUrlPath() {\n const formattedPath = window.location.pathname.startsWith(this.baseUrl)\n ? window.location.pathname.slice(this.baseUrl.length)\n : window.location.pathname;\n const path = this._mode === 'hash' ? window.location.hash.slice(1) : formattedPath;\n return path.startsWith('/') ? path : `/${path}`;\n }\n onUrlChange() {\n const urlPath = this.currentUrlPath;\n const matchedRoute = this.getRouteByPath(urlPath);\n assert(matchedRoute, `No route found for path: ${urlPath}`);\n this._currentRoute = matchedRoute;\n const component = this.getComponentToLoad({ ...matchedRoute, urlPath });\n this.mountPoint.replaceChildren(component);\n }\n formatPath(routePath, params = {}) {\n return this.extractPathParams(routePath).reduce((acc, param) => {\n assert(params.hasOwnProperty(param), `Missing parameter \"${param}\" for path: ${routePath}`);\n return acc.replace(`${ROUTER_PARAMETER_PREFIX}${param}`, params[param]);\n }, routePath);\n }\n getComponentToLoad(matchedRoute) {\n const { componentSelector } = matchedRoute;\n const params = this.getRouteParameters(matchedRoute);\n return createElement(componentSelector, params);\n }\n getRouteParameters(matchedRoute) {\n const { urlPath, regexp, path } = matchedRoute;\n const match = regexp.exec(urlPath);\n assert(match, `No match found for path: ${urlPath}`);\n return this.extractPathParams(path).reduce((acc, param, index) => {\n return { ...acc, [param]: match[index + 1] };\n }, {});\n }\n getRouteByName(name) {\n return (this._routes.find(({ name: routeName }) => routeName === name) ?? null);\n }\n getRouteByPath(path) {\n return this._routes.find(({ regexp }) => regexp.test(path)) ?? null;\n }\n extractPathParams(path) {\n return path.split('/').reduce((acc, part) => {\n return part.startsWith(ROUTER_PARAMETER_PREFIX)\n ? [...acc, part.slice(ROUTER_PARAMETER_PREFIX.length)]\n : acc;\n }, []);\n }\n}\n","export class RouteGroup {\n _routes = [];\n routePrefix;\n namePrefix;\n constructor(routePrefix, namePrefix) {\n this.routePrefix = routePrefix;\n this.namePrefix = namePrefix ?? '';\n }\n /**\n * Creates a new RouteGroup instance.\n * @param routePrefix The prefix for the route paths.\n * @param namePrefix The prefix for the route names.\n * @returns A new RouteGroup instance.\n */\n static create(routePrefix, namePrefix) {\n const prefixed = routePrefix.startsWith('/')\n ? routePrefix\n : `/${routePrefix}`;\n const suffixed = prefixed.endsWith('/') ? prefixed : `${prefixed}/`;\n return new RouteGroup(suffixed, namePrefix);\n }\n getRoutes() {\n return this._routes;\n }\n /**\n * Adds a route to the group.\n * @param path The path of the route.\n * @param componentSelector The component selector for the route.\n * @param name The name of the route.\n * @returns The current RouteGroup instance.\n */\n addRoute(path, componentSelector, name) {\n this._routes.push({\n componentSelector,\n path: `${this.routePrefix}${path.startsWith('/') ? path.slice(1) : path}`,\n name: name ? `${this.namePrefix}${name}` : undefined,\n });\n return this;\n }\n /**\n * Adds a group of routes to the current group.\n * @param group The route group to add.\n * @returns The current RouteGroup instance.\n */\n addGroup(group) {\n group.getRoutes().forEach(({ path, componentSelector, name }) => {\n this.addRoute(path, componentSelector, name);\n });\n return this;\n }\n}\n","import { createElement } from './element.helper';\n/**\n * A helper for creating HTML templates using tagged template literals.\n * It allows for easy creation of HTML structures with interpolation.\n * @example\n * const template = html`\n * <div class=\"my-class\">\n * <p>${content}</p>\n * </div>\n * `;\n * @returns A DocumentFragment containing the HTML structure\n * @throws Will throw an error if the template contains invalid HTML.\n */\nexport function html(strings, ...values) {\n const { markup, markers } = htmlMarkup(strings, ...values);\n const templateEl = createElement('template');\n templateEl.innerHTML = markup;\n const content = templateEl.content;\n const walker = document.createTreeWalker(content, NodeFilter.SHOW_COMMENT);\n const updates = [];\n while (walker.nextNode()) {\n const node = walker.currentNode;\n const match = markers[node.nodeValue?.trim() ?? ''];\n if (match && node.parentNode) {\n updates.push({ target: node, replacement: match });\n }\n }\n updates.forEach(({ target, replacement }) => {\n target.parentNode?.replaceChild(replacement, target);\n });\n return content;\n}\n/**\n * A helper for creating CSS styles using tagged template literals.\n * It allows for easy creation of CSS styles with interpolation.\n * @example\n * const styles = css`\n * .my-class {\n * color: red;\n * }\n * `;\n * @returns The concatenated CSS string\n */\nexport const css = (strings, ...args) => {\n return strings.reduce((acc, curr, index) => `${acc}${curr}${args[index] ?? ''}`, '');\n};\nfunction createMarker(node, k1) {\n const key = `marker-${k1}`;\n return Array.isArray(node)\n ? node.reduce((acc, n, k2) => ({\n markers: { ...acc.markers, [`${key}-${k2}`]: n },\n markup: `${acc.markup}<!--${key}-${k2}-->`,\n }), { markup: '', markers: {} })\n : {\n markers: { [key]: node },\n markup: `<!--${key}-->`,\n };\n}\nfunction htmlMarkup(strings, ...values) {\n if (typeof strings === 'string') {\n return { markup: strings, markers: {} };\n }\n return strings.reduce((acc, str, k1) => {\n const val = values[k1];\n if (val instanceof Node || Array.isArray(val)) {\n const { markers, markup } = createMarker(val, k1);\n return {\n markup: `${acc.markup}${str}${markup}`,\n markers: { ...acc.markers, ...markers },\n };\n }\n return {\n markup: `${acc.markup}${str}${String(val ?? '')}`,\n markers: acc.markers,\n };\n }, { markup: '', markers: {} });\n}\n","/**\n * A bus for handling events in a type-safe manner.\n * It allows registering and emitting events with specific types.\n */\nexport class Bus {\n domElement = document.createElement('div');\n constructor(_schema) {\n // only for typing\n }\n /**\n * Registers a callback for a specific event.\n * @param event The event key to listen for\n * @param callback The callback to invoke when the event is emitted\n * @param signal The AbortSignal to cancel the listener\n */\n register(event, callback, signal) {\n const listener = ({ detail }) => callback(detail);\n this.domElement.addEventListener(event, listener, { signal });\n }\n /**\n * Emits an event on the bus.\n * @param event The event key to emit\n * @param params The parameters to include with the event\n */\n emit(event, ...params) {\n this.domElement.dispatchEvent(new CustomEvent(event, { detail: params[0] }));\n }\n}\n","import { assert } from './assert.helper';\n/**\n * Checks if a string is a valid component selector.\n * @param key The string to check\n * @returns True if the string is a valid component selector, false otherwise\n */\nexport function isComponentSelector(key) {\n return key.includes('-');\n}\n/**\n * Creates a component selector from a string.\n * @param name The name of the component. It must contain a hyphen.\n * @throws Will throw an error if the name does not contain a hyphen.\n * @returns The component selector\n */\nexport const createSelector = (name) => {\n assert(isComponentSelector(name), `Custom element name must contain a hyphen: ${name}`);\n return name;\n};\n"],"names":[],"mappings":"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"}