diff --git a/package.json b/package.json index d35f9b88..a4006cb6 100644 --- a/package.json +++ b/package.json @@ -71,15 +71,16 @@ "build:demo:watch": "vite build --mode demo --watch", "build:icons": "node ./tools/generate-sprite", "lint": "eslint ./src --ext .js || true", - "test": "node --experimental-test-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.js", - "test:updateSnapshots": "node --experimental-test-snapshots --test-update-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.js", - "test:ci": "yarn test --coverage", + "test": "node --experimental-test-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.{js,mjs}", + "test:updateSnapshots": "node --experimental-test-snapshots --test-update-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.{js,mjs}", + "test:ci": "npm test --coverage", "start": "npm-run-all build:icons dev", "semantic-release": "semantic-release --ci --debug", "copy:lang": "node ./tools/copy-directory.mjs ./node_modules/formeo-i18n/dist/lang ./src/demo/assets/lang", "travis-deploy-once": "travis-deploy-once --pro", - "prepush": "yarn test", - "defaults": "webpack-defaults" + "prepush": "npm test", + "prepare": "lefthook install", + "postmerge": "lefthook install" }, "devDependencies": { "@biomejs/biome": "^1.9.3", diff --git a/src/lib/js/common/dom.js b/src/lib/js/common/dom.js index a255a123..3a2850c8 100644 --- a/src/lib/js/common/dom.js +++ b/src/lib/js/common/dom.js @@ -23,6 +23,8 @@ const iconFontTemplates = { fontello: icon => `${icon}`, } +const inputTags = new Set(['input', 'textarea', 'select']) + /** * General purpose markup utilities and generator. */ @@ -31,20 +33,12 @@ class DOM { * Set defaults, store references to key elements * like stages, rows, columns etc */ - constructor() { - this.options = Object.create(null) - this.styleSheet = (() => { - const style = document.createElement('style') - style.setAttribute('media', 'screen') - style.setAttribute('type', 'text/css') - style.appendChild(document.createTextNode('')) - document.head.appendChild(style) - return style.sheet - })() + constructor(options = Object.create(null)) { + this.options = options } set setOptions(options) { - this.options = merge(Object.assign({}, this.options, options)) + this.options = merge(this.options, options) } /** @@ -52,14 +46,18 @@ class DOM { * @param {Object|String} elem * @return {Object} valid element object */ - processTagName(elem) { + processTagName(elemArg) { + let elem = elemArg let tagName if (typeof elem === 'string') { tagName = elem elem = { tag: tagName } + return elem } + if (elem.attrs) { const { tag, ...restAttrs } = elem.attrs + // this is used for interchangeable tagNames like h1, h2, h3 etc if (tag) { if (typeof tag === 'string') { tagName = tag @@ -92,12 +90,11 @@ class DOM { * @return {Object} DOM Object */ create = (elemArg, isPreview = false) => { - let elem = elemArg - if (!elem) { + if (!elemArg) { return } - elem = this.processTagName(elem) + const { className, options, ...elem } = this.processTagName(elemArg) const _this = this let childType const { tag } = elem @@ -147,41 +144,29 @@ class DOM { processed.push('tag') // check for root className property - if (elem.className) { - const { className } = elem - elem.attrs = Object.assign({}, elem.attrs, { className }) - delete elem.className + if (className) { + elem.attrs = { ...elem.attrs, className } } - // Append Element Content - if (elem.options) { - let { options } = elem - options = this.processOptions(options, elem, isPreview) + if (options) { + const processedOptions = this.processOptions(options, elem, isPreview) if (this.holdsContent(element) && tag !== 'button') { // mainly used for