1. /**
  2. * Attaches metadata to DOM elements for local utility purposes.
  3. *
  4. * @param {HTMLElement} element The DOM element to attach metadata to.
  5. * @param {object} metadata An object containing metadata properties.
  6. * @returns {void}
  7. * @throws {TypeError} If element is not an HTMLElement.
  8. */
  9. function attachMetadata(element, metadata) {
  10. if (!(element instanceof HTMLElement)) {
  11. throw new TypeError("Element must be an HTMLElement.");
  12. }
  13. if (typeof metadata !== 'object' || metadata === null) {
  14. console.warn("Metadata must be an object. Ignoring.");
  15. return;
  16. }
  17. const elementMetadata = element.dataset || {}; // Use dataset if available
  18. for (const key in metadata) {
  19. if (metadata.hasOwnProperty(key)) {
  20. const value = metadata[key];
  21. // Defensive check: Ensure value is a primitive or an object that can be stringified.
  22. if (typeof value !== 'undefined') {
  23. try {
  24. elementMetadata[key] = JSON.stringify(value); // Store metadata as string
  25. } catch (error) {
  26. console.warn(`Could not stringify metadata for key "${key}". Ignoring.`);
  27. }
  28. }
  29. }
  30. }
  31. if (element.dataset) {
  32. Object.assign(element.dataset, elementMetadata); // Merge with dataset
  33. } else {
  34. Object.assign(element, elementMetadata); //Otherwise, directly assign to element
  35. }
  36. }

Add your comment