From 76492858e7d325d660ab0dea0da82179bfba8699 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Fri, 28 Jul 2017 18:10:38 +0800 Subject: [PATCH] Add linting On the road to fixing #35. --- .eslintignore | 4 + .eslintrc.json | 237 +++++++++ .travis.yml | 4 + lib/constructs/attribute.js | 2 +- lib/constructs/dictionary.js | 5 +- lib/constructs/interface.js | 27 +- lib/constructs/iterable.js | 15 +- lib/constructs/operation.js | 14 +- lib/keywords.js | 4 +- lib/output/utils.js | 13 +- lib/overloads.js | 48 +- lib/parameters.js | 13 +- lib/reflector.js | 6 +- lib/transformer.js | 24 +- lib/types.js | 99 ++-- lib/utils.js | 31 +- package-lock.json | 768 ++++++++++++++++++++++++++++++ package.json | 4 +- test/__snapshots__/test.js.snap | 100 ++-- test/implementations/.gitkeep | 0 test/implementations/SeqAndRec.js | 29 -- test/test.js | 2 + 22 files changed, 1254 insertions(+), 195 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 test/implementations/.gitkeep delete mode 100644 test/implementations/SeqAndRec.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..80907ff9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules + +test/output +test/__snapshots__ diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..243aa041 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,237 @@ +{ + "root": true, + "env": { + "node": true, + "es6": true + }, + "parserOptions": { + "ecmaVersion": 6 + }, + "rules": { + // Possible errors + "comma-dangle": ["error", "never"], + "no-cond-assign": ["error", "except-parens"], + "no-console": "error", + "no-constant-condition": "error", + "no-control-regex": "off", + "no-debugger": "error", + "no-dupe-args": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty": "error", + "no-empty-character-class": "error", + "no-ex-assign": "error", + "no-extra-boolean-cast": "error", + "no-extra-parens": ["error", "all", { "conditionalAssign": false, "nestedBinaryExpressions": false, "returnAssign": false }], + "no-extra-semi": "error", + "no-func-assign": "error", + "no-inner-declarations": "off", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-negated-in-lhs": "error", + "no-obj-calls": "error", + "no-regex-spaces": "error", + "no-sparse-arrays": "error", + "no-unexpected-multiline": "error", + "no-unreachable": "error", + "no-unsafe-finally": "off", + "use-isnan": "error", + "valid-jsdoc": "off", + "valid-typeof": "error", + + // Best practices + "accessor-pairs": "error", + "array-callback-return": "error", + "block-scoped-var": "off", + "complexity": "off", + "consistent-return": "error", + "curly": ["error", "all"], + "default-case": "off", + "dot-location": ["error", "property"], + "dot-notation": "error", + "eqeqeq": "error", + "guard-for-in": "off", + "no-alert": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-div-regex": "off", + "no-else-return": "error", + "no-empty-function": "off", + "no-empty-pattern": "error", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-fallthrough": "error", + "no-floating-decimal": "error", + "no-implicit-coercion": "error", + "no-implicit-globals": "error", + "no-implied-eval": "off", + "no-invalid-this": "off", // meh + "no-iterator": "error", + "no-labels": ["error", { "allowLoop": true }], + "no-lone-blocks": "error", + "no-loop-func": "off", + "no-magic-numbers": "off", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-native-reassign": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-wrappers": "error", + "no-octal": "error", + "no-octal-escape": "error", + "no-param-reassign": "off", + "no-process-env": "error", + "no-proto": "error", + "no-redeclare": "error", + "no-return-assign": ["error", "except-parens"], + "no-script-url": "off", + "no-self-assign": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-throw-literal": "error", + "no-unmodified-loop-condition": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-useless-call": "error", + "no-useless-concat": "error", + "no-useless-escape": "error", + "no-void": "error", + "no-warning-comments": "off", + "no-with": "error", + "radix": ["error", "as-needed"], + "vars-on-top": "off", + "wrap-iife": ["error", "outside"], + "yoda": ["error", "never"], + + // Strict Mode + "strict": ["error", "global"], + + // Variables + "init-declarations": "off", + "no-catch-shadow": "error", + "no-delete-var": "error", + "no-label-var": "error", + "no-restricted-globals": "off", + "no-shadow": "error", + "no-shadow-restricted-names": "error", + "no-undef": "error", + "no-undef-init": "error", + "no-undefined": "off", + "no-unused-vars": "error", + "no-use-before-define": ["error", "nofunc"], + + // Node.js and CommonJS + "callback-return": "off", + "global-require": "error", + "handle-callback-err": "error", + "no-mixed-requires": ["error", true], + "no-new-require": "error", + "no-path-concat": "error", + "no-process-exit": "error", + "no-restricted-imports": "off", + "no-restricted-modules": "off", + "no-sync": "off", + + // Stylistic Issues + "array-bracket-spacing": ["error", "never"], + "block-spacing": ["error", "always"], + "brace-style": ["error", "1tbs", { "allowSingleLine": false }], + "camelcase": ["error", { "properties": "always" }], + "comma-spacing": ["error", { "before": false, "after": true }], + "comma-style": ["error", "last"], + "computed-property-spacing": ["error", "never"], + "consistent-this": "off", + "eol-last": "error", + "func-names": "off", + "func-style": ["error", "declaration"], + "id-blacklist": "off", + "id-length": "off", + "id-match": "off", + "indent": ["error", 2, { "SwitchCase": 1 }], + "jsx-quotes": "off", + "key-spacing": ["error", { "beforeColon": false, "afterColon": true, "mode": "strict" }], + "keyword-spacing": ["error", { "before": true, "after": true }], + "linebreak-style": ["error", "unix"], + "lines-around-comment": "off", + "max-depth": "off", + "max-len": ["error", 120, { "ignoreUrls": true }], + "max-nested-callbacks": "off", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": ["error", { "max": 1 }], + "new-cap": ["error", { "capIsNewExceptions": ["USVString", "DOMString"] }], + "new-parens": "error", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "off", + "no-array-constructor": "error", + "no-bitwise": "off", + "no-continue": "off", + "no-inline-comments": "off", + "no-lonely-if": "error", + "no-mixed-spaces-and-tabs": "error", + "no-multiple-empty-lines": "error", + "no-negated-condition": "off", + "no-nested-ternary": "error", + "no-new-object": "error", + "no-plusplus": "off", + "no-restricted-syntax": "off", + "no-spaced-func": "error", + "no-ternary": "off", + "no-trailing-spaces": "error", + "no-underscore-dangle": "off", + "no-unneeded-ternary": "error", + "no-whitespace-before-property": "error", + "object-curly-spacing": ["error", "always"], + "object-property-newline": "off", + "one-var": ["error", "never"], + "one-var-declaration-per-line": ["error", "initializations"], + "operator-assignment": ["error", "always"], + "operator-linebreak": ["error", "after"], + "padded-blocks": ["error", "never"], + "quote-props": ["error", "as-needed"], + "quotes": ["error", "double", { "avoidEscape": true, "allowTemplateLiterals": true }], + "require-jsdoc": "off", + "semi": ["error", "always"], + "semi-spacing": "error", + "sort-imports": "off", + "sort-vars": "off", + "space-before-blocks": ["error", "always"], + "space-before-function-paren": ["error", { "anonymous": "always", "named": "never" }], + "space-in-parens": ["error", "never"], + "space-infix-ops": "error", + "space-unary-ops": ["error", { "words": true, "nonwords": false }], + "spaced-comment": ["error", "always", { "markers": ["///"] }], + "wrap-regex": "off", + + // ECMAScript 6 + "arrow-body-style": "off", // meh + "arrow-parens": ["error", "as-needed"], + "arrow-spacing": "error", + "constructor-super": "error", + "generator-star-spacing": ["error", "after"], + "no-class-assign": "error", + "no-confusing-arrow": "off", + "no-const-assign": "error", + "no-dupe-class-members": "error", + "no-duplicate-imports": "error", + "no-new-symbol": "error", + "no-this-before-super": "error", + "no-useless-computed-key": "error", + "no-useless-constructor": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-arrow-callback": "error", + "prefer-const": ["error", { "ignoreReadBeforeAssign": true }], + "prefer-reflect": "off", + "prefer-rest-params": "off", + "prefer-spread": "error", + "prefer-template": "off", + "require-yield": "error", + "template-curly-spacing": ["error", "never"], + "yield-star-spacing": ["error", "after"] + } +} diff --git a/.travis.yml b/.travis.yml index 10e44e40..c20f6253 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,10 @@ node_js: - 6 - stable +script: + - npm test + - npm run lint + branches: only: - master diff --git a/lib/constructs/attribute.js b/lib/constructs/attribute.js index 89fac310..313c521f 100644 --- a/lib/constructs/attribute.js +++ b/lib/constructs/attribute.js @@ -40,7 +40,7 @@ Attribute.prototype.generate = function () { if (!reflector[this.idl.idlType.idlType]) { throw new Error("Unknown reflector type: " + this.idl.idlType.idlType); } - const attrName = shouldReflect.rhs && shouldReflect.rhs.value.replace(/_/g, '-') || this.idl.name; + const attrName = shouldReflect.rhs && shouldReflect.rhs.value.replace(/_/g, "-") || this.idl.name; getterBody = reflector[this.idl.idlType.idlType].get(objName, attrName); setterBody = reflector[this.idl.idlType.idlType].set(objName, attrName); } diff --git a/lib/constructs/dictionary.js b/lib/constructs/dictionary.js index 38b5a5e2..b06e51cf 100644 --- a/lib/constructs/dictionary.js +++ b/lib/constructs/dictionary.js @@ -16,7 +16,7 @@ class Dictionary { const fields = []; const members = this.idl.members; members.forEach(member => { - if (member.type !== 'field') { + if (member.type !== "field") { throw new Error("webidl2js doesn't support non-field members in dictionaries"); } fields.push(member); @@ -32,7 +32,8 @@ class Dictionary { for (const field of this._prepareFields()) { const typeConversion = field.idlType; const argAttrs = field.extAttrs; - const conv = Types.generateTypeConversion(this.ctx, "value", typeConversion, argAttrs, this.name, `\`\${context} has member ${field.name} that\``); + const conv = Types.generateTypeConversion( + this.ctx, "value", typeConversion, argAttrs, this.name, `context + " has member ${field.name} that"`); Object.assign(this.requires, conv.requires); str += ` diff --git a/lib/constructs/interface.js b/lib/constructs/interface.js index 47a22b9e..7a9958c2 100644 --- a/lib/constructs/interface.js +++ b/lib/constructs/interface.js @@ -1,7 +1,5 @@ "use strict"; -const path = require("path"); - const utils = require("../utils"); const Attribute = require("./attribute"); const Constant = require("./constant"); @@ -15,7 +13,7 @@ function Interface(ctx, idl, opts) { this.ctx = ctx; this.idl = idl; this.name = idl.name; - this.factory = !!utils.getExtAttr(this.idl.extAttrs, "WebIDL2JSFactory"); + this.factory = Boolean(utils.getExtAttr(this.idl.extAttrs, "WebIDL2JSFactory")); this.mixins = []; this.requires = {}; @@ -89,10 +87,11 @@ Interface.prototype.generateConstructor = function () { } } - const conversions = Parameters.generateOverloadConversions(this.ctx, overloads, this.name, `Failed to construct '${this.name}': `); + const conversions = + Parameters.generateOverloadConversions(this.ctx, overloads, this.name, `Failed to construct '${this.name}': `); Object.assign(this.requires, conversions.requires); - minConstructor.nameList = minConstructor.nameList.map((name) => (keywords.has(name) ? "_" : "") + name); + minConstructor.nameList = minConstructor.nameList.map(name => (keywords.has(name) ? "_" : "") + name); this.str += ` function ${this.name}(${minConstructor.nameList.join(", ")}) { `; @@ -100,10 +99,12 @@ Interface.prototype.generateConstructor = function () { const plural = minConstructor.nameList.length > 1 ? "s" : ""; this.str += ` if (!new.target) { - throw new TypeError("Failed to construct '${this.name}'. Please use the 'new' operator; this constructor cannot be called as a function."); + throw new TypeError("Failed to construct '${this.name}'. Please use the 'new' operator; this constructor " + + "cannot be called as a function."); } if (arguments.length < ${minConstructor.nameList.length}) { - throw new TypeError("Failed to construct '${this.name}': ${minConstructor.nameList.length} argument${plural} required, but only " + arguments.length + " present."); + throw new TypeError("Failed to construct '${this.name}': ${minConstructor.nameList.length} " + + "argument${plural} required, but only " + arguments.length + " present."); } `; } @@ -222,7 +223,7 @@ Interface.prototype.generateIface = function () { if (shouldExposeRoot) { let exposedOn = ["Window"]; const exposedAttrs = this.idl.extAttrs - .filter(function (attr) { return attr.name === "Exposed"; }); + .filter(attr => attr.name === "Exposed"); if (exposedAttrs.length !== 0) { if (typeof exposedAttrs[0].rhs.value === "string") { exposedAttrs[0].rhs.value = [exposedAttrs[0].rhs.value]; @@ -237,7 +238,7 @@ Interface.prototype.generateIface = function () { } } - let exposers = []; + const exposers = []; for (let keys = Object.keys(exposedMap), i = 0; i < keys.length; ++i) { exposers.push(keys[i] + ": { " + exposedMap[keys[i]].join(", ") + " }"); } @@ -345,13 +346,13 @@ Interface.prototype.generateOperations = function () { member = new Iterable(this.ctx, this, this.idl, memberIdl); break; default: - //throw new Error("Can't handle member of type '" + memberIdl.type + "'"); + // throw new Error("Can't handle member of type '" + memberIdl.type + "'"); break; } if (member !== null) { const data = member.generate(); - Object.assign(this.requires, data.requires), + Object.assign(this.requires, data.requires); this.str += data.body; } } @@ -373,7 +374,7 @@ Interface.prototype.generateAttributes = function () { member = new Constant(this.ctx, this, this.idl, memberIdl); break; default: - //throw new Error("Can't handle member of type '" + memberIdl.type + "'"); + // throw new Error("Can't handle member of type '" + memberIdl.type + "'"); break; } @@ -396,7 +397,7 @@ Interface.prototype.generateSymbols = function () { if (Object.keys(unscopables).length) { this.str += ` Object.defineProperty(${this.name}.prototype, Symbol.unscopables, { - value: ${JSON.stringify(unscopables, null, ' ')}, + value: ${JSON.stringify(unscopables, null, " ")}, writable: false, enumerable: false, configurable: true diff --git a/lib/constructs/iterable.js b/lib/constructs/iterable.js index 2f3701b3..8fae6d60 100644 --- a/lib/constructs/iterable.js +++ b/lib/constructs/iterable.js @@ -1,6 +1,5 @@ "use strict"; -const conversions = require("webidl-conversions"); const keywords = require("../keywords"); const utils = require("../utils"); @@ -14,7 +13,11 @@ function Iterable(ctx, obj, I, idl) { Iterable.prototype.generateFunction = function (key, kind, keyExpr, fnName) { if (fnName === undefined) { - fnName = typeof key === "symbol" ? "" : (keywords.has(key) ? "_" : key); + if (typeof key === "symbol") { + fnName = ""; + } else { + fnName = keywords.has(key) ? "_" : key; + } } const propExpr = typeof key === "symbol" ? `[${keyExpr}]` : `.${key}`; @@ -44,10 +47,12 @@ Iterable.prototype.generate = function () { throw new TypeError("Illegal invocation"); } if (arguments.length < 1) { - throw new TypeError("Failed to execute 'forEach' on '${this.obj.name}': 1 argument required, but only 0 present."); + throw new TypeError("Failed to execute 'forEach' on '${this.obj.name}': 1 argument required, " + + "but only 0 present."); } if (typeof callback !== "function") { - throw new TypeError("Failed to execute 'forEach' on '${this.obj.name}': The callback provided as parameter 1 is not a function."); + throw new TypeError("Failed to execute 'forEach' on '${this.obj.name}': The callback provided as parameter " + + "1 is not a function."); } const thisArg = arguments[1]; let pairs = Array.from(this[impl]); @@ -67,7 +72,7 @@ Iterable.prototype.generate = function () { return { requires: {}, body: str - } + }; }; module.exports = Iterable; diff --git a/lib/constructs/operation.js b/lib/constructs/operation.js index f8d49408..5d3ea2c7 100644 --- a/lib/constructs/operation.js +++ b/lib/constructs/operation.js @@ -16,7 +16,7 @@ function Operation(ctx, obj, I, idl) { } Operation.prototype.generate = function () { - let requires = {}; + const requires = {}; let str = ""; let name = this.idl.name; @@ -43,7 +43,7 @@ Operation.prototype.generate = function () { } const fnName = keywords.has(name) ? "_" : name; - minConstructor.nameList = minConstructor.nameList.map((name) => (keywords.has(name) ? "_" : "") + name); + minConstructor.nameList = minConstructor.nameList.map(n => (keywords.has(n) ? "_" : "") + n); str += ` ${targetObj}.${name} = function ${fnName}(${minConstructor.nameList.join(", ")}) { @@ -60,19 +60,21 @@ Operation.prototype.generate = function () { const plural = minConstructor.nameList.length > 1 ? "s" : ""; str += ` if (arguments.length < ${minConstructor.nameList.length}) { - throw new TypeError("Failed to execute '${name}' on '${this.obj.name}': ${minConstructor.nameList.length} argument${plural} required, but only " + arguments.length + " present."); + throw new TypeError("Failed to execute '${name}' on '${this.obj.name}': ${minConstructor.nameList.length} " + + "argument${plural} required, but only " + arguments.length + " present."); } `; } const callOn = this.idl.static ? "Impl" : "this[impl]"; - const parameterConversions = Parameters.generateOverloadConversions(this.ctx, overloads, this.interface.name, `Failed to execute '${name}' on '${this.obj.name}': `); + const parameterConversions = Parameters.generateOverloadConversions( + this.ctx, overloads, this.interface.name, `Failed to execute '${name}' on '${this.obj.name}': `); const argsSpread = parameterConversions.hasArgs ? "...args" : ""; Object.assign(requires, parameterConversions.requires); str += parameterConversions.body; - if (this.idl.stringifier || overloads.every((overload) => conversions[overload.operation.idlType.idlType])) { + if (this.idl.stringifier || overloads.every(overload => conversions[overload.operation.idlType.idlType])) { str += ` return ${callOn}.${name}(${argsSpread}); }; @@ -87,7 +89,7 @@ Operation.prototype.generate = function () { return { requires, body: str - } + }; }; module.exports = Operation; diff --git a/lib/keywords.js b/lib/keywords.js index 49daf330..9338cc61 100644 --- a/lib/keywords.js +++ b/lib/keywords.js @@ -1,3 +1,5 @@ +"use strict"; + module.exports = new Set([ "break", "case", "class", "catch", "const", "continue", "debugger", "default", "delete", "do", "else", "export", "extends", "finally", "for", "function", "if", "import", "in", "instanceof", @@ -7,4 +9,4 @@ module.exports = new Set([ "implements", "package", "protected", "static", "interface", "private", "public", - "null", "true", "false"]); \ No newline at end of file + "null", "true", "false"]); diff --git a/lib/output/utils.js b/lib/output/utils.js index ca8c0758..b5055966 100644 --- a/lib/output/utils.js +++ b/lib/output/utils.js @@ -13,7 +13,7 @@ function getReferenceToBytes(bufferSource) { if (bufferSource instanceof ArrayBuffer) { return Buffer.from(bufferSource); } - return Buffer.from(bufferSource.buffer, bufferSource.byteOffset, bufferSource.byteLength) + return Buffer.from(bufferSource.buffer, bufferSource.byteOffset, bufferSource.byteLength); } function getCopyToBytes(bufferSource) { @@ -44,26 +44,27 @@ function getSameObject(wrapper, prop, creator) { return wrapper[sameObjectCaches][prop]; } - return wrapper[sameObjectCaches][prop] = creator(); + wrapper[sameObjectCaches][prop] = creator(); + return wrapper[sameObjectCaches][prop]; } function wrapperForImpl(impl) { return impl ? impl[wrapperSymbol] : null; -}; +} function implForWrapper(wrapper) { return wrapper ? wrapper[implSymbol] : null; -}; +} function tryWrapperForImpl(impl) { const wrapper = wrapperForImpl(impl); return wrapper ? wrapper : impl; -}; +} function tryImplForWrapper(wrapper) { const impl = implForWrapper(wrapper); return impl ? impl : wrapper; -}; +} const iterInternalSymbol = Symbol("internal"); const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); diff --git a/lib/overloads.js b/lib/overloads.js index 8b0c32d8..e7d4780f 100644 --- a/lib/overloads.js +++ b/lib/overloads.js @@ -1,19 +1,23 @@ "use strict"; -module.exports.getEffectiveOverloads = function (A, N, I, C) { +module.exports.getEffectiveOverloads = function (A, N, I) { // No |C| since we don't support callback function yet. const S = []; let F = null; - if (A === 'constructor') { // let's hope no-one specs a member named "constructor" - F = I.extAttrs - .filter(function (a) { return a.name === 'Constructor'; }); - F.forEach(function (c) { if (!c.arguments) { c.arguments = []; }}); + if (A === "constructor") { // let's hope no-one specs a member named "constructor" + F = I.extAttrs.filter(a => a.name === "Constructor"); + for (const c of F) { + if (!c.arguments) { + c.arguments = []; + } + } } else if (typeof A === "string") { - F = I.members - .filter(function (m) { - return m.name === A || (A === "toString" && m.stringifier); - }); - F.forEach(function (m) { if (m.stringifier) { m.arguments = []; }}); + F = I.members.filter(m => m.name === A || (A === "toString" && m.stringifier)); + for (const m of F) { + if (m.stringifier) { + m.arguments = []; + } + } } let maxArgs = 0; @@ -26,19 +30,23 @@ module.exports.getEffectiveOverloads = function (A, N, I, C) { const m = Math.max(maxArgs, N); for (const X of F) { const n = X.arguments.length; - const nameList = X.arguments.map(function (arg) { return arg.name; }); - const typeList = X.arguments.map(function (arg) { return arg.idlType.idlType; }); - const optionalityList = X.arguments.map(function (arg) { - if (arg.optional) return "optional"; - if (arg.variadic) return "variadic"; + const nameList = X.arguments.map(arg => arg.name); + const typeList = X.arguments.map(arg => arg.idlType.idlType); + const optionalityList = X.arguments.map(arg => { + if (arg.optional) { + return "optional"; + } + if (arg.variadic) { + return "variadic"; + } return "required"; }); S.push({ operation: X, - nameList: nameList, - typeList: typeList, - optionalityList: optionalityList + nameList, + typeList, + optionalityList }); if (optionalityList[optionalityList.length - 1] === "variadic") { @@ -53,7 +61,9 @@ module.exports.getEffectiveOverloads = function (A, N, I, C) { } for (let i = n - 1; i >= 0; --i) { - if (optionalityList[i] === "required") break; + if (optionalityList[i] === "required") { + break; + } S.push({ operation: X, nameList: nameList.slice(0, i), diff --git a/lib/parameters.js b/lib/parameters.js index 7eb9d498..4435bcc4 100644 --- a/lib/parameters.js +++ b/lib/parameters.js @@ -11,7 +11,9 @@ function generateVarConversion(ctx, name, conversion, argAttrs, ...typeArgs) { let str = ""; const idlType = conversion.type; - if (conversion.optional && customTypes.get(idlType.idlType) !== "dictionary") { // always (try to) force-convert dictionaries + // Always (try to) force-convert dictionaries + const optional = conversion.optional && customTypes.get(idlType.idlType) !== "dictionary"; + if (optional) { str += ` if (${name} !== undefined) { `; @@ -21,7 +23,7 @@ function generateVarConversion(ctx, name, conversion, argAttrs, ...typeArgs) { Object.assign(requires, conv.requires); str += conv.body; - if (conversion.optional && customTypes.get(idlType.idlType) !== "dictionary") { + if (optional) { str += "}"; if (conversion.default) { str += ` @@ -36,10 +38,9 @@ function generateVarConversion(ctx, name, conversion, argAttrs, ...typeArgs) { requires, body: str }; -}; +} module.exports.generateOverloadConversions = function (ctx, overloads, parentName, errPrefix) { - const { customTypes } = ctx; const requires = {}; let str = ``; let maxConstructor = overloads[0]; @@ -75,7 +76,9 @@ module.exports.generateOverloadConversions = function (ctx, overloads, parentNam continue; } - const conv = generateVarConversion(ctx, `args[${i}]`, typeConversions[i], maxConstructor.operation.arguments[i].extAttrs, parentName, `"${errPrefix}parameter ${i + 1}"`); + const conv = generateVarConversion( + ctx, `args[${i}]`, typeConversions[i], maxConstructor.operation.arguments[i].extAttrs, parentName, + `"${errPrefix}parameter ${i + 1}"`); Object.assign(requires, conv.requires); str += conv.body; } diff --git a/lib/reflector.js b/lib/reflector.js index a8282d08..8bedb9c2 100644 --- a/lib/reflector.js +++ b/lib/reflector.js @@ -1,6 +1,6 @@ "use strict"; -module.exports["boolean"] = { +module.exports.boolean = { get(objName, attrName) { return `return this.hasAttribute("${attrName}");`; }, @@ -15,7 +15,7 @@ module.exports["boolean"] = { } }; -module.exports["DOMString"] = { +module.exports.DOMString = { get(objName, attrName) { return ` const value = this.getAttribute("${attrName}"); @@ -27,7 +27,7 @@ module.exports["DOMString"] = { } }; -module.exports["long"] = { +module.exports.long = { get(objName, attrName) { return ` const value = parseInt(this.getAttribute("${attrName}")); diff --git a/lib/transformer.js b/lib/transformer.js index baaf9007..4d43fccf 100644 --- a/lib/transformer.js +++ b/lib/transformer.js @@ -35,8 +35,8 @@ class Transformer { return this; } - *_collectSources() { - const stats = yield Promise.all(this.sources.map((src) => fs.stat(src.idlPath))); + * _collectSources() { + const stats = yield Promise.all(this.sources.map(src => fs.stat(src.idlPath))); const files = []; for (let i = 0; i < stats.length; ++i) { if (stats[i].isDirectory()) { @@ -59,9 +59,9 @@ class Transformer { return files; } - *_readFiles(files) { + * _readFiles(files) { const zipped = []; - const fileContents = yield Promise.all(files.map((f) => fs.readFile(f.idlPath, { encoding: 'utf-8' }))); + const fileContents = yield Promise.all(files.map(f => fs.readFile(f.idlPath, { encoding: "utf-8" }))); for (let i = 0; i < files.length; ++i) { zipped.push({ idlContent: fileContents[i], @@ -72,7 +72,7 @@ class Transformer { } _parse(outputDir, contents) { - const parsed = contents.map((content) => ({ + const parsed = contents.map(content => ({ idl: webidl.parse(content.idlContent), impl: content.impl })); @@ -161,8 +161,8 @@ class Transformer { } } - *_writeFiles(outputDir) { - let utilsText = yield fs.readFile(__dirname + "/output/utils.js"); + * _writeFiles(outputDir) { + const utilsText = yield fs.readFile(path.resolve(__dirname, "output/utils.js")); yield fs.writeFile(this.options.utilPath, utilsText); const { interfaces, dictionaries } = this.ctx; @@ -176,7 +176,7 @@ class Transformer { implFile = "./" + implFile; } - let relativeUtils = path.relative(outputDir, this.options.utilPath).replace(/\\/g, '/'); + let relativeUtils = path.relative(outputDir, this.options.utilPath).replace(/\\/g, "/"); if (relativeUtils[0] !== ".") { relativeUtils = "./" + relativeUtils; } @@ -198,7 +198,7 @@ class Transformer { for (const obj of dictionaries.values()) { let source = obj.toString(); - let relativeUtils = path.relative(outputDir, this.options.utilPath).replace(/\\/g, '/'); + let relativeUtils = path.relative(outputDir, this.options.utilPath).replace(/\\/g, "/"); if (relativeUtils[0] !== ".") { relativeUtils = "./" + relativeUtils; } @@ -219,12 +219,14 @@ class Transformer { _prettify(source) { return prettier.format(source, { - printWidth: 120, + printWidth: 120 }); } generate(outputDir) { - if (!this.options.utilPath) this.options.utilPath = path.join(outputDir, "utils.js"); + if (!this.options.utilPath) { + this.options.utilPath = path.join(outputDir, "utils.js"); + } return co(function* () { const sources = yield* this._collectSources(); diff --git a/lib/types.js b/lib/types.js index 3c596ba8..1b642038 100644 --- a/lib/types.js +++ b/lib/types.js @@ -4,6 +4,19 @@ const conversions = require("webidl-conversions"); const utils = require("./utils"); +const arrayBufferViewTypes = new Set([ + "Int8Array", "Int16Array", "Int32Array", "Uint8Array", "Uint16Array", "Uint32Array", + "Uint8ClampedArray", "Float32Array", "Float64Array", "DataView" +]); +const stringTypes = new Set(["DOMString", "ByteString", "USVString"]); +const integerTypes = new Set([ + "byte", "octet", "short", "unsigned short", "long", "unsigned long", + "long long", "unsigned long long" +]); +const numericTypes = new Set([ + ...integerTypes, "float", "unrestricted float", "double", "unrestricted double" +]); + function mergeExtAttrs(a = [], b = []) { return [...a, ...b]; } @@ -51,10 +64,9 @@ function resolveType(ctx, idlType, stack = []) { } else if (conversions[idlType.idlType]) { // already resolved return idlType; - } else { - // unknown - return idlType; } + // unknown + return idlType; } function deepClone(obj) { @@ -190,32 +202,34 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e } if (union.sequenceLike || union.dictionary || union.record || union.object) { - let str = `if (utils.isObject(${name})) {`; + let code = `if (utils.isObject(${name})) {`; if (union.sequenceLike) { - str += `if (${name}[Symbol.iterator] !== undefined) {`; - const conv = generateTypeConversion(ctx, name, union.sequenceLike, [], parentName, `${errPrefix} + " sequence"`); + code += `if (${name}[Symbol.iterator] !== undefined) {`; + const conv = generateTypeConversion(ctx, name, union.sequenceLike, [], parentName, + `${errPrefix} + " sequence"`); Object.assign(requires, conv.requires); - str += conv.body; - str += `} else {`; + code += conv.body; + code += `} else {`; } if (union.dictionary || union.record) { const prop = union.dictionary ? "dictionary" : "record"; - const conv = generateTypeConversion(ctx, name, union[prop], [], parentName, `${errPrefix} + " ${prop}"`); + const conv = generateTypeConversion(ctx, name, union[prop], [], parentName, + `${errPrefix} + " ${prop}"`); Object.assign(requires, conv.requires); - str += conv.body; + code += conv.body; } else if (union.object) { // noop } if (union.sequenceLike) { - str += "}"; + code += "}"; } - str += "}"; + code += "}"; - output.push(str); + output.push(code); } if (union.boolean) { @@ -235,34 +249,33 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e } { - let str = "{"; + let code = "{"; const type = union.string || union.numeric || union.boolean; if (type) { - str += generateTypeConversion(ctx, name, type, [], parentName, errPrefix).body; + code += generateTypeConversion(ctx, name, type, [], parentName, errPrefix).body; } else { - str += `throw new TypeError(${errPrefix} + " is not of any supported type.")`; + code += `throw new TypeError(${errPrefix} + " is not of any supported type.")`; } - str += "}"; - output.push(str); + code += "}"; + output.push(code); } str += output.join(" else "); } function generateSequence() { + const conv = generateTypeConversion(ctx, "nextItem", idlType.idlType, [], parentName, + `${errPrefix} + "'s element"`); + Object.assign(requires, conv.requires); + str += ` if (!utils.isObject(${name})) { throw new TypeError(${errPrefix} + " is not an iterable object."); } else { const V = []; const tmp = ${name}; - for (let nextItem of tmp) {`; - - const conv = generateTypeConversion(ctx, "nextItem", idlType.idlType, [], parentName, `${errPrefix} + "'s element"`); - Object.assign(requires, conv.requires); - str += conv.body; - - str += ` + for (let nextItem of tmp) { + ${conv.body} V.push(nextItem); } ${name} = V; @@ -271,6 +284,13 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e } function generateRecord() { + const keyConv = generateTypeConversion(ctx, "typedKey", idlType.idlType[0], [], parentName, + `${errPrefix} + "'s key"`); + Object.assign(requires, keyConv.requires); + const valConv = generateTypeConversion(ctx, "typedValue", idlType.idlType[1], [], parentName, + `${errPrefix} + "'s value"`); + Object.assign(requires, valConv.requires); + str += ` if (!utils.isObject(${name})) { throw new TypeError(${errPrefix} + " is not an object."); @@ -281,15 +301,6 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e if (desc && desc.enumerable) { let typedKey = key; let typedValue = ${name}[key]; - `; - - - const keyConv = generateTypeConversion(ctx, "typedKey", idlType.idlType[0], [], parentName, `${errPrefix} + "'s key"`); - Object.assign(requires, keyConv.requires); - const valConv = generateTypeConversion(ctx, "typedValue", idlType.idlType[1], [], parentName, `${errPrefix} + "'s value"`); - Object.assign(requires, valConv.requires); - - str += ` ${keyConv.body} ${valConv.body} result[typedKey] = typedValue; @@ -306,7 +317,8 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e // Do nothing. handler = ""; } else { - const conv = generateTypeConversion(ctx, "value", idlType.idlType, [], parentName, `${errPrefix} + " promise value"`); + const conv = generateTypeConversion(ctx, "value", idlType.idlType, [], parentName, + `${errPrefix} + " promise value"`); Object.assign(requires, conv.requires); handler = ` ${conv.body} @@ -354,19 +366,6 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e } } -const arrayBufferViewTypes = new Set([ - "Int8Array", "Int16Array", "Int32Array", "Uint8Array", "Uint16Array", "Uint32Array", - "Uint8ClampedArray", "Float32Array", "Float64Array", "DataView" -]); -const stringTypes = new Set(["DOMString", "ByteString", "USVString"]); -const integerTypes = new Set([ - "byte", "octet", "short", "unsigned short", "long", "unsigned long", - "long long", "unsigned long long" -]); -const numericTypes = new Set([ - ...integerTypes, "float", "unrestricted float", "double", "unrestricted double" -]); - // Condense the member types of a union to a more consumable structured object. At the same time, check for the validity // of the union type (no forbidden types, no indistinguishable member types). Duplicated types are allowed for now // though. @@ -486,7 +485,7 @@ function extractUnionInfo(ctx, idlType, errPrefix) { } seen.interfaces.add(item.idlType); } else { - error(`Unknown custom type ${type}`) + error(`Unknown custom type ${type}`); } } else { seen.unknown = true; @@ -495,7 +494,7 @@ function extractUnionInfo(ctx, idlType, errPrefix) { return seen; function error(msg) { - throw new Error(`${msg}\n When compiling "${eval(errPrefix)}"`); + throw new Error(`${msg}\n When compiling "${eval(errPrefix)}"`); // eslint-disable-line no-eval } } diff --git a/lib/utils.js b/lib/utils.js index 4c766d06..810d8528 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,6 +1,6 @@ "use strict"; -module.exports.getDefault = function getDefault(dflt) { +function getDefault(dflt) { switch (dflt.type) { case "boolean": case "number": @@ -17,7 +17,7 @@ module.exports.getDefault = function getDefault(dflt) { throw new Error("Unexpected default type: " + dflt.type); } -module.exports.getExtAttr = function getExtAttr(attrs, name) { +function getExtAttr(attrs, name) { for (let i = 0; i < attrs.length; ++i) { if (attrs[i].name === name) { return attrs[i]; @@ -25,18 +25,25 @@ module.exports.getExtAttr = function getExtAttr(attrs, name) { } return null; -}; +} -module.exports.isGlobal = function isGlobal(idl) { - const isGlobal = !!module.exports.getExtAttr(idl.extAttrs, "Global") || - !!module.exports.getExtAttr(idl.extAttrs, "PrimaryGlobal"); - return isGlobal; -}; +function isGlobal(idl) { + return Boolean(getExtAttr(idl.extAttrs, "Global")) || + Boolean(getExtAttr(idl.extAttrs, "PrimaryGlobal")); +} -module.exports.isPairIterable = function isPairIterable(idl) { +function isPairIterable(idl) { return idl.type === "iterable" && Array.isArray(idl.idlType) && idl.idlType.length === 2; -}; +} + +function isOnInstance(memberIDL, interfaceIDL) { + return getExtAttr(memberIDL.extAttrs, "Unforgeable") || isGlobal(interfaceIDL); +} -module.exports.isOnInstance = (memberIDL, interfaceIDL) => { - return module.exports.getExtAttr(memberIDL.extAttrs, "Unforgeable") || module.exports.isGlobal(interfaceIDL); +module.exports = { + getDefault, + getExtAttr, + isGlobal, + isPairIterable, + isOnInstance }; diff --git a/package-lock.json b/package-lock.json index 83f9b7aa..95958926 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,23 @@ "acorn": "4.0.13" } }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", @@ -35,6 +52,12 @@ "json-stable-stringify": "1.0.1" } }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -119,6 +142,21 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -431,6 +469,23 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + }, + "dependencies": { + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + } + } + }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", @@ -480,6 +535,27 @@ "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", "dev": true }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -542,6 +618,17 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, "content-type-parser": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", @@ -560,6 +647,23 @@ "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.2.14" + } + }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -631,6 +735,21 @@ "strip-bom": "2.0.0" } }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -652,6 +771,16 @@ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -717,12 +846,147 @@ } } }, + "eslint": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.3.0.tgz", + "integrity": "sha1-/NfJY3a780yF7mftABKimWQrEI8=", + "dev": true, + "requires": { + "ajv": "5.2.2", + "babel-code-frame": "6.22.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "2.6.8", + "doctrine": "2.0.0", + "eslint-scope": "3.7.1", + "espree": "3.4.3", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "3.2.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.8.4", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "4.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.3.0", + "strip-json-comments": "2.0.1", + "table": "4.0.1", + "text-table": "0.2.0" + }, + "dependencies": { + "ajv": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", + "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "espree": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-jsx": "3.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "dev": true + } + } + }, "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -768,6 +1032,25 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, + "external-editor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "dev": true, + "requires": { + "iconv-lite": "0.4.18", + "jschardet": "1.5.0", + "tmp": "0.0.31" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", + "dev": true + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -783,6 +1066,12 @@ "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", "dev": true }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -798,6 +1087,25 @@ "bser": "2.0.0" } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -836,6 +1144,18 @@ "locate-path": "2.0.0" } }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -874,6 +1194,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -936,6 +1262,20 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -1068,6 +1408,18 @@ "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", "dev": true }, + "ignore": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1084,6 +1436,102 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "inquirer": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.1.tgz", + "integrity": "sha512-QgW3eiPN8gpj/K5vVpHADJJgrrF0ho/dZGylikGX7iqAdRgC9FVKYKWFLx6hZDBFcOLEoSqINYrVPeFAeG/PdA==", + "dev": true, + "requires": { + "ansi-escapes": "2.0.0", + "chalk": "2.0.1", + "cli-cursor": "2.1.0", + "cli-width": "2.1.0", + "external-editor": "2.0.4", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", + "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", + "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, "invariant": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", @@ -1192,6 +1640,30 @@ "kind-of": "3.2.2" } }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -1204,6 +1676,21 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1640,6 +2127,12 @@ "dev": true, "optional": true }, + "jschardet": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz", + "integrity": "sha512-+Q8JsoEQbrdE+a/gg1F9XO92gcKXgpE5UACqr0sIubjDmBEkd+OOWPGzQeMrWSLxd73r4dHxBeRW7edHu5LmJQ==", + "dev": true + }, "jsdom": { "version": "9.12.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", @@ -1679,6 +2172,12 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -1811,6 +2310,16 @@ "js-tokens": "3.0.2" } }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -1862,6 +2371,12 @@ "mime-db": "1.27.0" } }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1892,6 +2407,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1980,6 +2501,15 @@ "wrappy": "1.0.2" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -2093,6 +2623,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -2137,6 +2673,12 @@ "pinkie": "2.0.4" } }, + "pluralize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", + "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", + "dev": true + }, "pn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.0.0.tgz", @@ -2186,12 +2728,30 @@ "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", "dev": true }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, "prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", "dev": true }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -2287,6 +2847,21 @@ } } }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", @@ -2372,6 +2947,16 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, "resolve": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", @@ -2381,6 +2966,22 @@ "path-parse": "1.0.5" } }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -2400,6 +3001,30 @@ "glob": "7.1.2" } }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -2465,18 +3090,45 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "shellwords": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=", "dev": true }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", @@ -2552,6 +3204,15 @@ } } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", @@ -2596,6 +3257,12 @@ "is-utf8": "0.2.1" } }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -2608,6 +3275,53 @@ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, + "table": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", + "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, "test-exclude": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", @@ -2621,12 +3335,33 @@ "require-main-filename": "1.0.1" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "throat": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -2660,6 +3395,12 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2685,6 +3426,12 @@ "prelude-ls": "1.1.2" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -2719,6 +3466,12 @@ "dev": true, "optional": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", @@ -2850,6 +3603,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, "xml-name-validator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", @@ -2868,6 +3630,12 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", diff --git a/package.json b/package.json index 11735830..7b392acd 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,13 @@ "webidl2": "^4.0.0" }, "devDependencies": { + "eslint": "^4.3.0", "jest": "^20.0.4" }, "scripts": { "test": "jest", - "update-snapshots": "jest --updateSnapshot" + "update-snapshots": "jest --updateSnapshot", + "lint": "eslint ." }, "author": "Sebastian Mayr ", "license": "MIT" diff --git a/test/__snapshots__/test.js.snap b/test/__snapshots__/test.js.snap index 9512a142..40e1d540 100644 --- a/test/__snapshots__/test.js.snap +++ b/test/__snapshots__/test.js.snap @@ -15,7 +15,7 @@ module.exports = { const key = \\"boolWithDefault\\"; let value = obj === undefined || obj === null ? undefined : obj[key]; if (value !== undefined) { - value = conversions[\\"boolean\\"](value, { context: \`\${context} has member boolWithDefault that\` }); + value = conversions[\\"boolean\\"](value, { context: context + \\" has member boolWithDefault that\\" }); ret[key] = value; } else { @@ -27,7 +27,7 @@ module.exports = { const key = \\"requiredInterface\\"; let value = obj === undefined || obj === null ? undefined : obj[key]; if (value !== undefined) { - value = convertURL(value, { context: \`\${context} has member requiredInterface that\` }); + value = convertURL(value, { context: context + \\" has member requiredInterface that\\" }); ret[key] = value; } else { @@ -40,12 +40,12 @@ module.exports = { let value = obj === undefined || obj === null ? undefined : obj[key]; if (value !== undefined) { if (!utils.isObject(value)) { - throw new TypeError(\`\${context} has member seq that\` + \\" is not an iterable object.\\"); + throw new TypeError(context + \\" has member seq that\\" + \\" is not an iterable object.\\"); } else { const V = []; const tmp = value; for (let nextItem of tmp) { - nextItem = convertURLSearchParams(nextItem, { context: \`\${context} has member seq that\` + \\"'s element\\" }); + nextItem = convertURLSearchParams(nextItem, { context: context + \\" has member seq that\\" + \\"'s element\\" }); V.push(nextItem); } @@ -60,7 +60,7 @@ module.exports = { const key = \\"vanillaString\\"; let value = obj === undefined || obj === null ? undefined : obj[key]; if (value !== undefined) { - value = conversions[\\"DOMString\\"](value, { context: \`\${context} has member vanillaString that\` }); + value = conversions[\\"DOMString\\"](value, { context: context + \\" has member vanillaString that\\" }); ret[key] = value; } @@ -238,7 +238,8 @@ PromiseTypes.prototype.voidPromiseConsumer = function voidPromiseConsumer(p) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'voidPromiseConsumer' on 'PromiseTypes': 1 argument required, but only \\" + + \\"Failed to execute 'voidPromiseConsumer' on 'PromiseTypes': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -261,7 +262,8 @@ PromiseTypes.prototype.promiseConsumer = function promiseConsumer(p) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'promiseConsumer' on 'PromiseTypes': 1 argument required, but only \\" + + \\"Failed to execute 'promiseConsumer' on 'PromiseTypes': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -386,7 +388,8 @@ SeqAndRec.prototype.recordConsumer = function recordConsumer(rec) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'recordConsumer' on 'SeqAndRec': 1 argument required, but only \\" + + \\"Failed to execute 'recordConsumer' on 'SeqAndRec': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -431,7 +434,8 @@ SeqAndRec.prototype.recordConsumer2 = function recordConsumer2(rec) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'recordConsumer2' on 'SeqAndRec': 1 argument required, but only \\" + + \\"Failed to execute 'recordConsumer2' on 'SeqAndRec': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -476,7 +480,8 @@ SeqAndRec.prototype.sequenceConsumer = function sequenceConsumer(seq) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'sequenceConsumer' on 'SeqAndRec': 1 argument required, but only \\" + + \\"Failed to execute 'sequenceConsumer' on 'SeqAndRec': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -514,7 +519,8 @@ SeqAndRec.prototype.sequenceConsumer2 = function sequenceConsumer2(seq) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'sequenceConsumer2' on 'SeqAndRec': 1 argument required, but only \\" + + \\"Failed to execute 'sequenceConsumer2' on 'SeqAndRec': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -550,7 +556,8 @@ SeqAndRec.prototype.frozenArrayConsumer = function frozenArrayConsumer(arr) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'frozenArrayConsumer' on 'SeqAndRec': 1 argument required, but only \\" + + \\"Failed to execute 'frozenArrayConsumer' on 'SeqAndRec': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1105,7 +1112,8 @@ TypedefsAndUnions.prototype.numOrStrConsumer = function numOrStrConsumer(a) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'numOrStrConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'numOrStrConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1136,7 +1144,8 @@ TypedefsAndUnions.prototype.numOrStrOrNullConsumer = function numOrStrOrNullCons if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'numOrStrOrNullConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'numOrStrOrNullConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1173,7 +1182,8 @@ TypedefsAndUnions.prototype.numOrStrOrURLOrNullConsumer = function numOrStrOrURL if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'numOrStrOrURLOrNullConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'numOrStrOrURLOrNullConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1212,7 +1222,8 @@ TypedefsAndUnions.prototype.urlMapInnerConsumer = function urlMapInnerConsumer(a if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'urlMapInnerConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'urlMapInnerConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1259,7 +1270,8 @@ TypedefsAndUnions.prototype.urlMapConsumer = function urlMapConsumer(a) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'urlMapConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'urlMapConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1309,7 +1321,8 @@ TypedefsAndUnions.prototype.bufferSourceOrURLConsumer = function bufferSourceOrU if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'bufferSourceOrURLConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'bufferSourceOrURLConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1340,7 +1353,8 @@ TypedefsAndUnions.prototype.arrayBufferViewOrURLMapConsumer = function arrayBuff if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'arrayBufferViewOrURLMapConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'arrayBufferViewOrURLMapConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1406,7 +1420,8 @@ TypedefsAndUnions.prototype.arrayBufferViewDupConsumer = function arrayBufferVie if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'arrayBufferViewDupConsumer' on 'TypedefsAndUnions': 1 argument required, but only \\" + + \\"Failed to execute 'arrayBufferViewDupConsumer' on 'TypedefsAndUnions': 1 \\" + + \\"argument required, but only \\" + arguments.length + \\" present.\\" ); @@ -1557,11 +1572,13 @@ const impl = utils.implSymbol; function URL(url) { if (!new.target) { throw new TypeError( - \\"Failed to construct 'URL'. Please use the 'new' operator; this constructor cannot be called as a function.\\" + \\"Failed to construct 'URL'. Please use the 'new' operator; this constructor \\" + \\"cannot be called as a function.\\" ); } if (arguments.length < 1) { - throw new TypeError(\\"Failed to construct 'URL': 1 argument required, but only \\" + arguments.length + \\" present.\\"); + throw new TypeError( + \\"Failed to construct 'URL': 1 \\" + \\"argument required, but only \\" + arguments.length + \\" present.\\" + ); } const args = []; @@ -1980,7 +1997,8 @@ URLSearchParams.prototype.append = function append(name, value) { if (arguments.length < 2) { throw new TypeError( - \\"Failed to execute 'append' on 'URLSearchParams': 2 arguments required, but only \\" + + \\"Failed to execute 'append' on 'URLSearchParams': 2 \\" + + \\"arguments required, but only \\" + arguments.length + \\" present.\\" ); @@ -2009,7 +2027,10 @@ URLSearchParams.prototype.delete = function _(name) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'delete' on 'URLSearchParams': 1 argument required, but only \\" + arguments.length + \\" present.\\" + \\"Failed to execute 'delete' on 'URLSearchParams': 1 \\" + + \\"argument required, but only \\" + + arguments.length + + \\" present.\\" ); } @@ -2032,7 +2053,10 @@ URLSearchParams.prototype.get = function get(name) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'get' on 'URLSearchParams': 1 argument required, but only \\" + arguments.length + \\" present.\\" + \\"Failed to execute 'get' on 'URLSearchParams': 1 \\" + + \\"argument required, but only \\" + + arguments.length + + \\" present.\\" ); } @@ -2053,7 +2077,10 @@ URLSearchParams.prototype.getAll = function getAll(name) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'getAll' on 'URLSearchParams': 1 argument required, but only \\" + arguments.length + \\" present.\\" + \\"Failed to execute 'getAll' on 'URLSearchParams': 1 \\" + + \\"argument required, but only \\" + + arguments.length + + \\" present.\\" ); } @@ -2076,7 +2103,10 @@ URLSearchParams.prototype.has = function has(name) { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'has' on 'URLSearchParams': 1 argument required, but only \\" + arguments.length + \\" present.\\" + \\"Failed to execute 'has' on 'URLSearchParams': 1 \\" + + \\"argument required, but only \\" + + arguments.length + + \\" present.\\" ); } @@ -2097,7 +2127,10 @@ URLSearchParams.prototype.set = function set(name, value) { if (arguments.length < 2) { throw new TypeError( - \\"Failed to execute 'set' on 'URLSearchParams': 2 arguments required, but only \\" + arguments.length + \\" present.\\" + \\"Failed to execute 'set' on 'URLSearchParams': 2 \\" + + \\"arguments required, but only \\" + + arguments.length + + \\" present.\\" ); } @@ -2149,11 +2182,13 @@ URLSearchParams.prototype.forEach = function forEach(callback) { throw new TypeError(\\"Illegal invocation\\"); } if (arguments.length < 1) { - throw new TypeError(\\"Failed to execute 'forEach' on 'URLSearchParams': 1 argument required, but only 0 present.\\"); + throw new TypeError( + \\"Failed to execute 'forEach' on 'URLSearchParams': 1 argument required, \\" + \\"but only 0 present.\\" + ); } if (typeof callback !== \\"function\\") { throw new TypeError( - \\"Failed to execute 'forEach' on 'URLSearchParams': The callback provided as parameter 1 is not a function.\\" + \\"Failed to execute 'forEach' on 'URLSearchParams': The callback provided as parameter \\" + \\"1 is not a function.\\" ); } const thisArg = arguments[1]; @@ -2399,7 +2434,10 @@ const iface = { if (arguments.length < 1) { throw new TypeError( - \\"Failed to execute 'assign' on 'Unforgeable': 1 argument required, but only \\" + arguments.length + \\" present.\\" + \\"Failed to execute 'assign' on 'Unforgeable': 1 \\" + + \\"argument required, but only \\" + + arguments.length + + \\" present.\\" ); } diff --git a/test/implementations/.gitkeep b/test/implementations/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test/implementations/SeqAndRec.js b/test/implementations/SeqAndRec.js deleted file mode 100644 index 031e7d9e..00000000 --- a/test/implementations/SeqAndRec.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; - -class SeqAndRecImpl { - constructor(args) {} - - recordConsumer(record) { - console.assert(Object.getPrototypeOf(record) === null); - for (const name in record) - console.log(name, JSON.stringify(record[name])); - } - - recordConsumer2(record) { - return this.recordConsumer(record); - } - - sequenceConsumer(arr) { - console.assert(Array.isArray(arr)); - for (const item of arr) - console.log(JSON.stringify(item)); - } - - sequenceConsumer2(arr) { - return this.sequenceConsumer(arr); - } -} - -module.exports = { - implementation: SeqAndRecImpl -}; diff --git a/test/test.js b/test/test.js index 1455f71d..14ab2611 100644 --- a/test/test.js +++ b/test/test.js @@ -1,3 +1,5 @@ +/* eslint-env node, jest */ + "use strict"; const fs = require("fs");