@aigne/afs-world-mapping 1.11.0-beta.6
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/LICENSE.md +26 -0
- package/dist/index.d.mts +246 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +992 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["resolveField","left"],"sources":["../src/capability.ts","../src/compiler.ts","../src/compute/types.ts","../src/compute/evaluator.ts","../src/compute/parser.ts","../src/compute/template.ts","../src/core.ts","../src/module.ts","../src/with-world-mapping.ts"],"sourcesContent":["import type { AFSEntry, AFSModule } from \"@aigne/afs\";\n\nexport type MutateAction = \"create\" | \"update\" | \"delete\" | \"exec\";\n\nexport interface MutateResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nexport interface WorldStatus {\n loaded: boolean;\n loadedAt?: Date;\n schemaPath?: string;\n bindingPath?: string;\n compiled: boolean;\n error?: string;\n stats?: {\n kinds: number;\n routes: number;\n operations: number;\n };\n}\n\nexport interface BackendOp {\n type: \"sql\" | \"http\" | \"graphql\" | \"mcp-tool\" | \"custom\";\n operation: unknown;\n params?: Record<string, unknown>;\n}\n\nexport interface ProjectionContext {\n path: string;\n kind: string;\n pathParams: Record<string, string>;\n}\n\nexport interface AFSWorldMappingCapable {\n loadWorld(schemaPath: string, bindingPath: string): Promise<void>;\n reloadWorld(): Promise<void>;\n getWorldStatus(): WorldStatus;\n resolve(path: string): BackendOp | null;\n project(backendData: unknown, context: ProjectionContext): AFSEntry[];\n mutate(path: string, action: MutateAction, payload: unknown): Promise<MutateResult>;\n}\n\nconst REQUIRED_METHODS = [\n \"loadWorld\",\n \"reloadWorld\",\n \"getWorldStatus\",\n \"resolve\",\n \"project\",\n \"mutate\",\n] as const;\n\nexport function isWorldMappingCapable(\n module: AFSModule,\n): module is AFSModule & AFSWorldMappingCapable {\n if (!module || typeof module !== \"object\") return false;\n const obj = module as unknown as Record<string, unknown>;\n return REQUIRED_METHODS.every((method) => typeof obj[method] === \"function\");\n}\n","/**\n * World Compiler — Path-Only\n *\n * Compiles WorldSchema + WorldBinding into a CompiledMapping with a path trie\n * for runtime resolution. No backend-specific logic.\n */\n\nimport type { WorldBinding } from \"./binding/types.js\";\nimport type { WorldSchema } from \"./schema/types.js\";\n\n/** Result of resolving a world path */\nexport interface TrieMatch {\n kind: string;\n params: Record<string, string>;\n isCollection: boolean;\n}\n\n/** Compiled kind metadata */\nexport interface CompiledKind {\n key: string;\n source: string;\n fieldMap: Record<string, string>;\n}\n\n/** Result of compilation */\nexport interface CompiledMapping {\n world: string;\n version: string;\n resolve: (path: string) => TrieMatch | null;\n kinds: Record<string, CompiledKind>;\n}\n\n/** Internal trie node */\ninterface TrieNode {\n kind?: string;\n isCollection?: boolean;\n paramName?: string;\n children: Map<string, TrieNode>;\n param?: TrieNode;\n}\n\nexport class WorldCompiler {\n compile(schema: WorldSchema | any, binding: WorldBinding): CompiledMapping {\n if (!schema.world) {\n throw new Error(\"WorldCompiler: schema missing world name\");\n }\n if (!schema.version) {\n throw new Error(\"WorldCompiler: schema missing version\");\n }\n\n for (const [kindName, kindDef] of Object.entries(schema.kinds as Record<string, any>)) {\n this.validateIdentifier(kindName, `kind name \"${kindName}\"`);\n if (kindDef.fields) {\n for (const fieldName of Object.keys(kindDef.fields)) {\n this.validateIdentifier(fieldName, `field name \"${fieldName}\" in kind \"${kindName}\"`);\n }\n }\n }\n\n for (const [kindName, kindDef] of Object.entries(schema.kinds as Record<string, any>)) {\n if (kindDef.fields) {\n for (const [fieldName, fieldType] of Object.entries(\n kindDef.fields as Record<string, string>,\n )) {\n this.validateFieldType(fieldType, kindName, fieldName);\n }\n }\n if (kindDef.relations) {\n for (const [relationName, relationType] of Object.entries(\n kindDef.relations as Record<string, string>,\n )) {\n const match = relationType.match(/^list:(.+)$/);\n if (match?.[1] && !schema.kinds[match[1]]) {\n throw new Error(\n `WorldCompiler: relation \"${relationName}\" in kind \"${kindName}\" references unknown kind \"${match[1]}\"`,\n );\n }\n }\n }\n }\n\n const trie = this.buildPathTrie(schema);\n const kinds: Record<string, CompiledKind> = {};\n\n for (const [kindName, kindDef] of Object.entries(schema.kinds as Record<string, any>)) {\n const kindMapping = binding.mappings?.[kindName];\n kinds[kindName] = {\n key: kindDef.key,\n source: kindMapping?.source ?? binding.source,\n fieldMap: kindMapping?.fieldMap ?? {},\n };\n }\n\n return {\n world: schema.world,\n version: schema.version,\n resolve: (path: string) => this.resolvePath(trie, path),\n kinds,\n };\n }\n\n private validateIdentifier(value: string, context: string): void {\n if (!/^[A-Za-z0-9_]+$/.test(value)) {\n throw new Error(\n `WorldCompiler: invalid identifier for ${context}. Must only contain [A-Za-z0-9_]`,\n );\n }\n }\n\n private validateFieldType(fieldType: string, kindName: string, fieldName: string): void {\n const basicTypes = [\"int\", \"string\", \"text\", \"bool\", \"datetime\"];\n if (basicTypes.includes(fieldType)) return;\n if (fieldType.startsWith(\"enum(\") && fieldType.endsWith(\")\")) return;\n if (fieldType.startsWith(\"list:\")) return;\n if (fieldType.startsWith(\"ref:\")) return;\n\n throw new Error(\n `WorldCompiler: field \"${fieldName}\" in kind \"${kindName}\" has invalid type \"${fieldType}\"`,\n );\n }\n\n private buildPathTrie(schema: WorldSchema | any): TrieNode {\n const root: TrieNode = { children: new Map() };\n\n for (const [kindName, kindDef] of Object.entries(schema.kinds as Record<string, any>)) {\n const pathTemplate: string = kindDef.path;\n const segments = pathTemplate.split(\"/\").filter((s: string) => s.length > 0);\n const keyParamName = `{${kindDef.key}}`;\n\n let node = root;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!;\n const isLastSegment = i === segments.length - 1;\n\n if (segment.startsWith(\"{\") && segment.endsWith(\"}\")) {\n const paramName = segment.slice(1, -1);\n\n if (!node.param) {\n node.param = { paramName, children: new Map() };\n }\n node = node.param;\n\n if (isLastSegment) {\n node.kind = kindName;\n node.isCollection = false;\n }\n } else {\n if (!node.children.has(segment)) {\n node.children.set(segment, { children: new Map() });\n }\n node = node.children.get(segment)!;\n\n // If next segment is the key param, this literal node is the collection endpoint\n const nextSegment = segments[i + 1];\n if (i + 1 < segments.length && nextSegment === keyParamName) {\n node.kind = kindName;\n node.isCollection = true;\n }\n\n if (isLastSegment) {\n node.kind = kindName;\n node.isCollection = false;\n }\n }\n }\n }\n\n return root;\n }\n\n private resolvePath(trie: TrieNode, path: string): TrieMatch | null {\n const segments = path.split(\"/\").filter((s) => s.length > 0);\n const params: Record<string, string> = {};\n\n let node = trie;\n let lastMatch: TrieMatch | null = null;\n\n for (const segment of segments) {\n if (node.children.has(segment)) {\n node = node.children.get(segment)!;\n } else if (node.param) {\n params[node.param.paramName!] = segment;\n node = node.param;\n } else {\n return lastMatch;\n }\n\n if (node.kind) {\n lastMatch = {\n kind: node.kind,\n params: { ...params },\n isCollection: node.isCollection ?? false,\n };\n }\n }\n\n return lastMatch;\n }\n}\n","/**\n * World Compute — AST Types\n *\n * Pure expression language for deterministic computation.\n * No async, no IO, no side effects.\n */\n\nexport type ASTNode =\n | NumberLiteral\n | StringLiteral\n | BooleanLiteral\n | NullLiteral\n | FieldRef\n | ParamRef\n | BinaryOp\n | UnaryOp\n | FunctionCall;\n\nexport interface NumberLiteral {\n type: \"NumberLiteral\";\n value: number;\n}\n\nexport interface StringLiteral {\n type: \"StringLiteral\";\n value: string;\n}\n\nexport interface BooleanLiteral {\n type: \"BooleanLiteral\";\n value: boolean;\n}\n\nexport interface NullLiteral {\n type: \"NullLiteral\";\n}\n\nexport interface FieldRef {\n type: \"FieldRef\";\n path: string[];\n}\n\nexport interface ParamRef {\n type: \"ParamRef\";\n name: string;\n}\n\nexport interface BinaryOp {\n type: \"BinaryOp\";\n operator: string;\n left: ASTNode;\n right: ASTNode;\n}\n\nexport interface UnaryOp {\n type: \"UnaryOp\";\n operator: string;\n operand: ASTNode;\n}\n\nexport interface FunctionCall {\n type: \"FunctionCall\";\n name: string;\n args: ASTNode[];\n}\n\n/** Context for expression evaluation */\nexport interface EvalContext {\n /** Source data object (fields accessed via $.) */\n data: Record<string, unknown>;\n /** Parameters (accessed via @name, e.g. @eval_time) */\n params?: Record<string, unknown>;\n}\n\nexport class ParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ParseError\";\n }\n}\n\nexport class ExprEvalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExprEvalError\";\n }\n}\n","/**\n * World Compute — Expression Evaluator\n *\n * Pure synchronous evaluator. No async, no IO, no side effects.\n */\n\nimport type { ASTNode, EvalContext } from \"./types.js\";\nimport { ExprEvalError } from \"./types.js\";\n\nconst MAX_DEPTH = 64;\n\ntype BuiltinFn = (args: unknown[]) => unknown;\n\nconst BUILTINS: Record<string, BuiltinFn> = {\n concat: (args) => args.map((a) => (a == null ? \"\" : String(a))).join(\"\"),\n\n len: ([val]) => {\n if (typeof val === \"string\") return val.length;\n if (Array.isArray(val)) return val.length;\n throw new ExprEvalError(\"len() requires a string or array\");\n },\n\n upper: ([val]) => {\n if (typeof val !== \"string\") throw new ExprEvalError(\"upper() requires a string\");\n return val.toUpperCase();\n },\n\n lower: ([val]) => {\n if (typeof val !== \"string\") throw new ExprEvalError(\"lower() requires a string\");\n return val.toLowerCase();\n },\n\n trim: ([val]) => {\n if (typeof val !== \"string\") throw new ExprEvalError(\"trim() requires a string\");\n return val.trim();\n },\n\n round: ([val]) => {\n if (typeof val !== \"number\") throw new ExprEvalError(\"round() requires a number\");\n return Math.round(val);\n },\n\n floor: ([val]) => {\n if (typeof val !== \"number\") throw new ExprEvalError(\"floor() requires a number\");\n return Math.floor(val);\n },\n\n ceil: ([val]) => {\n if (typeof val !== \"number\") throw new ExprEvalError(\"ceil() requires a number\");\n return Math.ceil(val);\n },\n\n abs: ([val]) => {\n if (typeof val !== \"number\") throw new ExprEvalError(\"abs() requires a number\");\n return Math.abs(val);\n },\n\n min: (args) => {\n const nums = args.filter((a): a is number => typeof a === \"number\");\n if (nums.length === 0) throw new ExprEvalError(\"min() requires at least one number\");\n return Math.min(...nums);\n },\n\n max: (args) => {\n const nums = args.filter((a): a is number => typeof a === \"number\");\n if (nums.length === 0) throw new ExprEvalError(\"max() requires at least one number\");\n return Math.max(...nums);\n },\n\n matches: ([val, pattern]) => {\n if (typeof val !== \"string\" || typeof pattern !== \"string\") {\n throw new ExprEvalError(\"matches() requires two strings\");\n }\n return new RegExp(pattern).test(val);\n },\n\n hours_between: ([start, end]) => {\n const s =\n start instanceof Date\n ? start.getTime()\n : typeof start === \"string\"\n ? new Date(start).getTime()\n : NaN;\n const e =\n end instanceof Date ? end.getTime() : typeof end === \"string\" ? new Date(end).getTime() : NaN;\n if (Number.isNaN(s) || Number.isNaN(e))\n throw new ExprEvalError(\"hours_between() requires valid dates\");\n return Math.floor((e - s) / (1000 * 60 * 60));\n },\n\n // --- Structural transforms ---\n\n merge: (args) => {\n const result: Record<string, unknown> = {};\n for (const arg of args) {\n if (arg == null || typeof arg !== \"object\" || Array.isArray(arg)) {\n throw new ExprEvalError(\"merge() requires plain objects\");\n }\n Object.assign(result, arg);\n }\n return result;\n },\n\n pick: (args) => {\n const [obj, ...fields] = args;\n if (obj == null || typeof obj !== \"object\" || Array.isArray(obj)) {\n throw new ExprEvalError(\"pick() requires a plain object as first argument\");\n }\n const result: Record<string, unknown> = {};\n for (const f of fields) {\n const key = String(f);\n if (key in (obj as Record<string, unknown>)) {\n result[key] = (obj as Record<string, unknown>)[key];\n }\n }\n return result;\n },\n\n omit: (args) => {\n const [obj, ...fields] = args;\n if (obj == null || typeof obj !== \"object\" || Array.isArray(obj)) {\n throw new ExprEvalError(\"omit() requires a plain object as first argument\");\n }\n const omitSet = new Set(fields.map(String));\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (!omitSet.has(key)) {\n result[key] = value;\n }\n }\n return result;\n },\n\n flatten: ([obj]) => {\n if (obj == null || typeof obj !== \"object\" || Array.isArray(obj)) {\n throw new ExprEvalError(\"flatten() requires a plain object\");\n }\n const result: Record<string, unknown> = {};\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (value != null && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, value);\n }\n }\n return result;\n },\n\n // 'if' is handled specially in evaluate() for short-circuit\n};\n\nfunction resolveField(data: Record<string, unknown>, path: string[]): unknown {\n if (path.length === 1 && path[0] === \"*\") return data;\n\n let current: unknown = data;\n for (const key of path) {\n if (current == null || typeof current !== \"object\") return null;\n current = (current as Record<string, unknown>)[key];\n }\n return current ?? null;\n}\n\n/**\n * Evaluate an AST node against a context.\n * Pure synchronous — no async, no IO.\n */\nexport function evaluateExpression(node: ASTNode, ctx: EvalContext, depth = 0): unknown {\n if (depth > MAX_DEPTH) {\n throw new ExprEvalError(`Maximum expression depth (${MAX_DEPTH}) exceeded`);\n }\n\n switch (node.type) {\n case \"NumberLiteral\":\n return node.value;\n case \"StringLiteral\":\n return node.value;\n case \"BooleanLiteral\":\n return node.value;\n case \"NullLiteral\":\n return null;\n\n case \"FieldRef\":\n return resolveField(ctx.data, node.path);\n\n case \"ParamRef\":\n return ctx.params?.[node.name] ?? null;\n\n case \"UnaryOp\": {\n const operand = evaluateExpression(node.operand, ctx, depth + 1);\n if (node.operator === \"-\") {\n if (typeof operand !== \"number\") throw new ExprEvalError(\"Unary minus requires a number\");\n return -operand;\n }\n if (node.operator === \"!\") return !operand;\n throw new ExprEvalError(`Unknown unary operator: ${node.operator}`);\n }\n\n case \"BinaryOp\":\n return evaluateBinaryOp(node.operator, node.left, node.right, ctx, depth);\n\n case \"FunctionCall\":\n return evaluateFunctionCall(node.name, node.args, ctx, depth);\n }\n}\n\nfunction evaluateBinaryOp(\n op: string,\n leftNode: ASTNode,\n rightNode: ASTNode,\n ctx: EvalContext,\n depth: number,\n): unknown {\n // Short-circuit for logical operators\n if (op === \"&&\") {\n const left = evaluateExpression(leftNode, ctx, depth + 1);\n if (!left) return left;\n return evaluateExpression(rightNode, ctx, depth + 1);\n }\n if (op === \"||\") {\n const left = evaluateExpression(leftNode, ctx, depth + 1);\n if (left) return left;\n return evaluateExpression(rightNode, ctx, depth + 1);\n }\n\n const left = evaluateExpression(leftNode, ctx, depth + 1);\n const right = evaluateExpression(rightNode, ctx, depth + 1);\n\n // Arithmetic\n if (op === \"+\") {\n if (typeof left === \"string\" || typeof right === \"string\") {\n return String(left ?? \"\") + String(right ?? \"\");\n }\n if (typeof left === \"number\" && typeof right === \"number\") return left + right;\n throw new ExprEvalError(`Cannot apply '+' to ${typeof left} and ${typeof right}`);\n }\n if (op === \"-\") {\n if (typeof left !== \"number\" || typeof right !== \"number\")\n throw new ExprEvalError(`Cannot apply '-' to ${typeof left} and ${typeof right}`);\n return left - right;\n }\n if (op === \"*\") {\n if (typeof left !== \"number\" || typeof right !== \"number\")\n throw new ExprEvalError(`Cannot apply '*' to ${typeof left} and ${typeof right}`);\n return left * right;\n }\n if (op === \"/\") {\n if (typeof left !== \"number\" || typeof right !== \"number\")\n throw new ExprEvalError(`Cannot apply '/' to ${typeof left} and ${typeof right}`);\n if (right === 0) throw new ExprEvalError(\"Division by zero\");\n return left / right;\n }\n\n // Comparison\n if (op === \"==\") return left === right;\n if (op === \"!=\") return left !== right;\n if (op === \"<\") return (left as number) < (right as number);\n if (op === \">\") return (left as number) > (right as number);\n if (op === \"<=\") return (left as number) <= (right as number);\n if (op === \">=\") return (left as number) >= (right as number);\n\n throw new ExprEvalError(`Unknown operator: ${op}`);\n}\n\nfunction evaluateFunctionCall(\n name: string,\n argNodes: ASTNode[],\n ctx: EvalContext,\n depth: number,\n): unknown {\n // Special: if() for short-circuit\n if (name === \"if\") {\n if (argNodes.length !== 3) throw new ExprEvalError(\"if() requires exactly 3 arguments\");\n const cond = evaluateExpression(argNodes[0]!, ctx, depth + 1);\n return cond\n ? evaluateExpression(argNodes[1]!, ctx, depth + 1)\n : evaluateExpression(argNodes[2]!, ctx, depth + 1);\n }\n\n const fn = BUILTINS[name];\n if (!fn) throw new ExprEvalError(`Unknown function: ${name}`);\n\n const args = argNodes.map((a) => evaluateExpression(a, ctx, depth + 1));\n return fn(args);\n}\n","/**\n * World Compute — Expression Parser\n *\n * Recursive descent parser for the expression DSL.\n * Produces an AST from expression strings like:\n * concat($.first, \" \", $.last)\n * $.price * $.quantity\n * if($.age < 18, \"minor\", \"adult\")\n */\n\nimport type { ASTNode } from \"./types.js\";\nimport { ParseError } from \"./types.js\";\n\nconst MAX_EXPRESSION_LENGTH = 4096;\nconst FORBIDDEN_FIELDS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n// --- Tokenizer ---\n\ntype TokenType =\n | \"number\"\n | \"string\"\n | \"ident\"\n | \"field_ref\" // $.xxx\n | \"param_ref\" // @xxx\n | \"op\"\n | \"lparen\"\n | \"rparen\"\n | \"comma\"\n | \"bang\"\n | \"eof\";\n\ninterface Token {\n type: TokenType;\n value: string;\n pos: number;\n}\n\nfunction charAt(s: string, i: number): string {\n return s.charAt(i);\n}\n\nfunction tokenize(expr: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expr.length) {\n const ch = charAt(expr, i);\n\n // Skip whitespace\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n\n const pos = i;\n\n // String literal\n if (ch === '\"') {\n i++;\n let s = \"\";\n while (i < expr.length && charAt(expr, i) !== '\"') {\n if (charAt(expr, i) === \"\\\\\" && i + 1 < expr.length) {\n const next = charAt(expr, i + 1);\n if (next === '\"') {\n s += '\"';\n i += 2;\n continue;\n }\n if (next === \"\\\\\") {\n s += \"\\\\\";\n i += 2;\n continue;\n }\n if (next === \"n\") {\n s += \"\\n\";\n i += 2;\n continue;\n }\n if (next === \"t\") {\n s += \"\\t\";\n i += 2;\n continue;\n }\n }\n s += charAt(expr, i);\n i++;\n }\n if (i >= expr.length) throw new ParseError(`Unterminated string at position ${pos}`);\n i++; // closing quote\n tokens.push({ type: \"string\", value: s, pos });\n continue;\n }\n\n // Field reference $. or $\n if (ch === \"$\") {\n if (i + 1 < expr.length && charAt(expr, i + 1) === \".\") {\n i += 2; // skip $.\n const parts: string[] = [];\n // Read first part (could be *)\n if (i < expr.length && charAt(expr, i) === \"*\") {\n parts.push(\"*\");\n i++;\n } else {\n let part = \"\";\n while (i < expr.length && /[a-zA-Z0-9_]/.test(charAt(expr, i))) {\n part += charAt(expr, i);\n i++;\n }\n if (part.length === 0)\n throw new ParseError(`Expected field name after $. at position ${pos}`);\n if (FORBIDDEN_FIELDS.has(part)) throw new ParseError(`Forbidden field name: ${part}`);\n parts.push(part);\n }\n // Read dot-separated parts\n while (\n i < expr.length &&\n charAt(expr, i) === \".\" &&\n i + 1 < expr.length &&\n /[a-zA-Z0-9_*]/.test(charAt(expr, i + 1))\n ) {\n i++; // skip dot\n if (charAt(expr, i) === \"*\") {\n parts.push(\"*\");\n i++;\n } else {\n let part = \"\";\n while (i < expr.length && /[a-zA-Z0-9_]/.test(charAt(expr, i))) {\n part += charAt(expr, i);\n i++;\n }\n if (FORBIDDEN_FIELDS.has(part)) throw new ParseError(`Forbidden field name: ${part}`);\n parts.push(part);\n }\n }\n tokens.push({ type: \"field_ref\", value: parts.join(\".\"), pos });\n continue;\n }\n // bare $ without dot\n throw new ParseError(`Expected '.' after '$' at position ${pos}`);\n }\n\n // Param reference @xxx\n if (ch === \"@\") {\n i++;\n let name = \"\";\n while (i < expr.length && /[a-zA-Z0-9_]/.test(charAt(expr, i))) {\n name += charAt(expr, i);\n i++;\n }\n if (name.length === 0)\n throw new ParseError(`Expected parameter name after '@' at position ${pos}`);\n tokens.push({ type: \"param_ref\", value: name, pos });\n continue;\n }\n\n // Number\n if (/[0-9]/.test(ch)) {\n let num = \"\";\n while (i < expr.length && /[0-9.]/.test(charAt(expr, i))) {\n num += charAt(expr, i);\n i++;\n }\n tokens.push({ type: \"number\", value: num, pos });\n continue;\n }\n\n // Identifier (function names, true, false, null)\n if (/[a-zA-Z_]/.test(ch)) {\n let id = \"\";\n while (i < expr.length && /[a-zA-Z0-9_]/.test(charAt(expr, i))) {\n id += charAt(expr, i);\n i++;\n }\n tokens.push({ type: \"ident\", value: id, pos });\n continue;\n }\n\n // Two-char operators\n if (i + 1 < expr.length) {\n const two = charAt(expr, i) + charAt(expr, i + 1);\n if ([\"==\", \"!=\", \"<=\", \">=\", \"&&\", \"||\"].includes(two)) {\n tokens.push({ type: \"op\", value: two, pos });\n i += 2;\n continue;\n }\n }\n\n // Single-char operators and punctuation\n if (\"+-*/<>\".includes(ch)) {\n tokens.push({ type: \"op\", value: ch, pos });\n i++;\n continue;\n }\n if (ch === \"(\") {\n tokens.push({ type: \"lparen\", value: \"(\", pos });\n i++;\n continue;\n }\n if (ch === \")\") {\n tokens.push({ type: \"rparen\", value: \")\", pos });\n i++;\n continue;\n }\n if (ch === \",\") {\n tokens.push({ type: \"comma\", value: \",\", pos });\n i++;\n continue;\n }\n if (ch === \"!\") {\n tokens.push({ type: \"bang\", value: \"!\", pos });\n i++;\n continue;\n }\n\n throw new ParseError(`Unexpected character '${ch}' at position ${i}`);\n }\n\n tokens.push({ type: \"eof\", value: \"\", pos: i });\n return tokens;\n}\n\n// --- Parser (Recursive Descent with Pratt-style precedence) ---\n\nconst EOF_TOKEN: Token = { type: \"eof\", value: \"\", pos: -1 };\n\nclass Parser {\n private tokens: Token[];\n private pos: number;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n this.pos = 0;\n }\n\n private peek(): Token {\n return this.tokens[this.pos] ?? EOF_TOKEN;\n }\n\n private advance(): Token {\n const t = this.tokens[this.pos] ?? EOF_TOKEN;\n this.pos++;\n return t;\n }\n\n private expect(type: TokenType, value?: string): Token {\n const t = this.peek();\n if (t.type !== type || (value !== undefined && t.value !== value)) {\n throw new ParseError(\n `Expected ${type}${value ? ` '${value}'` : \"\"} but got ${t.type} '${t.value}' at position ${t.pos}`,\n );\n }\n return this.advance();\n }\n\n parse(): ASTNode {\n const node = this.parseOr();\n if (this.peek().type !== \"eof\") {\n throw new ParseError(\n `Unexpected token '${this.peek().value}' at position ${this.peek().pos}`,\n );\n }\n return node;\n }\n\n private parseOr(): ASTNode {\n let left = this.parseAnd();\n while (this.peek().type === \"op\" && this.peek().value === \"||\") {\n const op = this.advance().value;\n const right = this.parseAnd();\n left = { type: \"BinaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n private parseAnd(): ASTNode {\n let left = this.parseComparison();\n while (this.peek().type === \"op\" && this.peek().value === \"&&\") {\n const op = this.advance().value;\n const right = this.parseComparison();\n left = { type: \"BinaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n private parseComparison(): ASTNode {\n let left = this.parseAddSub();\n while (\n this.peek().type === \"op\" &&\n [\"==\", \"!=\", \"<\", \">\", \"<=\", \">=\"].includes(this.peek().value)\n ) {\n const op = this.advance().value;\n const right = this.parseAddSub();\n left = { type: \"BinaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n private parseAddSub(): ASTNode {\n let left = this.parseMulDiv();\n while (this.peek().type === \"op\" && [\"+\", \"-\"].includes(this.peek().value)) {\n const op = this.advance().value;\n const right = this.parseMulDiv();\n left = { type: \"BinaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n private parseMulDiv(): ASTNode {\n let left = this.parseUnary();\n while (this.peek().type === \"op\" && [\"*\", \"/\"].includes(this.peek().value)) {\n const op = this.advance().value;\n const right = this.parseUnary();\n left = { type: \"BinaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n private parseUnary(): ASTNode {\n if (this.peek().type === \"op\" && this.peek().value === \"-\") {\n this.advance();\n const operand = this.parseUnary();\n return { type: \"UnaryOp\", operator: \"-\", operand };\n }\n if (this.peek().type === \"bang\") {\n this.advance();\n const operand = this.parseUnary();\n return { type: \"UnaryOp\", operator: \"!\", operand };\n }\n return this.parsePrimary();\n }\n\n private parsePrimary(): ASTNode {\n const t = this.peek();\n\n if (t.type === \"number\") {\n this.advance();\n return { type: \"NumberLiteral\", value: Number(t.value) };\n }\n\n if (t.type === \"string\") {\n this.advance();\n return { type: \"StringLiteral\", value: t.value };\n }\n\n if (t.type === \"field_ref\") {\n this.advance();\n return { type: \"FieldRef\", path: t.value.split(\".\") };\n }\n\n if (t.type === \"param_ref\") {\n this.advance();\n return { type: \"ParamRef\", name: t.value };\n }\n\n if (t.type === \"ident\") {\n this.advance();\n if (t.value === \"true\") return { type: \"BooleanLiteral\", value: true };\n if (t.value === \"false\") return { type: \"BooleanLiteral\", value: false };\n if (t.value === \"null\") return { type: \"NullLiteral\" };\n\n // Function call\n if (this.peek().type === \"lparen\") {\n this.advance(); // skip (\n const args: ASTNode[] = [];\n if (this.peek().type !== \"rparen\") {\n args.push(this.parseOr());\n while (this.peek().type === \"comma\") {\n this.advance(); // skip ,\n args.push(this.parseOr());\n }\n }\n this.expect(\"rparen\");\n return { type: \"FunctionCall\", name: t.value, args };\n }\n\n throw new ParseError(`Unexpected identifier '${t.value}' at position ${t.pos}`);\n }\n\n if (t.type === \"lparen\") {\n this.advance();\n const node = this.parseOr();\n this.expect(\"rparen\");\n return node;\n }\n\n throw new ParseError(`Unexpected token '${t.value}' at position ${t.pos}`);\n }\n}\n\n/**\n * Parse an expression string into an AST.\n */\nexport function parseExpression(expr: string): ASTNode {\n if (!expr || expr.trim().length === 0) {\n throw new ParseError(\"Empty expression\");\n }\n if (expr.length > MAX_EXPRESSION_LENGTH) {\n throw new ParseError(\n `Expression length ${expr.length} exceeds maximum ${MAX_EXPRESSION_LENGTH}`,\n );\n }\n const tokens = tokenize(expr.trim());\n const parser = new Parser(tokens);\n return parser.parse();\n}\n","/**\n * World Compute — Template Engine\n *\n * Simple {{ $.field }} interpolation for representation transforms.\n * Pure synchronous, no code execution.\n */\n\nexport class TemplateError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TemplateError\";\n }\n}\n\nfunction resolveField(data: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = data;\n for (const key of path) {\n if (current == null || typeof current !== \"object\") return null;\n current = (current as Record<string, unknown>)[key];\n }\n return current ?? null;\n}\n\n/**\n * Render a template string with {{ $.field }} interpolation.\n *\n * @param template - Template string with {{ $.field }} placeholders\n * @param data - Data object for field resolution\n * @returns Rendered string\n */\nexport function renderTemplate(template: string, data: Record<string, unknown>): string {\n let result = \"\";\n let i = 0;\n\n while (i < template.length) {\n // Look for {{\n if (template.charAt(i) === \"{\" && i + 1 < template.length && template.charAt(i + 1) === \"{\") {\n // Find closing }}\n const closeIdx = template.indexOf(\"}}\", i + 2);\n if (closeIdx === -1) {\n throw new TemplateError(\"Template error: unclosed {{ interpolation\");\n }\n\n // Extract expression between {{ and }}\n const expr = template.substring(i + 2, closeIdx).trim();\n\n // Parse $.field.path\n if (expr.startsWith(\"$.\")) {\n const path = expr.substring(2).split(\".\");\n const value = resolveField(data, path);\n result += value == null ? \"\" : String(value);\n } else {\n // Not a field ref, output as-is\n result += expr;\n }\n\n i = closeIdx + 2;\n } else {\n result += template.charAt(i);\n i++;\n }\n }\n\n return result;\n}\n","/**\n * WorldMappingCore — Reusable Library\n *\n * The shared core that all three usage levels consume:\n * - Level 1: Library (embedded in any provider)\n * - Level 2: WithWorldMapping (injectable interface)\n * - Level 3: WorldMappingModule (standalone AFSBaseProvider)\n */\n\nimport type { WorldBinding } from \"./binding/types.js\";\nimport type { CompiledKind, TrieMatch } from \"./compiler.js\";\nimport { WorldCompiler } from \"./compiler.js\";\nimport { evaluateExpression } from \"./compute/evaluator.js\";\nimport { parseExpression } from \"./compute/parser.js\";\nimport { renderTemplate } from \"./compute/template.js\";\nimport type { ASTNode } from \"./compute/types.js\";\nimport type { WorldSchema } from \"./schema/types.js\";\n\nexport class WorldMappingCore {\n readonly schema: WorldSchema;\n readonly binding: WorldBinding;\n private compiled;\n\n constructor(schema: WorldSchema | any, binding: WorldBinding) {\n this.schema = schema;\n this.binding = binding;\n const compiler = new WorldCompiler();\n this.compiled = compiler.compile(schema, binding);\n }\n\n /** Resolve a target world path to kind + params + isCollection */\n resolve(path: string): TrieMatch | null {\n return this.compiled.resolve(path);\n }\n\n /** Translate a TrieMatch to a source AFS path */\n translatePath(match: TrieMatch): string {\n const kindMeta = this.compiled.kinds[match.kind];\n const source = kindMeta?.source ?? this.binding.source;\n const kindMapping = this.binding.mappings?.[match.kind];\n\n let pathTemplate: string;\n if (kindMapping?.path) {\n pathTemplate = kindMapping.path;\n } else {\n // Use schema path\n const kindDef = (this.schema as any).kinds[match.kind];\n pathTemplate = kindDef?.path ?? \"\";\n }\n\n // Substitute params into template\n let resolved = pathTemplate;\n for (const [key, value] of Object.entries(match.params)) {\n resolved = resolved.replace(`{${key}}`, value);\n }\n\n // For collection paths, strip the key param placeholder if still present\n // e.g., /issues/{number} when isCollection → /issues\n if (match.isCollection) {\n // Remove trailing /{unresolved_param}\n resolved = resolved.replace(/\\/\\{[^}]+\\}$/, \"\");\n }\n\n // Combine source prefix + resolved path\n const combined = source + resolved;\n return combined.replace(/\\/+/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n }\n\n /** Project source fields → world fields (read direction) */\n projectFields(\n data: Record<string, unknown>,\n kindName: string,\n params?: Record<string, unknown>,\n ): Record<string, unknown> {\n const fieldMap = this.compiled.kinds[kindName]?.fieldMap;\n\n let result: Record<string, unknown>;\n if (!fieldMap || Object.keys(fieldMap).length === 0) {\n result = { ...data };\n } else {\n // Build reverse map: sourceField → worldField\n const reverseMap: Record<string, string> = {};\n for (const [worldField, sourceField] of Object.entries(fieldMap)) {\n reverseMap[sourceField] = worldField;\n }\n\n result = {};\n for (const [key, value] of Object.entries(data)) {\n if (reverseMap[key]) {\n result[reverseMap[key]] = value;\n } else {\n result[key] = value;\n }\n }\n }\n\n // Evaluate computed fields\n const kindDef = this.schema.kinds[kindName];\n if (kindDef?.computed) {\n for (const [fieldName, def] of Object.entries(kindDef.computed)) {\n try {\n const ast = this.getCompiledExpr(kindName, fieldName, def.expr);\n result[fieldName] = evaluateExpression(ast, { data: result, params });\n } catch {\n result[fieldName] = null;\n }\n }\n }\n\n return result;\n }\n\n /** Cache for parsed expressions */\n private exprCache = new Map<string, ASTNode>();\n\n private getCompiledExpr(kindName: string, fieldName: string, expr: string): ASTNode {\n const key = `${kindName}.${fieldName}`;\n let ast = this.exprCache.get(key);\n if (!ast) {\n ast = parseExpression(expr);\n this.exprCache.set(key, ast);\n }\n return ast;\n }\n\n /** Reverse project world fields → source fields (write direction) */\n reverseProjectFields(data: Record<string, unknown>, kindName: string): Record<string, unknown> {\n const fieldMap = this.compiled.kinds[kindName]?.fieldMap;\n const computedFields = this.schema.kinds[kindName]?.computed;\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n // Skip computed fields — they are read-only\n if (computedFields && key in computedFields) continue;\n\n if (fieldMap?.[key]) {\n result[fieldMap[key]] = value;\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n /** Get kind metadata */\n getKind(name: string): CompiledKind | undefined {\n return this.compiled.kinds[name];\n }\n\n /** List all kind names */\n getKindNames(): string[] {\n return Object.keys(this.compiled.kinds);\n }\n\n /** Validate data against kind's validation rules */\n validate(\n data: Record<string, unknown>,\n kindName: string,\n ): { valid: boolean; errors: Array<{ expr: string; error: string }> } {\n const kindDef = this.schema.kinds[kindName];\n if (!kindDef?.validate || kindDef.validate.length === 0) {\n return { valid: true, errors: [] };\n }\n\n const errors: Array<{ expr: string; error: string }> = [];\n for (const rule of kindDef.validate) {\n try {\n const ast = this.getCompiledExpr(kindName, `__validate_${rule.expr}`, rule.expr);\n const result = evaluateExpression(ast, { data });\n if (!result) {\n errors.push({ expr: rule.expr, error: rule.error });\n }\n } catch {\n errors.push({ expr: rule.expr, error: rule.error });\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n /** Render a representation of data for a kind in the given format */\n getRepresentation(\n data: Record<string, unknown>,\n kindName: string,\n format: string,\n ): string | null {\n const kindDef = this.schema.kinds[kindName];\n if (!kindDef?.represent) return null;\n\n const repr = kindDef.represent[format];\n if (!repr) return null;\n\n return renderTemplate(repr.template, data);\n }\n}\n","/**\n * WorldMappingModule — Standalone AFS Module (Level 3)\n *\n * A world mapping module that delegates CRUD operations to a source AFS\n * provider, transforming paths and field names according to the world schema\n * and binding configuration.\n *\n * Usage:\n * const module = new WorldMappingModule(schema, binding, sourceAfs);\n * afs.mount(module, \"/world/github\");\n *\n * The module resolves world paths (e.g., /owner/repo/issues/42) to source\n * paths (e.g., /modules/sqlite/issues/42) and projects fields bidirectionally.\n */\n\nimport type { WorldBinding } from \"./binding/types.js\";\nimport { WorldMappingCore } from \"./core.js\";\nimport type { WorldSchema } from \"./schema/types.js\";\n\n/** Source AFS interface — minimal interface for delegation */\nexport interface AFSSource {\n list(path: string, options?: unknown): Promise<{ list: unknown[]; total?: number }>;\n read(path: string, options?: unknown): Promise<unknown>;\n write?(path: string, content: unknown, options?: unknown): Promise<unknown>;\n delete?(path: string, options?: unknown): Promise<unknown>;\n}\n\n/** Options for WorldMappingModule */\nexport interface WorldMappingModuleOptions {\n schema: WorldSchema;\n binding: WorldBinding;\n source: AFSSource;\n}\n\nexport class WorldMappingModule {\n readonly name: string;\n readonly description: string;\n readonly core: WorldMappingCore;\n private source: AFSSource;\n\n constructor(options: WorldMappingModuleOptions) {\n this.core = new WorldMappingCore(options.schema, options.binding);\n this.source = options.source;\n this.name = `world-${(options.schema as any).world}`;\n this.description = `World mapping for ${(options.schema as any).world}`;\n }\n\n /** List entries at a world path */\n async list(path: string): Promise<{ list: unknown[]; total?: number }> {\n const match = this.core.resolve(path);\n if (!match) {\n return { list: [] };\n }\n\n const sourcePath = this.core.translatePath(match);\n const result = await this.source.list(sourcePath);\n\n // Project fields for each entry\n if (result.list && match.kind) {\n result.list = result.list.map((entry: any) => {\n if (entry && typeof entry === \"object\" && \"content\" in entry) {\n return {\n ...entry,\n content: this.core.projectFields(entry.content as Record<string, unknown>, match.kind),\n };\n }\n return entry;\n });\n }\n\n return result;\n }\n\n /** Read a single entry at a world path */\n async read(path: string): Promise<unknown> {\n const match = this.core.resolve(path);\n if (!match) {\n return undefined;\n }\n\n const sourcePath = this.core.translatePath(match);\n const result = await this.source.read(sourcePath);\n\n // Project fields\n if (result && typeof result === \"object\" && \"content\" in (result as any)) {\n const entry = result as any;\n return {\n ...entry,\n content: this.core.projectFields(entry.content as Record<string, unknown>, match.kind),\n };\n }\n\n return result;\n }\n\n /** Write an entry at a world path */\n async write(path: string, content: Record<string, unknown>): Promise<unknown> {\n if (!this.source.write) {\n throw new Error(\"Source AFS does not support write operations\");\n }\n\n const match = this.core.resolve(path);\n if (!match) {\n throw new Error(`Cannot resolve world path: ${path}`);\n }\n\n const sourcePath = this.core.translatePath(match);\n const sourceContent = this.core.reverseProjectFields(content, match.kind);\n return this.source.write(sourcePath, sourceContent);\n }\n\n /** Delete an entry at a world path */\n async delete(path: string): Promise<unknown> {\n if (!this.source.delete) {\n throw new Error(\"Source AFS does not support delete operations\");\n }\n\n const match = this.core.resolve(path);\n if (!match) {\n throw new Error(`Cannot resolve world path: ${path}`);\n }\n\n const sourcePath = this.core.translatePath(match);\n return this.source.delete(sourcePath);\n }\n\n /** Get kind names */\n getKindNames(): string[] {\n return this.core.getKindNames();\n }\n}\n","/**\n * WithWorldMapping — Standard Injectable Interface (Level 2)\n *\n * Any provider can implement this interface to accept World Mapping config\n * injection. This enables a standard way to extend providers with world\n * schema transformation capabilities.\n */\n\nimport type { WorldBinding } from \"./binding/types.js\";\nimport { WorldMappingCore } from \"./core.js\";\nimport type { WorldSchema } from \"./schema/types.js\";\n\n/** Configuration for injecting world mapping into a provider */\nexport interface WorldMappingConfig {\n schema: WorldSchema;\n binding: WorldBinding;\n}\n\n/** Status of an applied world mapping */\nexport interface WorldMappingStatus {\n schema: WorldSchema;\n binding: WorldBinding;\n kinds: string[];\n appliedAt: Date;\n}\n\n/** Interface that providers implement to accept world mapping injection */\nexport interface WithWorldMapping {\n applyWorldMapping(config: WorldMappingConfig): void;\n getWorldMapping(): WorldMappingStatus | null;\n}\n\n/** Type guard: check if an object supports world mapping injection */\nexport function isWithWorldMapping(obj: unknown): obj is WithWorldMapping {\n if (!obj || typeof obj !== \"object\") return false;\n const o = obj as Record<string, unknown>;\n return typeof o.applyWorldMapping === \"function\" && typeof o.getWorldMapping === \"function\";\n}\n\n/**\n * Helper for providers implementing WithWorldMapping.\n * Validates config, creates WorldMappingCore, returns the mapping state.\n * Throws if already applied or config is invalid.\n */\nexport function applyWorldMappingHelper(\n config: WorldMappingConfig,\n existing: { core: WorldMappingCore; status: WorldMappingStatus } | null,\n): { core: WorldMappingCore; status: WorldMappingStatus } {\n if (existing) {\n throw new Error(\"World mapping already applied. Each provider supports single injection only.\");\n }\n\n // WorldMappingCore constructor validates schema\n const core = new WorldMappingCore(config.schema, config.binding);\n\n const status: WorldMappingStatus = {\n schema: config.schema,\n binding: config.binding,\n kinds: core.getKindNames(),\n appliedAt: new Date(),\n };\n\n return { core, status };\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aigne/afs-world-mapping",
|
|
3
|
+
"version": "1.11.0-beta.6",
|
|
4
|
+
"description": "World Mapping DSL for AFS - maps external systems to World Objects via schema + backend binding",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"author": "Arcblock <blocklet@arcblock.io> https://github.com/arcblock",
|
|
10
|
+
"homepage": "https://github.com/arcblock/afs",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/arcblock/afs"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/arcblock/afs/issues"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"main": "./dist/index.cjs",
|
|
20
|
+
"module": "./dist/index.mjs",
|
|
21
|
+
"types": "./dist/index.d.cts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"require": "./dist/index.cjs",
|
|
25
|
+
"import": "./dist/index.mjs"
|
|
26
|
+
},
|
|
27
|
+
"./*": "./*"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"LICENSE",
|
|
32
|
+
"README.md",
|
|
33
|
+
"CHANGELOG.md"
|
|
34
|
+
],
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"yaml": "^2.8.2",
|
|
37
|
+
"zod": "^3.25.67",
|
|
38
|
+
"@aigne/afs": "1.11.0-beta.6"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/bun": "^1.3.6",
|
|
42
|
+
"npm-run-all": "^4.1.5",
|
|
43
|
+
"rimraf": "^6.1.2",
|
|
44
|
+
"tsdown": "0.20.0-beta.3",
|
|
45
|
+
"typescript": "5.9.2",
|
|
46
|
+
"@aigne/scripts": "0.0.0",
|
|
47
|
+
"@aigne/typescript-config": "0.0.0"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsdown",
|
|
51
|
+
"check-types": "tsc --noEmit",
|
|
52
|
+
"clean": "rimraf dist coverage",
|
|
53
|
+
"test": "bun test",
|
|
54
|
+
"test:coverage": "bun test --coverage --coverage-reporter=lcov --coverage-reporter=text"
|
|
55
|
+
}
|
|
56
|
+
}
|