UNPKG

@nodesecure/js-x-ray

Version:
79 lines 2.55 kB
// Import Internal Dependencies import { getMemberExpressionIdentifier } from "./getMemberExpressionIdentifier.js"; import { isCallExpression, isStringLiteral, isNode, noop } from "../types.js"; export function* arrayExpressionToString(node, options = {}) { const { externalIdentifierLookup = noop, resolveCharCode = true } = options; if (!isNode(node) || node.type !== "ArrayExpression") { return; } for (const row of node.elements) { if (row === null) { continue; } switch (row.type) { case "Literal": { if (row.value === "") { continue; } if (resolveCharCode) { const value = Number(row.value); yield Number.isNaN(value) ? String(row.value) : String.fromCharCode(value); } else { yield String(row.value); } break; } case "Identifier": { const identifier = externalIdentifierLookup(row.name); if (identifier !== null) { yield identifier; } break; } case "CallExpression": { const value = joinArrayExpression(row, { externalIdentifierLookup }); if (value !== null) { yield value; } break; } } } } export function joinArrayExpression(node, options = {}) { if (!isCallExpression(node)) { return null; } if (node.arguments.length !== 1 || (node.callee.type !== "MemberExpression" || node.callee.object.type !== "ArrayExpression")) { return null; } let id = ""; for (const part of getMemberExpressionIdentifier(node.callee)) { id = id === "" ? part : `${id}.${part}`; } if (id !== "join" || !isStringLiteral(node.arguments[0])) { return null; } const separator = node.arguments[0].value; let result = ""; let first = true; for (const part of arrayExpressionToString(node.callee.object, { ...options, resolveCharCode: false })) { if (first) { result = part; first = false; } else { result += separator + part; } } return result; } //# sourceMappingURL=arrayExpression.js.map