@fregante/dom-form-serializer 2.1.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/dom-form-serializer.js +354 -0
- package/dist/dom-form-serializer.js.map +1 -0
- package/dist/dom-form-serializer.mjs +345 -0
- package/dist/dom-form-serializer.mjs.map +1 -0
- package/lib/InputReaders.js +59 -0
- package/lib/InputWriters.js +62 -0
- package/lib/KeyAssignmentValidators.js +9 -0
- package/lib/KeyExtractors.js +8 -0
- package/lib/TypeRegistry.js +23 -0
- package/lib/assignKeyValue.js +31 -0
- package/lib/deserialize.js +45 -0
- package/lib/flattenData.js +34 -0
- package/lib/getElementType.js +14 -0
- package/lib/getInputElements.js +39 -0
- package/lib/index.js +4 -0
- package/lib/keyJoiner.js +3 -0
- package/lib/keySplitter.js +9 -0
- package/lib/serialize.js +47 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-form-serializer.js","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 let value, option, i\n const options = elem.options\n const index = elem.selectedIndex\n const one = elem.type === 'select-one'\n const values = one ? null : []\n const 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","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 const 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 const 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 const myType = getElementType(el)\n const extractor = options.keyExtractors.get(myType)\n const identifier = extractor(el)\n const foundInInclude = (options.include || []).indexOf(identifier) !== -1\n const foundInExclude = (options.exclude || []).indexOf(identifier) !== -1\n let foundInIgnored = false\n let reject = false\n\n if (options.ignoredTypes) {\n for (const 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","const UNSAFE_KEYS = ['__proto__', 'constructor', 'prototype']\n\nexport default function assignKeyValue (obj, keychain, value) {\n if (!keychain) { return obj }\n\n const key = keychain.shift()\n\n // Refuse to walk into prototype-pollution sinks.\n if (UNSAFE_KEYS.indexOf(key) !== -1) { return obj }\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 const type = getElementType(el)\n const keyExtractor = options.keyExtractors.get(type)\n const key = keyExtractor(el)\n const inputReader = options.inputReaders.get(type)\n const value = inputReader(el)\n const validKeyAssignment = options.keyAssignmentValidators.get(type)\n if (validKeyAssignment(el, key, value)) {\n const 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 const 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 let optionSet, option\n const options = elem.options\n const values = makeArray(value)\n let 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","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 const flatData = {}\n const keyJoiner = options.keyJoiner || defaultKeyJoiner\n\n for (let keyName in data) {\n if (!Object.prototype.hasOwnProperty.call(data, keyName)) {\n continue\n }\n\n const 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 const flattenedData = flattenData(data, null, options)\n const arrayValueIndexes = {}\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 const type = getElementType(el)\n\n const keyExtractor = options.keyExtractors.get(type)\n const key = keyExtractor(el)\n\n const inputWriter = options.inputWriters.get(type)\n let value = flattenedData[key]\n\n if (Array.isArray(value) && key.endsWith('[]') && type !== 'checkbox' && type !== 'select') {\n const index = arrayValueIndexes[key] || 0\n value = value[index]\n arrayValueIndexes[key] = index + 1\n }\n\n inputWriter(el, value)\n }\n )\n}\n"],"names":["TypeRegistry","constructor","initial","arguments","length","undefined","registeredTypes","get","type","default","register","item","registerDefault","KeyExtractors","options","el","getAttribute","InputReaders","value","checked","getSelectValue","elem","option","i","index","selectedIndex","one","values","max","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","identifier","foundInInclude","include","foundInExclude","exclude","foundInIgnored","reject","ignoredTypes","selector","UNSAFE_KEYS","assignKeyValue","obj","keychain","shift","isArray","serialize","data","defaultKeySplitter","inputReaders","keyAssignmentValidators","forEach","keyExtractor","inputReader","validKeyAssignment","InputWriters","indeterminate","toString","setSelectValue","makeArray","arr","ret","apply","optionSet","setAttribute","keyJoiner","parentKey","childKey","flattenData","flatData","defaultKeyJoiner","keyName","Object","hasOwnProperty","hash","assign","deserialize","form","flattenedData","arrayValueIndexes","inputWriters","inputWriter","endsWith"],"mappings":"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"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
class TypeRegistry {
|
|
2
|
+
constructor() {
|
|
3
|
+
let initial = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
4
|
+
this.registeredTypes = initial;
|
|
5
|
+
}
|
|
6
|
+
get(type) {
|
|
7
|
+
if (typeof this.registeredTypes[type] !== 'undefined') {
|
|
8
|
+
return this.registeredTypes[type];
|
|
9
|
+
} else {
|
|
10
|
+
return this.registeredTypes.default;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
register(type, item) {
|
|
14
|
+
if (typeof this.registeredTypes[type] === 'undefined') {
|
|
15
|
+
this.registeredTypes[type] = item;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
registerDefault(item) {
|
|
19
|
+
this.register('default', item);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class KeyExtractors extends TypeRegistry {
|
|
24
|
+
constructor(options) {
|
|
25
|
+
super(options);
|
|
26
|
+
this.registerDefault(el => el.getAttribute('name') || '');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
class InputReaders extends TypeRegistry {
|
|
31
|
+
constructor(options) {
|
|
32
|
+
super(options);
|
|
33
|
+
this.registerDefault(el => el.value);
|
|
34
|
+
this.register('checkbox', el => el.getAttribute('value') !== null ? el.checked ? el.getAttribute('value') : null : el.checked);
|
|
35
|
+
this.register('select', el => getSelectValue(el));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Read select values
|
|
41
|
+
*
|
|
42
|
+
* @see {@link https://github.com/jquery/jquery/blob/master/src/attributes/val.js|Github}
|
|
43
|
+
* @param {object} Select element
|
|
44
|
+
* @return {string|Array} Select value(s)
|
|
45
|
+
*/
|
|
46
|
+
function getSelectValue(elem) {
|
|
47
|
+
let value, option, i;
|
|
48
|
+
const options = elem.options;
|
|
49
|
+
const index = elem.selectedIndex;
|
|
50
|
+
const one = elem.type === 'select-one';
|
|
51
|
+
const values = one ? null : [];
|
|
52
|
+
const max = one ? index + 1 : options.length;
|
|
53
|
+
if (index < 0) {
|
|
54
|
+
i = max;
|
|
55
|
+
} else {
|
|
56
|
+
i = one ? index : 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Loop through all the selected options
|
|
60
|
+
for (; i < max; i++) {
|
|
61
|
+
option = options[i];
|
|
62
|
+
|
|
63
|
+
// Support: IE <=9 only
|
|
64
|
+
// IE8-9 doesn't update selected after form reset
|
|
65
|
+
if ((option.selected || i === index) &&
|
|
66
|
+
// Don't return options that are disabled or in a disabled optgroup
|
|
67
|
+
!option.disabled && !(option.parentNode.disabled && option.parentNode.tagName.toLowerCase() === 'optgroup')) {
|
|
68
|
+
// Get the specific value for the option
|
|
69
|
+
value = option.value;
|
|
70
|
+
|
|
71
|
+
// We don't need an array for one selects
|
|
72
|
+
if (one) {
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Multi-Selects return an array
|
|
77
|
+
values.push(value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return values;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
class KeyAssignmentValidators extends TypeRegistry {
|
|
84
|
+
constructor(options) {
|
|
85
|
+
super(options);
|
|
86
|
+
this.registerDefault(() => true);
|
|
87
|
+
this.register('radio', el => el.checked);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function keySplitter(key) {
|
|
92
|
+
const matches = key.match(/[^[\]]+/g);
|
|
93
|
+
let lastKey;
|
|
94
|
+
if (key.length > 1 && key.indexOf('[]') === key.length - 2) {
|
|
95
|
+
lastKey = matches.pop();
|
|
96
|
+
matches.push([lastKey]);
|
|
97
|
+
}
|
|
98
|
+
return matches;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function getElementType(el) {
|
|
102
|
+
let typeAttr;
|
|
103
|
+
const tagName = el.tagName;
|
|
104
|
+
let type = tagName;
|
|
105
|
+
if (tagName.toLowerCase() === 'input') {
|
|
106
|
+
typeAttr = el.getAttribute('type');
|
|
107
|
+
if (typeAttr) {
|
|
108
|
+
type = typeAttr;
|
|
109
|
+
} else {
|
|
110
|
+
type = 'text';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return type.toLowerCase();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function getInputElements(element, options) {
|
|
117
|
+
return Array.prototype.filter.call(element.querySelectorAll('input,select,textarea'), el => {
|
|
118
|
+
if (el.tagName.toLowerCase() === 'input' && (el.type === 'submit' || el.type === 'reset')) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const myType = getElementType(el);
|
|
122
|
+
const extractor = options.keyExtractors.get(myType);
|
|
123
|
+
const identifier = extractor(el);
|
|
124
|
+
const foundInInclude = (options.include || []).indexOf(identifier) !== -1;
|
|
125
|
+
const foundInExclude = (options.exclude || []).indexOf(identifier) !== -1;
|
|
126
|
+
let foundInIgnored = false;
|
|
127
|
+
let reject = false;
|
|
128
|
+
if (options.ignoredTypes) {
|
|
129
|
+
for (const selector of options.ignoredTypes) {
|
|
130
|
+
if (el.matches(selector)) {
|
|
131
|
+
foundInIgnored = true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (foundInInclude) {
|
|
136
|
+
reject = false;
|
|
137
|
+
} else {
|
|
138
|
+
if (options.include) {
|
|
139
|
+
reject = true;
|
|
140
|
+
} else {
|
|
141
|
+
reject = foundInExclude || foundInIgnored;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return !reject;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const UNSAFE_KEYS = ['__proto__', 'constructor', 'prototype'];
|
|
149
|
+
function assignKeyValue(obj, keychain, value) {
|
|
150
|
+
if (!keychain) {
|
|
151
|
+
return obj;
|
|
152
|
+
}
|
|
153
|
+
const key = keychain.shift();
|
|
154
|
+
|
|
155
|
+
// Refuse to walk into prototype-pollution sinks.
|
|
156
|
+
if (UNSAFE_KEYS.indexOf(key) !== -1) {
|
|
157
|
+
return obj;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// build the current object we need to store data
|
|
161
|
+
if (!obj[key]) {
|
|
162
|
+
obj[key] = Array.isArray(key) ? [] : {};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// if it's the last key in the chain, assign the value directly
|
|
166
|
+
if (keychain.length === 0) {
|
|
167
|
+
if (!Array.isArray(obj[key])) {
|
|
168
|
+
obj[key] = value;
|
|
169
|
+
} else if (value !== null) {
|
|
170
|
+
obj[key].push(value);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// recursive parsing of the array, depth-first
|
|
175
|
+
if (keychain.length > 0) {
|
|
176
|
+
assignKeyValue(obj[key], keychain, value);
|
|
177
|
+
}
|
|
178
|
+
return obj;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Get a JSON object that represents all of the form inputs, in this element.
|
|
183
|
+
*
|
|
184
|
+
* @param {HTMLElement} Root element
|
|
185
|
+
* @param {object} options
|
|
186
|
+
* @param {object} options.inputReaders
|
|
187
|
+
* @param {object} options.keyAssignmentValidators
|
|
188
|
+
* @param {object} options.keyExtractors
|
|
189
|
+
* @param {object} options.keySplitter
|
|
190
|
+
* @param {string[]} options.include
|
|
191
|
+
* @param {string[]} options.exclude
|
|
192
|
+
* @param {string[]} options.ignoredTypes
|
|
193
|
+
* @return {object}
|
|
194
|
+
*/
|
|
195
|
+
function serialize(element) {
|
|
196
|
+
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
197
|
+
let data = {};
|
|
198
|
+
options.keySplitter = options.keySplitter || keySplitter;
|
|
199
|
+
options.keyExtractors = new KeyExtractors(options.keyExtractors || {});
|
|
200
|
+
options.inputReaders = new InputReaders(options.inputReaders || {});
|
|
201
|
+
options.keyAssignmentValidators = new KeyAssignmentValidators(options.keyAssignmentValidators || {});
|
|
202
|
+
Array.prototype.forEach.call(getInputElements(element, options), el => {
|
|
203
|
+
const type = getElementType(el);
|
|
204
|
+
const keyExtractor = options.keyExtractors.get(type);
|
|
205
|
+
const key = keyExtractor(el);
|
|
206
|
+
const inputReader = options.inputReaders.get(type);
|
|
207
|
+
const value = inputReader(el);
|
|
208
|
+
const validKeyAssignment = options.keyAssignmentValidators.get(type);
|
|
209
|
+
if (validKeyAssignment(el, key, value)) {
|
|
210
|
+
const keychain = options.keySplitter(key);
|
|
211
|
+
data = assignKeyValue(data, keychain, value);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return data;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
class InputWriters extends TypeRegistry {
|
|
218
|
+
constructor(options) {
|
|
219
|
+
super(options);
|
|
220
|
+
this.registerDefault((el, value) => {
|
|
221
|
+
el.value = value !== null && value !== void 0 ? value : '';
|
|
222
|
+
});
|
|
223
|
+
this.register('checkbox', (el, value) => {
|
|
224
|
+
if (value === null) {
|
|
225
|
+
el.indeterminate = true;
|
|
226
|
+
} else {
|
|
227
|
+
el.checked = Array.isArray(value) ? value.indexOf(el.value) !== -1 : value;
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
this.register('radio', function (el, value) {
|
|
231
|
+
if (value !== undefined) {
|
|
232
|
+
el.checked = el.value === value.toString();
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
this.register('select', setSelectValue);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function makeArray(arr) {
|
|
239
|
+
const ret = [];
|
|
240
|
+
if (arr !== null) {
|
|
241
|
+
if (Array.isArray(arr)) {
|
|
242
|
+
ret.push.apply(ret, arr);
|
|
243
|
+
} else {
|
|
244
|
+
ret.push(arr);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return ret;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Write select values
|
|
252
|
+
*
|
|
253
|
+
* @see {@link https://github.com/jquery/jquery/blob/master/src/attributes/val.js|Github}
|
|
254
|
+
* @param {object} Select element
|
|
255
|
+
* @param {string|array} Select value
|
|
256
|
+
*/
|
|
257
|
+
function setSelectValue(elem, value) {
|
|
258
|
+
let optionSet, option;
|
|
259
|
+
const options = elem.options;
|
|
260
|
+
const values = makeArray(value);
|
|
261
|
+
let i = options.length;
|
|
262
|
+
while (i--) {
|
|
263
|
+
option = options[i];
|
|
264
|
+
/* eslint-disable no-cond-assign */
|
|
265
|
+
if (values.indexOf(option.value) > -1) {
|
|
266
|
+
option.setAttribute('selected', true);
|
|
267
|
+
optionSet = true;
|
|
268
|
+
}
|
|
269
|
+
/* eslint-enable no-cond-assign */
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Force browsers to behave consistently when non-matching value is set
|
|
273
|
+
if (!optionSet) {
|
|
274
|
+
elem.selectedIndex = -1;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function keyJoiner(parentKey, childKey) {
|
|
279
|
+
return parentKey + '[' + childKey + ']';
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function flattenData(data, parentKey) {
|
|
283
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
284
|
+
const flatData = {};
|
|
285
|
+
const keyJoiner$1 = options.keyJoiner || keyJoiner;
|
|
286
|
+
for (let keyName in data) {
|
|
287
|
+
if (!Object.prototype.hasOwnProperty.call(data, keyName)) {
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
const value = data[keyName];
|
|
291
|
+
let hash = {};
|
|
292
|
+
|
|
293
|
+
// If there is a parent key, join it with
|
|
294
|
+
// the current, child key.
|
|
295
|
+
if (parentKey) {
|
|
296
|
+
keyName = keyJoiner$1(parentKey, keyName);
|
|
297
|
+
}
|
|
298
|
+
if (Array.isArray(value)) {
|
|
299
|
+
hash[keyName + '[]'] = value;
|
|
300
|
+
hash[keyName] = value;
|
|
301
|
+
} else if (typeof value === 'object') {
|
|
302
|
+
hash = flattenData(value, keyName, options);
|
|
303
|
+
} else {
|
|
304
|
+
hash[keyName] = value;
|
|
305
|
+
}
|
|
306
|
+
Object.assign(flatData, hash);
|
|
307
|
+
}
|
|
308
|
+
return flatData;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Use the given JSON object to populate all of the form inputs, in this element.
|
|
313
|
+
*
|
|
314
|
+
* @param {HTMLElement} Root element
|
|
315
|
+
* @param {object} options
|
|
316
|
+
* @param {object} options.inputWriters
|
|
317
|
+
* @param {object} options.keyExtractors
|
|
318
|
+
* @param {object} options.keySplitter
|
|
319
|
+
* @param {string[]} options.include
|
|
320
|
+
* @param {string[]} options.exclude
|
|
321
|
+
* @param {string[]} options.ignoredTypes
|
|
322
|
+
*/
|
|
323
|
+
function deserialize(form, data) {
|
|
324
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
325
|
+
const flattenedData = flattenData(data, null, options);
|
|
326
|
+
const arrayValueIndexes = {};
|
|
327
|
+
options.keyExtractors = new KeyExtractors(options.keyExtractors || {});
|
|
328
|
+
options.inputWriters = new InputWriters(options.inputWriters || {});
|
|
329
|
+
Array.prototype.forEach.call(getInputElements(form, options), el => {
|
|
330
|
+
const type = getElementType(el);
|
|
331
|
+
const keyExtractor = options.keyExtractors.get(type);
|
|
332
|
+
const key = keyExtractor(el);
|
|
333
|
+
const inputWriter = options.inputWriters.get(type);
|
|
334
|
+
let value = flattenedData[key];
|
|
335
|
+
if (Array.isArray(value) && key.endsWith('[]') && type !== 'checkbox' && type !== 'select') {
|
|
336
|
+
const index = arrayValueIndexes[key] || 0;
|
|
337
|
+
value = value[index];
|
|
338
|
+
arrayValueIndexes[key] = index + 1;
|
|
339
|
+
}
|
|
340
|
+
inputWriter(el, value);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export { deserialize, serialize };
|
|
345
|
+
//# sourceMappingURL=dom-form-serializer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-form-serializer.mjs","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 let value, option, i\n const options = elem.options\n const index = elem.selectedIndex\n const one = elem.type === 'select-one'\n const values = one ? null : []\n const 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","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 const 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 const 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 const myType = getElementType(el)\n const extractor = options.keyExtractors.get(myType)\n const identifier = extractor(el)\n const foundInInclude = (options.include || []).indexOf(identifier) !== -1\n const foundInExclude = (options.exclude || []).indexOf(identifier) !== -1\n let foundInIgnored = false\n let reject = false\n\n if (options.ignoredTypes) {\n for (const 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","const UNSAFE_KEYS = ['__proto__', 'constructor', 'prototype']\n\nexport default function assignKeyValue (obj, keychain, value) {\n if (!keychain) { return obj }\n\n const key = keychain.shift()\n\n // Refuse to walk into prototype-pollution sinks.\n if (UNSAFE_KEYS.indexOf(key) !== -1) { return obj }\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 const type = getElementType(el)\n const keyExtractor = options.keyExtractors.get(type)\n const key = keyExtractor(el)\n const inputReader = options.inputReaders.get(type)\n const value = inputReader(el)\n const validKeyAssignment = options.keyAssignmentValidators.get(type)\n if (validKeyAssignment(el, key, value)) {\n const 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 const 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 let optionSet, option\n const options = elem.options\n const values = makeArray(value)\n let 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","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 const flatData = {}\n const keyJoiner = options.keyJoiner || defaultKeyJoiner\n\n for (let keyName in data) {\n if (!Object.prototype.hasOwnProperty.call(data, keyName)) {\n continue\n }\n\n const 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 const flattenedData = flattenData(data, null, options)\n const arrayValueIndexes = {}\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 const type = getElementType(el)\n\n const keyExtractor = options.keyExtractors.get(type)\n const key = keyExtractor(el)\n\n const inputWriter = options.inputWriters.get(type)\n let value = flattenedData[key]\n\n if (Array.isArray(value) && key.endsWith('[]') && type !== 'checkbox' && type !== 'select') {\n const index = arrayValueIndexes[key] || 0\n value = value[index]\n arrayValueIndexes[key] = index + 1\n }\n\n inputWriter(el, value)\n }\n )\n}\n"],"names":["TypeRegistry","constructor","initial","arguments","length","undefined","registeredTypes","get","type","default","register","item","registerDefault","KeyExtractors","options","el","getAttribute","InputReaders","value","checked","getSelectValue","elem","option","i","index","selectedIndex","one","values","max","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","identifier","foundInInclude","include","foundInExclude","exclude","foundInIgnored","reject","ignoredTypes","selector","UNSAFE_KEYS","assignKeyValue","obj","keychain","shift","isArray","serialize","data","defaultKeySplitter","inputReaders","keyAssignmentValidators","forEach","keyExtractor","inputReader","validKeyAssignment","InputWriters","indeterminate","toString","setSelectValue","makeArray","arr","ret","apply","optionSet","setAttribute","keyJoiner","parentKey","childKey","flattenData","flatData","defaultKeyJoiner","keyName","Object","hasOwnProperty","hash","assign","deserialize","form","flattenedData","arrayValueIndexes","inputWriters","inputWriter","endsWith"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import TypeRegistry from './TypeRegistry'
|
|
2
|
+
|
|
3
|
+
export default class InputReaders extends TypeRegistry {
|
|
4
|
+
constructor (options) {
|
|
5
|
+
super(options)
|
|
6
|
+
this.registerDefault(el => el.value)
|
|
7
|
+
this.register('checkbox', el => el.getAttribute('value') !== null ? (el.checked ? el.getAttribute('value') : null) : el.checked)
|
|
8
|
+
this.register('select', el => getSelectValue(el))
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Read select values
|
|
14
|
+
*
|
|
15
|
+
* @see {@link https://github.com/jquery/jquery/blob/master/src/attributes/val.js|Github}
|
|
16
|
+
* @param {object} Select element
|
|
17
|
+
* @return {string|Array} Select value(s)
|
|
18
|
+
*/
|
|
19
|
+
function getSelectValue (elem) {
|
|
20
|
+
let value, option, i
|
|
21
|
+
const options = elem.options
|
|
22
|
+
const index = elem.selectedIndex
|
|
23
|
+
const one = elem.type === 'select-one'
|
|
24
|
+
const values = one ? null : []
|
|
25
|
+
const max = one ? index + 1 : options.length
|
|
26
|
+
|
|
27
|
+
if (index < 0) {
|
|
28
|
+
i = max
|
|
29
|
+
} else {
|
|
30
|
+
i = one ? index : 0
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Loop through all the selected options
|
|
34
|
+
for (; i < max; i++) {
|
|
35
|
+
option = options[i]
|
|
36
|
+
|
|
37
|
+
// Support: IE <=9 only
|
|
38
|
+
// IE8-9 doesn't update selected after form reset
|
|
39
|
+
if ((option.selected || i === index) &&
|
|
40
|
+
|
|
41
|
+
// Don't return options that are disabled or in a disabled optgroup
|
|
42
|
+
!option.disabled &&
|
|
43
|
+
!(option.parentNode.disabled && option.parentNode.tagName.toLowerCase() === 'optgroup')
|
|
44
|
+
) {
|
|
45
|
+
// Get the specific value for the option
|
|
46
|
+
value = option.value
|
|
47
|
+
|
|
48
|
+
// We don't need an array for one selects
|
|
49
|
+
if (one) {
|
|
50
|
+
return value
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Multi-Selects return an array
|
|
54
|
+
values.push(value)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return values
|
|
59
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import TypeRegistry from './TypeRegistry'
|
|
2
|
+
|
|
3
|
+
export default class InputWriters extends TypeRegistry {
|
|
4
|
+
constructor (options) {
|
|
5
|
+
super(options)
|
|
6
|
+
this.registerDefault((el, value) => { el.value = value ?? '' })
|
|
7
|
+
this.register('checkbox', (el, value) => {
|
|
8
|
+
if (value === null) {
|
|
9
|
+
el.indeterminate = true
|
|
10
|
+
} else {
|
|
11
|
+
el.checked = Array.isArray(value) ? value.indexOf(el.value) !== -1 : value
|
|
12
|
+
}
|
|
13
|
+
})
|
|
14
|
+
this.register('radio', function (el, value) {
|
|
15
|
+
if (value !== undefined) {
|
|
16
|
+
el.checked = el.value === value.toString()
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
this.register('select', setSelectValue)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function makeArray (arr) {
|
|
24
|
+
const ret = []
|
|
25
|
+
if (arr !== null) {
|
|
26
|
+
if (Array.isArray(arr)) {
|
|
27
|
+
ret.push.apply(ret, arr)
|
|
28
|
+
} else {
|
|
29
|
+
ret.push(arr)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return ret
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Write select values
|
|
37
|
+
*
|
|
38
|
+
* @see {@link https://github.com/jquery/jquery/blob/master/src/attributes/val.js|Github}
|
|
39
|
+
* @param {object} Select element
|
|
40
|
+
* @param {string|array} Select value
|
|
41
|
+
*/
|
|
42
|
+
function setSelectValue (elem, value) {
|
|
43
|
+
let optionSet, option
|
|
44
|
+
const options = elem.options
|
|
45
|
+
const values = makeArray(value)
|
|
46
|
+
let i = options.length
|
|
47
|
+
|
|
48
|
+
while (i--) {
|
|
49
|
+
option = options[i]
|
|
50
|
+
/* eslint-disable no-cond-assign */
|
|
51
|
+
if (values.indexOf(option.value) > -1) {
|
|
52
|
+
option.setAttribute('selected', true)
|
|
53
|
+
optionSet = true
|
|
54
|
+
}
|
|
55
|
+
/* eslint-enable no-cond-assign */
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Force browsers to behave consistently when non-matching value is set
|
|
59
|
+
if (!optionSet) {
|
|
60
|
+
elem.selectedIndex = -1
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export default class TypeRegistry {
|
|
2
|
+
constructor (initial = {}) {
|
|
3
|
+
this.registeredTypes = initial
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
get (type) {
|
|
7
|
+
if (typeof this.registeredTypes[type] !== 'undefined') {
|
|
8
|
+
return this.registeredTypes[type]
|
|
9
|
+
} else {
|
|
10
|
+
return this.registeredTypes.default
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
register (type, item) {
|
|
15
|
+
if (typeof this.registeredTypes[type] === 'undefined') {
|
|
16
|
+
this.registeredTypes[type] = item
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
registerDefault (item) {
|
|
21
|
+
this.register('default', item)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const UNSAFE_KEYS = ['__proto__', 'constructor', 'prototype']
|
|
2
|
+
|
|
3
|
+
export default function assignKeyValue (obj, keychain, value) {
|
|
4
|
+
if (!keychain) { return obj }
|
|
5
|
+
|
|
6
|
+
const key = keychain.shift()
|
|
7
|
+
|
|
8
|
+
// Refuse to walk into prototype-pollution sinks.
|
|
9
|
+
if (UNSAFE_KEYS.indexOf(key) !== -1) { return obj }
|
|
10
|
+
|
|
11
|
+
// build the current object we need to store data
|
|
12
|
+
if (!obj[key]) {
|
|
13
|
+
obj[key] = Array.isArray(key) ? [] : {}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// if it's the last key in the chain, assign the value directly
|
|
17
|
+
if (keychain.length === 0) {
|
|
18
|
+
if (!Array.isArray(obj[key])) {
|
|
19
|
+
obj[key] = value
|
|
20
|
+
} else if (value !== null) {
|
|
21
|
+
obj[key].push(value)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// recursive parsing of the array, depth-first
|
|
26
|
+
if (keychain.length > 0) {
|
|
27
|
+
assignKeyValue(obj[key], keychain, value)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return obj
|
|
31
|
+
}
|