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
node_modules.bak
private-notes.txt private-notes.txt
old old

@ -5,6 +5,7 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "tape tests/**/* | tap-difflet", "test": "tape tests/**/* | tap-difflet",
"test-raw": "tape tests/**/*",
"eval": "DEBUG_NIX=1 node run.js" "eval": "DEBUG_NIX=1 node run.js"
}, },
"repository": { "repository": {
@ -35,8 +36,9 @@
"split-filter": "^1.1.3", "split-filter": "^1.1.3",
"tap-difflet": "^0.7.2", "tap-difflet": "^0.7.2",
"tape": "^5.5.0", "tape": "^5.5.0",
"tree-sitter": "^0.20.2",
"tree-sitter-javascript": "^0.19.0", "tree-sitter-javascript": "^0.19.0",
"tree-sitter-nix": "cstrahan/tree-sitter-nix" "tree-sitter-nix": "^0.0.2"
}, },
"devDependencies": { "devDependencies": {
"@joepie91/eslint-config": "^1.1.0", "@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 = { const builtins = {
seq: lazyWrap(($a) => ($b) => { seq: lazyWrap(require("./builtins/seq")),
// First evaluate the first argument... splitVersion: lazyWrap(require("./builtins/split-version")),
$a(); removeAttrs: lazyWrap(require("./builtins/remove-attrs")),
// ... 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;
})
}; };
const api = { const api = {
builtins: () => builtins, builtins: lazyWrap(builtins),
// NOTE: `builtins` properties are already lazy-wrapped
removeAttrs: builtins.removeAttrs,
$memoize: function (func) { $memoize: function (func) {
let isCalled = false; let isCalled = false;
let storedResult; let storedResult;

@ -3,6 +3,24 @@
const matchValue = require("match-value"); const matchValue = require("match-value");
const asExpression = require("as-expression"); 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 // TODO: Refactor this
function convertStringNodeParts(node) { function convertStringNodeParts(node) {
let fullText = node.text; let fullText = node.text;
@ -65,6 +83,7 @@ function convertNode(node) {
: { type: "token", text: node.text } : { type: "token", text: node.text }
if (node.fields != null) { if (node.fields != null) {
// console.log({ node, fields: node.fields, children: node.children });
for (let field of node.fields) { for (let field of node.fields) {
let children = node[field]; let children = node[field];
let fieldName = field.replace(/Nodes?$/, ""); 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 // 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 { return {
type: "Program", type: "Program",
sourceType: "script", 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 // 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") { if (type === "identifier" || type === "attr_identifier") {
// FIXME: attr_identifier gone?
result.name = node.text; result.name = node.text;
} else if (type === "integer" || type === "float") { } else if (type === "integer_expression" || type === "float_expression") {
result.value = node.text; result.value = node.text;
} else if (type === "string") { } else if (type === "string_expression") {
result.parts = convertStringNodeParts(node); result.parts = convertStringNodeParts(node);
} else if (type === "path" || type === "hpath") { } else if (type === "path_expression" || type === "hpath_expression") {
result.path = node.text; result.path = node.text;
} else if (type === "spath") { } else if (type === "spath_expression") {
// Strip the < and > // Strip the < and >
result.path = node.text.slice(1, -1); result.path = node.text.slice(1, -1);
} else if (type === "uri") { } else if (type === "uri_expression") {
result.uri = node.text; result.uri = node.text;
} }
if (type === "binary") { if (type === "binary_expression") {
// Unpack the anonymous token // Unpack the anonymous token
result.operator = result.operator.text; result.operator = result.operator.text;
} }
if (type === "rec_attrset") { if (type === "rec_attrset_expression") {
result.recursive = true; result.recursive = true;
} else if (type === "attrset") { } else if (type === "attrset") {
result.recursive = false; result.recursive = false;
} }
// FIXME: Is this code still needed after the parser updates?
if (type === "inherit") { if (type === "inherit") {
// We're inheriting from scope here, so the source expression is explicitly not set // 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") { } else if (type === "inherit_from") {
// Already set // 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); // console.log(result);
result.type = matchValue(result.type, { result.type = matchValue(result.type, {
source_expression: "NixProgram", source_code: "NixProgram",
token: "NixAnonymousToken", token: "NixAnonymousToken",
path: "NixPathLiteral", path_expression: "NixPathLiteral",
hpath: "NixHomePathLiteral", hpath_expression: "NixHomePathLiteral", /* FIXME: Do we have interpolation support here yet? */
spath: "NixEnvironmentPathLiteral", spath_expression: "NixEnvironmentPathLiteral",
uri: "NixURILiteral", uri_expression: "NixURILiteral",
integer: "NixIntegerLiteral", integer_expression: "NixIntegerLiteral",
float: "NixFloatLiteral", float_expression: "NixFloatLiteral",
string: "NixStringLiteral", string_expression: "NixStringLiteral",
parenthesized: "NixParenthesizedExpression", parenthesized_expression: "NixParenthesizedExpression",
attrset: "NixAttributeSet", attrset_expression: "NixAttributeSet",
rec_attrset: "NixAttributeSet", rec_attrset_expression: "NixAttributeSet",
let: "NixLetIn", binding_set: "NixAttributeSetBindings",
let_attrset: "NixLetAttributeSet", let_expression: "NixLetIn",
let_attrset_expression: "NixLetAttributeSet",
identifier: "NixIdentifier", identifier: "NixIdentifier",
attr_identifier: "NixAttributeIdentifier", attr_identifier: "NixAttributeIdentifier", // FIXME: Gone?
attrpath: "NixAttributePath", attrpath: "NixAttributePath",
inherit: "NixInherit", inherit: "NixInherit",
inherit_from: "NixInherit", inherit_from: "NixInherit",
attrs_inherited: "NixInheritAttributes", inherited_attrs: "NixInheritAttributes",
attrs_inherited_from: "NixInheritAttributes", attrs_inherited_from: "NixInheritAttributes", // FIXME: Gone?
bind: "NixBinding", binding: "NixBinding",
binary: "NixBinaryOperation", binary_expression: "NixBinaryOperation",
app: "NixFunctionCall", apply_expression: "NixFunctionCall",
select: "NixAttributeSelection", select_expression: "NixAttributeSelection",
interpolation: "NixInterpolationExpression", interpolation: "NixInterpolationExpression",
list_expression: "NixListLiteral",
with_expression: "NixWithExpression",
// Function definitions // Function definitions
function: "NixFunctionDefinition", function_expression: "NixFunctionDefinition",
formals: "NixUnpackedAttributes", formals: "NixUnpackedAttributes",
formal: "NixUnpackedAttribute", formal: "NixUnpackedAttribute",
// _: (value) => value
// FIXME: assert_expression? if_expression? unary_expression? has_attr_expression? apply_expression? indented_string_expression? binding_set?
}); });
return result; return result;

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

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

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

@ -8,7 +8,7 @@ const _nixTypes = require("./util/nix-types");
function isValidBodyAttribute(binding) { function isValidBodyAttribute(binding) {
assert(binding.attrpath.type === "NixAttributePath"); assert(binding.attrpath.type === "NixAttributePath");
assert(binding.attrpath.attr.length > 0); 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[0].name === "body") {
if (binding.attrpath.attr.length > 1) { if (binding.attrpath.attr.length > 1) {
@ -27,7 +27,7 @@ module.exports = {
NixLetAttributeSet: (node) => { 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. // 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) { if (bodyBindings.length === 0) {
// TODO: Display source code position + snippet // TODO: Display source code position + snippet

@ -5,10 +5,11 @@ const types = require("@babel/types");
const template = require("@babel/template").default; const template = require("@babel/template").default;
const templateExpression = require("./util/template-expression"); const templateExpression = require("./util/template-expression");
const NoChange = require("astformer/actions/no-change");
// FIXME: Auto-generate argument list based on exposed API surface? // FIXME: Auto-generate argument list based on exposed API surface?
let tmplModule = template(` let tmplModule = template(`
module.exports = function({ builtins, $memoize, $handleArgument, $assertUniqueKeys }) { module.exports = function({ builtins, removeAttrs, $memoize, $handleArgument, $assertUniqueKeys }) {
return %%contents%%; return %%contents%%;
}; };
`); `);
@ -17,6 +18,24 @@ let tmplIdentifierReference = templateExpression(`(
%%name%%() %%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 = { let trivial = {
name: "trivial-transforms", name: "trivial-transforms",
visitors: { visitors: {
@ -30,24 +49,58 @@ let trivial = {
return tmplModule({ contents: node.body[0] }); 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 }) => { NixIdentifier: (node, { getContext }) => {
// FIXME: Mangle reserved keywords like `const` // FIXME: Mangle reserved keywords like `const`
let safeName = (node.name === "import")
? "$import"
: node.name;
if (getContext("identifierType") === "define") { 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 } else { // reference
return tmplIdentifierReference({ name: node.name }); return tmplIdentifierReference({ name: safeName });
} }
}, },
NixBinaryOperation: (_node, { defer }) => { NixBinaryOperation: (_node, { defer }) => {
return defer((node) => { return defer((node) => {
// FIXME: Verify that all the 'operator' values match between Nix and JS! // 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); 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 = [ module.exports = [
// FIXME: desugar-search-path
require("./desugar-inherits"), require("./desugar-inherits"),
require("./desugar-attrsets"), require("./desugar-attrsets"),
require("./desugar-let-attribute-set"), require("./desugar-let-attribute-set"),
@ -55,6 +108,7 @@ module.exports = [
require("./mangle-identifiers"), require("./mangle-identifiers"),
require("./let-in"), require("./let-in"),
require("./literals"), require("./literals"),
require("./lists"),
require("./functions"), require("./functions"),
require("./attribute-sets"), require("./attribute-sets"),
trivial, trivial,

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

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

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

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

@ -1,51 +1,55 @@
"use strict"; "use strict";
const tape = require("tape-catch"); try {
const fs = require("fs"); const tape = require("tape-catch");
const path = require("path"); const fs = require("fs");
const util = require("util"); const path = require("path");
const evaluate = require("../src/evaluate"); 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) { 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`); 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();
} }
}
for (let test of tests) { const testsPath = path.join(NIX_SOURCE_REPO, "tests/lang");
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) => { let tests = fs.readdirSync(testsPath)
test.plan(1); .filter((entry) => entry.endsWith(".exp"))
.map((entry) => entry.replace(/\.exp$/, ""));
let result = formatResultNode(evaluate(expression).value); function formatResultNode(node) {
if (typeof node === "string") {
test.equals(expectedResult, result); return `"${node.replace(/"/g, '\\"')}"`;
}); } else if (Array.isArray(node)) {
} catch (error) { return `[ ${node.map(formatResultNode).join(" ")} ]`;
// FIXME: This would currently cause ENOENTs during evaluation (eg. reading a file from Nix itself) to be ignored
if (error.code === "ENOENT") {
// skip
} else { } 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: ansi-regex@^2.0.0:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
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=
ansi-regex@^5.0.1: ansi-regex@^5.0.1:
version "5.0.1" version "5.0.1"
@ -689,7 +684,7 @@ chownr@^1.1.1:
code-point-at@^1.0.0: code-point-at@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 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: color-convert@^1.9.0:
version "1.9.3" 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: console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 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: convert-source-map@^1.7.0:
version "1.8.0" version "1.8.0"
@ -842,12 +837,12 @@ defined@^1.0.0:
delegates@^1.0.0: delegates@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 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: detect-libc@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 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: diff@1.0:
version "1.0.8" 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" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.842.tgz#641e414012dded277468892c0156cb01984f4f6f"
integrity sha512-P/nDMPIYdb2PyqCQwhTXNi5JFjX1AsDVR0y6FrHw752izJIAJ+Pn5lugqyBq4tXeRSZBMBb2ZGvRGB1djtELEQ== 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: end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4" version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 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: gauge@~2.7.3:
version "2.7.4" version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==
dependencies: dependencies:
aproba "^1.0.3" aproba "^1.0.3"
console-control-strings "^1.0.0" console-control-strings "^1.0.0"
@ -1239,7 +1239,7 @@ get-symbol-description@^1.0.0:
github-from-package@0.0.0: github-from-package@0.0.0:
version "0.0.0" version "0.0.0"
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 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: glob-parent@^6.0.1:
version "6.0.2" version "6.0.2"
@ -1323,7 +1323,7 @@ has-tostringtag@^1.0.0:
has-unicode@^2.0.0: has-unicode@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 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: has@^1.0.3:
version "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: is-fullwidth-code-point@^1.0.0:
version "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" 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: dependencies:
number-is-nan "^1.0.0" number-is-nan "^1.0.0"
is-fullwidth-code-point@^2.0.0: is-fullwidth-code-point@^3.0.0:
version "2.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^4.0.0, is-glob@^4.0.3: is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3" version "4.0.3"
@ -1583,7 +1583,7 @@ isarray@^2.0.5:
isarray@~1.0.0: isarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
isexe@^2.0.0: isexe@^2.0.0:
version "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" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455"
integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg== 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" version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 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: mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
version "0.5.3" version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 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" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 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" version "2.15.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== 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: napi-build-utils@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" 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" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
node-abi@^2.7.0: node-abi@^2.21.0:
version "2.30.1" version "2.30.1"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== 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" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== 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: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 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: number-is-nan@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 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: object-assign@^4.0.1, object-assign@^4.1.0:
version "4.1.1" version "4.1.1"
@ -1915,10 +1920,10 @@ plur@^1.0.0:
resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156"
integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=
prebuild-install@^5.0.0: prebuild-install@^6.0.1:
version "5.3.6" version "6.1.4"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f"
integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg== integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==
dependencies: dependencies:
detect-libc "^1.0.3" detect-libc "^1.0.3"
expand-template "^2.0.3" expand-template "^2.0.3"
@ -1926,15 +1931,13 @@ prebuild-install@^5.0.0:
minimist "^1.2.3" minimist "^1.2.3"
mkdirp-classic "^0.5.3" mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1" napi-build-utils "^1.0.1"
node-abi "^2.7.0" node-abi "^2.21.0"
noop-logger "^0.1.1"
npmlog "^4.0.1" npmlog "^4.0.1"
pump "^3.0.0" pump "^3.0.0"
rc "^1.2.7" rc "^1.2.7"
simple-get "^3.0.3" simple-get "^3.0.3"
tar-fs "^2.0.0" tar-fs "^2.0.0"
tunnel-agent "^0.6.0" tunnel-agent "^0.6.0"
which-pm-runs "^1.0.0"
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
@ -2013,9 +2016,9 @@ read-pkg@^1.0.0:
string_decoder "~0.10.x" string_decoder "~0.10.x"
readable-stream@^2.0.6: readable-stream@^2.0.6:
version "2.3.7" version "2.3.8"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies: dependencies:
core-util-is "~1.0.0" core-util-is "~1.0.0"
inherits "~2.0.3" inherits "~2.0.3"
@ -2026,9 +2029,9 @@ readable-stream@^2.0.6:
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@^3.1.1, readable-stream@^3.4.0: readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.0" version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies: dependencies:
inherits "^2.0.3" inherits "^2.0.3"
string_decoder "^1.1.1" string_decoder "^1.1.1"
@ -2131,7 +2134,7 @@ semver@^6.3.0:
set-blocking@~2.0.0: set-blocking@~2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 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: shebang-command@^2.0.0:
version "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" object-inspect "^1.9.0"
signal-exit@^3.0.0: signal-exit@^3.0.0:
version "3.0.3" version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
simple-concat@^1.0.0: simple-concat@^1.0.0:
version "1.0.1" version "1.0.1"
@ -2165,9 +2168,9 @@ simple-concat@^1.0.0:
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3: simple-get@^3.0.3:
version "3.1.0" version "3.1.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
dependencies: dependencies:
decompress-response "^4.2.0" decompress-response "^4.2.0"
once "^1.3.1" once "^1.3.1"
@ -2217,19 +2220,20 @@ sprintf-js@~1.0.2:
string-width@^1.0.1: string-width@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
dependencies: dependencies:
code-point-at "^1.0.0" code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0" is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2": "string-width@^1.0.2 || 2 || 3 || 4":
version "2.1.1" version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies: dependencies:
is-fullwidth-code-point "^2.0.0" emoji-regex "^8.0.0"
strip-ansi "^4.0.0" is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string.prototype.trim@^1.2.5: string.prototype.trim@^1.2.5:
version "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: strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
dependencies: dependencies:
ansi-regex "^2.0.0" 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: strip-ansi@^6.0.1:
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 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: strip-json-comments@~2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 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: supports-color@^5.3.0:
version "5.5.0" version "5.5.0"
@ -2454,20 +2451,20 @@ tree-sitter-javascript@^0.19.0:
dependencies: dependencies:
nan "^2.12.1" nan "^2.12.1"
tree-sitter-nix@cstrahan/tree-sitter-nix: tree-sitter-nix@^0.0.2:
version "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: dependencies:
nan "^2.14.2" nan "^2.17.0"
tree-sitter "^0.19.0"
tree-sitter@^0.19.0: tree-sitter@^0.20.2:
version "0.19.0" version "0.20.2"
resolved "https://registry.yarnpkg.com/tree-sitter/-/tree-sitter-0.19.0.tgz#68c4cfa12b34752d69162b81ad233f3e6fc4a70d" resolved "https://registry.yarnpkg.com/tree-sitter/-/tree-sitter-0.20.2.tgz#d5227966635d5e27dabd6744b28618d5c43cea77"
integrity sha512-jw/BNCCRB9RCq/GFGU0VuhchGlIIlYRQFnjXgPKG3fBIo+c3ImuPITtAHJJ4XgTBNfeAQmt8XC4wShgBw8tgdg== integrity sha512-xyaEOl3zgsYWfZ9LfByPZBFfllsOoccm0Y2DY564iYuzmjg4vWd9nd0hcjh5qhq4uIG5LvSACTHcB5RPu9iuxQ==
dependencies: dependencies:
nan "^2.14.0" nan "^2.14.0"
prebuild-install "^5.0.0" prebuild-install "^6.0.1"
trim-newlines@^1.0.0: trim-newlines@^1.0.0:
version "1.0.0" version "1.0.0"
@ -2477,7 +2474,7 @@ trim-newlines@^1.0.0:
tunnel-agent@^0.6.0: tunnel-agent@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
dependencies: dependencies:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
@ -2513,7 +2510,7 @@ uri-js@^4.2.2:
util-deprecate@^1.0.1, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 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: v8-compile-cache@^2.0.3:
version "2.3.0" version "2.3.0"
@ -2549,11 +2546,6 @@ which-collection@^1.0.1:
is-weakmap "^2.0.1" is-weakmap "^2.0.1"
is-weakset "^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: which-typed-array@^1.1.2:
version "1.1.7" version "1.1.7"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" 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" isexe "^2.0.0"
wide-align@^1.1.0: wide-align@^1.1.0:
version "1.1.3" version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
dependencies: dependencies:
string-width "^1.0.2 || 2" string-width "^1.0.2 || 2 || 3 || 4"
word-wrap@^1.2.3: word-wrap@^1.2.3:
version "1.2.3" version "1.2.3"
@ -2588,7 +2580,7 @@ word-wrap@^1.2.3:
wrappy@1: wrappy@1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 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": "xtend@>=4.0.0 <4.1.0-0":
version "4.0.2" version "4.0.2"

Loading…
Cancel
Save