WIP, some builtins, some fixes for new parser version

master
Sven Slootweg 8 months ago
parent 42d44661b3
commit 883e691efe

1
.gitignore vendored

@ -1,3 +1,4 @@
node_modules
node_modules.bak
private-notes.txt
old

@ -5,6 +5,7 @@
"main": "index.js",
"scripts": {
"test": "tape tests/**/* | tap-difflet",
"test-raw": "tape tests/**/*",
"eval": "DEBUG_NIX=1 node run.js"
},
"repository": {
@ -35,8 +36,9 @@
"split-filter": "^1.1.3",
"tap-difflet": "^0.7.2",
"tape": "^5.5.0",
"tree-sitter": "^0.20.2",
"tree-sitter-javascript": "^0.19.0",
"tree-sitter-nix": "cstrahan/tree-sitter-nix"
"tree-sitter-nix": "^0.0.2"
},
"devDependencies": {
"@joepie91/eslint-config": "^1.1.0",

@ -0,0 +1,3 @@
This folder contains implementations of the various `builtins` in Nix.
The way the exported functions are expressed here is subtly different from the rest of the codebase; arrow functions are used instead of regular functions. This is because Nix does not *really** have multi-argument functions, and so multi-argument functions need to be expressed as single-argument functions that return other single-argument functions. The only way to ergonomically express this is with nested arrow functions.

@ -0,0 +1,11 @@
"use strict";
module.exports = ($attributeSet) => ($attributesToRemove) => {
let newAttributeSet = { ... $attributeSet() };
for (let $attribute of $attributesToRemove()) {
delete newAttributeSet[$attribute()];
}
return newAttributeSet;
};

@ -0,0 +1,9 @@
"use strict";
module.exports = ($a) => ($b) => {
// First evaluate the first argument...
$a();
// ... then evaluate and return the second argument.
return $b();
};

@ -0,0 +1,49 @@
"use strict";
module.exports = ($version) => {
let version = $version();
// FIXME: assert string
let parts = [];
let currentPart = "";
let isNumber = null;
function finalizePart() {
if (currentPart !== "") {
// NOTE: Numbers get added to the list as strings anyway. This is really weird considering `nix-env -u`s comparison logic, but it's how upstream Nix works too.
parts.push(currentPart);
currentPart = "";
isNumber = null;
}
}
// SPEC: Is it correct to assume that only the ASCII character set is supported here?
// TODO: Replace this with a proper parser some day; maybe use it as a testcase for protocolkit?
for (let i = 0; i < version.length; i++) {
let code = version.charCodeAt(i);
if (code >= 48 && code <= 57) {
// Digit
if (isNumber !== true) {
finalizePart();
isNumber = true;
}
currentPart += version[i];
} else if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122)) {
// Letter (uppercase and lowercase respectively)
if (isNumber !== false) {
finalizePart();
isNumber = false;
}
currentPart += version[i];
} else {
finalizePart();
}
}
finalizePart();
return parts;
};

@ -11,64 +11,15 @@ module.exports = function evaluate(nixCode) {
}
const builtins = {
seq: lazyWrap(($a) => ($b) => {
// First evaluate the first argument...
$a();
// ... then evaluate and return the second argument.
return $b();
}),
splitVersion: lazyWrap(($version) => {
let version = $version();
// FIXME: assert string
let parts = [];
let currentPart = "";
let isNumber = null;
function finalizePart() {
if (currentPart !== "") {
// NOTE: Numbers get added to the list as strings anyway. This is really weird considering `nix-env -u`s comparison logic, but it's how upstream Nix works too.
parts.push(currentPart);
currentPart = "";
isNumber = null;
}
}
// FIXME: Is it correct to assume that only the ASCII character set is supported here?
// TODO: Replace this with a proper parser some day
for (let i = 0; i < version.length; i++) {
let code = version.charCodeAt(i);
if (code >= 48 && code <= 57) {
// Digit
if (isNumber !== true) {
finalizePart();
isNumber = true;
}
currentPart += version[i];
} else if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122)) {
// Letter (uppercase and lowercase respectively)
if (isNumber !== false) {
finalizePart();
isNumber = false;
}
currentPart += version[i];
} else {
finalizePart();
}
}
finalizePart();
return parts;
})
seq: lazyWrap(require("./builtins/seq")),
splitVersion: lazyWrap(require("./builtins/split-version")),
removeAttrs: lazyWrap(require("./builtins/remove-attrs")),
};
const api = {
builtins: () => builtins,
builtins: lazyWrap(builtins),
// NOTE: `builtins` properties are already lazy-wrapped
removeAttrs: builtins.removeAttrs,
$memoize: function (func) {
let isCalled = false;
let storedResult;

@ -3,6 +3,24 @@
const matchValue = require("match-value");
const asExpression = require("as-expression");
const FIELD_MAPPINGS = {
attrset_expression: {
binding_set: "MERGE"
},
rec_attrset_expression: {
binding_set: "MERGE"
},
let_attrset_expression: {
binding_set: "MERGE"
},
};
function mergeNode(parent, child) {
// NOTE: Mutates parent!
let { type, ... childArgs } = child;
Object.assign(parent, childArgs);
}
// TODO: Refactor this
function convertStringNodeParts(node) {
let fullText = node.text;
@ -65,6 +83,7 @@ function convertNode(node) {
: { type: "token", text: node.text }
if (node.fields != null) {
// console.log({ node, fields: node.fields, children: node.children });
for (let field of node.fields) {
let children = node[field];
let fieldName = field.replace(/Nodes?$/, "");
@ -79,10 +98,26 @@ function convertNode(node) {
}
});
}
let nodeFieldMappings = FIELD_MAPPINGS[node.type];
if (nodeFieldMappings != null) {
node.children.forEach((child, i) => {
let mapTo = nodeFieldMappings[child.type];
if (mapTo === "MERGE") {
// This means we should elide the child node, and merge it into the node we're currently processing; this is used to deal with non-hidden layers of indirection
mergeNode(result, convertNode(child));
} else if (mapTo != null) {
// TODO: Support for multi-child fields?
result[mapTo] = convertNode(child);
}
});
}
}
// Special case: if we don't provide a Babel-compatible top-level Program entry, traversal will fail
if (type === "source_expression") {
if (type === "source_code") {
return {
type: "Program",
sourceType: "script",
@ -90,73 +125,91 @@ function convertNode(node) {
};
}
// Special case: this is just a wrapper for an identifier, and we don't really want to keep this wrapper
if (type === "variable_expression") {
return convertNode(node.nameNode);
}
// The below section is based on `alias` expressions throughout the grammar, and the rules in https://github.com/cstrahan/tree-sitter-nix/blob/83ee5993560bf15854c69b77d92e34456f8fb655/grammar.js#L53-L59
if (type === "identifier" || type === "attr_identifier") {
// FIXME: attr_identifier gone?
result.name = node.text;
} else if (type === "integer" || type === "float") {
} else if (type === "integer_expression" || type === "float_expression") {
result.value = node.text;
} else if (type === "string") {
} else if (type === "string_expression") {
result.parts = convertStringNodeParts(node);
} else if (type === "path" || type === "hpath") {
} else if (type === "path_expression" || type === "hpath_expression") {
result.path = node.text;
} else if (type === "spath") {
} else if (type === "spath_expression") {
// Strip the < and >
result.path = node.text.slice(1, -1);
} else if (type === "uri") {
} else if (type === "uri_expression") {
result.uri = node.text;
}
if (type === "binary") {
if (type === "binary_expression") {
// Unpack the anonymous token
result.operator = result.operator.text;
}
if (type === "rec_attrset") {
if (type === "rec_attrset_expression") {
result.recursive = true;
} else if (type === "attrset") {
result.recursive = false;
}
// FIXME: Is this code still needed after the parser updates?
if (type === "inherit") {
// We're inheriting from scope here, so the source expression is explicitly not set
result.expression = null;
result.expression = result.expression ?? null;
} else if (type === "inherit_from") {
// Already set
}
if (type === "list_expression") {
// TODO: Can this sort of renaming be done more neatly?
result.elements = result.element;
delete result.element;
}
// console.log(result);
result.type = matchValue(result.type, {
source_expression: "NixProgram",
source_code: "NixProgram",
token: "NixAnonymousToken",
path: "NixPathLiteral",
hpath: "NixHomePathLiteral",
spath: "NixEnvironmentPathLiteral",
uri: "NixURILiteral",
integer: "NixIntegerLiteral",
float: "NixFloatLiteral",
string: "NixStringLiteral",
parenthesized: "NixParenthesizedExpression",
attrset: "NixAttributeSet",
rec_attrset: "NixAttributeSet",
let: "NixLetIn",
let_attrset: "NixLetAttributeSet",
path_expression: "NixPathLiteral",
hpath_expression: "NixHomePathLiteral", /* FIXME: Do we have interpolation support here yet? */
spath_expression: "NixEnvironmentPathLiteral",
uri_expression: "NixURILiteral",
integer_expression: "NixIntegerLiteral",
float_expression: "NixFloatLiteral",
string_expression: "NixStringLiteral",
parenthesized_expression: "NixParenthesizedExpression",
attrset_expression: "NixAttributeSet",
rec_attrset_expression: "NixAttributeSet",
binding_set: "NixAttributeSetBindings",
let_expression: "NixLetIn",
let_attrset_expression: "NixLetAttributeSet",
identifier: "NixIdentifier",
attr_identifier: "NixAttributeIdentifier",
attr_identifier: "NixAttributeIdentifier", // FIXME: Gone?
attrpath: "NixAttributePath",
inherit: "NixInherit",
inherit_from: "NixInherit",
attrs_inherited: "NixInheritAttributes",
attrs_inherited_from: "NixInheritAttributes",
bind: "NixBinding",
binary: "NixBinaryOperation",
app: "NixFunctionCall",
select: "NixAttributeSelection",
inherited_attrs: "NixInheritAttributes",
attrs_inherited_from: "NixInheritAttributes", // FIXME: Gone?
binding: "NixBinding",
binary_expression: "NixBinaryOperation",
apply_expression: "NixFunctionCall",
select_expression: "NixAttributeSelection",
interpolation: "NixInterpolationExpression",
list_expression: "NixListLiteral",
with_expression: "NixWithExpression",
// Function definitions
function: "NixFunctionDefinition",
function_expression: "NixFunctionDefinition",
formals: "NixUnpackedAttributes",
formal: "NixUnpackedAttribute",
// _: (value) => value
// FIXME: assert_expression? if_expression? unary_expression? has_attr_expression? apply_expression? indented_string_expression? binding_set?
});
return result;

@ -59,7 +59,7 @@ let tmplRecursiveBinding = template(`
function isDynamicBinding(binding) {
return binding.attrpath.attr[0].type !== "NixAttributeIdentifier";
return binding.attrpath.attr[0].type !== "NixIdentifier";
}
function objectNormal(bindings) {
@ -126,8 +126,7 @@ module.exports = {
assert(node.attrpath.type === "NixAttributePath");
return node.attrpath.attr.reduce((last, identifier) => {
assert(identifier.type === "NixAttributeIdentifier");
// console.log({identifier});
return callLazyWrapper(types.memberExpression(last, types.identifier(identifier.name)));
}, node.expression);
});
@ -151,7 +150,7 @@ module.exports = {
// };
// });
let bindings = node.bind.map((binding) => {
let bindings = node.binding.map((binding) => {
assert(binding.attrpath.attr.length === 1); // Nested attributes should have been desugared by this point
return {

@ -4,21 +4,21 @@
const unreachable = require("@joepie91/unreachable")("jsNix");
const NoChange = require("astformer/actions/no-change"); // FIXME
const { NixAttributeIdentifier, NixAttributeSet, NixBinding } = require("./util/nix-types");
const { NixIdentifier, NixAttributeSet, NixBinding } = require("./util/nix-types");
function isAttributeSet(node) {
return (node.type === "NixAttributeSet");
}
function mergeAttributeSets(a, b) {
return NixAttributeSet([ ... a.bind, ... b.bind ]);
return NixAttributeSet([ ... a.binding, ... b.binding ]);
}
function mergeBindings(name, a, b) {
let attributes = mergeAttributeSets(unpackBindingValue(a), unpackBindingValue(b));
return NixBinding(
[ NixAttributeIdentifier(name) ],
[ NixIdentifier(name) ],
attributes
);
}
@ -51,14 +51,14 @@ module.exports = {
let newStaticBindings = {};
let dynamicBindings = [];
for (let binding of node.bind) {
for (let binding of node.binding) {
if (binding.type === "NixBinding") {
if (binding.attrpath.attr.length > 1) {
neededDesugaring = true;
}
let firstAttribute = binding.attrpath.attr[0];
let isStaticAttribute = firstAttribute.type === "NixAttributeIdentifier";
let isStaticAttribute = firstAttribute.type === "NixIdentifier";
if (isStaticAttribute) {
let attributeName = firstAttribute.name;

@ -10,7 +10,8 @@ module.exports = {
name: "desugar-inherits",
visitors: {
NixAttributeSet: (node) => {
let [ inherits, regularBindings ] = splitFilter(node.bind, (binding) => binding.type === "NixInherit");
// console.dir(node, {depth:null})
let [ inherits, regularBindings ] = splitFilter(node.binding, (binding) => binding.type === "NixInherit");
if (inherits.length === 0) {
return NoChange;
@ -21,7 +22,7 @@ module.exports = {
tempName: `$temp$${tempCounter++}`,
sourceExpression: inherit.expression,
names: inherit.attrs.attr.map((attribute) => {
assert(attribute.type === "NixAttributeIdentifier");
assert(attribute.type === "NixIdentifier");
return attribute.name;
})
};
@ -29,7 +30,7 @@ module.exports = {
let letBindings = inherits_.map((inherit) => {
return nixTypes.NixBinding(
[ nixTypes.NixAttributeIdentifier(inherit.tempName) ],
[ nixTypes.NixIdentifier(inherit.tempName) ],
inherit.sourceExpression
);
});
@ -37,10 +38,10 @@ module.exports = {
let inheritedAttributeBindings = inherits_.flatMap((inherit) => {
return inherit.names.map((name) => {
return nixTypes.NixBinding(
[ nixTypes.NixAttributeIdentifier(name) ],
[ nixTypes.NixIdentifier(name) ],
nixTypes.NixAttributeSelection(
nixTypes.NixIdentifier(inherit.tempName),
[ nixTypes.NixAttributeIdentifier(name) ]
[ nixTypes.NixIdentifier(name) ]
)
);
});

@ -8,7 +8,7 @@ const _nixTypes = require("./util/nix-types");
function isValidBodyAttribute(binding) {
assert(binding.attrpath.type === "NixAttributePath");
assert(binding.attrpath.attr.length > 0);
assert(binding.attrpath.attr[0].type === "NixAttributeIdentifier");
assert(binding.attrpath.attr[0].type === "NixIdentifier");
if (binding.attrpath.attr[0].name === "body") {
if (binding.attrpath.attr.length > 1) {
@ -27,7 +27,7 @@ module.exports = {
NixLetAttributeSet: (node) => {
// We save a bunch of complexity here by directly translating to a recursive attribute set instead of `let..in`; our JS representation of `let..in` is *functionally* identical to how a LetAttributeSet works. We just use a different attribute name to represent the returned evaluation.
let [ bodyBindings, actualBindings ] = splitFilter(node.bind, (binding) => isValidBodyAttribute(binding));
let [ bodyBindings, actualBindings ] = splitFilter(node.binding, (binding) => isValidBodyAttribute(binding));
if (bodyBindings.length === 0) {
// TODO: Display source code position + snippet

@ -5,10 +5,11 @@ const types = require("@babel/types");
const template = require("@babel/template").default;
const templateExpression = require("./util/template-expression");
const NoChange = require("astformer/actions/no-change");
// FIXME: Auto-generate argument list based on exposed API surface?
let tmplModule = template(`
module.exports = function({ builtins, $memoize, $handleArgument, $assertUniqueKeys }) {
module.exports = function({ builtins, removeAttrs, $memoize, $handleArgument, $assertUniqueKeys }) {
return %%contents%%;
};
`);
@ -17,6 +18,24 @@ let tmplIdentifierReference = templateExpression(`(
%%name%%()
)`);
let tmplWithWrapper = templateExpression(`
(() => {
const %%contextName%% = %%setupCode%%;
return %%body%%;
})()
`);
let tmplImplicitContextNested = templateExpression(`
Object.assign(Object.create(%%parent%%), %%environment%%)
`);
let tmplImplicitContextTop = templateExpression(`
Object.assign({}, %%environment%%)
`);
let implicitContextCounter = 0;
let trivial = {
name: "trivial-transforms",
visitors: {
@ -30,24 +49,58 @@ let trivial = {
return tmplModule({ contents: node.body[0] });
});
},
NixAttributePath: (_node, { setContext }) => {
// This ensures that attribute paths get excluded from being processed as an identifier, now that the parser no longer distinguishes between attribute identifiers and regular identifiers
setContext([ "attr" ], "identifierType", "attributePath");
return NoChange;
},
NixIdentifier: (node, { getContext }) => {
// FIXME: Mangle reserved keywords like `const`
let safeName = (node.name === "import")
? "$import"
: node.name;
if (getContext("identifierType") === "define") {
return types.identifier(node.name);
return types.identifier(safeName);
} else if (getContext("identifierType") === "attributePath") {
// Do nothing, this will get removed from the tree in attribute set handling
return NoChange;
} else { // reference
return tmplIdentifierReference({ name: node.name });
return tmplIdentifierReference({ name: safeName });
}
},
NixBinaryOperation: (_node, { defer }) => {
return defer((node) => {
// FIXME: Verify that all the 'operator' values match between Nix and JS!
// FIXME: Need to replace this with utility functions to deal with eg. paths
return types.binaryExpression(node.operator, node.left, node.right);
});
},
NixWithExpression: (node, { defer, setContext, getContext }) => {
// TODO: Can we optimize for the fast case (no nested `with`) by referencing the source attrset directly?
let parentContext = getContext("implicitContext");
let hasParent = (parentContext != null);
let contextName = `$implicit${implicitContextCounter++}`;
setContext(null, "implicitContext", contextName);
let setupCode = (hasParent)
? tmplImplicitContextNested({ environment: node.environment, parent: parentContext })
: tmplImplicitContextTop({ environment: node.environment });
return defer((node) => {
return tmplWithWrapper({
contextName: contextName,
setupCode: setupCode,
body: node.body
});
});
}
}
};
module.exports = [
// FIXME: desugar-search-path
require("./desugar-inherits"),
require("./desugar-attrsets"),
require("./desugar-let-attribute-set"),
@ -55,6 +108,7 @@ module.exports = [
require("./mangle-identifiers"),
require("./let-in"),
require("./literals"),
require("./lists"),
require("./functions"),
require("./attribute-sets"),
trivial,

@ -7,7 +7,7 @@ module.exports = {
visitors: {
NixLetIn: (node) => {
return nixTypes.JSNixLet(
node.bind,
node.binding,
node.body
);
}

@ -0,0 +1,19 @@
"use strict";
const types = require("@babel/types");
const lazyWrapper = require("./templates/lazy-wrapper");
module.exports = {
name: "lists",
visitors: {
NixListLiteral: (_node, { defer }) => {
return defer((node) => {
return types.arrayExpression(
node.elements.map((element) => {
return lazyWrapper(element);
})
);
});
}
}
};

@ -2,12 +2,18 @@
const types = require("@babel/types");
const splitFilter = require("split-filter");
const templateExpression = require("./util/template-expression");
let tmplPathLiteral = templateExpression(`
$path(%%path%%)
`);
module.exports = {
name: "literals",
visitors: {
NixIntegerLiteral: (node) => types.numericLiteral(parseInt(node.value)),
NixFloatLiteral: (node) => types.numericLiteral(parseFloat(node.value)),
NixPathLiteral: (node) => tmplPathLiteral({ path: types.stringLiteral(node.path) }),
NixStringLiteral: (node, { defer }) => {
if (node.parts.length === 1 && node.parts[0].type === "NixInterpolationLiteral") {
// Fast case; just a simple, non-interpolated string literal
@ -22,6 +28,6 @@ module.exports = {
);
});
}
}
},
}
};

@ -18,7 +18,7 @@ function mangleNode(node) {
module.exports = {
name: "mangle-identifiers",
visitors: {
NixAttributeIdentifier: mangleNode,
// NixAttributeIdentifier: mangleNode,
NixIdentifier: mangleNode
}
};

@ -8,6 +8,7 @@ module.exports = function objectLiteral(entries) {
if (typeof key === "string") {
return types.objectProperty(types.stringLiteral(key), value, false);
} else {
// console.dir({entries}, {depth:null});
return types.objectProperty(key, value, true);
}
})

@ -71,11 +71,11 @@ let types = module.exports = {
types.NixAttributeSet([
... bindings,
types.NixBinding(
[ types.NixAttributeIdentifier("$letBody") ],
[ types.NixIdentifier("$letBody") ],
body
)
], true),
[ types.NixAttributeIdentifier("$letBody") ]
[ types.NixIdentifier("$letBody") ]
);
}
};

@ -1,51 +1,55 @@
"use strict";
const tape = require("tape-catch");
const fs = require("fs");
const path = require("path");
const util = require("util");
const evaluate = require("../src/evaluate");
try {
const tape = require("tape-catch");
const fs = require("fs");
const path = require("path");
const util = require("util");
const evaluate = require("../src/evaluate");
const NIX_SOURCE_REPO = process.env.NIX_SOURCE_REPO;
const NIX_SOURCE_REPO = process.env.NIX_SOURCE_REPO;
if (NIX_SOURCE_REPO == null) {
throw new Error(`To run the upstream Nix language tests, you must specify a NIX_SOURCE_REPO environment variable, that points at the root of a local checkout of the Git repository for Nix`);
}
const testsPath = path.join(NIX_SOURCE_REPO, "tests/lang");
let tests = fs.readdirSync(testsPath)
.filter((entry) => entry.endsWith(".exp"))
.map((entry) => entry.replace(/\.exp$/, ""));
function formatResultNode(node) {
if (typeof node === "string") {
return `"${node.replace(/"/g, '\\"')}"`;
} else if (Array.isArray(node)) {
return `[ ${node.map(formatResultNode).join(" ")} ]`;
} else {
return node.toString();
if (NIX_SOURCE_REPO == null) {
throw new Error(`To run the upstream Nix language tests, you must specify a NIX_SOURCE_REPO environment variable, that points at the root of a local checkout of the Git repository for Nix`);
}
}
for (let test of tests) {
try {
let expression = fs.readFileSync(path.join(testsPath, `${test}.nix`), "utf8");
let expectedResult = fs.readFileSync(path.join(testsPath, `${test}.exp`), "utf8").replace(/\n$/, "");
const testsPath = path.join(NIX_SOURCE_REPO, "tests/lang");
tape(`Nix upstream language tests - ${test}`, (test) => {
test.plan(1);
let tests = fs.readdirSync(testsPath)
.filter((entry) => entry.endsWith(".exp"))
.map((entry) => entry.replace(/\.exp$/, ""));
let result = formatResultNode(evaluate(expression).value);
test.equals(expectedResult, result);
});
} catch (error) {
// FIXME: This would currently cause ENOENTs during evaluation (eg. reading a file from Nix itself) to be ignored
if (error.code === "ENOENT") {
// skip
function formatResultNode(node) {
if (typeof node === "string") {
return `"${node.replace(/"/g, '\\"')}"`;
} else if (Array.isArray(node)) {
return `[ ${node.map(formatResultNode).join(" ")} ]`;
} else {
throw error;
return node.toString();
}
}
for (let test of tests) {
try {
let expression = fs.readFileSync(path.join(testsPath, `${test}.nix`), "utf8");
let expectedResult = fs.readFileSync(path.join(testsPath, `${test}.exp`), "utf8").replace(/\n$/, "");
tape(`Nix upstream language tests - ${test}`, (test) => {
test.plan(1);
let result = formatResultNode(evaluate(expression).value);
test.equals(expectedResult, result);
});
} catch (error) {
// FIXME: This would currently cause ENOENTs during evaluation (eg. reading a file from Nix itself) to be ignored
if (error.code === "ENOENT") {
// skip
} else {
throw error;
}
}
}
} catch (error) {
console.error(error);
}

@ -487,12 +487,7 @@ ajv@^6.10.0, ajv@^6.12.4:
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
ansi-regex@^5.0.1:
version "5.0.1"
@ -689,7 +684,7 @@ chownr@^1.1.1:
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==
color-convert@^1.9.0:
version "1.9.3"
@ -733,7 +728,7 @@ concat-map@0.0.1:
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
convert-source-map@^1.7.0:
version "1.8.0"
@ -842,12 +837,12 @@ defined@^1.0.0:
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
diff@1.0:
version "1.0.8"
@ -897,6 +892,11 @@ electron-to-chromium@^1.3.830:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.842.tgz#641e414012dded277468892c0156cb01984f4f6f"
integrity sha512-P/nDMPIYdb2PyqCQwhTXNi5JFjX1AsDVR0y6FrHw752izJIAJ+Pn5lugqyBq4tXeRSZBMBb2ZGvRGB1djtELEQ==
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@ -1193,7 +1193,7 @@ functional-red-black-tree@^1.0.1:
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
@ -1239,7 +1239,7 @@ get-symbol-description@^1.0.0:
github-from-package@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
glob-parent@^6.0.1:
version "6.0.2"
@ -1323,7 +1323,7 @@ has-tostringtag@^1.0.0:
has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
has@^1.0.3:
version "1.0.3"
@ -1464,14 +1464,14 @@ is-finite@^1.0.0, is-finite@^1.0.1:
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
@ -1583,7 +1583,7 @@ isarray@^2.0.5:
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
isexe@^2.0.0:
version "2.0.0"
@ -1719,11 +1719,16 @@ minimist@^0.2.0:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455"
integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==
minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
minimist@^1.1.3, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minimist@^1.2.0, minimist@^1.2.3:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
@ -1734,11 +1739,16 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
nan@^2.12.1, nan@^2.14.0, nan@^2.14.2:
nan@^2.12.1:
version "2.15.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
nan@^2.14.0, nan@^2.17.0:
version "2.17.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb"
integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==
napi-build-utils@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
@ -1749,7 +1759,7 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
node-abi@^2.7.0:
node-abi@^2.21.0:
version "2.30.1"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
@ -1761,11 +1771,6 @@ node-releases@^1.1.75:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
noop-logger@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -1789,7 +1794,7 @@ npmlog@^4.0.1:
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
object-assign@^4.0.1, object-assign@^4.1.0:
version "4.1.1"
@ -1915,10 +1920,10 @@ plur@^1.0.0:
resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156"
integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=
prebuild-install@^5.0.0:
version "5.3.6"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291"
integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==
prebuild-install@^6.0.1:
version "6.1.4"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f"
integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==
dependencies:
detect-libc "^1.0.3"
expand-template "^2.0.3"
@ -1926,15 +1931,13 @@ prebuild-install@^5.0.0:
minimist "^1.2.3"
mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1"
node-abi "^2.7.0"
noop-logger "^0.1.1"
node-abi "^2.21.0"
npmlog "^4.0.1"
pump "^3.0.0"
rc "^1.2.7"
simple-get "^3.0.3"
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
which-pm-runs "^1.0.0"
prelude-ls@^1.2.1:
version "1.2.1"
@ -2013,9 +2016,9 @@ read-pkg@^1.0.0:
string_decoder "~0.10.x"
readable-stream@^2.0.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
version "2.3.8"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
@ -2026,9 +2029,9 @@ readable-stream@^2.0.6:
util-deprecate "~1.0.1"
readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
@ -2131,7 +2134,7 @@ semver@^6.3.0:
set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
shebang-command@^2.0.0:
version "2.0.0"
@ -2155,9 +2158,9 @@ side-channel@^1.0.3, side-channel@^1.0.4:
object-inspect "^1.9.0"
signal-exit@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
simple-concat@^1.0.0:
version "1.0.1"
@ -2165,9 +2168,9 @@ simple-concat@^1.0.0:
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
version "3.1.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
dependencies:
decompress-response "^4.2.0"
once "^1.3.1"
@ -2217,19 +2220,20 @@ sprintf-js@~1.0.2:
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2":
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
"string-width@^1.0.2 || 2 || 3 || 4":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string.prototype.trim@^1.2.5:
version "1.2.5"
@ -2278,17 +2282,10 @@ string_decoder@~1.1.1:
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@ -2318,7 +2315,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
supports-color@^5.3.0:
version "5.5.0"
@ -2454,20 +2451,20 @@ tree-sitter-javascript@^0.19.0:
dependencies:
nan "^2.12.1"
tree-sitter-nix@cstrahan/tree-sitter-nix:
tree-sitter-nix@^0.0.2:
version "0.0.2"
resolved "https://codeload.github.com/cstrahan/tree-sitter-nix/tar.gz/83ee5993560bf15854c69b77d92e34456f8fb655"
resolved "https://registry.yarnpkg.com/tree-sitter-nix/-/tree-sitter-nix-0.0.2.tgz#f40176270961a1d969a6d36e43a08526e2bde94f"
integrity sha512-rPYc7NUi6hPOyFSoVdCVC9feqBk0kJ0Z3ftTWXo1ubyyKzPM5tJP6mD6xYl0gN45oh9GHGzvTbOmmwIk0XOj5A==
dependencies:
nan "^2.14.2"
tree-sitter "^0.19.0"
nan "^2.17.0"
tree-sitter@^0.19.0:
version "0.19.0"
resolved "https://registry.yarnpkg.com/tree-sitter/-/tree-sitter-0.19.0.tgz#68c4cfa12b34752d69162b81ad233f3e6fc4a70d"
integrity sha512-jw/BNCCRB9RCq/GFGU0VuhchGlIIlYRQFnjXgPKG3fBIo+c3ImuPITtAHJJ4XgTBNfeAQmt8XC4wShgBw8tgdg==
tree-sitter@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/tree-sitter/-/tree-sitter-0.20.2.tgz#d5227966635d5e27dabd6744b28618d5c43cea77"
integrity sha512-xyaEOl3zgsYWfZ9LfByPZBFfllsOoccm0Y2DY564iYuzmjg4vWd9nd0hcjh5qhq4uIG5LvSACTHcB5RPu9iuxQ==
dependencies:
nan "^2.14.0"
prebuild-install "^5.0.0"
prebuild-install "^6.0.1"
trim-newlines@^1.0.0:
version "1.0.0"
@ -2477,7 +2474,7 @@ trim-newlines@^1.0.0:
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
dependencies:
safe-buffer "^5.0.1"
@ -2513,7 +2510,7 @@ uri-js@^4.2.2:
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
v8-compile-cache@^2.0.3:
version "2.3.0"
@ -2549,11 +2546,6 @@ which-collection@^1.0.1:
is-weakmap "^2.0.1"
is-weakset "^2.0.1"
which-pm-runs@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
which-typed-array@^1.1.2:
version "1.1.7"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793"
@ -2574,11 +2566,11 @@ which@^2.0.1:
isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
dependencies:
string-width "^1.0.2 || 2"
string-width "^1.0.2 || 2 || 3 || 4"
word-wrap@^1.2.3:
version "1.2.3"
@ -2588,7 +2580,7 @@ word-wrap@^1.2.3:
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
"xtend@>=4.0.0 <4.1.0-0":
version "4.0.2"

Loading…
Cancel
Save