diff --git a/lib/types.js b/lib/types.js index 029ebf21..9ddd7623 100644 --- a/lib/types.js +++ b/lib/types.js @@ -38,6 +38,43 @@ module.exports.generateTypeConversion = function (name, idlType, argAttrs, custo } ${name} = V; }`; + } else if (idlType.generic === "record") { + if (!handleNullable || !idlType.nullable) { + str += ` + if (${name} === null && ${name} === undefined) { + ${name} = new Map; + } else {`; + } + + str += ` + if (typeof ${name} !== "object") { + throw new TypeError("The value provided is not an object"); + } else { + const result = new Map; + const keys = Object.keys(${name}); + for (let key of keys) { + let value = ${name}[key]; + let typedKey = key; + let typedValue = value;`; + + str += exports.generateTypeConversion("typedKey", idlType.idlType[0], [], customTypes).body; + + const conv = exports.generateTypeConversion("typedValue", idlType.idlType[1], [], customTypes, { + handleNullable: true + }); + Object.assign(requires, conv.requires); + str += conv.body; + + str += ` + result.set(typedKey, typedValue); + } + ${name} = result; + }`; + + if (!handleNullable || !idlType.nullable) { + str += ` + }`; + } } else if (conversions[idlType.idlType] || customTypes.has(idlType.idlType)) { const enforceRange = utils.getExtAttr(argAttrs, "EnforceRange"); const clamp = utils.getExtAttr(argAttrs, "Clamp"); @@ -84,5 +121,5 @@ module.exports.generateTypeConversion = function (name, idlType, argAttrs, custo }; module.exports.canHandleType = function (idlType, customTypes) { - return idlType.generic === "sequence" || conversions[idlType.idlType] || customTypes.has(idlType.idlType); + return idlType.generic === "sequence" || idlType.generic === "record" || conversions[idlType.idlType] || customTypes.has(idlType.idlType); }; diff --git a/package.json b/package.json index 64b144ad..9f9458bc 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "co": "^4.6.0", "pn": "^1.0.0", "webidl-conversions": "^3.0.0", - "webidl2": "^2.0.11" + "webidl2": "^2.2.2" }, "devDependencies": {}, "scripts": {