UNPKG

dom-form-serializer

Version:
1 lines 19.3 kB
{"version":3,"file":null,"sources":["../lib/TypeRegistry.js","../lib/KeyExtractors.js","../lib/InputReaders.js","../lib/KeyAssignmentValidators.js","../lib/keySplitter.js","../lib/getElementType.js","../lib/getInputElements.js","../lib/assignKeyValue.js","../lib/serialize.js","../lib/InputWriters.js","../lib/keyJoiner.js","../lib/flattenData.js","../lib/deserialize.js"],"sourcesContent":["export default class TypeRegistry {\n constructor (initial = {}) {\n this.registeredTypes = initial\n }\n\n get (type) {\n if (typeof this.registeredTypes[type] !== 'undefined') {\n return this.registeredTypes[type]\n } else {\n return this.registeredTypes['default']\n }\n }\n\n register (type, item) {\n if (typeof this.registeredTypes[type] === 'undefined') {\n this.registeredTypes[type] = item\n }\n }\n\n registerDefault (item) {\n this.register('default', item)\n }\n}\n","import TypeRegistry from './TypeRegistry'\n\nexport default class KeyExtractors extends TypeRegistry {\n constructor (options) {\n super(options)\n this.registerDefault(el => (el.getAttribute('name') || ''))\n }\n}\n","import TypeRegistry from './TypeRegistry'\n\nexport default class InputReaders extends TypeRegistry {\n constructor (options) {\n super(options)\n this.registerDefault(el => el.value)\n this.register('checkbox', el => el.getAttribute('value') !== null ? (el.checked ? el.getAttribute('value') : null) : el.checked)\n this.register('select', el => getSelectValue(el))\n }\n}\n\n/**\n * Read select values\n *\n * @see {@link https://github.com/jquery/jquery/blob/master/src/attributes/val.js|Github}\n * @param {object} Select element\n * @return {string|Array} Select value(s)\n */\nfunction getSelectValue (elem) {\n var value, option, i\n var options = elem.options\n var index = elem.selectedIndex\n var one = elem.type === 'select-one'\n var values = one ? null : []\n var max = one ? index + 1 : options.length\n\n if (index < 0) {\n i = max\n } else {\n i = one ? index : 0\n }\n\n // Loop through all the selected options\n for (; i < max; i++) {\n option = options[i]\n\n // Support: IE <=9 only\n // IE8-9 doesn't update selected after form reset\n if ((option.selected || i === index) &&\n\n // Don't return options that are disabled or in a disabled optgroup\n !option.disabled &&\n !(option.parentNode.disabled && option.parentNode.tagName.toLowerCase() === 'optgroup')\n ) {\n // Get the specific value for the option\n value = option.value\n\n // We don't need an array for one selects\n if (one) {\n return value\n }\n\n // Multi-Selects return an array\n values.push(value)\n }\n }\n\n return values\n}\n\n","import TypeRegistry from './TypeRegistry'\n\nexport default class KeyAssignmentValidators extends TypeRegistry {\n constructor (options) {\n super(options)\n this.registerDefault(() => true)\n this.register('radio', (el) => el.checked)\n }\n}\n","export default function keySplitter (key) {\n let matches = key.match(/[^[\\]]+/g)\n let lastKey\n if (key.length > 1 && key.indexOf('[]') === key.length - 2) {\n lastKey = matches.pop()\n matches.push([lastKey])\n }\n return matches\n}\n","export default function getElementType (el) {\n let typeAttr\n let tagName = el.tagName\n let type = tagName\n if (tagName.toLowerCase() === 'input') {\n typeAttr = el.getAttribute('type')\n if (typeAttr) {\n type = typeAttr\n } else {\n type = 'text'\n }\n }\n return type.toLowerCase()\n}\n","import getElementType from './getElementType'\n\nexport default function getInputElements (element, options) {\n return Array.prototype.filter.call(\n element.querySelectorAll('input,select,textarea'),\n (el) => {\n if (el.tagName.toLowerCase() === 'input' && (el.type === 'submit' || el.type === 'reset')) {\n return false\n }\n let myType = getElementType(el)\n let extractor = options.keyExtractors.get(myType)\n let identifier = extractor(el)\n let foundInInclude = (options.include || []).indexOf(identifier) !== -1\n let foundInExclude = (options.exclude || []).indexOf(identifier) !== -1\n let foundInIgnored = false\n let reject = false\n\n if (options.ignoredTypes) {\n for (let selector of options.ignoredTypes) {\n if (el.matches(selector)) {\n foundInIgnored = true\n }\n }\n }\n\n if (foundInInclude) {\n reject = false\n } else {\n if (options.include) {\n reject = true\n } else {\n reject = (foundInExclude || foundInIgnored)\n }\n }\n\n return !reject\n }\n )\n}\n","export default function assignKeyValue (obj, keychain, value) {\n if (!keychain) { return obj }\n\n var key = keychain.shift()\n\n // build the current object we need to store data\n if (!obj[key]) {\n obj[key] = Array.isArray(key) ? [] : {}\n }\n\n // if it's the last key in the chain, assign the value directly\n if (keychain.length === 0) {\n if (!Array.isArray(obj[key])) {\n obj[key] = value\n } else if (value !== null) {\n obj[key].push(value)\n }\n }\n\n // recursive parsing of the array, depth-first\n if (keychain.length > 0) {\n assignKeyValue(obj[key], keychain, value)\n }\n\n return obj\n}\n","import KeyExtractors from './KeyExtractors'\nimport InputReaders from './InputReaders'\nimport KeyAssignmentValidators from './KeyAssignmentValidators'\nimport defaultKeySplitter from './keySplitter'\nimport getInputElements from './getInputElements'\nimport getElementType from './getElementType'\nimport assignKeyValue from './assignKeyValue'\n\n/**\n * Get a JSON object that represents all of the form inputs, in this element.\n *\n * @param {HTMLElement} Root element\n * @param {object} options\n * @param {object} options.inputReaders\n * @param {object} options.keyAssignmentValidators\n * @param {object} options.keyExtractors\n * @param {object} options.keySplitter\n * @param {string[]} options.include\n * @param {string[]} options.exclude\n * @param {string[]} options.ignoredTypes\n * @return {object}\n */\nexport default function serialize (element, options = {}) {\n let data = {}\n options.keySplitter = options.keySplitter || defaultKeySplitter\n options.keyExtractors = new KeyExtractors(options.keyExtractors || {})\n options.inputReaders = new InputReaders(options.inputReaders || {})\n options.keyAssignmentValidators = new KeyAssignmentValidators(options.keyAssignmentValidators || {})\n\n Array.prototype.forEach.call(\n getInputElements(element, options),\n (el) => {\n let type = getElementType(el)\n let keyExtractor = options.keyExtractors.get(type)\n let key = keyExtractor(el)\n let inputReader = options.inputReaders.get(type)\n let value = inputReader(el)\n let validKeyAssignment = options.keyAssignmentValidators.get(type)\n if (validKeyAssignment(el, key, value)) {\n let keychain = options.keySplitter(key)\n data = assignKeyValue(data, keychain, value)\n }\n }\n )\n\n return data\n}\n","import TypeRegistry from './TypeRegistry'\n\nexport default class InputWriters extends TypeRegistry {\n constructor (options) {\n super(options)\n this.registerDefault((el, value) => { el.value = value })\n this.register('checkbox', (el, value) => {\n if (value === null) {\n el.indeterminate = true\n } else {\n el.checked = Array.isArray(value) ? value.indexOf(el.value) !== -1 : value\n }\n })\n this.register('radio', function (el, value) {\n if (value !== undefined) {\n el.checked = el.value === value.toString()\n }\n })\n this.register('select', setSelectValue)\n }\n}\n\nfunction makeArray (arr) {\n var ret = []\n if (arr !== null) {\n if (Array.isArray(arr)) {\n ret.push.apply(ret, arr)\n } else {\n ret.push(arr)\n }\n }\n return ret\n}\n\n/**\n * Write select values\n *\n * @see {@link https://github.com/jquery/jquery/blob/master/src/attributes/val.js|Github}\n * @param {object} Select element\n * @param {string|array} Select value\n */\nfunction setSelectValue (elem, value) {\n var optionSet, option\n var options = elem.options\n var values = makeArray(value)\n var i = options.length\n\n while (i--) {\n option = options[ i ]\n /* eslint-disable no-cond-assign */\n if (values.indexOf(option.value) > -1) {\n option.setAttribute('selected', true)\n optionSet = true\n }\n /* eslint-enable no-cond-assign */\n }\n\n // Force browsers to behave consistently when non-matching value is set\n if (!optionSet) {\n elem.selectedIndex = -1\n }\n}\n\n","export default function keyJoiner (parentKey, childKey) {\n return parentKey + '[' + childKey + ']'\n}\n","import defaultKeyJoiner from './keyJoiner'\n\nexport default function flattenData (data, parentKey, options = {}) {\n let flatData = {}\n let keyJoiner = options.keyJoiner || defaultKeyJoiner\n\n for (let keyName in data) {\n if (!data.hasOwnProperty(keyName)) {\n continue\n }\n\n let value = data[keyName]\n let hash = {}\n\n // If there is a parent key, join it with\n // the current, child key.\n if (parentKey) {\n keyName = keyJoiner(parentKey, keyName)\n }\n\n if (Array.isArray(value)) {\n hash[keyName + '[]'] = value\n hash[keyName] = value\n } else if (typeof value === 'object') {\n hash = flattenData(value, keyName, options)\n } else {\n hash[keyName] = value\n }\n\n Object.assign(flatData, hash)\n }\n\n return flatData\n}\n","import KeyExtractors from './KeyExtractors'\nimport InputWriters from './InputWriters'\nimport flattenData from './flattenData'\nimport getInputElements from './getInputElements'\nimport getElementType from './getElementType'\n\n/**\n * Use the given JSON object to populate all of the form inputs, in this element.\n *\n * @param {HTMLElement} Root element\n * @param {object} options\n * @param {object} options.inputWriters\n * @param {object} options.keyExtractors\n * @param {object} options.keySplitter\n * @param {string[]} options.include\n * @param {string[]} options.exclude\n * @param {string[]} options.ignoredTypes\n */\nexport default function deserialize (form, data, options = {}) {\n let flattenedData = flattenData(data, null, options)\n options.keyExtractors = new KeyExtractors(options.keyExtractors || {})\n options.inputWriters = new InputWriters(options.inputWriters || {})\n\n Array.prototype.forEach.call(\n getInputElements(form, options),\n (el) => {\n let type = getElementType(el)\n\n let keyExtractor = options.keyExtractors.get(type)\n let key = keyExtractor(el)\n\n let inputWriter = options.inputWriters.get(type)\n let value = flattenedData[key]\n\n inputWriter(el, value)\n }\n )\n}\n\n"],"names":["TypeRegistry","initial","registeredTypes","type","item","register","KeyExtractors","options","registerDefault","el","getAttribute","InputReaders","value","checked","getSelectValue","elem","option","i","index","selectedIndex","one","values","max","length","selected","disabled","parentNode","tagName","toLowerCase","push","KeyAssignmentValidators","keySplitter","key","matches","match","lastKey","indexOf","pop","getElementType","typeAttr","getInputElements","element","Array","prototype","filter","call","querySelectorAll","myType","extractor","keyExtractors","get","identifier","foundInInclude","include","foundInExclude","exclude","foundInIgnored","reject","ignoredTypes","selector","assignKeyValue","obj","keychain","shift","isArray","serialize","data","defaultKeySplitter","inputReaders","keyAssignmentValidators","forEach","keyExtractor","inputReader","validKeyAssignment","InputWriters","indeterminate","undefined","toString","setSelectValue","makeArray","arr","ret","apply","optionSet","setAttribute","keyJoiner","parentKey","childKey","flattenData","flatData","defaultKeyJoiner","keyName","hasOwnProperty","hash","assign","deserialize","form","flattenedData","inputWriters","inputWriter"],"mappings":"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"}