exprify 1.0.0 → 1.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"exprify.min.js","sources":["../src/math/operations.js","../src/functions/internalFunctions.js","../src/functions/externalFunctions.js","../src/variables/variables.js","../src/utils/typeConverter.js","../src/core/Exprify.js","../src/parser/tokenizer.js","../src/parser/infixToPostfix.js","../src/parser/evaluator.js"],"sourcesContent":["const isValidNumberPair = (a, b) =>\r\n (typeof a === typeof b) &&\r\n (typeof a === 'number' || typeof a === 'bigint');\r\n\r\nexport const mathOperations = Object.freeze({\r\n\r\n operator_precedence: {\r\n '^': 4,\r\n '*': 3,\r\n '/': 3,\r\n '%': 3,\r\n '+': 1,\r\n '-': 1,\r\n },\r\n\r\n power: function(a, b) {\r\n if (isValidNumberPair(a, b)) return a ** b;\r\n throw new Error(\"Invalid types for ^\");\r\n },\r\n\r\n multiply: function(a, b) {\r\n if (isValidNumberPair(a, b)) return a * b;\r\n throw new Error(\"Invalid types for *\");\r\n },\r\n\r\n divide: function(a, b) {\r\n if (isValidNumberPair(a, b)) {\r\n if (b === 0) throw new Error(\"Division by zero\");\r\n return a / b;\r\n }\r\n throw new Error(\"Invalid types for /\");\r\n },\r\n\r\n add: function(a, b) {\r\n if (isValidNumberPair(a, b)) return a + b;\r\n if (typeof a === 'string' && typeof b === 'string') return a + b;\r\n throw new Error(\"Invalid types for +\");\r\n },\r\n subtract: function(a, b) {\r\n if (isValidNumberPair(a, b)) return a - b;\r\n throw new Error(\"Invalid types for -\");\r\n },\r\n\r\n modulus: function(a, b) {\r\n if (isValidNumberPair(a, b)) return a % b;\r\n throw new Error(\"Invalid types for %\");\r\n }\r\n});","const and = (...args) => args.every(Boolean);\r\nconst or = (...args) => args.some(Boolean);\r\nconst not = (val) => !val;\r\n\r\nconst gt = (a, b) => a > b;\r\nconst lt = (a, b) => a < b;\r\nconst eq = (a, b) => a === b;\r\nconst gte = (a, b) => a >= b;\r\nconst lte = (a, b) => a <= b;\r\n\r\nexport const internalFunctions = Object.freeze({\r\n\r\n max: (...args) => {\r\n if (!args.every(v => typeof v === 'number')) {\r\n throw new Error(\"max() expects numbers only\");\r\n }\r\n return Math.max(...args);\r\n },\r\n\r\n min: (...args) => {\r\n if (!args.every(v => typeof v === 'number')) {\r\n throw new Error(\"min() expects numbers only\");\r\n }\r\n return Math.min(...args);\r\n },\r\n\r\n and,\r\n \"&&\": and,\r\n\r\n or,\r\n \"||\": or,\r\n\r\n not,\r\n \"!\": not,\r\n\r\n greaterThan: gt,\r\n \">\": gt,\r\n\r\n lessThan: lt,\r\n \"<\": lt,\r\n\r\n isEqual: eq,\r\n \"==\": eq,\r\n\r\n greaterThanOrEqual: gte,\r\n \">=\": gte,\r\n\r\n lessThanOrEqual: lte,\r\n \"<=\": lte,\r\n\r\n if: (cond, t, f = false) => cond ? t : f\r\n\r\n});","export const externalFunctions = {};\r\n\r\n// Add user-defined function\r\nexport function addFunction(name, fn) {\r\n\r\n if (typeof name !== \"string\" || name.trim() === \"\") {\r\n throw new Error(\"Function name must be a non-empty string\");\r\n }\r\n\r\n if (typeof fn !== \"function\") {\r\n throw new Error(\"Function must be a valid function\");\r\n }\r\n\r\n if (name in externalFunctions) {\r\n throw new Error(`Function '${name}' already exists`);\r\n }\r\n\r\n externalFunctions[name] = fn;\r\n}\r\n","export const variablesDB = {};\r\n\r\n// Valid JS variable name (full check)\r\nconst validVarName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\r\n\r\nexport function setVariable(name, value, { override = true } = {}) {\r\n\r\n // Name validation\r\n if (typeof name !== \"string\" || name.trim() === \"\") {\r\n throw new Error(\"Variable Name Error: Name must be a non-empty string\");\r\n }\r\n\r\n if (!validVarName.test(name)) {\r\n throw new Error(`Variable Name Error: '${name}' is not a valid variable name`);\r\n }\r\n\r\n // Value validation\r\n if (value === undefined) {\r\n throw new Error(`Variable Value Error: '${name}' cannot be undefined`);\r\n }\r\n\r\n // Prevent overwrite (optional)\r\n if (!override && name in variablesDB) {\r\n throw new Error(`Variable '${name}' already exists`);\r\n }\r\n\r\n variablesDB[name] = value;\r\n}","export function stringToJS(str, variablesDB) {\r\n if (typeof str !== \"string\" || str.length === 0) {\r\n throw new Error(\"Invalid input: expected a non-empty string.\");\r\n }\r\n\r\n const firstChar = str[0];\r\n const lastChar = str[str.length - 1];\r\n\r\n // HEX (0x...)\r\n if (/^0x[0-9a-fA-F]+n?$/.test(str)) {\r\n\r\n // BigInt hex (0xFFn)\r\n if (lastChar === 'n') {\r\n return BigInt(str.slice(0, -1));\r\n }\r\n\r\n return Number(str);\r\n }\r\n\r\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?n?$/i.test(str)) {\r\n\r\n // BigInt\r\n if (lastChar === 'n') {\r\n const numPart = str.slice(0, -1);\r\n\r\n if (numPart.includes('.') || /e/i.test(numPart)) {\r\n throw new Error(`Invalid BigInt: ${str}`);\r\n }\r\n\r\n return BigInt(numPart);\r\n }\r\n\r\n return Number(str);\r\n }\r\n\r\n if (\r\n (firstChar === '\"' && lastChar === '\"') ||\r\n (firstChar === \"'\" && lastChar === \"'\") ||\r\n (firstChar === '`' && lastChar === '`')\r\n ) {\r\n return str.slice(1, -1);\r\n }\r\n\r\n if (\r\n firstChar === '\"' ||\r\n firstChar === \"'\" ||\r\n firstChar === '`'\r\n ) {\r\n throw new Error(`Unmatched or missing quotes: ${str}`);\r\n }\r\n\r\n if (str === \"true\") return true;\r\n if (str === \"false\") return false;\r\n\r\n if (str in variablesDB) {\r\n return variablesDB[str];\r\n }\r\n\r\n throw new Error(\r\n `${str} is not defined. Use setVariable(\"${str}\", value) first.`\r\n );\r\n}\r\nexport default stringToJS;","import { tokenize } from \"../parser/tokenizer.js\";\r\nimport { infixToPostfix } from \"../parser/infixToPostfix.js\";\r\nimport { evaluatePostfix } from \"../parser/evaluator.js\";\r\n\r\nimport { mathOperations } from \"../math/operations.js\";\r\n\r\nimport { internalFunctions } from \"../functions/internalFunctions.js\";\r\nimport { externalFunctions } from \"../functions/externalFunctions.js\";\r\n\r\nimport { variablesDB } from \"../variables/variables.js\";\r\n\r\nimport { stringToJS } from \"../utils/typeConverter.js\";\r\n\r\nclass ViewPoint {\r\n\r\n constructor() {\r\n // Shared state\r\n this.variablesDB = variablesDB;\r\n this.func_DB_intrnl = internalFunctions;\r\n this.func_DB_extrnl = externalFunctions;\r\n\r\n this.operator_precedence = mathOperations.operator_precedence;\r\n }\r\n\r\n setVariable(name, value) {\r\n this.variablesDB[name] = value;\r\n }\r\n\r\n addFunction(name, fn) {\r\n this.func_DB_extrnl[name] = fn;\r\n }\r\n\r\n stringToJS(str) {\r\n return stringToJS.call(this, str, this.variablesDB);\r\n }\r\n\r\n evaluate(expr) {\r\n\r\n if (typeof expr !== \"string\") {\r\n throw new Error(\"Expression must be a string\");\r\n }\r\n\r\n const context = {\r\n variablesDB: this.variablesDB,\r\n func_DB_intrnl: this.func_DB_intrnl,\r\n func_DB_extrnl: this.func_DB_extrnl,\r\n stringToJS: this.stringToJS.bind(this),\r\n evaluate: this.evaluate.bind(this)\r\n };\r\n\r\n // Step 1: Tokenize\r\n const tokens = tokenize(expr, context);\r\n\r\n // Step 2: Infix → Postfix\r\n const postfix = infixToPostfix(\r\n tokens,\r\n this.operator_precedence\r\n );\r\n\r\n // Step 3: Evaluate Postfix\r\n const result = evaluatePostfix(\r\n postfix,\r\n mathOperations\r\n );\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default ViewPoint;","export function tokenize(expr, context) {\r\n let tokens = [];\r\n let current = \"\";\r\n let quote = \"\";\r\n\r\n for (let i = 0; i < expr.length; i++) {\r\n\r\n let char = expr[i];\r\n\r\n const isOperator =\r\n char === '(' || char === ')' ||\r\n char === '^' || char === '*' ||\r\n char === '/' || char === '%' ||\r\n char === '+' || char === '-';\r\n\r\n const isQuote = char === '\"' || char === \"'\" || char === \"`\";\r\n\r\n if (isQuote) {\r\n if (quote === \"\") {\r\n quote = char;\r\n current += char;\r\n } else if (quote === char) {\r\n current += char;\r\n quote = \"\";\r\n\r\n tokens.push(context.stringToJS(current, context.variablesDB));\r\n current = \"\";\r\n } else {\r\n current += char;\r\n }\r\n continue;\r\n }\r\n\r\n if (quote !== \"\") {\r\n current += char;\r\n continue;\r\n }\r\n\r\n if (char === \"#\") {\r\n\r\n let bracket = 0;\r\n let funcName = \"\";\r\n let arg = \"\";\r\n let args = [];\r\n let quoteFunc = \"\";\r\n\r\n while (i < expr.length - 1) {\r\n i++;\r\n char = expr[i];\r\n\r\n if (bracket === 0) {\r\n if (char === \"(\") {\r\n bracket++;\r\n continue;\r\n }\r\n\r\n if (char === \" \")\r\n throw new Error(\"Function name cannot contain space\");\r\n\r\n if (isQuote)\r\n throw new Error(\"Function name cannot contain quotes\");\r\n\r\n if (funcName === \"\" && /[0-9.]/.test(char))\r\n throw new Error(\"Function name cannot start with number\");\r\n\r\n funcName += char;\r\n continue;\r\n }\r\n\r\n if (isQuote) {\r\n if (quoteFunc === \"\") quoteFunc = char;\r\n else if (quoteFunc === char) quoteFunc = \"\";\r\n }\r\n\r\n if (quoteFunc === \"\") {\r\n\r\n if (char === \"(\") bracket++;\r\n else if (char === \")\") {\r\n bracket--;\r\n\r\n if (bracket === 0) {\r\n if (arg !== \"\") args.push(arg);\r\n break;\r\n }\r\n }\r\n\r\n if (char === \",\" && bracket === 1) {\r\n if (arg === \"\")\r\n throw new Error(`Missing argument in #${funcName}()`);\r\n\r\n args.push(arg);\r\n arg = \"\";\r\n continue;\r\n }\r\n }\r\n\r\n arg += char;\r\n }\r\n\r\n args = args.map(a => context.evaluate(a));\r\n\r\n let fn =\r\n context.func_DB_intrnl[funcName] ||\r\n context.func_DB_extrnl[funcName];\r\n\r\n if (!fn) {\r\n throw new Error(`#${funcName}() not defined`);\r\n }\r\n\r\n tokens.push(fn(...args));\r\n continue;\r\n }\r\n\r\n if (isOperator) {\r\n\r\n if (current !== \"\") {\r\n tokens.push(context.stringToJS(current, context.variablesDB));\r\n current = \"\";\r\n }\r\n\r\n tokens.push(char);\r\n continue;\r\n }\r\n\r\n if (char === \" \") {\r\n if (current !== \"\") {\r\n tokens.push(context.stringToJS(current, context.variablesDB));\r\n current = \"\";\r\n }\r\n continue;\r\n }\r\n\r\n current += char;\r\n\r\n if (i === expr.length - 1 && current !== \"\") {\r\n tokens.push(context.stringToJS(current, context.variablesDB));\r\n }\r\n }\r\n\r\n if (quote !== \"\") {\r\n throw new Error(\"Unclosed string literal\");\r\n }\r\n\r\n return tokens;\r\n}","export function infixToPostfix(tokens, operator_precedence) {\r\n let output = [];\r\n let stack = [];\r\n\r\n for (let i = 0; i < tokens.length; i++) {\r\n\r\n let token = tokens[i];\r\n\r\n const isOperator =\r\n token === '^' || token === '*' ||\r\n token === '/' || token === '%' ||\r\n token === '+' || token === '-';\r\n\r\n const isLeftParen = token === \"(\";\r\n const isRightParen = token === \")\";\r\n\r\n const isOperand = !isOperator && !isLeftParen && !isRightParen;\r\n\r\n if (isOperand) {\r\n output.push(token);\r\n }\r\n\r\n else if (isOperator) {\r\n\r\n while (stack.length > 0) {\r\n\r\n let top = stack[stack.length - 1];\r\n\r\n if (top === \"(\") break;\r\n\r\n let topPrec = operator_precedence[top] || 0;\r\n let currPrec = operator_precedence[token];\r\n\r\n // Right associativity for ^\r\n if (\r\n (token === '^' && currPrec < topPrec) ||\r\n (token !== '^' && currPrec <= topPrec)\r\n ) {\r\n output.push(stack.pop());\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n stack.push(token);\r\n }\r\n\r\n else if (isLeftParen) {\r\n stack.push(token);\r\n }\r\n\r\n else if (isRightParen) {\r\n\r\n while (stack.length > 0 && stack[stack.length - 1] !== \"(\") {\r\n output.push(stack.pop());\r\n }\r\n\r\n if (stack.length === 0) {\r\n throw new Error(\"Mismatched parentheses: missing '('\");\r\n }\r\n\r\n stack.pop();\r\n }\r\n }\r\n\r\n while (stack.length > 0) {\r\n\r\n let top = stack.pop();\r\n\r\n if (top === \"(\" || top === \")\") {\r\n throw new Error(\"Mismatched parentheses\");\r\n }\r\n\r\n output.push(top);\r\n }\r\n\r\n return output;\r\n}","export function evaluatePostfix(postfix, mathOperations) {\r\n\r\n let stack = [];\r\n\r\n const isOperator = (val) =>\r\n val === '^' || val === '*' ||\r\n val === '/' || val === '%' ||\r\n val === '+' || val === '-';\r\n\r\n for (let i = 0; i < postfix.length; i++) {\r\n\r\n let token = postfix[i];\r\n\r\n if (!isOperator(token)) {\r\n stack.push(token);\r\n continue;\r\n }\r\n\r\n if (stack.length < 2) {\r\n throw new Error(\"Invalid expression: insufficient operands\");\r\n }\r\n\r\n let b = stack.pop(); // second\r\n let a = stack.pop(); // first\r\n\r\n let result;\r\n\r\n switch (token) {\r\n case '^':\r\n result = mathOperations.power(a, b);\r\n break;\r\n case '*':\r\n result = mathOperations.multiply(a, b);\r\n break;\r\n case '/':\r\n result = mathOperations.divide(a, b);\r\n break;\r\n case '%':\r\n result = mathOperations.modulus(a, b);\r\n break;\r\n case '+':\r\n result = mathOperations.add(a, b);\r\n break;\r\n case '-':\r\n result = mathOperations.subtract(a, b);\r\n break;\r\n }\r\n\r\n stack.push(result);\r\n }\r\n\r\n if (stack.length !== 1) {\r\n throw new Error(\"Invalid expression: leftover values in stack\");\r\n }\r\n\r\n return stack[0];\r\n}"],"names":["isValidNumberPair","a","b","mathOperations","Object","freeze","operator_precedence","power","Error","multiply","divide","add","subtract","modulus","and","args","every","Boolean","or","some","not","val","gt","lt","eq","gte","lte","internalFunctions","max","v","Math","min","greaterThan","lessThan","isEqual","greaterThanOrEqual","lessThanOrEqual","if","cond","t","f","externalFunctions","variablesDB","stringToJS","str","length","firstChar","lastChar","test","BigInt","slice","Number","numPart","includes","constructor","this","func_DB_intrnl","func_DB_extrnl","setVariable","name","value","addFunction","fn","call","evaluate","expr","tokens","context","current","quote","i","char","isOperator","isQuote","push","bracket","funcName","arg","quoteFunc","map","tokenize","bind","postfix","output","stack","token","isLeftParen","isRightParen","top","topPrec","currPrec","pop","infixToPostfix","result","evaluatePostfix"],"mappings":"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"}
1
+ {"version":3,"file":"exprify.min.js","sources":["../src/parser/evaluator.js","../src/core/context.js","../src/math/operations.js","../src/utils/globalUnits.js","../src/variables/store.js","../src/function/internal.js","../src/parser/astBuild.js","../src/core/Exprify.js","../src/utils/store.js","../src/function/registry.js","../src/parser/tokenizer.js"],"sourcesContent":["export function evaluateAST(node, context = {}) {\n\n const vars = context.variables;\n const fns = context.functions;\n const units = context.units;\n\n\n const isUnitObj = (v) =>\n v && typeof v === \"object\" && \"value\" in v && \"unit\" in v;\n\n const isComplex = (v) =>\n v && typeof v === \"object\" && \"re\" in v && \"im\" in v;\n\n const isSliceNode = (v) =>\n v && typeof v === \"object\" && v.type === \"SliceExpression\";\n\n const isMatrix = (v) =>\n Array.isArray(v) && v.length > 0 && v.every(Array.isArray);\n\n const cloneValue = (value) => {\n if (Array.isArray(value)) {\n return value.map(cloneValue);\n }\n\n if (value && typeof value === \"object\") {\n return { ...value };\n }\n\n return value;\n };\n\n const normalizeMatrix = (value) => {\n if (isMatrix(value)) return value.map((row) => [...row]);\n if (Array.isArray(value)) return [value];\n throw new Error(\"Expected matrix-compatible value\");\n };\n\n const toOneBasedIndex = (value) => {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 1) {\n throw new Error(\"Matrix indices must be positive integers\");\n }\n\n return value - 1;\n };\n\n const resolveSelector = (selector, contextLength) => {\n if (isSliceNode(selector)) {\n const startValue = selector.start == null ? 1 : evaluateAST(selector.start, context);\n const endValue = selector.end == null ? contextLength : evaluateAST(selector.end, context);\n const start = toOneBasedIndex(startValue);\n const end = toOneBasedIndex(endValue);\n\n if (end < start) {\n return [];\n }\n\n const result = [];\n for (let index = start; index <= end; index++) {\n result.push(index);\n }\n return result;\n }\n\n return [toOneBasedIndex(evaluateAST(selector, context))];\n };\n\n const indexMatrix = (matrix, selectors) => {\n const target = normalizeMatrix(matrix);\n\n if (selectors.length === 1) {\n const rowIndexes = resolveSelector(selectors[0], target.length);\n const rows = rowIndexes.map((rowIndex) => {\n if (rowIndex >= target.length) {\n throw new Error(\"Row index out of range\");\n }\n return [...target[rowIndex]];\n });\n\n return rows.length === 1 ? rows[0] : rows;\n }\n\n const rowIndexes = resolveSelector(selectors[0], target.length);\n const colIndexes = resolveSelector(selectors[1], target[0]?.length || 0);\n\n const values = rowIndexes.map((rowIndex) => {\n if (rowIndex >= target.length) {\n throw new Error(\"Row index out of range\");\n }\n\n return colIndexes.map((colIndex) => {\n if (colIndex >= target[rowIndex].length) {\n throw new Error(\"Column index out of range\");\n }\n return target[rowIndex][colIndex];\n });\n });\n\n if (rowIndexes.length === 1 && colIndexes.length === 1) {\n return values[0][0];\n }\n\n if (rowIndexes.length === 1) {\n return values[0];\n }\n\n if (colIndexes.length === 1) {\n return values.map((row) => [row[0]]);\n }\n\n return values;\n };\n\n const assignMatrixIndex = (matrix, selectors, value) => {\n const target = isMatrix(matrix)\n ? matrix.map((row) => [...row])\n : Array.isArray(matrix)\n ? [matrix.slice()]\n : [];\n\n const rowSelector = selectors[0];\n const colSelector = selectors[1];\n\n if (!rowSelector) {\n throw new Error(\"Matrix assignment requires at least one index\");\n }\n\n const rowContextLength = Math.max(target.length, 1);\n const rowIndexes = resolveSelector(rowSelector, rowContextLength);\n\n if (selectors.length === 1) {\n const rowsValue = isMatrix(value) ? value : normalizeMatrix(value);\n\n if (rowsValue.length !== rowIndexes.length) {\n throw new Error(\"Assigned row count does not match slice\");\n }\n\n rowIndexes.forEach((rowIndex, index) => {\n target[rowIndex] = [...rowsValue[index]];\n });\n\n return {\n updatedMatrix: target,\n selectionResult: rowIndexes.length === 1 ? [target[rowIndexes[0]]] : rowIndexes.map((rowIndex) => [target[rowIndex]])\n };\n }\n\n const maxCols = Math.max(...target.map((row) => row.length), 0, 1);\n const colIndexes = resolveSelector(colSelector, maxCols);\n const normalizedValue = normalizeMatrix(value);\n\n if (normalizedValue.length !== rowIndexes.length) {\n throw new Error(\"Assigned row count does not match matrix slice\");\n }\n\n normalizedValue.forEach((row, rowOffset) => {\n if (row.length !== colIndexes.length) {\n throw new Error(\"Assigned column count does not match matrix slice\");\n }\n });\n\n rowIndexes.forEach((rowIndex, rowOffset) => {\n if (!target[rowIndex]) {\n target[rowIndex] = [];\n }\n\n colIndexes.forEach((colIndex, colOffset) => {\n target[rowIndex][colIndex] = normalizedValue[rowOffset][colOffset];\n });\n });\n\n return {\n updatedMatrix: target,\n selectionResult: rowIndexes.length === 1\n ? [colIndexes.map((colIndex) => target[rowIndexes[0]][colIndex])]\n : rowIndexes.map((rowIndex) => colIndexes.map((colIndex) => target[rowIndex][colIndex]))\n };\n };\n\n const multiplyMatrices = (left, right) => {\n const a = normalizeMatrix(left);\n const b = normalizeMatrix(right);\n\n if (a[0].length !== b.length) {\n throw new Error(\"Matrix dimensions do not allow multiplication\");\n }\n\n return a.map((row) =>\n b[0].map((_, colIndex) =>\n row.reduce((sum, value, rowIndex) => sum + (value * b[rowIndex][colIndex]), 0)\n )\n );\n };\n\n const toComplex = (value) => {\n if (isComplex(value)) return value;\n if (typeof value === \"number\") return { re: value, im: 0 };\n throw new Error(\"Complex arithmetic only supports numbers\");\n };\n\n const fromImaginary = (value) => ({ re: 0, im: value });\n\n const simplifyComplex = (value) =>\n value.im === 0 ? value.re : value;\n\n const evalComplexBinary = (operator, left, right) => {\n const a = toComplex(left);\n const b = toComplex(right);\n\n switch (operator) {\n case \"+\":\n return simplifyComplex({ re: a.re + b.re, im: a.im + b.im });\n case \"-\":\n return simplifyComplex({ re: a.re - b.re, im: a.im - b.im });\n case \"*\":\n return simplifyComplex({\n re: (a.re * b.re) - (a.im * b.im),\n im: (a.re * b.im) + (a.im * b.re)\n });\n case \"/\": {\n const denominator = (b.re ** 2) + (b.im ** 2);\n\n if (denominator === 0) {\n throw new Error(\"Division by zero\");\n }\n\n return simplifyComplex({\n re: ((a.re * b.re) + (a.im * b.im)) / denominator,\n im: ((a.im * b.re) - (a.re * b.im)) / denominator\n });\n }\n default:\n throw new Error(`Operator ${operator} is not supported for complex numbers`);\n }\n };\n\n /* ================= EVALUATOR ================= */\n\n switch (node.type) {\n\n /* ===== LITERAL ===== */\n case \"Literal\":\n return node.value;\n\n case \"ImaginaryLiteral\":\n return fromImaginary(node.value);\n\n case \"UnitLiteral\":\n return { value: node.value, unit: node.unit };\n\n /* ===== VARIABLE ===== */\n case \"Identifier\":\n return vars.get(node.name);\n\n /* ===== ASSIGNMENT ===== */\n case \"AssignmentExpression\": {\n const value = evaluateAST(node.right, context);\n\n if (node.left.type === \"Identifier\") {\n vars.set(node.left.name, value);\n return value;\n }\n\n if (node.left.type === \"IndexExpression\" && node.left.object.type === \"Identifier\") {\n const currentValue = vars.get(node.left.object.name);\n const assigned = assignMatrixIndex(currentValue, node.left.selectors, value);\n vars.set(node.left.object.name, assigned.updatedMatrix);\n return assigned.selectionResult;\n }\n\n throw new Error(\"Invalid assignment target\");\n }\n\n /* ===== UNARY ===== */\n case \"UnaryExpression\": {\n const val = evaluateAST(node.argument, context);\n\n switch (node.operator) {\n case \"-\":\n return isComplex(val)\n ? simplifyComplex({ re: -val.re, im: -val.im })\n : -val;\n case \"!\": return !val;\n }\n\n throw new Error(`Unknown unary operator ${node.operator}`);\n }\n\n /* ===== BINARY ===== */\n case \"BinaryExpression\": {\n let left = evaluateAST(node.left, context);\n let right = evaluateAST(node.right, context);\n\n // 🔥 UNIT handling\n if (isUnitObj(left) || isUnitObj(right)) {\n\n if (!units) throw new Error(\"Unit system not available\");\n\n return units.compute(node.operator, left, right);\n }\n\n if (node.operator === \"*\" && (Array.isArray(left) || Array.isArray(right))) {\n return multiplyMatrices(left, right);\n }\n\n if (isComplex(left) || isComplex(right)) {\n return evalComplexBinary(node.operator, left, right);\n }\n\n switch (node.operator) {\n case \"+\": return left + right;\n case \"-\": return left - right;\n case \"*\": return left * right;\n case \"/\": return left / right;\n case \"%\": return left % right;\n case \"^\": return left ** right;\n\n case \">\": return left > right;\n case \"<\": return left < right;\n case \">=\": return left >= right;\n case \"<=\": return left <= right;\n case \"==\": return left === right;\n }\n\n throw new Error(`Unknown operator ${node.operator}`);\n }\n\n /* ===== LOGICAL ===== */\n case \"LogicalExpression\": {\n const left = evaluateAST(node.left, context);\n\n if (node.operator === \"&&\") {\n return left && evaluateAST(node.right, context);\n }\n\n if (node.operator === \"||\") {\n return left || evaluateAST(node.right, context);\n }\n\n if (node.operator === \"??\") {\n return left ?? evaluateAST(node.right, context);\n }\n\n throw new Error(`Unknown logical operator ${node.operator}`);\n }\n\n /* ===== FUNCTION CALL ===== */\n case \"CallExpression\": {\n const fnName = node.callee.name;\n const fn = fns.get(fnName);\n\n const args = node.arguments.map(arg =>\n evaluateAST(arg, context)\n );\n\n return fn(...args);\n }\n\n /* ===== PIPELINE ===== */\n case \"PipelineExpression\": {\n const leftVal = evaluateAST(node.left, context);\n\n // right must be function\n if (node.right.type === \"CallExpression\") {\n const fnName = node.right.callee.name;\n const fn = fns.get(fnName);\n\n const args = [\n leftVal,\n ...node.right.arguments.map(arg =>\n evaluateAST(arg, context)\n )\n ];\n\n return fn(...args);\n }\n\n if (node.right.type === \"Identifier\") {\n const fn = fns.get(node.right.name);\n return fn(leftVal);\n }\n\n throw new Error(\"Invalid pipeline target\");\n }\n\n /* ===== UNIT CONVERSION ===== */\n case \"UnitConversion\": {\n const from = evaluateAST(node.from, context);\n\n if (!isUnitObj(from)) {\n throw new Error(\"Left side must be a unit value\");\n }\n\n if (!units) {\n throw new Error(\"Unit system not available\");\n }\n\n return units.convert(from.value, from.unit, node.to);\n }\n\n /* ===== ARRAY ===== */\n case \"ArrayExpression\":\n return node.elements.map(el => evaluateAST(el, context));\n\n case \"IndexExpression\": {\n const target = evaluateAST(node.object, context);\n return indexMatrix(target, node.selectors);\n }\n\n /* ===== OBJECT ===== */\n case \"ObjectExpression\": {\n const obj = {};\n for (let p of node.properties) {\n obj[p.key] = evaluateAST(p.value, context);\n }\n return obj;\n }\n\n /* ===== MEMBER ===== */\n case \"MemberExpression\": {\n const obj = evaluateAST(node.object, context);\n\n if (node.optional && obj == null) return undefined;\n\n return obj[node.property.name];\n }\n\n default:\n throw new Error(`Unknown AST node type: ${node.type}`);\n }\n}\n","export function createContext({ variables, functions, units, evaluate}) {\n if (!variables) throw new Error(\"Variable store missing\");\n if (!functions) throw new Error(\"Function registry missing\");\n if (!units) throw new Error(\"Units list missing\");\n if (!evaluate) throw new Error(\"evaluate function missing\");\n\n return {\n variables: variables,\n functions: functions,\n units: units,\n evaluate,\n withScope(scope = {}) {\n const tempVars = {\n ...variables.all?.(),\n ...scope\n };\n return createContext({\n functions: functions,\n evaluate,\n units,\n variables: {\n get: (k) => tempVars[k],\n set: (k, v) => (tempVars[k] = v),\n all: () => tempVars\n }\n });\n\n }\n };\n}","const isValidNumberPair = (a, b) =>\n (typeof a === typeof b) &&\n (typeof a === 'number' || typeof a === 'bigint');\n\nexport const mathOperations = Object.freeze({\n power: function(a, b) {\n if (isValidNumberPair(a, b)) return a ** b;\n throw new Error(\"Invalid types for ^\");\n },\n\n multiply: function(a, b) {\n if (isValidNumberPair(a, b)) return a * b;\n throw new Error(\"Invalid types for *\");\n },\n\n divide: function(a, b) {\n if (isValidNumberPair(a, b)) {\n if (b === 0) throw new Error(\"Division by zero\");\n return a / b;\n }\n throw new Error(\"Invalid types for /\");\n },\n\n add: function(a, b) {\n if (isValidNumberPair(a, b)) return a + b;\n if (typeof a === 'string' && typeof b === 'string') return a + b;\n throw new Error(\"Invalid types for +\");\n },\n subtract: function(a, b) {\n if (isValidNumberPair(a, b)) return a - b;\n throw new Error(\"Invalid types for -\");\n },\n\n modulus: function(a, b) {\n if (isValidNumberPair(a, b)) return a % b;\n throw new Error(\"Invalid types for %\");\n }\n});","export const globalUnits = {\n // Length\n length: {\n m: { value: 1, unit: 'meter', symbol: 'm' },\n cm: { value: 0.01, unit: 'centimeter', symbol: 'cm' },\n mm: { value: 0.001, unit: 'millimeter', symbol: 'mm' },\n km: { value: 1000, unit: 'kilometer', symbol: 'km' },\n um: { value: 0.000001, unit: 'micrometer', symbol: 'um', note: 'also called micron' },\n nm: { value: 0.000000001, unit: 'nanometer', symbol: 'nm' },\n px: { value: 0.000264583, unit: 'pixel', symbol: 'px', note: '96dpi standard' },\n em: { value: 0.000264583 * 16, unit: 'em', symbol: 'em', note: '1em = 16px by default' },\n rem: { value: 0.000264583 * 16, unit: 'rem', symbol: 'rem', note: 'root em = 16px by default' },\n pt: { value: 0.000352778, unit: 'point', symbol: 'pt', note: '1pt = 1/72 inch' },\n pc: { value: 0.00423333, unit: 'pica', symbol: 'pc', note: '1pc = 12pt' },\n inch: { value: 0.0254, unit: 'inch', symbol: 'in' },\n ft: { value: 0.3048, unit: 'foot', symbol: 'ft' },\n yd: { value: 0.9144, unit: 'yard', symbol: 'yd' },\n mi: { value: 1609.344, unit: 'mile', symbol: 'mi' },\n thou: { value: 0.0000254, unit: 'mil', symbol: 'thou', note: 'thousandth of an inch' },\n furlong: { value: 201.168, unit: 'furlong', symbol: 'fur', note: '220 yards' },\n nmi: { value: 1852, unit: 'nautical mile', symbol: 'nmi' },\n fathom: { value: 1.8288, unit: 'fathom', symbol: 'fathom' },\n au: { value: 1.496e11, unit: 'astronomical unit', symbol: 'AU' },\n ly: { value: 9.4607e15, unit: 'light year', symbol: 'ly' },\n pc: { value: 3.0857e16, unit: 'parsec', symbol: 'pc' }\n },\n\n // Weight / Mass\n weight: {\n mg: { value: 1e-6, unit: 'milligram', symbol: 'mg' },\n g: { value: 0.001, unit: 'gram', symbol: 'g' },\n kg: { value: 1, unit: 'kilogram', symbol: 'kg' },\n t: { value: 1000, unit: 'tonne', symbol: 't', note: 'metric ton' },\n lb: { value: 0.453592, unit: 'pound', symbol: 'lb' },\n oz: { value: 0.0283495, unit: 'ounce', symbol: 'oz' },\n stone: { value: 6.35029, unit: 'stone', symbol: 'st', note: '1 stone = 14 lb' }\n },\n\n // Time\n time: {\n s: { value: 1, unit: 'second', symbol: 's' },\n min: { value: 60, unit: 'minute', symbol: 'min' },\n h: { value: 3600, unit: 'hour', symbol: 'h' },\n day: { value: 86400, unit: 'day', symbol: 'd' },\n week: { value: 604800, unit: 'week', symbol: 'wk' },\n month: { value: 2629800, unit: 'month', symbol: 'mo', note: 'average month = 30.44 days' },\n year: { value: 31557600, unit: 'year', symbol: 'yr', note: 'average year = 365.25 days' }\n },\n\n // Voltage\n voltage: {\n V: { value: 1, unit: 'volt', symbol: 'V' },\n mV: { value: 0.001, unit: 'millivolt', symbol: 'mV' },\n kV: { value: 1000, unit: 'kilovolt', symbol: 'kV' },\n MV: { value: 1e6, unit: 'megavolt', symbol: 'MV' },\n GV: { value: 1e9, unit: 'gigavolt', symbol: 'GV' },\n statV: { value: 299.792458, unit: 'statvolt', symbol: 'statV', note: 'CGS unit' },\n abV: { value: 1e-8, unit: 'abvolt', symbol: 'abV', note: 'CGS electromagnetic unit' }\n },\n\n // Frequency\n frequency: {\n Hz: { value: 1, unit: 'hertz', symbol: 'Hz', note: '1 cycle per second' },\n kHz: { value: 1e3, unit: 'kilohertz', symbol: 'kHz' },\n MHz: { value: 1e6, unit: 'megahertz', symbol: 'MHz' },\n GHz: { value: 1e9, unit: 'gigahertz', symbol: 'GHz' },\n THz: { value: 1e12, unit: 'terahertz', symbol: 'THz' }\n },\n\n // Power\n power: {\n W: { value: 1, unit: 'watt', symbol: 'W', note: '1 joule per second' },\n mW: { value: 0.001, unit: 'milliwatt', symbol: 'mW' },\n kW: { value: 1000, unit: 'kilowatt', symbol: 'kW' },\n MW: { value: 1e6, unit: 'megawatt', symbol: 'MW' },\n GW: { value: 1e9, unit: 'gigawatt', symbol: 'GW' },\n HP: { value: 745.7, unit: 'horsepower', symbol: 'HP', note: 'mechanical HP = 745.7 W' },\n kcal_per_h: { value: 1.163, unit: 'kilocalorie per hour', symbol: 'kcal/h', note: '= 1.163 W' },\n BTU_per_h: { value: 0.29307107, unit: 'BTU per hour', symbol: 'BTU/h', note: '= 0.293 W' }\n },\n\n // Sound\n sound: {\n dB: { value: 1, unit: 'decibel', symbol: 'dB', note: 'logarithmic unit of sound intensity' },\n dBA: { value: 1, unit: 'A-weighted decibel', symbol: 'dBA', note: 'Adjusted for human hearing' },\n dBC: { value: 1, unit: 'C-weighted decibel', symbol: 'dBC', note: 'Flat weighting for high-level sounds' }\n },\n\n // Temperature\n temperature: {\n K: { value: 1, unit: 'kelvin', symbol: 'K' },\n C: { value: 1, unit: 'Celsius', symbol: '°C', note: '°C → K: add 273.15' },\n F: { value: 1, unit: 'Fahrenheit', symbol: '°F', note: '°F → K: (°F - 32) * 5/9 + 273.15' }\n },\n\n // Pressure\n pressure: {\n Pa: { value: 1, unit: 'pascal', symbol: 'Pa' },\n kPa: { value: 1000, unit: 'kilopascal', symbol: 'kPa' },\n MPa: { value: 1e6, unit: 'megapascal', symbol: 'MPa' },\n bar: { value: 1e5, unit: 'bar', symbol: 'bar' },\n atm: { value: 101325, unit: 'atmosphere', symbol: 'atm' },\n psi: { value: 6894.757, unit: 'pound per square inch', symbol: 'psi' },\n mmHg:{ value: 133.322, unit: 'millimeter of mercury', symbol: 'mmHg' }\n },\n\n // Energy\n energy: {\n J: { value: 1, unit: 'joule', symbol: 'J' },\n kJ: { value: 1000, unit: 'kilojoule', symbol: 'kJ' },\n cal: { value: 4.184, unit: 'calorie', symbol: 'cal' },\n kcal:{ value: 4184, unit: 'kilocalorie', symbol: 'kcal' },\n eV: { value: 1.60218e-19, unit: 'electronvolt', symbol: 'eV' },\n BTU: { value: 1055.06, unit: 'BTU', symbol: 'BTU' }\n },\n\n // Force\n force: {\n N: { value: 1, unit: 'newton', symbol: 'N' },\n kN: { value: 1000, unit: 'kilonewton', symbol: 'kN' },\n lbf: { value: 4.44822, unit: 'pound-force', symbol: 'lbf' },\n kgf: { value: 9.80665, unit: 'kilogram-force', symbol: 'kgf' },\n dyne:{ value: 1e-5, unit: 'dyne', symbol: 'dyn' }\n },\n\n // Area\n area: {\n m2: { value: 1, unit: 'square meter', symbol: 'm²' },\n cm2: { value: 0.0001, unit: 'square centimeter', symbol: 'cm²' },\n km2: { value: 1e6, unit: 'square kilometer', symbol: 'km²' },\n acre: { value: 4046.856, unit: 'acre', symbol: 'acre' },\n hectare:{ value: 10000, unit: 'hectare', symbol: 'ha' },\n ft2: { value: 0.092903, unit: 'square foot', symbol: 'ft²' },\n yd2: { value: 0.836127, unit: 'square yard', symbol: 'yd²' }\n },\n\n // Volume\n volume: {\n m3: { value: 1, unit: 'cubic meter', symbol: 'm³' },\n L: { value: 0.001, unit: 'liter', symbol: 'L' },\n mL: { value: 1e-6, unit: 'milliliter', symbol: 'mL' },\n gallon:{ value: 0.00378541, unit: 'US gallon', symbol: 'gal' },\n pint: { value: 0.000473176, unit: 'US pint', symbol: 'pt' },\n floz: { value: 2.9574e-5, unit: 'US fluid ounce', symbol: 'fl oz' }\n },\n\n // Electrical Current\n current: {\n A: { value: 1, unit: 'ampere', symbol: 'A' },\n mA: { value: 0.001, unit: 'milliampere', symbol: 'mA' },\n uA: { value: 0.000001, unit: 'microampere', symbol: 'uA' },\n kA: { value: 1000, unit: 'kiloampere', symbol: 'kA' }\n },\n\n // Resistance / Conductance\n resistance: {\n ohm: { value: 1, unit: 'ohm' },\n kohm: { value: 1000, unit: 'kiloohm'},\n megaohm: { value: 1e6, unit: 'megaohm'},\n S: { value: 1, unit: 'siemens', symbol: 'S', note: 'conductance' }\n },\n\n // Capacitance / Inductance\n capacitance: {\n F: { value: 1, unit: 'farad', symbol: 'F' },\n mF: { value: 0.001, unit: 'millifarad'},\n uF: { value: 0.000001, unit: 'microfarad' }\n },\n inductance: {\n H: { value: 1, unit: 'henry', symbol: 'H' },\n mH: { value: 0.001, unit: 'millihenry', symbol: 'mH' },\n uH: { value: 0.000001, unit: 'microhenry', symbol: 'uH' }\n },\n\n // Luminous Intensity / Illuminance\n light: {\n cd: { value: 1, unit: 'candela', symbol: 'cd' },\n lm: { value: 1, unit: 'lumen', symbol: 'lm' },\n lx: { value: 1, unit: 'lux', symbol: 'lx' }\n },\n\n // Data / Digital Storage\n data: {\n bit: { value: 1, unit: 'bit', symbol: 'bit' },\n B: { value: 8, unit: 'byte', symbol: 'B' },\n KB: { value: 8e3, unit: 'kilobyte', symbol: 'KB' },\n MB: { value: 8e6, unit: 'megabyte', symbol: 'MB' },\n GB: { value: 8e9, unit: 'gigabyte', symbol: 'GB' },\n TB: { value: 8e12, unit: 'terabyte', symbol: 'TB' }\n },\n\n // Angle\n angle: {\n deg: { value: 1, unit: 'degree', symbol: '°' },\n rad: { value: 57.2958, unit: 'radian', symbol: 'rad', note: '1 rad = 57.2958°' },\n grad:{ value: 0.9, unit: 'grad', symbol: 'grad', note: '1 grad = 0.9°' }\n },\n radiation: {\n // Absorbed Dose\n Gy: { value: 1, unit: 'gray', symbol: 'Gy', note: 'Absorbed dose: 1 Gy = 1 J/kg' },\n mGy: { value: 0.001, unit: 'milligray', symbol: 'mGy' },\n rad: { value: 0.01, unit: 'rad', symbol: 'rad', note: '1 rad = 0.01 Gy' },\n\n // Dose Equivalent\n Sv: { value: 1, unit: 'sievert', symbol: 'Sv', note: 'Biological effect dose equivalent' },\n mSv: { value: 0.001, unit: 'millisievert', symbol: 'mSv' },\n rem: { value: 0.01, unit: 'rem', symbol: 'rem', note: '1 rem = 0.01 Sv' },\n\n // Radioactivity\n Bq: { value: 1, unit: 'becquerel', symbol: 'Bq', note: '1 decay per second' },\n kBq: { value: 1e3, unit: 'kilobecquerel', symbol: 'kBq' },\n MBq: { value: 1e6, unit: 'megabecquerel', symbol: 'MBq' },\n GBq: { value: 1e9, unit: 'gigabecquerel', symbol: 'GBq' },\n Ci: { value: 3.7e10, unit: 'curie', symbol: 'Ci', note: '1 Ci = 3.7 x 10¹⁰ decays per second' },\n mCi: { value: 3.7e7, unit: 'millicurie', symbol: 'mCi' }\n }\n};","const validVarName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\nexport function createVarStore(initial = {}) {\n let store = Object.create(null);\n \n\n for (const key in initial) {\n store[key] = initial[key];\n }\n\n return {\n set(name, value, { override = true } = {}) {\n\n // Name validation\n if (typeof name !== \"string\" || !name) {\n throw new Error(\"Variable name must be a non-empty string\");\n }\n\n if (!validVarName.test(name)) {\n throw new Error(`Variable Name Error: '${name}' is not a valid variable name`);\n }\n\n // Value validation\n if (value === undefined) {\n throw new Error(`Variable Value Error: '${name}' cannot be undefined`);\n }\n\n // Prevent overwrite (optional)\n if (!override && name in variablesDB) {\n throw new Error(`Variable '${name}' already exists`);\n }\n\n store[name] = value;\n },\n\n //get variable\n get(name) {\n return store[name];\n },\n\n // check existence\n has(name) {\n return Object.prototype.hasOwnProperty.call(store, name);\n },\n\n // remove variable\n remove(name) {\n delete store[name];\n },\n\n // get all variables (snapshot)\n all() {\n return { ...store };\n },\n\n // clear all\n clear() {\n store = Object.create(null);\n },\n\n // merge multiple variables\n merge(obj = {}) {\n for (const key in obj) {\n store[key] = obj[key];\n }\n },\n\n // clone store (for scoped instances) \n clone() {\n return createVarStore(store);\n }\n };\n}\n\nexport default { createVarStore };","function validateSquareMatrix(matrix) {\n if (!Array.isArray(matrix) || matrix.length === 0) {\n throw new Error(\"det() expects a non-empty matrix\");\n }\n\n if (!matrix.every(Array.isArray)) {\n throw new Error(\"det() expects a 2D matrix\");\n }\n\n const size = matrix.length;\n if (!matrix.every((row) => row.length === size)) {\n throw new Error(\"det() expects a square matrix\");\n }\n\n for (const row of matrix) {\n for (const value of row) {\n if (typeof value !== \"number\" && typeof value !== \"bigint\") {\n throw new Error(\"det() matrix values must be numeric\");\n }\n }\n }\n}\n\nfunction determinant(matrix) {\n validateSquareMatrix(matrix);\n\n if (matrix.length === 1) {\n return matrix[0][0];\n }\n\n if (matrix.length === 2) {\n return (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);\n }\n\n return matrix[0].reduce((sum, value, columnIndex) => {\n const minor = matrix.slice(1).map((row) =>\n row.filter((_, index) => index !== columnIndex)\n );\n const cofactor = columnIndex % 2 === 0 ? value : -value;\n return sum + (cofactor * determinant(minor));\n }, 0);\n}\n\nfunction splitTerms(expression) {\n const normalized = expression.replace(/\\s+/g, \"\");\n if (!normalized) {\n return [];\n }\n\n return normalized\n .replace(/-/g, \"+-\")\n .split(\"+\")\n .filter(Boolean);\n}\n\nfunction parsePolynomial(expression, variable) {\n const terms = splitTerms(expression);\n const coefficients = new Map();\n\n for (const term of terms) {\n if (term.includes(variable)) {\n const [rawCoeff, rawPower] = term.split(variable);\n let coefficient;\n\n if (rawCoeff === \"\" || rawCoeff === \"+\") coefficient = 1;\n else if (rawCoeff === \"-\") coefficient = -1;\n else {\n const cleaned = rawCoeff.endsWith(\"*\") ? rawCoeff.slice(0, -1) : rawCoeff;\n coefficient = Number(cleaned);\n }\n\n if (!Number.isFinite(coefficient)) {\n throw new Error(\"Unsupported algebra term\");\n }\n\n let power = 1;\n if (rawPower) {\n if (!rawPower.startsWith(\"^\")) {\n throw new Error(\"Unsupported algebra term\");\n }\n\n power = Number(rawPower.slice(1));\n }\n\n if (!Number.isInteger(power) || power < 0) {\n throw new Error(\"Only non-negative integer powers are supported\");\n }\n\n coefficients.set(power, (coefficients.get(power) || 0) + coefficient);\n } else {\n const constant = Number(term);\n if (!Number.isFinite(constant)) {\n throw new Error(\"Unsupported algebra term\");\n }\n coefficients.set(0, (coefficients.get(0) || 0) + constant);\n }\n }\n\n return coefficients;\n}\n\nfunction formatPolynomial(coefficients, variable) {\n const ordered = [...coefficients.entries()]\n .filter(([, coefficient]) => coefficient !== 0)\n .sort((a, b) => b[0] - a[0]);\n\n if (!ordered.length) {\n return \"0\";\n }\n\n return ordered.map(([power, coefficient], index) => {\n const negative = coefficient < 0;\n const absCoeff = Math.abs(coefficient);\n let body;\n\n if (power === 0) {\n body = `${absCoeff}`;\n } else if (power === 1) {\n body = absCoeff === 1 ? variable : `${absCoeff} * ${variable}`;\n } else {\n body = absCoeff === 1\n ? `${variable}^${power}`\n : `${absCoeff} * ${variable}^${power}`;\n }\n\n if (index === 0) {\n return negative ? `-${body}` : body;\n }\n\n return negative ? `- ${body}` : `+ ${body}`;\n }).join(\" \");\n}\n\nfunction simplifyExpression(expression) {\n const compact = expression.replace(/\\s+/g, \"\");\n const variableMatch = compact.match(/[a-zA-Z]+/);\n const variable = variableMatch?.[0] || \"x\";\n const coefficients = parsePolynomial(expression, variable);\n return formatPolynomial(coefficients, variable);\n}\n\nfunction derivativeExpression(expression, variable) {\n const coefficients = parsePolynomial(expression, variable);\n const derived = new Map();\n\n for (const [power, coefficient] of coefficients.entries()) {\n if (power === 0) continue;\n derived.set(power - 1, (derived.get(power - 1) || 0) + (coefficient * power));\n }\n\n return formatPolynomial(derived, variable);\n}\n\nexport const internalFunctions = {\n max: (...args) => {\n if (!args.length) throw new Error(\"max() requires arguments\");\n return Math.max(...args);\n },\n\n min: (...args) => {\n if (!args.length) throw new Error(\"min() requires arguments\");\n return Math.min(...args);\n },\n\n abs: (x) => Math.abs(x),\n\n round: (x) => Math.round(x),\n\n floor: (x) => Math.floor(x),\n\n ceil: (x) => Math.ceil(x),\n\n sqrt: (x) => {\n if (x < 0) throw new Error(\"sqrt() domain error\");\n return Math.sqrt(x);\n },\n\n pow: (a, b) => a ** b,\n det: (matrix) => determinant(matrix),\n simplify: (expression) => {\n if (typeof expression !== \"string\") {\n throw new Error(\"simplify() expects an expression string\");\n }\n return simplifyExpression(expression);\n },\n derivative: (expression, variable = \"x\") => {\n if (typeof expression !== \"string\" || typeof variable !== \"string\") {\n throw new Error(\"derivative() expects expression and variable strings\");\n }\n return derivativeExpression(expression, variable);\n },\n\n /* ================= TRIGONOMETRY ================= */\n\n sin: (x) => Math.sin(x),\n cos: (x) => Math.cos(x),\n tan: (x) => Math.tan(x),\n\n asin: (x) => Math.asin(x),\n acos: (x) => Math.acos(x),\n atan: (x) => Math.atan(x),\n\n /* ================= LOG / EXP ================= */\n\n log: (x) => {\n if (x <= 0) throw new Error(\"log() domain error\");\n return Math.log(x);\n },\n\n log10: (x) => {\n if (x <= 0) throw new Error(\"log10() domain error\");\n return Math.log10(x);\n },\n\n exp: (x) => Math.exp(x),\n\n /* ================= RANDOM ================= */\n\n random: () => Math.random(),\n\n /* ================= BOOLEAN / LOGIC ================= */\n\n and: (a, b) => Boolean(a && b),\n\n or: (a, b) => Boolean(a || b),\n\n not: (a) => !a,\n \"!\": (a) => !a,\n\n /* ================= COMPARISON ================= */\n\n eq: (a, b) => a === b,\n\n neq: (a, b) => a !== b,\n \"notEqual\": (a, b) => a !== b,\n\n gt: (a, b) => a > b,\n \"greaterThan\": (a, b) => a > b,\n\n lt: (a, b) => a < b,\n \"lessThan\": (a, b) => a < b,\n\n gte: (a, b) => a >= b,\n \"greaterThanOrEqual\": (a, b) => a >= b,\n\n lte: (a, b) => a <= b,\n \"lessThanOrEqual\": (a, b) => a <= b,\n\n /* ================= UTILITY ================= */\n\n clamp: (x, min, max) => {\n if (min > max) throw new Error(\"clamp(): min > max\");\n return Math.min(Math.max(x, min), max);\n },\n\n if: (condition, a, b) => (condition ? a : b),\n\n /* ================= TYPE ================= */\n\n typeof: (x) => typeof x,\n\n /* ================= STRING ================= */\n\n length: (x) => {\n if (typeof x === \"string\" || Array.isArray(x)) {\n return x.length;\n }\n throw new Error(\"length() expects string or array\");\n }\n};\n","export function buildAST(tokens) {\n let current = 0;\n\n const peek = () => tokens[current];\n const consume = () => tokens[current++];\n\n const match = (type, value) => {\n const t = peek();\n if (!t) return false;\n\n if (t.type !== type) return false;\n\n if (value !== undefined && t.value !== value) return false;\n\n current++;\n return true;\n };\n\n const parseSliceOrIndex = () => {\n let start = null;\n\n if (!(peek()?.type === \"Colon\" || peek()?.type === \"Comma\" || peek()?.type === \"ArrayEnd\")) {\n start = parseExpression();\n }\n\n if (match(\"Colon\")) {\n let end = null;\n\n if (!(peek()?.type === \"Comma\" || peek()?.type === \"ArrayEnd\")) {\n end = parseExpression();\n }\n\n return {\n type: \"SliceExpression\",\n start,\n end\n };\n }\n\n return start;\n };\n\n /* ================= PRIMARY ================= */\n function parsePrimary() {\n const token = consume();\n if (!token) throw new Error(\"Unexpected end of input\");\n\n switch (token.type) {\n case \"Number\":\n case \"BigInt\":\n case \"Boolean\":\n case \"String\":\n return { type: \"Literal\", value: token.value };\n\n case \"ImaginaryLiteral\":\n return { type: \"ImaginaryLiteral\", value: token.value };\n\n case \"NumberWithUnit\":\n return {\n type: \"UnitLiteral\",\n value: token.value,\n unit: token.unit\n };\n\n case \"Identifier\":\n return { type: \"Identifier\", name: token.name };\n \n case \"Function\": // 🔥 ADD THIS\n return {\n type: \"Identifier\",\n name: token.name\n };\n\n case \"Parenthesis\":\n if (token.value === \"(\") {\n const expr = parseExpression();\n\n if (!match(\"Parenthesis\", \")\")) {\n throw new Error(`Expected ')'`);\n }\n\n return expr;\n }\n \n case \"ArrayStart\": {\n const rows = [];\n let currentRow = [];\n\n if (!match(\"ArrayEnd\")) {\n while (true) {\n currentRow.push(parseExpression());\n\n if (match(\"Comma\")) {\n continue;\n }\n\n if (match(\"Semicolon\")) {\n rows.push(currentRow);\n currentRow = [];\n continue;\n }\n\n if (match(\"ArrayEnd\")) {\n rows.push(currentRow);\n break;\n }\n\n throw new Error(`Expected ',', ';', or ']' at ${current}`);\n }\n }\n\n if (!rows.length) {\n return { type: \"ArrayExpression\", elements: [] };\n }\n\n if (rows.length === 1) {\n return { type: \"ArrayExpression\", elements: rows[0] };\n }\n\n return {\n type: \"ArrayExpression\",\n elements: rows.map((elements) => ({\n type: \"ArrayExpression\",\n elements\n }))\n };\n }\n\n case \"BlockStart\": {\n const properties = [];\n\n if (!match(\"BlockEnd\")) {\n do {\n const keyToken = consume();\n\n if (\n keyToken.type !== \"Identifier\" &&\n keyToken.type !== \"String\"\n ) {\n throw new Error(\"Invalid object key\");\n }\n\n if (!match(\"Colon\")) {\n throw new Error(\"Expected ':' after key\");\n }\n\n const value = parseExpression();\n\n properties.push({\n key: keyToken.value,\n value\n });\n\n } while (match(\"Comma\"));\n\n if (!match(\"BlockEnd\")) {\n throw new Error(`Expected '}' at ${current}`);\n }\n }\n\n return { type: \"ObjectExpression\", properties };\n }\n }\n\n throw new Error(`Unexpected token: ${JSON.stringify(token)}`);\n }\n\n /* ================= MEMBER ================= */\n function parseMember() {\n let object = parsePrimary();\n\n while (true) {\n if (match(\"ArrayStart\")) {\n const selectors = [];\n\n if (!match(\"ArrayEnd\")) {\n do {\n selectors.push(parseSliceOrIndex());\n } while (match(\"Comma\"));\n\n if (!match(\"ArrayEnd\")) {\n throw new Error(`Expected ']' at ${current}`);\n }\n }\n\n object = {\n type: \"IndexExpression\",\n object,\n selectors\n };\n continue;\n }\n\n if (match(\"Dot\")) {\n const property = consume();\n\n if (property.type !== \"Identifier\") {\n throw new Error(\"Expected property after '.'\");\n }\n\n object = {\n type: \"MemberExpression\",\n object,\n property: { type: \"Identifier\", name: property.value },\n optional: false\n };\n continue;\n }\n\n if (match(\"Operator\", \"?.\")) {\n const property = consume();\n\n object = {\n type: \"MemberExpression\",\n object,\n property: { type: \"Identifier\", name: property.value },\n optional: true\n };\n continue;\n }\n\n break;\n }\n\n return object;\n }\n\n /* ================= CALL ================= */\n function parseCallChain() {\n let expr = parseMember();\n\n while (peek()?.type === \"Parenthesis\" && peek()?.value === \"(\") {\n consume(); // '('\n\n const args = [];\n\n if (!(peek()?.type === \"Parenthesis\" && peek()?.value === \")\")) {\n do {\n args.push(parseExpression());\n } while (match(\"Comma\"));\n }\n\n if (!match(\"Parenthesis\", \")\")) {\n throw new Error(`Expected ')' at ${current}`);\n }\n\n expr = {\n type: \"CallExpression\",\n callee: expr,\n arguments: args\n };\n }\n\n return expr;\n }\n\n /* ================= UNARY ================= */\n function parseUnary() {\n if (match(\"UnaryOperator\")) {\n const operator = tokens[current - 1].value;\n\n return {\n type: \"UnaryExpression\",\n operator,\n argument: parseUnary()\n };\n }\n\n return parseCallChain();\n }\n\n /* ================= POWER ================= */\n function parsePower() {\n let left = parseUnary();\n\n if (match(\"Operator\", \"^\")) {\n const right = parsePower();\n return {\n type: \"BinaryExpression\",\n operator: \"^\",\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= MULT ================= */\n function parseMultiplication() {\n let left = parsePower();\n\n while (\n match(\"Operator\", \"*\") ||\n match(\"Operator\", \"/\") ||\n match(\"Operator\", \"%\")\n ) {\n const operator = tokens[current - 1].value;\n const right = parsePower();\n\n left = {\n type: \"BinaryExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= ADD ================= */\n function parseAddition() {\n let left = parseMultiplication();\n\n while (match(\"Operator\", \"+\") || match(\"Operator\", \"-\")) {\n const operator = tokens[current - 1].value;\n const right = parseMultiplication();\n\n left = {\n type: \"BinaryExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= UNIT CONVERSION ================= */\n function parseUnitConversion() {\n let left = parseAddition();\n\n const nextKeyword = peek();\n if (nextKeyword?.type === \"Keyword\" && [\"to\", \"in\"].includes(nextKeyword.value)) {\n consume();\n const next = consume();\n\n if (!next || next.type !== \"Unit\") {\n throw new Error(`Expected unit after '${nextKeyword.value}'`);\n }\n\n return {\n type: \"UnitConversion\",\n from: left,\n to: next.value\n };\n }\n\n return left;\n }\n\n /* ================= COMPARISON ================= */\n function parseComparison() {\n let left = parseUnitConversion();\n\n while (\n match(\"Operator\", \">\") ||\n match(\"Operator\", \"<\") ||\n match(\"Operator\", \">=\") ||\n match(\"Operator\", \"<=\") ||\n match(\"Operator\", \"==\")\n ) {\n const operator = tokens[current - 1].value;\n const right = parseUnitConversion();\n\n left = {\n type: \"BinaryExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= LOGICAL ================= */\n function parseLogical() {\n let left = parseComparison();\n\n while (\n match(\"Operator\", \"&&\") ||\n match(\"Operator\", \"||\")\n ) {\n const operator = tokens[current - 1].value;\n const right = parseComparison();\n\n left = {\n type: \"LogicalExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= NULLISH ================= */\n function parseNullish() {\n let left = parseLogical();\n\n while (match(\"Operator\", \"??\")) {\n const right = parseLogical();\n\n left = {\n type: \"LogicalExpression\",\n operator: \"??\",\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= TERNARY ================= */\n function parseTernary() {\n let test = parseNullish();\n\n if (match(\"Ternary\", \"?\")) {\n const consequent = parseExpression();\n\n if (!match(\"Ternary\", \":\")) {\n throw new Error(\"Expected ':' in ternary\");\n }\n\n const alternate = parseExpression();\n\n return {\n type: \"ConditionalExpression\",\n test,\n consequent,\n alternate\n };\n }\n\n return test;\n }\n\n /* ================= PIPELINE ================= */\n function parsePipeline() {\n let left = parseTernary();\n\n while (match(\"Operator\", \"|>\")) {\n const right = parseTernary();\n\n left = {\n type: \"PipelineExpression\",\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= ASSIGNMENT ================= */\n function parseAssignment() {\n let left = parsePipeline();\n\n if (\n match(\"Operator\", \"=\") ||\n match(\"Operator\", \"+=\") ||\n match(\"Operator\", \"-=\") ||\n match(\"Operator\", \"*=\") ||\n match(\"Operator\", \"/=\")\n ) {\n const operator = tokens[current - 1].value;\n\n if (\n left.type !== \"Identifier\" &&\n left.type !== \"MemberExpression\" &&\n left.type !== \"IndexExpression\"\n ) {\n throw new Error(\"Invalid assignment target\");\n }\n\n const right = parseAssignment();\n\n return {\n type: \"AssignmentExpression\",\n operator,\n left,\n right\n };\n }\n\n return left;\n }\n\n /* ================= ENTRY ================= */\n function parseExpression() {\n return parseAssignment();\n }\n\n const ast = parseExpression();\n\n if (current < tokens.length) {\n throw new Error(\n `Unexpected token at end: ${JSON.stringify(peek())}`\n );\n }\n\n return ast;\n}\n","import { tokenize } from \"../parser/tokenizer.js\";\n// import { infixToPostfix } from \"../parser/infixToPostfix.js\";\nimport { evaluateAST } from \"../parser/evaluator.js\";\nimport { createContext } from \"./context.js\";\nimport { mathOperations } from \"../math/operations.js\";\n\nimport { createUnitsStore } from \"../utils/store.js\";\nimport { globalUnits } from \"../utils/globalUnits.js\";\n\nimport { createVarStore } from \"../variables/store.js\";\nimport { createFunctionRegistry } from \"../function/registry.js\";\nimport { internalFunctions } from \"../function/internal.js\";\n\nimport { buildAST } from \"../parser/astBuild.js\";\n\n\n//\n\nconst isComplex = (value) =>\n value && typeof value === \"object\" && \"re\" in value && \"im\" in value;\n\nconst isUnitValue = (value) =>\n value && typeof value === \"object\" && \"value\" in value && \"unit\" in value;\n\nconst isMatrix = (value) =>\n Array.isArray(value) && value.length > 0 && value.every(Array.isArray);\n\nconst formatComplex = (value) => {\n if (!isComplex(value)) return value;\n\n const real = value.re;\n const imaginary = Math.abs(value.im);\n const sign = value.im < 0 ? \"-\" : \"+\";\n\n if (real === 0) {\n if (value.im === 1) return \"i\";\n if (value.im === -1) return \"-i\";\n return `${value.im}i`;\n }\n\n const imagPart = imaginary === 1 ? \"i\" : `${imaginary}i`;\n return `${real} ${sign} ${imagPart}`;\n};\n\nconst formatResult = (value) => {\n if (isComplex(value)) {\n return formatComplex(value);\n }\n\n if (isUnitValue(value)) {\n return `${value.value} ${value.unit}`;\n }\n\n if (isMatrix(value)) {\n return value.map((row) => row.join(\"\\t\")).join(\"\\n\");\n }\n\n if (Array.isArray(value)) {\n return value.join(\"\\n\");\n }\n\n return value;\n};\n\nclass exprify {\n constructor() {\n // Shared state\n this.math = mathOperations;\n this.units = createUnitsStore(globalUnits);\n this.functions = createFunctionRegistry(internalFunctions);\n this.variables = createVarStore();\n this._cache = new Map();\n }\n\n setVariable(name, value) {\n this.variables.set(name, value);\n }\n\n getVariable(name) {\n return this.variables.get(name);\n }\n\n addFunction(name, fn) {\n this.functions.register(name, fn);\n }\n\n _createContext() {\n return createContext({\n functions: this.functions,\n variables: this.variables,\n units: this.units,\n evaluate: this.evaluate.bind(this)\n });\n }\n\n tokenize(expr) {\n if (typeof expr !== \"string\") {\n throw new Error(\"Expression must be a string\");\n }\n return tokenize(expr, this._createContext());\n }\n\n parse(expr) {\n const tokens = this.tokenize(expr);\n const ast = buildAST(tokens);\n return { tokens, ast };\n }\n\n evaluate(expr) {\n const { ast } = this.parse(expr);\n return formatResult(evaluateAST(\n ast,\n this._createContext()\n ));\n }\n\n compile(expr) {\n if (this._cache.has(expr)) {\n return this._cache.get(expr);\n }\n\n const { ast } = this.parse(expr);\n\n const compiledFn = (scope = {}) => {\n const baseContext = this._createContext();\n const scopedContext = baseContext.withScope(scope);\n return formatResult(evaluateAST(ast, scopedContext));\n };\n\n this._cache.set(expr, compiledFn);\n return compiledFn;\n }\n\n clearCache() {\n this._cache.clear();\n }\n\n}\n\nexport default exprify;\n","export function createUnitsStore(initial = {}) {\n let units = { ...initial};\n\n // ---------- Helpers ----------\n\n function getAllUnitsFlat() {\n const result = new Set();\n\n for (const type in units) {\n for (const key in units[type]) {\n const u = units[type][key];\n\n const keyLower = key.toLowerCase();\n result.add(keyLower);\n\n // Unit name\n if (u.unit) {\n const unitLower = u.unit.toLowerCase();\n\n // Avoid duplicate like \"m\" vs \"meter\"\n if (unitLower !== keyLower) {\n // Optional: only single-word units\n if (unitLower.split(/\\s+/).length === 1) {\n result.add(unitLower);\n }\n }\n }\n\n // Symbol\n if (u.symbol) {\n const symbolLower = u.symbol.toLowerCase();\n\n // Avoid duplicate with unit name\n if (!u.unit || symbolLower !== u.unit.toLowerCase()) {\n result.add(symbolLower);\n }\n }\n }\n }\n\n return Array.from(result);\n }\n\n function findUnit(input) {\n input = input.toLowerCase();\n\n for (const type in units) {\n for (const key in units[type]) {\n const u = units[type][key];\n\n if (\n key.toLowerCase() === input ||\n u.unit?.toLowerCase() === input ||\n u.symbol?.toLowerCase() === input\n ) {\n return { type, key , data: u};\n }\n }\n }\n\n return null;\n }\n\n // ---------- Core Convert ----------\n\n function convert(value, fromUnit, toUnit) {\n const from = findUnit(fromUnit);\n const to = findUnit(toUnit);\n\n if (!from) throw new Error(`Unknown unit: ${fromUnit}`);\n if (!to) throw new Error(`Unknown unit: ${toUnit}`);\n\n if (from.type !== to.type) {\n throw new Error(`Cannot convert ${fromUnit} to ${toUnit} (${to.data.unit || to.key}). ${from.data.unit || from.key} conversion units like ${Object.keys(units[from.type]).join(\", \")}`);\n }\n\n const result = value * (from.data.value / to.data.value);\n\n return { value: result, unit: to.key };\n }\n\n // ---------- Public API ----------\n\n return {\n // Get all units\n getUnits: () => units,\n\n // Replace all units\n setUnits: (newUnits) => {\n units = { ...newUnits };\n },\n\n // Update single type\n updateType: (type, data) => {\n units[type] = { ...units[type], ...data };\n },\n\n // Add new unit\n addUnit: (type, key, unitObj) => {\n if (!units[type]) units[type] = {};\n units[type][key] = unitObj;\n },\n compute(op, left, right) {\n\n const isUnit = (v) =>\n v && typeof v === \"object\" && \"value\" in v && \"unit\" in v;\n\n const apply = (a, b) => {\n switch (op) {\n case \"+\": return a + b;\n case \"-\": return a - b;\n case \"*\": return a * b;\n case \"/\": return a / b;\n case \"%\": return a % b;\n case \"^\": return Math.pow(a, b);\n }\n };\n\n // BOTH UNIT\n if (isUnit(left) && isUnit(right)) {\n\n const from = this.findUnit(right.unit);\n const to = this.findUnit(left.unit);\n\n if (from.type !== to.type) {\n throw new Error(`Cannot operate on different unit types`);\n }\n\n // convert right → left unit\n const r = right.value * (from.data.value / to.data.value);\n\n const result = apply(left.value, r);\n\n // multiplication/division produce compound units\n if (op === \"*\") {\n return { value: result, unit: left.unit };\n }\n\n if (op === \"/\") {\n return { value: result, unit: left.unit };\n }\n\n if (op === \"^\") {\n return { value: result, unit: left.unit };\n }\n\n return { value: result, unit: left.unit };\n }\n\n // ================= LEFT UNIT =================\n if (isUnit(left) && !isUnit(right)) {\n const result = apply(left.value, right);\n\n return { value: result, unit: left.unit };\n }\n\n // ================= RIGHT UNIT =================\n if (!isUnit(left) && isUnit(right)) {\n const result = apply(left, right.value);\n\n if (op === \"/\") {\n return { value: result, unit: right.unit };\n }\n\n return { value: result, unit: right.unit };\n }\n\n // ================= NORMAL =================\n return apply(left, right);\n },\n // Convert\n convert,\n\n // Search helpers\n getAllUnitsFlat,\n findUnit\n };\n}\n","export function createFunctionRegistry(initial = {}) {\n const store = Object.create(null);\n\n for (const key in initial) {\n if (typeof initial[key] === \"function\") {\n store[key] = initial[key];\n }\n }\n\n return {\n getAllFunctionsName() {\n return Object.keys(store);\n },\n // register new formula\n register(name, fn) {\n if (typeof name !== \"string\" || !name) {\n throw new Error(\"Formula name must be a non-empty string\");\n }\n\n if (typeof fn !== \"function\") {\n throw new Error(`Formula \"${name}\" must be callable`);\n }\n\n store[name] = fn;\n },\n\n // get formula\n get(name) {\n return store[name];\n },\n\n // check existence\n has(name) {\n return Object.prototype.hasOwnProperty.call(store, name);\n },\n\n // remove formula\n remove(name) {\n delete store[name];\n },\n\n // list all\n all() {\n return { ...store };\n },\n\n // clear registry\n clear() {\n for (const key in store) {\n delete store[key];\n }\n },\n\n // extend multiple\n extend(formulas = {}) {\n for (const name in formulas) {\n if (typeof formulas[name] === \"function\") {\n store[name] = formulas[name];\n }\n }\n },\n\n // clone (for scoped instances)\n clone() {\n return createFormulaRegistry(store);\n }\n };\n}","export function tokenize(expr, context = {}) {\n const tokens = [];\n let current = \"\";\n let quote = \"\";\n\n const operators = [\"+\", \"-\", \"*\", \"/\", \"%\", \"^\", \"=\", \">\", \"<\", \"!\", \"&\", \"|\"];\n const multiOps = [\n \"==\", \">=\", \"<=\", \"&&\", \"||\",\n \"+=\", \"-=\", \"*=\", \"/=\", \"%=\",\n \"?.\", \"??\", \"|>\"\n ];\n\n const parentheses = \"()\";\n const comma = \",\";\n const semicolon = \";\";\n const keywords = [\"to\", \"in\"];\n // const functions = context.functions?.getAllFunctionsName?.() || [];\n const units = context.units?.getAllUnitsFlat?.() || [];\n\n const isIdentifier = (s) => /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s);\n\n function getContext(str, charIndex) {\n // 1. Extract all alphanumeric words into an array\n const words = str.match(/[a-z0-9]+/gi) || [];\n \n // 2. Identify the current character and the one immediately before it\n const currentChar = str[charIndex] || null;\n const prevChar = charIndex > 0 ? str[charIndex - 1] : null;\n \n // 3. Find the word that contains the current charIndex\n let start = charIndex;\n // Move pointer back to the start of the current word\n while (start > 0 && /[a-z0-9]/i.test(str[start - 1])) start--;\n \n let end = charIndex;\n // Move pointer forward to the end of the current word\n while (end < str.length && /[a-z0-9]/i.test(str[end])) end++;\n \n const currentWord = str.substring(start, end);\n\n // 4. Find the word that appears before the currentWord in the sequence\n const currentWordIdx = words.indexOf(currentWord);\n const prevWord = currentWordIdx > 0 ? words[currentWordIdx - 1] : null;\n\n // 5. Find the word that appears after the currentWord\n const nextWord = (currentWordIdx !== -1 && currentWordIdx < words.length - 1) \n ? words[currentWordIdx + 1] \n : null;\n\n return {\n prevWord: prevWord,\n prevChar: prevChar,\n currentWord: currentWord,\n currentChar: currentChar,\n nextWord: nextWord\n };\n }\n\n const isUnaryContext = (prev) =>\n !prev ||\n prev.type === \"Operator\" ||\n prev.type === \"UnaryOperator\" ||\n (prev.type === \"Parenthesis\" && prev.value !== \")\") ||\n prev.type === \"ArrayStart\" ||\n prev.type === \"Semicolon\" ||\n prev.type === \"Comma\" ||\n prev.type === \"Ternary\";\n\n const flushCurrent = (nextChar, index) => {\n if (!current) return;\n\n // BOOLEAN\n if (/^(true|false)$/i.test(current)) {\n tokens.push({ type: \"Boolean\", value: current.toLowerCase() === \"true\" });\n current = \"\";\n return;\n }\n\n // KEYWORD\n if (keywords.includes(current)) {\n tokens.push({ type: \"Keyword\", value: current, pos: index });\n current = \"\";\n return;\n }\n\n // BIGINT\n if (/^\\d+n$/.test(current)) {\n tokens.push({ type: \"BigInt\", value: BigInt(current.slice(0, -1)), pos: index });\n current = \"\";\n return;\n }\n\n // HEX\n if (/^0x[0-9a-fA-F]+$/.test(current)) {\n tokens.push({ type: \"Number\", value: parseInt(current, 16), pos: index });\n current = \"\";\n return;\n }\n\n // BINARY\n if (/^0b[01]+$/.test(current)) {\n tokens.push({ type: \"Number\", value: parseInt(current, 2), pos: index });\n current = \"\";\n return;\n }\n\n // NUMBER (including scientific)\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?$/i.test(current)) {\n tokens.push({ type: \"Number\", value: parseFloat(current), pos: index });\n current = \"\";\n return;\n }\n\n // IMAGINARY NUMBER\n if (/^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(e[+-]?\\d+)?i$/i.test(current)) {\n tokens.push({\n type: \"ImaginaryLiteral\",\n value: parseFloat(current.slice(0, -1)),\n pos: index\n });\n current = \"\";\n return;\n }\n\n // IMAGINARY UNIT\n if (/^[+-]?i$/i.test(current)) {\n const sign = current[0] === \"-\" ? -1 : 1;\n tokens.push({\n type: \"ImaginaryLiteral\",\n value: sign,\n pos: index\n });\n current = \"\";\n return;\n }\n\n // NUMBER + UNIT\n const numUnit = current.match(/^([+-]?\\d+(\\.\\d+)?)([a-zA-Z]+)$/);\n if (numUnit) {\n const value = parseFloat(numUnit[1]);\n const unit = numUnit[3];\n\n tokens.push({\n type: units.includes(unit) ? \"NumberWithUnit\" : \"UnknownUnit\",\n value,\n unit,\n pos: index\n });\n\n current = \"\";\n return;\n }\n\n // UNIT\n if (units.includes(current)) {\n const {prevWord} = getContext(expr, index);\n if (nextChar !== \"(\") {\n if (prevWord){\n if (!isNaN(parseFloat(prevWord)) || prevWord === \"to\" || prevWord === \"in\") {\n // console.log(\"Context for unit detection:\", {current, prevWord, nextChar});\n\n tokens.push({ type: \"Unit\", value: current, pos: index });\n current = \"\";\n return;\n }\n }\n }\n }\n\n // IDENTIFIER\n if (isIdentifier(current)) {\n if (nextChar === \"(\") {\n tokens.push({\n type: \"Function\",\n name: current,\n pos: index\n });\n } else {\n tokens.push({\n type: \"Identifier\",\n name: current,\n pos: index\n });\n }\n\n current = \"\";\n return;\n }\n\n throw new Error(`Invalid token \"${current}\" at index ${index}`);\n };\n \n\n for (let i = 0; i < expr.length; i++) {\n let char = expr[i];\n let next = expr[i + 1];\n\n // comments\n if (char === \"/\" && next === \"/\") {\n while (i < expr.length && expr[i] !== \"\\n\") i++;\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n i += 2;\n while (i < expr.length && !(expr[i] === \"*\" && expr[i + 1] === \"/\")) i++;\n i++;\n continue;\n }\n\n // string\n if (`\"'`.includes(char)) {\n if (!quote) {\n quote = char;\n current += char;\n } else if (quote === char) {\n current += char;\n tokens.push({\n type: \"String\",\n value: current.slice(1, -1),\n pos: i\n });\n current = \"\";\n quote = \"\";\n } else {\n current += char;\n }\n continue;\n }\n\n if (quote) {\n if (char === \"\\\\\") {\n current += char + expr[++i];\n } else {\n current += char;\n }\n continue;\n }\n\n // multi operators\n const twoChar = char + next;\n if (multiOps.includes(twoChar)) {\n flushCurrent(char, i);\n tokens.push({ type: \"Operator\", value: twoChar, pos: i });\n i++;\n continue;\n }\n\n if (char === \"?\") {\n tokens.push({ type: \"Ternary\", value: \"?\" });\n continue;\n }\n\n // only treat ':' as ternary IF previous token was '?'\n if (char === \":\") {\n flushCurrent(char, i);\n const prev = tokens[tokens.length - 1];\n\n if (prev && prev.type === \"Ternary\") {\n tokens.push({ type: \"Ternary\", value: \":\" });\n } else {\n tokens.push({ type: \"Colon\" });\n }\n continue;\n }\n\n // dot\n if (char === \".\" && /\\d/.test(current) && /\\d/.test(next)) {\n current += char;\n continue;\n }\n\n if (char === \".\") {\n flushCurrent(char, i);\n tokens.push({ type: \"Dot\", pos: i });\n continue;\n }\n\n // operators\n if (operators.includes(char)) {\n flushCurrent(char, i);\n\n const prev = tokens[tokens.length - 1];\n if ((char === \"-\" || char === \"!\") && isUnaryContext(prev)) {\n tokens.push({ type: \"UnaryOperator\", value: char, pos: i });\n } else {\n tokens.push({ type: \"Operator\", value: char, pos: i });\n }\n continue;\n }\n\n // parenthesis\n if (parentheses.includes(char)) {\n flushCurrent(char, i);\n tokens.push({ type: \"Parenthesis\", value: char, pos: i });\n continue;\n }\n\n // array\n if (char === \"[\") {\n flushCurrent(char, i);\n tokens.push({ type: \"ArrayStart\", pos: i });\n continue;\n }\n\n if (char === \"]\") {\n flushCurrent(char, i);\n tokens.push({ type: \"ArrayEnd\", pos: i });\n continue;\n }\n\n // OBJECT START\n if (char === \"{\") {\n flushCurrent(char, i);\n tokens.push({ type: \"BlockStart\", pos: i });\n continue;\n }\n\n // OBJECT END\n if (char === \"}\") {\n flushCurrent(char, i);\n tokens.push({ type: \"BlockEnd\", pos: i });\n continue;\n }\n\n // comma\n if (char === comma) {\n flushCurrent(char, i);\n tokens.push({ type: \"Comma\", pos: i });\n continue;\n }\n\n // semicolon\n if (char === semicolon) {\n flushCurrent(char, i);\n tokens.push({ type: \"Semicolon\", pos: i });\n continue;\n }\n\n // space\n if (char === \" \") {\n flushCurrent(next, i);\n continue;\n }\n\n // build token\n current += char;\n\n if (i === expr.length - 1) {\n flushCurrent(null, i);\n }\n }\n\n if (quote) throw new Error(\"Unclosed string literal\");\n\n // merge number + unit\n const merged = [];\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n const next = tokens[i + 1];\n\n if (t?.type === \"Number\" && next?.type === \"Unit\") {\n merged.push({\n type: \"NumberWithUnit\",\n value: t.value,\n unit: next.value,\n pos: t.pos\n });\n i++;\n continue;\n }\n\n merged.push(t);\n }\n\n // implicit multiplication\n const final = [];\n for (let i = 0; i < merged.length; i++) {\n const a = merged[i];\n const b = merged[i + 1];\n\n final.push(a);\n\n if (\n a && b &&\n (\n ([\"Number\", \"Identifier\"].includes(a.type) ||\n (a.type === \"Parenthesis\" && a.value === \")\") ||\n a.type === \"ArrayEnd\") &&\n ([\"Identifier\", \"Function\"].includes(b.type) ||\n (b.type === \"Parenthesis\" && b.value === \"(\"))\n )\n ) {\n final.push({ type: \"Operator\", value: \"*\", implicit: true });\n }\n }\n\n return final;\n}\n"],"names":["evaluateAST","node","context","vars","variables","fns","functions","units","isUnitObj","v","isComplex","isMatrix","Array","isArray","length","every","normalizeMatrix","value","map","row","Error","toOneBasedIndex","Number","isInteger","resolveSelector","selector","contextLength","type","startValue","start","endValue","end","result","index","push","toComplex","re","im","simplifyComplex","unit","get","name","right","left","set","object","assigned","matrix","selectors","target","slice","rowSelector","colSelector","rowContextLength","Math","max","rowIndexes","rowsValue","forEach","rowIndex","updatedMatrix","selectionResult","maxCols","colIndexes","normalizedValue","rowOffset","colIndex","colOffset","assignMatrixIndex","val","argument","operator","compute","a","b","_","reduce","sum","multiplyMatrices","denominator","evalComplexBinary","fnName","callee","fn","arguments","arg","leftVal","from","convert","to","elements","el","rows","values","indexMatrix","obj","p","properties","key","optional","property","createContext","evaluate","withScope","scope","tempVars","all","k","isValidNumberPair","mathOperations","Object","freeze","power","multiply","divide","add","subtract","modulus","globalUnits","m","symbol","cm","mm","km","um","note","nm","px","em","rem","pt","pc","inch","ft","yd","mi","thou","furlong","nmi","fathom","au","ly","weight","mg","g","kg","t","lb","oz","stone","time","s","min","h","day","week","month","year","voltage","V","mV","kV","MV","GV","statV","abV","frequency","Hz","kHz","MHz","GHz","THz","W","mW","kW","MW","GW","HP","kcal_per_h","BTU_per_h","sound","dB","dBA","dBC","temperature","K","C","F","pressure","Pa","kPa","MPa","bar","atm","psi","mmHg","energy","J","kJ","cal","kcal","eV","BTU","force","N","kN","lbf","kgf","dyne","area","m2","cm2","km2","acre","hectare","ft2","yd2","volume","m3","L","mL","gallon","pint","floz","current","A","mA","uA","kA","resistance","ohm","kohm","megaohm","S","capacitance","mF","uF","inductance","H","mH","uH","light","cd","lm","lx","data","bit","B","KB","MB","GB","TB","angle","deg","rad","grad","radiation","Gy","mGy","Sv","mSv","Bq","kBq","MBq","GBq","Ci","mCi","validVarName","createVarStore","initial","store","create","override","test","undefined","variablesDB","has","prototype","hasOwnProperty","call","remove","clear","merge","clone","determinant","size","validateSquareMatrix","columnIndex","minor","filter","parsePolynomial","expression","variable","terms","normalized","replace","split","Boolean","splitTerms","coefficients","Map","term","includes","rawCoeff","rawPower","coefficient","cleaned","endsWith","isFinite","startsWith","constant","formatPolynomial","ordered","entries","sort","negative","absCoeff","abs","body","join","internalFunctions","args","x","round","floor","ceil","sqrt","pow","det","simplify","variableMatch","match","simplifyExpression","derivative","derived","derivativeExpression","sin","cos","tan","asin","acos","atan","log","log10","exp","random","and","or","not","eq","neq","notEqual","gt","greaterThan","lt","lessThan","gte","greaterThanOrEqual","lte","lessThanOrEqual","clamp","if","condition","typeof","buildAST","tokens","peek","consume","parseSliceOrIndex","parseExpression","parseMember","token","expr","currentRow","keyToken","JSON","stringify","parsePrimary","parseUnary","parseCallChain","parsePower","parseMultiplication","parseUnitConversion","parseAddition","nextKeyword","next","parseComparison","parseLogical","parseTernary","parseNullish","consequent","alternate","parseAssignment","parsePipeline","ast","formatResult","real","imaginary","sign","formatComplex","isUnitValue","constructor","this","math","findUnit","input","toLowerCase","u","getUnits","setUnits","newUnits","updateType","addUnit","unitObj","op","isUnit","apply","r","fromUnit","toUnit","keys","getAllUnitsFlat","Set","keyLower","unitLower","symbolLower","createUnitsStore","getAllFunctionsName","register","extend","formulas","createFormulaRegistry","createFunctionRegistry","_cache","setVariable","getVariable","addFunction","_createContext","bind","tokenize","quote","operators","multiOps","keywords","isUnaryContext","prev","flushCurrent","nextChar","pos","BigInt","parseInt","parseFloat","numUnit","prevWord","str","charIndex","words","currentChar","prevChar","currentWord","substring","currentWordIdx","indexOf","nextWord","getContext","isNaN","i","char","twoChar","merged","final","implicit","parse","compile","compiledFn","scopedContext","clearCache"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ ALL TOKEN TYPES (FINAL DESIGN)
2
+
3
+ // LITERALS
4
+ { type: "Number", value: 10 }
5
+ { type: "BigInt", value: 10n }
6
+ { type: "Boolean", value: true }
7
+ { type: "String", value: "hello" }
8
+
9
+ { type: "Unit", value: "cm" }
10
+ { type: "NumberWithUnit", value: 12.7, unit: "cm" }
11
+ { type: "UnknownUnit", value: 5, unit: "abc" }
12
+
13
+ // IDENTIFIERS
14
+ { type: "Identifier", value: "x" }
15
+
16
+ // FUNCTIONS
17
+ { type: "Function", value: "max" }
18
+
19
+ // OPERATORS
20
+ { type: "Operator", value: "+" }
21
+ { type: "Operator", value: ">=" }
22
+ { type: "Operator", value: "&&" }
23
+ { type: "Operator", value: "|>" }
24
+
25
+ // UNARY
26
+ { type: "UnaryOperator", value: "-" }
27
+ { type: "UnaryOperator", value: "!" }
28
+
29
+ // LOGIC / TERNARY
30
+ { type: "Ternary", value: "?" }
31
+ { type: "Ternary", value: ":" }
32
+
33
+ // STRUCTURE
34
+ { type: "Parenthesis", value: "(" }
35
+ { type: "Parenthesis", value: ")" }
36
+ { type: "ArrayStart" }
37
+ { type: "ArrayEnd" }
38
+ { type: "BlockStart" }
39
+ { type: "BlockEnd" }
40
+ { type: "Colon" }
41
+ { type: "Comma" }
42
+ { type: "Dot" }
43
+
44
+ // KEYWORDS
45
+ { type: "Keyword", value: "to" }
46
+ { type: "Keyword", value: "if" }
47
+
48
+
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "exprify",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A powerful math expression parser and evaluator with runtime data-type checking",
5
5
  "type": "module",
6
6
  "main": "dist/exprify.cjs.js",
7
7
  "module": "dist/exprify.esm.js",
8
8
  "browser": "dist/exprify.js",
9
9
  "unpkg": "dist/exprify.min.js",
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
10
13
  "scripts": {
11
14
  "start": "node src/index.js",
12
15
  "clean": "rimraf dist",
@@ -43,11 +46,12 @@
43
46
  "@babel/preset-env": "^7.24.0",
44
47
  "@rollup/plugin-commonjs": "^23.0.0",
45
48
  "@rollup/plugin-node-resolve": "^15.0.0",
49
+ "@rollup/plugin-terser": "^1.0.0",
50
+ "glob": "^13.0.6",
46
51
  "jest": "^29.0.0",
47
52
  "nodemon": "^3.0.0",
48
53
  "rimraf": "^6.1.3",
49
54
  "rollup": "^2.0.0",
50
- "rollup-plugin-strip-banner": "^3.1.0",
51
- "rollup-plugin-terser": "^7.0.2"
55
+ "rollup-plugin-strip-banner": "^3.1.0"
52
56
  }
53
57
  }
@@ -0,0 +1,80 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ import resolve from "@rollup/plugin-node-resolve";
5
+ import commonjs from "@rollup/plugin-commonjs";
6
+
7
+ import terser from "@rollup/plugin-terser";
8
+ import pkg from "./package.json";
9
+
10
+ const short_banner = `/*! ${pkg.name} v${pkg.version} | * (c) ${new Date().getFullYear()} ${pkg.author} and contributors | ${pkg.license} License*/`;
11
+
12
+ const banner = `/*!
13
+ * ${pkg.name} v${pkg.version}
14
+ * (c) ${new Date().getFullYear()} ${pkg.author} and other contributors
15
+ *
16
+ * Released under the ${pkg.license} License
17
+ * Date: ${new Date().toISOString().split('T')[0]}
18
+ */`;
19
+
20
+ function removeComment() {
21
+ return {
22
+ name: "remove-sourcemap-comment",
23
+ writeBundle(outputOptions, bundle) {
24
+ for (const fileName in bundle) {
25
+ if (fileName.endsWith(".js")) {
26
+ const filePath = path.join(
27
+ outputOptions.dir || path.dirname(outputOptions.file),
28
+ fileName
29
+ );
30
+
31
+ let code = fs.readFileSync(filePath, "utf-8");
32
+
33
+ code = code.replace(/\/\/# sourceMappingURL=.*$/gm, "");
34
+
35
+ fs.writeFileSync(filePath, code);
36
+ }
37
+ }
38
+ }
39
+ };
40
+ }
41
+
42
+ export default [
43
+ {
44
+ input: "src/index.js",
45
+ output: [
46
+ {
47
+ file: "dist/exprify.esm.js",
48
+ format: "esm",
49
+ sourcemap: true
50
+ },
51
+ {
52
+ file: "dist/exprify.cjs.js",
53
+ format: "cjs",
54
+ sourcemap: true,
55
+ exports: "default"
56
+ },
57
+ {
58
+ file: "dist/exprify.js",
59
+ format: "umd",
60
+ name: "Exprify",
61
+ banner: banner,
62
+ sourcemap: true,
63
+ indent: true,
64
+ exports: "default"
65
+ }
66
+ ],
67
+ plugins: [resolve(), commonjs(), removeComment()]
68
+ },
69
+ {
70
+ input: "src/index.js",
71
+ output: {
72
+ file: "dist/exprify.min.js",
73
+ format: "umd",
74
+ name: "Exprify",
75
+ sourcemap: true,
76
+ banner: short_banner
77
+ },
78
+ plugins: [resolve(), commonjs(), terser(), removeComment()]
79
+ }
80
+ ];
Binary file