diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f59932..75f5e18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [v2.0.1] - 2026-03-06 + +### Changed +- Use `Signal.State` for attributes & `Signal.Computed` to derive the selectors + ## [v2.0.0] - 2026-03-01 ## Added diff --git a/events.js b/events.js index 4583d4a..58e5bff 100644 --- a/events.js +++ b/events.js @@ -1,4 +1,5 @@ import { hasCallback, getCallback } from './callbacks.js'; +import { Signal } from '@shgysk8zer0/signals'; const PREFIX = 'data-aegis-event-'; const EVENT_PREFIX = PREFIX + 'on-'; @@ -112,7 +113,7 @@ export const onWebkitanimationstart = EVENT_PREFIX + 'webkitanimationstart'; export const onWebkittransitionend = EVENT_PREFIX + 'webkittransitionend'; export const onError = EVENT_PREFIX + 'error'; -export const eventAttrs = [ +const eventAttrs = new Signal.State([ onAbort, onBlur, onFocus, @@ -209,15 +210,15 @@ export const eventAttrs = [ onWebkitanimationstart, onWebkittransitionend, onError, -]; +]); -let selector = eventAttrs.map(attr => `[${CSS.escape(attr)}]`).join(', '); +const selector = new Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(', ')); const attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`; export const eventToProp = event => EVENT_PREFIX + event; -export const hasEventAttribute = event => eventAttrs.includes(EVENT_PREFIX + event); +export const hasEventAttribute = event => eventAttrs.get().includes(EVENT_PREFIX + event); const isEventDataAttr = ([name]) => name.startsWith(DATA_PREFIX); @@ -400,13 +401,13 @@ export function registerEventAttribute(attr, { signal, } = {}) { const fullAttr = EVENT_PREFIX + attr.toLowerCase(); + const attrs = eventAttrs.get(); - if (! eventAttrs.includes(fullAttr)) { + if (! attrs.includes(fullAttr)) { const sel = `[${CSS.escape(fullAttr)}]`; const prop = attrToProp(fullAttr); - eventAttrs.push(fullAttr); + eventAttrs.set([...attrs, fullAttr]); EVENTS[prop] = fullAttr; - selector += `, ${sel}`; if (addListeners) { requestAnimationFrame(() => { @@ -556,9 +557,9 @@ export function unregisterSignal(signal) { * @returns {Element|Document} Returns the passed target node */ export function attachListeners(target, { signal } = {}) { - const nodes = target instanceof Element && target.matches(selector) - ? [target, ...target.querySelectorAll(selector)] - : target.querySelectorAll(selector); + const nodes = target instanceof Element && target.matches(selector.get()) + ? [target, ...target.querySelectorAll(selector.get())] + : target.querySelectorAll(selector.get()); nodes.forEach(el => _addListeners(el, { signal })); @@ -578,7 +579,7 @@ export function observeEvents(root = document) { childList:true, attributes: true, attributeOldValue: true, - attributeFilter: eventAttrs, + attributeFilter: eventAttrs.get(), }); } diff --git a/package-lock.json b/package-lock.json index c5d37b7..901b348 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aegisjsproject/callback-registry", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@aegisjsproject/callback-registry", - "version": "2.0.0", + "version": "2.0.1", "funding": [ { "type": "librepay", @@ -18,13 +18,17 @@ } ], "license": "MIT", + "dependencies": { + "@shgysk8zer0/signals": "^0.0.3" + }, "devDependencies": { "@rollup/plugin-terser": "^1.0.0", "@shgysk8zer0/eslint-config": "^1.0.5", - "@shgysk8zer0/polyfills": "^0.6.0", - "eslint": "^10.0.0", + "@shgysk8zer0/polyfills": "^0.6.2", + "@shgysk8zer0/rollup-import": "^2.0.2", + "eslint": "^10.0.2", "http-server": "^14.1.1", - "rollup": "^4.27.2" + "rollup": "^4.59.0" }, "engines": { "node": ">=18.0.0" @@ -742,6 +746,26 @@ "win32" ] }, + "node_modules/@shgysk8zer0/consts": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@shgysk8zer0/consts/-/consts-1.0.8.tgz", + "integrity": "sha512-BY43fFT3rgQPSZn4n9sA0KjJ+KMKQZq3Y63pnCvXyL7GYYcD+QNJq8mGdmOXFuO90L3XKpef5RmEvtNNb/XwcA==", + "dev": true, + "funding": [ + { + "type": "librepay", + "url": "https://liberapay.com/shgysk8zer0" + }, + { + "type": "github", + "url": "https://github.com/sponsors/shgysk8zer0" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@shgysk8zer0/eslint-config": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@shgysk8zer0/eslint-config/-/eslint-config-1.0.7.tgz", @@ -770,6 +794,21 @@ "node": ">=18.0.0" } }, + "node_modules/@shgysk8zer0/npm-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@shgysk8zer0/npm-utils/-/npm-utils-1.1.4.tgz", + "integrity": "sha512-WRucTC6HCWWHYw/NfQ6NWv+gKi8MCzaT6XBpcCZr9i304Yes27ZkKccCOyNCV5TO14FX05QSCNVn6TTuswdWUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shgysk8zer0/consts": "^1.0.8", + "@shgysk8zer0/polyfills": "^0.6.2", + "js-yaml": "^4.1.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@shgysk8zer0/polyfills": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/@shgysk8zer0/polyfills/-/polyfills-0.6.2.tgz", @@ -792,6 +831,53 @@ "@aegisjsproject/trusted-types": "^1.0.2" } }, + "node_modules/@shgysk8zer0/rollup-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@shgysk8zer0/rollup-import/-/rollup-import-2.0.2.tgz", + "integrity": "sha512-MLC9jHLZ2an2pID10nwRelzI1kX0xJZxiMY2k9wwz7Asl+1h0rs6WtyN4wCRKERdlEI0I2D8JjKQq+GiG211fw==", + "dev": true, + "funding": [ + { + "type": "librepay", + "url": "https://liberapay.com/shgysk8zer0" + }, + { + "type": "github", + "url": "https://github.com/sponsors/shgysk8zer0" + } + ], + "license": "MIT", + "dependencies": { + "@shgysk8zer0/consts": "^1.0.7", + "@shgysk8zer0/npm-utils": "^1.1.2", + "magic-string": "^0.30.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "rollup": ">=3.24.0" + } + }, + "node_modules/@shgysk8zer0/signals": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@shgysk8zer0/signals/-/signals-0.0.3.tgz", + "integrity": "sha512-mUSWKyZILwAoVIhwjM/QGVYfihEZgepO6TUV2BtOlHLqXkwhUMirEMDNOER/mkc+JnhpVDa0luiqbxpo+ZVG0g==", + "funding": [ + { + "type": "librepay", + "url": "https://liberapay.com/shgysk8zer0" + }, + { + "type": "github", + "url": "https://github.com/sponsors/shgysk8zer0" + } + ], + "license": "MIT", + "engines": { + "node": ">=24.10.0" + } + }, "node_modules/@types/esrecurse": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", @@ -826,6 +912,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -876,6 +963,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -1128,6 +1222,7 @@ "integrity": "sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", @@ -1672,6 +1767,19 @@ "dev": true, "license": "ISC" }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1733,6 +1841,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1993,6 +2111,7 @@ "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, diff --git a/package.json b/package.json index 719b45a..4a6ada6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@aegisjsproject/callback-registry", - "version": "2.0.0", + "version": "2.0.1", "description": " A callback registry for AegisJSProject", "keywords": [ "aegis", @@ -49,6 +49,7 @@ "run:tests": "node --test *.test.js", "clean": "rm -f ./*.cjs", "build:js": "npm run clean && rollup -c rollup.config.js", + "update:importmap": "npx --package=@shgysk8zer0/importmap importmap-html test/index.html", "create:lock": "npm i --package-lock-only --ignore-scripts --no-audit --no-fund", "version:bump": "npm run version:bump:patch", "version:bump:patch": "npm version --no-git-tag-version patch && npm run create:lock", @@ -78,9 +79,13 @@ "devDependencies": { "@rollup/plugin-terser": "^1.0.0", "@shgysk8zer0/eslint-config": "^1.0.5", - "@shgysk8zer0/polyfills": "^0.6.0", - "eslint": "^10.0.0", + "@shgysk8zer0/polyfills": "^0.6.2", + "@shgysk8zer0/rollup-import": "^2.0.2", + "eslint": "^10.0.2", "http-server": "^14.1.1", - "rollup": "^4.27.2" + "rollup": "^4.59.0" + }, + "dependencies": { + "@shgysk8zer0/signals": "^0.0.3" } } diff --git a/test/index.html b/test/index.html index 884cea8..949a31c 100644 --- a/test/index.html +++ b/test/index.html @@ -6,20 +6,12 @@ AegisJSProject Callback Registry - +