You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
28 lines
892 B
JavaScript
28 lines
892 B
JavaScript
"use strict";
|
|
|
|
const types = require("@babel/types");
|
|
const splitFilter = require("split-filter");
|
|
|
|
module.exports = {
|
|
name: "literals",
|
|
visitors: {
|
|
NixIntegerLiteral: (node) => types.numericLiteral(parseInt(node.value)),
|
|
NixFloatLiteral: (node) => types.numericLiteral(parseFloat(node.value)),
|
|
NixStringLiteral: (node, { defer }) => {
|
|
if (node.parts.length === 1 && node.parts[0].type === "NixInterpolationLiteral") {
|
|
// Fast case; just a simple, non-interpolated string literal
|
|
return types.stringLiteral(node.parts[0].value);
|
|
} else {
|
|
return defer((node) => {
|
|
let [ literals, expressions ] = splitFilter(node.parts, (part) => part.type === "NixInterpolationLiteral");
|
|
|
|
return types.templateLiteral(
|
|
literals.map((node) => types.templateElement({ raw: node.value })),
|
|
expressions.map((node) => node.expression)
|
|
);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|