UNPKG

@maverick-js/compiler

Version:

Maverick toolchain including the analyzer and compiler.

315 lines (304 loc) 9.64 kB
import { isFunction, isObject } from './chunk-3M33KLBM.js'; import { createFromBuffer } from '@dprint/formatter'; import { getPath } from '@dprint/typescript'; import { readFileSync } from 'node:fs'; import kleur from 'kleur'; import { normalize } from 'pathe'; var buffer = readFileSync(getPath()); var formatter = createFromBuffer(buffer); function format(filename, contents) { return formatter.formatText(filename, contents); } function createImportDeclaration(defaultSpecifier, namedSpecifiers, moduleId) { let _default = defaultSpecifier ? `${defaultSpecifier}, ` : ""; let _named = namedSpecifiers.length > 0 ? `{ ${namedSpecifiers.join(", ")} }` : ""; return `import ${_default}${_named} from "${moduleId}"; `; } function escapeDoubleQuotes(value) { return value.replace(/"/g, '\\"'); } var escapeQuotes = (str) => str.replace(/^"+|"+$/g, "").replace(/^'+|'+$/g, ""); var normalizeLineBreaks = (str) => str.replace(/\\r/g, "\n"); function splitLineBreaks(str) { if (typeof str !== "string") return []; return normalizeLineBreaks(str).split("\n"); } function createFunctionCall(id, params = []) { return `${id}(${params.length > 0 ? params.filter((v) => v !== null).join(", ") : ""})`; } function selfInvokingFunction(block) { return `(() => { ${block} })()`; } function createStringLiteral(value) { return !value.startsWith('"') ? `"${value}"` : value; } var trimQuoteStartRE = /^('|"|`)/; var trimQuoteEndRE = /('|"|`)$/; function trimQuotes(text) { return text.replace(trimQuoteStartRE, "").replace(trimQuoteEndRE, ""); } var trailingSemicolon = /;\s*$/; function trimTrailingSemicolon(text) { return text.replace(trailingSemicolon, ""); } function trimWhitespace(text) { text = text.replace(/\r/g, ""); if (/\n/g.test(text)) { text = text.split("\n").map((t, i) => i ? t.replace(/^\s*/g, "") : t).filter((s2) => !/^\s*$/.test(s2)).join(" "); } return text.replace(/\s+/g, " "); } var Declarations = class { constructor() { this.all = /* @__PURE__ */ new Map(); this._count = {}; } get size() { return this.all.size; } create(id, value = "") { const newId = this._count[id] ? `${id}_${this._count[id] = this._count[id] + 1}` : id; if (!this._count[id]) this._count[id] = 1; this.all.set(newId, value); return newId; } update(id, value) { this.all.set(id, value); } has(id) { return !!this._count[id]; } delete(id) { this.all.delete(id); } serialize(pure = false) { if (this.all.size === 0) return ""; let values = []; for (const [id, value] of this.all) { values.push(`${id} = ${pure ? "/* #__PURE__ */ " : ""}${value}`); } return `const ${values.join(`, `)}; `; } }; function createObjectLiteral(props) { return `{ ${Object.keys(props).map((prop) => `'${prop}': ${props[prop]}`).join(", ")} }`; } // src/utils/num.ts function round(num, decimalPlaces = 2) { return Number(num.toFixed(decimalPlaces)); } // src/utils/ms.ts var s = 1e3; var m = s * 60; var h = m * 60; var d = h * 24; function ms(val) { const msAbs = Math.abs(val); if (msAbs >= d) { return Math.round(val / d) + "d"; } if (msAbs >= h) { return Math.round(val / h) + "h"; } if (msAbs >= m) { return Math.round(val / m) + "m"; } if (msAbs >= s) { return Math.round(val / s) + "s"; } return round(val, 2) + "ms"; } // src/utils/logger.ts var LogLevelColor = Object.freeze({ [0 /* Silent */]: kleur.bgWhite, [1 /* Error */]: kleur.bgRed, [2 /* Warn */]: kleur.bgYellow, [3 /* Info */]: kleur.bgCyan, [4 /* Verbose */]: kleur.bgMagenta }); var currentLogLevel = 3 /* Info */; function mapLogLevelStringToNumber(level) { switch (level) { case "silent": return 0 /* Silent */; case "error": return 1 /* Error */; case "warn": return 2 /* Warn */; case "info": return 3 /* Info */; case "verbose": return 4 /* Verbose */; default: return 3 /* Info */; } } function mapLogLevelToString(level) { switch (level) { case 1 /* Error */: return "error"; case 2 /* Warn */: return "warn"; case 3 /* Info */: return "info"; case 4 /* Verbose */: return "verbose"; case 0 /* Silent */: return "silent"; default: return "info"; } } var clearTerminal = () => { console.clear(); }; function setGlobalLogLevel(level) { currentLogLevel = level; } var log = (text, level = 3 /* Info */) => { if (currentLogLevel < level) return; if (isFunction(text)) { text = text(); } if (isObject(text)) { console.dir(text, { depth: 10 }); } else { const currentColor = LogLevelColor[level]; console.log( kleur.dim( `${formatPluginName("maverick")} ${currentColor( kleur.bold(kleur.black(` ${mapLogLevelToString(level).toUpperCase()} `)) )}` ), `${text} ` ); } }; var logTime = (message, startTime, level = 3 /* Info */) => { const totalTime = process.hrtime(startTime); const totalTimeText = kleur.green(ms(totalTime[0] * 1e3 + totalTime[1] / 1e6)); log(() => `${message} in ${totalTimeText}.`, level); }; function formatPluginName(name) { return `[${name.startsWith("maverick") ? kleur.dim(name) : kleur.yellow(name)}]`; } var logStackTrace = (message, stack, level = 1 /* Error */) => { log( ` ${kleur.bold("MESSAGE")} ${message} ${kleur.bold("STACK TRACE")} ${stack}`, level ); }; var printDiagnostic = (message, sourceFilePath, sourceText, startLineNumber, endLineNumber, level) => { log( printDiagnosticOutput(message, sourceFilePath, sourceText, startLineNumber, endLineNumber), level ); }; function printDiagnosticOutput(message, sourceFilePath, sourceText, startLineNumber, endLineNumber) { const isMultiLine = endLineNumber - startLineNumber > 0; const codeFrame = buildCodeFrame(sourceText, startLineNumber, endLineNumber); return [ ` ${kleur.bold("MESSAGE")}`, ` ${message}`, ` ${kleur.bold("CODE")} `, `${kleur.dim(sourceFilePath)} ${kleur.dim("L:")}${kleur.dim( isMultiLine ? `${startLineNumber}-${endLineNumber}` : startLineNumber )} `, prettifyCodeFrame(codeFrame) ].join("\n"); } var reportDiagnosticByNode = (message, node, level = 3 /* Info */) => { const sourceFile = node.getSourceFile(); const sourceFilePath = normalize(sourceFile.fileName); const sourceText = sourceFile.text; const posStart = sourceFile.getLineAndCharacterOfPosition(node.getStart()); const posEnd = sourceFile.getLineAndCharacterOfPosition(node.getEnd()); const startLineNumber = posStart.line + 1; const endLineNumber = posEnd.line + 1; { printDiagnostic(message, sourceFilePath, sourceText, startLineNumber, endLineNumber, level); } }; function prettifyCodeFrame(codeFrame) { const { firstLineNumber, linesBefore, relevantLines, linesAfter } = codeFrame; const printLines = []; const maxNoOfDigits = (firstLineNumber + codeFrame.totalLines).toString().length; const formatLineNumber = (lineNumber) => { const missingDigits = maxNoOfDigits - lineNumber.toString().length; return missingDigits > 0 ? `${" ".repeat(missingDigits)}${lineNumber}` : `${lineNumber}`; }; const printLine = (line, lineNumber, isRelevant = false) => (isRelevant ? kleur.white : kleur.dim)( `${isRelevant ? "> " : " "}${kleur.bold(formatLineNumber(lineNumber))} | ${line}` ); linesBefore.forEach((line, i) => { printLines.push(printLine(line, firstLineNumber + i)); }); relevantLines.forEach((line, i) => { printLines.push(printLine(line, firstLineNumber + linesBefore.length + i, true)); }); linesAfter.forEach((line, i) => { printLines.push( printLine(line, firstLineNumber + linesBefore.length + relevantLines.length + i) ); }); return printLines.join("\n"); } function buildCodeFrame(sourceText, startLineNumber, endLineNumber, frameSize = 5) { const startLineNumberMinusOne = startLineNumber - 1; const lines = splitLineBreaks(sourceText); const startAt = startLineNumberMinusOne - frameSize < 0 ? 0 : startLineNumberMinusOne - frameSize; const endAt = endLineNumber + frameSize > lines.length ? lines.length : endLineNumber + frameSize; const codeFrame = { firstLineNumber: startAt + 1, linesBefore: [], relevantLines: [], linesAfter: [], totalLines: 0 }; let lineCounter = 0; const MAX_LINES = 15; function buildLines(start, end) { if (lineCounter > MAX_LINES - 1) return []; const newLines = []; for (let i = start; i < end; i++) { if (lines[i] != null) { newLines.push(lines[i]); lineCounter += 1; } if (lineCounter > MAX_LINES - 1) { return newLines; } } return newLines; } codeFrame.linesBefore = buildLines(startAt, startLineNumberMinusOne); codeFrame.relevantLines = buildLines(startLineNumberMinusOne, endLineNumber); codeFrame.linesAfter = buildLines(endLineNumber, endAt + 1); const linesHidden = endAt - startAt - lineCounter; if (linesHidden > 0) { codeFrame.linesAfter.push( kleur.dim(`${linesHidden} ${linesHidden === 1 ? "line" : "lines"} hidden...`) ); } codeFrame.totalLines = lineCounter; return codeFrame; } export { Declarations, clearTerminal, createFunctionCall, createImportDeclaration, createObjectLiteral, createStringLiteral, escapeDoubleQuotes, escapeQuotes, format, formatPluginName, log, logStackTrace, logTime, mapLogLevelStringToNumber, normalizeLineBreaks, reportDiagnosticByNode, selfInvokingFunction, setGlobalLogLevel, trimQuotes, trimTrailingSemicolon, trimWhitespace };