From d911bdaf63b756357a52a45aa100756fd54fd2e7 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 08:56:14 +1100 Subject: [PATCH 01/16] add AssignmentPattern support to scope tracking - fixes #537 --- lib/6to5/types/index.js | 3 ++- .../es6-let-scoping/exec-destructuring-defaults/exec.js | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/transformation/es6-let-scoping/exec-destructuring-defaults/exec.js diff --git a/lib/6to5/types/index.js b/lib/6to5/types/index.js index 8bc6cb5d75..8e719cf369 100644 --- a/lib/6to5/types/index.js +++ b/lib/6to5/types/index.js @@ -487,7 +487,8 @@ t.getIds.nodes = { MemeberExpression: ["object"], SpreadElement: ["argument"], Property: ["value"], - ComprehensionBlock: ["left"] + ComprehensionBlock: ["left"], + AssignmentPattern: ["left"] }; t.getIds.arrays = { diff --git a/test/fixtures/transformation/es6-let-scoping/exec-destructuring-defaults/exec.js b/test/fixtures/transformation/es6-let-scoping/exec-destructuring-defaults/exec.js new file mode 100644 index 0000000000..a440bcb047 --- /dev/null +++ b/test/fixtures/transformation/es6-let-scoping/exec-destructuring-defaults/exec.js @@ -0,0 +1,5 @@ +var fields = [{ name: "title" }, { name: "content" }]; + +for (let { name, value = "Default value" } of fields) { + assert.equal(value, "Default value"); +} From 61f1fae83b14dd88a572895209646bc48a23d797 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 16:47:52 +1100 Subject: [PATCH 02/16] remove unused template --- .../transformation/templates/array-comprehension-for-each.js | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 lib/6to5/transformation/templates/array-comprehension-for-each.js diff --git a/lib/6to5/transformation/templates/array-comprehension-for-each.js b/lib/6to5/transformation/templates/array-comprehension-for-each.js deleted file mode 100644 index cd22eab009..0000000000 --- a/lib/6to5/transformation/templates/array-comprehension-for-each.js +++ /dev/null @@ -1,3 +0,0 @@ -ARRAY.forEach(function (KEY) { - -}); From 031bda61cc9a4efc29fafbe6ea8dd0e3a7ead4a4 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 16:48:07 +1100 Subject: [PATCH 03/16] don't continue let scoping remapping if there are none to be remapped --- .../transformation/transformers/es6-let-scoping.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/6to5/transformation/transformers/es6-let-scoping.js b/lib/6to5/transformation/transformers/es6-let-scoping.js index 4d0f13910e..044be99030 100644 --- a/lib/6to5/transformation/transformers/es6-let-scoping.js +++ b/lib/6to5/transformation/transformers/es6-let-scoping.js @@ -117,9 +117,10 @@ LetScoping.prototype.run = function () { */ LetScoping.prototype.remap = function () { - var letRefs = this.letReferences; - var scope = this.scope; - var file = this.file; + var hasRemaps = false; + var letRefs = this.letReferences; + var scope = this.scope; + var file = this.file; // alright, so since we aren't wrapping this block in a closure // we have to check if any of our let variables collide with @@ -136,6 +137,7 @@ LetScoping.prototype.remap = function () { var uid = file.generateUidIdentifier(ref.name, scope).name; ref.name = uid; + hasRemaps = true; remaps[key] = remaps[uid] = { node: ref, uid: uid @@ -143,6 +145,8 @@ LetScoping.prototype.remap = function () { } } + if (!hasRemaps) return; + // var replace = function (node, parent, scope, context, remaps) { From 26cb5d5a65df70628b6e2bb7f392b5c6c1a7d736 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 16:48:41 +1100 Subject: [PATCH 04/16] add block to for loop scope - fixes #538 --- lib/6to5/traverse/scope.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/6to5/traverse/scope.js b/lib/6to5/traverse/scope.js index f100615f12..a11c5f41f9 100644 --- a/lib/6to5/traverse/scope.js +++ b/lib/6to5/traverse/scope.js @@ -139,6 +139,8 @@ Scope.prototype.getInfo = function () { var node = block[key]; if (t.isBlockScoped(node)) add(node); }); + + block = block.body; } // Program, BlockStatement - let variables From 4790e4068ad95427a8d4de6972dec5dc5e69c1b6 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 16:52:00 +1100 Subject: [PATCH 05/16] add for collision test #538 --- .../es6-let-scoping/exec-collision-for/exec.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 test/fixtures/transformation/es6-let-scoping/exec-collision-for/exec.js diff --git a/test/fixtures/transformation/es6-let-scoping/exec-collision-for/exec.js b/test/fixtures/transformation/es6-let-scoping/exec-collision-for/exec.js new file mode 100644 index 0000000000..367c09b2e5 --- /dev/null +++ b/test/fixtures/transformation/es6-let-scoping/exec-collision-for/exec.js @@ -0,0 +1,6 @@ +let x = 0; +for (;;) { + let x = 1; + assert.equal(x, 1); + break; +} From e46f42872ab3e6e9274d0c214879c19a44ab9b76 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 16:52:11 +1100 Subject: [PATCH 06/16] add array comprehension collision test #538 --- .../es6-let-scoping/exec-collision-array-comprehension/exec.js | 2 ++ .../exec-collision-array-comprehension/options.json | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/exec.js create mode 100644 test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/options.json diff --git a/test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/exec.js b/test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/exec.js new file mode 100644 index 0000000000..0ce1188288 --- /dev/null +++ b/test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/exec.js @@ -0,0 +1,2 @@ +var foo = []; +assert.deepEqual([for (foo of [1, 2, 3]) foo], [1, 2, 3]); diff --git a/test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/options.json b/test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/options.json new file mode 100644 index 0000000000..252f473a73 --- /dev/null +++ b/test/fixtures/transformation/es6-let-scoping/exec-collision-array-comprehension/options.json @@ -0,0 +1,3 @@ +{ + "experimental": true +} From 4b525daf72c6a5002f74d7969a11fc62cb41c95f Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 19:33:05 +1100 Subject: [PATCH 07/16] fix forOf scope declarations not propagating to new for loop - fixes #538 --- lib/6to5/transformation/transformers/es6-for-of.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/6to5/transformation/transformers/es6-for-of.js b/lib/6to5/transformation/transformers/es6-for-of.js index 3eed21d15d..3e3f9ac0f3 100644 --- a/lib/6to5/transformation/transformers/es6-for-of.js +++ b/lib/6to5/transformation/transformers/es6-for-of.js @@ -30,6 +30,9 @@ exports.ForOfStatement = function (node, parent, scope, context, file) { // push the rest of the original loop body onto our new body block.body = block.body.concat(node.body.body); + // todo: find out why this is necessary? #538 + loop._scopeInfo = node._scopeInfo; + return loop; }; From 193a3c167ea393a448f3929beeb1fc2319aeed0a Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 20 Jan 2015 19:33:26 +1100 Subject: [PATCH 08/16] loops should contain their child block let declarations --- lib/6to5/traverse/scope.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/6to5/traverse/scope.js b/lib/6to5/traverse/scope.js index a11c5f41f9..55296c8c50 100644 --- a/lib/6to5/traverse/scope.js +++ b/lib/6to5/traverse/scope.js @@ -120,6 +120,7 @@ Scope.prototype.generateTempBasedOnNode = function (node, file) { }; Scope.prototype.getInfo = function () { + var parent = this.parent; var block = this.block; if (block._scopeInfo) return block._scopeInfo; @@ -132,6 +133,10 @@ Scope.prototype.getInfo = function () { if (!reference) Scope.add(node, declarations); }; + if (parent && t.isBlockStatement(block) && t.isFor(parent.block)) { + return info; + } + // ForStatement - left, init if (t.isFor(block)) { @@ -140,7 +145,9 @@ Scope.prototype.getInfo = function () { if (t.isBlockScoped(node)) add(node); }); - block = block.body; + if (t.isBlockStatement(block.body)) { + block = block.body; + } } // Program, BlockStatement - let variables From 3c258c47169c059bae29819aadf3fc10c7f15de5 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 10:17:52 +1100 Subject: [PATCH 09/16] add proper ordering to function param logic - fixes #549 --- lib/6to5/transformation/transform.js | 2 +- .../transformers/es6-default-parameters.js | 15 ++++-- .../transformers/es6-destructuring.js | 51 +++++++++++-------- .../optional-undeclared-variable-check.js | 2 - .../destructuring/exec.js | 19 +++++++ 5 files changed, 60 insertions(+), 29 deletions(-) create mode 100644 test/fixtures/transformation/es6-default-parameters/destructuring/exec.js diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index a98b0fe820..d7006f32ce 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -71,8 +71,8 @@ _.each({ templateLiterals: require("./transformers/es6-template-literals"), propertyMethodAssignment: require("./transformers/es6-property-method-assignment"), computedPropertyNames: require("./transformers/es6-computed-property-names"), - destructuring: require("./transformers/es6-destructuring"), defaultParameters: require("./transformers/es6-default-parameters"), + destructuring: require("./transformers/es6-destructuring"), forOf: require("./transformers/es6-for-of"), unicodeRegex: require("./transformers/es6-unicode-regex"), abstractReferences: require("./transformers/es7-abstract-references"), diff --git a/lib/6to5/transformation/transformers/es6-default-parameters.js b/lib/6to5/transformation/transformers/es6-default-parameters.js index af1b163e5b..3e942eb68c 100644 --- a/lib/6to5/transformation/transformers/es6-default-parameters.js +++ b/lib/6to5/transformation/transformers/es6-default-parameters.js @@ -15,7 +15,7 @@ exports.Function = function (node, parent, scope, context, file) { var iife = false; var def; - var checkTDZ = function (ids) { + var checkTDZ = function (param, def, ids) { var check = function (node, parent) { if (!t.isReferencedIdentifier(node, parent)) return; @@ -29,7 +29,10 @@ exports.Function = function (node, parent, scope, context, file) { }; check(def, node); - traverse(def, { enter: check }); + + if (!t.isPattern(param)) { + traverse(def, { enter: check }); + } }; for (var i = 0; i < node.defaults.length; i++) { @@ -42,7 +45,7 @@ exports.Function = function (node, parent, scope, context, file) { // are to the right - ie. uninitialized parameters var rightIds = ids.slice(i); for (var i2 = 0; i2 < rightIds.length; i2++) { - checkTDZ(rightIds[i2]); + checkTDZ(param, def, rightIds[i2]); } // we're accessing a variable that's already defined within this function @@ -66,12 +69,14 @@ exports.Function = function (node, parent, scope, context, file) { continue; } - body.push(util.template("default-parameter", { + var def = util.template("default-parameter", { VARIABLE_NAME: node.params[i], DEFAULT_VALUE: def, ARGUMENT_KEY: t.literal(+i), ARGUMENTS: argsIdentifier - }, true)); + }, true); + def._blockHoist = node.defaults.length - i; + body.push(def); } // we need to cut off all trailing default parameters diff --git a/lib/6to5/transformation/transformers/es6-destructuring.js b/lib/6to5/transformation/transformers/es6-destructuring.js index 3a3e27c4b5..35d5ae886b 100644 --- a/lib/6to5/transformation/transformers/es6-destructuring.js +++ b/lib/6to5/transformation/transformers/es6-destructuring.js @@ -8,13 +8,27 @@ var buildVariableAssign = function (opts, id, init) { var op = opts.operator; if (t.isMemberExpression(id)) op = "="; + var node; + if (op) { - return t.expressionStatement(t.assignmentExpression(op, id, init)); + node = t.expressionStatement(t.assignmentExpression(op, id, init)); } else { - return t.variableDeclaration(opts.kind, [ + node = t.variableDeclaration(opts.kind, [ t.variableDeclarator(id, init) ]); } + + node._blockHoist = opts.blockHoist; + + return node; +}; + +var buildVariableDeclar = function (opts, id, init) { + var declar = t.variableDeclaration("var", [ + t.variableDeclarator(id, init) + ]); + declar._blockHoist = opts.blockHoist; + return declar; }; var push = function (opts, nodes, elem, parentId) { @@ -100,9 +114,7 @@ var pushArrayPattern = function (opts, nodes, pattern, parentId) { var toArray = opts.file.toArray(parentId, !hasSpreadElement && pattern.elements.length); var _parentId = opts.scope.generateUidBasedOnNode(parentId, opts.file); - nodes.push(t.variableDeclaration("var", [ - t.variableDeclarator(_parentId, toArray) - ])); + nodes.push(buildVariableDeclar(opts, _parentId, toArray)); parentId = _parentId; for (i = 0; i < pattern.elements.length; i++) { @@ -138,11 +150,7 @@ var pushPattern = function (opts) { if (!t.isArrayExpression(parentId) && !t.isMemberExpression(parentId) && !t.isIdentifier(parentId)) { var key = scope.generateUidBasedOnNode(parentId, file); - - nodes.push(t.variableDeclaration("var", [ - t.variableDeclarator(key, parentId) - ])); - + nodes.push(buildVariableDeclar(opts, key, parentId)); parentId = key; } @@ -181,19 +189,20 @@ exports.Function = function (node, parent, scope, context, file) { var hasDestructuring = false; - node.params = node.params.map(function (pattern) { + node.params = node.params.map(function (pattern, i) { if (!t.isPattern(pattern)) return pattern; hasDestructuring = true; var parentId = file.generateUidIdentifier("ref", scope); pushPattern({ - kind: "var", - nodes: nodes, - pattern: pattern, - id: parentId, - file: file, - scope: scope + blockHoist: node.params.length - i, + pattern: pattern, + nodes: nodes, + scope: scope, + file: file, + kind: "var", + id: parentId }); return parentId; @@ -294,12 +303,12 @@ exports.VariableDeclaration = function (node, parent, scope, context, file) { var patternId = declar.init; var pattern = declar.id; var opts = { - kind: node.kind, - nodes: nodes, pattern: pattern, - id: patternId, + nodes: nodes, + scope: scope, + kind: node.kind, file: file, - scope: scope + id: patternId, }; if (t.isPattern(pattern) && patternId) { diff --git a/lib/6to5/transformation/transformers/optional-undeclared-variable-check.js b/lib/6to5/transformation/transformers/optional-undeclared-variable-check.js index 6640c0217f..ad6dbeb06c 100644 --- a/lib/6to5/transformation/transformers/optional-undeclared-variable-check.js +++ b/lib/6to5/transformation/transformers/optional-undeclared-variable-check.js @@ -1,5 +1,3 @@ -var t = require("../../types"); - exports.optional = true; exports.Identifier = function (node, parent, scope, context, file) { diff --git a/test/fixtures/transformation/es6-default-parameters/destructuring/exec.js b/test/fixtures/transformation/es6-default-parameters/destructuring/exec.js new file mode 100644 index 0000000000..3148c98145 --- /dev/null +++ b/test/fixtures/transformation/es6-default-parameters/destructuring/exec.js @@ -0,0 +1,19 @@ +function required(msg) { + throw new Error(msg); +} + +function sum( + { arr = required('arr is required') } = { arr: arr = [] }, + length = arr.length +) { + let i = 0; + let acc = 0; + for (let item of arr) { + if (i >= length) return acc; + acc += item; + i++; + } + return acc; +} + +assert.equal(sum({arr:[1,2]}), 3); From e8810f5124fff62389ba0a5a7525e8ec2474d64e Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 10:20:13 +1100 Subject: [PATCH 10/16] add 2.13.4 changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90dc942ac5..812085868b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,16 @@ _Note: Gaps between patch versions are faulty/broken releases._ +## 2.13.4 + + * **Bug Fix** + * Fix ordering of destructuring and default params. + * Fix loop body scope. + * Fix `for...of` transformation not retaining it's scope. + * Add destructuring assignment support to scope tracking. + * **Polish** + * More reliable newlines for pretty printing variable declarations. + ## 2.13.3 * **Internal** From 3c06e68cae9555e3ac62a0b6ecad5d4d62c929f5 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 10:21:27 +1100 Subject: [PATCH 11/16] fix default parameter node variable name --- .../transformation/transformers/es6-default-parameters.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/6to5/transformation/transformers/es6-default-parameters.js b/lib/6to5/transformation/transformers/es6-default-parameters.js index 3e942eb68c..acb29933d0 100644 --- a/lib/6to5/transformation/transformers/es6-default-parameters.js +++ b/lib/6to5/transformation/transformers/es6-default-parameters.js @@ -69,14 +69,14 @@ exports.Function = function (node, parent, scope, context, file) { continue; } - var def = util.template("default-parameter", { + var defNode = util.template("default-parameter", { VARIABLE_NAME: node.params[i], DEFAULT_VALUE: def, ARGUMENT_KEY: t.literal(+i), ARGUMENTS: argsIdentifier }, true); - def._blockHoist = node.defaults.length - i; - body.push(def); + defNode._blockHoist = node.defaults.length - i; + body.push(defNode); } // we need to cut off all trailing default parameters From 9385c7e4ad30d09bfdbc77f9a622b492f76d791a Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 10:27:35 +1100 Subject: [PATCH 12/16] v2.13.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bcce27ea4..5c71cbb6ae 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "6to5", "description": "Turn ES6 code into readable vanilla ES5 with source maps", - "version": "2.13.3", + "version": "2.13.4", "author": "Sebastian McKenzie ", "homepage": "https://6to5.org/", "repository": "6to5/6to5", From 62f11011b076ac93172f0ddce9cc39b709654176 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 13:19:24 +1100 Subject: [PATCH 13/16] upgrade kexec - closes #551 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5c71cbb6ae..4acd335026 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,6 @@ "uglify-js": "2.4.16" }, "optionalDependencies": { - "kexec": "0.2.0" + "kexec": "1.1.0" } } From df65ec08a288b600748ed8a75a7af66dd3b9f4fc Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 13:35:24 +1100 Subject: [PATCH 14/16] support destructuring patterns in rest parameters - fixes #550 --- lib/6to5/transformation/transform.js | 2 +- .../transformers/es6-rest-parameters.js | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index d7006f32ce..76e92a5e25 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -72,6 +72,7 @@ _.each({ propertyMethodAssignment: require("./transformers/es6-property-method-assignment"), computedPropertyNames: require("./transformers/es6-computed-property-names"), defaultParameters: require("./transformers/es6-default-parameters"), + restParameters: require("./transformers/es6-rest-parameters"), destructuring: require("./transformers/es6-destructuring"), forOf: require("./transformers/es6-for-of"), unicodeRegex: require("./transformers/es6-unicode-regex"), @@ -84,7 +85,6 @@ _.each({ _blockHoist: require("./transformers/_block-hoist"), generators: require("./transformers/es6-generators"), - restParameters: require("./transformers/es6-rest-parameters"), protoToAssign: require("./transformers/optional-proto-to-assign"), diff --git a/lib/6to5/transformation/transformers/es6-rest-parameters.js b/lib/6to5/transformation/transformers/es6-rest-parameters.js index 89bafc063a..dac44731c0 100644 --- a/lib/6to5/transformation/transformers/es6-rest-parameters.js +++ b/lib/6to5/transformation/transformers/es6-rest-parameters.js @@ -41,6 +41,22 @@ exports.Function = function (node, parent, scope, context, file) { ); } + // support patterns + if (t.isPattern(rest)) { + var pattern = rest; + rest = file.generateUidIdentifier("ref", scope); + + // let the destructuring transformer handle this + var restDeclar = t.variableDeclaration("var", [ + t.variableDeclarator(pattern, rest) + ]); + + // retain evaluation position + restDeclar._blockHoist = node.params.length + 1; + + node.body.body.unshift(restDeclar); + } + node.body.body.unshift( util.template("rest", { ARGUMENTS: argsId, From 4c6076e529b6c0e18bfa8bdb6221b347bd14be70 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 13:35:30 +1100 Subject: [PATCH 15/16] add 2.13.5 changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 812085868b..2893667628 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,13 @@ _Note: Gaps between patch versions are faulty/broken releases._ +## 2.13.5 + + * **Bug Fix** + * Allow rest parameters to be destructuring patterns. + * **Internal** + * Upgrade `kexec` to `1.1.0`. + ## 2.13.4 * **Bug Fix** From 194c080c648475b809cef4ee057b13c747ac87de Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 21 Jan 2015 13:37:06 +1100 Subject: [PATCH 16/16] v2.13.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4acd335026..6129a92926 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "6to5", "description": "Turn ES6 code into readable vanilla ES5 with source maps", - "version": "2.13.4", + "version": "2.13.5", "author": "Sebastian McKenzie ", "homepage": "https://6to5.org/", "repository": "6to5/6to5",