mutorjs 1.5.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/cli.ts","../package.json","../src/core/mutor.server.ts","../src/utils/create-runtime.ts","../src/utils/construct-pointer.ts","../src/core/error.ts","../src/core/constants.ts","../src/utils/escape-fn.ts","../src/utils/to-absolute-path.ts","../src/utils/validate-computed-prop.ts","../src/utils/escape-raw-text.ts","../src/utils/get-line-and-column-nums.ts","../src/utils/get-line-snapshot.ts","../src/core/build.ts","../src/utils/get-token-type-words.ts","../src/core/generate-ast.ts","../src/core/parse.ts","../src/core/tokenize.ts","../src/core/compile.ts","../src/core/mutor.base.ts","../src/bin/cli-errors.ts"],"sourcesContent":["import {\r\n readFileSync,\r\n rmSync,\r\n type Stats,\r\n statSync,\r\n writeFileSync,\r\n} from \"node:fs\";\r\nimport { argv, exit } from \"node:process\";\r\nimport { version } from \"../../package.json\";\r\nimport Mutor from \"../core/mutor.server\";\r\nimport type {\r\n CleanupFn,\r\n CommandStruct,\r\n PartialMutorConfig,\r\n} from \"../types/types\";\r\nimport toAbsolutePath from \"../utils/to-absolute-path\";\r\nimport {\r\n ArgumentError,\r\n CliError,\r\n ExitCodes,\r\n FileReadError,\r\n FileWriteError,\r\n JsonParseError,\r\n} from \"./cli-errors\";\r\n\r\nconst COMMANDS = new Set([\"compile\", \"build\", \"render\"]);\r\nconst OPTIONS = new Set([\"--out\", \"--data\", \"--config\"]);\r\n\r\n// Kept in sync with package.json at build time via your bundler / tsconfig paths.\r\nconst VERSION = `Mutor.js v${version}`;\r\n\r\nconst USAGE = `\r\nUsage: mutor <command> <input> [options]\r\n\r\nCommands:\r\n compile <template> Compile a template file to its intermediate form\r\n build <dir> Render all templates in a directory using a data source\r\n render <template> Compile and immediately render a template\r\n\r\nOptions:\r\n --out <path> Output file or directory (defaults to stdout for compile/render)\r\n --data <path> JSON data file to use as render context (required for build/render)\r\n --config <path> JSON config file to pass to Mutor\r\n --version Print the version and exit\r\n --help Show this help message\r\n\r\nExit codes:\r\n 0 success\r\n 1 runtime error (I/O failure, render failure, etc.)\r\n 2 argument error (bad flags, missing or wrong-typed values)\r\n`.trim();\r\n\r\n/** Read a file, throwing a friendly FileReadError on failure. */\r\nexport function safeReadFile(filePath: string): string {\r\n try {\r\n return readFileSync(filePath, \"utf-8\");\r\n } catch (err) {\r\n throw new FileReadError(filePath, err);\r\n }\r\n}\r\n\r\n/** Write a file, throwing a friendly FileWriteError on failure. */\r\nexport function safeWriteFile(filePath: string, content: string): void {\r\n try {\r\n writeFileSync(filePath, content, \"utf-8\");\r\n } catch (err) {\r\n throw new FileWriteError(filePath, err);\r\n }\r\n}\r\n\r\n/** Parse JSON from a file, attributing parse errors to that file. */\r\nexport function safeParseJsonFile(filePath: string): unknown {\r\n const raw = safeReadFile(filePath);\r\n try {\r\n return JSON.parse(raw);\r\n } catch (err) {\r\n throw new JsonParseError(filePath, err);\r\n }\r\n}\r\n\r\n/** Assert a path points to an existing regular file (not a dir, socket, etc.). */\r\nfunction assertIsFile(filePath: string, flag: string): void {\r\n let stat: Stats;\r\n try {\r\n stat = statSync(filePath);\r\n } catch {\r\n throw new ArgumentError(`${flag} path '${filePath}' does not exist`);\r\n }\r\n if (!stat.isFile()) {\r\n throw new ArgumentError(`${flag} path '${filePath}' is not a file`);\r\n }\r\n}\r\n\r\n/** Assert a path points to an existing directory. */\r\nfunction assertIsDirectory(dirPath: string, flag: string): void {\r\n let stat: Stats;\r\n try {\r\n stat = statSync(dirPath);\r\n } catch {\r\n throw new ArgumentError(`${flag} path '${dirPath}' does not exist`);\r\n }\r\n if (!stat.isDirectory()) {\r\n throw new ArgumentError(`${flag} path '${dirPath}' is not a directory`);\r\n }\r\n}\r\n\r\n/** Assert a file has one of the allowed extensions. */\r\nfunction assertExtension(\r\n filePath: string,\r\n flag: string,\r\n ...extensions: string[]\r\n): void {\r\n const matches = extensions.some((ext) => filePath.endsWith(ext));\r\n if (!matches) {\r\n throw new ArgumentError(\r\n `${flag} expects a file with extension ${extensions.join(\" or \")} — got '${filePath}'`,\r\n );\r\n }\r\n}\r\n\r\nexport function parseArgs(rawArgs: string[]): CommandStruct {\r\n if (rawArgs.length === 0 || rawArgs[0] === \"--help\") {\r\n console.log(USAGE);\r\n exit(ExitCodes.Success);\r\n }\r\n\r\n if (rawArgs[0] === \"--version\") {\r\n console.log(VERSION);\r\n exit(ExitCodes.Success);\r\n }\r\n\r\n const command = rawArgs[0];\r\n\r\n if (!COMMANDS.has(command)) {\r\n throw new ArgumentError(`unknown command '${command}'\\n\\n${USAGE}`);\r\n }\r\n\r\n const commandData = rawArgs[1];\r\n\r\n if (!commandData || commandData.startsWith(\"--\")) {\r\n throw new ArgumentError(\r\n `command '${command}' requires an input path as its first argument\\n\\n${USAGE}`,\r\n );\r\n }\r\n\r\n const struct: CommandStruct = { command, commandData };\r\n\r\n for (let i = 2; i < rawArgs.length; i++) {\r\n const flag = rawArgs[i];\r\n\r\n if (!OPTIONS.has(flag)) {\r\n throw new ArgumentError(`unknown option '${flag}'\\n\\n${USAGE}`);\r\n }\r\n\r\n const value = rawArgs[i + 1];\r\n\r\n if (!value || value.startsWith(\"--\")) {\r\n throw new ArgumentError(`option '${flag}' requires a value`);\r\n }\r\n\r\n struct[flag as keyof CommandStruct] = value;\r\n i++; // skip the consumed value token\r\n }\r\n\r\n return struct;\r\n}\r\n\r\nexport function handleCompileCommand(mutor: Mutor, args: CommandStruct): void {\r\n const inputPath = toAbsolutePath(args.commandData);\r\n assertIsFile(inputPath, \"<input>\");\r\n\r\n const template = safeReadFile(inputPath);\r\n const compiled = mutor.compile(template);\r\n const output = compiled.toString();\r\n\r\n if (args[\"--out\"]) {\r\n const outPath = toAbsolutePath(args[\"--out\"]);\r\n\r\n // Register cleanup so a SIGINT mid-write doesn't leave a truncated file.\r\n registerCleanup(() => {\r\n try {\r\n rmSync(outPath, { force: true });\r\n } catch {\r\n /* best-effort */\r\n }\r\n });\r\n\r\n safeWriteFile(outPath, output);\r\n console.log(`Compiled → ${args[\"--out\"]}`);\r\n } else {\r\n console.log(output);\r\n }\r\n}\r\n\r\nexport async function handleBuildCommand(\r\n mutor: Mutor,\r\n args: CommandStruct,\r\n): Promise<void> {\r\n if (!args[\"--data\"]) {\r\n throw new ArgumentError(\"'build' requires a data source via --data\");\r\n }\r\n if (!args[\"--out\"]) {\r\n throw new ArgumentError(\"'build' requires an output directory via --out\");\r\n }\r\n\r\n const inputPath = toAbsolutePath(args.commandData);\r\n const dataPath = toAbsolutePath(args[\"--data\"]);\r\n const outPath = toAbsolutePath(args[\"--out\"]);\r\n\r\n assertIsDirectory(inputPath, \"<input>\");\r\n assertIsFile(dataPath, \"--data\");\r\n assertExtension(dataPath, \"--data\", \".json\");\r\n\r\n const context = safeParseJsonFile(dataPath);\r\n\r\n // Track whether we've written anything so SIGINT cleanup knows what to do.\r\n let buildStarted = false;\r\n\r\n registerCleanup(() => {\r\n if (buildStarted) {\r\n console.warn(\"\\nBuild interrupted — removing partial output...\");\r\n try {\r\n rmSync(outPath, { recursive: true, force: true });\r\n } catch {}\r\n }\r\n });\r\n\r\n buildStarted = true;\r\n await mutor.buildDir(inputPath, outPath, context);\r\n buildStarted = false; // Succeeded — don't clean up on exit.\r\n\r\n console.log(`Built → ${args[\"--out\"]}`);\r\n}\r\n\r\nexport async function handleRenderCommand(\r\n mutor: Mutor,\r\n args: CommandStruct,\r\n): Promise<void> {\r\n if (!args[\"--data\"]) {\r\n throw new ArgumentError(\"'render' requires a data source via --data\");\r\n }\r\n\r\n const inputPath = toAbsolutePath(args.commandData);\r\n const dataPath = toAbsolutePath(args[\"--data\"]);\r\n\r\n assertIsFile(inputPath, \"<input>\");\r\n assertIsFile(dataPath, \"--data\");\r\n assertExtension(dataPath, \"--data\", \".json\");\r\n\r\n const context = safeParseJsonFile(dataPath);\r\n const template = safeReadFile(inputPath);\r\n const output = mutor.render(template, context);\r\n\r\n if (args[\"--out\"]) {\r\n const outPath = toAbsolutePath(args[\"--out\"]);\r\n\r\n registerCleanup(() => {\r\n try {\r\n rmSync(outPath, { force: true });\r\n } catch {}\r\n });\r\n\r\n safeWriteFile(outPath, output);\r\n console.log(`Rendered → ${args[\"--out\"]}`);\r\n } else {\r\n console.log(output);\r\n }\r\n}\r\n\r\nlet cleanupFn: CleanupFn | null = null;\r\n\r\n/** Register a one-shot cleanup to run on SIGINT / SIGTERM. */\r\nfunction registerCleanup(fn: CleanupFn): void {\r\n cleanupFn = fn;\r\n}\r\n\r\nfunction handleSignal(signal: string): void {\r\n console.warn(`\\nReceived ${signal}.`);\r\n cleanupFn?.();\r\n exit(ExitCodes.RuntimeError);\r\n}\r\n\r\nprocess.on(\"SIGINT\", () => handleSignal(\"SIGINT\"));\r\nprocess.on(\"SIGTERM\", () => handleSignal(\"SIGTERM\"));\r\n\r\nasync function main(): Promise<void> {\r\n const args = parseArgs(argv.slice(2));\r\n\r\n const mutor = new Mutor();\r\n\r\n if (args[\"--config\"]) {\r\n const configPath = toAbsolutePath(args[\"--config\"]);\r\n assertIsFile(configPath, \"--config\");\r\n assertExtension(configPath, \"--config\", \".json\");\r\n\r\n const config = safeParseJsonFile(configPath);\r\n mutor.addConfig(config as PartialMutorConfig);\r\n }\r\n\r\n switch (args.command) {\r\n case \"compile\":\r\n handleCompileCommand(mutor, args);\r\n break;\r\n case \"build\":\r\n await handleBuildCommand(mutor, args);\r\n break;\r\n case \"render\":\r\n await handleRenderCommand(mutor, args);\r\n break;\r\n }\r\n}\r\n\r\nif (process.env.NODE_ENV !== \"test\") {\r\n main().catch((err: unknown) => {\r\n if (err instanceof CliError) {\r\n console.error(`error: ${err.message}`);\r\n exit(err.exitCode);\r\n }\r\n\r\n console.error(\"unexpected error:\", err);\r\n exit(ExitCodes.RuntimeError);\r\n });\r\n}\r\n","{\n \"name\": \"mutorjs\",\n \"version\": \"1.5.9\",\n \"description\": \"A high-performance engine for secure templating.\",\n \"homepage\": \"https://github.com/allAboutJS/Mutor.js#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/allAboutJS/Mutor.js/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/allAboutJS/Mutor.js.git\"\n },\n \"license\": \"ISC\",\n \"author\": \"Onah Victor\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"browser\": \"./dist/mutor.global.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.js\",\n \"require\": \"./dist/server.cjs\",\n \"default\": \"./dist/server.js\"\n }\n },\n \"bin\": {\n \"mutor\": \"./dist/cli.cjs\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepare\": \"husky && npm run build\",\n \"benchmarks\": \"npm run build && tsx src/__tests__/benchmarks.ts\",\n \"test\": \"jest\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.4.16\",\n \"@types/benchmark\": \"^2.1.5\",\n \"@types/ejs\": \"^3.1.5\",\n \"@types/handlebars\": \"^4.1.0\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^25.5.0\",\n \"@types/nunjucks\": \"^3.2.6\",\n \"benchmark\": \"^2.1.4\",\n \"ejs\": \"^5.0.1\",\n \"eta\": \"^4.6.0\",\n \"handlebars\": \"^4.7.8\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.3.0\",\n \"lint-staged\": \"^16.2.7\",\n \"nunjucks\": \"^3.2.4\",\n \"ts-jest\": \"^29.4.9\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.6\"\n },\n \"lint-staged\": {\n \"*.{js,ts,json}\": [\n \"biome check --write --no-errors-on-unmatched\"\n ]\n },\n \"dependencies\": {},\n \"keywords\": [\n \"Template\",\n \"Engine\",\n \"AST\",\n \"Parser\"\n ],\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","import { readFileSync } from \"node:fs\";\nimport {\n copyFile,\n mkdir,\n readdir,\n readFile,\n writeFile,\n} from \"node:fs/promises\";\nimport { extname, join, resolve } from \"node:path\";\nimport type { PartialMutorConfig, RuntimeFrame } from \"../types/types\";\nimport createRuntimeFrame from \"../utils/create-runtime\";\nimport escapeFn from \"../utils/escape-fn\";\nimport toAbsolutePath from \"../utils/to-absolute-path\";\nimport validateComputedProp from \"../utils/validate-computed-prop\";\nimport { MutorError } from \"./error\";\nimport MutorBase from \"./mutor.base\";\n\nexport default class MutorServer extends MutorBase {\n constructor(config: PartialMutorConfig = {}) {\n super(config);\n }\n\n private __resolvePath(path: string, renderedPath?: string) {\n const isAlias = path.startsWith(\"@/\");\n const root = this.__config.rootDir\n ? toAbsolutePath(this.__config.rootDir)\n : process.cwd();\n\n let resolvedPath: string;\n\n if (isAlias) {\n resolvedPath = join(root, path.replace(/^@\\//, \"./\"));\n } else if (renderedPath) {\n resolvedPath = toAbsolutePath(renderedPath, path);\n } else {\n resolvedPath = resolve(process.cwd(), path);\n }\n\n return resolvedPath;\n }\n\n private __setupIncludeForRuntime(runtime: RuntimeFrame) {\n this.__namespaces.Mutor.include = (path: string, context: any) => {\n const resolvedPath = this.__resolvePath(path, runtime.renderedPath);\n\n if (runtime.includeStack.has(resolvedPath)) {\n throw new MutorError(\n `Circular include detected.\\n${Array.from(runtime.includeStack).join(\"\\n\")}\\n${resolvedPath}`,\n );\n }\n\n const previousPath = runtime.renderedPath;\n runtime.includeStack.add(resolvedPath);\n runtime.renderedPath = resolvedPath;\n\n try {\n return this.__renderFile(\n resolvedPath,\n context ?? runtime.context,\n runtime,\n );\n } catch (err) {\n return this.__handleError(err, previousPath, path, resolvedPath);\n } finally {\n runtime.includeStack.delete(resolvedPath);\n runtime.renderedPath = previousPath;\n }\n };\n }\n\n render(template: string, context: any): string {\n const runtime = createRuntimeFrame(context, \"anonymous\");\n this.__setupIncludeForRuntime(runtime);\n return this.__renderWithRuntime(template, runtime);\n }\n\n renderAsync(template: string, context: any): Promise<string> {\n return new Promise((resolve) => {\n resolve(this.render(template, context));\n });\n }\n\n private __renderFile(path: string, context: any, runtime: RuntimeFrame) {\n this.__setupIncludeForRuntime(runtime);\n\n const absolutePath = this.__resolvePath(path);\n let compiled: Function;\n\n // Save previous state for nested renders\n const previousContext = runtime.context;\n const previousPath = runtime.renderedPath;\n\n // Update runtime for this render\n runtime.context = context ?? previousContext;\n runtime.renderedPath = absolutePath;\n\n try {\n if (\n this.__config.cache.active &&\n this.__compiledTemplatesMap.has(absolutePath)\n ) {\n const entry = this.__compiledTemplatesMap.get(absolutePath)!;\n\n compiled = entry.fn;\n\n // Move to the front of the cache\n this.__compiledTemplatesMap.delete(absolutePath);\n this.__compiledTemplatesMap.set(absolutePath, entry);\n } else {\n const template = readFileSync(absolutePath, \"utf-8\");\n compiled = this.__compile(template, runtime);\n\n if (this.__config.cache.active) {\n const templateSize = template.length * 2 + 500;\n\n if (this.__cacheSize + templateSize > this.__config.cache.maxSize) {\n if (this.__createEntrySpaceForTemplate(templateSize)) {\n this.__compiledTemplatesMap.set(absolutePath, {\n fn: compiled,\n size: templateSize,\n });\n this.__cacheSize += templateSize;\n }\n } else {\n this.__compiledTemplatesMap.set(absolutePath, {\n fn: compiled,\n size: templateSize,\n });\n this.__cacheSize += templateSize;\n }\n }\n }\n\n const result = compiled(\n runtime.context,\n this.__createNamespacesWithRuntime(runtime),\n this.__config.allowedProps,\n this.__config.forbiddenProps,\n escapeFn,\n validateComputedProp,\n );\n\n return result;\n } finally {\n // Restore previous state\n runtime.context = previousContext;\n runtime.renderedPath = previousPath;\n }\n }\n\n renderFile(path: string, context: any): string {\n return this.__renderFile(path, context, createRuntimeFrame(null, path));\n }\n\n renderFileAsync(path: string, context: any): Promise<string> {\n return new Promise((resolve) => {\n resolve(this.renderFile(path, context));\n });\n }\n\n async buildDir(src: string, destination: string, context: any) {\n const absoluteDestinationPath = toAbsolutePath(destination);\n const absoluteSrcPath = toAbsolutePath(src);\n\n await mkdir(absoluteDestinationPath, { recursive: true });\n\n const entries = await readdir(absoluteSrcPath, { withFileTypes: true });\n await Promise.all(\n entries.map(async (entry) => {\n const srcPath = join(absoluteSrcPath, entry.name);\n const destinationPath = join(absoluteDestinationPath, entry.name);\n\n if (this.__config.build.exclude.has(entry.name)) {\n return;\n }\n\n if (entry.isDirectory()) {\n return this.buildDir(srcPath, destinationPath, context);\n }\n\n const extension = extname(srcPath);\n\n if (this.__config.build.include.has(extension)) {\n const rendered = this.renderFile(srcPath, context);\n await writeFile(destinationPath, rendered, \"utf-8\");\n } else {\n return await copyFile(srcPath, destinationPath);\n }\n }),\n );\n }\n\n async compileDir(src: string) {\n const absolutePath = toAbsolutePath(src);\n const entries = await readdir(absolutePath, { withFileTypes: true });\n\n await Promise.all(\n entries.map(async (entry) => {\n const absoluteSrcPath = join(absolutePath, entry.name);\n\n if (this.__config.build.exclude.has(entry.name)) {\n return;\n }\n\n if (entry.isDirectory()) {\n return this.compileDir(absoluteSrcPath);\n }\n\n const extension = extname(absoluteSrcPath);\n\n if (this.__config.build.include.has(extension)) {\n const template = await readFile(absoluteSrcPath, \"utf-8\");\n this.__register(absoluteSrcPath, template);\n }\n }),\n );\n }\n}\n","import type { RuntimeFrame } from \"../types/types\";\r\n\r\nexport default function createRuntimeFrame(\r\n context: any,\r\n renderedPath: string = \"\",\r\n): RuntimeFrame {\r\n return {\r\n context,\r\n renderedPath,\r\n includeStack: new Set([renderedPath && renderedPath]),\r\n };\r\n}\r\n","/**\r\n * Creates a visual text-based pointer `^`.\r\n * @param pos The position in the text to be pointed at.\r\n * @param offset The offset to the left to compensate for line numbering.\r\n * @returns\r\n */\r\nexport default function constructPointer(pos: number, offset: number) {\r\n // pos is the index in the text, offset is the width of \"Line | \"\r\n return `${\" \".repeat(pos + offset)}^`;\r\n}\r\n","import constructPointer from \"../utils/construct-pointer\";\r\n\r\nexport class MutorError extends Error {\r\n public name = \"MutorError\";\r\n constructor(message: string) {\r\n super(message);\r\n Object.setPrototypeOf(this, MutorError.prototype);\r\n }\r\n}\r\n\r\nexport class MutorCompilerError extends MutorError {\r\n public name = \"MutorCompilerError\";\r\n\r\n constructor(\r\n message: string,\r\n line: number,\r\n lineText: string,\r\n column: number, // 0-indexed column from snapshot\r\n file: string,\r\n ) {\r\n // Dynamic gutter width for alignment\r\n const gutterWidth = line.toString().length + 2;\r\n let report = `${message}\\n\\n`;\r\n\r\n report += `at ${file}:${line}:${column + 1}\\n`;\r\n\r\n // Line snippet with gutter\r\n if (line > 1) {\r\n report += `${(line - 1).toString().padStart(gutterWidth - 2)} | ...\\n`;\r\n }\r\n\r\n report += `${line} | ${lineText}\\n`;\r\n // Visual Pointer\r\n report += constructPointer(column, gutterWidth + 1);\r\n\r\n super(report);\r\n Object.setPrototypeOf(this, MutorCompilerError.prototype);\r\n }\r\n}\r\n","import type { MutorConfig } from \"../types/types\";\nimport { MutorError } from \"./error\";\n\nexport const keywords = new Set([\n \"for\",\n \"if\",\n \"else\",\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"end\",\n \"in\",\n \"of\",\n \"switch\",\n \"case\",\n \"default\",\n \"break\",\n \"continue\",\n]);\n\nexport const operators = new Set([\n \"::\",\n \"||\",\n \"??\",\n \"&&\",\n \"**\",\n \"^\",\n \"|\",\n \"&\",\n \"!\",\n \"-\",\n \"%\",\n \"+\",\n \"*\",\n \"/\",\n \">\",\n \"<\",\n \">=\",\n \"<=\",\n \"==\",\n \"!=\",\n \">>\",\n \"<<\",\n \".\",\n \"?.\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \",\",\n \":\",\n \"?\",\n]);\n\nexport const logicalOperators = new Set([\"&&\", \"||\", \"??\"]);\n\nexport const equalityOperators = new Set([\"==\", \"!=\"]);\n\nexport const comparisonOperators = new Set([\">\", \"<\", \">=\", \"<=\"]);\n\nexport const bitwiseOperators = new Set([\">>\", \"<<\", \"^\", \"|\", \"&\"]);\n\nexport const additiveOperators = new Set([\"+\", \"-\"]);\n\nexport const multiplicativeOperators = new Set([\"*\", \"/\", \"%\"]);\n\nexport const propertyAccessOperators = new Set([\".\", \"?.\", \"[\", \"::\"]);\n\nexport const unaryOperators = new Set([\"-\", \"+\", \"!\"]);\n\nexport const bitwiseOrOperators = new Set([\"|\"]);\n\nexport const bitwiseXorOperators = new Set([\"^\"]);\n\nexport const bitwiseAndOperators = new Set([\"&\"]);\n\nexport const exponentiationOperators = new Set([\"**\"]);\n\nexport const ESCAPE_MAP: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n};\n\nexport const defaultConfig: MutorConfig = {\n build: {\n include: new Set([\".html\", \".txt\"]),\n exclude: new Set([\"node_modules\", \".git\"]),\n },\n autoEscape: true,\n allowedProps: new Set(),\n forbiddenProps: new Set([\n \"__proto__\",\n \"constructor\",\n \"prototype\",\n \"__defineGetter__\",\n \"__defineSetter__\",\n \"__lookupGetter__\",\n \"__lookupSetter__\",\n \"caller\",\n \"callee\",\n \"arguments\",\n ]),\n allowFnCalls: false,\n delimiters: {\n closingTag: \"}}\",\n openingTag: \"{{\",\n openingTagEscape: \"\\\\\",\n whitespaceTrim: \"~\",\n commentTag: \"#\",\n },\n keepOpeningTagEscapeDelimiter: false,\n onIncludeFail: \"throw\",\n cache: {\n active: true,\n maxSize: 50 * 1024 * 1024, // 50MB\n },\n};\n\nexport const namespaces = {\n JSON: {\n stringify(value: any, space?: number) {\n return JSON.stringify(value, null, space);\n },\n\n parse(str: string) {\n return JSON.parse(str);\n },\n },\n\n Object: {\n keys(obj: object) {\n return Object.keys(obj);\n },\n\n values(obj: object) {\n return Object.values(obj);\n },\n\n entries(obj: object) {\n return Object.entries(obj);\n },\n\n hasOwn(obj: object, key: any) {\n return Object.hasOwn(obj, key);\n },\n\n fromEntries(entries: Iterable<readonly [PropertyKey, any]>) {\n return Object.fromEntries(entries);\n },\n\n pick(obj: Record<string, any>, keys: string[]) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::pick expects an object\");\n }\n\n if (!Array.isArray(keys)) {\n throw new MutorError(\"Object::pick expects an array of keys\");\n }\n\n const result: Record<string, any> = {};\n\n for (const key of keys) {\n if (Object.hasOwn(obj, key)) {\n result[key] = obj[key];\n }\n }\n\n return result;\n },\n\n omit(obj: Record<string, any>, keys: string[]) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::omit expects an object\");\n }\n\n if (!Array.isArray(keys)) {\n throw new MutorError(\"Object::omit expects an array of keys\");\n }\n\n const result = { ...obj };\n\n for (const key of keys) {\n delete result[key];\n }\n\n return result;\n },\n },\n\n Array: {\n isArray(value: any) {\n return Array.isArray(value);\n },\n\n from(value: any) {\n return Array.from(value);\n },\n\n of(...args: any[]) {\n return Array.of(...args);\n },\n\n unique(arr: any[]) {\n if (!Array.isArray(arr)) {\n throw new MutorError(\"Array::unique expects an array\");\n }\n\n return [...new Set(arr)];\n },\n\n compact(arr: any[]) {\n if (!Array.isArray(arr)) {\n throw new MutorError(\"Array::compact expects an array\");\n }\n\n return arr.filter(Boolean);\n },\n\n chunk(arr: any[], size: number) {\n if (!Array.isArray(arr)) {\n throw new MutorError(\"Array::chunk expects an array\");\n }\n\n if (!Number.isInteger(size) || size <= 0) {\n throw new MutorError(\"Array::chunk expects a positive integer size\");\n }\n\n const result = [];\n\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n\n return result;\n },\n\n range(start: number, end: number, step = 1) {\n if (\n !Number.isFinite(start) ||\n !Number.isFinite(end) ||\n !Number.isFinite(step)\n ) {\n throw new MutorError(\"Array::range expects finite numbers\");\n }\n if (step === 0) {\n throw new MutorError(\"Array::range step cannot be 0\");\n }\n\n // Validate directionality to prevent infinite loops\n if ((start <= end && step < 0) || (start > end && step > 0)) {\n throw new MutorError(\n \"Invalid step direction: step must match range direction\",\n );\n }\n\n const result = [];\n for (let i = start; start <= end ? i <= end : i >= end; i += step) {\n result.push(i);\n }\n\n return result;\n },\n },\n\n Number: {\n isFinite(value: number) {\n return Number.isFinite(value);\n },\n\n isNaN(value: any) {\n return Number.isNaN(value);\n },\n\n isInteger(value: any) {\n return Number.isInteger(value);\n },\n\n parseInt(value: string, radix = 10) {\n return Number.parseInt(value, radix);\n },\n\n parseFloat(value: string) {\n return Number.parseFloat(value);\n },\n\n clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n },\n\n toFixed(value: number, digits = 0) {\n return value.toFixed(digits);\n },\n\n random(min = 0, max = 1) {\n return Math.random() * (max - min) + min;\n },\n },\n\n String: {\n fromCharCode(...args: number[]) {\n return String.fromCharCode(...args);\n },\n\n capitalize(value: string) {\n if (typeof value !== \"string\") {\n throw new MutorError(\"String::capitalize expects a string\");\n }\n\n if (!value.length) {\n return value;\n }\n\n return value[0].toUpperCase() + value.slice(1);\n },\n },\n\n Math: {\n abs(x: number) {\n return Math.abs(x);\n },\n\n floor(x: number) {\n return Math.floor(x);\n },\n\n ceil(x: number) {\n return Math.ceil(x);\n },\n\n round(x: number) {\n return Math.round(x);\n },\n\n trunc(x: number) {\n return Math.trunc(x);\n },\n\n sign(x: number) {\n return Math.sign(x);\n },\n\n sqrt(x: number) {\n return Math.sqrt(x);\n },\n\n pow(base: number, exponent: number) {\n return base ** exponent;\n },\n\n max(...args: number[]) {\n return Math.max(...args);\n },\n\n min(...args: number[]) {\n return Math.min(...args);\n },\n\n random() {\n return Math.random();\n },\n\n PI: Math.PI,\n },\n\n Date: {\n now() {\n return Date.now();\n },\n\n parse(str: string) {\n return Date.parse(str);\n },\n\n new(date?: string | number) {\n if (date === undefined) {\n return new Date();\n }\n\n return new Date(date);\n },\n\n iso(date?: string | number | Date) {\n const d = new Date(date ?? Date.now());\n return d.toISOString();\n },\n\n timestamp(date?: string | number | Date) {\n return new Date(date ?? Date.now()).getTime();\n },\n },\n\n Boolean: {\n valueOf(value: any) {\n return Boolean(value);\n },\n },\n\n URL: {\n encode(value: string) {\n return encodeURIComponent(value);\n },\n\n decode(value: string) {\n return decodeURIComponent(value);\n },\n },\n};\n\nexport const AsyncFunction = (async () => {})\n .constructor as FunctionConstructor;\n","import { ESCAPE_MAP } from \"../core/constants\";\r\n\r\n/**\r\n * Escapes HTML special characters in a string.\r\n * @param e The value to escape.\r\n * @returns The escaped string or the original value if not a string.\r\n */\r\nexport default function escapeFn(e: unknown): unknown {\r\n if (typeof e !== \"string\") return e;\r\n return /[&<>\"']/.test(e)\r\n ? e.replace(/[&<>\"']/g, (char) => ESCAPE_MAP[char])\r\n : e;\r\n}\r\n","import { dirname, isAbsolute, resolve } from \"node:path\";\r\n\r\nexport default function toAbsolutePath(\r\n basePath: string,\r\n ...relativePaths: string[]\r\n) {\r\n const absoluteBase = isAbsolute(basePath)\r\n ? basePath\r\n : resolve(process.cwd(), basePath);\r\n\r\n if (relativePaths.length) {\r\n const baseDir = dirname(absoluteBase);\r\n return resolve(baseDir, ...relativePaths);\r\n }\r\n\r\n return absoluteBase;\r\n}\r\n","import { MutorError } from \"../core/error\";\n\nexport default function validateComputedProp(\n value: unknown,\n allowedProps: Set<string | number>,\n forbiddenProps: Set<string | number>,\n): string | number {\n if (typeof value !== \"string\" && typeof value !== \"number\") {\n throw new MutorError(\"Computed property keys must be strings or numbers.\");\n }\n\n if (forbiddenProps.has(value) && !allowedProps.has(value)) {\n throw new MutorError(\n `Forbidden property access.\\nAccess to this computed property '${value}' is forbidden.`,\n );\n }\n\n return value;\n}\n","export default function escapeRawText(text: string) {\r\n return text.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\r\n}\r\n","/**\r\n * Counts the number of lines that comes before a given index, effectively returning the line and column numbers of the character at that index.\r\n * @param str The source string.\r\n * @param idx The index to find its line number.\r\n */\r\nexport default function getLineAndColumnNumbers(str: string, idx: number) {\r\n const lines = str.slice(0, idx).split(\"\\n\");\r\n const line = lines.length;\r\n // The index where the current line starts\r\n const lineIndex = str.lastIndexOf(\"\\n\", idx - 1) + 1;\r\n\r\n return [line, lineIndex];\r\n}\r\n","/**\r\n * Extracts the snapshot of a line from a given text.\r\n * @param str The source string.\r\n * @param lineIdx The index of the newline character to snap.\r\n */\r\nexport default function getLineSnapshot(str: string, lineIdx: number) {\r\n const nextNewlineIdx = str.indexOf(\"\\n\", lineIdx);\r\n const line = str\r\n .slice(lineIdx, nextNewlineIdx === -1 ? undefined : nextNewlineIdx)\r\n .replaceAll(\"\\t\", \" \");\r\n\r\n return line;\r\n}\r\n","import { ExprType, LoopType } from \"../types/enums\";\nimport type {\n BuildContext,\n BuildState,\n CallExpr,\n CaseExpr,\n ElseIfExpr,\n Expr,\n ForExpr,\n IdentExpr,\n IfExpr,\n NamespaceExpr,\n PropAccessExpr,\n SwitchExpr,\n} from \"../types/types\";\nimport escapeRawText from \"../utils/escape-raw-text\";\nimport { MutorError } from \"./error\";\n\nconst BACKTICK_REGEX = /^`|`$/gm;\n\nfunction prefixWithCtx(state: BuildState, expr: IdentExpr): string {\n if (\n state.forbiddenProps.has(expr.value) &&\n !state.allowedProps.has(expr.value)\n ) {\n throw { message: `Property \"${expr.value}\" is forbidden.`, pos: expr.pos };\n }\n\n return state.scope.includes(expr.value) ? expr.value : `ctx.${expr.value}`;\n}\n\nfunction buildNamespace(state: BuildState, expr: NamespaceExpr): string {\n const leftValue = (expr.left as IdentExpr).value;\n const rightValue = (expr.right as IdentExpr).value;\n\n if (\n (state.forbiddenProps.has(leftValue) &&\n !state.allowedProps.has(leftValue)) ||\n (state.forbiddenProps.has(rightValue) &&\n !state.allowedProps.has(rightValue))\n ) {\n throw { message: \"Forbidden namespace access.\", pos: expr.pos };\n }\n\n return `namespaces.${leftValue}.${rightValue}`;\n}\n\nfunction buildPropAccess(state: BuildState, expr: PropAccessExpr): string {\n const left = buildExpr(state, expr.left);\n const optionalChain = expr.optional ? \"?.\" : \"\";\n\n if (expr.bracketNotation) {\n const right = buildExpr(state, expr.right);\n\n if (\n expr.right.type === ExprType.STRING &&\n state.forbiddenProps.has(right.replaceAll(BACKTICK_REGEX, \"\")) &&\n !state.allowedProps.has(right.replaceAll(BACKTICK_REGEX, \"\"))\n ) {\n throw {\n message: \"Forbidden property access.\",\n pos: expr.right.pos,\n };\n }\n\n return expr.right.type === ExprType.STRING ||\n expr.right.type === ExprType.NUMBER\n ? `${left}${optionalChain}[${right}]`\n : `${left}${optionalChain}[validateComputedProps(${right}, allowedProps, forbiddenProps)]`;\n }\n\n const propName = (expr.right as IdentExpr).value;\n\n if (state.forbiddenProps.has(propName) && !state.allowedProps.has(propName)) {\n throw { message: \"Forbidden property access.\", pos: expr.right.pos };\n }\n\n return `${left}${optionalChain || \".\"}${propName}`;\n}\n\nfunction buildCall(state: BuildState, expr: CallExpr): string {\n const func = buildExpr(state, expr.expr);\n const optionalChain = expr.optional ? \"?.\" : \"\";\n const args = (expr.args as Expr[])\n .map((arg: Expr) => buildExpr(state, arg))\n .join(\", \");\n\n return `${func}${optionalChain}(${args})`;\n}\n\nfunction buildForLoop(state: BuildState, expr: ForExpr): string {\n const { iterable, loopType, variable, secondaryVariable } = expr;\n const loopOperator = loopType === LoopType.IN ? \"in\" : \"of\";\n const iterableValue = build(iterable, state.context);\n\n if (loopOperator === \"of\") {\n return `for(let $__i=0,$__iterable=${iterableValue};$__i<$__iterable.length;$__i++){const ${variable}=$__iterable[$__i];${secondaryVariable ? `const ${secondaryVariable}=$__i;` : \"\"}`;\n }\n\n return secondaryVariable\n ? `for(const [${variable}, ${secondaryVariable}] of Object.entries(${iterableValue})){`\n : `for(const ${variable} in ${iterableValue}){`;\n}\n\nfunction buildIfBlock(state: BuildState, expr: IfExpr): string {\n const { condition } = expr;\n return `if(${build(condition, state.context)}){`;\n}\n\nfunction buildElseIfBlock(state: BuildState, expr: ElseIfExpr): string {\n const { condition } = expr;\n return `}else if(${build(condition, state.context)}){`;\n}\n\nfunction buildSwitchBlock(state: BuildState, expr: SwitchExpr): string {\n return `switch(${build(expr.condition, state.context)}){`;\n}\n\nfunction buildCaseBlock(state: BuildState, expr: CaseExpr): string {\n return `case ${build(expr.condition, state.context)}:`;\n}\n\nfunction buildExpr(state: BuildState, expr: Expr): string {\n const { type } = expr;\n\n if (type === ExprType.NUMBER) return expr.value;\n if (type === ExprType.NULL) return \"null\";\n if (type === ExprType.UNDEFINED) return \"undefined\";\n if (type === ExprType.BOOLEAN) return (expr as any).true ? \"true\" : \"false\";\n\n switch (type) {\n case ExprType.END:\n return \"}\";\n\n case ExprType.STRING:\n return `\\`${/[$`\\\\]/.test(expr.value) ? escapeRawText(expr.value) : expr.value}\\``;\n\n case ExprType.IDENT:\n return prefixWithCtx(state, expr);\n\n case ExprType.GROUP:\n return `(${buildExpr(state, (expr as any).expr)})`;\n\n case ExprType.UNARY: {\n const { operator, expr: innerExpr } = expr as any;\n return `${operator}${buildExpr(state, innerExpr)}`;\n }\n\n case ExprType.BINARY: {\n const { left, operator, right } = expr as any;\n return `${buildExpr(state, left)} ${operator} ${buildExpr(state, right)}`;\n }\n\n case ExprType.TERNARY: {\n const { condition, left, right } = expr as any;\n return `${buildExpr(state, condition)} ? ${buildExpr(state, left)} : ${buildExpr(state, right)}`;\n }\n\n case ExprType.PROP_ACCESS:\n return buildPropAccess(state, expr as PropAccessExpr);\n\n case ExprType.CALL:\n return buildCall(state, expr as CallExpr);\n\n case ExprType.NAMESPACE:\n return buildNamespace(state, expr as NamespaceExpr);\n\n case ExprType.FOR:\n return buildForLoop(state, expr as ForExpr);\n\n case ExprType.ELSE:\n return \"} else {\";\n\n case ExprType.IF:\n return buildIfBlock(state, expr as IfExpr);\n\n case ExprType.ELSE_IF:\n return buildElseIfBlock(state, expr as ElseIfExpr);\n\n case ExprType.SWITCH:\n return buildSwitchBlock(state, expr as SwitchExpr);\n\n case ExprType.CASE:\n return buildCaseBlock(state, expr as CaseExpr);\n\n case ExprType.DEFAULT:\n return \"default:\";\n\n case ExprType.BREAK:\n return \"break;\";\n\n case ExprType.CONTINUE:\n return \"continue;\";\n\n default:\n throw new MutorError(`Unsupported expression type '${type}'`);\n }\n}\n\nexport default function build(ast: Expr, context: BuildContext): string {\n const state: BuildState = {\n scope: context.scope,\n forbiddenProps: context.forbiddenProps,\n allowedProps: context.allowedProps,\n context,\n };\n\n const result = buildExpr(state, ast);\n return result.includes(\"namespaces.Mutor.await\")\n ? result.replaceAll(\n \"namespaces.Mutor.await\",\n \"await namespaces.Mutor.await\",\n )\n : result;\n}\n","import { TokenType } from \"../types/enums\";\r\n\r\nexport function getTokenTypeWords(type: TokenType) {\r\n switch (type) {\r\n case TokenType.IDENT:\r\n return \"identifier\";\r\n\r\n case TokenType.KEYWORD:\r\n return \"keyword\";\r\n\r\n case TokenType.NUMBER:\r\n return \"number\";\r\n\r\n case TokenType.OPERATOR:\r\n return \"operator\";\r\n\r\n case TokenType.STRING:\r\n return \"string\";\r\n }\r\n}\r\n","import { ExprType, LoopType, TokenType } from \"../types/enums\";\nimport type {\n ElseExpr,\n ElseIfExpr,\n Expr,\n ForExpr,\n IdentExpr,\n IfExpr,\n ParseState,\n SwitchExpr,\n Token,\n} from \"../types/types\";\nimport { getTokenTypeWords } from \"../utils/get-token-type-words\";\nimport {\n additiveOperators,\n bitwiseAndOperators,\n bitwiseOperators,\n bitwiseOrOperators,\n bitwiseXorOperators,\n comparisonOperators,\n equalityOperators,\n exponentiationOperators,\n multiplicativeOperators,\n propertyAccessOperators,\n unaryOperators,\n} from \"./constants\";\n\nfunction expectOrThrow(state: ParseState, type: TokenType): Token;\nfunction expectOrThrow(\n state: ParseState,\n type: TokenType,\n value: string,\n): Token;\nfunction expectOrThrow(\n state: ParseState,\n type: TokenType,\n value?: string,\n): Token {\n const token = state.tokens[state.cursor];\n const lastToken = state.tokens[state.tokens.length - 1];\n\n if (!token) {\n const article = value\n ? `'${value}'`\n : `${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)}`;\n throw {\n message: `Unexpected end of expression. Expected ${article}.`,\n pos: lastToken.pos + lastToken.value.length - 1,\n };\n }\n\n if (token.type !== type) {\n throw {\n message: `Unexpected token type. Expected ${value ? `'${value}'` : getTokenTypeWords(type)} but got ${getTokenTypeWords(token.type)} instead.`,\n pos: token.pos,\n };\n }\n\n if (value !== undefined && token.value !== value) {\n throw {\n message: `Unexpected token '${token.value}'. Expected ${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)} instead.`,\n pos: token.pos,\n };\n }\n\n return state.tokens[state.cursor++];\n}\n\nfunction parseForLoop(state: ParseState): ForExpr {\n const pos = state.tokens[state.cursor - 1].pos;\n const variable = expectOrThrow(state, TokenType.IDENT).value;\n let secondaryVariable: string | undefined;\n let token: Token;\n\n if (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \",\"\n ) {\n state.cursor++;\n secondaryVariable = expectOrThrow(state, TokenType.IDENT).value;\n }\n\n try {\n token = expectOrThrow(state, TokenType.KEYWORD, \"in\");\n } catch {\n token = expectOrThrow(state, TokenType.KEYWORD, \"of\");\n }\n\n const loopType = token.value === \"in\" ? LoopType.IN : LoopType.OF;\n const iterable = parseTernaryExpr(state);\n\n return {\n type: ExprType.FOR,\n loopType,\n iterable,\n variable,\n secondaryVariable,\n pos,\n };\n}\n\nfunction parseIfExpression(state: ParseState): IfExpr {\n const condition = parseTernaryExpr(state);\n return { condition, pos: condition.pos, type: ExprType.IF };\n}\n\nfunction parseSwitchExpression(state: ParseState): SwitchExpr {\n const condition = parseTernaryExpr(state);\n return { condition, pos: condition.pos, type: ExprType.SWITCH };\n}\n\nfunction parseElseExpression(state: ParseState): ElseExpr | ElseIfExpr {\n const pos = state.tokens[state.cursor - 1].pos;\n\n try {\n expectOrThrow(state, TokenType.KEYWORD, \"if\");\n return { ...parseIfExpression(state), type: ExprType.ELSE_IF, pos };\n } catch {\n return { type: ExprType.ELSE, pos };\n }\n}\n\nfunction extractFnArgs(state: ParseState): Expr[] {\n const args: Expr[] = [];\n\n if (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \")\"\n ) {\n return args;\n }\n\n args.push(parseTernaryExpr(state));\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \",\"\n ) {\n state.cursor++;\n args.push(parseTernaryExpr(state));\n }\n\n return args;\n}\n\nfunction parsePrimaryExpr(state: ParseState): Expr {\n const token = state.tokens[state.cursor++];\n\n if (!token) {\n throw {\n message: \"Unexpected end of expression.\",\n pos: state.tokens[state.tokens.length - 1].pos,\n };\n }\n\n if (token.type === TokenType.NUMBER) {\n return { type: ExprType.NUMBER, value: token.value, pos: token.pos };\n }\n\n if (token.type === TokenType.STRING) {\n return { type: ExprType.STRING, value: token.value, pos: token.pos };\n }\n\n if (token.type === TokenType.KEYWORD) {\n if (token.value === \"for\" && state.cursor === 1) {\n return parseForLoop(state);\n }\n\n if (token.value === \"true\") {\n return { type: ExprType.BOOLEAN, true: true, pos: token.pos };\n }\n\n if (token.value === \"false\") {\n return { type: ExprType.BOOLEAN, true: false, pos: token.pos };\n }\n\n if (token.value === \"undefined\") {\n return { type: ExprType.UNDEFINED, pos: token.pos };\n }\n\n if (token.value === \"null\") {\n return { type: ExprType.NULL, pos: token.pos };\n }\n\n if (token.value === \"end\" && state.tokens.length === 1) {\n return { type: ExprType.END, pos: token.pos };\n }\n\n if (token.value === \"if\" && state.cursor === 1) {\n return parseIfExpression(state);\n }\n\n if (token.value === \"switch\" && state.cursor === 1) {\n return parseSwitchExpression(state);\n }\n\n if (token.value === \"case\" && state.cursor === 1) {\n const condition = parseTernaryExpr(state);\n return { type: ExprType.CASE, condition, pos: condition.pos };\n }\n\n if (token.value === \"default\" && state.tokens.length === 1) {\n return { type: ExprType.DEFAULT, pos: token.pos };\n }\n\n if (token.value === \"break\" && state.tokens.length === 1) {\n return { type: ExprType.BREAK, pos: token.pos };\n }\n\n if (token.value === \"continue\" && state.tokens.length === 1) {\n return { type: ExprType.CONTINUE, pos: token.pos };\n }\n\n if (token.value === \"else\" && state.cursor === 1) {\n return parseElseExpression(state);\n }\n }\n\n if (token.type === TokenType.IDENT) {\n return { type: ExprType.IDENT, value: token.value, pos: token.pos };\n }\n\n if (token.type === TokenType.OPERATOR && token.value === \"(\") {\n const expr = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \")\");\n return { type: ExprType.GROUP, expr, pos: token.pos };\n }\n\n if (token.type === TokenType.OPERATOR && unaryOperators.has(token.value)) {\n const expr = parsePropertyAccess(state);\n return {\n type: ExprType.UNARY,\n operator: token.value,\n expr,\n pos: token.pos,\n };\n }\n\n throw {\n message: `Unexpected token '${token.value}'.`,\n pos: token.pos,\n };\n}\n\nfunction parsePropertyIdentifier(state: ParseState): IdentExpr {\n const token = state.tokens[state.cursor++];\n\n if (\n !token ||\n (token.type !== TokenType.IDENT && token.type !== TokenType.KEYWORD)\n ) {\n throw {\n message: \"Expected an identifier after property access.\",\n pos: token?.pos ?? state.tokens[state.cursor - 2].pos,\n };\n }\n\n return { type: ExprType.IDENT, value: token.value, pos: token.pos };\n}\n\nfunction parsePropertyAccess(state: ParseState): Expr {\n let left = parsePrimaryExpr(state);\n\n while (state.tokens[state.cursor]) {\n const token = state.tokens[state.cursor];\n\n if (token?.type === TokenType.OPERATOR && token?.value === \"(\") {\n state.cursor++;\n\n // Only allow function calls for namespaces by default\n if (!state.config.allowFnCalls && left.type !== ExprType.NAMESPACE) {\n throw {\n message: \"Function calls are not allowed.\",\n pos: token.pos,\n };\n }\n\n const args = extractFnArgs(state);\n expectOrThrow(state, TokenType.OPERATOR, \")\");\n\n left = {\n type: ExprType.CALL,\n expr: left,\n args,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (\n token?.type === TokenType.OPERATOR &&\n token?.value === \"?.\" &&\n state.tokens[state.cursor + 1]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor + 1]?.value === \"(\"\n ) {\n // Only allow function calls for namespaces by default\n if (!state.config.allowFnCalls && left.type !== ExprType.NAMESPACE) {\n throw {\n message: \"Function calls are not allowed.\",\n pos: state.tokens[state.cursor + 1].pos,\n };\n }\n\n // Move cursor to the postion of the first argument\n state.cursor += 2;\n\n const args = extractFnArgs(state);\n expectOrThrow(state, TokenType.OPERATOR, \")\");\n\n left = {\n type: ExprType.CALL,\n expr: left,\n args,\n optional: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (\n token?.type === TokenType.OPERATOR &&\n propertyAccessOperators.has(token?.value)\n ) {\n const isNamespace = token.value === \"::\";\n const isBracketNotation = token.value === \"[\";\n const isOptional = token.value === \"?.\";\n\n state.cursor++;\n\n if (\n isNamespace &&\n (state.tokens[state.cursor - 2]?.type !== TokenType.IDENT ||\n state.tokens[state.cursor]?.type !== TokenType.IDENT)\n ) {\n throw {\n message: `Invalid namespaces access. Expected syntax <IDENTIFIER>::<IDENTIFIER>, but got '${state.tokens[state.cursor - 2]?.value}::${state.tokens[state.cursor]?.value ?? \"\"}' instead.`,\n pos:\n state.tokens[state.cursor]?.pos ??\n state.tokens[state.cursor - 1].pos,\n };\n }\n\n if (isNamespace) {\n const right = parsePrimaryExpr(state);\n\n left = {\n type: ExprType.NAMESPACE,\n left,\n right,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (isBracketNotation) {\n const right = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\n\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n bracketNotation: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (isOptional) {\n if (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"[\"\n ) {\n state.cursor++;\n const right = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\n\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n bracketNotation: true,\n optional: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else {\n const right = parsePropertyIdentifier(state);\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n optional: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n } else {\n const right = parsePropertyIdentifier(state);\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n } else {\n break;\n }\n }\n\n return left;\n}\n\nfunction parseBinaryExpr(\n state: ParseState,\n leftParser: (state: ParseState) => Expr,\n operators: Set<string>,\n): Expr {\n let left = leftParser(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n operators.has(state.tokens[state.cursor]?.value)\n ) {\n const operator = state.tokens[state.cursor++].value;\n const right = leftParser(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator,\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseExponentiationExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parsePropertyAccess, exponentiationOperators);\n}\n\nfunction parseMultiplicativeExpr(state: ParseState): Expr {\n return parseBinaryExpr(\n state,\n parseExponentiationExpr,\n multiplicativeOperators,\n );\n}\n\nfunction parseAdditiveExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseMultiplicativeExpr, additiveOperators);\n}\n\nfunction parseBitwiseExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseAdditiveExpr, bitwiseOperators);\n}\n\nfunction parseComparisonExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseBitwiseExpr, comparisonOperators);\n}\n\nfunction parseEqualityExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseComparisonExpr, equalityOperators);\n}\n\nfunction parseBitwiseOrExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseBitwiseXorExpr, bitwiseOrOperators);\n}\n\nfunction parseBitwiseXorExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseBitwiseAndExpr, bitwiseXorOperators);\n}\n\nfunction parseBitwiseAndExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseEqualityExpr, bitwiseAndOperators);\n}\n\nfunction parseLogicalAndExpr(state: ParseState): Expr {\n let left = parseBitwiseOrExpr(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"&&\"\n ) {\n state.cursor++;\n const right = parseEqualityExpr(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator: \"&&\",\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseLogicalOrExpr(state: ParseState): Expr {\n let left = parseLogicalAndExpr(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"||\"\n ) {\n state.cursor++;\n const right = parseLogicalAndExpr(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator: \"||\",\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseNullishCoalesceExpr(state: ParseState): Expr {\n let left = parseLogicalOrExpr(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"??\"\n ) {\n state.cursor++;\n const right = parseLogicalOrExpr(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator: \"??\",\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseTernaryExpr(state: ParseState): Expr {\n const condition = parseNullishCoalesceExpr(state);\n\n if (\n state.tokens[state.cursor]?.type !== TokenType.OPERATOR ||\n state.tokens[state.cursor]?.value !== \"?\"\n ) {\n return condition;\n }\n\n state.cursor++;\n const left = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \":\");\n const right = parseTernaryExpr(state);\n\n return {\n type: ExprType.TERNARY,\n condition,\n left,\n right,\n pos: state.tokens[state.cursor - 1].pos,\n };\n}\n\nexport default function generateAst(\n tokens: Token[],\n config: { allowFnCalls: boolean },\n): Expr {\n const state: ParseState = {\n cursor: 0,\n tokens,\n config,\n };\n\n const ast = parseTernaryExpr(state);\n\n if (state.cursor !== state.tokens.length) {\n throw {\n pos: state.tokens[state.cursor].pos,\n message: `Expected token '${state.tokens[state.cursor].value}'.\\nExpected an operator or the end of the expression.`,\n };\n }\n\n return ast;\n}\n","import type { MutorConfig } from \"../types/types\";\n\nexport default function parse(\n templateBlock: string,\n { delimiters }: Pick<MutorConfig, \"delimiters\">,\n) {\n const openingTagWithWhitespaceCtrl = `${delimiters.openingTag}${delimiters.whitespaceTrim}`;\n const closingTagWithWhitespaceCtrl = `${delimiters.whitespaceTrim}${delimiters.closingTag}`;\n\n const leftTrim = templateBlock.startsWith(openingTagWithWhitespaceCtrl);\n const rightTrim = templateBlock.endsWith(closingTagWithWhitespaceCtrl);\n\n const openLen = leftTrim\n ? openingTagWithWhitespaceCtrl.length\n : delimiters.openingTag.length;\n const closeLen = rightTrim\n ? closingTagWithWhitespaceCtrl.length\n : delimiters.closingTag.length;\n\n const inner = templateBlock.slice(openLen, templateBlock.length - closeLen);\n const trimmed = inner.trim();\n\n const isComment = trimmed.startsWith(delimiters.commentTag);\n if (isComment) {\n return { isComment, leftTrim, rightTrim };\n }\n\n return {\n leftTrim,\n rightTrim,\n inner,\n isBlock:\n trimmed.startsWith(\"for \") ||\n trimmed.startsWith(\"if \") ||\n trimmed === \"else\" ||\n trimmed.startsWith(\"else if \") ||\n trimmed.startsWith(\"switch \") ||\n trimmed.startsWith(\"case \") ||\n trimmed === \"default\" ||\n trimmed === \"break\" ||\n trimmed === \"continue\",\n isBlockEnd: trimmed === \"end\",\n hasContext: trimmed.startsWith(\"for \"),\n requiresBlockClose:\n trimmed.startsWith(\"for \") ||\n trimmed.startsWith(\"if \") ||\n trimmed.startsWith(\"switch \"),\n usesAwait: inner.includes(\"Mutor::await\"),\n };\n}\n","import { TokenType } from \"../types/enums\";\r\nimport type { Token } from \"../types/types\";\r\nimport { keywords, operators } from \"./constants\";\r\n\r\nconst IDENT_START_PATTERN = /[a-zA-Z$_]/;\r\nconst IDENT_PATTERN = /[a-zA-Z$_0-9]/;\r\nconst NUMBER_START_PATTERN = /[0-9]/;\r\nconst NUMBER_PATTERN = /[0-9.oxe]/;\r\nconst VALIDATION_PATTERN = /[a-zA-Z$_0-9\\s\\t\\r\\n'\"`]/;\r\n\r\nexport default function tokenize(expr: string) {\r\n let cursor = 0,\r\n char = \"\";\r\n const tokens: Token[] = [];\r\n\r\n function accumulateKeywordOrIdentifier() {\r\n let buffer = \"\";\r\n if (IDENT_START_PATTERN.test(char)) {\r\n let j = cursor;\r\n while (IDENT_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n tokens.push({\r\n type: keywords.has(buffer) ? TokenType.KEYWORD : TokenType.IDENT,\r\n value: buffer,\r\n pos: cursor,\r\n });\r\n\r\n cursor = j;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateStr() {\r\n if (char !== '\"' && char !== \"'\" && char !== \"`\") {\r\n return false;\r\n }\r\n\r\n const quote = char;\r\n const start = cursor;\r\n\r\n let j = cursor + 1;\r\n let buffer = \"\";\r\n\r\n while (j < expr.length) {\r\n const current = expr[j];\r\n\r\n // Escape sequence\r\n if (current === \"\\\\\") {\r\n // Ensure next char exists\r\n if (j + 1 >= expr.length) {\r\n throw {\r\n pos: j,\r\n message: \"Unexpected end of string after escape character.\",\r\n };\r\n }\r\n\r\n // Preserve escape exactly as written\r\n buffer += current;\r\n buffer += expr[j + 1];\r\n\r\n j += 2;\r\n continue;\r\n }\r\n\r\n // Closing quote\r\n if (current === quote) {\r\n break;\r\n }\r\n\r\n buffer += current;\r\n j++;\r\n }\r\n\r\n // Missing closing quote\r\n if (j >= expr.length || expr[j] !== quote) {\r\n throw {\r\n pos: start,\r\n message: `String literal missing closing ${quote}.`,\r\n };\r\n }\r\n\r\n tokens.push({\r\n type: TokenType.STRING,\r\n value: buffer,\r\n pos: start,\r\n });\r\n\r\n cursor = j;\r\n }\r\n\r\n function accumulateNumber() {\r\n if (NUMBER_START_PATTERN.test(char)) {\r\n let j = cursor,\r\n buffer = \"\";\r\n\r\n while (NUMBER_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n const numVal = Number(buffer);\r\n const isNan = Number.isNaN(numVal);\r\n\r\n if (isNan) {\r\n throw { pos: cursor, message: \"Found invalid number literal.\" };\r\n }\r\n\r\n tokens.push({ type: TokenType.NUMBER, value: `${numVal}`, pos: cursor });\r\n cursor = j - 1;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateOperator() {\r\n const op = `${char}${expr[cursor + 1]}`;\r\n if (operators.has(op)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: op, pos: cursor });\r\n cursor++;\r\n return;\r\n }\r\n\r\n if (operators.has(char)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: char, pos: cursor });\r\n return;\r\n }\r\n }\r\n\r\n while (cursor < expr.length) {\r\n char = expr[cursor];\r\n\r\n accumulateNumber();\r\n accumulateKeywordOrIdentifier();\r\n accumulateStr();\r\n accumulateOperator();\r\n\r\n if (\r\n !VALIDATION_PATTERN.test(char) &&\r\n !operators.has(char) &&\r\n !operators.has(expr[cursor - 1] + char)\r\n ) {\r\n throw {\r\n message: `Unexpected token '${char}' in expression.`,\r\n pos: cursor,\r\n };\r\n }\r\n\r\n cursor++;\r\n }\r\n\r\n return tokens.length\r\n ? tokens\r\n : [{ type: TokenType.STRING, value: \"\", pos: 0 }];\r\n}\r\n","import { BlockType, ExprType } from \"../types/enums\";\nimport type {\n BlockState,\n CompileMetadata,\n ForExpr,\n MutorConfig,\n} from \"../types/types\";\nimport escapeRawText from \"../utils/escape-raw-text\";\nimport getLineNumberAndIndex from \"../utils/get-line-and-column-nums\";\nimport getLineSnapshot from \"../utils/get-line-snapshot\";\nimport build from \"./build\";\nimport { AsyncFunction } from \"./constants\";\nimport { MutorCompilerError } from \"./error\";\nimport generateAst from \"./generate-ast\";\nimport parse from \"./parse\";\nimport tokenize from \"./tokenize\";\n\nexport default function compile(\n src: string,\n config: MutorConfig,\n meta: CompileMetadata,\n) {\n const scope: string[] = [];\n // Keep track of block opening states to support nested blocks\n const blockOpeningStack: BlockState[] = [];\n\n const {\n delimiters,\n keepOpeningTagEscapeDelimiter,\n allowFnCalls,\n allowedProps,\n forbiddenProps,\n autoEscape,\n } = config;\n\n // Function mode (sync/async)\n let mode: \"sync\" | \"async\" = \"sync\";\n\n // Whitespace control state\n let trimNext = false,\n cursor = 0,\n body = `let acc=\"\";`;\n\n while (cursor < src.length) {\n const templateOpenTagIdx = src.indexOf(delimiters.openingTag, cursor);\n\n // Handle Final Text Chunk\n if (templateOpenTagIdx === -1) {\n let lastChunk = src.slice(cursor);\n if (trimNext) lastChunk = lastChunk.trimStart();\n if (lastChunk) body += `acc+=\\`${escapeRawText(lastChunk)}\\`;`;\n break;\n }\n\n // Escape Logic\n function isEscaped() {\n let j = templateOpenTagIdx,\n count = 0;\n\n while (\n j >= delimiters.openingTagEscape.length &&\n src.slice(j - delimiters.openingTagEscape.length, j) ===\n delimiters.openingTagEscape\n ) {\n count++;\n j -= delimiters.openingTagEscape.length;\n }\n\n return count % 2 === 1;\n }\n\n if (isEscaped()) {\n let escapedChunk = src.slice(\n cursor,\n keepOpeningTagEscapeDelimiter\n ? templateOpenTagIdx + delimiters.openingTagEscape.length + 1\n : templateOpenTagIdx - delimiters.openingTag.length + 1,\n );\n\n if (trimNext) {\n escapedChunk = escapedChunk.trimStart();\n trimNext = false;\n }\n\n body += `acc+=\\`${escapeRawText(escapedChunk)}\\`;`;\n\n if (!keepOpeningTagEscapeDelimiter) {\n body += `acc+=\\`${delimiters.openingTag}\\`;`;\n }\n\n cursor = templateOpenTagIdx + delimiters.openingTag.length;\n continue;\n }\n\n // Parse Tag Metadata (to check for leftTrim BEFORE processing rawText)\n const templateEndTagIdx = src.indexOf(\n delimiters.closingTag,\n templateOpenTagIdx,\n );\n\n if (templateEndTagIdx === -1) {\n const [line, lineIndex] = getLineNumberAndIndex(src, templateOpenTagIdx);\n const lineText = getLineSnapshot(src, lineIndex);\n\n throw new MutorCompilerError(\n \"No closing tag found.\",\n line,\n lineText,\n templateOpenTagIdx,\n meta.path,\n );\n }\n\n const template = src.slice(\n templateOpenTagIdx,\n templateEndTagIdx + delimiters.closingTag.length,\n );\n const {\n inner,\n leftTrim,\n rightTrim,\n isBlock,\n isBlockEnd,\n hasContext,\n requiresBlockClose,\n isComment,\n usesAwait,\n } = parse(template, { delimiters });\n\n // Switch to async mode if Mutor::await is used\n if (usesAwait && mode !== \"async\") {\n mode = \"async\";\n }\n\n // Process Raw Text (between cursor and current tag)\n let rawText = src.slice(cursor, templateOpenTagIdx);\n if (rawText) {\n const lastBlockOpened = blockOpeningStack[blockOpeningStack.length - 1];\n\n if (\n lastBlockOpened?.type === BlockType.SWITCH &&\n !lastBlockOpened.hasCase\n ) {\n const firstNonWhitespace = rawText.search(/\\S/);\n\n // Prevent raw text from being processed if it doesn't start with a case or default tag\n if (firstNonWhitespace === -1) {\n rawText = \"\";\n } else {\n const pos = cursor + firstNonWhitespace;\n const [line, lineIndex] = getLineNumberAndIndex(src, pos);\n const lineText = getLineSnapshot(src, lineIndex);\n\n throw new MutorCompilerError(\n \"A switch block must begin with a case or default tag.\",\n line,\n lineText,\n pos - lineIndex,\n meta.path,\n );\n }\n }\n\n if (trimNext) {\n rawText = rawText.trimStart();\n }\n\n if (leftTrim) {\n rawText = rawText.trimEnd();\n }\n\n if (rawText) {\n body += `acc+=\\`${escapeRawText(rawText)}\\`;`;\n }\n }\n\n // Reset after use\n trimNext = false;\n cursor = templateEndTagIdx + delimiters.closingTag.length;\n\n try {\n if (!isComment) {\n const tokens = tokenize(inner);\n const ast = generateAst(tokens, { allowFnCalls });\n const lastBlockOpened = blockOpeningStack[blockOpeningStack.length - 1];\n\n if (\n lastBlockOpened?.type === BlockType.SWITCH &&\n !lastBlockOpened.hasCase &&\n ast.type !== ExprType.CASE &&\n ast.type !== ExprType.DEFAULT &&\n ast.type !== ExprType.END\n ) {\n throw {\n message: \"A switch block must begin with a case or default tag.\",\n pos: ast.pos,\n };\n }\n\n if (\n (ast.type === ExprType.CASE || ast.type === ExprType.DEFAULT) &&\n lastBlockOpened?.type !== BlockType.SWITCH\n ) {\n throw {\n message: `'${ast.type === ExprType.CASE ? \"case\" : \"default\"}' can only be used directly inside a switch block.`,\n pos: ast.pos,\n };\n }\n\n if (ast.type === ExprType.DEFAULT) {\n if (lastBlockOpened!.hasDefault) {\n throw {\n message: \"A switch block can only have one default case.\",\n pos: ast.pos,\n };\n }\n\n lastBlockOpened!.hasDefault = true;\n }\n\n if (ast.type === ExprType.CASE || ast.type === ExprType.DEFAULT) {\n lastBlockOpened!.hasCase = true;\n }\n\n if (\n (ast.type === ExprType.ELSE || ast.type === ExprType.ELSE_IF) &&\n lastBlockOpened?.type !== BlockType.IF\n ) {\n throw {\n message: `'${ast.type === ExprType.ELSE ? \"else\" : \"else if\"}' can only be used directly inside an if block.`,\n pos: ast.pos,\n };\n }\n\n if (\n (ast.type === ExprType.ELSE || ast.type === ExprType.ELSE_IF) &&\n lastBlockOpened!.hasElse\n ) {\n throw {\n message: `'${ast.type === ExprType.ELSE ? \"else\" : \"else if\"}' cannot be used after an else block.`,\n pos: ast.pos,\n };\n }\n\n if (ast.type === ExprType.ELSE) {\n lastBlockOpened!.hasElse = true;\n }\n\n if (\n ast.type === ExprType.BREAK &&\n !blockOpeningStack.some(\n ({ type }) => type === BlockType.LOOP || type === BlockType.SWITCH,\n )\n ) {\n throw {\n message: \"'break' can only be used inside a loop or switch block.\",\n pos: ast.pos,\n };\n }\n\n if (\n ast.type === ExprType.CONTINUE &&\n !blockOpeningStack.some(({ type }) => type === BlockType.LOOP)\n ) {\n throw {\n message: \"'continue' can only be used inside a loop block.\",\n pos: ast.pos,\n };\n }\n\n const js = build(ast, { allowedProps, forbiddenProps, scope });\n\n if (isBlock && requiresBlockClose && hasContext) {\n const { variable, secondaryVariable } = ast as ForExpr;\n\n scope.push(variable);\n if (secondaryVariable) {\n scope.push(secondaryVariable);\n }\n\n blockOpeningStack.push({\n type: BlockType.LOOP,\n pos: templateOpenTagIdx,\n loopType: (ast as ForExpr).loopType,\n scopeSize: secondaryVariable === undefined ? 1 : 2,\n hasCase: false,\n hasDefault: false,\n hasElse: false,\n });\n } else if (isBlock && requiresBlockClose && !hasContext) {\n blockOpeningStack.push({\n type:\n ast.type === ExprType.SWITCH ? BlockType.SWITCH : BlockType.IF,\n pos: templateOpenTagIdx,\n loopType: undefined,\n scopeSize: 0,\n hasCase: false,\n hasDefault: false,\n hasElse: false,\n });\n }\n\n if (isBlockEnd) {\n const lastBlockOpened = blockOpeningStack.pop();\n\n if (lastBlockOpened === undefined) {\n throw {\n message: \"Unexpected end of block\",\n pos: templateOpenTagIdx,\n };\n }\n\n // Remove scope for the current block if it's a loop block\n if (lastBlockOpened?.type === BlockType.LOOP) {\n scope.splice(-lastBlockOpened.scopeSize);\n }\n }\n\n if (isBlock || isBlockEnd) {\n body += js;\n } else {\n // Only escape unknown values returned from fn calls or object property resolution\n // Values returned from Mutor::include should be taken as is.\n body +=\n // Escape the return values of unknown values at runtime\n autoEscape && !js.startsWith(\"namespaces.Mutor.include\")\n ? `acc+=escapeFn(${js});`\n : `acc+=${js};`;\n }\n }\n\n // Set state for the NEXT raw text chunk\n if (rightTrim) {\n trimNext = true;\n }\n } catch (e) {\n const { message, pos: relPos } = e as { message: string; pos: number };\n const delimitersLength = leftTrim\n ? delimiters.whitespaceTrim.length + delimiters.openingTag.length\n : delimiters.openingTag.length;\n\n const finalPos = templateOpenTagIdx + relPos + delimitersLength;\n\n const [line, lineIndex] = getLineNumberAndIndex(src, finalPos);\n const lineText = getLineSnapshot(src, lineIndex);\n\n throw new MutorCompilerError(\n message,\n line,\n lineText,\n finalPos - lineIndex,\n meta.path,\n );\n }\n }\n\n if (blockOpeningStack.length) {\n const lastPos = blockOpeningStack.pop()?.pos as number;\n const [line, lineIndex] = getLineNumberAndIndex(src, lastPos);\n const lineText = getLineSnapshot(src, lineIndex);\n throw new MutorCompilerError(\n \"Unclosed block detected.\",\n line,\n lineText,\n lastPos - lineIndex,\n meta.path,\n );\n }\n\n body += `return acc;`;\n return mode === \"async\"\n ? new AsyncFunction(\n \"ctx\",\n \"namespaces\",\n \"allowedProps\",\n \"forbiddenProps\",\n \"escapeFn\",\n \"validateComputedProps\",\n body,\n )\n : new Function(\n \"ctx\",\n \"namespaces\",\n \"allowedProps\",\n \"forbiddenProps\",\n \"escapeFn\",\n \"validateComputedProps\",\n body,\n );\n}\n","import type {\n MutorConfig,\n PartialMutorConfig,\n RuntimeFrame,\n} from \"../types/types\";\nimport createRuntimeFrame from \"../utils/create-runtime\";\nimport escapeFn from \"../utils/escape-fn\";\nimport validateComputedProp from \"../utils/validate-computed-prop\";\nimport compile from \"./compile\";\nimport { defaultConfig, namespaces } from \"./constants\";\nimport { MutorCompilerError, MutorError } from \"./error\";\n\nexport default class MutorBase {\n protected __cacheSize = 0;\n protected __config: MutorConfig = { ...defaultConfig };\n protected __compiledTemplatesMap: Map<\n string,\n { fn: Function; size: number }\n > = new Map();\n protected __namespaces: Record<any, any> = namespaces;\n\n constructor(config: PartialMutorConfig = {}) {\n this.addConfig(config);\n this.__namespaces.Mutor = {\n await: async (value: any) => {\n return await value;\n },\n };\n }\n\n addConfig(conf: PartialMutorConfig): MutorConfig {\n const {\n autoEscape,\n delimiters: overrideDelimeters,\n allowedProps,\n forbiddenProps,\n keepOpeningTagEscapeDelimiter,\n allowFnCalls,\n cache,\n build,\n onIncludeFail,\n onIncludeError,\n rootDir,\n } = conf;\n\n this.__config = {\n build: {\n include: new Set([...(build?.include || defaultConfig.build.include)]),\n exclude: new Set([\n ...defaultConfig.build.exclude,\n ...(build?.exclude || []),\n ]),\n },\n rootDir,\n autoEscape: autoEscape === true ? true : autoEscape !== false,\n allowedProps: new Set([...(allowedProps || defaultConfig.allowedProps)]),\n allowFnCalls: !!allowFnCalls,\n onIncludeFail: onIncludeFail || defaultConfig.onIncludeFail,\n onIncludeError: onIncludeError || defaultConfig.onIncludeError,\n cache: { ...defaultConfig.cache, ...(cache || {}) },\n forbiddenProps: new Set([\n ...defaultConfig.forbiddenProps,\n ...(forbiddenProps || []),\n ]),\n keepOpeningTagEscapeDelimiter: keepOpeningTagEscapeDelimiter ?? false,\n delimiters: {\n ...defaultConfig.delimiters,\n ...(overrideDelimeters || {}),\n },\n };\n\n return this.__config;\n }\n\n restoreDefaultConfig() {\n this.__config = { ...defaultConfig };\n }\n\n protected __compile(template: string, runtime?: RuntimeFrame) {\n return compile(template, this.__config, {\n path: runtime?.renderedPath || \"anonymous\",\n });\n }\n\n compile(template: string) {\n const fn = this.__compile(template);\n\n return (context: any) =>\n fn(\n context,\n this.__createNamespacesWithRuntime(createRuntimeFrame(context)),\n this.__config.allowedProps,\n this.__config.forbiddenProps,\n escapeFn,\n validateComputedProp,\n );\n }\n\n renderAsync(template: string, context: any): Promise<string> {\n return new Promise((resolve) => {\n resolve(this.render(template, context));\n });\n }\n\n render(template: string, context: any): string {\n const runtime = createRuntimeFrame(context, \"anonymous\");\n return this.__renderWithRuntime(template, runtime);\n }\n\n protected __renderWithRuntime(\n template: string,\n runtime: RuntimeFrame,\n ): string {\n const fn = this.__compile(template, runtime);\n\n const result = fn(\n runtime.context,\n this.__createNamespacesWithRuntime(runtime),\n this.__config.allowedProps,\n this.__config.forbiddenProps,\n escapeFn,\n validateComputedProp,\n );\n\n return result;\n }\n\n protected __createNamespacesWithRuntime(\n runtime: RuntimeFrame,\n ): Record<any, any> {\n return {\n ...this.__namespaces,\n Mutor: {\n ...this.__namespaces.Mutor,\n $$context: runtime.context,\n },\n };\n }\n\n protected __handleError(\n err: unknown,\n from: string,\n path: string,\n absolutePath?: string,\n ): string {\n if (this.__config.onIncludeFail === \"throw\") {\n throw err instanceof MutorCompilerError\n ? err\n : new MutorError((err as Error).message);\n }\n\n const meta = { from, path, absolutePath };\n\n // Log error if onIncludeFail is set to \"ignore\" and onIncludeError is not defined\n if (\n this.__config.onIncludeFail === \"ignoreLog\" &&\n !this.__config.onIncludeError\n ) {\n err instanceof MutorCompilerError\n ? console.log(err)\n : console.log(`[Mutor.js]\\n${(err as Error).message}`);\n }\n\n return this.__config.onIncludeError?.(meta, err) ?? \"\";\n }\n\n protected __createEntrySpaceForTemplate(targetSize: number): boolean {\n if (this.__cacheSize + targetSize <= this.__config.cache.maxSize) {\n return true;\n }\n\n if (targetSize > this.__config.cache.maxSize) {\n return false;\n }\n\n const firstEntry = this.__compiledTemplatesMap.entries().next().value;\n\n if (firstEntry) {\n const [oldestKey, oldestData] = firstEntry;\n this.__compiledTemplatesMap.delete(oldestKey);\n this.__cacheSize -= oldestData.size;\n }\n\n return this.__createEntrySpaceForTemplate(targetSize);\n }\n\n getDiagnostics() {\n const maxSize = this.__config.cache.maxSize;\n\n return {\n bytesUsed: this.__cacheSize,\n bytesMax: maxSize,\n readableUsed: `${(this.__cacheSize / 1024 / 1024).toFixed(2)} MB`,\n readableMax: `${(maxSize / 1024 / 1024).toFixed(2)} MB`,\n totalEntries: this.__compiledTemplatesMap.size,\n percentFull:\n maxSize > 0\n ? Math.min(100, Math.round((this.__cacheSize / maxSize) * 100))\n : 0,\n avgTemplateSize:\n this.__compiledTemplatesMap.size > 0\n ? Math.round(this.__cacheSize / this.__compiledTemplatesMap.size)\n : 0,\n };\n }\n\n protected __register(identifier: string, template: string) {\n const templateSize = template.length * 2 + 500;\n const existingSize = this.__compiledTemplatesMap.get(identifier)?.size ?? 0;\n\n if (\n this.__cacheSize - existingSize + templateSize >\n this.__config.cache.maxSize\n ) {\n throw new MutorError(\n `The template for the component '${identifier}' is too large and will not fit in the cache. Consider increasing 'cache.maxSize' in the config`,\n );\n }\n\n // Use a temporary runtime for compilation context\n const tempRuntime = createRuntimeFrame(null, identifier);\n // Compile first to expose errors before updating state\n const compiled = this.__compile(template, tempRuntime);\n\n // Delete existing entry if it exists\n this.__compiledTemplatesMap.delete(identifier);\n this.__cacheSize -= existingSize;\n\n // Add new entry\n this.__cacheSize += template.length * 2 + 500;\n this.__compiledTemplatesMap.set(identifier, {\n fn: compiled,\n size: templateSize,\n });\n }\n\n reset() {\n this.__config = { ...defaultConfig };\n this.__compiledTemplatesMap.clear();\n this.__cacheSize = 0;\n }\n}\n","import type { ExitCode } from \"../types/types\";\r\n\r\nexport const ExitCodes = {\r\n Success: 0,\r\n RuntimeError: 1,\r\n ArgumentError: 2,\r\n} as const;\r\n\r\nexport class CliError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly exitCode: ExitCode = ExitCodes.RuntimeError,\r\n ) {\r\n super(message);\r\n this.name = \"CliError\";\r\n }\r\n}\r\n\r\nexport class ArgumentError extends CliError {\r\n constructor(message: string) {\r\n super(message, ExitCodes.ArgumentError);\r\n this.name = \"ArgumentError\";\r\n }\r\n}\r\n\r\nexport class FileReadError extends CliError {\r\n constructor(filePath: string, cause: unknown) {\r\n const reason = cause instanceof Error ? cause.message : String(cause);\r\n super(\r\n `could not read file '${filePath}': ${reason}`,\r\n ExitCodes.RuntimeError,\r\n );\r\n this.name = \"FileReadError\";\r\n }\r\n}\r\n\r\nexport class FileWriteError extends CliError {\r\n constructor(filePath: string, cause: unknown) {\r\n const reason = cause instanceof Error ? cause.message : String(cause);\r\n super(\r\n `could not write file '${filePath}': ${reason}`,\r\n ExitCodes.RuntimeError,\r\n );\r\n this.name = \"FileWriteError\";\r\n }\r\n}\r\n\r\nexport class JsonParseError extends CliError {\r\n constructor(filePath: string, cause: unknown) {\r\n const reason = cause instanceof Error ? cause.message : String(cause);\r\n super(\r\n `failed to parse JSON in '${filePath}': ${reason}`,\r\n ExitCodes.RuntimeError,\r\n );\r\n this.name = \"JsonParseError\";\r\n }\r\n}\r\n"],"mappings":"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","names":["cli_exports","__export","handleBuildCommand","handleCompileCommand","handleRenderCommand","parseArgs","safeParseJsonFile","safeReadFile","safeWriteFile","__toCommonJS","import_node_fs","import_node_process","version","import_node_fs","import_promises","import_node_path","createRuntimeFrame","context","renderedPath","constructPointer","pos","offset","MutorError","_MutorError","message","MutorCompilerError","_MutorCompilerError","line","lineText","column","file","gutterWidth","report","constructPointer","keywords","operators","equalityOperators","comparisonOperators","bitwiseOperators","additiveOperators","multiplicativeOperators","propertyAccessOperators","unaryOperators","bitwiseOrOperators","bitwiseXorOperators","bitwiseAndOperators","exponentiationOperators","ESCAPE_MAP","defaultConfig","namespaces","value","space","str","obj","key","entries","keys","MutorError","result","args","arr","size","i","start","end","step","radix","min","max","digits","x","base","exponent","date","AsyncFunction","escapeFn","char","ESCAPE_MAP","import_node_path","toAbsolutePath","basePath","relativePaths","absoluteBase","baseDir","validateComputedProp","value","allowedProps","forbiddenProps","MutorError","escapeRawText","text","getLineAndColumnNumbers","str","idx","line","lineIndex","getLineSnapshot","str","lineIdx","nextNewlineIdx","BACKTICK_REGEX","prefixWithCtx","state","expr","buildNamespace","leftValue","rightValue","buildPropAccess","left","buildExpr","optionalChain","right","propName","buildCall","func","args","arg","buildForLoop","iterable","loopType","variable","secondaryVariable","loopOperator","iterableValue","build","buildIfBlock","condition","buildElseIfBlock","buildSwitchBlock","buildCaseBlock","type","escapeRawText","operator","innerExpr","MutorError","ast","context","result","getTokenTypeWords","type","expectOrThrow","state","type","value","token","lastToken","getTokenTypeWords","parseForLoop","pos","variable","secondaryVariable","loopType","iterable","parseTernaryExpr","parseIfExpression","condition","parseSwitchExpression","parseElseExpression","extractFnArgs","args","parsePrimaryExpr","expr","unaryOperators","parsePropertyAccess","parsePropertyIdentifier","left","propertyAccessOperators","isNamespace","isBracketNotation","isOptional","right","parseBinaryExpr","leftParser","operators","operator","parseExponentiationExpr","exponentiationOperators","parseMultiplicativeExpr","multiplicativeOperators","parseAdditiveExpr","additiveOperators","parseBitwiseExpr","bitwiseOperators","parseComparisonExpr","comparisonOperators","parseEqualityExpr","equalityOperators","parseBitwiseOrExpr","parseBitwiseXorExpr","bitwiseOrOperators","parseBitwiseAndExpr","bitwiseXorOperators","bitwiseAndOperators","parseLogicalAndExpr","parseLogicalOrExpr","parseNullishCoalesceExpr","generateAst","tokens","config","ast","parse","templateBlock","delimiters","openingTagWithWhitespaceCtrl","closingTagWithWhitespaceCtrl","leftTrim","rightTrim","openLen","closeLen","inner","trimmed","isComment","IDENT_START_PATTERN","IDENT_PATTERN","NUMBER_START_PATTERN","NUMBER_PATTERN","VALIDATION_PATTERN","tokenize","expr","cursor","char","tokens","accumulateKeywordOrIdentifier","buffer","j","keywords","accumulateStr","quote","start","current","accumulateNumber","numVal","accumulateOperator","op","operators","compile","src","config","meta","scope","blockOpeningStack","delimiters","keepOpeningTagEscapeDelimiter","allowFnCalls","allowedProps","forbiddenProps","autoEscape","mode","trimNext","cursor","body","isEscaped","j","templateOpenTagIdx","count","lastChunk","escapeRawText","escapedChunk","templateEndTagIdx","line","lineIndex","getLineAndColumnNumbers","lineText","getLineSnapshot","MutorCompilerError","template","inner","leftTrim","rightTrim","isBlock","isBlockEnd","hasContext","requiresBlockClose","isComment","usesAwait","parse","rawText","lastBlockOpened","firstNonWhitespace","pos","tokens","tokenize","ast","generateAst","type","js","build","variable","secondaryVariable","e","message","relPos","delimitersLength","finalPos","lastPos","AsyncFunction","MutorBase","config","defaultConfig","namespaces","value","conf","autoEscape","overrideDelimeters","allowedProps","forbiddenProps","keepOpeningTagEscapeDelimiter","allowFnCalls","cache","build","onIncludeFail","onIncludeError","rootDir","template","runtime","compile","fn","context","createRuntimeFrame","escapeFn","validateComputedProp","resolve","err","from","path","absolutePath","MutorCompilerError","MutorError","meta","targetSize","firstEntry","oldestKey","oldestData","maxSize","identifier","templateSize","existingSize","tempRuntime","compiled","MutorServer","MutorBase","config","path","renderedPath","isAlias","root","toAbsolutePath","resolvedPath","runtime","context","MutorError","previousPath","err","template","createRuntimeFrame","resolve","absolutePath","compiled","previousContext","entry","templateSize","escapeFn","validateComputedProp","src","destination","absoluteDestinationPath","absoluteSrcPath","entries","srcPath","destinationPath","extension","rendered","ExitCodes","CliError","message","exitCode","ArgumentError","FileReadError","filePath","cause","reason","FileWriteError","JsonParseError","COMMANDS","OPTIONS","VERSION","version","USAGE","safeReadFile","filePath","err","FileReadError","safeWriteFile","content","FileWriteError","safeParseJsonFile","raw","JsonParseError","assertIsFile","flag","stat","ArgumentError","assertIsDirectory","dirPath","assertExtension","extensions","ext","parseArgs","rawArgs","ExitCodes","command","commandData","struct","i","value","handleCompileCommand","mutor","args","inputPath","toAbsolutePath","template","output","outPath","registerCleanup","handleBuildCommand","dataPath","context","buildStarted","handleRenderCommand","cleanupFn","fn","handleSignal","signal","main","MutorServer","configPath","config","CliError"]}
1
+ {"version":3,"sources":["../src/bin/cli.ts","../package.json","../src/core/mutor.server.ts","../src/utils/create-runtime.ts","../src/utils/construct-pointer.ts","../src/core/error.ts","../src/core/constants.ts","../src/utils/escape-fn.ts","../src/utils/to-absolute-path.ts","../src/utils/validate-computed-prop.ts","../src/utils/escape-raw-text.ts","../src/utils/get-line-and-column-nums.ts","../src/utils/get-line-snapshot.ts","../src/utils/is-escaped.ts","../src/core/build.ts","../src/utils/get-token-type-words.ts","../src/core/generate-ast.ts","../src/core/parse.ts","../src/core/tokenize.ts","../src/core/compile.ts","../src/core/mutor.base.ts","../src/bin/cli-errors.ts"],"sourcesContent":["import {\r\n readFileSync,\r\n rmSync,\r\n type Stats,\r\n statSync,\r\n writeFileSync,\r\n} from \"node:fs\";\r\nimport { argv, exit } from \"node:process\";\r\nimport { version } from \"../../package.json\";\r\nimport Mutor from \"../core/mutor.server\";\r\nimport type {\r\n CleanupFn,\r\n CommandStruct,\r\n PartialMutorConfig,\r\n} from \"../types/types\";\r\nimport toAbsolutePath from \"../utils/to-absolute-path\";\r\nimport {\r\n ArgumentError,\r\n CliError,\r\n ExitCodes,\r\n FileReadError,\r\n FileWriteError,\r\n JsonParseError,\r\n} from \"./cli-errors\";\r\n\r\nconst COMMANDS = new Set([\"compile\", \"build\", \"render\"]);\r\nconst OPTIONS = new Set([\"--out\", \"--data\", \"--config\"]);\r\n\r\n// Kept in sync with package.json at build time via your bundler / tsconfig paths.\r\nconst VERSION = `Mutor.js v${version}`;\r\n\r\nconst USAGE = `\r\nUsage: mutor <command> <input> [options]\r\n\r\nCommands:\r\n compile <template> Compile a template file to its intermediate form\r\n build <dir> Render all templates in a directory using a data source\r\n render <template> Compile and immediately render a template\r\n\r\nOptions:\r\n --out <path> Output file or directory (defaults to stdout for compile/render)\r\n --data <path> JSON data file to use as render context (required for build/render)\r\n --config <path> JSON config file to pass to Mutor\r\n --version Print the version and exit\r\n --help Show this help message\r\n\r\nExit codes:\r\n 0 success\r\n 1 runtime error (I/O failure, render failure, etc.)\r\n 2 argument error (bad flags, missing or wrong-typed values)\r\n`.trim();\r\n\r\n/** Read a file, throwing a friendly FileReadError on failure. */\r\nexport function safeReadFile(filePath: string): string {\r\n try {\r\n return readFileSync(filePath, \"utf-8\");\r\n } catch (err) {\r\n throw new FileReadError(filePath, err);\r\n }\r\n}\r\n\r\n/** Write a file, throwing a friendly FileWriteError on failure. */\r\nexport function safeWriteFile(filePath: string, content: string): void {\r\n try {\r\n writeFileSync(filePath, content, \"utf-8\");\r\n } catch (err) {\r\n throw new FileWriteError(filePath, err);\r\n }\r\n}\r\n\r\n/** Parse JSON from a file, attributing parse errors to that file. */\r\nexport function safeParseJsonFile(filePath: string): unknown {\r\n const raw = safeReadFile(filePath);\r\n try {\r\n return JSON.parse(raw);\r\n } catch (err) {\r\n throw new JsonParseError(filePath, err);\r\n }\r\n}\r\n\r\n/** Assert a path points to an existing regular file (not a dir, socket, etc.). */\r\nfunction assertIsFile(filePath: string, flag: string): void {\r\n let stat: Stats;\r\n try {\r\n stat = statSync(filePath);\r\n } catch {\r\n throw new ArgumentError(`${flag} path '${filePath}' does not exist`);\r\n }\r\n if (!stat.isFile()) {\r\n throw new ArgumentError(`${flag} path '${filePath}' is not a file`);\r\n }\r\n}\r\n\r\n/** Assert a path points to an existing directory. */\r\nfunction assertIsDirectory(dirPath: string, flag: string): void {\r\n let stat: Stats;\r\n try {\r\n stat = statSync(dirPath);\r\n } catch {\r\n throw new ArgumentError(`${flag} path '${dirPath}' does not exist`);\r\n }\r\n if (!stat.isDirectory()) {\r\n throw new ArgumentError(`${flag} path '${dirPath}' is not a directory`);\r\n }\r\n}\r\n\r\n/** Assert a file has one of the allowed extensions. */\r\nfunction assertExtension(\r\n filePath: string,\r\n flag: string,\r\n ...extensions: string[]\r\n): void {\r\n const matches = extensions.some((ext) => filePath.endsWith(ext));\r\n if (!matches) {\r\n throw new ArgumentError(\r\n `${flag} expects a file with extension ${extensions.join(\" or \")} — got '${filePath}'`,\r\n );\r\n }\r\n}\r\n\r\nexport function parseArgs(rawArgs: string[]): CommandStruct {\r\n if (rawArgs.length === 0 || rawArgs[0] === \"--help\") {\r\n console.log(USAGE);\r\n exit(ExitCodes.Success);\r\n }\r\n\r\n if (rawArgs[0] === \"--version\") {\r\n console.log(VERSION);\r\n exit(ExitCodes.Success);\r\n }\r\n\r\n const command = rawArgs[0];\r\n\r\n if (!COMMANDS.has(command)) {\r\n throw new ArgumentError(`unknown command '${command}'\\n\\n${USAGE}`);\r\n }\r\n\r\n const commandData = rawArgs[1];\r\n\r\n if (!commandData || commandData.startsWith(\"--\")) {\r\n throw new ArgumentError(\r\n `command '${command}' requires an input path as its first argument\\n\\n${USAGE}`,\r\n );\r\n }\r\n\r\n const struct: CommandStruct = { command, commandData };\r\n\r\n for (let i = 2; i < rawArgs.length; i++) {\r\n const flag = rawArgs[i];\r\n\r\n if (!OPTIONS.has(flag)) {\r\n throw new ArgumentError(`unknown option '${flag}'\\n\\n${USAGE}`);\r\n }\r\n\r\n const value = rawArgs[i + 1];\r\n\r\n if (!value || value.startsWith(\"--\")) {\r\n throw new ArgumentError(`option '${flag}' requires a value`);\r\n }\r\n\r\n struct[flag as keyof CommandStruct] = value;\r\n i++; // skip the consumed value token\r\n }\r\n\r\n return struct;\r\n}\r\n\r\nexport function handleCompileCommand(mutor: Mutor, args: CommandStruct): void {\r\n const inputPath = toAbsolutePath(args.commandData);\r\n assertIsFile(inputPath, \"<input>\");\r\n\r\n const template = safeReadFile(inputPath);\r\n const compiled = mutor.compile(template);\r\n const output = compiled.toString();\r\n\r\n if (args[\"--out\"]) {\r\n const outPath = toAbsolutePath(args[\"--out\"]);\r\n\r\n // Register cleanup so a SIGINT mid-write doesn't leave a truncated file.\r\n registerCleanup(() => {\r\n try {\r\n rmSync(outPath, { force: true });\r\n } catch {\r\n /* best-effort */\r\n }\r\n });\r\n\r\n safeWriteFile(outPath, output);\r\n console.log(`Compiled → ${args[\"--out\"]}`);\r\n } else {\r\n console.log(output);\r\n }\r\n}\r\n\r\nexport async function handleBuildCommand(\r\n mutor: Mutor,\r\n args: CommandStruct,\r\n): Promise<void> {\r\n if (!args[\"--data\"]) {\r\n throw new ArgumentError(\"'build' requires a data source via --data\");\r\n }\r\n if (!args[\"--out\"]) {\r\n throw new ArgumentError(\"'build' requires an output directory via --out\");\r\n }\r\n\r\n const inputPath = toAbsolutePath(args.commandData);\r\n const dataPath = toAbsolutePath(args[\"--data\"]);\r\n const outPath = toAbsolutePath(args[\"--out\"]);\r\n\r\n assertIsDirectory(inputPath, \"<input>\");\r\n assertIsFile(dataPath, \"--data\");\r\n assertExtension(dataPath, \"--data\", \".json\");\r\n\r\n const context = safeParseJsonFile(dataPath);\r\n\r\n // Track whether we've written anything so SIGINT cleanup knows what to do.\r\n let buildStarted = false;\r\n\r\n registerCleanup(() => {\r\n if (buildStarted) {\r\n console.warn(\"\\nBuild interrupted — removing partial output...\");\r\n try {\r\n rmSync(outPath, { recursive: true, force: true });\r\n } catch {}\r\n }\r\n });\r\n\r\n buildStarted = true;\r\n await mutor.buildDir(inputPath, outPath, context);\r\n buildStarted = false; // Succeeded — don't clean up on exit.\r\n\r\n console.log(`Built → ${args[\"--out\"]}`);\r\n}\r\n\r\nexport async function handleRenderCommand(\r\n mutor: Mutor,\r\n args: CommandStruct,\r\n): Promise<void> {\r\n if (!args[\"--data\"]) {\r\n throw new ArgumentError(\"'render' requires a data source via --data\");\r\n }\r\n\r\n const inputPath = toAbsolutePath(args.commandData);\r\n const dataPath = toAbsolutePath(args[\"--data\"]);\r\n\r\n assertIsFile(inputPath, \"<input>\");\r\n assertIsFile(dataPath, \"--data\");\r\n assertExtension(dataPath, \"--data\", \".json\");\r\n\r\n const context = safeParseJsonFile(dataPath);\r\n const template = safeReadFile(inputPath);\r\n const output = mutor.render(template, context);\r\n\r\n if (args[\"--out\"]) {\r\n const outPath = toAbsolutePath(args[\"--out\"]);\r\n\r\n registerCleanup(() => {\r\n try {\r\n rmSync(outPath, { force: true });\r\n } catch {}\r\n });\r\n\r\n safeWriteFile(outPath, output);\r\n console.log(`Rendered → ${args[\"--out\"]}`);\r\n } else {\r\n console.log(output);\r\n }\r\n}\r\n\r\nlet cleanupFn: CleanupFn | null = null;\r\n\r\n/** Register a one-shot cleanup to run on SIGINT / SIGTERM. */\r\nfunction registerCleanup(fn: CleanupFn): void {\r\n cleanupFn = fn;\r\n}\r\n\r\nfunction handleSignal(signal: string): void {\r\n console.warn(`\\nReceived ${signal}.`);\r\n cleanupFn?.();\r\n exit(ExitCodes.RuntimeError);\r\n}\r\n\r\nprocess.on(\"SIGINT\", () => handleSignal(\"SIGINT\"));\r\nprocess.on(\"SIGTERM\", () => handleSignal(\"SIGTERM\"));\r\n\r\nasync function main(): Promise<void> {\r\n const args = parseArgs(argv.slice(2));\r\n\r\n const mutor = new Mutor();\r\n\r\n if (args[\"--config\"]) {\r\n const configPath = toAbsolutePath(args[\"--config\"]);\r\n assertIsFile(configPath, \"--config\");\r\n assertExtension(configPath, \"--config\", \".json\");\r\n\r\n const config = safeParseJsonFile(configPath);\r\n mutor.addConfig(config as PartialMutorConfig);\r\n }\r\n\r\n switch (args.command) {\r\n case \"compile\":\r\n handleCompileCommand(mutor, args);\r\n break;\r\n case \"build\":\r\n await handleBuildCommand(mutor, args);\r\n break;\r\n case \"render\":\r\n await handleRenderCommand(mutor, args);\r\n break;\r\n }\r\n}\r\n\r\nif (process.env.NODE_ENV !== \"test\") {\r\n main().catch((err: unknown) => {\r\n if (err instanceof CliError) {\r\n console.error(`error: ${err.message}`);\r\n exit(err.exitCode);\r\n }\r\n\r\n console.error(\"unexpected error:\", err);\r\n exit(ExitCodes.RuntimeError);\r\n });\r\n}\r\n","{\n \"name\": \"mutorjs\",\n \"version\": \"2.0.0\",\n \"description\": \"A high-performance engine for secure templating.\",\n \"homepage\": \"https://github.com/allAboutJS/Mutor.js#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/allAboutJS/Mutor.js/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/allAboutJS/Mutor.js.git\"\n },\n \"license\": \"ISC\",\n \"author\": \"Onah Victor\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"browser\": \"./dist/mutor.global.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.js\",\n \"require\": \"./dist/server.cjs\",\n \"default\": \"./dist/server.js\"\n }\n },\n \"bin\": {\n \"mutor\": \"./dist/cli.cjs\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepare\": \"husky && npm run build\",\n \"benchmarks\": \"npm run build && tsx src/__tests__/benchmarks.ts\",\n \"test\": \"jest\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.4.16\",\n \"@types/benchmark\": \"^2.1.5\",\n \"@types/ejs\": \"^3.1.5\",\n \"@types/handlebars\": \"^4.1.0\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^25.5.0\",\n \"@types/nunjucks\": \"^3.2.6\",\n \"benchmark\": \"^2.1.4\",\n \"ejs\": \"^5.0.1\",\n \"eta\": \"^4.6.0\",\n \"handlebars\": \"^4.7.8\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.3.0\",\n \"lint-staged\": \"^16.2.7\",\n \"nunjucks\": \"^3.2.4\",\n \"ts-jest\": \"^29.4.9\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.6\"\n },\n \"lint-staged\": {\n \"*.{js,ts,json}\": [\n \"biome check --write --no-errors-on-unmatched\"\n ]\n },\n \"dependencies\": {},\n \"keywords\": [\n \"Template\",\n \"Engine\",\n \"AST\",\n \"Parser\"\n ],\n \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","import { readFileSync } from \"node:fs\";\r\nimport {\r\n copyFile,\r\n mkdir,\r\n readdir,\r\n readFile,\r\n writeFile,\r\n} from \"node:fs/promises\";\r\nimport { extname, join, resolve } from \"node:path\";\r\nimport type { PartialMutorConfig, RuntimeFrame } from \"../types/types\";\r\nimport createRuntimeFrame from \"../utils/create-runtime\";\r\nimport escapeFn from \"../utils/escape-fn\";\r\nimport toAbsolutePath from \"../utils/to-absolute-path\";\r\nimport validateComputedProp from \"../utils/validate-computed-prop\";\r\nimport { MutorError, MutorRuntimeError } from \"./error\";\r\nimport MutorBase from \"./mutor.base\";\r\n\r\nexport default class MutorServer extends MutorBase {\r\n constructor(config: PartialMutorConfig = {}) {\r\n super(config);\r\n }\r\n\r\n private __resolvePath(path: string, renderedPath?: string) {\r\n const isAlias = path.startsWith(\"@/\");\r\n const root = this.__config.rootDir\r\n ? toAbsolutePath(this.__config.rootDir)\r\n : process.cwd();\r\n\r\n let resolvedPath: string;\r\n\r\n if (isAlias) {\r\n resolvedPath = join(root, path.replace(/^@\\//, \"./\"));\r\n } else if (renderedPath) {\r\n resolvedPath = toAbsolutePath(renderedPath, path);\r\n } else {\r\n resolvedPath = resolve(process.cwd(), path);\r\n }\r\n\r\n return resolvedPath;\r\n }\r\n\r\n private __setupIncludeForRuntime(runtime: RuntimeFrame) {\r\n this.__namespaces.Mutor.include = (path: string, context: any) => {\r\n const resolvedPath = this.__resolvePath(path, runtime.renderedPath);\r\n\r\n if (runtime.includeStack.has(resolvedPath)) {\r\n throw new MutorError(\r\n `Circular include detected.\\n${Array.from(runtime.includeStack).join(\"\\n\")}\\n${resolvedPath}`,\r\n );\r\n }\r\n\r\n const previousPath = runtime.renderedPath;\r\n runtime.includeStack.add(resolvedPath);\r\n runtime.renderedPath = resolvedPath;\r\n\r\n try {\r\n return this.__renderFile(\r\n resolvedPath,\r\n context ?? runtime.context,\r\n runtime,\r\n );\r\n } catch (err) {\r\n return this.__handleError(err, previousPath, path, resolvedPath);\r\n } finally {\r\n runtime.includeStack.delete(resolvedPath);\r\n runtime.renderedPath = previousPath;\r\n }\r\n };\r\n }\r\n\r\n render(template: string, context: any): string {\r\n const runtime = createRuntimeFrame(context, \"anonymous\");\r\n this.__setupIncludeForRuntime(runtime);\r\n return this.__renderWithRuntime(template, runtime);\r\n }\r\n\r\n renderAsync(template: string, context: any): Promise<string> {\r\n return new Promise((resolve) => {\r\n resolve(this.render(template, context));\r\n });\r\n }\r\n\r\n private __renderFile(path: string, context: any, runtime: RuntimeFrame) {\r\n this.__setupIncludeForRuntime(runtime);\r\n\r\n const absolutePath = this.__resolvePath(path);\r\n let compiled: Function;\r\n\r\n // Save previous state for nested renders\r\n const previousContext = runtime.context;\r\n const previousPath = runtime.renderedPath;\r\n\r\n // Update runtime for this render\r\n runtime.context = context ?? previousContext;\r\n runtime.renderedPath = absolutePath;\r\n\r\n try {\r\n if (\r\n this.__config.cache.active &&\r\n this.__compiledTemplatesMap.has(absolutePath)\r\n ) {\r\n const entry = this.__compiledTemplatesMap.get(absolutePath)!;\r\n\r\n compiled = entry.fn;\r\n\r\n // Move to the front of the cache\r\n this.__compiledTemplatesMap.delete(absolutePath);\r\n this.__compiledTemplatesMap.set(absolutePath, entry);\r\n } else {\r\n const template = readFileSync(absolutePath, \"utf-8\");\r\n compiled = this.__compile(template, runtime);\r\n\r\n if (this.__config.cache.active) {\r\n const templateSize = template.length * 2 + 500;\r\n\r\n if (this.__cacheSize + templateSize > this.__config.cache.maxSize) {\r\n if (this.__createEntrySpaceForTemplate(templateSize)) {\r\n this.__compiledTemplatesMap.set(absolutePath, {\r\n fn: compiled,\r\n size: templateSize,\r\n });\r\n this.__cacheSize += templateSize;\r\n }\r\n } else {\r\n this.__compiledTemplatesMap.set(absolutePath, {\r\n fn: compiled,\r\n size: templateSize,\r\n });\r\n this.__cacheSize += templateSize;\r\n }\r\n }\r\n }\r\n\r\n const result = compiled(\r\n runtime.context,\r\n this.__createNamespacesWithRuntime(runtime),\r\n this.__config.allowedProps,\r\n this.__config.forbiddenProps,\r\n escapeFn,\r\n validateComputedProp,\r\n MutorRuntimeError,\r\n );\r\n\r\n return result;\r\n } finally {\r\n // Restore previous state\r\n runtime.context = previousContext;\r\n runtime.renderedPath = previousPath;\r\n }\r\n }\r\n\r\n renderFile(path: string, context: any): string {\r\n return this.__renderFile(path, context, createRuntimeFrame(null, path));\r\n }\r\n\r\n renderFileAsync(path: string, context: any): Promise<string> {\r\n return new Promise((resolve) => {\r\n resolve(this.renderFile(path, context));\r\n });\r\n }\r\n\r\n invalidateCacheEntry(path: string) {\r\n const absolutePath = this.__resolvePath(path);\r\n const entry = this.__compiledTemplatesMap.get(absolutePath);\r\n\r\n if (!entry) {\r\n return false;\r\n }\r\n\r\n this.__cacheSize -= entry.size;\r\n this.__compiledTemplatesMap.delete(absolutePath);\r\n return true;\r\n }\r\n\r\n async buildDir(src: string, destination: string, context: any) {\r\n const absoluteDestinationPath = toAbsolutePath(destination);\r\n const absoluteSrcPath = toAbsolutePath(src);\r\n\r\n await mkdir(absoluteDestinationPath, { recursive: true });\r\n\r\n const entries = await readdir(absoluteSrcPath, { withFileTypes: true });\r\n await Promise.all(\r\n entries.map(async (entry) => {\r\n const srcPath = join(absoluteSrcPath, entry.name);\r\n const destinationPath = join(absoluteDestinationPath, entry.name);\r\n\r\n if (this.__config.build.exclude.has(entry.name)) {\r\n return;\r\n }\r\n\r\n if (entry.isDirectory()) {\r\n return this.buildDir(srcPath, destinationPath, context);\r\n }\r\n\r\n const extension = extname(srcPath);\r\n\r\n if (this.__config.build.include.has(extension)) {\r\n const rendered = this.renderFile(srcPath, context);\r\n await writeFile(destinationPath, rendered, \"utf-8\");\r\n } else {\r\n return await copyFile(srcPath, destinationPath);\r\n }\r\n }),\r\n );\r\n }\r\n\r\n async compileDir(src: string) {\r\n const absolutePath = toAbsolutePath(src);\r\n const entries = await readdir(absolutePath, { withFileTypes: true });\r\n\r\n await Promise.all(\r\n entries.map(async (entry) => {\r\n const absoluteSrcPath = join(absolutePath, entry.name);\r\n\r\n if (this.__config.build.exclude.has(entry.name)) {\r\n return;\r\n }\r\n\r\n if (entry.isDirectory()) {\r\n return this.compileDir(absoluteSrcPath);\r\n }\r\n\r\n const extension = extname(absoluteSrcPath);\r\n\r\n if (this.__config.build.include.has(extension)) {\r\n const template = await readFile(absoluteSrcPath, \"utf-8\");\r\n this.__register(absoluteSrcPath, template);\r\n }\r\n }),\r\n );\r\n }\r\n}\r\n","import type { RuntimeFrame } from \"../types/types\";\r\n\r\nexport default function createRuntimeFrame(\r\n context: any,\r\n renderedPath: string = \"\",\r\n): RuntimeFrame {\r\n return {\r\n context,\r\n renderedPath,\r\n includeStack: new Set([renderedPath && renderedPath]),\r\n };\r\n}\r\n","/**\r\n * Creates a visual text-based pointer `^`.\r\n * @param pos The position in the text to be pointed at.\r\n * @param offset The offset to the left to compensate for line numbering.\r\n * @returns\r\n */\r\nexport default function constructPointer(pos: number, offset: number) {\r\n // pos is the index in the text, offset is the width of \"Line | \"\r\n return `${\" \".repeat(pos + offset)}^`;\r\n}\r\n","import constructPointer from \"../utils/construct-pointer\";\r\n\r\nexport class MutorError extends Error {\r\n public name = \"MutorError\";\r\n constructor(message: string) {\r\n super(message);\r\n Object.setPrototypeOf(this, MutorError.prototype);\r\n }\r\n}\r\n\r\nexport class MutorCompilerError extends MutorError {\r\n public name = \"MutorCompilerError\";\r\n\r\n constructor(\r\n message: string,\r\n line: number,\r\n lineText: string,\r\n column: number, // 0-indexed column from snapshot\r\n file: string,\r\n ) {\r\n // Dynamic gutter width for alignment\r\n const gutterWidth = line.toString().length + 2;\r\n let report = `${message}\\n\\n`;\r\n\r\n report += `at ${file}:${line}:${column + 1}\\n`;\r\n\r\n // Line snippet with gutter\r\n if (line > 1) {\r\n report += `${(line - 1).toString().padStart(gutterWidth - 2)} | ...\\n`;\r\n }\r\n\r\n report += `${line} | ${lineText}\\n`;\r\n // Visual Pointer\r\n report += constructPointer(column, gutterWidth + 1);\r\n\r\n super(report);\r\n Object.setPrototypeOf(this, MutorCompilerError.prototype);\r\n }\r\n}\r\n\r\nexport class MutorRuntimeError extends MutorCompilerError {}\r\n","import type { MutorConfig } from \"../types/types\";\r\nimport { MutorError } from \"./error\";\r\n\r\nexport const keywords = new Set([\r\n \"for\",\r\n \"if\",\r\n \"else\",\r\n \"true\",\r\n \"false\",\r\n \"null\",\r\n \"undefined\",\r\n \"endif\",\r\n \"endfor\",\r\n \"in\",\r\n \"of\",\r\n \"break\",\r\n \"continue\",\r\n]);\r\n\r\nexport const operators = new Set([\r\n \"::\",\r\n \"||\",\r\n \"??\",\r\n \"&&\",\r\n \"**\",\r\n \"^\",\r\n \"|\",\r\n \"&\",\r\n \"!\",\r\n \"-\",\r\n \"%\",\r\n \"+\",\r\n \"*\",\r\n \"/\",\r\n \">\",\r\n \"<\",\r\n \">=\",\r\n \"<=\",\r\n \"==\",\r\n \"!=\",\r\n \">>\",\r\n \"<<\",\r\n \".\",\r\n \"?.\",\r\n \"(\",\r\n \")\",\r\n \"[\",\r\n \"]\",\r\n \",\",\r\n \":\",\r\n \"?\",\r\n]);\r\n\r\nexport const logicalOperators = new Set([\"&&\", \"||\", \"??\"]);\r\n\r\nexport const equalityOperators = new Set([\"==\", \"!=\"]);\r\n\r\nexport const comparisonOperators = new Set([\">\", \"<\", \">=\", \"<=\"]);\r\n\r\nexport const bitwiseOperators = new Set([\">>\", \"<<\", \"^\", \"|\", \"&\"]);\r\n\r\nexport const additiveOperators = new Set([\"+\", \"-\"]);\r\n\r\nexport const multiplicativeOperators = new Set([\"*\", \"/\", \"%\"]);\r\n\r\nexport const propertyAccessOperators = new Set([\".\", \"?.\", \"[\", \"::\"]);\r\n\r\nexport const unaryOperators = new Set([\"-\", \"+\", \"!\"]);\r\n\r\nexport const bitwiseOrOperators = new Set([\"|\"]);\r\n\r\nexport const bitwiseXorOperators = new Set([\"^\"]);\r\n\r\nexport const bitwiseAndOperators = new Set([\"&\"]);\r\n\r\nexport const exponentiationOperators = new Set([\"**\"]);\r\n\r\nexport const ESCAPE_MAP: Record<string, string> = {\r\n \"&\": \"&amp;\",\r\n \"<\": \"&lt;\",\r\n \">\": \"&gt;\",\r\n '\"': \"&quot;\",\r\n \"'\": \"&#39;\",\r\n};\r\n\r\nexport const defaultConfig: MutorConfig = {\r\n build: {\r\n include: new Set([\".html\", \".txt\"]),\r\n exclude: new Set([\"node_modules\", \".git\"]),\r\n },\r\n autoEscape: true,\r\n allowedProps: new Set(),\r\n forbiddenProps: new Set([\r\n \"__proto__\",\r\n \"constructor\",\r\n \"prototype\",\r\n \"__defineGetter__\",\r\n \"__defineSetter__\",\r\n \"__lookupGetter__\",\r\n \"__lookupSetter__\",\r\n \"caller\",\r\n \"callee\",\r\n \"arguments\",\r\n ]),\r\n allowFnCalls: false,\r\n delimiters: {\r\n closingTag: \"}}\",\r\n openingTag: \"{{\",\r\n openingTagEscape: \"\\\\\",\r\n whitespaceTrim: \"~\",\r\n commentTag: \"#\",\r\n },\r\n preserveEscapeDelimiter: false,\r\n onIncludeFail: \"throw\",\r\n cache: {\r\n active: true,\r\n maxSize: 50 * 1024 * 1024, // 50MB\r\n },\r\n debugRuntimeErrors: false,\r\n};\r\n\r\nexport const namespaces = {\r\n JSON: {\r\n stringify(value: any, space?: number) {\r\n return JSON.stringify(value, null, space);\r\n },\r\n\r\n parse(str: string) {\r\n return JSON.parse(str);\r\n },\r\n },\r\n\r\n Object: {\r\n keys(obj: object) {\r\n return Object.keys(obj);\r\n },\r\n\r\n values(obj: object) {\r\n return Object.values(obj);\r\n },\r\n\r\n entries(obj: object) {\r\n return Object.entries(obj);\r\n },\r\n\r\n hasOwn(obj: object, key: any) {\r\n return Object.hasOwn(obj, key);\r\n },\r\n\r\n fromEntries(entries: Iterable<readonly [PropertyKey, any]>) {\r\n return Object.fromEntries(entries);\r\n },\r\n\r\n pick(obj: Record<string, any>, keys: string[]) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::pick expects an object\");\r\n }\r\n\r\n if (!Array.isArray(keys)) {\r\n throw new MutorError(\"Object::pick expects an array of keys\");\r\n }\r\n\r\n const result: Record<string, any> = {};\r\n\r\n for (const key of keys) {\r\n if (Object.hasOwn(obj, key)) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n omit(obj: Record<string, any>, keys: string[]) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::omit expects an object\");\r\n }\r\n\r\n if (!Array.isArray(keys)) {\r\n throw new MutorError(\"Object::omit expects an array of keys\");\r\n }\r\n\r\n const result = { ...obj };\r\n\r\n for (const key of keys) {\r\n delete result[key];\r\n }\r\n\r\n return result;\r\n },\r\n },\r\n\r\n Array: {\r\n isArray(value: any) {\r\n return Array.isArray(value);\r\n },\r\n\r\n from(value: any) {\r\n return Array.from(value);\r\n },\r\n\r\n of(...args: any[]) {\r\n return Array.of(...args);\r\n },\r\n\r\n unique(arr: any[]) {\r\n if (!Array.isArray(arr)) {\r\n throw new MutorError(\"Array::unique expects an array\");\r\n }\r\n\r\n return [...new Set(arr)];\r\n },\r\n\r\n compact(arr: any[]) {\r\n if (!Array.isArray(arr)) {\r\n throw new MutorError(\"Array::compact expects an array\");\r\n }\r\n\r\n return arr.filter(Boolean);\r\n },\r\n\r\n chunk(arr: any[], size: number) {\r\n if (!Array.isArray(arr)) {\r\n throw new MutorError(\"Array::chunk expects an array\");\r\n }\r\n\r\n if (!Number.isInteger(size) || size <= 0) {\r\n throw new MutorError(\"Array::chunk expects a positive integer size\");\r\n }\r\n\r\n const result = [];\r\n\r\n for (let i = 0; i < arr.length; i += size) {\r\n result.push(arr.slice(i, i + size));\r\n }\r\n\r\n return result;\r\n },\r\n\r\n range(start: number, end: number, step = 1) {\r\n if (\r\n !Number.isFinite(start) ||\r\n !Number.isFinite(end) ||\r\n !Number.isFinite(step)\r\n ) {\r\n throw new MutorError(\"Array::range expects finite numbers\");\r\n }\r\n if (step === 0) {\r\n throw new MutorError(\"Array::range step cannot be 0\");\r\n }\r\n\r\n // Validate directionality to prevent infinite loops\r\n if ((start <= end && step < 0) || (start > end && step > 0)) {\r\n throw new MutorError(\r\n \"Invalid step direction: step must match range direction\",\r\n );\r\n }\r\n\r\n const result = [];\r\n for (let i = start; start <= end ? i <= end : i >= end; i += step) {\r\n result.push(i);\r\n }\r\n\r\n return result;\r\n },\r\n },\r\n\r\n Number: {\r\n isFinite(value: number) {\r\n return Number.isFinite(value);\r\n },\r\n\r\n isNaN(value: any) {\r\n return Number.isNaN(value);\r\n },\r\n\r\n isInteger(value: any) {\r\n return Number.isInteger(value);\r\n },\r\n\r\n parseInt(value: string, radix = 10) {\r\n return Number.parseInt(value, radix);\r\n },\r\n\r\n parseFloat(value: string) {\r\n return Number.parseFloat(value);\r\n },\r\n\r\n clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n },\r\n\r\n toFixed(value: number, digits = 0) {\r\n return value.toFixed(digits);\r\n },\r\n\r\n random(min = 0, max = 1) {\r\n return Math.random() * (max - min) + min;\r\n },\r\n },\r\n\r\n String: {\r\n fromCharCode(...args: number[]) {\r\n return String.fromCharCode(...args);\r\n },\r\n\r\n capitalize(value: string) {\r\n if (typeof value !== \"string\") {\r\n throw new MutorError(\"String::capitalize expects a string\");\r\n }\r\n\r\n if (!value.length) {\r\n return value;\r\n }\r\n\r\n return value[0].toUpperCase() + value.slice(1);\r\n },\r\n },\r\n\r\n Math: {\r\n abs(x: number) {\r\n return Math.abs(x);\r\n },\r\n\r\n floor(x: number) {\r\n return Math.floor(x);\r\n },\r\n\r\n ceil(x: number) {\r\n return Math.ceil(x);\r\n },\r\n\r\n round(x: number) {\r\n return Math.round(x);\r\n },\r\n\r\n trunc(x: number) {\r\n return Math.trunc(x);\r\n },\r\n\r\n sign(x: number) {\r\n return Math.sign(x);\r\n },\r\n\r\n sqrt(x: number) {\r\n return Math.sqrt(x);\r\n },\r\n\r\n pow(base: number, exponent: number) {\r\n return base ** exponent;\r\n },\r\n\r\n max(...args: number[]) {\r\n return Math.max(...args);\r\n },\r\n\r\n min(...args: number[]) {\r\n return Math.min(...args);\r\n },\r\n\r\n random() {\r\n return Math.random();\r\n },\r\n\r\n PI: Math.PI,\r\n },\r\n\r\n Date: {\r\n now() {\r\n return Date.now();\r\n },\r\n\r\n parse(str: string) {\r\n return Date.parse(str);\r\n },\r\n\r\n new(date?: string | number) {\r\n if (date === undefined) {\r\n return new Date();\r\n }\r\n\r\n return new Date(date);\r\n },\r\n\r\n iso(date?: string | number | Date) {\r\n const d = new Date(date ?? Date.now());\r\n return d.toISOString();\r\n },\r\n\r\n timestamp(date?: string | number | Date) {\r\n return new Date(date ?? Date.now()).getTime();\r\n },\r\n },\r\n\r\n Boolean: {\r\n valueOf(value: any) {\r\n return Boolean(value);\r\n },\r\n },\r\n\r\n URL: {\r\n encode(value: string) {\r\n return encodeURIComponent(value);\r\n },\r\n\r\n decode(value: string) {\r\n return decodeURIComponent(value);\r\n },\r\n },\r\n};\r\n\r\nexport const AsyncFunction = (async () => {})\r\n .constructor as FunctionConstructor;\r\n","import { ESCAPE_MAP } from \"../core/constants\";\r\n\r\n/**\r\n * Escapes HTML special characters in a string.\r\n * @param e The value to escape.\r\n * @returns The escaped string or the original value if not a string.\r\n */\r\nexport default function escapeFn(e: unknown): unknown {\r\n if (typeof e !== \"string\") return e;\r\n return /[&<>\"']/.test(e)\r\n ? e.replace(/[&<>\"']/g, (char) => ESCAPE_MAP[char])\r\n : e;\r\n}\r\n","import { dirname, isAbsolute, resolve } from \"node:path\";\r\n\r\nexport default function toAbsolutePath(\r\n basePath: string,\r\n ...relativePaths: string[]\r\n) {\r\n const absoluteBase = isAbsolute(basePath)\r\n ? basePath\r\n : resolve(process.cwd(), basePath);\r\n\r\n if (relativePaths.length) {\r\n const baseDir = dirname(absoluteBase);\r\n return resolve(baseDir, ...relativePaths);\r\n }\r\n\r\n return absoluteBase;\r\n}\r\n","import { MutorError } from \"../core/error\";\n\nexport default function validateComputedProp(\n value: unknown,\n allowedProps: Set<string | number>,\n forbiddenProps: Set<string | number>,\n): string | number {\n if (typeof value !== \"string\" && typeof value !== \"number\") {\n throw new MutorError(\"Computed property keys must be strings or numbers.\");\n }\n\n if (forbiddenProps.has(value) && !allowedProps.has(value)) {\n throw new MutorError(\n `Forbidden property access.\\nAccess to this computed property '${value}' is forbidden.`,\n );\n }\n\n return value;\n}\n","export default function escapeRawText(text: string) {\r\n return text.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\r\n}\r\n","/**\r\n * Counts the number of lines that comes before a given index, effectively returning the line and column numbers of the character at that index.\r\n * @param str The source string.\r\n * @param idx The index to find its line number.\r\n */\r\nexport default function getLineAndColumnNumbers(str: string, idx: number) {\r\n const lines = str.slice(0, idx).split(\"\\n\");\r\n const line = lines.length;\r\n // The index where the current line starts\r\n const lineIndex = str.lastIndexOf(\"\\n\", idx - 1) + 1;\r\n\r\n return [line, lineIndex];\r\n}\r\n","/**\r\n * Extracts the snapshot of a line from a given text.\r\n * @param str The source string.\r\n * @param lineIdx The index of the newline character to snap.\r\n */\r\nexport default function getLineSnapshot(str: string, lineIdx: number) {\r\n const nextNewlineIdx = str.indexOf(\"\\n\", lineIdx);\r\n const line = str\r\n .slice(lineIdx, nextNewlineIdx === -1 ? undefined : nextNewlineIdx)\r\n .replaceAll(\"\\t\", \" \");\r\n\r\n return line;\r\n}\r\n","export default function isEscaped(\r\n src: string,\r\n index: number,\r\n escapeToken: string,\r\n) {\r\n let j = index;\r\n let count = 0;\r\n const escapeLength = escapeToken.length;\r\n\r\n while (j > 0 && src.slice(j - escapeToken.length, j) === escapeToken) {\r\n count++;\r\n j -= escapeLength;\r\n }\r\n\r\n return (count & 1) === 1;\r\n}\r\n","import { ExprType, LoopType } from \"../types/enums\";\r\nimport type {\r\n BuildContext,\r\n BuildState,\r\n CallExpr,\r\n ElseIfExpr,\r\n Expr,\r\n ForExpr,\r\n IdentExpr,\r\n IfExpr,\r\n NamespaceExpr,\r\n PropAccessExpr,\r\n} from \"../types/types\";\r\nimport escapeRawText from \"../utils/escape-raw-text\";\r\n\r\nconst BACKTICK_REGEX = /^`|`$/gm;\r\n\r\nfunction prefixWithCtx(state: BuildState, expr: IdentExpr): string {\r\n if (\r\n state.forbiddenProps.has(expr.value) &&\r\n !state.allowedProps.has(expr.value)\r\n ) {\r\n throw { message: `Property \"${expr.value}\" is forbidden.`, pos: expr.pos };\r\n }\r\n\r\n return state.scope.includes(expr.value) ? expr.value : `ctx.${expr.value}`;\r\n}\r\n\r\nfunction buildNamespace(state: BuildState, expr: NamespaceExpr): string {\r\n const leftValue = (expr.left as IdentExpr).value;\r\n const rightValue = (expr.right as IdentExpr).value;\r\n\r\n if (\r\n (state.forbiddenProps.has(leftValue) &&\r\n !state.allowedProps.has(leftValue)) ||\r\n (state.forbiddenProps.has(rightValue) &&\r\n !state.allowedProps.has(rightValue))\r\n ) {\r\n throw { message: \"Forbidden namespace access.\", pos: expr.pos };\r\n }\r\n\r\n return `namespaces.${leftValue}.${rightValue}`;\r\n}\r\n\r\nfunction buildPropAccess(state: BuildState, expr: PropAccessExpr): string {\r\n const left = buildExpr(state, expr.left);\r\n const optionalChain = expr.optional ? \"?.\" : \"\";\r\n\r\n if (expr.bracketNotation) {\r\n const right = buildExpr(state, expr.right);\r\n\r\n if (\r\n expr.right.type === ExprType.STRING &&\r\n state.forbiddenProps.has(right.replaceAll(BACKTICK_REGEX, \"\")) &&\r\n !state.allowedProps.has(right.replaceAll(BACKTICK_REGEX, \"\"))\r\n ) {\r\n throw {\r\n message: \"Forbidden property access.\",\r\n pos: expr.right.pos,\r\n };\r\n }\r\n\r\n return expr.right.type === ExprType.STRING ||\r\n expr.right.type === ExprType.NUMBER\r\n ? `${left}${optionalChain}[${right}]`\r\n : `${left}${optionalChain}[validateComputedProps(${right}, allowedProps, forbiddenProps)]`;\r\n }\r\n\r\n const propName = (expr.right as IdentExpr).value;\r\n\r\n if (state.forbiddenProps.has(propName) && !state.allowedProps.has(propName)) {\r\n throw { message: \"Forbidden property access.\", pos: expr.right.pos };\r\n }\r\n\r\n return `${left}${optionalChain || \".\"}${propName}`;\r\n}\r\n\r\nfunction buildCall(state: BuildState, expr: CallExpr): string {\r\n const func = buildExpr(state, expr.expr);\r\n const optionalChain = expr.optional ? \"?.\" : \"\";\r\n const args = (expr.args as Expr[])\r\n .map((arg: Expr) => buildExpr(state, arg))\r\n .join(\", \");\r\n\r\n return `${func}${optionalChain}(${args})`;\r\n}\r\n\r\nfunction buildForLoop(state: BuildState, expr: ForExpr): string {\r\n const { iterable, loopType, variable, secondaryVariable } = expr;\r\n const loopOperator = loopType === LoopType.IN ? \"in\" : \"of\";\r\n const iterableValue = build(iterable, state.context);\r\n\r\n if (loopOperator === \"of\") {\r\n return `for(let $__i=0,$__iterable=${iterableValue};$__i<$__iterable.length;$__i++){const ${variable}=$__iterable[$__i];${secondaryVariable ? `const ${secondaryVariable}=$__i;` : \"\"}`;\r\n }\r\n\r\n return secondaryVariable\r\n ? `for(const [${variable}, ${secondaryVariable}] of Object.entries(${iterableValue})){`\r\n : `for(const ${variable} in ${iterableValue}){`;\r\n}\r\n\r\nfunction buildIfBlock(state: BuildState, expr: IfExpr): string {\r\n const { condition } = expr;\r\n return `if(${build(condition, state.context)}){`;\r\n}\r\n\r\nfunction buildElseIfBlock(state: BuildState, expr: ElseIfExpr): string {\r\n const { condition } = expr;\r\n return `}else if(${build(condition, state.context)}){`;\r\n}\r\n\r\nfunction buildExpr(state: BuildState, expr: Expr): string {\r\n const { type } = expr;\r\n\r\n if (type === ExprType.NUMBER) return expr.value;\r\n if (type === ExprType.NULL) return \"null\";\r\n if (type === ExprType.UNDEFINED) return \"undefined\";\r\n if (type === ExprType.BOOLEAN) return (expr as any).true ? \"true\" : \"false\";\r\n\r\n switch (type) {\r\n case ExprType.END:\r\n return \"}\";\r\n\r\n case ExprType.STRING:\r\n return `\\`${/[$`\\\\]/.test(expr.value) ? escapeRawText(expr.value) : expr.value}\\``;\r\n\r\n case ExprType.IDENT:\r\n return prefixWithCtx(state, expr);\r\n\r\n case ExprType.GROUP:\r\n return `(${buildExpr(state, (expr as any).expr)})`;\r\n\r\n case ExprType.UNARY: {\r\n const { operator, expr: innerExpr } = expr as any;\r\n return `${operator}${buildExpr(state, innerExpr)}`;\r\n }\r\n\r\n case ExprType.BINARY: {\r\n const { left, operator, right } = expr as any;\r\n return `${buildExpr(state, left)} ${operator} ${buildExpr(state, right)}`;\r\n }\r\n\r\n case ExprType.TERNARY: {\r\n const { condition, left, right } = expr as any;\r\n return `${buildExpr(state, condition)} ? ${buildExpr(state, left)} : ${buildExpr(state, right)}`;\r\n }\r\n\r\n case ExprType.PROP_ACCESS:\r\n return buildPropAccess(state, expr as PropAccessExpr);\r\n\r\n case ExprType.CALL:\r\n return buildCall(state, expr as CallExpr);\r\n\r\n case ExprType.NAMESPACE:\r\n return buildNamespace(state, expr as NamespaceExpr);\r\n\r\n case ExprType.FOR:\r\n return buildForLoop(state, expr as ForExpr);\r\n\r\n case ExprType.ELSE:\r\n return \"} else {\";\r\n\r\n case ExprType.IF:\r\n return buildIfBlock(state, expr as IfExpr);\r\n\r\n case ExprType.ELSE_IF:\r\n return buildElseIfBlock(state, expr as ElseIfExpr);\r\n\r\n case ExprType.BREAK:\r\n return \"break;\";\r\n\r\n case ExprType.CONTINUE:\r\n return \"continue;\";\r\n }\r\n}\r\n\r\nexport default function build(ast: Expr, context: BuildContext): string {\r\n const state: BuildState = {\r\n scope: context.scope,\r\n forbiddenProps: context.forbiddenProps,\r\n allowedProps: context.allowedProps,\r\n context,\r\n };\r\n\r\n const result = buildExpr(state, ast);\r\n return result.includes(\"namespaces.Mutor.await\")\r\n ? result.replaceAll(\r\n \"namespaces.Mutor.await\",\r\n \"await namespaces.Mutor.await\",\r\n )\r\n : result;\r\n}\r\n","import { TokenType } from \"../types/enums\";\r\n\r\nexport function getTokenTypeWords(type: TokenType) {\r\n switch (type) {\r\n case TokenType.IDENT:\r\n return \"identifier\";\r\n\r\n case TokenType.KEYWORD:\r\n return \"keyword\";\r\n\r\n case TokenType.NUMBER:\r\n return \"number\";\r\n\r\n case TokenType.OPERATOR:\r\n return \"operator\";\r\n\r\n case TokenType.STRING:\r\n return \"string\";\r\n }\r\n}\r\n","import { ExprType, LoopType, TokenType } from \"../types/enums\";\r\nimport type {\r\n ElseExpr,\r\n ElseIfExpr,\r\n Expr,\r\n ForExpr,\r\n IdentExpr,\r\n IfExpr,\r\n ParseState,\r\n Token,\r\n} from \"../types/types\";\r\nimport { getTokenTypeWords } from \"../utils/get-token-type-words\";\r\nimport {\r\n additiveOperators,\r\n bitwiseAndOperators,\r\n bitwiseOperators,\r\n bitwiseOrOperators,\r\n bitwiseXorOperators,\r\n comparisonOperators,\r\n equalityOperators,\r\n exponentiationOperators,\r\n multiplicativeOperators,\r\n propertyAccessOperators,\r\n unaryOperators,\r\n} from \"./constants\";\r\n\r\nfunction expectOrThrow(state: ParseState, type: TokenType): Token;\r\nfunction expectOrThrow(\r\n state: ParseState,\r\n type: TokenType,\r\n value: string,\r\n): Token;\r\nfunction expectOrThrow(\r\n state: ParseState,\r\n type: TokenType,\r\n value?: string,\r\n): Token {\r\n const token = state.tokens[state.cursor];\r\n const lastToken = state.tokens[state.tokens.length - 1];\r\n\r\n if (!token) {\r\n const article = value\r\n ? `'${value}'`\r\n : `${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)}`;\r\n throw {\r\n message: `Unexpected end of expression. Expected ${article}.`,\r\n pos: lastToken.pos + lastToken.value.length - 1,\r\n };\r\n }\r\n\r\n if (token.type !== type) {\r\n throw {\r\n message: `Unexpected token type. Expected ${value ? `'${value}'` : getTokenTypeWords(type)} but got ${getTokenTypeWords(token.type)} instead.`,\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n if (value !== undefined && token.value !== value) {\r\n throw {\r\n message: `Unexpected token '${token.value}'. Expected ${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)} instead.`,\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n return state.tokens[state.cursor++];\r\n}\r\n\r\nfunction parseForLoop(state: ParseState): ForExpr {\r\n const pos = state.tokens[state.cursor - 1].pos;\r\n const variable = expectOrThrow(state, TokenType.IDENT).value;\r\n let secondaryVariable: string | undefined;\r\n let token: Token;\r\n\r\n if (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \",\"\r\n ) {\r\n state.cursor++;\r\n secondaryVariable = expectOrThrow(state, TokenType.IDENT).value;\r\n }\r\n\r\n try {\r\n token = expectOrThrow(state, TokenType.KEYWORD, \"in\");\r\n } catch {\r\n token = expectOrThrow(state, TokenType.KEYWORD, \"of\");\r\n }\r\n\r\n const loopType = token.value === \"in\" ? LoopType.IN : LoopType.OF;\r\n const iterable = parseTernaryExpr(state);\r\n\r\n return {\r\n type: ExprType.FOR,\r\n loopType,\r\n iterable,\r\n variable,\r\n secondaryVariable,\r\n pos,\r\n };\r\n}\r\n\r\nfunction parseIfExpression(state: ParseState): IfExpr {\r\n const condition = parseTernaryExpr(state);\r\n return { condition, pos: condition.pos, type: ExprType.IF };\r\n}\r\n\r\nfunction parseElseExpression(state: ParseState): ElseExpr | ElseIfExpr {\r\n const pos = state.tokens[state.cursor - 1].pos;\r\n\r\n try {\r\n expectOrThrow(state, TokenType.KEYWORD, \"if\");\r\n return { ...parseIfExpression(state), type: ExprType.ELSE_IF, pos };\r\n } catch {\r\n return { type: ExprType.ELSE, pos };\r\n }\r\n}\r\n\r\nfunction extractFnArgs(state: ParseState): Expr[] {\r\n const args: Expr[] = [];\r\n\r\n if (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \")\"\r\n ) {\r\n return args;\r\n }\r\n\r\n args.push(parseTernaryExpr(state));\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \",\"\r\n ) {\r\n state.cursor++;\r\n args.push(parseTernaryExpr(state));\r\n }\r\n\r\n return args;\r\n}\r\n\r\nfunction parsePrimaryExpr(state: ParseState): Expr {\r\n const token = state.tokens[state.cursor++];\r\n\r\n if (!token) {\r\n throw {\r\n message: \"Unexpected end of expression.\",\r\n pos: state.tokens[state.tokens.length - 1].pos,\r\n };\r\n }\r\n\r\n if (token.type === TokenType.NUMBER) {\r\n return { type: ExprType.NUMBER, value: token.value, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.STRING) {\r\n return { type: ExprType.STRING, value: token.value, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.KEYWORD) {\r\n if (token.value === \"for\" && state.cursor === 1) {\r\n return parseForLoop(state);\r\n }\r\n\r\n if (token.value === \"true\") {\r\n return { type: ExprType.BOOLEAN, true: true, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"false\") {\r\n return { type: ExprType.BOOLEAN, true: false, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"undefined\") {\r\n return { type: ExprType.UNDEFINED, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"null\") {\r\n return { type: ExprType.NULL, pos: token.pos };\r\n }\r\n\r\n if (\r\n (token.value === \"endif\" || token.value === \"endfor\") &&\r\n state.tokens.length === 1\r\n ) {\r\n return { type: ExprType.END, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"if\" && state.cursor === 1) {\r\n return parseIfExpression(state);\r\n }\r\n\r\n if (token.value === \"break\" && state.tokens.length === 1) {\r\n return { type: ExprType.BREAK, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"continue\" && state.tokens.length === 1) {\r\n return { type: ExprType.CONTINUE, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"else\" && state.cursor === 1) {\r\n return parseElseExpression(state);\r\n }\r\n }\r\n\r\n if (token.type === TokenType.IDENT) {\r\n return { type: ExprType.IDENT, value: token.value, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.OPERATOR && token.value === \"(\") {\r\n const expr = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \")\");\r\n return { type: ExprType.GROUP, expr, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.OPERATOR && unaryOperators.has(token.value)) {\r\n const expr = parsePropertyAccess(state);\r\n return {\r\n type: ExprType.UNARY,\r\n operator: token.value,\r\n expr,\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n throw {\r\n message: `Unexpected token '${token.value}'.`,\r\n pos: token.pos,\r\n };\r\n}\r\n\r\nfunction parsePropertyIdentifier(state: ParseState): IdentExpr {\r\n const token = state.tokens[state.cursor++];\r\n\r\n if (\r\n !token ||\r\n (token.type !== TokenType.IDENT && token.type !== TokenType.KEYWORD)\r\n ) {\r\n throw {\r\n message: \"Expected an identifier after property access.\",\r\n pos: token?.pos ?? state.tokens[state.cursor - 2].pos,\r\n };\r\n }\r\n\r\n return { type: ExprType.IDENT, value: token.value, pos: token.pos };\r\n}\r\n\r\nfunction parsePropertyAccess(state: ParseState): Expr {\r\n let left = parsePrimaryExpr(state);\r\n\r\n while (state.tokens[state.cursor]) {\r\n const token = state.tokens[state.cursor];\r\n\r\n if (token?.type === TokenType.OPERATOR && token?.value === \"(\") {\r\n state.cursor++;\r\n\r\n // Only allow function calls for namespaces by default\r\n if (!state.config.allowFnCalls && left.type !== ExprType.NAMESPACE) {\r\n throw {\r\n message: \"Function calls are not allowed.\",\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n const args = extractFnArgs(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \")\");\r\n\r\n left = {\r\n type: ExprType.CALL,\r\n expr: left,\r\n args,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (\r\n token?.type === TokenType.OPERATOR &&\r\n token?.value === \"?.\" &&\r\n state.tokens[state.cursor + 1]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor + 1]?.value === \"(\"\r\n ) {\r\n // Only allow function calls for namespaces by default\r\n if (!state.config.allowFnCalls && left.type !== ExprType.NAMESPACE) {\r\n throw {\r\n message: \"Function calls are not allowed.\",\r\n pos: state.tokens[state.cursor + 1].pos,\r\n };\r\n }\r\n\r\n // Move cursor to the postion of the first argument\r\n state.cursor += 2;\r\n\r\n const args = extractFnArgs(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \")\");\r\n\r\n left = {\r\n type: ExprType.CALL,\r\n expr: left,\r\n args,\r\n optional: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (\r\n token?.type === TokenType.OPERATOR &&\r\n propertyAccessOperators.has(token?.value)\r\n ) {\r\n const isNamespace = token.value === \"::\";\r\n const isBracketNotation = token.value === \"[\";\r\n const isOptional = token.value === \"?.\";\r\n\r\n state.cursor++;\r\n\r\n if (\r\n isNamespace &&\r\n (state.tokens[state.cursor - 2]?.type !== TokenType.IDENT ||\r\n state.tokens[state.cursor]?.type !== TokenType.IDENT)\r\n ) {\r\n throw {\r\n message: `Invalid namespaces access. Expected syntax <IDENTIFIER>::<IDENTIFIER>, but got '${state.tokens[state.cursor - 2]?.value}::${state.tokens[state.cursor]?.value ?? \"\"}' instead.`,\r\n pos:\r\n state.tokens[state.cursor]?.pos ??\r\n state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n if (isNamespace) {\r\n const right = parsePrimaryExpr(state);\r\n\r\n left = {\r\n type: ExprType.NAMESPACE,\r\n left,\r\n right,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (isBracketNotation) {\r\n const right = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\r\n\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n bracketNotation: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (isOptional) {\r\n if (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"[\"\r\n ) {\r\n state.cursor++;\r\n const right = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\r\n\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n bracketNotation: true,\r\n optional: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else {\r\n const right = parsePropertyIdentifier(state);\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n optional: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n } else {\r\n const right = parsePropertyIdentifier(state);\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseBinaryExpr(\r\n state: ParseState,\r\n leftParser: (state: ParseState) => Expr,\r\n operators: Set<string>,\r\n): Expr {\r\n let left = leftParser(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n operators.has(state.tokens[state.cursor]?.value)\r\n ) {\r\n const operator = state.tokens[state.cursor++].value;\r\n const right = leftParser(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseExponentiationExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parsePropertyAccess, exponentiationOperators);\r\n}\r\n\r\nfunction parseMultiplicativeExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(\r\n state,\r\n parseExponentiationExpr,\r\n multiplicativeOperators,\r\n );\r\n}\r\n\r\nfunction parseAdditiveExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseMultiplicativeExpr, additiveOperators);\r\n}\r\n\r\nfunction parseBitwiseExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseAdditiveExpr, bitwiseOperators);\r\n}\r\n\r\nfunction parseComparisonExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseBitwiseExpr, comparisonOperators);\r\n}\r\n\r\nfunction parseEqualityExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseComparisonExpr, equalityOperators);\r\n}\r\n\r\nfunction parseBitwiseOrExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseBitwiseXorExpr, bitwiseOrOperators);\r\n}\r\n\r\nfunction parseBitwiseXorExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseBitwiseAndExpr, bitwiseXorOperators);\r\n}\r\n\r\nfunction parseBitwiseAndExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseEqualityExpr, bitwiseAndOperators);\r\n}\r\n\r\nfunction parseLogicalAndExpr(state: ParseState): Expr {\r\n let left = parseBitwiseOrExpr(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"&&\"\r\n ) {\r\n state.cursor++;\r\n const right = parseEqualityExpr(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator: \"&&\",\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseLogicalOrExpr(state: ParseState): Expr {\r\n let left = parseLogicalAndExpr(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"||\"\r\n ) {\r\n state.cursor++;\r\n const right = parseLogicalAndExpr(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator: \"||\",\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseNullishCoalesceExpr(state: ParseState): Expr {\r\n let left = parseLogicalOrExpr(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"??\"\r\n ) {\r\n state.cursor++;\r\n const right = parseLogicalOrExpr(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator: \"??\",\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseTernaryExpr(state: ParseState): Expr {\r\n const condition = parseNullishCoalesceExpr(state);\r\n\r\n if (\r\n state.tokens[state.cursor]?.type !== TokenType.OPERATOR ||\r\n state.tokens[state.cursor]?.value !== \"?\"\r\n ) {\r\n return condition;\r\n }\r\n\r\n state.cursor++;\r\n const left = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \":\");\r\n const right = parseTernaryExpr(state);\r\n\r\n return {\r\n type: ExprType.TERNARY,\r\n condition,\r\n left,\r\n right,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n}\r\n\r\nexport default function generateAst(\r\n tokens: Token[],\r\n config: { allowFnCalls: boolean },\r\n): Expr {\r\n const state: ParseState = {\r\n cursor: 0,\r\n tokens,\r\n config,\r\n };\r\n\r\n const ast = parseTernaryExpr(state);\r\n\r\n if (state.cursor !== state.tokens.length) {\r\n throw {\r\n pos: state.tokens[state.cursor].pos,\r\n message: `Expected token '${state.tokens[state.cursor].value}'.\\nExpected an operator or the end of the expression.`,\r\n };\r\n }\r\n\r\n return ast;\r\n}\r\n","import type { MutorConfig } from \"../types/types\";\r\n\r\nexport default function parse(\r\n templateBlock: string,\r\n { delimiters }: Pick<MutorConfig, \"delimiters\">,\r\n) {\r\n const openingTagWithWhitespaceCtrl = `${delimiters.openingTag}${delimiters.whitespaceTrim}`;\r\n const closingTagWithWhitespaceCtrl = `${delimiters.whitespaceTrim}${delimiters.closingTag}`;\r\n\r\n const leftTrim = templateBlock.startsWith(openingTagWithWhitespaceCtrl);\r\n const rightTrim = templateBlock.endsWith(closingTagWithWhitespaceCtrl);\r\n\r\n const openLen = leftTrim\r\n ? openingTagWithWhitespaceCtrl.length\r\n : delimiters.openingTag.length;\r\n const closeLen = rightTrim\r\n ? closingTagWithWhitespaceCtrl.length\r\n : delimiters.closingTag.length;\r\n\r\n const inner = templateBlock\r\n .slice(openLen, templateBlock.length - closeLen)\r\n .trim();\r\n\r\n const isComment = inner.startsWith(delimiters.commentTag);\r\n if (isComment) {\r\n return { isComment, leftTrim, rightTrim };\r\n }\r\n\r\n return {\r\n leftTrim,\r\n rightTrim,\r\n inner,\r\n isBlock:\r\n inner.startsWith(\"for \") ||\r\n inner.startsWith(\"if \") ||\r\n inner === \"else\" ||\r\n inner.startsWith(\"else if \") ||\r\n inner === \"break\" ||\r\n inner === \"continue\",\r\n isBlockEnd: inner === \"endif\" || inner === \"endfor\",\r\n hasContext: inner.startsWith(\"for \"),\r\n requiresBlockClose: inner.startsWith(\"for \") || inner.startsWith(\"if \"),\r\n usesAwait: inner.includes(\"Mutor::await\"),\r\n };\r\n}\r\n","import { TokenType } from \"../types/enums\";\r\nimport type { Token } from \"../types/types\";\r\nimport { keywords, operators } from \"./constants\";\r\n\r\nconst IDENT_START_PATTERN = /[a-zA-Z$_]/;\r\nconst IDENT_PATTERN = /[a-zA-Z$_0-9]/;\r\nconst NUMBER_START_PATTERN = /[0-9]/;\r\nconst DIGIT_PATTERN = /[0-9]/;\r\nconst HEX_DIGIT_PATTERN = /[0-9a-fA-F]/;\r\nconst VALIDATION_PATTERN = /[a-zA-Z$_0-9\\s\\t\\r\\n'\"`]/;\r\n\r\nexport default function tokenize(expr: string) {\r\n let cursor = 0,\r\n char = \"\";\r\n const tokens: Token[] = [];\r\n\r\n function accumulateKeywordOrIdentifier() {\r\n let buffer = \"\";\r\n if (IDENT_START_PATTERN.test(char)) {\r\n let j = cursor;\r\n while (IDENT_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n tokens.push({\r\n type: keywords.has(buffer) ? TokenType.KEYWORD : TokenType.IDENT,\r\n value: buffer,\r\n pos: cursor,\r\n });\r\n\r\n cursor = j;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateStr() {\r\n if (char !== '\"' && char !== \"'\" && char !== \"`\") {\r\n return false;\r\n }\r\n\r\n const quote = char;\r\n const start = cursor;\r\n\r\n let j = cursor + 1;\r\n let buffer = \"\";\r\n\r\n while (j < expr.length) {\r\n const current = expr[j];\r\n\r\n // Escape sequence\r\n if (current === \"\\\\\") {\r\n // Ensure next char exists\r\n if (j + 1 >= expr.length) {\r\n throw {\r\n pos: j,\r\n message: \"Unexpected end of string after escape character.\",\r\n };\r\n }\r\n\r\n // Preserve escape exactly as written\r\n buffer += current;\r\n buffer += expr[j + 1];\r\n\r\n j += 2;\r\n continue;\r\n }\r\n\r\n // Closing quote\r\n if (current === quote) {\r\n break;\r\n }\r\n\r\n buffer += current;\r\n j++;\r\n }\r\n\r\n // Missing closing quote\r\n if (j >= expr.length || expr[j] !== quote) {\r\n throw {\r\n pos: start,\r\n message: `String literal missing closing ${quote}.`,\r\n };\r\n }\r\n\r\n tokens.push({\r\n type: TokenType.STRING,\r\n value: buffer,\r\n pos: start,\r\n });\r\n\r\n cursor = j;\r\n }\r\n\r\n function accumulateNumber() {\r\n if (NUMBER_START_PATTERN.test(char)) {\r\n let j = cursor;\r\n\r\n if (expr[j] === \"0\" && (expr[j + 1] === \"x\" || expr[j + 1] === \"X\")) {\r\n j += 2;\r\n\r\n const hexStart = j;\r\n while (j < expr.length && HEX_DIGIT_PATTERN.test(expr[j])) {\r\n j++;\r\n }\r\n\r\n if (j === hexStart) {\r\n throw { pos: cursor, message: \"Found invalid number literal.\" };\r\n }\r\n } else {\r\n while (j < expr.length && DIGIT_PATTERN.test(expr[j])) {\r\n j++;\r\n }\r\n\r\n if (expr[j] === \".\") {\r\n j++;\r\n\r\n while (j < expr.length && DIGIT_PATTERN.test(expr[j])) {\r\n j++;\r\n }\r\n }\r\n\r\n if (expr[j] === \"e\" || expr[j] === \"E\") {\r\n const exponentStart = j;\r\n j++;\r\n\r\n if (expr[j] === \"+\" || expr[j] === \"-\") {\r\n j++;\r\n }\r\n\r\n const exponentDigitStart = j;\r\n while (j < expr.length && DIGIT_PATTERN.test(expr[j])) {\r\n j++;\r\n }\r\n\r\n if (j === exponentDigitStart) {\r\n throw {\r\n pos: exponentStart,\r\n message: \"Found invalid number literal.\",\r\n };\r\n }\r\n }\r\n }\r\n\r\n const buffer = expr.slice(cursor, j);\r\n const numVal = Number(buffer);\r\n const isNan = Number.isNaN(numVal);\r\n\r\n if (isNan) {\r\n throw { pos: cursor, message: \"Found invalid number literal.\" };\r\n }\r\n\r\n tokens.push({ type: TokenType.NUMBER, value: `${numVal}`, pos: cursor });\r\n cursor = j - 1;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateOperator() {\r\n const op = `${char}${expr[cursor + 1]}`;\r\n if (operators.has(op)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: op, pos: cursor });\r\n cursor++;\r\n return;\r\n }\r\n\r\n if (operators.has(char)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: char, pos: cursor });\r\n return;\r\n }\r\n }\r\n\r\n while (cursor < expr.length) {\r\n char = expr[cursor];\r\n\r\n accumulateNumber();\r\n accumulateKeywordOrIdentifier();\r\n accumulateStr();\r\n accumulateOperator();\r\n\r\n if (\r\n !VALIDATION_PATTERN.test(char) &&\r\n !operators.has(char) &&\r\n !operators.has(expr[cursor - 1] + char)\r\n ) {\r\n throw {\r\n message: `Unexpected token '${char}' in expression.`,\r\n pos: cursor,\r\n };\r\n }\r\n\r\n cursor++;\r\n }\r\n\r\n return tokens.length\r\n ? tokens\r\n : [{ type: TokenType.STRING, value: \"\", pos: 0 }];\r\n}\r\n","import { BlockType } from \"../types/enums\";\r\nimport type {\r\n BlockState,\r\n CompileMetadata,\r\n ForExpr,\r\n MutorConfig,\r\n} from \"../types/types\";\r\nimport escapeRawText from \"../utils/escape-raw-text\";\r\nimport getLineNumberAndIndex from \"../utils/get-line-and-column-nums\";\r\nimport getLineSnapshot from \"../utils/get-line-snapshot\";\r\nimport isEscaped from \"../utils/is-escaped\";\r\nimport build from \"./build\";\r\nimport { AsyncFunction } from \"./constants\";\r\nimport { MutorCompilerError } from \"./error\";\r\nimport generateAst from \"./generate-ast\";\r\nimport parse from \"./parse\";\r\nimport tokenize from \"./tokenize\";\r\n\r\nexport default function compile(\r\n src: string,\r\n config: MutorConfig,\r\n meta: CompileMetadata,\r\n) {\r\n // Keep track of temp variables declared in loops\r\n const scope: string[] = [];\r\n // Keep track of block opening states to support nested blocks\r\n const blockOpeningStack: BlockState[] = [];\r\n const {\r\n delimiters,\r\n preserveEscapeDelimiter,\r\n allowFnCalls,\r\n allowedProps,\r\n forbiddenProps,\r\n autoEscape,\r\n debugRuntimeErrors,\r\n } = config;\r\n\r\n // Function mode (sync/async)\r\n let mode: \"sync\" | \"async\" = \"sync\";\r\n // Whitespace control state\r\n let trimNext = false,\r\n cursor = 0,\r\n body = `let acc=\"\";`;\r\n\r\n while (cursor < src.length) {\r\n // Find a template expression\r\n const templateOpenTagIdx = src.indexOf(delimiters.openingTag, cursor);\r\n\r\n // No expression: handle final text chunk\r\n if (templateOpenTagIdx === -1) {\r\n const lastChunk = src.slice(cursor);\r\n body += `acc+=\\`${escapeRawText(trimNext ? lastChunk.trimStart() : lastChunk)}\\`;`;\r\n // Reset the whitespace control state\r\n trimNext = false;\r\n break;\r\n }\r\n\r\n // Check if template expression is escaped\r\n const escaped = isEscaped(\r\n src,\r\n templateOpenTagIdx,\r\n delimiters.openingTagEscape,\r\n );\r\n\r\n if (escaped) {\r\n const text = src.slice(\r\n cursor,\r\n preserveEscapeDelimiter\r\n ? templateOpenTagIdx\r\n : templateOpenTagIdx - delimiters.openingTagEscape.length,\r\n );\r\n const raw = `${text}${delimiters.openingTag}`;\r\n body += `acc+=\\`${escapeRawText(trimNext ? raw.trimStart() : raw)}\\`;`;\r\n // Reset the whitespace control state\r\n trimNext = false;\r\n cursor = templateOpenTagIdx + delimiters.openingTag.length;\r\n continue;\r\n }\r\n\r\n const templateEndTagIdx = src.indexOf(\r\n delimiters.closingTag,\r\n templateOpenTagIdx,\r\n );\r\n\r\n // Find the end of the template expression\r\n if (templateEndTagIdx === -1) {\r\n const [line, lineIndex] = getLineNumberAndIndex(src, templateOpenTagIdx);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n throw new MutorCompilerError(\r\n \"No closing tag found.\",\r\n line,\r\n lineText,\r\n templateOpenTagIdx,\r\n meta.path,\r\n );\r\n }\r\n\r\n const template = src.slice(\r\n templateOpenTagIdx,\r\n templateEndTagIdx + delimiters.closingTag.length,\r\n );\r\n const expressionMetadata = parse(template, { delimiters });\r\n\r\n // Accumulate text in between template tags\r\n const text = src.slice(cursor, templateOpenTagIdx);\r\n const trimmedText = trimNext ? text.trimStart() : text;\r\n // Reset the whitespace control state\r\n trimNext = false;\r\n\r\n body += `acc+=\\`${escapeRawText(\r\n expressionMetadata.leftTrim ? trimmedText.trimEnd() : trimmedText,\r\n )}\\`;`;\r\n // Advance the cursor to after the template expression closing tag\r\n cursor = templateEndTagIdx + delimiters.closingTag.length;\r\n\r\n // Set state for the NEXT raw text chunk\r\n if (expressionMetadata.rightTrim) {\r\n trimNext = true;\r\n }\r\n\r\n // Skip comments\r\n if (expressionMetadata.isComment) {\r\n continue;\r\n }\r\n\r\n // Switch to async mode if Mutor::await is used\r\n if (expressionMetadata.usesAwait && mode !== \"async\") {\r\n mode = \"async\";\r\n }\r\n\r\n try {\r\n const tokens = tokenize(expressionMetadata.inner);\r\n const ast = generateAst(tokens, { allowFnCalls });\r\n const js = build(ast, { allowedProps, forbiddenProps, scope });\r\n\r\n // Handle for loop variables\r\n if (expressionMetadata.isBlock && expressionMetadata.requiresBlockClose) {\r\n if (expressionMetadata.hasContext) {\r\n const { variable, secondaryVariable } = ast as ForExpr;\r\n\r\n scope.push(variable);\r\n if (secondaryVariable) scope.push(secondaryVariable);\r\n\r\n blockOpeningStack.push({\r\n type: BlockType.LOOP,\r\n pos: templateOpenTagIdx,\r\n loopType: (ast as ForExpr).loopType,\r\n scopeSize: secondaryVariable === undefined ? 1 : 2,\r\n });\r\n } else {\r\n blockOpeningStack.push({\r\n type: BlockType.IF,\r\n pos: templateOpenTagIdx,\r\n });\r\n }\r\n }\r\n\r\n // Handle block end\r\n if (expressionMetadata.isBlockEnd) {\r\n const lastBlockOpened = blockOpeningStack.pop();\r\n\r\n // Handle hanging closing block '{{ endif }}' or '{{ endfor }}'\r\n if (!lastBlockOpened) {\r\n throw {\r\n message: `Unexpected '${expressionMetadata.inner}' without a matching opening block.`,\r\n pos: templateOpenTagIdx,\r\n };\r\n }\r\n\r\n // Closing tags for loop or if blocks must match\r\n if (\r\n (expressionMetadata.inner === \"endif\" &&\r\n lastBlockOpened.type !== BlockType.IF) ||\r\n (expressionMetadata.inner === \"endfor\" &&\r\n lastBlockOpened.type !== BlockType.LOOP)\r\n ) {\r\n throw {\r\n message: `Unexpected '${expressionMetadata.inner}'. Expected '${\r\n lastBlockOpened.type === BlockType.IF ? \"endif\" : \"endfor\"\r\n }'.`,\r\n pos: lastBlockOpened.pos,\r\n };\r\n }\r\n\r\n // Remove scope for the current block if it's a loop block\r\n if (lastBlockOpened.type === BlockType.LOOP) {\r\n scope.splice(-lastBlockOpened.scopeSize);\r\n }\r\n\r\n body += js;\r\n continue;\r\n }\r\n\r\n if (expressionMetadata.isBlock) {\r\n body += js;\r\n } else {\r\n // Only escape unknown values returned from fn calls or object property resolution\r\n // Values returned from Mutor::include should be taken as is.\r\n\r\n if (debugRuntimeErrors) {\r\n const [line, lineIndex] = getLineNumberAndIndex(\r\n src,\r\n templateOpenTagIdx,\r\n );\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n body +=\r\n // Escape the return values of unknown values at runtime\r\n autoEscape && !js.startsWith(\"namespaces.Mutor.include\")\r\n ? `try{acc+=escapeFn(${js});}catch(e){throw new MutorRuntimeError(e??\"An unknown error ocurred.\",${line},\\`${escapeRawText(lineText)}\\`,${templateOpenTagIdx},\\`${escapeRawText(meta.path)}\\`);}`\r\n : `try{acc+=${js};}catch(e){throw new MutorRuntimeError(e??\"An unknown error ocurred.\",${line},\\`${escapeRawText(lineText)}\\`,${templateOpenTagIdx},\\`${escapeRawText(meta.path)}\\`);}`;\r\n } else {\r\n body +=\r\n // Escape the return values of unknown values at runtime\r\n autoEscape && !js.startsWith(\"namespaces.Mutor.include\")\r\n ? `acc+=escapeFn(${js});`\r\n : `acc+=${js};`;\r\n }\r\n }\r\n } catch (e) {\r\n const { message, pos: relPos } = e as { message: string; pos: number };\r\n const delimitersLength = expressionMetadata.leftTrim\r\n ? delimiters.whitespaceTrim.length + delimiters.openingTag.length\r\n : delimiters.openingTag.length;\r\n\r\n const finalPos = templateOpenTagIdx + relPos + delimitersLength;\r\n const [line, lineIndex] = getLineNumberAndIndex(src, finalPos);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n\r\n throw new MutorCompilerError(\r\n message,\r\n line,\r\n lineText,\r\n finalPos - lineIndex,\r\n meta.path,\r\n );\r\n }\r\n }\r\n\r\n if (blockOpeningStack.length) {\r\n const lastPos = blockOpeningStack.pop()?.pos as number;\r\n const [line, lineIndex] = getLineNumberAndIndex(src, lastPos);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n throw new MutorCompilerError(\r\n \"Unclosed block detected.\",\r\n line,\r\n lineText,\r\n lastPos - lineIndex,\r\n meta.path,\r\n );\r\n }\r\n\r\n body += `return acc;`;\r\n return mode === \"async\"\r\n ? new AsyncFunction(\r\n \"ctx\",\r\n \"namespaces\",\r\n \"allowedProps\",\r\n \"forbiddenProps\",\r\n \"escapeFn\",\r\n \"validateComputedProps\",\r\n \"MutorRuntimeError\",\r\n body,\r\n )\r\n : new Function(\r\n \"ctx\",\r\n \"namespaces\",\r\n \"allowedProps\",\r\n \"forbiddenProps\",\r\n \"escapeFn\",\r\n \"validateComputedProps\",\r\n \"MutorRuntimeError\",\r\n body,\r\n );\r\n}\r\n","import type {\r\n MutorConfig,\r\n PartialMutorConfig,\r\n RuntimeFrame,\r\n} from \"../types/types\";\r\nimport createRuntimeFrame from \"../utils/create-runtime\";\r\nimport escapeFn from \"../utils/escape-fn\";\r\nimport validateComputedProp from \"../utils/validate-computed-prop\";\r\nimport compile from \"./compile\";\r\nimport { defaultConfig, namespaces } from \"./constants\";\r\nimport { MutorCompilerError, MutorError, MutorRuntimeError } from \"./error\";\r\n\r\nexport default class MutorBase {\r\n protected __cacheSize = 0;\r\n protected __config: MutorConfig = { ...defaultConfig };\r\n protected __compiledTemplatesMap: Map<\r\n string,\r\n { fn: Function; size: number }\r\n > = new Map();\r\n protected __namespaces: Record<any, any> = namespaces;\r\n\r\n constructor(config: PartialMutorConfig = {}) {\r\n this.addConfig(config);\r\n this.__namespaces.Mutor = {\r\n await: async (value: any) => {\r\n return await value;\r\n },\r\n };\r\n }\r\n\r\n addConfig(conf: PartialMutorConfig): MutorConfig {\r\n const {\r\n autoEscape,\r\n delimiters: overrideDelimeters,\r\n allowedProps,\r\n forbiddenProps,\r\n preserveEscapeDelimiter,\r\n allowFnCalls,\r\n cache,\r\n build,\r\n onIncludeFail,\r\n onIncludeError,\r\n rootDir,\r\n debugRuntimeErrors,\r\n } = conf;\r\n\r\n this.__config = {\r\n build: {\r\n include: new Set([...(build?.include || defaultConfig.build.include)]),\r\n exclude: new Set([\r\n ...defaultConfig.build.exclude,\r\n ...(build?.exclude || []),\r\n ]),\r\n },\r\n rootDir,\r\n autoEscape: autoEscape === true ? true : autoEscape !== false,\r\n allowedProps: new Set([...(allowedProps || defaultConfig.allowedProps)]),\r\n allowFnCalls: !!allowFnCalls,\r\n onIncludeFail: onIncludeFail || defaultConfig.onIncludeFail,\r\n onIncludeError: onIncludeError || defaultConfig.onIncludeError,\r\n cache: { ...defaultConfig.cache, ...(cache || {}) },\r\n forbiddenProps: new Set([\r\n ...defaultConfig.forbiddenProps,\r\n ...(forbiddenProps || []),\r\n ]),\r\n preserveEscapeDelimiter: preserveEscapeDelimiter ?? false,\r\n debugRuntimeErrors: debugRuntimeErrors ?? false,\r\n delimiters: {\r\n ...defaultConfig.delimiters,\r\n ...(overrideDelimeters || {}),\r\n },\r\n };\r\n\r\n return this.__config;\r\n }\r\n\r\n restoreDefaultConfig() {\r\n this.__config = { ...defaultConfig };\r\n }\r\n\r\n protected __compile(template: string, runtime?: RuntimeFrame) {\r\n return compile(template, this.__config, {\r\n path: runtime?.renderedPath || \"anonymous\",\r\n });\r\n }\r\n\r\n compile(template: string) {\r\n const fn = this.__compile(template);\r\n\r\n return (context: any) =>\r\n fn(\r\n context,\r\n this.__createNamespacesWithRuntime(createRuntimeFrame(context)),\r\n this.__config.allowedProps,\r\n this.__config.forbiddenProps,\r\n escapeFn,\r\n validateComputedProp,\r\n MutorRuntimeError,\r\n );\r\n }\r\n\r\n renderAsync(template: string, context: any): Promise<string> {\r\n return new Promise((resolve) => {\r\n resolve(this.render(template, context));\r\n });\r\n }\r\n\r\n render(template: string, context: any): string {\r\n const runtime = createRuntimeFrame(context, \"anonymous\");\r\n return this.__renderWithRuntime(template, runtime);\r\n }\r\n\r\n invalidateCacheEntry(identifier: string) {\r\n const entry = this.__compiledTemplatesMap.get(identifier);\r\n if (!entry) {\r\n return false;\r\n }\r\n\r\n this.__cacheSize -= entry.size;\r\n this.__compiledTemplatesMap.delete(identifier);\r\n return true;\r\n }\r\n\r\n protected __renderWithRuntime(\r\n template: string,\r\n runtime: RuntimeFrame,\r\n ): string {\r\n const fn = this.__compile(template, runtime);\r\n\r\n const result = fn(\r\n runtime.context,\r\n this.__createNamespacesWithRuntime(runtime),\r\n this.__config.allowedProps,\r\n this.__config.forbiddenProps,\r\n escapeFn,\r\n validateComputedProp,\r\n MutorRuntimeError,\r\n );\r\n\r\n return result;\r\n }\r\n\r\n protected __createNamespacesWithRuntime(\r\n runtime: RuntimeFrame,\r\n ): Record<any, any> {\r\n return {\r\n ...this.__namespaces,\r\n Mutor: {\r\n ...this.__namespaces.Mutor,\r\n $$context: runtime.context,\r\n },\r\n };\r\n }\r\n\r\n protected __handleError(\r\n err: unknown,\r\n from: string,\r\n path: string,\r\n absolutePath?: string,\r\n ): string {\r\n if (this.__config.onIncludeFail === \"throw\") {\r\n throw err instanceof MutorCompilerError\r\n ? err\r\n : new MutorError((err as Error).message);\r\n }\r\n\r\n const meta = { from, path, absolutePath };\r\n\r\n // Log error if onIncludeFail is set to \"ignore\" and onIncludeError is not defined\r\n if (\r\n this.__config.onIncludeFail === \"ignoreLog\" &&\r\n !this.__config.onIncludeError\r\n ) {\r\n err instanceof MutorCompilerError\r\n ? console.log(err)\r\n : console.log(`[Mutor.js]\\n${(err as Error).message}`);\r\n }\r\n\r\n return this.__config.onIncludeError?.(meta, err) ?? \"\";\r\n }\r\n\r\n protected __createEntrySpaceForTemplate(targetSize: number): boolean {\r\n if (this.__cacheSize + targetSize <= this.__config.cache.maxSize) {\r\n return true;\r\n }\r\n\r\n if (targetSize > this.__config.cache.maxSize) {\r\n return false;\r\n }\r\n\r\n const firstEntry = this.__compiledTemplatesMap.entries().next().value;\r\n\r\n if (firstEntry) {\r\n const [oldestKey, oldestData] = firstEntry;\r\n this.__compiledTemplatesMap.delete(oldestKey);\r\n this.__cacheSize -= oldestData.size;\r\n }\r\n\r\n return this.__createEntrySpaceForTemplate(targetSize);\r\n }\r\n\r\n getDiagnostics() {\r\n const maxSize = this.__config.cache.maxSize;\r\n\r\n return {\r\n bytesUsed: this.__cacheSize,\r\n bytesMax: maxSize,\r\n readableUsed: `${(this.__cacheSize / 1024 / 1024).toFixed(2)} MB`,\r\n readableMax: `${(maxSize / 1024 / 1024).toFixed(2)} MB`,\r\n totalEntries: this.__compiledTemplatesMap.size,\r\n percentFull:\r\n maxSize > 0\r\n ? Math.min(100, Math.round((this.__cacheSize / maxSize) * 100))\r\n : 0,\r\n avgTemplateSize:\r\n this.__compiledTemplatesMap.size > 0\r\n ? Math.round(this.__cacheSize / this.__compiledTemplatesMap.size)\r\n : 0,\r\n };\r\n }\r\n\r\n protected __register(identifier: string, template: string) {\r\n const templateSize = template.length * 2 + 500;\r\n const existingSize = this.__compiledTemplatesMap.get(identifier)?.size ?? 0;\r\n\r\n if (\r\n this.__cacheSize - existingSize + templateSize >\r\n this.__config.cache.maxSize\r\n ) {\r\n throw new MutorError(\r\n `The template for the component '${identifier}' is too large and will not fit in the cache. Consider increasing 'cache.maxSize' in the config`,\r\n );\r\n }\r\n\r\n // Use a temporary runtime for compilation context\r\n const tempRuntime = createRuntimeFrame(null, identifier);\r\n // Compile first to expose errors before updating state\r\n const compiled = this.__compile(template, tempRuntime);\r\n\r\n // Delete existing entry if it exists\r\n this.__compiledTemplatesMap.delete(identifier);\r\n this.__cacheSize -= existingSize;\r\n\r\n // Add new entry\r\n this.__cacheSize += template.length * 2 + 500;\r\n this.__compiledTemplatesMap.set(identifier, {\r\n fn: compiled,\r\n size: templateSize,\r\n });\r\n }\r\n\r\n reset() {\r\n this.__config = { ...defaultConfig };\r\n this.__compiledTemplatesMap.clear();\r\n this.__cacheSize = 0;\r\n }\r\n}\r\n","import type { ExitCode } from \"../types/types\";\r\n\r\nexport const ExitCodes = {\r\n Success: 0,\r\n RuntimeError: 1,\r\n ArgumentError: 2,\r\n} as const;\r\n\r\nexport class CliError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly exitCode: ExitCode = ExitCodes.RuntimeError,\r\n ) {\r\n super(message);\r\n this.name = \"CliError\";\r\n }\r\n}\r\n\r\nexport class ArgumentError extends CliError {\r\n constructor(message: string) {\r\n super(message, ExitCodes.ArgumentError);\r\n this.name = \"ArgumentError\";\r\n }\r\n}\r\n\r\nexport class FileReadError extends CliError {\r\n constructor(filePath: string, cause: unknown) {\r\n const reason = cause instanceof Error ? cause.message : String(cause);\r\n super(\r\n `could not read file '${filePath}': ${reason}`,\r\n ExitCodes.RuntimeError,\r\n );\r\n this.name = \"FileReadError\";\r\n }\r\n}\r\n\r\nexport class FileWriteError extends CliError {\r\n constructor(filePath: string, cause: unknown) {\r\n const reason = cause instanceof Error ? cause.message : String(cause);\r\n super(\r\n `could not write file '${filePath}': ${reason}`,\r\n ExitCodes.RuntimeError,\r\n );\r\n this.name = \"FileWriteError\";\r\n }\r\n}\r\n\r\nexport class JsonParseError extends CliError {\r\n constructor(filePath: string, cause: unknown) {\r\n const reason = cause instanceof Error ? cause.message : String(cause);\r\n super(\r\n `failed to parse JSON in '${filePath}': ${reason}`,\r\n ExitCodes.RuntimeError,\r\n );\r\n this.name = \"JsonParseError\";\r\n }\r\n}\r\n"],"mappings":"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","names":["cli_exports","__export","handleBuildCommand","handleCompileCommand","handleRenderCommand","parseArgs","safeParseJsonFile","safeReadFile","safeWriteFile","__toCommonJS","import_node_fs","import_node_process","version","import_node_fs","import_promises","import_node_path","createRuntimeFrame","context","renderedPath","constructPointer","pos","offset","MutorError","_MutorError","message","MutorCompilerError","_MutorCompilerError","line","lineText","column","file","gutterWidth","report","constructPointer","MutorRuntimeError","keywords","operators","equalityOperators","comparisonOperators","bitwiseOperators","additiveOperators","multiplicativeOperators","propertyAccessOperators","unaryOperators","bitwiseOrOperators","bitwiseXorOperators","bitwiseAndOperators","exponentiationOperators","ESCAPE_MAP","defaultConfig","namespaces","value","space","str","obj","key","entries","keys","MutorError","result","args","arr","size","i","start","end","step","radix","min","max","digits","x","base","exponent","date","AsyncFunction","escapeFn","char","ESCAPE_MAP","import_node_path","toAbsolutePath","basePath","relativePaths","absoluteBase","baseDir","validateComputedProp","value","allowedProps","forbiddenProps","MutorError","escapeRawText","text","getLineAndColumnNumbers","str","idx","line","lineIndex","getLineSnapshot","str","lineIdx","nextNewlineIdx","isEscaped","src","index","escapeToken","j","count","escapeLength","BACKTICK_REGEX","prefixWithCtx","state","expr","buildNamespace","leftValue","rightValue","buildPropAccess","left","buildExpr","optionalChain","right","propName","buildCall","func","args","arg","buildForLoop","iterable","loopType","variable","secondaryVariable","loopOperator","iterableValue","build","buildIfBlock","condition","buildElseIfBlock","type","escapeRawText","operator","innerExpr","ast","context","result","getTokenTypeWords","type","expectOrThrow","state","type","value","token","lastToken","getTokenTypeWords","parseForLoop","pos","variable","secondaryVariable","loopType","iterable","parseTernaryExpr","parseIfExpression","condition","parseElseExpression","extractFnArgs","args","parsePrimaryExpr","expr","unaryOperators","parsePropertyAccess","parsePropertyIdentifier","left","propertyAccessOperators","isNamespace","isBracketNotation","isOptional","right","parseBinaryExpr","leftParser","operators","operator","parseExponentiationExpr","exponentiationOperators","parseMultiplicativeExpr","multiplicativeOperators","parseAdditiveExpr","additiveOperators","parseBitwiseExpr","bitwiseOperators","parseComparisonExpr","comparisonOperators","parseEqualityExpr","equalityOperators","parseBitwiseOrExpr","parseBitwiseXorExpr","bitwiseOrOperators","parseBitwiseAndExpr","bitwiseXorOperators","bitwiseAndOperators","parseLogicalAndExpr","parseLogicalOrExpr","parseNullishCoalesceExpr","generateAst","tokens","config","ast","parse","templateBlock","delimiters","openingTagWithWhitespaceCtrl","closingTagWithWhitespaceCtrl","leftTrim","rightTrim","openLen","closeLen","inner","isComment","IDENT_START_PATTERN","IDENT_PATTERN","NUMBER_START_PATTERN","DIGIT_PATTERN","HEX_DIGIT_PATTERN","VALIDATION_PATTERN","tokenize","expr","cursor","char","tokens","accumulateKeywordOrIdentifier","buffer","j","keywords","accumulateStr","quote","start","current","accumulateNumber","hexStart","exponentStart","exponentDigitStart","numVal","accumulateOperator","op","operators","compile","src","config","meta","scope","blockOpeningStack","delimiters","preserveEscapeDelimiter","allowFnCalls","allowedProps","forbiddenProps","autoEscape","debugRuntimeErrors","mode","trimNext","cursor","body","templateOpenTagIdx","lastChunk","escapeRawText","isEscaped","raw","templateEndTagIdx","line","lineIndex","getLineAndColumnNumbers","lineText","getLineSnapshot","MutorCompilerError","template","expressionMetadata","parse","text","trimmedText","tokens","tokenize","ast","generateAst","js","build","variable","secondaryVariable","lastBlockOpened","e","message","relPos","delimitersLength","finalPos","lastPos","AsyncFunction","MutorBase","config","defaultConfig","namespaces","value","conf","autoEscape","overrideDelimeters","allowedProps","forbiddenProps","preserveEscapeDelimiter","allowFnCalls","cache","build","onIncludeFail","onIncludeError","rootDir","debugRuntimeErrors","template","runtime","compile","fn","context","createRuntimeFrame","escapeFn","validateComputedProp","MutorRuntimeError","resolve","identifier","entry","err","from","path","absolutePath","MutorCompilerError","MutorError","meta","targetSize","firstEntry","oldestKey","oldestData","maxSize","templateSize","existingSize","tempRuntime","compiled","MutorServer","MutorBase","config","path","renderedPath","isAlias","root","toAbsolutePath","resolvedPath","runtime","context","MutorError","previousPath","err","template","createRuntimeFrame","resolve","absolutePath","compiled","previousContext","entry","templateSize","escapeFn","validateComputedProp","MutorRuntimeError","src","destination","absoluteDestinationPath","absoluteSrcPath","entries","srcPath","destinationPath","extension","rendered","ExitCodes","CliError","message","exitCode","ArgumentError","FileReadError","filePath","cause","reason","FileWriteError","JsonParseError","COMMANDS","OPTIONS","VERSION","version","USAGE","safeReadFile","filePath","err","FileReadError","safeWriteFile","content","FileWriteError","safeParseJsonFile","raw","JsonParseError","assertIsFile","flag","stat","ArgumentError","assertIsDirectory","dirPath","assertExtension","extensions","ext","parseArgs","rawArgs","ExitCodes","command","commandData","struct","i","value","handleCompileCommand","mutor","args","inputPath","toAbsolutePath","template","output","outPath","registerCleanup","handleBuildCommand","dataPath","context","buildStarted","handleRenderCommand","cleanupFn","fn","handleSignal","signal","main","MutorServer","configPath","config","CliError"]}