"use strict"; const assert = require("assert"); const types = require("@babel/types"); const template = require("@babel/template").default; const templateExpression = require("./util/template-expression"); // FIXME: Auto-generate argument list based on exposed API surface? let tmplModule = template(` module.exports = function({ builtins, $memoize, $handleArgument, $assertUniqueKeys }) { return %%contents%%; }; `); let tmplIdentifierReference = templateExpression(`( %%name%%() )`); let trivial = { name: "trivial-transforms", visitors: { // Trivial transforms NixParenthesizedExpression: (node) => node.expression, Program: (_node, { setContext, defer }) => { setContext(null, "identifierType", "reference"); return defer((node) => { assert(node.body.length === 1); return tmplModule({ contents: node.body[0] }); }); }, NixIdentifier: (node, { getContext }) => { // FIXME: Mangle reserved keywords like `const` if (getContext("identifierType") === "define") { return types.identifier(node.name); } else { // reference return tmplIdentifierReference({ name: node.name }); } }, NixBinaryOperation: (_node, { defer }) => { return defer((node) => { // FIXME: Verify that all the 'operator' values match between Nix and JS! return types.binaryExpression(node.operator, node.left, node.right); }); } } }; module.exports = [ require("./desugar-inherits"), require("./desugar-attrsets"), require("./desugar-let-attribute-set"), require("./desugar-interpolation-expressions"), require("./mangle-identifiers"), require("./let-in"), require("./literals"), require("./functions"), require("./attribute-sets"), trivial, ];