@litejs/dom 26.2.0 → 26.4.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 (4) hide show
  1. package/README.md +1 -1
  2. package/css.js +6 -3
  3. package/dom.js +47 -2
  4. package/package.json +2 -2
package/README.md CHANGED
@@ -64,7 +64,7 @@ Follow [Coding Style Guide](https://github.com/litejs/litejs/wiki/Style-Guide),
64
64
  run tests `npm install; npm test`.
65
65
 
66
66
 
67
- > Copyright (c) 2014-2025 Lauri Rooden <lauri@rooden.ee>
67
+ > Copyright (c) 2014-2026 Lauri Rooden <lauri@rooden.ee>
68
68
  [MIT License](https://litejs.com/MIT-LICENSE.txt) |
69
69
  [GitHub repo](https://github.com/litejs/dom) |
70
70
  [npm package](https://npmjs.org/package/@litejs/dom) |
package/css.js CHANGED
@@ -8,7 +8,7 @@ exports.CSSStyleSheet = CSSStyleSheet
8
8
 
9
9
  /* c8 ignore next */
10
10
  var URL = global.URL || require("url").URL
11
- , varRe = /var\((--[^,)]+)(?:,([^)]+))?\)/g
11
+ , varRe = /var\((--[^,)]+),?\s*([^)]*)\)/g
12
12
  , CSS = exports.CSS = {
13
13
  escape(sel) {
14
14
  return ("" + sel).replace(/[^a-zA-Z0-9_\u00A0-\uFFFF-]/g, "\\$&").replace(/^(-?)([0-9])/, "$1\\3$2 ")
@@ -59,7 +59,10 @@ var URL = global.URL || require("url").URL
59
59
  }
60
60
  }
61
61
  , toUrl = (dir) => new URL((dir || ".").replace(/\/+$/, "") + "/", "file:///").href
62
- , read = (root, url, baseURI, enc = "utf8") => require("fs").readFileSync(new URL(url, new URL((baseURI || ".") + "/", new URL((root || ".").replace(/\/+$/, "") + "/", "file:///" + process.cwd() + "/"))).pathname.split(/[+#]/)[0], enc)
62
+ , read = (root, url, baseURI, enc = "utf8") => require("fs").readFileSync(
63
+ new URL(url, new URL((baseURI || ".") + "/", new URL((root || ".").replace(/\/+$/, "") + "/", "file:///" + process.cwd() + "/"))).pathname.replace(/^\/(?=\w:)|[+#].*/, ""),
64
+ enc
65
+ )
63
66
  , plugins = exports.plugins = {
64
67
  "data-uri": function(root, baseURI, v) {
65
68
  var { DOMParser } = require("./dom.js")
@@ -88,7 +91,7 @@ var URL = global.URL || require("url").URL
88
91
  q ? (q = str.indexOf("'") == -1 ? "'" : "\"", q + str.replace(q === "'" ? /\\(")/g : /\\(')/g, "$1")) + q :
89
92
  c ? "" :
90
93
  _.replace(/[\t\n]+/g, " ")
91
- .replace(/ +(?=[,;{}>~+\/])/g, "").replace(/([,;{}>~+\/]) +/g, "$1")
94
+ .replace(/ *([,;{}>~+\/]) */g, "$1")
92
95
  .replace(/;(?=})/g, "")
93
96
  .replace(/: +/g, ":")
94
97
  .replace(/([ :,])0\.([0-9])/g, "$1.$2")
package/dom.js CHANGED
@@ -19,6 +19,7 @@ var boolAttrs = {
19
19
  , svgVoidElements = {
20
20
  circle:1, ellipse:1, image:1, line:1, path:1, polygon:1, polyline:1, rect:1, stop:1, use:1,
21
21
  }
22
+ , listeners = new WeakMap()
22
23
  , rawTextElements = { SCRIPT: /<(?=\/script)/i, STYLE: /<(?=\/style)/i }
23
24
  , rawTextEscape = { SCRIPT: /<(?=\/script|!--)/ig, STYLE: /<(?=\/style|!--)/ig }
24
25
  , hasOwn = voidElements.hasOwnProperty
@@ -222,10 +223,10 @@ var boolAttrs = {
222
223
  }
223
224
  , Element = {
224
225
  get firstElementChild() {
225
- return getElement(this.childNodes, 0, 1, 1)
226
+ return getElement(this.childNodes, 0, 1)
226
227
  },
227
228
  get lastElementChild() {
228
- return getElement(this.childNodes, this.childNodes.length - 1, -1, 1)
229
+ return getElement(this.childNodes, this.childNodes.length - 1, -1)
229
230
  },
230
231
  get nextElementSibling() {
231
232
  return getSibling(this, 1, 1)
@@ -319,6 +320,18 @@ function Attr(node, name, value) {
319
320
  this.value = "" + value
320
321
  }
321
322
 
323
+ function Event(type, opts) {
324
+ Object.assign(this, {type, bubbles: false, cancelable: false, defaultPrevented: false}, opts)
325
+ }
326
+ Event.prototype = {
327
+ stopPropagation() {
328
+ this.bubbles = false
329
+ },
330
+ preventDefault() {
331
+ if (this.cancelable) this.defaultPrevented = true
332
+ }
333
+ }
334
+
322
335
  function NamedNodeMap(node) {
323
336
  Object.defineProperties(this, {
324
337
  length: { get() { return this.names().length } },
@@ -398,15 +411,46 @@ extendNode(HTMLElement, Element, {
398
411
  namespaceURI: "http://www.w3.org/1999/xhtml",
399
412
  nodeType: 1,
400
413
  tagName: null,
414
+ get elements() {
415
+ return this.tagName === "FORM" ? selector.find(this, "input,select,textarea,button") : undefined
416
+ },
417
+ get labels() {
418
+ if (!selector.matches(this, "input,select,textarea,button")) return
419
+ var labels = this.id ? selector.find(this.ownerDocument, "label[for='" + this.id + "']") : []
420
+ , parent = selector.closest(this, "label")
421
+ if (parent && labels.indexOf(parent) < 0) labels.push(parent)
422
+ return labels
423
+ },
401
424
  get sheet() {
402
425
  return makeSheet(this)
403
426
  },
404
427
  blur() {
405
428
  this.ownerDocument.activeElement = this.ownerDocument.body || null
406
429
  },
430
+ click() {
431
+ this.dispatchEvent(new Event("click", { bubbles: true, cancelable: true }))
432
+ },
407
433
  closest(sel) {
408
434
  return selector.closest(this, sel)
409
435
  },
436
+ addEventListener(type, fn) {
437
+ var map = listeners.get(this)
438
+ if (!map) listeners.set(this, map = {})
439
+ ;(map[type] || (map[type] = [])).push(fn)
440
+ },
441
+ dispatchEvent(ev) {
442
+ if (!ev.target) ev.target = this
443
+ var fns = (listeners.get(this) || {})[ev.type]
444
+ if (fns) fns.forEach(function(fn) { fn.call(this, ev) }, this)
445
+ if (ev.bubbles && this.parentNode && this.parentNode.dispatchEvent) {
446
+ this.parentNode.dispatchEvent(ev)
447
+ }
448
+ },
449
+ removeEventListener(type, fn) {
450
+ var fns = (listeners.get(this) || {})[type]
451
+ , i = fns ? fns.indexOf(fn) : -1
452
+ if (i > -1) fns.splice(i, 1)
453
+ },
410
454
  focus() {
411
455
  this.ownerDocument.activeElement = this
412
456
  },
@@ -571,6 +615,7 @@ exports.CSSStyleSheet = CSSStyleSheet
571
615
  exports.DOMParser = DOMParser
572
616
  exports.Document = Document
573
617
  exports.DocumentFragment = DocumentFragment
618
+ exports.Event = Event
574
619
  exports.HTMLElement = HTMLElement
575
620
  exports.Node = Node
576
621
  exports.XMLSerializer = XMLSerializer
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litejs/dom",
3
- "version": "26.2.0",
3
+ "version": "26.4.0",
4
4
  "description": "A small DOM library for server-side testing, rendering, and handling of HTML files",
5
5
  "license": "MIT",
6
6
  "author": "Lauri Rooden <lauri@rooden.ee>",
@@ -29,6 +29,6 @@
29
29
  "url": "https://github.com/litejs/dom.git"
30
30
  },
31
31
  "devDependencies": {
32
- "@litejs/cli": "25.1.0"
32
+ "@litejs/cli": "26.3.0"
33
33
  }
34
34
  }