jj 0.1.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -7
  3. package/lib/WC.d.ts +45 -0
  4. package/lib/WC.js +118 -0
  5. package/lib/WC.js.map +1 -0
  6. package/lib/WDF.d.ts +11 -0
  7. package/lib/WDF.js +31 -0
  8. package/lib/WDF.js.map +1 -0
  9. package/lib/WE.d.ts +43 -0
  10. package/lib/WE.js +133 -0
  11. package/lib/WE.js.map +1 -0
  12. package/lib/WHE.d.ts +21 -0
  13. package/lib/WHE.js +75 -0
  14. package/lib/WHE.js.map +1 -0
  15. package/lib/WN-mixin.d.ts +9 -0
  16. package/lib/WN-mixin.js +59 -0
  17. package/lib/WN-mixin.js.map +1 -0
  18. package/lib/WN.d.ts +34 -0
  19. package/lib/WN.js +145 -0
  20. package/lib/WN.js.map +1 -0
  21. package/lib/WSH.d.ts +11 -0
  22. package/lib/WSH.js +29 -0
  23. package/lib/WSH.js.map +1 -0
  24. package/lib/WT.d.ts +12 -0
  25. package/lib/WT.js +39 -0
  26. package/lib/WT.js.map +1 -0
  27. package/lib/bundle.js +706 -0
  28. package/lib/bundle.js.map +7 -0
  29. package/lib/bundle.min.js +2 -0
  30. package/lib/case.d.ts +3 -0
  31. package/lib/case.js +34 -0
  32. package/lib/case.js.map +1 -0
  33. package/lib/case.test.d.ts +1 -0
  34. package/lib/case.test.js +79 -0
  35. package/lib/case.test.js.map +1 -0
  36. package/lib/h.d.ts +3 -0
  37. package/lib/h.js +9 -0
  38. package/lib/h.js.map +1 -0
  39. package/lib/index.d.ts +11 -0
  40. package/lib/index.js +12 -0
  41. package/lib/index.js.map +1 -0
  42. package/lib/util.d.ts +4 -0
  43. package/lib/util.js +11 -0
  44. package/lib/util.js.map +1 -0
  45. package/package.json +56 -26
  46. package/CSS.js +0 -145
  47. package/Router.js +0 -89
  48. package/Selector.js +0 -175
  49. package/Tag.js +0 -827
  50. package/control.js +0 -74
  51. package/dist/jj.js +0 -1580
  52. package/dist/jj.js.gz +0 -0
  53. package/dist/jj.min.js +0 -1
  54. package/dist/jj.min.js.gz +0 -0
  55. package/dist/jj.min.js.map +0 -1
  56. package/events.js +0 -16
  57. package/index.js +0 -26
  58. package/observer.js +0 -27
  59. package/rollup.config.js +0 -25
  60. package/unit.js +0 -78
  61. package/util.js +0 -153
  62. package/win.js +0 -11
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/util.ts", "../src/case.ts", "../node_modules/jty/src/misc.ts", "../node_modules/jty/src/number.ts", "../node_modules/jty/src/array.ts", "../node_modules/jty/src/object.ts", "../node_modules/jty/src/string.ts", "../node_modules/jty/src/same.ts", "../src/WN.ts", "../src/WT.ts", "../src/WDF.ts", "../src/WSH.ts", "../src/WE.ts", "../src/WHE.ts", "../src/WC.ts", "../src/WN-mixin.ts", "../src/h.ts"],
4
+ "sourcesContent": ["/** Used to Give the UI a moment to update */\nexport function nextAnimationFrame(): Promise<number> {\n return new Promise((resolve) => requestAnimationFrame(resolve))\n}\n\nexport function on(target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): void {\n target.addEventListener(eventName, handler)\n}\n\nexport function off(target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): void {\n target.removeEventListener(eventName, handler)\n}\n", "export function pas2keb(str: string): string {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string. Got ${str} (${typeof str})`)\n }\n if (/[^a-zA-Z0-9_]/.test(str)) {\n throw new TypeError(`Invalid characters in string. Only alphanumeric and underscores are allowed. Got: ${str}`)\n }\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .replace(/_/g, '-')\n .toLowerCase()\n}\n\nexport function keb2pas(str: string): string {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string. Got ${str} (${typeof str})`)\n }\n return (\n str\n .split('-')\n .filter(Boolean) // Remove empty strings from leading/trailing/multiple hyphens\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('') ||\n // Handle strings that were not kebab-case to begin with (e.g. 'single', 'camelCase')\n (str.length > 0 ? str.charAt(0).toUpperCase() + str.slice(1) : '')\n )\n}\n\nexport function keb2cam(str: string): string {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string. Got ${str} (${typeof str})`)\n }\n return str\n .replace(/^-+|-+$/g, '') // Remove any leading or trailing hyphens\n .replace(/-+([a-z])/g, (g, c) => c.toUpperCase())\n}\n", null, null, null, null, null, null, "import { isA } from 'jty'\nimport { Unwrapped, Wrappable, Wrapped } from './WN-mixin.js'\nimport { off, on } from './util.js'\n\n/** @returns true if this.ref is an instance of descendant of Element or DocumentFragment */\nfunction isElementOrDocumentFragment(x: unknown): x is Element | DocumentFragment {\n return isA(x, Element) || isA(x, DocumentFragment)\n}\n\n/**\n * Wraps a DOM Node\n */\nexport class WN<T extends Node = Node> {\n static from(node: Node): WN {\n return new WN(node)\n }\n\n declare static wrap: (raw: Wrappable) => Wrapped\n declare static unwrap: (obj: Wrappable) => Unwrapped\n\n /**\n * wraps an iteratable object (e.g. an array of wrapped or DOM elements)\n */\n static wrapAll(iterable: Iterable<Wrappable>): Wrapped[] {\n return Array.from(iterable, WN.wrap)\n }\n\n /**\n * unwraps an iteratable object (e.g. an array of HTMLCollection)\n */\n static unwrapAll(iterable: Iterable<Wrappable>): Unwrapped[] {\n return Array.from(iterable, WN.unwrap)\n }\n\n static byId(id: string, throwIfNotFound = true): Wrapped | null {\n const el = document.getElementById(id)\n if (el) {\n return WN.wrap(el)\n }\n if (throwIfNotFound) {\n throw new TypeError(`Element with id ${id} not found`)\n }\n return null\n }\n\n static byClass(className: string) {\n return WN.wrapAll(document.getElementsByClassName(className))\n }\n\n static query(selector: string, throwIfNotFound = true): Wrapped | null {\n const queryResult = document.querySelector(selector)\n if (queryResult) {\n return WN.wrap(queryResult)\n }\n if (throwIfNotFound) {\n throw new TypeError(`Element with selector ${selector} not found`)\n }\n return null\n }\n\n query(selector: string, throwIfNotFound = true): Wrapped | null {\n if (!isElementOrDocumentFragment(this.ref)) {\n throw new TypeError(`Expected an Element or DocumentFragment. Got ${this.ref} (${typeof this.ref})`)\n }\n const queryResult = this.ref.querySelector(selector)\n if (queryResult) {\n return WN.wrap(queryResult)\n }\n if (throwIfNotFound) {\n throw new TypeError(`Element with selector ${selector} not found`)\n }\n return null\n }\n\n static queryAll(selector: string): Wrapped[] {\n return WN.wrapAll(document.querySelectorAll(selector))\n }\n\n queryAll(selector: string): Wrapped[] {\n if (!isElementOrDocumentFragment(this.ref)) {\n throw new TypeError(`Expected an Element or DocumentFragment. Got ${this.ref} (${typeof this.ref})`)\n }\n return WN.wrapAll(this.ref.querySelectorAll(selector))\n }\n\n #ref!: T\n\n constructor(ref: T) {\n if (!isA(ref, Node)) {\n throw new TypeError(`Expected a Node. Got ${ref} (${typeof ref})`)\n }\n this.#ref = ref\n }\n\n get ref() {\n return this.#ref\n }\n\n clone(deep?: boolean): Wrapped {\n return WN.wrap(this.ref.cloneNode(deep))\n }\n\n append(...children: Wrappable[]): this {\n const nodes = WN.unwrapAll(children)\n if (isElementOrDocumentFragment(this.ref)) {\n this.ref.append(...nodes)\n } else {\n for (const node of nodes) {\n if (node) {\n this.ref.appendChild(node)\n }\n }\n }\n return this\n }\n\n mapAppend<T>(array: Wrappable[], mapFn: (item: Wrappable) => Wrappable): this {\n return this.append(...array.map(mapFn))\n }\n\n prepend(...children: Wrappable[]): this {\n const nodes = WN.unwrapAll(children)\n if (isElementOrDocumentFragment(this.ref)) {\n this.ref.prepend(...nodes)\n } else {\n const first = this.ref.firstChild\n for (const node of nodes) {\n if (node) {\n this.ref.insertBefore(node, first)\n }\n }\n }\n return this\n }\n\n mapPrepend<T>(array: Wrappable[], mapFn: (item: Wrappable) => Wrappable): this {\n return this.prepend(...array.map(mapFn))\n }\n\n on(eventName: string, handler: EventListenerOrEventListenerObject): this {\n on(this.ref, eventName, handler)\n return this\n }\n\n off(eventName: string, handler: EventListenerOrEventListenerObject): this {\n off(this.ref, eventName, handler)\n return this\n }\n\n rm() {\n this.ref.parentNode?.removeChild(this.ref)\n return this\n }\n}\n", "import { isA, isStr } from 'jty'\nimport { WN } from './WN.js'\n\n/**\n * Wraps a DOM Text Node\n */\nexport class WT<T extends Text = Text> extends WN<Text> {\n static from(text: Text): WT {\n if (!isA(text, Text)) {\n throw new TypeError(`Expected a Text object. Got: ${text} (${typeof text})`)\n }\n return new WT(text)\n }\n\n constructor(ref: T | String) {\n if (isStr(ref)) {\n super(document.createTextNode(ref))\n } else if (isA(ref, Text)) {\n super(ref)\n }\n throw new TypeError(`Expected a Text. Got: ${ref} (${typeof ref})`)\n }\n\n getText(): string {\n return this.ref.textContent\n }\n\n setText(text: string): this {\n if (!isStr(text)) {\n throw new TypeError(`Expected a string. Got: ${text} (${typeof text})`)\n }\n this.ref.textContent = text\n return this\n }\n\n empty(): this {\n return this.setText('')\n }\n\n addLines(...lines: string[]): this {\n return this.setText(lines.join('\\n'))\n }\n}\n", "import { isA } from 'jty'\nimport { WN } from './WN.js'\nimport { Wrapped } from './WN-mixin.js'\n\n/**\n * Wraps a DocumentFragment (which is a descendant of Node)\n */\nexport class WDF<T extends DocumentFragment = DocumentFragment> extends WN<T> {\n static from(ref: DocumentFragment): WDF {\n return new WDF(ref)\n }\n\n constructor(ref: T) {\n if (!isA(ref, DocumentFragment)) {\n throw new TypeError(`Expected a DocumentFragment. Got ${ref} (${typeof ref})`)\n }\n super(ref)\n }\n\n byId(id: string, throwIfNotFound = true): Wrapped | null {\n const el = this.ref.getElementById(id)\n if (el) {\n return WN.wrap(el)\n }\n if (throwIfNotFound) {\n throw new TypeError(`Element with id ${id} not found`)\n }\n return null\n }\n\n empty(): this {\n this.ref.replaceChildren()\n return this\n }\n}\n", "import { isA } from 'jty'\nimport { WDF } from './WDF.js'\n\n/**\n * Wraps a DOM ShadowRoot node (which is a descendant of DocumentFragment)\n */\nexport class WSH<T extends ShadowRoot = ShadowRoot> extends WDF<T> {\n static from(shadow: ShadowRoot) {\n return new WSH(shadow)\n }\n\n constructor(shadow: T) {\n if (!isA(shadow, ShadowRoot)) {\n throw new TypeError(`Expected a ShadowRoot. Got ${shadow} (${typeof shadow})`)\n }\n super(shadow)\n }\n\n getHtml(): string {\n return this.ref.innerHTML\n }\n\n setHtml(value: string, unsafe: false): this {\n // TODO: https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/setHTMLUnsafe\n this.ref.innerHTML = value\n return this\n }\n\n addStyleSheets(...styleSheets: CSSStyleSheet[]): this {\n this.ref.adoptedStyleSheets.push(...styleSheets)\n return this\n }\n}\n", "import { isA, isObj } from 'jty'\nimport { WN } from './WN.js'\nimport { WSH } from './WSH.js'\n\n/**\n * Wraps a DOM Element (which is a descendant of Node)\n */\nexport class WE<T extends Element = Element> extends WN<T> {\n static from(ref: Element): WE {\n return new WE(ref)\n }\n\n constructor(ref: T) {\n if (!isA(ref, Element)) {\n throw new TypeError(`Expected a Element. Got: ${ref} (${typeof ref})`)\n }\n super(ref)\n }\n\n getAttr(name: string): string | null {\n return this.ref.getAttribute(name)\n }\n\n hasAttr(name: string): boolean {\n return this.ref.hasAttribute(name)\n }\n\n setAttr(name: string, value: string): this {\n this.ref.setAttribute(name, value)\n return this\n }\n\n setAttrs(obj: Record<string, string>): this {\n if (!isObj(obj)) {\n throw new TypeError(`Expected an object. Got: ${obj} (${typeof obj})`)\n }\n for (const [name, value] of Object.entries(obj)) {\n this.setAttr(name, value)\n }\n return this\n }\n\n rmAttr(name: string) {\n return this.rmAttrs(name)\n }\n\n rmAttrs(...names: string[]): this {\n for (const name of names) {\n this.ref.removeAttribute(name)\n }\n return this\n }\n\n getAria(name: string): string | null {\n return this.ref.getAttribute(`aria-${name}`)\n }\n\n hasAria(name: string): boolean {\n return this.ref.hasAttribute(`aria-${name}`)\n }\n\n setAria(name: string, value: string): this {\n this.ref.setAttribute(`aria-${name}`, value)\n return this\n }\n\n rmAria(name: string): this {\n this.ref.removeAttribute(`aria-${name}`)\n return this\n }\n\n addClass(...classNames: string[]): this {\n this.ref.classList.add(...classNames)\n return this\n }\n\n rmClasses(...classNames: string[]): this {\n this.ref.classList.remove(...classNames)\n return this\n }\n\n rmClass(className: string) {\n return this.rmClasses(className)\n }\n\n hasClass(className: string): boolean {\n return this.ref.classList.contains(className)\n }\n\n toggleClass(className: string): this {\n this.ref.classList.toggle(className)\n return this\n }\n\n onClick(handler: EventListenerOrEventListenerObject): this {\n return this.on('click', handler)\n }\n\n hide(): this {\n return this.setAttr('hidden', '').setAttr('aria-hidden', 'true')\n }\n\n show(): this {\n return this.rmAttrs('hidden', 'aria-hidden')\n }\n\n disable(): this {\n return this.setAttr('disabled', '').setAttr('aria-disabled', 'true')\n }\n\n enable(): this {\n return this.rmAttrs('disabled', 'aria-disabled')\n }\n\n getTitle(): string | null {\n return this.getAttr('title')\n }\n\n setTitle(title: string): this {\n return this.setAttr('title', title)\n }\n\n setId(id: string): this {\n return this.setAttr('id', id)\n }\n\n getId(): string | null {\n return this.getAttr('id')\n }\n\n getHtml(): string {\n return this.ref.innerHTML\n }\n\n setHtml(html: string): this {\n this.ref.innerHTML = html\n return this\n }\n\n /**\n * We prevent FOUC by assigning the template and CSS in one go\n * @remarks\n * **Note:** You can't attach a shadow root to every type of element. There are some that can't have a\n * shadow DOM for security reasons (for example `<a>`).\n */\n setShadow(mode: ShadowRootMode = 'open', html?: string, ...styleSheets: CSSStyleSheet[]): this {\n const shadowRoot = this.ref.shadowRoot ?? this.ref.attachShadow({ mode })\n if (html) {\n shadowRoot.innerHTML = html\n }\n if (styleSheets.length) {\n shadowRoot.adoptedStyleSheets.push(...styleSheets)\n }\n return this\n }\n\n getShadow(): WSH {\n if (!this.ref.shadowRoot) throw new Error('No shadow root')\n return new WSH(this.ref.shadowRoot)\n }\n}\n", "import { hasProp, isA, isStr } from 'jty'\nimport { WE } from './WE.js'\n\n/**\n * Wraps a DOM HTMLElement (which is a descendant of Element)\n */\nexport class WHE<T extends HTMLElement = HTMLElement> extends WE<T> {\n static from(ref: HTMLElement): WHE {\n return new WHE(ref)\n }\n\n static fromTag(tagName: string, options?: ElementCreationOptions): WHE {\n if (!isStr(tagName)) {\n throw new TypeError(`Expected a string for tagName. Got: ${tagName} (${typeof tagName})`)\n }\n return new WHE(document.createElement(tagName, options))\n }\n\n constructor(ref: T) {\n if (!isA(ref, HTMLElement)) {\n throw new TypeError(`Expected a HTMLElement. Got ${ref} (${typeof ref})`)\n }\n super(ref)\n }\n\n getValue() {\n if (!hasProp(this.ref, 'value')) {\n throw new Error('Element does not have a value property')\n }\n return this.ref.value\n }\n\n setValue(value: string): this {\n if (!hasProp(this.ref, 'value')) {\n throw new Error('Element does not have a value property')\n }\n this.ref.value = value\n return this\n }\n\n getData(name: string): string | undefined {\n return this.ref.dataset[name]\n }\n\n hasData(name: string): boolean {\n return hasProp(this.ref.dataset, name)\n }\n\n setData(name: string, value: string): this {\n this.ref.dataset[name] = value\n return this\n }\n\n setDataObj(obj: Record<string, string>): this {\n for (const [name, value] of Object.entries(obj)) {\n this.setData(name, value)\n }\n return this\n }\n\n rmData(name: string): this {\n delete this.ref.dataset[name]\n return this\n }\n\n focus(): this {\n this.ref.focus()\n return this\n }\n\n click(): this {\n this.ref.click()\n return this\n }\n\n empty(): this {\n this.ref.innerText = ''\n return this\n }\n\n getText(): string {\n return this.ref.innerText\n }\n\n setText(text: string): this {\n this.ref.innerText = text\n return this\n }\n}\n", "import { keb2cam } from './case.js'\nimport { WHE } from './WHE.js'\nimport { hasProp, isArr, isStr, isObj, isFn, isA, isDef } from 'jty'\n\nexport async function fetchText(url: URL | string, mime: string = 'text/*') {\n if (!isStr(mime)) {\n throw new TypeError(`Expected a string mime like 'text/html' or 'text/css'. Got ${mime} (${typeof mime})`)\n }\n const response = await fetch(url, { headers: { Accept: mime } })\n if (!response.ok) {\n throw new Error(`GET ${url} failed: ${response.status} ${response.statusText}`)\n }\n return response.text()\n}\n\nexport async function fetchHtml(url: URL | string): Promise<string> {\n return await fetchText(url, 'text/html')\n}\n\nexport async function fetchCss(url: URL | string): Promise<string> {\n return await fetchText(url, 'text/css')\n}\n\nexport async function cssToStyle(css: string): Promise<CSSStyleSheet> {\n const sheet = new CSSStyleSheet()\n return await sheet.replace(css)\n}\n\nexport async function fetchStyle(url: URL | string): Promise<CSSStyleSheet> {\n return await cssToStyle(await fetchCss(url))\n}\n\nexport function addLinkPre(href: string, rel: 'prefetch' | 'preload', as: 'fetch' | 'style' | 'script' = 'fetch') {\n const link = WHE.fromTag('link').setAttrs({\n rel,\n href,\n as,\n })\n document.head.append(link.ref)\n return link\n}\n\nexport type JJResource<T> = T | Promise<T> | (() => T | Promise<T>)\nexport type JJTemplateConfig = JJResource<string>\nexport type JJStylesConfig = JJResource<string | CSSStyleSheet> | JJResource<string | CSSStyleSheet>[]\n\nexport interface JJConfig {\n name: string\n template?: JJTemplateConfig\n styles?: JJStylesConfig\n templateMode?: 'open' | 'closed'\n}\n\ninterface JJProcessedConfig {\n template?: string\n styles: CSSStyleSheet[]\n}\n\nasync function processStyleConfig(style: JJResource<string | CSSStyleSheet>): Promise<CSSStyleSheet> {\n if (isFn(style)) {\n style = await style()\n }\n style = await style\n if (isA(style, CSSStyleSheet)) {\n return style\n }\n if (isStr(style)) {\n return await cssToStyle(style)\n }\n throw new TypeError(`Expected a css string or CSSStyleSheet. Got ${style} (${typeof style})`)\n}\n\nasync function processConfig(\n templateResource?: JJTemplateConfig,\n styleResources?: JJStylesConfig,\n): Promise<JJProcessedConfig> {\n const templatePromise = isFn(templateResource) ? templateResource() : Promise.resolve(templateResource)\n if (!isDef(styleResources)) {\n styleResources = []\n }\n if (!isArr(styleResources)) {\n styleResources = [styleResources]\n }\n const [template, ...styles] = await Promise.all([templatePromise, ...styleResources.map(processStyleConfig)])\n return { template, styles }\n}\n/**\n * Parent class for custom components.\n * It adds a few pragmatic functionalities\n * - `setTemplate` sets the template for the custom component body\n * - `addStyle` adds a stylesheet to be used by the shadowRoot\n * - `connectedCallback` assigns the templates to shadowRoot and attaches any styles\n * - `attributeChangedCallback` sets any props that corresponds to attributes defined in `static observedAttributes`\n */\nexport class WC extends HTMLElement {\n static _jjCache: Promise<JJProcessedConfig> | JJProcessedConfig | undefined\n declare static jj: JJConfig\n declare static observedAttributes?: string[]\n\n static async register(): Promise<void> {\n if (!isObj(this.jj)) {\n throw new Error(`static jj object is missing from the extending class. Got ${this.jj} (${typeof this.jj})`)\n }\n const { name } = this.jj\n if (!isStr(name)) {\n throw new TypeError(`Expected a string name. Got ${name} (${typeof name})`)\n }\n if (!customElements.get(name)) {\n customElements.define(name, this)\n await customElements.whenDefined(name)\n }\n }\n\n async connectedCallback() {\n const classRef = this.constructor as typeof WC\n const jj = classRef.jj\n if (!isObj(jj)) {\n throw new TypeError(`static jj object is missing from the extending class. Got ${jj} (${typeof jj})`)\n }\n if (!classRef._jjCache) {\n classRef._jjCache = processConfig(classRef.jj.template, classRef.jj.styles)\n }\n const { template, styles } = await classRef._jjCache\n const { templateMode } = jj\n WHE.from(this).setShadow(templateMode, template, ...styles)\n }\n\n /**\n * The class that extends this one should define\n * `static observedAttributes[]` containing kebab-based attribute names (all lower case)\n * @param name kebab-case and in lower case exactly as it appears in `observedAttributes`\n * @param oldValue\n * @param newValue\n * @returns true if it tried to set the attribute; otherwise false\n */\n attributeChangedCallback(name: string, oldValue: any, newValue: any) {\n // Called when observed attributes change.\n if (oldValue !== newValue) {\n const observedAttributes = (this.constructor as typeof WC).observedAttributes\n if (isArr(observedAttributes) && observedAttributes.includes(name)) {\n const kebabName = keb2cam(name)\n if (hasProp(this, kebabName)) {\n this[kebabName as keyof this] = newValue\n return true\n }\n }\n }\n return false\n }\n}\n", "import { isA, isObj, isStr } from 'jty'\nimport { WHE } from './WHE.js'\nimport { WE } from './WE.js'\nimport { WDF } from './WDF.js'\nimport { WSH } from './WSH.js'\nimport { WT } from './WT.js'\nimport { WN } from './WN.js'\n\nexport type Wrappable = WN | Node | string\nexport type Wrapped = WHE | WE | WDF | WSH | WDF | WT | WN\nexport type Unwrapped = HTMLElement | Element | ShadowRoot | DocumentFragment | Text | Node\n\n/**\n * @returns the most granual Wrapped subclass.\n */\nWN.wrap = (raw: Wrappable): Wrapped => {\n if (isStr(raw)) {\n return WT.from(document.createTextNode(raw))\n }\n if (!isObj(raw)) {\n throw new TypeError(`Expected an object to wrap. Got ${raw} (${typeof raw})`)\n }\n if (isA(raw, WN)) {\n return raw\n }\n if (isA(raw, HTMLElement)) {\n return WHE.from(raw)\n }\n if (isA(raw, Element)) {\n return WE.from(raw)\n }\n if (isA(raw, ShadowRoot)) {\n return WSH.from(raw)\n }\n if (isA(raw, DocumentFragment)) {\n return WDF.from(raw)\n }\n if (isA(raw, Text)) {\n return WT.from(raw)\n }\n if (isA(raw, Node)) {\n return WN.from(raw)\n }\n throw new TypeError(`Only Frag or DocumentFragment can be wrapped. Got ${raw} (${typeof raw})`)\n}\n\n/**\n * @returns the original DOM node wrapped in the appropriate class\n */\nWN.unwrap = (obj: Wrappable): Unwrapped => {\n if (isStr(obj)) {\n return document.createTextNode(obj)\n }\n if (!isObj(obj)) {\n throw new TypeError(`Expected an object. Got ${obj} (${typeof obj})`)\n }\n if (isA(obj, Node)) {\n return obj\n }\n if (isA(obj, WN)) {\n return obj.ref\n }\n throw new TypeError(`Could not unwrap ${obj} (${typeof obj})`)\n}\n", "import { WHE } from './WHE.js'\nimport { Wrappable } from './WN-mixin.js'\n\nexport function h(tagName: string, attributes: Record<string, string>, ...children: Wrappable[]): WHE {\n const ret = WHE.fromTag(tagName).append(...children)\n if (attributes) {\n ret.setAttrs(attributes)\n }\n return ret\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["hasOwnProperty", "isArray"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function J(){return new Promise(e=>requestAnimationFrame(e))}function x(e,t,r){e.addEventListener(t,r)}function b(e,t,r){e.removeEventListener(t,r)}function O(e){if(typeof e!="string")throw new TypeError(`Expected a string. Got ${e} (${typeof e})`);if(/[^a-zA-Z0-9_]/.test(e))throw new TypeError(`Invalid characters in string. Only alphanumeric and underscores are allowed. Got: ${e}`);return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}function N(e){if(typeof e!="string")throw new TypeError(`Expected a string. Got ${e} (${typeof e})`);return e.split("-").filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")||(e.length>0?e.charAt(0).toUpperCase()+e.slice(1):"")}function $(e){if(typeof e!="string")throw new TypeError(`Expected a string. Got ${e} (${typeof e})`);return e.replace(/^-+|-+$/g,"").replace(/-+([a-z])/g,(t,r)=>r.toUpperCase())}function u(e){return e!==void 0}function d(e){return typeof e=="function"}var{isNaN:j,isFinite:M,isInteger:k}=Number;function w(e){return typeof e=="number"&&!j(e)}function T(e,t,r){if(!w(e))throw new TypeError(`inRange(): "x" must be a number. Got ${e} (${typeof e})`);if(u(t)){if(!w(t))throw new TypeError(`inRange(): "min" must be a number. Got ${t} (${typeof t})`);if(u(r)){if(!w(r))throw new TypeError(`inRange(): "max" must be a number. Got ${r} (${typeof r})`);return t>r?r<=e&&e<=t:t<=e&&e<=r}return e>=t}else if(u(r)){if(!w(r))throw new TypeError(`inRange(): "max" must be a number. Got ${r} (${typeof r})`);return e<=r}throw new TypeError(`inRange(): expected at least min or max to be defined. Got min=${t} and max=${r}`)}var{isArray:v}=Array;function S(e,t=0,r){return v(e)&&T(e.length,t,r)}var{hasOwnProperty:Z}=Object;function p(e){return!!e&&typeof e=="object"}function i(e,t){if(!d(t))throw new TypeError(`Expected a constructor function. Got ${t} (${typeof t})`);return e instanceof t}function c(e,...t){if(!p(e))return!1;for(let r of t)if(!(r in e))return!1;return!0}function a(e){return typeof e=="string"}var{hasOwnProperty:nt}=Object,{isArray:it}=Array;function E(e){return i(e,Element)||i(e,DocumentFragment)}var o=class e{static from(t){return new e(t)}static wrapAll(t){return Array.from(t,e.wrap)}static unwrapAll(t){return Array.from(t,e.unwrap)}static byId(t,r=!0){let n=document.getElementById(t);if(n)return e.wrap(n);if(r)throw new TypeError(`Element with id ${t} not found`);return null}static byClass(t){return e.wrapAll(document.getElementsByClassName(t))}static query(t,r=!0){let n=document.querySelector(t);if(n)return e.wrap(n);if(r)throw new TypeError(`Element with selector ${t} not found`);return null}query(t,r=!0){if(!E(this.ref))throw new TypeError(`Expected an Element or DocumentFragment. Got ${this.ref} (${typeof this.ref})`);let n=this.ref.querySelector(t);if(n)return e.wrap(n);if(r)throw new TypeError(`Element with selector ${t} not found`);return null}static queryAll(t){return e.wrapAll(document.querySelectorAll(t))}queryAll(t){if(!E(this.ref))throw new TypeError(`Expected an Element or DocumentFragment. Got ${this.ref} (${typeof this.ref})`);return e.wrapAll(this.ref.querySelectorAll(t))}#t;constructor(t){if(!i(t,Node))throw new TypeError(`Expected a Node. Got ${t} (${typeof t})`);this.#t=t}get ref(){return this.#t}clone(t){return e.wrap(this.ref.cloneNode(t))}append(...t){let r=e.unwrapAll(t);if(E(this.ref))this.ref.append(...r);else for(let n of r)n&&this.ref.appendChild(n);return this}mapAppend(t,r){return this.append(...t.map(r))}prepend(...t){let r=e.unwrapAll(t);if(E(this.ref))this.ref.prepend(...r);else{let n=this.ref.firstChild;for(let s of r)s&&this.ref.insertBefore(s,n)}return this}mapPrepend(t,r){return this.prepend(...t.map(r))}on(t,r){return x(this.ref,t,r),this}off(t,r){return b(this.ref,t,r),this}rm(){return this.ref.parentNode?.removeChild(this.ref),this}};var g=class e extends o{static from(t){if(!i(t,Text))throw new TypeError(`Expected a Text object. Got: ${t} (${typeof t})`);return new e(t)}constructor(t){throw a(t)?super(document.createTextNode(t)):i(t,Text)&&super(t),new TypeError(`Expected a Text. Got: ${t} (${typeof t})`)}getText(){return this.ref.textContent}setText(t){if(!a(t))throw new TypeError(`Expected a string. Got: ${t} (${typeof t})`);return this.ref.textContent=t,this}empty(){return this.setText("")}addLines(...t){return this.setText(t.join(`
2
+ `))}};var h=class e extends o{static from(t){return new e(t)}constructor(t){if(!i(t,DocumentFragment))throw new TypeError(`Expected a DocumentFragment. Got ${t} (${typeof t})`);super(t)}byId(t,r=!0){let n=this.ref.getElementById(t);if(n)return o.wrap(n);if(r)throw new TypeError(`Element with id ${t} not found`);return null}empty(){return this.ref.replaceChildren(),this}};var l=class e extends h{static from(t){return new e(t)}constructor(t){if(!i(t,ShadowRoot))throw new TypeError(`Expected a ShadowRoot. Got ${t} (${typeof t})`);super(t)}getHtml(){return this.ref.innerHTML}setHtml(t,r){return this.ref.innerHTML=t,this}addStyleSheets(...t){return this.ref.adoptedStyleSheets.push(...t),this}};var m=class e extends o{static from(t){return new e(t)}constructor(t){if(!i(t,Element))throw new TypeError(`Expected a Element. Got: ${t} (${typeof t})`);super(t)}getAttr(t){return this.ref.getAttribute(t)}hasAttr(t){return this.ref.hasAttribute(t)}setAttr(t,r){return this.ref.setAttribute(t,r),this}setAttrs(t){if(!p(t))throw new TypeError(`Expected an object. Got: ${t} (${typeof t})`);for(let[r,n]of Object.entries(t))this.setAttr(r,n);return this}rmAttr(t){return this.rmAttrs(t)}rmAttrs(...t){for(let r of t)this.ref.removeAttribute(r);return this}getAria(t){return this.ref.getAttribute(`aria-${t}`)}hasAria(t){return this.ref.hasAttribute(`aria-${t}`)}setAria(t,r){return this.ref.setAttribute(`aria-${t}`,r),this}rmAria(t){return this.ref.removeAttribute(`aria-${t}`),this}addClass(...t){return this.ref.classList.add(...t),this}rmClasses(...t){return this.ref.classList.remove(...t),this}rmClass(t){return this.rmClasses(t)}hasClass(t){return this.ref.classList.contains(t)}toggleClass(t){return this.ref.classList.toggle(t),this}onClick(t){return this.on("click",t)}hide(){return this.setAttr("hidden","").setAttr("aria-hidden","true")}show(){return this.rmAttrs("hidden","aria-hidden")}disable(){return this.setAttr("disabled","").setAttr("aria-disabled","true")}enable(){return this.rmAttrs("disabled","aria-disabled")}getTitle(){return this.getAttr("title")}setTitle(t){return this.setAttr("title",t)}setId(t){return this.setAttr("id",t)}getId(){return this.getAttr("id")}getHtml(){return this.ref.innerHTML}setHtml(t){return this.ref.innerHTML=t,this}setShadow(t="open",r,...n){let s=this.ref.shadowRoot??this.ref.attachShadow({mode:t});return r&&(s.innerHTML=r),n.length&&s.adoptedStyleSheets.push(...n),this}getShadow(){if(!this.ref.shadowRoot)throw new Error("No shadow root");return new l(this.ref.shadowRoot)}};var f=class e extends m{static from(t){return new e(t)}static fromTag(t,r){if(!a(t))throw new TypeError(`Expected a string for tagName. Got: ${t} (${typeof t})`);return new e(document.createElement(t,r))}constructor(t){if(!i(t,HTMLElement))throw new TypeError(`Expected a HTMLElement. Got ${t} (${typeof t})`);super(t)}getValue(){if(!c(this.ref,"value"))throw new Error("Element does not have a value property");return this.ref.value}setValue(t){if(!c(this.ref,"value"))throw new Error("Element does not have a value property");return this.ref.value=t,this}getData(t){return this.ref.dataset[t]}hasData(t){return c(this.ref.dataset,t)}setData(t,r){return this.ref.dataset[t]=r,this}setDataObj(t){for(let[r,n]of Object.entries(t))this.setData(r,n);return this}rmData(t){return delete this.ref.dataset[t],this}focus(){return this.ref.focus(),this}click(){return this.ref.click(),this}empty(){return this.ref.innerText="",this}getText(){return this.ref.innerText}setText(t){return this.ref.innerText=t,this}};async function W(e,t="text/*"){if(!a(t))throw new TypeError(`Expected a string mime like 'text/html' or 'text/css'. Got ${t} (${typeof t})`);let r=await fetch(e,{headers:{Accept:t}});if(!r.ok)throw new Error(`GET ${e} failed: ${r.status} ${r.statusText}`);return r.text()}async function Ot(e){return await W(e,"text/html")}async function G(e){return await W(e,"text/css")}async function C(e){return await new CSSStyleSheet().replace(e)}async function Nt(e){return await C(await G(e))}function Pt(e,t,r="fetch"){let n=f.fromTag("link").setAttrs({rel:t,href:e,as:r});return document.head.append(n.ref),n}async function L(e){if(d(e)&&(e=await e()),e=await e,i(e,CSSStyleSheet))return e;if(a(e))return await C(e);throw new TypeError(`Expected a css string or CSSStyleSheet. Got ${e} (${typeof e})`)}async function D(e,t){let r=d(e)?e():Promise.resolve(e);u(t)||(t=[]),S(t)||(t=[t]);let[n,...s]=await Promise.all([r,...t.map(L)]);return{template:n,styles:s}}var A=class extends HTMLElement{static async register(){if(!p(this.jj))throw new Error(`static jj object is missing from the extending class. Got ${this.jj} (${typeof this.jj})`);let{name:t}=this.jj;if(!a(t))throw new TypeError(`Expected a string name. Got ${t} (${typeof t})`);customElements.get(t)||(customElements.define(t,this),await customElements.whenDefined(t))}async connectedCallback(){let t=this.constructor,r=t.jj;if(!p(r))throw new TypeError(`static jj object is missing from the extending class. Got ${r} (${typeof r})`);t._jjCache||(t._jjCache=D(t.jj.template,t.jj.styles));let{template:n,styles:s}=await t._jjCache,{templateMode:y}=r;f.from(this).setShadow(y,n,...s)}attributeChangedCallback(t,r,n){if(r!==n){let s=this.constructor.observedAttributes;if(S(s)&&s.includes(t)){let y=$(t);if(c(this,y))return this[y]=n,!0}}return!1}};o.wrap=e=>{if(a(e))return g.from(document.createTextNode(e));if(!p(e))throw new TypeError(`Expected an object to wrap. Got ${e} (${typeof e})`);if(i(e,o))return e;if(i(e,HTMLElement))return f.from(e);if(i(e,Element))return m.from(e);if(i(e,ShadowRoot))return l.from(e);if(i(e,DocumentFragment))return h.from(e);if(i(e,Text))return g.from(e);if(i(e,Node))return o.from(e);throw new TypeError(`Only Frag or DocumentFragment can be wrapped. Got ${e} (${typeof e})`)};o.unwrap=e=>{if(a(e))return document.createTextNode(e);if(!p(e))throw new TypeError(`Expected an object. Got ${e} (${typeof e})`);if(i(e,Node))return e;if(i(e,o))return e.ref;throw new TypeError(`Could not unwrap ${e} (${typeof e})`)};function Zt(e,t,...r){let n=f.fromTag(e).append(...r);return t&&n.setAttrs(t),n}export{A as WC,h as WDF,m as WE,f as WHE,o as WN,l as WSH,g as WT,Pt as addLinkPre,C as cssToStyle,G as fetchCss,Ot as fetchHtml,Nt as fetchStyle,W as fetchText,Zt as h,$ as keb2cam,N as keb2pas,J as nextAnimationFrame,b as off,x as on,O as pas2keb};
package/lib/case.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function pas2keb(str: string): string;
2
+ export declare function keb2pas(str: string): string;
3
+ export declare function keb2cam(str: string): string;
package/lib/case.js ADDED
@@ -0,0 +1,34 @@
1
+ export function pas2keb(str) {
2
+ if (typeof str !== 'string') {
3
+ throw new TypeError(`Expected a string. Got ${str} (${typeof str})`);
4
+ }
5
+ if (/[^a-zA-Z0-9_]/.test(str)) {
6
+ throw new TypeError(`Invalid characters in string. Only alphanumeric and underscores are allowed. Got: ${str}`);
7
+ }
8
+ return str
9
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
10
+ .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
11
+ .replace(/_/g, '-')
12
+ .toLowerCase();
13
+ }
14
+ export function keb2pas(str) {
15
+ if (typeof str !== 'string') {
16
+ throw new TypeError(`Expected a string. Got ${str} (${typeof str})`);
17
+ }
18
+ return (str
19
+ .split('-')
20
+ .filter(Boolean) // Remove empty strings from leading/trailing/multiple hyphens
21
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
22
+ .join('') ||
23
+ // Handle strings that were not kebab-case to begin with (e.g. 'single', 'camelCase')
24
+ (str.length > 0 ? str.charAt(0).toUpperCase() + str.slice(1) : ''));
25
+ }
26
+ export function keb2cam(str) {
27
+ if (typeof str !== 'string') {
28
+ throw new TypeError(`Expected a string. Got ${str} (${typeof str})`);
29
+ }
30
+ return str
31
+ .replace(/^-+|-+$/g, '') // Remove any leading or trailing hyphens
32
+ .replace(/-+([a-z])/g, (g, c) => c.toUpperCase());
33
+ }
34
+ //# sourceMappingURL=case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case.js","sourceRoot":"","sources":["../src/case.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,GAAW;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,0BAA0B,GAAG,KAAK,OAAO,GAAG,GAAG,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,SAAS,CAAC,qFAAqF,GAAG,EAAE,CAAC,CAAA;IACnH,CAAC;IACD,OAAO,GAAG;SACL,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC;SACxC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,0BAA0B,GAAG,KAAK,OAAO,GAAG,GAAG,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,CACH,GAAG;SACE,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC,CAAC,8DAA8D;SAC9E,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC;QACb,qFAAqF;QACrF,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACrE,CAAA;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,0BAA0B,GAAG,KAAK,OAAO,GAAG,GAAG,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,GAAG;SACL,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,yCAAyC;SACjE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AACzD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { pas2keb, keb2pas, keb2cam } from './case.js';
4
+ describe('pas2keb()', () => {
5
+ it('throws for non-string input', () => {
6
+ assert.throws(() => pas2keb(123), TypeError, 'Should throw for a number');
7
+ assert.throws(() => pas2keb(true), TypeError, 'Should throw for a boolean');
8
+ assert.throws(() => pas2keb(null), TypeError, 'Should throw for null');
9
+ assert.throws(() => pas2keb(undefined), TypeError, 'Should throw for undefined');
10
+ });
11
+ it('converts PascalCase or camelCase to kebab-case', () => {
12
+ assert.strictEqual(pas2keb('PascalCase'), 'pascal-case');
13
+ assert.strictEqual(pas2keb('camelCase'), 'camel-case');
14
+ assert.strictEqual(pas2keb('Hello'), 'hello');
15
+ });
16
+ it('handles consecutive uppercase letters', () => {
17
+ assert.strictEqual(pas2keb('MyHTMLElement'), 'my-html-element');
18
+ assert.strictEqual(pas2keb('isURL'), 'is-url');
19
+ assert.strictEqual(pas2keb('isURLShortener'), 'is-url-shortener');
20
+ });
21
+ it('handles edge cases', () => {
22
+ assert.strictEqual(pas2keb(''), '', 'Should handle empty string');
23
+ assert.strictEqual(pas2keb('A'), 'a');
24
+ assert.strictEqual(pas2keb('I'), 'i');
25
+ });
26
+ it('converts snake_case to kebab-case', () => {
27
+ assert.strictEqual(pas2keb('snake_case'), 'snake-case');
28
+ assert.strictEqual(pas2keb('Snake_Case'), 'snake-case');
29
+ });
30
+ });
31
+ describe('keb2pas()', () => {
32
+ it('throws for non-string input', () => {
33
+ assert.throws(() => keb2pas(123), TypeError, 'Should throw for a number');
34
+ assert.throws(() => keb2pas(true), TypeError, 'Should throw for a boolean');
35
+ assert.throws(() => keb2pas(null), TypeError, 'Should throw for null');
36
+ assert.throws(() => keb2pas(undefined), TypeError, 'Should throw for undefined');
37
+ });
38
+ it('converts kebab-case to PascalCase', () => {
39
+ assert.strictEqual(keb2pas('kebab-case'), 'KebabCase');
40
+ assert.strictEqual(keb2pas('a-b-c'), 'ABC');
41
+ assert.strictEqual(keb2pas('single'), 'Single');
42
+ assert.strictEqual(keb2pas('a'), 'A');
43
+ });
44
+ it('handles edge cases correctly', () => {
45
+ assert.strictEqual(keb2pas(''), '', 'Should handle empty string');
46
+ assert.strictEqual(keb2pas('foo--bar'), 'FooBar', 'Should handle multiple hyphens');
47
+ assert.strictEqual(keb2pas('-foo-bar'), 'FooBar', 'Should handle leading hyphen');
48
+ assert.strictEqual(keb2pas('foo-bar-'), 'FooBar', 'Should handle trailing hyphen');
49
+ });
50
+ it('does not convert other cases', () => {
51
+ assert.strictEqual(keb2pas('camelCase'), 'CamelCase', 'Should only capitalize first letter for camelCase');
52
+ assert.strictEqual(keb2pas('snake_case'), 'Snake_case', 'Should not convert snake_case');
53
+ });
54
+ });
55
+ describe('keb2cam()', () => {
56
+ it('throws for non-string input', () => {
57
+ assert.throws(() => keb2cam(123), TypeError, 'Should throw for a number');
58
+ assert.throws(() => keb2cam(true), TypeError, 'Should throw for a boolean');
59
+ assert.throws(() => keb2cam(null), TypeError, 'Should throw for null');
60
+ assert.throws(() => keb2cam(undefined), TypeError, 'Should throw for undefined');
61
+ });
62
+ it('converts kebab-case to camelCase', () => {
63
+ assert.strictEqual(keb2cam('kebab-case'), 'kebabCase');
64
+ assert.strictEqual(keb2cam('a-b-c'), 'aBC');
65
+ assert.strictEqual(keb2cam('background-color'), 'backgroundColor');
66
+ });
67
+ it('handles edge cases correctly', () => {
68
+ assert.strictEqual(keb2cam(''), '', 'Should handle empty string');
69
+ assert.strictEqual(keb2cam('single'), 'single', 'Should handle a single word');
70
+ assert.strictEqual(keb2cam('-foo-bar'), 'fooBar', 'Should handle leading hyphen');
71
+ assert.strictEqual(keb2cam('baz-quux-'), 'bazQuux', 'Should handle trailing hyphen');
72
+ assert.strictEqual(keb2cam('car--tux'), 'carTux', 'Should handle multiple hyphens');
73
+ });
74
+ it('does not convert other cases', () => {
75
+ assert.strictEqual(keb2cam('camelCase'), 'camelCase', 'Should not change camelCase');
76
+ assert.strictEqual(keb2cam('snake_case'), 'snake_case', 'Should not convert snake_case');
77
+ });
78
+ });
79
+ //# sourceMappingURL=case.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case.test.js","sourceRoot":"","sources":["../src/case.test.ts"],"names":[],"mappings":"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"}
package/lib/h.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { WHE } from './WHE.js';
2
+ import { Wrappable } from './WN-mixin.js';
3
+ export declare function h(tagName: string, attributes: Record<string, string>, ...children: Wrappable[]): WHE;
package/lib/h.js ADDED
@@ -0,0 +1,9 @@
1
+ import { WHE } from './WHE.js';
2
+ export function h(tagName, attributes, ...children) {
3
+ const ret = WHE.fromTag(tagName).append(...children);
4
+ if (attributes) {
5
+ ret.setAttrs(attributes);
6
+ }
7
+ return ret;
8
+ }
9
+ //# sourceMappingURL=h.js.map
package/lib/h.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"h.js","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,MAAM,UAAU,CAAC,CAAC,OAAe,EAAE,UAAkC,EAAE,GAAG,QAAqB;IAC3F,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAA;IACpD,IAAI,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export * from './util.js';
2
+ export * from './case.js';
3
+ export * from './WN.js';
4
+ export * from './WT.js';
5
+ export * from './WE.js';
6
+ export * from './WHE.js';
7
+ export * from './WDF.js';
8
+ export * from './WSH.js';
9
+ export * from './WC.js';
10
+ import './WN-mixin.js';
11
+ export * from './h.js';
package/lib/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from './util.js';
2
+ export * from './case.js';
3
+ export * from './WN.js';
4
+ export * from './WT.js';
5
+ export * from './WE.js';
6
+ export * from './WHE.js';
7
+ export * from './WDF.js';
8
+ export * from './WSH.js';
9
+ export * from './WC.js';
10
+ import './WN-mixin.js';
11
+ export * from './h.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,OAAO,eAAe,CAAA;AACtB,cAAc,QAAQ,CAAA"}
package/lib/util.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /** Used to Give the UI a moment to update */
2
+ export declare function nextAnimationFrame(): Promise<number>;
3
+ export declare function on(target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): void;
4
+ export declare function off(target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): void;
package/lib/util.js ADDED
@@ -0,0 +1,11 @@
1
+ /** Used to Give the UI a moment to update */
2
+ export function nextAnimationFrame() {
3
+ return new Promise((resolve) => requestAnimationFrame(resolve));
4
+ }
5
+ export function on(target, eventName, handler) {
6
+ target.addEventListener(eventName, handler);
7
+ }
8
+ export function off(target, eventName, handler) {
9
+ target.removeEventListener(eventName, handler);
10
+ }
11
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,MAAmB,EAAE,SAAiB,EAAE,OAA2C;IAClG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,MAAmB,EAAE,SAAiB,EAAE,OAA2C;IACnG,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAClD,CAAC"}
package/package.json CHANGED
@@ -1,28 +1,58 @@
1
1
  {
2
- "name": "jj",
3
- "version": "0.1.1",
4
- "description": "Make HTML and CSS in Just Javascript!",
5
- "module": "index.js",
6
- "scripts": {
7
- "postversion": "git push --tags",
8
- "prepublishOnly": "npm run build",
9
- "build": "rollup --config"
10
- },
11
- "type": "module",
12
- "keywords": [],
13
- "author": {
14
- "name": "Alex Ewerlöf",
15
- "email": "hanifbbz@gmail.com"
16
- },
17
- "license": "MIT",
18
- "devDependencies": {
19
- "rollup": "^1.29.0",
20
- "rollup-plugin-gzip": "^2.2.0",
21
- "rollup-plugin-terser": "^5.1.3"
22
- },
23
- "repository": {
24
- "type": "git",
25
- "url": "https://github.com/userpixel/jj"
26
- },
27
- "homepage": "https://www.npmjs.com/package/jj"
2
+ "name": "jj",
3
+ "version": "2.1.0",
4
+ "description": "A minimal DOM manipulation library with web components",
5
+ "keywords": [
6
+ "javascript",
7
+ "language",
8
+ "DOM",
9
+ "typescript",
10
+ "imperative programming"
11
+ ],
12
+ "type": "module",
13
+ "main": "./lib/index.js",
14
+ "unpkg": "./lib/bundle.js",
15
+ "exports": {
16
+ "types": "./lib/index.d.ts",
17
+ "import": "./lib/index.js"
18
+ },
19
+ "directories": {
20
+ "lib": "lib",
21
+ "doc": "doc",
22
+ "test": "test"
23
+ },
24
+ "files": [
25
+ "lib"
26
+ ],
27
+ "scripts": {
28
+ "doc": "typedoc src/index.ts",
29
+ "build": "tsc",
30
+ "bundle": "esbuild src/index.ts --bundle --outfile=lib/bundle.js --format=esm --sourcemap",
31
+ "bundle:min": "esbuild src/index.ts --bundle --outfile=lib/bundle.min.js --format=esm --minify",
32
+ "typecheck": "tsc --noEmit",
33
+ "fmt": "prettier --write .",
34
+ "test": "npm run typecheck && node --import tsx --test",
35
+ "test:watch": "npm run typecheck && node --import tsx --test --watch",
36
+ "test:coverage": "npm run typecheck && node --import tsx --test --experimental-test-coverage",
37
+ "preversion": "npm run fmt && npm t",
38
+ "prepublishOnly": "rm -rf lib && npm run build && npm run bundle && npm run bundle:min",
39
+ "postversion": "git push && git push --tags"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/alexewerlof/jj.git"
44
+ },
45
+ "author": "Alex Ewerlöf",
46
+ "license": "MIT",
47
+ "devDependencies": {
48
+ "@types/node": "^24.7.2",
49
+ "esbuild": "^0.27.2",
50
+ "prettier": "^3.6.2",
51
+ "tsx": "^4.20.6",
52
+ "typedoc": "^0.28.14",
53
+ "typescript": "^5.9.3"
54
+ },
55
+ "dependencies": {
56
+ "jty": "^4.0.0"
57
+ }
28
58
  }
package/CSS.js DELETED
@@ -1,145 +0,0 @@
1
- import { mapKeyVal, camel2kebab, nl, ind, isObj, isNum, isStr, isArr, qut } from './util.js'
2
- import { isDim } from './unit.js'
3
-
4
- function isAtRule(selectorTxt) {
5
- return selectorTxt.trimLeft().startsWith('@')
6
- }
7
-
8
- function toValue(val) {
9
- if (isStr(val)) {
10
- if (val.trim() === '') {
11
- return qut(val)
12
- }
13
- return val
14
- }
15
- if (isNum(val)) {
16
- return String(val)
17
- }
18
- if (isDim(val)) {
19
- return String(val)
20
- } else if (isArr(val)) {
21
- return val.join(' ')
22
- }
23
- }
24
-
25
- function extractRules(selectorTxt, bodyObj) {
26
- const baseRule = new SimpleRule(selectorTxt)
27
- const ownProps = baseRule.bodyObj
28
- const nestedRules = [baseRule]
29
- mapKeyVal(bodyObj, (key, val) => {
30
- const v = toValue(val)
31
- if (v !== undefined) {
32
- ownProps[key] = v
33
- } else if (isAtRule(key)) {
34
- nestedRules.push(new WrapperRule(key, { [selectorTxt]: val }))
35
- } else {
36
- let nestedSelectorTxt = key.replace(/&/g, selectorTxt)
37
- if (nestedSelectorTxt === key) {
38
- // No & was present, so the replacement didn't do anything. Nest the selectors
39
- nestedSelectorTxt = selectorTxt + ' ' + key
40
- }
41
- nestedRules.push(new NestedRule(nestedSelectorTxt, val))
42
- }
43
- })
44
- return nestedRules
45
- }
46
-
47
- function propVal(indentation, prop, val) {
48
- const colon = indentation < 0 ? ':' : ': '
49
- return camel2kebab(prop)
50
- + colon
51
- + toValue(val)
52
- + ';'
53
- }
54
-
55
- class SimpleRule {
56
- constructor(selectorTxt, bodyObj = {}) {
57
- this.selectorTxt = selectorTxt
58
- this.bodyObj = bodyObj
59
- }
60
-
61
- get isEmpty() {
62
- return Object.keys(this.bodyObj).length === 0
63
- }
64
-
65
- toString(indentation = 0) {
66
- if (this.isEmpty) {
67
- return indentation >= 0 ? ind(indentation) + `/* ${this.selectorTxt} {} */`: ''
68
- }
69
- let ret = ind(indentation) + this.selectorTxt
70
- if (indentation >= 0) {
71
- ret += ' '
72
- }
73
- ret += '{' + nl(indentation)
74
- const space = ind(indentation, 1)
75
- ret += mapKeyVal(this.bodyObj, (key, val) => space + propVal(indentation, key, val))
76
- .join(nl(indentation))
77
- if (indentation >= 0) {
78
- ret += nl(indentation) + ind(indentation)
79
- }
80
- ret += '}'
81
- return ret
82
- }
83
- }
84
-
85
- class NestedRule {
86
- constructor(selectorTxt, bodyObj) {
87
- this.selectorTxt = selectorTxt
88
- this.bodyObj = bodyObj
89
- }
90
-
91
- toString(indentation = 0) {
92
- if (isObj(this.bodyObj)) {
93
- return extractRules(this.selectorTxt, this.bodyObj)
94
- .map(rule => rule.toString(indentation))
95
- .join(nl(indentation))
96
- }
97
- const v = toValue(this.bodyObj)
98
- if (v !== undefined) {
99
- return ind(indentation) + propVal(indentation, this.selectorTxt, v)
100
- }
101
- return ind(indentation) + this.selectorTxt
102
- }
103
- }
104
-
105
- class WrapperRule {
106
- constructor(selectorTxt, ruleSet) {
107
- this.selectorTxt = selectorTxt
108
- this.ruleSet = ruleSet
109
- }
110
-
111
- toString(indentation = 0) {
112
- let ret = ind(indentation) + this.selectorTxt
113
- if (isObj(this.ruleSet)) {
114
- const childIndentation = indentation >= 0 ? indentation + 1 : -1
115
- if (indentation >= 0) {
116
- ret += ' '
117
- }
118
- ret += '{' + nl(indentation)
119
- ret += objToRulesArr(this.ruleSet)
120
- .map(rule => rule.toString(childIndentation))
121
- .join(nl(indentation))
122
- ret += nl(indentation)
123
- ret += ind(indentation) + '}'
124
- } else {
125
- ret += ';'
126
- }
127
- return ret
128
- }
129
- }
130
-
131
- export function objToRulesArr(obj) {
132
- if (!isObj(obj)){
133
- if (isStr(obj)) {
134
- obj = { [obj]: null }
135
- } else {
136
- throw new TypeError(`Invalid style descriptor: ${obj}`)
137
- }
138
- }
139
- return mapKeyVal(obj, (selectorTxt, bodyObj) => {
140
- if (isAtRule(selectorTxt)) {
141
- return new WrapperRule(selectorTxt, bodyObj)
142
- }
143
- return new NestedRule(selectorTxt, bodyObj)
144
- })
145
- }