@aliou/obsdx-base-engine 0.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.
- package/dist/index.d.mts +95 -0
- package/dist/index.mjs +1159 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["normalizeComparable","isRecord"],"sources":["../src/math.ts","../src/expressions/evaluator.ts","../src/query.ts"],"sourcesContent":["export function numericValues(values: unknown[]): number[] {\n return values.filter(\n (value): value is number =>\n typeof value === \"number\" && Number.isFinite(value),\n );\n}\n\nexport function sumNumbers(values: unknown[]): number {\n return numericValues(values).reduce((total, value) => total + value, 0);\n}\n\nexport function meanNumbers(values: unknown[]): number | null {\n const numbers = numericValues(values);\n return numbers.length > 0 ? sumNumbers(numbers) / numbers.length : null;\n}\n\nexport function minNumber(values: unknown[]): number | null {\n const numbers = numericValues(values);\n return numbers.length > 0 ? Math.min(...numbers) : null;\n}\n\nexport function maxNumber(values: unknown[]): number | null {\n const numbers = numericValues(values);\n return numbers.length > 0 ? Math.max(...numbers) : null;\n}\n\nexport function medianNumbers(values: unknown[]): number | null {\n const numbers = numericValues(values).sort((left, right) => left - right);\n if (numbers.length === 0) return null;\n const middle = Math.floor(numbers.length / 2);\n if (numbers.length % 2 === 1) return numbers[middle] ?? null;\n return ((numbers[middle - 1] ?? 0) + (numbers[middle] ?? 0)) / 2;\n}\n\nexport function stddevNumbers(values: unknown[]): number | null {\n const numbers = numericValues(values);\n const average = meanNumbers(numbers);\n if (average === null) return null;\n return Math.sqrt(\n numbers.reduce((total, value) => total + (value - average) ** 2, 0) /\n numbers.length,\n );\n}\n","import type { Expr } from \"@aliou/obsdx-base-ast\";\nimport {\n maxNumber,\n meanNumbers,\n medianNumbers,\n minNumber,\n stddevNumbers,\n sumNumbers,\n} from \"../math\";\nimport type { BaseFileInspection } from \"../query\";\n\nexport class BaseEngineError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details: Record<string, unknown> = {},\n ) {\n super(message);\n this.name = \"BaseEngineError\";\n }\n}\n\nexport type EvaluationContext = {\n row: BaseFileInspection;\n context?: BaseFileInspection;\n formulas: Record<string, unknown>;\n byPath: Map<string, BaseFileInspection>;\n byBasename: Map<string, BaseFileInspection>;\n value?: unknown;\n acc?: unknown;\n values?: unknown[];\n};\n\ntype Callable = {\n call: (args: unknown[]) => unknown;\n};\n\ntype DurationValue = {\n years: number;\n months: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n calendarYears?: number;\n calendarMonths?: number;\n calendarDays?: number;\n};\n\nexport function evaluateExpression(\n expr: Expr,\n context: EvaluationContext,\n): unknown {\n switch (expr.kind) {\n case \"literal\":\n return expr.value;\n case \"regex\":\n return new RegExp(expr.pattern, expr.flags);\n case \"array\":\n return expr.elements.map((element) =>\n evaluateExpression(element, context),\n );\n case \"identifier\":\n return readIdentifier(expr.name, context);\n case \"member\":\n return readMember(\n evaluateExpression(expr.object, context),\n expr.property,\n context,\n );\n case \"index\":\n return readIndex(\n evaluateExpression(expr.object, context),\n evaluateExpression(expr.index, context),\n );\n case \"call\":\n if (expr.callee.kind === \"member\" && expr.callee.property === \"filter\") {\n const source = listValue(\n evaluateExpression(expr.callee.object, context),\n );\n const predicate = expr.args[0];\n return predicate\n ? source.filter((value) =>\n truthy(evaluateExpression(predicate, { ...context, value })),\n )\n : source;\n }\n if (expr.callee.kind === \"member\" && expr.callee.property === \"map\") {\n const source = listValue(\n evaluateExpression(expr.callee.object, context),\n );\n const mapper = expr.args[0];\n return mapper\n ? source.map((value) =>\n evaluateExpression(mapper, { ...context, value }),\n )\n : source;\n }\n if (expr.callee.kind === \"member\" && expr.callee.property === \"reduce\") {\n const source = listValue(\n evaluateExpression(expr.callee.object, context),\n );\n const reducer = expr.args[0];\n if (!reducer) return null;\n let acc =\n expr.args.length > 1\n ? evaluateExpression(expr.args[1], context)\n : source[0];\n const values = expr.args.length > 1 ? source : source.slice(1);\n for (const value of values) {\n acc = evaluateExpression(reducer, { ...context, acc, value });\n }\n return acc;\n }\n if (expr.callee.kind === \"member\" && expr.callee.property === \"matches\") {\n const target = evaluateExpression(expr.callee.object, context);\n if (typeof target === \"string\") {\n throw new BaseEngineError(\n \"FORMULA_EVAL_ERROR\",\n 'Cannot find function \"matches\" on type String',\n );\n }\n }\n if (expr.callee.kind === \"identifier\") {\n return callValue(\n readFunctionIdentifier(expr.callee.name, context) ??\n evaluateExpression(expr.callee, context),\n expr.args.map((arg) => evaluateExpression(arg, context)),\n );\n }\n return callValue(\n evaluateExpression(expr.callee, context),\n expr.args.map((arg) => evaluateExpression(arg, context)),\n );\n case \"unary\": {\n const value = evaluateExpression(expr.right, context);\n return expr.operator === \"!\" ? !truthy(value) : -numberValue(value);\n }\n case \"binary\":\n return evaluateBinary(\n expr.operator,\n evaluateExpression(expr.left, context),\n evaluateExpression(expr.right, context),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Identifiers\n// ---------------------------------------------------------------------------\n\nfunction readIdentifier(name: string, context: EvaluationContext): unknown {\n if (name === \"file\") {\n return fileObject(context.row, context);\n }\n\n if (name === \"note\") {\n return noteObject(context.row);\n }\n\n // In Obsidian, \"property\" is NOT a valid prefix -- it returns null.\n if (name === \"property\") {\n return null;\n }\n\n if (name === \"formula\") {\n return context.formulas;\n }\n\n if (name === \"this\") {\n return context.context ? thisObject(context.context, context) : null;\n }\n\n if (name === \"value\") {\n return context.value ?? null;\n }\n\n if (name === \"acc\") {\n return context.acc ?? null;\n }\n\n if (name === \"values\") {\n return context.values ?? null;\n }\n\n const property = readProperty(context.row, name);\n if (property !== null) {\n return property;\n }\n\n return null;\n}\n\nfunction readFunctionIdentifier(\n name: string,\n context: EvaluationContext,\n): Callable | null {\n if (name === \"list\") {\n return callable((args) => {\n if (args.length > 1) {\n throw new BaseEngineError(\n \"FORMULA_EVAL_ERROR\",\n 'Cannot call function \"list\", too many arguments.',\n );\n }\n return args.flatMap((arg) => listValue(arg));\n });\n }\n\n if (name === \"link\") {\n return callable((args) => {\n const target = String(args[0] ?? \"\");\n const display = args[1];\n // If already a wikilink, unwrap first to avoid double-wrapping.\n const unwrapped = target.replace(/^\\[\\[/u, \"\").replace(/\\]\\]$/u, \"\");\n if (display !== undefined && display !== null) {\n return `[[${unwrapped}|${String(display)}]]`;\n }\n return `[[${unwrapped}]]`;\n });\n }\n\n if (name === \"if\") {\n return callable((args) => (truthy(args[0]) ? args[1] : (args[2] ?? null)));\n }\n\n if (name === \"now\") {\n return callable(() => new Date());\n }\n\n if (name === \"today\") {\n return callable(() => {\n const d = new Date();\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n });\n }\n\n if (name === \"date\") {\n return callable((args) => dateValue(args[0]));\n }\n\n if (name === \"duration\") {\n return callable((args) => {\n if (typeof args[0] === \"string\") {\n return parseDuration(args[0]) ?? null;\n }\n if (typeof args[0] === \"number\") {\n return durationValue(args[0]);\n }\n return null;\n });\n }\n\n if (name === \"number\") {\n return callable((args) => {\n const val = args[0];\n if (typeof val === \"boolean\") {\n return val ? 1 : 0;\n }\n const result = numberValue(val);\n if (\n typeof val === \"string\" &&\n val.trim() !== \"\" &&\n !Number.isFinite(Number(val))\n ) {\n throw new BaseEngineError(\n \"FORMULA_EVAL_ERROR\",\n `Unable to parse \"${val}\" as a number.`,\n );\n }\n return result;\n });\n }\n\n if (name === \"file\") {\n return callable((args) => {\n const target = String(args[0] ?? \"\");\n const inspection =\n context.byPath.get(target) ??\n context.byBasename.get(normalizeComparable(target));\n return inspection ? fileObject(inspection, context) : null;\n });\n }\n\n if (name === \"min\") {\n return callable((args) => Math.min(...args.map((a) => numberValue(a))));\n }\n\n if (name === \"max\") {\n return callable((args) => Math.max(...args.map((a) => numberValue(a))));\n }\n\n if (name === \"escapeHTML\") {\n return callable((args) => escapeHtml(String(args[0] ?? \"\")));\n }\n\n if (name === \"html\") {\n return callable((args) => String(args[0] ?? \"\"));\n }\n\n if (name === \"image\") {\n return callable((args) => `})`);\n }\n\n if (name === \"icon\") {\n return callable((args) => String(args[0] ?? \"\"));\n }\n\n if (name === \"random\") {\n return callable(() => Math.random());\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Member access\n// ---------------------------------------------------------------------------\n\nfunction readMember(\n value: unknown,\n property: string,\n context: EvaluationContext,\n): unknown {\n // --- null-safe default returns ---\n if (value === null || value === undefined) {\n if (property === \"isEmpty\") {\n return callable(() => true);\n }\n if (property === \"contains\" || property === \"containsAny\") {\n return callable(() => false);\n }\n if (\n property === \"asLink\" ||\n property === \"asFile\" ||\n property === \"hasLink\" ||\n property === \"hasProperty\" ||\n property === \"hasTag\" ||\n property === \"inFolder\"\n ) {\n return callable(() => null);\n }\n if (property === \"round\" || property === \"floor\" || property === \"ceil\") {\n return callable(() => null);\n }\n if (property === \"toFixed\") {\n return callable(() => null);\n }\n if (property === \"toString\") {\n return callable(() => \"\");\n }\n if (property === \"matches\") {\n return callable(() => false);\n }\n if (property === \"join\" || property === \"sort\" || property === \"map\") {\n return callable(() => []);\n }\n if (property === \"containsAll\") {\n return callable(() => false);\n }\n if (property === \"format\") {\n return callable(() => null);\n }\n if (property === \"keys\" || property === \"values\") {\n return callable(() => []);\n }\n if (property === \"length\") {\n return 0;\n }\n return null;\n }\n\n // --- Duration fields ---\n if (isDuration(value) && property in value) {\n return value[property as keyof DurationValue];\n }\n\n if (value instanceof RegExp) {\n if (property === \"matches\") {\n return callable((args) => value.test(String(args[0] ?? \"\")));\n }\n }\n\n // --- Array methods ---\n if (Array.isArray(value)) {\n if (property === \"length\") {\n return value.length;\n }\n if (property === \"contains\") {\n return callable((args) =>\n value.some((item) => sameComparable(item, args[0])),\n );\n }\n if (property === \"containsAny\") {\n return callable((args) =>\n value.some((item) =>\n args\n .flatMap((arg) => listValue(arg))\n .some((arg) => sameComparable(item, arg)),\n ),\n );\n }\n if (property === \"isEmpty\") {\n return callable(() => value.length === 0);\n }\n if (property === \"unique\") {\n return callable(() => uniqueValues(value));\n }\n if (property === \"sum\") {\n return callable(() => sumNumbers(value));\n }\n if (property === \"mean\" || property === \"average\") {\n return callable(() => meanNumbers(value));\n }\n if (property === \"min\") {\n return callable(() => minNumber(value));\n }\n if (property === \"max\") {\n return callable(() => maxNumber(value));\n }\n if (property === \"median\") {\n return callable(() => medianNumbers(value));\n }\n if (property === \"stddev\") {\n return callable(() => stddevNumbers(value));\n }\n if (property === \"filter\") {\n return callable((args) => {\n const predicate = args[0];\n return typeof predicate === \"function\"\n ? value.filter((item) => Boolean(predicate(item)))\n : value;\n });\n }\n if (property === \"containsAll\") {\n return callable((args) => {\n const required = args.flatMap((arg) => listValue(arg));\n return required.every((item) =>\n value.some((v) => sameComparable(v, item)),\n );\n });\n }\n if (property === \"join\") {\n return callable((args) => value.join(String(args[0] ?? \", \")));\n }\n if (property === \"sort\") {\n return callable(() => [...value].sort(compareValuesForSort));\n }\n if (property === \"map\") {\n return callable((args) => {\n const fn = args[0];\n return typeof fn === \"function\" ? value.map((item) => fn(item)) : value;\n });\n }\n if (property === \"reduce\") {\n return callable(() => null);\n }\n if (property === \"flat\") {\n return callable(() => value.flat(Number.POSITIVE_INFINITY));\n }\n if (property === \"reverse\") {\n return callable(() => [...value].reverse());\n }\n if (property === \"slice\") {\n return callable((args) => {\n const start = numberValue(args[0]);\n const end = args[1] !== undefined ? numberValue(args[1]) : undefined;\n return value.slice(start, end);\n });\n }\n }\n\n // --- String methods ---\n if (typeof value === \"string\") {\n if (property === \"length\") {\n return value.length;\n }\n if (property === \"contains\") {\n return callable((args) =>\n normalizeComparable(value).includes(normalizeComparable(args[0])),\n );\n }\n if (property === \"containsAny\") {\n return callable((args) =>\n args\n .flatMap((arg) => listValue(arg))\n .some((arg) =>\n normalizeComparable(value).includes(normalizeComparable(arg)),\n ),\n );\n }\n if (property === \"isEmpty\") {\n return callable(() => value.length === 0);\n }\n if (property === \"toString\") {\n return callable(() => value);\n }\n if (property === \"asFile\") {\n return callable(() => lookupFile(value, context));\n }\n if (property === \"linksTo\") {\n return callable((args) => {\n const source = lookupFile(value, context);\n const target = linkTarget(args[0]);\n return Boolean(\n source &&\n sameComparable(\n isRecord(source) && isRecord(source.file)\n ? source.file.path\n : source.path,\n target,\n ),\n );\n });\n }\n if (property === \"lower\") {\n return callable(() => value.toLowerCase());\n }\n if (property === \"title\") {\n return callable(() =>\n value.replace(/\\b\\w/gu, (char) => char.toUpperCase()),\n );\n }\n if (property === \"trim\") {\n return callable(() => value.trim());\n }\n if (property === \"startsWith\") {\n return callable((args) => value.startsWith(String(args[0] ?? \"\")));\n }\n if (property === \"endsWith\") {\n return callable((args) => value.endsWith(String(args[0] ?? \"\")));\n }\n if (property === \"replace\") {\n // In Obsidian, string.replace() replaces ALL occurrences.\n return callable((args) => {\n const pattern = String(args[0] ?? \"\");\n const replacement = String(args[1] ?? \"\");\n return value.split(pattern).join(replacement);\n });\n }\n if (property === \"repeat\") {\n return callable((args) => value.repeat(numberValue(args[0])));\n }\n if (property === \"reverse\") {\n return callable(() => [...value].reverse().join(\"\"));\n }\n if (property === \"slice\") {\n return callable((args) => {\n const start = numberValue(args[0]);\n const end = args[1] !== undefined ? numberValue(args[1]) : undefined;\n return value.slice(start, end);\n });\n }\n if (property === \"split\") {\n return callable((args) => value.split(String(args[0] ?? \"\")));\n }\n // Date-like string methods (file.mtime is a string, not a Date)\n if (property === \"relative\") {\n const d = dateValue(value);\n if (d) return callable(() => relativeTime(d));\n }\n if (property === \"date\") {\n const d = dateValue(value);\n if (d)\n return callable(\n () => new Date(d.getFullYear(), d.getMonth(), d.getDate()),\n );\n }\n if (property === \"time\") {\n const d = dateValue(value);\n if (d)\n return callable(() => {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n });\n }\n if (property === \"format\") {\n const d = dateValue(value);\n if (d)\n return callable((args) => {\n const pattern = String(args[0] ?? \"YYYY-MM-DD\");\n return formatDate(d, pattern);\n });\n }\n }\n\n // --- Number methods ---\n if (typeof value === \"number\") {\n if (property === \"round\") {\n return callable((args) => {\n const digits = args[0];\n if (digits === undefined || digits === null) {\n return Math.round(value);\n }\n const d = numberValue(digits);\n const factor = 10 ** d;\n return Math.round(value * factor) / factor;\n });\n }\n if (property === \"floor\") {\n return callable(() => Math.floor(value));\n }\n if (property === \"ceil\") {\n return callable(() => Math.ceil(value));\n }\n if (property === \"abs\") {\n return callable(() => Math.abs(value));\n }\n if (property === \"toFixed\") {\n return callable((args) => value.toFixed(numberValue(args[0])));\n }\n if (property === \"isEmpty\") {\n return callable(() => false);\n }\n }\n\n // --- Date methods and fields ---\n if (value instanceof Date) {\n if (property === \"year\") {\n return value.getFullYear();\n }\n if (property === \"month\") {\n return value.getMonth() + 1;\n }\n if (property === \"day\") {\n return value.getDate();\n }\n if (property === \"hour\") {\n return value.getHours();\n }\n if (property === \"minute\") {\n return value.getMinutes();\n }\n if (property === \"second\") {\n return value.getSeconds();\n }\n if (property === \"millisecond\") {\n return value.getMilliseconds();\n }\n if (property === \"date\") {\n return callable(\n () => new Date(value.getFullYear(), value.getMonth(), value.getDate()),\n );\n }\n if (property === \"time\") {\n return callable(() => {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${pad(value.getHours())}:${pad(value.getMinutes())}:${pad(value.getSeconds())}`;\n });\n }\n if (property === \"relative\") {\n return callable(() => relativeTime(value));\n }\n if (property === \"isEmpty\") {\n return callable(() => false);\n }\n if (property === \"toString\") {\n return callable(() => formatDateTimeForOutput(value));\n }\n if (property === \"format\") {\n return callable((args) => {\n const pattern = String(args[0] ?? \"YYYY-MM-DD\");\n return formatDate(value, pattern);\n });\n }\n }\n\n // --- Any-type methods ---\n if (property === \"isTruthy\") {\n return callable(() => truthy(value));\n }\n if (property === \"isType\") {\n return callable((args) => {\n const expected = String(args[0] ?? \"\");\n if (expected === \"number\") return typeof value === \"number\";\n if (expected === \"string\") return typeof value === \"string\";\n if (expected === \"boolean\") return typeof value === \"boolean\";\n if (expected === \"null\") return value === null;\n if (expected === \"date\") return value instanceof Date;\n if (expected === \"list\") return Array.isArray(value);\n if (expected === \"object\") return isRecord(value);\n return false;\n });\n }\n if (property === \"toString\") {\n return callable(() => String(value ?? \"\"));\n }\n if (property === \"isEmpty\") {\n return callable(() => isEmpty(value));\n }\n\n // --- Object methods ---\n if (isRecord(value)) {\n if (property === \"keys\") {\n return callable(() => Object.keys(value));\n }\n if (property === \"values\") {\n return callable(() => Object.values(value));\n }\n\n const direct = value[property];\n if (direct !== undefined) {\n return direct;\n }\n\n if (property in value) {\n return value[property];\n }\n\n const normalized = normalizeName(property);\n for (const [key, item] of Object.entries(value)) {\n if (normalizeName(key) === normalized) {\n return item;\n }\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Index access\n// ---------------------------------------------------------------------------\n\nfunction readIndex(value: unknown, index: unknown): unknown {\n // Object bracket access: note[\"price\"] same as note.price\n if (isRecord(value) && typeof index === \"string\") {\n if (index in value) {\n return value[index];\n }\n const normalized = normalizeName(index);\n for (const [key, item] of Object.entries(value)) {\n if (normalizeName(key) === normalized) {\n return item;\n }\n }\n return null;\n }\n\n if (!Array.isArray(value)) {\n return null;\n }\n\n return value[numberValue(index)] ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Binary operators\n// ---------------------------------------------------------------------------\n\nfunction callValue(callee: unknown, args: unknown[]): unknown {\n if (isCallable(callee)) {\n return callee.call(args);\n }\n\n throw new BaseEngineError(\n \"FORMULA_EVAL_ERROR\",\n \"Expression value is not callable\",\n );\n}\n\nfunction evaluateBinary(\n operator: string,\n left: unknown,\n right: unknown,\n): unknown {\n switch (operator) {\n case \"&&\":\n return truthy(left) && truthy(right);\n case \"||\":\n return truthy(left) || truthy(right);\n case \"==\":\n return equalValues(left, right);\n case \"!=\":\n return !equalValues(left, right);\n case \"<\":\n return comparableNumber(left) < comparableNumber(right);\n case \"<=\":\n return comparableNumber(left) <= comparableNumber(right);\n case \">\":\n return comparableNumber(left) > comparableNumber(right);\n case \">=\":\n return comparableNumber(left) >= comparableNumber(right);\n case \"+\":\n return addValues(left, right);\n case \"-\":\n return subtractValues(left, right);\n case \"*\":\n return multiplyValues(left, right);\n case \"/\":\n return numberValue(left) / numberValue(right);\n case \"%\":\n return numberValue(left) % numberValue(right);\n default:\n throw new BaseEngineError(\n \"UNSUPPORTED_FORMULA\",\n `Unsupported operator: ${operator}`,\n { operator },\n );\n }\n}\n\nfunction addValues(left: unknown, right: unknown): unknown {\n // Date + duration string: date(\"2023-09-12\") + \"1d\"\n const leftDate = dateValue(left);\n if (leftDate && typeof right === \"string\") {\n const duration = parseDuration(right);\n if (duration) {\n return addDurationToDate(leftDate, duration, 1);\n }\n }\n\n if (typeof left === \"string\" || typeof right === \"string\") {\n return String(left ?? \"\") + String(right ?? \"\");\n }\n\n return numberValue(left) + numberValue(right);\n}\n\nfunction subtractValues(left: unknown, right: unknown): unknown {\n const leftDate = dateValue(left);\n const rightDate = dateValue(right);\n if ((leftDate && isEmpty(right)) || (rightDate && isEmpty(left))) {\n return null;\n }\n if (leftDate && rightDate) {\n const milliseconds = leftDate.valueOf() - rightDate.valueOf();\n return durationValue(milliseconds);\n }\n\n if (leftDate && typeof right === \"string\") {\n const duration = parseDuration(right);\n if (duration) {\n return addDurationToDate(leftDate, duration, -1);\n }\n }\n\n return numberValue(left) - numberValue(right);\n}\n\nfunction multiplyValues(left: unknown, right: unknown): unknown {\n // duration * scalar\n if (isDuration(left)) {\n const scalar = numberValue(right);\n return durationValue(left.milliseconds * scalar);\n }\n if (isDuration(right)) {\n const scalar = numberValue(left);\n return durationValue(right.milliseconds * scalar);\n }\n return numberValue(left) * numberValue(right);\n}\n\n// ---------------------------------------------------------------------------\n// Object constructors\n// ---------------------------------------------------------------------------\n\nfunction fileObject(\n inspection: BaseFileInspection,\n _context: EvaluationContext,\n): Record<string, unknown> {\n const file = fileReference(inspection);\n\n return {\n ...file,\n file,\n tags: inspection.tags.map((tag) => `#${tag.tag.replace(/^#/, \"\")}`),\n links: inspection.links.flatMap((link) => link.resolvedPath ?? []),\n backlinks: inspection.backlinks,\n embeds: inspection.embeds.map(\n (link) => link.resolvedPath ?? link.targetText,\n ),\n properties: noteObject(inspection),\n asLink: callable(() => `[[${inspection.file.path}]]`),\n inFolder: callable(\n (args) =>\n inspection.file.folder === String(args[0] ?? \"\") ||\n inspection.file.folder.startsWith(`${String(args[0] ?? \"\")}/`),\n ),\n hasTag: callable((args) =>\n inspection.tags.some((tag) =>\n args.some((arg) => tagMatches(tag.tag, arg)),\n ),\n ),\n hasLink: callable((args) => {\n const target = linkTarget(args[0]);\n return inspection.links.some((link) =>\n sameComparable(link.resolvedPath ?? link.targetText, target),\n );\n }),\n hasProperty: callable((args) =>\n inspection.properties.some((property) =>\n sameComparable(property.name, args[0]),\n ),\n ),\n };\n}\n\nfunction thisObject(\n inspection: BaseFileInspection,\n context: EvaluationContext,\n): Record<string, unknown> {\n return {\n file: fileObject(inspection, context),\n asLink: callable(() => `[[${inspection.file.path}]]`),\n ...noteObject(inspection),\n };\n}\n\nfunction fileReference(\n inspection: BaseFileInspection,\n): Record<string, string | number | undefined> {\n return {\n name: inspection.file.basename,\n basename: inspection.file.basename,\n path: inspection.file.path,\n folder: inspection.file.folder,\n ext: inspection.file.ext,\n size: inspection.file.size,\n ctime: dateTimeString(inspection.file.ctime),\n mtime: dateTimeString(inspection.file.mtime),\n };\n}\n\nfunction noteObject(inspection: BaseFileInspection): Record<string, unknown> {\n return Object.fromEntries(\n inspection.properties.map((property) => [property.name, property.value]),\n );\n}\n\nfunction readProperty(inspection: BaseFileInspection, name: string): unknown {\n const property = inspection.properties.find(\n (candidate) => normalizeName(candidate.name) === normalizeName(name),\n );\n if (!property) return null;\n if (property.name === \"tags\" && Array.isArray(property.value)) {\n return property.value.map((tag) => `#${String(tag).replace(/^#/, \"\")}`);\n }\n return property.value;\n}\n\nfunction linkTarget(value: unknown): unknown {\n if (isRecord(value) && typeof value.path === \"string\") {\n return value.path;\n }\n\n if (\n isRecord(value) &&\n isRecord(value.file) &&\n typeof value.file.path === \"string\"\n ) {\n return value.file.path;\n }\n\n return value;\n}\n\nfunction lookupFile(\n value: unknown,\n context: EvaluationContext,\n): Record<string, unknown> | null {\n const target = normalizeComparable(value);\n const inspection =\n context.byPath.get(String(value)) ?? context.byBasename.get(target);\n return inspection ? fileObject(inspection, context) : null;\n}\n\n// ---------------------------------------------------------------------------\n// Primitives and type coercion\n// ---------------------------------------------------------------------------\n\nfunction callable(call: (args: unknown[]) => unknown): Callable {\n return { call };\n}\n\nfunction isCallable(value: unknown): value is Callable {\n return isRecord(value) && typeof value.call === \"function\";\n}\n\nfunction listValue(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n\n if (value === null || value === undefined || value === \"\") {\n return [];\n }\n\n return [value];\n}\n\nfunction truthy(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n\n return Boolean(value);\n}\n\nfunction isEmpty(value: unknown): boolean {\n if (value === null || value === undefined || value === \"\") {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n return false;\n}\n\nfunction numberValue(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n if (value instanceof Date) {\n return value.valueOf();\n }\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n if (isDuration(value)) {\n return value.milliseconds;\n }\n\n return 0;\n}\n\nfunction comparableNumber(value: unknown): number {\n const date = dateValue(value);\n return date ? date.valueOf() : numberValue(value);\n}\n\nfunction dateValue(value: unknown): Date | null {\n if (value instanceof Date) {\n return value;\n }\n if (typeof value !== \"string\" || value.trim() === \"\") {\n return null;\n }\n\n const trimmed = value.trim();\n const dateOnly = trimmed.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/u);\n if (dateOnly) {\n return new Date(\n Number(dateOnly[1]),\n Number(dateOnly[2]) - 1,\n Number(dateOnly[3]),\n );\n }\n\n const dateTime = trimmed.match(\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:[ T](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?)$/u,\n );\n if (dateTime) {\n return new Date(\n Number(dateTime[1]),\n Number(dateTime[2]) - 1,\n Number(dateTime[3]),\n Number(dateTime[4] ?? 0),\n Number(dateTime[5] ?? 0),\n Number(dateTime[6] ?? 0),\n Number((dateTime[7] ?? \"0\").padEnd(3, \"0\")),\n );\n }\n\n const parsed = new Date(value);\n return Number.isNaN(parsed.valueOf()) ? null : parsed;\n}\n\n// ---------------------------------------------------------------------------\n// Duration system\n// ---------------------------------------------------------------------------\n\n// Unit definitions: short form and named form.\n// Obsidian uses fixed conversions: 1M = 31d, 1y = 365d (not 30.44 / 365.25).\nconst DURATION_UNITS: Array<{\n pattern: string;\n toDays: number;\n field: \"days\" | \"hours\" | \"minutes\" | \"seconds\" | \"months\" | \"years\";\n}> = [\n { pattern: \"d\", toDays: 1, field: \"days\" },\n { pattern: \"w\", toDays: 7, field: \"days\" },\n { pattern: \"M\", toDays: 31, field: \"months\" },\n { pattern: \"y\", toDays: 365, field: \"years\" },\n { pattern: \"h\", toDays: 1 / 24, field: \"hours\" },\n { pattern: \"m\", toDays: 1 / 1440, field: \"minutes\" },\n { pattern: \"s\", toDays: 1 / 86400, field: \"seconds\" },\n { pattern: \"day\", toDays: 1, field: \"days\" },\n { pattern: \"days\", toDays: 1, field: \"days\" },\n { pattern: \"week\", toDays: 7, field: \"days\" },\n { pattern: \"weeks\", toDays: 7, field: \"days\" },\n { pattern: \"month\", toDays: 31, field: \"months\" },\n { pattern: \"months\", toDays: 31, field: \"months\" },\n { pattern: \"year\", toDays: 365, field: \"years\" },\n { pattern: \"years\", toDays: 365, field: \"years\" },\n { pattern: \"hour\", toDays: 1 / 24, field: \"hours\" },\n { pattern: \"hours\", toDays: 1 / 24, field: \"hours\" },\n { pattern: \"minute\", toDays: 1 / 1440, field: \"minutes\" },\n { pattern: \"minutes\", toDays: 1 / 1440, field: \"minutes\" },\n { pattern: \"second\", toDays: 1 / 86400, field: \"seconds\" },\n { pattern: \"seconds\", toDays: 1 / 86400, field: \"seconds\" },\n];\n\nfunction parseDuration(value: string): DurationValue | null {\n // Try short form: /^(\\d+)([dwMmyhs])$/\n const shortMatch = value.match(/^(\\d+)([dwMmyhs])$/u);\n if (shortMatch) {\n const amount = Number(shortMatch[1]);\n const unit = shortMatch[2];\n const unitDef = DURATION_UNITS.find((u) => u.pattern === unit);\n if (unitDef) {\n return durationValue(\n amount * unitDef.toDays * 86_400_000,\n unitDef.field === \"years\" ? amount : 0,\n unitDef.field === \"months\" ? amount : 0,\n unitDef.field === \"days\" ? amount * unitDef.toDays : 0,\n );\n }\n }\n\n // Try named form: /^(\\d+)\\s+(day|days|week|...)$/\n const namedMatch = value.match(/^(\\d+)\\s+(\\S+)$/u);\n if (namedMatch) {\n const amount = Number(namedMatch[1]);\n const unitName = namedMatch[2];\n const unitDef = DURATION_UNITS.find((u) => u.pattern === unitName);\n if (unitDef) {\n return durationValue(\n amount * unitDef.toDays * 86_400_000,\n unitDef.field === \"years\" ? amount : 0,\n unitDef.field === \"months\" ? amount : 0,\n unitDef.field === \"days\" ? amount * unitDef.toDays : 0,\n );\n }\n }\n\n return null;\n}\n\nfunction durationValue(\n milliseconds: number,\n calendarYears = 0,\n calendarMonths = 0,\n calendarDays = 0,\n): DurationValue {\n return {\n milliseconds,\n days: nearInteger(milliseconds / 86_400_000),\n hours: nearInteger(milliseconds / 3_600_000),\n minutes: nearInteger(milliseconds / 60_000),\n seconds: nearInteger(milliseconds / 1_000),\n months: nearInteger(\n milliseconds / ((365.28478589915085 * 86_400_000) / 12),\n ),\n years: nearInteger(milliseconds / (365.28478589915085 * 86_400_000)),\n calendarYears,\n calendarMonths,\n calendarDays,\n };\n}\n\nfunction nearInteger(value: number): number {\n const rounded = Math.round(value);\n return Math.abs(value - rounded) < 1e-9 ? rounded : value;\n}\n\nfunction addDurationToDate(\n date: Date,\n duration: DurationValue,\n direction: 1 | -1,\n): Date {\n const next = new Date(date.valueOf());\n const calendarYears = duration.calendarYears ?? 0;\n const calendarMonths = duration.calendarMonths ?? 0;\n const calendarDays = duration.calendarDays ?? 0;\n if (calendarYears !== 0) {\n next.setFullYear(next.getFullYear() + direction * calendarYears);\n }\n if (calendarMonths !== 0) {\n next.setMonth(next.getMonth() + direction * calendarMonths);\n }\n if (calendarDays !== 0) {\n next.setDate(next.getDate() + direction * calendarDays);\n }\n const calendarMilliseconds =\n calendarYears * 365 * 86_400_000 +\n calendarMonths * 31 * 86_400_000 +\n calendarDays * 86_400_000;\n const clockMilliseconds = duration.milliseconds - calendarMilliseconds;\n if (clockMilliseconds !== 0) {\n next.setTime(next.valueOf() + direction * clockMilliseconds);\n }\n return next;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting and normalization\n// ---------------------------------------------------------------------------\n\nfunction dateTimeString(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const date = new Date(value);\n if (Number.isNaN(date.valueOf())) {\n return value;\n }\n\n return formatDateTimeForOutput(date);\n}\n\nfunction formatDateTimeForOutput(date: Date): string {\n const pad = (part: number) => String(part).padStart(2, \"0\");\n const datePart = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(\n date.getDate(),\n )}`;\n if (\n date.getHours() === 0 &&\n date.getMinutes() === 0 &&\n date.getSeconds() === 0 &&\n date.getMilliseconds() === 0\n ) {\n return datePart;\n }\n return `${datePart}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(\n date.getSeconds(),\n )}`;\n}\n\nfunction relativeTime(date: Date): string {\n const now = Date.now();\n const diff = now - date.valueOf();\n const absDiff = Math.abs(diff);\n const isPast = diff > 0;\n\n const seconds = Math.floor(absDiff / 1_000);\n const minutes = Math.floor(absDiff / 60_000);\n const hours = Math.floor(absDiff / 3_600_000);\n const days = Math.floor(absDiff / 86_400_000);\n const months = Math.floor(absDiff / (31 * 86_400_000));\n const years = Math.floor(absDiff / (365 * 86_400_000));\n\n const suffix = isPast ? \"ago\" : \"from now\";\n\n if (years > 0) return `${years} year${years > 1 ? \"s\" : \"\"} ${suffix}`;\n if (months > 0) return `${months} month${months > 1 ? \"s\" : \"\"} ${suffix}`;\n if (days > 0) return `${days} day${days > 1 ? \"s\" : \"\"} ${suffix}`;\n if (hours > 0) return `${hours} hour${hours > 1 ? \"s\" : \"\"} ${suffix}`;\n if (minutes > 0)\n return `${minutes} minute${minutes > 1 ? \"s\" : \"\"} ${suffix}`;\n if (seconds > 0)\n return `${seconds} second${seconds > 1 ? \"s\" : \"\"} ${suffix}`;\n return \"just now\";\n}\n\nfunction uniqueValues(values: unknown[]): unknown[] {\n const seen = new Set<string>();\n return values.filter((value) => {\n const key = normalizeComparable(value);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n}\n\nfunction sameComparable(left: unknown, right: unknown): boolean {\n return normalizeComparable(left) === normalizeComparable(right);\n}\n\nfunction equalValues(left: unknown, right: unknown): boolean {\n if (typeof left === \"string\" && typeof right === \"string\") {\n return left === right;\n }\n return sameComparable(left, right);\n}\n\nfunction normalizeComparable(value: unknown): string {\n if (isRecord(value) && typeof value.path === \"string\") {\n return normalizeComparable(value.path);\n }\n\n if (\n isRecord(value) &&\n isRecord(value.file) &&\n typeof value.file.path === \"string\"\n ) {\n return normalizeComparable(value.file.path);\n }\n\n // Strip # prefix for tag comparisons so \"#book\" matches \"book\"\n return (\n String(value)\n .replace(/^#/u, \"\")\n .replace(/^\\[\\[/u, \"\")\n .replace(/\\]\\]$/u, \"\")\n .replace(/\\.md$/u, \"\")\n .split(\"/\")\n .at(-1)\n ?.toLowerCase() ?? \"\"\n );\n}\n\nfunction tagMatches(tag: string, value: unknown): boolean {\n const normalizedTag = normalizeComparable(tag);\n const normalizedValue = normalizeComparable(value);\n return (\n normalizedTag === normalizedValue ||\n normalizedTag.startsWith(`${normalizedValue}/`)\n );\n}\n\nfunction normalizeName(name: string): string {\n return name.replace(/-/gu, \"\").toLowerCase();\n}\n\nfunction isDuration(value: unknown): value is DurationValue {\n return (\n isRecord(value) &&\n typeof value.milliseconds === \"number\" &&\n typeof value.days === \"number\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction formatDate(date: Date, pattern: string): string {\n const pad = (n: number, width = 2) => String(n).padStart(width, \"0\");\n\n const dayNames = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ];\n const dayNamesShort = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n const monthNamesShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n\n const day = date.getDate();\n const ordinal = (n: number): string => {\n const suffix = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = n % 100;\n return n + (suffix[(v - 20) % 10] ?? suffix[v] ?? suffix[0]);\n };\n\n // Replace longest patterns first to avoid partial matches.\n return pattern\n .replace(/dddd/gu, dayNames[date.getDay()] ?? \"\")\n .replace(/ddd/gu, dayNamesShort[date.getDay()] ?? \"\")\n .replace(/DD/gu, pad(date.getDate()))\n .replace(/Do/gu, ordinal(day))\n .replace(/MMMM/gu, monthNames[date.getMonth()] ?? \"\")\n .replace(/MMM/gu, monthNamesShort[date.getMonth()] ?? \"\")\n .replace(/MM/gu, pad(date.getMonth() + 1))\n .replace(/YYYY/gu, String(date.getFullYear()))\n .replace(/YY/gu, String(date.getFullYear()).slice(-2))\n .replace(/HH/gu, pad(date.getHours()))\n .replace(/mm/gu, pad(date.getMinutes()))\n .replace(/ss/gu, pad(date.getSeconds()));\n}\n\nfunction compareValuesForSort(a: unknown, b: unknown): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a ?? \"\").localeCompare(String(b ?? \"\"));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/gu, \"&\")\n .replace(/</gu, \"<\")\n .replace(/>/gu, \">\")\n .replace(/\"/gu, \""\")\n .replace(/'/gu, \"'\");\n}\n","import {\n type BaseDefinition,\n type BasePropertyConfig,\n type BaseSort,\n type BaseView,\n parseExpression,\n} from \"@aliou/obsdx-base-ast\";\nimport {\n BaseEngineError,\n type EvaluationContext,\n evaluateExpression,\n} from \"./expressions/evaluator\";\nimport {\n maxNumber,\n meanNumbers,\n medianNumbers,\n minNumber,\n numericValues,\n stddevNumbers,\n sumNumbers,\n} from \"./math\";\nimport type { BaseQueryMeta, BaseQueryResult, BaseQueryRow } from \"./result\";\n\nexport type BaseFileInspection = {\n file: {\n path: string;\n name: string;\n basename: string;\n ext: string;\n folder: string;\n kind: string;\n ctime?: string;\n mtime?: string;\n size?: number;\n indexedAt?: string;\n parseError?: string | null;\n };\n properties: Array<{\n name: string;\n value: unknown;\n valueType?: string | null;\n }>;\n tags: Array<{ tag: string }>;\n links: Array<{ resolvedPath?: string | null; targetText?: string | null }>;\n backlinks: unknown[];\n embeds: Array<{ resolvedPath?: string | null; targetText?: string | null }>;\n};\n\nexport type BaseQueryOptions = {\n view?: string;\n context?: string;\n};\n\nexport type BaseColumn = {\n id: string;\n displayName: string;\n type: string;\n};\n\ntype BaseRow = {\n file: {\n path: string;\n name: string;\n basename: string;\n ext: string;\n folder: string;\n size?: number;\n ctime?: string;\n mtime?: string;\n };\n values: Record<string, unknown>;\n formulas: Record<string, unknown>;\n sortValues: Record<string, unknown>;\n};\n\nexport function queryBase(\n base: BaseDefinition,\n inspections: BaseFileInspection[],\n options: BaseQueryOptions = {},\n): BaseQueryResult {\n const byPath = new Map(\n inspections.map((inspection) => [inspection.file.path, inspection]),\n );\n const byBasename = new Map(\n inspections.map((inspection) => [\n normalizeComparable(inspection.file.basename),\n inspection,\n ]),\n );\n const context = options.context ? byPath.get(options.context) : undefined;\n const view = selectView(base, options.view);\n const columns = buildColumns(base, view);\n const rows: BaseRow[] = [];\n\n for (const inspection of inspections) {\n const formulas = evaluateFormulas(base, inspection, {\n row: inspection,\n context,\n formulas: {},\n byPath,\n byBasename,\n });\n const evalContext = {\n row: inspection,\n context,\n formulas,\n byPath,\n byBasename,\n };\n if (\n inspection.file.kind !== \"markdown\" ||\n !evaluateFilters(base.filters, evalContext) ||\n !evaluateFilters(view?.filters, evalContext)\n ) {\n continue;\n }\n\n rows.push({\n file: sanitizeRowFile(inspection.file),\n values: Object.fromEntries(\n columns.map((column) => [\n column.id,\n readColumnValue(column.id, evalContext),\n ]),\n ),\n formulas,\n sortValues: Object.fromEntries(\n (view?.sort ?? []).map((item) => [\n item.property,\n readColumnValue(item.property, evalContext),\n ]),\n ),\n });\n }\n\n rows.sort((left, right) => compareRows(left, right, view?.sort, columns));\n const limitedRows =\n view?.limit && view.limit > 0 ? rows.slice(0, view.limit) : rows;\n const resolvedColumns = resolveColumnTypes(columns, limitedRows, inspections);\n\n return {\n base: base.path,\n view: view?.name,\n context: options.context,\n meta: buildMeta(view),\n columns: resolvedColumns,\n rows: limitedRows.map((row) => projectRow(row, resolvedColumns)),\n groups: buildGroups(limitedRows, view),\n summaries: buildSummaries(limitedRows, view, base),\n };\n}\n\nfunction evaluateFormulas(\n base: BaseDefinition,\n _inspection: BaseFileInspection,\n context: EvaluationContext,\n): Record<string, unknown> {\n const formulas: Record<string, unknown> = {};\n const evalContext = { ...context, formulas };\n const evaluating = new Set<string>();\n\n const evaluateFormula = (name: string): unknown => {\n if (Object.hasOwn(formulas, name)) {\n return formulas[name];\n }\n\n const source = base.formulas[name];\n if (source === undefined) {\n return null;\n }\n\n if (evaluating.has(name)) {\n throw new BaseEngineError(\n \"FORMULA_EVAL_ERROR\",\n `Circular formula reference: ${name}`,\n { formula: name },\n );\n }\n\n evaluating.add(name);\n try {\n formulas[name] = evaluateExpression(parseExpression(source), {\n ...evalContext,\n formulas: new Proxy(formulas, {\n get: (target, property) =>\n typeof property === \"string\"\n ? evaluateFormula(property)\n : Reflect.get(target, property),\n }),\n });\n } catch (error) {\n formulas[name] =\n error instanceof BaseEngineError\n ? error\n : new BaseEngineError(\n \"FORMULA_EVAL_ERROR\",\n error instanceof Error ? error.message : String(error),\n { formula: name },\n );\n }\n evaluating.delete(name);\n return formulas[name];\n };\n\n for (const name of Object.keys(base.formulas)) {\n evaluateFormula(name);\n }\n\n return formulas;\n}\n\nfunction evaluateFilters(\n filters: unknown,\n context: EvaluationContext,\n): boolean {\n if (!filters) {\n return true;\n }\n\n if (typeof filters === \"string\") {\n return Boolean(evaluateExpression(parseExpression(filters), context));\n }\n\n if (Array.isArray(filters)) {\n return filters.every((filter) => evaluateFilters(filter, context));\n }\n\n if (!isRecord(filters)) {\n return true;\n }\n\n if (Array.isArray(filters.and)) {\n return filters.and.every((filter) => evaluateFilters(filter, context));\n }\n\n if (Array.isArray(filters.or)) {\n return filters.or.some((filter) => evaluateFilters(filter, context));\n }\n\n if (Array.isArray(filters.not)) {\n return !filters.not.some((filter) => evaluateFilters(filter, context));\n }\n\n return true;\n}\n\nfunction readColumnValue(id: string, context: EvaluationContext): unknown {\n const value = evaluateExpression(parseExpression(id), context);\n if (value !== null) {\n return value;\n }\n\n // Bare property name may map to note.{id} or file.{id}\n for (const qualified of [`note.${id}`, `file.${id}`]) {\n const resolved = evaluateExpression(parseExpression(qualified), context);\n if (resolved !== null) {\n return resolved;\n }\n }\n\n return null;\n}\n\nfunction selectView(\n base: BaseDefinition,\n requested: string | undefined,\n): BaseView | undefined {\n if (!requested) {\n return base.views[0];\n }\n\n const view = base.views.find((v) => v.name === requested);\n if (!view) {\n throw new BaseEngineError(\n \"BASE_VIEW_NOT_FOUND\",\n `View not found: ${requested}`,\n { requested, availableViews: base.views.map((v) => v.name) },\n );\n }\n\n return view;\n}\n\nfunction buildColumns(\n base: BaseDefinition,\n view: BaseView | undefined,\n): BaseColumn[] {\n const ids =\n view?.order && view.order.length > 0\n ? view.order\n : Object.keys(base.properties);\n\n return ids.map((id) => {\n const property = findPropertyConfig(base.properties, id);\n return {\n id,\n displayName: property?.displayName ?? defaultDisplayName(id),\n type: valueType(property),\n };\n });\n}\n\nfunction defaultDisplayName(id: string): string {\n if (id === \"file.name\") {\n return \"name\";\n }\n if (id === \"file.mtime\") {\n return \"modified time\";\n }\n if (id === \"file.ctime\") {\n return \"created time\";\n }\n if (id === \"file.ext\") {\n return \"extension\";\n }\n if (id === \"file.path\") {\n return \"path\";\n }\n return id.startsWith(\"formula.\") ? id.slice(\"formula.\".length) : id;\n}\n\nfunction findPropertyConfig(\n properties: Record<string, BasePropertyConfig>,\n id: string,\n): BasePropertyConfig | undefined {\n return properties[id] ?? properties[`note.${id}`] ?? properties[`file.${id}`];\n}\n\nfunction valueType(_property: BasePropertyConfig | undefined): string {\n return \"any\";\n}\n\nfunction buildMeta(view: BaseView | undefined): BaseQueryMeta {\n return {\n type: view?.type,\n name: view?.name,\n filters: view?.filters,\n order: view?.order ?? [],\n sort: view?.sort,\n limit: view?.limit,\n groupBy: view?.groupBy,\n summaries: view?.summaries,\n };\n}\n\nfunction projectRow(row: BaseRow, columns: BaseColumn[]): BaseQueryRow {\n const data = Object.fromEntries(\n columns.map((column) => [\n column.id,\n Object.hasOwn(row.values, column.id) ? row.values[column.id] : null,\n ]),\n );\n const file = {\n path: row.file.path,\n name: row.file.name,\n };\n Object.defineProperties(file, {\n basename: { value: row.file.basename, enumerable: false },\n ext: { value: row.file.ext, enumerable: false },\n folder: { value: row.file.folder, enumerable: false },\n size: { value: row.file.size, enumerable: false },\n ctime: { value: row.file.ctime, enumerable: false },\n mtime: { value: row.file.mtime, enumerable: false },\n });\n\n const projected = {\n file,\n data,\n };\n\n Object.defineProperties(projected, {\n values: { value: row.values, enumerable: false },\n formulas: { value: row.formulas, enumerable: false },\n sortValues: { value: row.sortValues, enumerable: false },\n });\n\n return projected;\n}\n\nfunction resolveColumnTypes(\n columns: BaseColumn[],\n rows: BaseRow[],\n inspections: BaseFileInspection[],\n): BaseColumn[] {\n return columns.map((column) => ({\n ...column,\n type: resolveColumnType(column.id, rows, inspections),\n }));\n}\n\nfunction resolveColumnType(\n id: string,\n rows: BaseRow[],\n inspections: BaseFileInspection[],\n): string {\n const propertyName = id.replace(/^note\\./u, \"\");\n for (const inspection of inspections) {\n const property = inspection.properties.find(\n (candidate) => candidate.name === propertyName,\n );\n if (property?.valueType) {\n return normalizeColumnType(property.valueType);\n }\n }\n\n if (\n id === \"file.name\" ||\n id === \"file.basename\" ||\n id === \"file.path\" ||\n id === \"file.folder\" ||\n id === \"file.ext\"\n ) {\n return \"text\";\n }\n if (id === \"file.size\") {\n return \"number\";\n }\n if (id === \"file.ctime\" || id === \"file.mtime\") {\n return \"datetime\";\n }\n\n for (const row of rows) {\n const value = row.values[id];\n if (value !== null && value !== undefined) {\n return inferColumnType(value);\n }\n }\n\n return \"empty\";\n}\n\nfunction normalizeColumnType(type: string): string {\n if (type === \"checkbox\") return \"boolean\";\n if (type === \"multitext\" || type === \"aliases\" || type === \"tags\")\n return \"list\";\n if (type === \"string\") return \"text\";\n return type;\n}\n\nfunction inferColumnType(value: unknown): string {\n if (value instanceof Date) {\n return isMidnight(value) ? \"date\" : \"datetime\";\n }\n if (Array.isArray(value)) return \"list\";\n if (value instanceof Error) return \"error\";\n if (typeof value === \"string\") {\n if (/^\\d{4}-\\d{2}-\\d{2}$/u.test(value)) return \"date\";\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/u.test(value)) return \"datetime\";\n if (/^\\[\\[.*\\]\\]$/u.test(value)) return \"link\";\n return \"text\";\n }\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"boolean\") return \"boolean\";\n if (value && typeof value === \"object\") return \"object\";\n return \"empty\";\n}\n\nfunction isMidnight(date: Date): boolean {\n return (\n date.getHours() === 0 &&\n date.getMinutes() === 0 &&\n date.getSeconds() === 0 &&\n date.getMilliseconds() === 0\n );\n}\n\nfunction compareRows(\n left: BaseRow,\n right: BaseRow,\n sort: BaseSort[] | undefined,\n columns: BaseColumn[] = [],\n): number {\n for (const item of sort ?? []) {\n const leftValue =\n left.sortValues[item.property] ??\n left.values[item.property] ??\n left.formulas[formulaName(item.property)];\n const rightValue =\n right.sortValues[item.property] ??\n right.values[item.property] ??\n right.formulas[formulaName(item.property)];\n const result = compareValues(leftValue, rightValue);\n if (result !== 0) {\n return item.direction === \"DESC\" ? -result : result;\n }\n }\n\n // When explicit sort ties, fall through to column order as tiebreaker\n // The tiebreaker inherits the sort direction of the last explicit sort\n const direction = sort?.length ? sort[sort.length - 1]?.direction : undefined;\n for (const column of columns) {\n const leftValue = left.values[column.id];\n const rightValue = right.values[column.id];\n const result = compareValues(leftValue, rightValue);\n if (result !== 0) {\n return direction === \"DESC\" ? -result : result;\n }\n }\n\n return compareValues(left.file.basename, right.file.basename);\n}\n\nfunction buildGroups(rows: BaseRow[], view: BaseView | undefined): unknown[] {\n const groupBy = view?.groupBy;\n const groupIds = groupBy ? [groupBy.property] : [];\n\n return groupIds.map((id) => {\n const buckets = new Map<string, { value: unknown; rows: BaseRow[] }>();\n for (const row of rows) {\n const value = row.values[id] ?? row.formulas[formulaName(id)] ?? null;\n const key = comparableKey(value);\n const bucket = buckets.get(key) ?? { value, rows: [] };\n bucket.rows.push(row);\n buckets.set(key, bucket);\n }\n\n const direction = groupBy?.property === id ? groupBy.direction : \"ASC\";\n const sortedBuckets = [...buckets.values()].sort((left, right) => {\n const result = compareValues(left.value, right.value);\n return direction === \"DESC\" ? -result : result;\n });\n\n return {\n property: id,\n direction,\n buckets: sortedBuckets.map((bucket) => ({\n value: bucket.value,\n count: bucket.rows.length,\n rows: bucket.rows.map((row) => row.file.path),\n })),\n };\n });\n}\n\nfunction buildSummaries(\n rows: BaseRow[],\n view: BaseView | undefined,\n base: BaseDefinition,\n): Record<string, unknown> {\n const summaries: Record<string, unknown> = {\n count: rows.length,\n };\n\n for (const [key, requestedSummary] of Object.entries(view?.summaries ?? {})) {\n const values = rows.map(\n (row) => row.values[key] ?? row.formulas[formulaName(key)] ?? null,\n );\n summaries[key] = summarizeValues(\n values,\n typeof requestedSummary === \"string\"\n ? requestedSummary\n : String(requestedSummary),\n base,\n );\n }\n\n return summaries;\n}\n\nfunction summarizeValues(\n values: unknown[],\n requestedSummary: string,\n base: BaseDefinition,\n): unknown {\n const custom = base.summaries?.[requestedSummary];\n if (custom) {\n return evaluateExpression(parseExpression(custom), {\n row: emptySummaryInspection(),\n formulas: {},\n byPath: new Map(),\n byBasename: new Map(),\n values,\n });\n }\n\n const normalized = requestedSummary.toLowerCase();\n const numbers = numericValues(values);\n const dates = values\n .map(dateFromValue)\n .filter((value): value is Date => value instanceof Date);\n\n if (normalized === \"sum\") return sumNumbers(numbers);\n if (normalized === \"average\" || normalized === \"mean\") {\n return meanNumbers(numbers);\n }\n if (normalized === \"min\") return minNumber(numbers);\n if (normalized === \"max\") return maxNumber(numbers);\n if (normalized === \"median\") return medianNumbers(numbers);\n if (normalized === \"stddev\") return stddevNumbers(numbers);\n if (normalized === \"checked\") {\n return values.filter((value) => value === true).length;\n }\n if (normalized === \"unchecked\") {\n return values.filter((value) => value === false).length;\n }\n if (normalized === \"empty\") return values.filter(isEmptySummaryValue).length;\n if (normalized === \"filled\") {\n return values.filter((value) => !isEmptySummaryValue(value)).length;\n }\n if (normalized === \"unique\") return new Set(values.map(comparableKey)).size;\n if (normalized === \"earliest\") return dateSummary(minDate(dates));\n if (normalized === \"latest\") return dateSummary(maxDate(dates));\n if (normalized === \"range\") {\n if (numbers.length > 0) {\n return Math.max(...numbers) - Math.min(...numbers);\n }\n const earliest = minDate(dates);\n const latest = maxDate(dates);\n return earliest && latest ? latest.getTime() - earliest.getTime() : null;\n }\n\n return {\n count: numbers.length,\n sum: sumNumbers(numbers),\n average: meanNumbers(numbers),\n };\n}\n\nfunction emptySummaryInspection(): BaseFileInspection {\n return {\n file: {\n path: \"\",\n name: \"\",\n basename: \"\",\n ext: \"\",\n folder: \"\",\n kind: \"markdown\",\n },\n properties: [],\n tags: [],\n links: [],\n backlinks: [],\n embeds: [],\n };\n}\n\nfunction dateFromValue(value: unknown): Date | null {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (typeof value !== \"string\") return null;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction minDate(values: Date[]): Date | null {\n return values.length > 0\n ? new Date(Math.min(...values.map((value) => value.getTime())))\n : null;\n}\n\nfunction maxDate(values: Date[]): Date | null {\n return values.length > 0\n ? new Date(Math.max(...values.map((value) => value.getTime())))\n : null;\n}\n\nfunction dateSummary(value: Date | null): string | null {\n return value ? value.toISOString() : null;\n}\n\nfunction isEmptySummaryValue(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nfunction comparableKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value);\n}\n\nfunction sanitizeRowFile(file: BaseFileInspection[\"file\"]): BaseRow[\"file\"] {\n return {\n path: file.path,\n name: file.basename,\n basename: file.basename,\n ext: file.ext,\n folder: file.folder,\n size: file.size,\n ctime: file.ctime,\n mtime: file.mtime,\n };\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nfunction formulaName(id: string): string {\n return id.startsWith(\"formula.\") ? id.slice(\"formula.\".length) : id;\n}\n\nfunction normalizeComparable(value: unknown): string {\n return String(value)\n .replace(/^\\[\\[/u, \"\")\n .replace(/\\]\\]$/u, \"\")\n .replace(/\\.md$/u, \"\")\n .toLowerCase();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aliou/obsdx-base-engine",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Obsidian Base query execution for obsdx",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.mts",
|
|
10
|
+
"import": "./dist/index.mjs"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/index.d.mts",
|
|
15
|
+
"dist/index.mjs",
|
|
16
|
+
"dist/index.mjs.map"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/aliou/obsdx",
|
|
21
|
+
"directory": "packages/base-engine"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=25.7.0"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@aliou/obsdx-base-ast": "0.0.1"
|
|
31
|
+
}
|
|
32
|
+
}
|