@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.
@@ -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,9 @@
1
+ import TypeRegistry from './TypeRegistry'
2
+
3
+ export default class KeyAssignmentValidators extends TypeRegistry {
4
+ constructor (options) {
5
+ super(options)
6
+ this.registerDefault(() => true)
7
+ this.register('radio', (el) => el.checked)
8
+ }
9
+ }
@@ -0,0 +1,8 @@
1
+ import TypeRegistry from './TypeRegistry'
2
+
3
+ export default class KeyExtractors extends TypeRegistry {
4
+ constructor (options) {
5
+ super(options)
6
+ this.registerDefault(el => (el.getAttribute('name') || ''))
7
+ }
8
+ }
@@ -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
+ }