Files
headroom/frontend/node_modules/happy-dom/lib/dom/DOMStringMap.js
Santhosh Janardhanan de2d83092e feat: Reinitialize frontend with SvelteKit and TypeScript
- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
2026-02-17 16:19:59 -05:00

74 lines
3.2 KiB
JavaScript

import * as PropertySymbol from '../PropertySymbol.js';
import DOMStringMapUtility from './DOMStringMapUtility.js';
/**
* Dataset factory.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
*/
export default class DOMStringMap {
/**
* Constructor.
*
* @param illegalConstructorSymbol Illegal constructor symbol.
* @param element Element.
*/
constructor(illegalConstructorSymbol, element) {
if (illegalConstructorSymbol !== PropertySymbol.illegalConstructor) {
throw new TypeError('Illegal constructor');
}
// Documentation for Proxy:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
return new Proxy(this, {
get(_target, property) {
const attribute = element.getAttribute('data-' + DOMStringMapUtility.camelCaseToKebab(property));
if (attribute !== null) {
return attribute;
}
},
set(_target, property, value) {
element.setAttribute('data-' + DOMStringMapUtility.camelCaseToKebab(property), value);
return true;
},
deleteProperty(_target, property) {
element.removeAttribute('data-' + DOMStringMapUtility.camelCaseToKebab(property));
return true;
},
ownKeys(_target) {
// According to Mozilla we have to update the dataset object (target) to contain the same keys as what we return:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/ownKeys
// "The result List must contain the keys of all non-configurable own properties of the target object."
const keys = [];
for (const items of element[PropertySymbol.attributes][PropertySymbol.itemsByName].values()) {
if (items[0][PropertySymbol.name].startsWith('data-')) {
keys.push(DOMStringMapUtility.kebabToCamelCase(items[0][PropertySymbol.name].replace('data-', '')));
}
}
return keys;
},
has(_target, property) {
return element.hasAttribute('data-' + DOMStringMapUtility.camelCaseToKebab(property));
},
defineProperty(_target, property, descriptor) {
if (descriptor.value === undefined) {
return false;
}
element.setAttribute('data-' + DOMStringMapUtility.camelCaseToKebab(property), descriptor.value);
return true;
},
getOwnPropertyDescriptor(_target, property) {
const attribute = element.getAttribute('data-' + DOMStringMapUtility.camelCaseToKebab(property));
if (!attribute) {
return;
}
return {
value: attribute,
writable: true,
enumerable: true,
configurable: true
};
}
});
}
}
//# sourceMappingURL=DOMStringMap.js.map