elit 3.3.2 → 3.3.4
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/build.d.mts +1 -1
- package/dist/build.js +1 -0
- package/dist/build.js.map +1 -0
- package/dist/build.mjs +1 -0
- package/dist/build.mjs.map +1 -0
- package/dist/chokidar.js +1 -0
- package/dist/chokidar.js.map +1 -0
- package/dist/chokidar.mjs +1 -0
- package/dist/chokidar.mjs.map +1 -0
- package/dist/cli.js +4691 -34
- package/dist/config.d.mts +3 -1
- package/dist/config.d.ts +3 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -0
- package/dist/config.mjs +1 -0
- package/dist/config.mjs.map +1 -0
- package/dist/coverage.d.mts +85 -0
- package/dist/coverage.d.ts +76 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +1549 -0
- package/dist/coverage.js.map +1 -0
- package/dist/coverage.mjs +1520 -0
- package/dist/coverage.mjs.map +1 -0
- package/dist/database.d.mts +31 -6
- package/dist/database.d.ts +31 -6
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +60 -33
- package/dist/database.js.map +1 -0
- package/dist/database.mjs +60 -33
- package/dist/database.mjs.map +1 -0
- package/dist/dom.js +1 -0
- package/dist/dom.js.map +1 -0
- package/dist/dom.mjs +1 -0
- package/dist/dom.mjs.map +1 -0
- package/dist/el.js +1 -0
- package/dist/el.js.map +1 -0
- package/dist/el.mjs +1 -0
- package/dist/el.mjs.map +1 -0
- package/dist/fs.js +1 -0
- package/dist/fs.js.map +1 -0
- package/dist/fs.mjs +1 -0
- package/dist/fs.mjs.map +1 -0
- package/dist/hmr.js +1 -0
- package/dist/hmr.js.map +1 -0
- package/dist/hmr.mjs +1 -0
- package/dist/hmr.mjs.map +1 -0
- package/dist/http.js +1 -0
- package/dist/http.js.map +1 -0
- package/dist/http.mjs +1 -0
- package/dist/http.mjs.map +1 -0
- package/dist/https.d.mts +1 -1
- package/dist/https.js +1 -0
- package/dist/https.js.map +1 -0
- package/dist/https.mjs +1 -0
- package/dist/https.mjs.map +1 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mime-types.js +1 -0
- package/dist/mime-types.js.map +1 -0
- package/dist/mime-types.mjs +1 -0
- package/dist/mime-types.mjs.map +1 -0
- package/dist/path.js +1 -0
- package/dist/path.js.map +1 -0
- package/dist/path.mjs +1 -0
- package/dist/path.mjs.map +1 -0
- package/dist/router.js +1 -0
- package/dist/router.js.map +1 -0
- package/dist/router.mjs +1 -0
- package/dist/router.mjs.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/runtime.js.map +1 -0
- package/dist/runtime.mjs +1 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/{server-Cz3z-5ls.d.mts → server-BFTzgJpO.d.mts} +62 -1
- package/dist/{server-BG2CaVMh.d.ts → server-CIXtexNS.d.ts} +62 -1
- package/dist/server.d.mts +1 -1
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +12 -0
- package/dist/server.mjs.map +1 -0
- package/dist/state.d.mts +1 -1
- package/dist/state.js +1 -0
- package/dist/state.js.map +1 -0
- package/dist/state.mjs +1 -0
- package/dist/state.mjs.map +1 -0
- package/dist/style.js +1 -0
- package/dist/style.js.map +1 -0
- package/dist/style.mjs +1 -0
- package/dist/style.mjs.map +1 -0
- package/dist/test-globals.d.ts +184 -0
- package/dist/test-reporter.d.mts +77 -0
- package/dist/test-reporter.d.ts +73 -0
- package/dist/test-reporter.d.ts.map +1 -0
- package/dist/test-reporter.js +726 -0
- package/dist/test-reporter.js.map +1 -0
- package/dist/test-reporter.mjs +696 -0
- package/dist/test-reporter.mjs.map +1 -0
- package/dist/test-runtime.d.mts +122 -0
- package/dist/test-runtime.d.ts +120 -0
- package/dist/test-runtime.d.ts.map +1 -0
- package/dist/test-runtime.js +1292 -0
- package/dist/test-runtime.js.map +1 -0
- package/dist/test-runtime.mjs +1269 -0
- package/dist/test-runtime.mjs.map +1 -0
- package/dist/test.d.mts +39 -0
- package/dist/test.d.ts +38 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +4966 -0
- package/dist/test.js.map +1 -0
- package/dist/test.mjs +4944 -0
- package/dist/test.mjs.map +1 -0
- package/dist/types.d.mts +62 -1
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/types.mjs.map +1 -0
- package/dist/ws.js +1 -0
- package/dist/ws.js.map +1 -0
- package/dist/ws.mjs +1 -0
- package/dist/ws.mjs.map +1 -0
- package/dist/wss.js +1 -0
- package/dist/wss.js.map +1 -0
- package/dist/wss.mjs +1 -0
- package/dist/wss.mjs.map +1 -0
- package/package.json +37 -5
- package/src/cli.ts +169 -1
- package/src/config.ts +3 -1
- package/src/coverage.ts +1479 -0
- package/src/database.ts +71 -35
- package/src/server.ts +12 -0
- package/src/test-globals.d.ts +184 -0
- package/src/test-reporter.ts +609 -0
- package/src/test-runtime.ts +1359 -0
- package/src/test.ts +368 -0
- package/src/types.ts +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database.ts"],"sourcesContent":["import vm from \"node:vm\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { transformSync } from 'esbuild';\n\ninterface VMOptions {\n language?: 'ts' | 'js';\n registerModules?: { [key: string]: any };\n dir?: string;\n}\n\nclass VM {\n private transpiler: typeof transformSync;\n private ctx: vm.Context;\n private registerModules: { [key: string]: any };\n private DATABASE_DIR: string;\n private SCRIPTDB_DIR: string;\n private pkgScriptDB: { dependencies?: Record<string, string> } = {};\n private language: 'ts' | 'js';\n private _registerModules: { [key: string]: any };\n constructor(options?: VMOptions) {\n // Set directories based on options or defaults\n this.DATABASE_DIR = options?.dir || path.join(process.cwd(), 'databases');\n this.SCRIPTDB_DIR = process.cwd();\n\n // Ensure directories exist\n if (!fs.existsSync(this.DATABASE_DIR)) {\n fs.mkdirSync(this.DATABASE_DIR, { recursive: true });\n }\n if (!fs.existsSync(this.SCRIPTDB_DIR)) {\n fs.mkdirSync(this.SCRIPTDB_DIR, { recursive: true });\n }\n\n // Load scriptdb workspace package.json if it exists\n const pkgPath = path.join(this.SCRIPTDB_DIR, 'package.json');\n if (fs.existsSync(pkgPath)) {\n this.pkgScriptDB = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n }\n this.language = options?.language || 'ts';\n this.transpiler = transformSync;\n\n this.registerModules = options?.registerModules || {};\n this._registerModules = { ...this.registerModules };\n\n // Add require function to initial context for fallback path\n this._registerModules.require = ((moduleId: string) => this.createRequire(moduleId)).bind(this);\n\n this.ctx = vm.createContext(this._registerModules);\n\n\n }\n\n register(context: { [key: string]: any }) {\n this.registerModules = { ...this.registerModules, ...context };\n this._registerModules = { ...this._registerModules, ...context };\n // Always ensure our custom require function is present (with @db alias support)\n // Store the original require if it exists in context\n const originalRequire = context.require;\n this._registerModules.require = ((moduleId: string) => {\n // Try custom require first (handles @db aliases and database files)\n try {\n return this.createRequire(moduleId);\n } catch (e) {\n // Fall back to original require for node_modules\n if (originalRequire) {\n return originalRequire(moduleId);\n }\n throw e;\n }\n }).bind(this);\n // Update context with all modules including require\n this.ctx = vm.createContext(this._registerModules);\n }\n\n private createRequire(moduleId: string): any {\n // Validate moduleId\n if (!moduleId) {\n console.error('[createRequire] moduleId is undefined');\n return {};\n }\n\n console.log('[createRequire] Loading module:', moduleId, 'from DATABASE_DIR:', this.DATABASE_DIR);\n\n // Handle @db/ path alias\n if (moduleId.startsWith('@db/')) {\n const relativePath = moduleId.substring(4); // Remove '@db/'\n moduleId = './' + relativePath;\n console.log('[createRequire] Resolved @db/ alias to:', moduleId);\n }\n\n // Handle relative paths (e.g., './users')\n if (moduleId.startsWith('./') || moduleId.startsWith('../')) {\n const dbDir = this.DATABASE_DIR || process.cwd();\n const fullPath = path.join(dbDir, moduleId);\n\n console.log('[createRequire] Full path:', fullPath);\n\n // Try to find the file with an extension\n let actualPath: string | undefined = fullPath;\n if (fs.existsSync(fullPath)) {\n actualPath = fullPath;\n } else {\n const extensions = ['.ts', '.tsx', '.js', '.mjs'];\n for (const ext of extensions) {\n if (fs.existsSync(fullPath + ext)) {\n actualPath = fullPath + ext;\n break;\n }\n }\n }\n\n console.log('[createRequire] Actual path:', actualPath);\n\n if (!actualPath || !fs.existsSync(actualPath)) {\n console.log('[createRequire] File not found, throwing error');\n throw new Error(`Module '${moduleId}' not found at ${fullPath}`);\n }\n\n // For TypeScript files, read and transpile the content\n if (actualPath.endsWith('.ts') || actualPath.endsWith('.tsx')) {\n const content = fs.readFileSync(actualPath, 'utf8');\n const js = this.transpiler(content, { loader: 'ts', format: 'cjs' }).code;\n\n // Create a wrapper object to capture the final exports\n const moduleWrapper = { exports: {} };\n const originalModule = this._registerModules.module;\n const originalExports = this._registerModules.exports;\n\n this._registerModules.module = moduleWrapper;\n this._registerModules.exports = moduleWrapper.exports;\n\n try {\n vm.runInContext(js, this.ctx, { filename: actualPath });\n } finally {\n if (originalModule) {\n this._registerModules.module = originalModule;\n } else {\n delete this._registerModules.module;\n }\n if (originalExports) {\n this._registerModules.exports = originalExports;\n } else {\n delete this._registerModules.exports;\n }\n }\n\n console.log('[createRequire] Returning exports:', moduleWrapper.exports);\n return moduleWrapper.exports;\n }\n\n // For JS files, use standard require\n const result = require(actualPath);\n console.log('[createRequire] Returning (JS):', result);\n return result;\n }\n\n // For node_modules, use standard require\n return require(moduleId);\n }\n\n resolvePath(fileList: any[], query: string) {\n const aliases = { '@db': this.DATABASE_DIR };\n\n let resolvedPath = query;\n for (const [alias, target] of Object.entries(aliases)) {\n if (resolvedPath.startsWith(alias + '/')) {\n resolvedPath = resolvedPath.replace(alias, target);\n break;\n }\n }\n\n // Normalize path separators for cross-platform compatibility\n resolvedPath = path.normalize(resolvedPath);\n\n return fileList.find(file => {\n const normalizedFile = path.normalize(file);\n const fileWithoutExt = normalizedFile.replace(/\\.[^/.]+$/, \"\");\n return normalizedFile === resolvedPath ||\n fileWithoutExt === resolvedPath ||\n normalizedFile === resolvedPath + '.ts' ||\n normalizedFile === resolvedPath + '.js';\n });\n }\n\n async moduleLinker(specifier: any, referencingModule: any) {\n console.log('[moduleLinker] Loading specifier:', specifier, 'from DATABASE_DIR:', this.DATABASE_DIR);\n\n // Try database files first\n const dbFiles = fs.readdirSync(this.DATABASE_DIR)\n .filter(f => f.endsWith(\".ts\"))\n .map(f => path.join(this.DATABASE_DIR, f));\n\n console.log('[moduleLinker] Database files:', dbFiles);\n\n const dbResult = this.resolvePath(dbFiles, specifier);\n console.log('[moduleLinker] Resolved path:', dbResult);\n\n if (dbResult) {\n try {\n const actualModule = await import(dbResult);\n const exportNames = Object.keys(actualModule);\n return new vm.SyntheticModule(\n exportNames,\n function () {\n exportNames.forEach(key => {\n this.setExport(key, actualModule[key]);\n });\n },\n { identifier: specifier, context: referencingModule.context }\n );\n } catch (err) {\n console.error(`Failed to load database module ${specifier}:`, err);\n throw err;\n }\n }\n\n // Try workspace packages\n const allowedPackages = Object.keys(this.pkgScriptDB.dependencies || {});\n if (allowedPackages.includes(specifier)) {\n try {\n // Import from scriptdb workspace node_modules\n const modulePath = path.join(this.SCRIPTDB_DIR, 'node_modules', specifier);\n const actualModule = await import(modulePath);\n const exportNames = Object.keys(actualModule);\n return new vm.SyntheticModule(\n exportNames,\n function () {\n exportNames.forEach(key => {\n this.setExport(key, actualModule[key]);\n });\n },\n { identifier: specifier, context: referencingModule.context }\n );\n } catch (err) {\n console.error(`Failed to load workspace module ${specifier}:`, err);\n throw err;\n }\n }\n\n throw new Error(`Module ${specifier} is not allowed or not found.`);\n }\n\n async run(code: string) {\n const logs: any[] = [];\n\n const customConsole = ['log', 'error', 'warn', 'info', 'debug', 'trace'].reduce((acc: any, type: any) => {\n acc[type] = (...args: any[]) => logs.push({ type, args });\n return acc;\n }, {});\n\n this.register({\n console: customConsole\n });\n\n const systemModules = await SystemModuleResolver();\n this.register(systemModules);\n\n const js = this.transpiler(code, { loader: this.language, format: 'cjs' }).code;\n console.log('[run] Transpiled code:', js);\n\n // Try to use SourceTextModule if available (requires Node.js --experimental-vm-modules)\n try {\n const SourceTextModule = (vm as any).SourceTextModule;\n console.log('[run] SourceTextModule available:', typeof SourceTextModule === 'function');\n if (typeof SourceTextModule === 'function') {\n const mod = new SourceTextModule(js, { context: this.ctx, identifier: path.join(this.SCRIPTDB_DIR, 'virtual-entry.js') });\n await mod.link(this.moduleLinker.bind(this));\n await mod.evaluate();\n\n return {\n namespace: mod.namespace,\n logs: logs\n };\n }\n } catch (e) {\n console.log('[run] SourceTextModule failed, using fallback:', e);\n // SourceTextModule not available, fall through to alternative approach\n }\n\n // Fallback: Pre-process imports and use vm.runInContext\n let processedCode = js;\n\n console.log('[run] Original transpiled code:', processedCode);\n\n // esbuild converts: import { users } from './users'\n // to: var import_users = require(\"./users\");\n // and uses: import_users.users\n // But our module exports: exports.users = []\n // So we need to convert import_users.users -> import_users\n\n // First, convert static imports to require calls\n processedCode = processedCode.replace(\n /var\\s+(\\w+)\\s+=\\s+require\\((['\"])([^'\"]+)\\2\\);/g,\n (_match: string, varName: string, quote: string, modulePath: string) => {\n return `const ${varName} = require(${quote}${modulePath}${quote});`;\n }\n );\n\n // Convert any remaining static imports to require calls\n processedCode = processedCode.replace(\n /import\\s+\\{([^}]+)\\}\\s+from\\s+(['\"])([^'\"]+)\\2/g,\n (_match: string, imports: string, quote: string, modulePath: string) => {\n return `const { ${imports} } = require(${quote}${modulePath}${quote});`;\n }\n );\n\n processedCode = processedCode.replace(\n /import\\s+(\\w+)\\s+from\\s+(['\"])([^'\"]+)\\2/g,\n (_match: string, name: string, quote: string, modulePath: string) => {\n return `const ${name} = require(${quote}${modulePath}${quote});`;\n }\n );\n\n // Convert dynamic import() to require()\n processedCode = processedCode.replace(/import\\(([^)]+)\\)/g, 'require($1)');\n\n console.log('[run] Processed code:', processedCode);\n\n console.log('[run] Context has require:', typeof this._registerModules.require);\n console.log('[run] DATABASE_DIR:', this.DATABASE_DIR);\n\n try {\n const result = vm.runInContext(processedCode, this.ctx, {\n filename: path.join(this.SCRIPTDB_DIR, 'virtual-entry.js')\n });\n\n return {\n namespace: result,\n logs: logs\n };\n } catch (e) {\n console.log('[run] Error executing code:', e);\n throw e;\n }\n }\n}\n\nfunction create(dbName: string, code: string | Function, options?: VMOptions): void {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n // Prepare the export line\n fs.appendFileSync(dbPath, code.toString(), 'utf8');\n}\n\nfunction read(dbName: string, options?: VMOptions): string {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n\n if (!fs.existsSync(dbPath)) {\n throw new Error(`Database '${dbName}' not found`);\n }\n\n return fs.readFileSync(dbPath, 'utf8');\n}\n\nfunction remove(dbName: string, fnName: string, options?: VMOptions) {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n if (!fs.existsSync(dbPath)) return false;\n\n // if no functionName provided -> remove the whole file (after backup)\n if (!fnName) {\n const bak = `${dbPath}.bak`;\n try {\n fs.copyFileSync(dbPath, bak);\n } catch (e) {\n // ignore backup errors\n }\n try {\n fs.unlinkSync(dbPath);\n return \"Removed successfully\";\n } catch (e) {\n return \"Removed failed\";\n }\n }\n\n // create a backup before editing the file in-place\n const bak = `${dbPath}.bak`;\n try {\n fs.copyFileSync(dbPath, bak);\n } catch (e) {\n // ignore backup errors but continue carefully\n }\n\n let src = fs.readFileSync(dbPath, \"utf8\");\n const escaped = fnName.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n\n // regex to find a declaration of the named symbol (function, class, or var/const/let assignment)\n const startRe = new RegExp(\n `function\\\\s+${escaped}\\\\s*\\\\(|\\\\bclass\\\\s+${escaped}\\\\b|\\\\b(?:const|let|var)\\\\s+${escaped}\\\\s*=\\\\s*(?:function\\\\b|class\\\\b|\\\\(|\\\\{|\\\\[)`,\n \"m\"\n );\n\n const startMatch = src.match(startRe);\n\n if (startMatch) {\n const startIdx = startMatch.index;\n\n // find the first meaningful character after startIdx: {, [, or ; or newline\n const len = src.length;\n const idxCurly = src.indexOf(\"{\", startIdx);\n const idxBracket = src.indexOf(\"[\", startIdx);\n let braceOpen = -1;\n if (idxCurly === -1) braceOpen = idxBracket;\n else if (idxBracket === -1) braceOpen = idxCurly;\n else braceOpen = Math.min(idxCurly, idxBracket);\n\n if (braceOpen !== -1) {\n const openingChar = src[braceOpen];\n const closingChar = openingChar === \"[\" ? \"]\" : \"}\";\n let i = braceOpen + 1;\n let depth = 1;\n while (i < len && depth > 0) {\n const ch = src[i];\n if (ch === openingChar) depth++;\n else if (ch === closingChar) depth--;\n i++;\n }\n let braceClose = i;\n let endIdx = braceClose;\n if (src.slice(braceClose, braceClose + 1) === \";\")\n endIdx = braceClose + 1;\n\n const before = src.slice(0, startIdx);\n const after = src.slice(endIdx);\n src = before + after;\n } else {\n // fallback: remove until next semicolon or a blank line\n const semi = src.indexOf(\";\", startIdx);\n let endIdx = semi !== -1 ? semi + 1 : src.indexOf(\"\\n\\n\", startIdx);\n if (endIdx === -1) endIdx = len;\n src = src.slice(0, startIdx) + src.slice(endIdx);\n }\n }\n\n // remove any export const <name>: any = <name>; lines\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"g\"\n );\n src = src.replace(exportRe, \"\");\n\n // tidy up multiple blank lines\n src = src.replace(/\\n{3,}/g, \"\\n\\n\");\n\n fs.writeFileSync(dbPath, src, \"utf8\");\n\n return `Removed ${fnName} from database ${dbName}.`;\n}\n\nfunction rename(oldName: string, newName: string, options?: VMOptions): string {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const oldPath = path.join(DIR, `${oldName}.ts`);\n const newPath = path.join(DIR, `${newName}.ts`);\n\n // Check if the source file exists\n if (!fs.existsSync(oldPath)) {\n return `Error: File '${oldName}.ts' does not exist in the database`;\n }\n\n // Check if the destination file already exists\n if (fs.existsSync(newPath)) {\n return `Error: File '${newName}.ts' already exists in the database`;\n }\n\n try {\n // Rename the file\n fs.renameSync(oldPath, newPath);\n return `Successfully renamed '${oldName}.ts' to '${newName}.ts'`;\n } catch (error) {\n return `Error renaming file: ${error instanceof Error ? error.message : String(error)}`;\n }\n}\n\nfunction save(dbName: string, code: string | Function | any, options?: VMOptions): void {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n\n let fileContent = typeof code === 'function' ? code.toString() : code;\n\n fs.writeFileSync(dbPath, fileContent, 'utf8');\n}\n\nfunction update(dbName: string, fnName: string, code: string | Function, options?: VMOptions) {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n\n let src;\n\n if (!fs.existsSync(dbPath)) {\n // If dbPath doesn't exist, create an empty module file so we can insert into it.\n try {\n fs.writeFileSync(dbPath, \"\", \"utf8\");\n // console.log(\"Created new database file:\", dbPath);\n return `Created new database file: ${dbPath}`;\n } catch (e) {\n // console.error(\"Failed to create dbPath file:\", dbPath, e && e.message ? e.message : e);\n return `Failed to create dbPath file: ${dbPath}`;\n }\n }\n\n src = fs.readFileSync(dbPath, \"utf8\");\n\n const originalSrc = src;\n\n const escaped = fnName.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n const startRe = new RegExp(\n `function\\\\s+${escaped}\\\\s*\\\\(|\\\\bclass\\\\s+${escaped}\\\\b|\\\\b(?:const|let|var)\\\\s+${escaped}\\\\s*=\\\\s*(?:function\\\\b|class\\\\b|\\\\(|\\\\{|\\\\[)`,\n \"m\"\n );\n const startMatch = src.match(startRe);\n\n // determine declKind in the current file (if present)\n let declKind = null;\n\n if (startMatch) {\n let startIdx: any = startMatch.index;\n const snippet = src.slice(startIdx, startIdx + 80);\n if (/^function\\b/.test(snippet)) declKind = \"functionDecl\";\n else if (/^class\\b/.test(snippet)) declKind = \"classDecl\";\n else if (/^\\b(?:const|let|var)\\b/.test(snippet)) declKind = \"varAssign\";\n }\n\n // build replacement code for this value\n let newCode;\n if (typeof code === \"function\") {\n const fnStr = code.toString();\n // prefer const assignment for anonymous functions/classes or arrow functions\n if (declKind === \"functionDecl\") {\n if (/^function\\s+\\w+/.test(fnStr)) newCode = fnStr;\n else\n newCode = `function ${fnName}${fnStr.replace(\n /^function\\s*\\(/,\n \"(\"\n )}`;\n } else if (declKind === \"classDecl\") {\n if (/^class\\s+\\w+/.test(fnStr)) newCode = fnStr;\n else if (/^class\\s*\\{/.test(fnStr))\n newCode = fnStr.replace(/^class\\s*\\{/, `class ${fnName} {`);\n else newCode = `const ${fnName} = ${fnStr};`;\n } else {\n newCode = `const ${fnName} = ${fnStr};`;\n }\n } else {\n newCode = `const ${fnName} = ${valueToCode(code, 0)};`;\n }\n\n // replacement: if found startMatch, find block and replace between startIdx and endIdx\n if (startMatch) {\n const startIdx = startMatch.index;\n // find first '{' or '[' after startIdx\n const idxCurly = src.indexOf(\"{\", startIdx);\n const idxBracket = src.indexOf(\"[\", startIdx);\n let braceOpen = -1;\n if (idxCurly === -1) braceOpen = idxBracket;\n else if (idxBracket === -1) braceOpen = idxCurly;\n else braceOpen = Math.min(idxCurly, idxBracket);\n\n if (braceOpen === -1) {\n // no block — fallback: replace export or append\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"m\"\n );\n if (exportRe.test(src)) {\n src = src.replace(\n exportRe,\n `${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`\n );\n } else {\n src =\n src + `\\n\\n${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`;\n }\n } else {\n const openingChar = src[braceOpen];\n const closingChar = openingChar === \"[\" ? \"]\" : \"}\";\n let i = braceOpen + 1;\n let depth = 1;\n const len = src.length;\n while (i < len && depth > 0) {\n const ch = src[i];\n if (ch === openingChar) depth++;\n else if (ch === closingChar) depth--;\n i++;\n }\n let braceClose = i;\n let endIdx = braceClose;\n if (src.slice(braceClose, braceClose + 1) === \";\")\n endIdx = braceClose + 1;\n\n const before = src.slice(0, startIdx);\n const after = src.slice(endIdx);\n src = before + newCode + after;\n }\n } else {\n // not found — try to insert before existing export or append\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"m\"\n );\n if (exportRe.test(src)) {\n src = src.replace(\n exportRe,\n `${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`\n );\n } else {\n src =\n src + `\\n\\n${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`;\n }\n }\n\n fs.writeFileSync(dbPath, src, \"utf8\");\n\n if (src === originalSrc) {\n return `Saved ${fnName} to database ${dbName}.`;\n } else {\n return `Updated ${dbName} with ${fnName}.`;\n }\n}\n\nfunction valueToCode(val: any, depth: number = 0): string {\n const indentUnit = \" \";\n const indent = indentUnit.repeat(depth);\n const indentInner = indentUnit.repeat(depth + 1);\n\n if (val === null) return \"null\";\n const t = typeof val;\n if (t === \"string\") return JSON.stringify(val);\n if (t === \"number\" || t === \"boolean\") return String(val);\n if (t === \"function\") return val.toString();\n if (Array.isArray(val)) {\n if (val.length === 0) return \"[]\";\n const items = val.map((v) => valueToCode(v, depth + 1));\n return (\n \"[\\n\" +\n items.map((it) => indentInner + it).join(\",\\n\") +\n \"\\n\" +\n indent +\n \"]\"\n );\n }\n if (t === \"object\") {\n const keys = Object.keys(val);\n if (keys.length === 0) return \"{}\";\n const entries = keys.map((k) => {\n const keyPart = isIdentifier(k) ? k : JSON.stringify(k);\n const v = valueToCode(val[k], depth + 1);\n return indentInner + keyPart + \": \" + v;\n });\n return \"{\\n\" + entries.join(\",\\n\") + \"\\n\" + indent + \"}\";\n }\n return String(val);\n}\n\nfunction isIdentifier(key: any) {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n}\n\nasync function SystemModuleResolver() {\n\n const moduleRegistry = new Map<string, any>();\n\n moduleRegistry.set(\"update\", update);\n moduleRegistry.set(\"remove\", remove);\n moduleRegistry.set(\"create\", create);\n moduleRegistry.set(\"save\", save);\n moduleRegistry.set(\"read\", read);\n\n const context: Record<string, any> = {\n // Add require-like functionality\n require: (moduleName: string) => {\n const module = moduleRegistry.get(moduleName);\n if (!module) {\n throw new Error(`Module '${moduleName}' not found`);\n }\n // Return the default export if available, otherwise the module itself\n return module.default || module;\n },\n\n // Add import functionality (simulated)\n import: async (moduleName: string) => {\n const module = moduleRegistry.get(moduleName);\n if (!module) {\n throw new Error(`Module '${moduleName}' not found`);\n }\n return {\n default: module.default || module\n };\n }\n };\n\n for (const [name, moduleExports] of moduleRegistry) {\n context[name] = moduleExports.default || moduleExports;\n }\n\n return context;\n}\n\nexport class Database {\n private vm: VM;\n private options: VMOptions;\n\n constructor(options?: VMOptions) {\n this.options = {\n language: 'ts',\n registerModules: {},\n ...options\n };\n this.vm = new VM(this.options);\n }\n\n register(context: { [key: string]: any }) {\n this.vm.register(context);\n }\n\n async execute(code: string) {\n return await this.vm.run(code);\n }\n\n // ===== Database Helper Methods =====\n\n /**\n * Create a new database file with the given code\n */\n create(dbName: string, code: string | Function): void {\n return create(dbName, code, this.options);\n }\n\n /**\n * Read the contents of a database file\n */\n read(dbName: string): string {\n return read(dbName, this.options);\n }\n\n /**\n * Remove a function or the entire database file\n */\n remove(dbName: string, fnName?: string): string | boolean {\n return remove(dbName, fnName || \"\", this.options);\n }\n\n /**\n * Rename a database file\n */\n rename(oldName: string, newName: string): string {\n return rename(oldName, newName, this.options);\n }\n\n /**\n * Save code to a database file (overwrites existing content)\n */\n save(dbName: string, code: string | Function | any): void {\n return save(dbName, code, this.options);\n }\n\n /**\n * Update a function in a database file\n */\n update(dbName: string, fnName: string, code: string | Function): string {\n return update(dbName, fnName, code, this.options);\n }\n}\n\n// Export Database class and keep helper functions for backward compatibility\nexport { create, read, remove, rename, save, update };\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAe;AACf,qBAAe;AACf,uBAAiB;AACjB,qBAA8B;AAQ9B,IAAM,KAAN,MAAS;AAAA,EASL,YAAY,SAAqB;AAHjC,SAAQ,cAAyD,CAAC;AAK9D,SAAK,eAAe,SAAS,OAAO,iBAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AACxE,SAAK,eAAe,QAAQ,IAAI;AAGhC,QAAI,CAAC,eAAAC,QAAG,WAAW,KAAK,YAAY,GAAG;AACnC,qBAAAA,QAAG,UAAU,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IACvD;AACA,QAAI,CAAC,eAAAA,QAAG,WAAW,KAAK,YAAY,GAAG;AACnC,qBAAAA,QAAG,UAAU,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IACvD;AAGA,UAAM,UAAU,iBAAAD,QAAK,KAAK,KAAK,cAAc,cAAc;AAC3D,QAAI,eAAAC,QAAG,WAAW,OAAO,GAAG;AACxB,WAAK,cAAc,KAAK,MAAM,eAAAA,QAAG,aAAa,SAAS,MAAM,CAAC;AAAA,IAClE;AACA,SAAK,WAAW,SAAS,YAAY;AACrC,SAAK,aAAa;AAElB,SAAK,kBAAkB,SAAS,mBAAmB,CAAC;AACpD,SAAK,mBAAmB,EAAE,GAAG,KAAK,gBAAgB;AAGlD,SAAK,iBAAiB,WAAW,CAAC,aAAqB,KAAK,cAAc,QAAQ,GAAG,KAAK,IAAI;AAE9F,SAAK,MAAM,eAAAC,QAAG,cAAc,KAAK,gBAAgB;AAAA,EAGrD;AAAA,EAEA,SAAS,SAAiC;AACtC,SAAK,kBAAkB,EAAE,GAAG,KAAK,iBAAiB,GAAG,QAAQ;AAC7D,SAAK,mBAAmB,EAAE,GAAG,KAAK,kBAAkB,GAAG,QAAQ;AAG/D,UAAM,kBAAkB,QAAQ;AAChC,SAAK,iBAAiB,WAAW,CAAC,aAAqB;AAEnD,UAAI;AACA,eAAO,KAAK,cAAc,QAAQ;AAAA,MACtC,SAAS,GAAG;AAER,YAAI,iBAAiB;AACjB,iBAAO,gBAAgB,QAAQ;AAAA,QACnC;AACA,cAAM;AAAA,MACV;AAAA,IACJ,GAAG,KAAK,IAAI;AAEZ,SAAK,MAAM,eAAAA,QAAG,cAAc,KAAK,gBAAgB;AAAA,EACrD;AAAA,EAEQ,cAAc,UAAuB;AAEzC,QAAI,CAAC,UAAU;AACX,cAAQ,MAAM,uCAAuC;AACrD,aAAO,CAAC;AAAA,IACZ;AAEA,YAAQ,IAAI,mCAAmC,UAAU,sBAAsB,KAAK,YAAY;AAGhG,QAAI,SAAS,WAAW,MAAM,GAAG;AAC7B,YAAM,eAAe,SAAS,UAAU,CAAC;AACzC,iBAAW,OAAO;AAClB,cAAQ,IAAI,2CAA2C,QAAQ;AAAA,IACnE;AAGA,QAAI,SAAS,WAAW,IAAI,KAAK,SAAS,WAAW,KAAK,GAAG;AACzD,YAAM,QAAQ,KAAK,gBAAgB,QAAQ,IAAI;AAC/C,YAAM,WAAW,iBAAAF,QAAK,KAAK,OAAO,QAAQ;AAE1C,cAAQ,IAAI,8BAA8B,QAAQ;AAGlD,UAAI,aAAiC;AACrC,UAAI,eAAAC,QAAG,WAAW,QAAQ,GAAG;AACzB,qBAAa;AAAA,MACjB,OAAO;AACH,cAAM,aAAa,CAAC,OAAO,QAAQ,OAAO,MAAM;AAChD,mBAAW,OAAO,YAAY;AAC1B,cAAI,eAAAA,QAAG,WAAW,WAAW,GAAG,GAAG;AAC/B,yBAAa,WAAW;AACxB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,cAAQ,IAAI,gCAAgC,UAAU;AAEtD,UAAI,CAAC,cAAc,CAAC,eAAAA,QAAG,WAAW,UAAU,GAAG;AAC3C,gBAAQ,IAAI,gDAAgD;AAC5D,cAAM,IAAI,MAAM,WAAW,QAAQ,kBAAkB,QAAQ,EAAE;AAAA,MACnE;AAGA,UAAI,WAAW,SAAS,KAAK,KAAK,WAAW,SAAS,MAAM,GAAG;AAC3D,cAAM,UAAU,eAAAA,QAAG,aAAa,YAAY,MAAM;AAClD,cAAM,KAAK,KAAK,WAAW,SAAS,EAAE,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE;AAGrE,cAAM,gBAAgB,EAAE,SAAS,CAAC,EAAE;AACpC,cAAM,iBAAiB,KAAK,iBAAiB;AAC7C,cAAM,kBAAkB,KAAK,iBAAiB;AAE9C,aAAK,iBAAiB,SAAS;AAC/B,aAAK,iBAAiB,UAAU,cAAc;AAE9C,YAAI;AACA,yBAAAC,QAAG,aAAa,IAAI,KAAK,KAAK,EAAE,UAAU,WAAW,CAAC;AAAA,QAC1D,UAAE;AACE,cAAI,gBAAgB;AAChB,iBAAK,iBAAiB,SAAS;AAAA,UACnC,OAAO;AACH,mBAAO,KAAK,iBAAiB;AAAA,UACjC;AACA,cAAI,iBAAiB;AACjB,iBAAK,iBAAiB,UAAU;AAAA,UACpC,OAAO;AACH,mBAAO,KAAK,iBAAiB;AAAA,UACjC;AAAA,QACJ;AAEA,gBAAQ,IAAI,sCAAsC,cAAc,OAAO;AACvE,eAAO,cAAc;AAAA,MACzB;AAGA,YAAM,SAAS,QAAQ,UAAU;AACjC,cAAQ,IAAI,mCAAmC,MAAM;AACrD,aAAO;AAAA,IACX;AAGA,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,YAAY,UAAiB,OAAe;AACxC,UAAM,UAAU,EAAE,OAAO,KAAK,aAAa;AAE3C,QAAI,eAAe;AACnB,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAI,aAAa,WAAW,QAAQ,GAAG,GAAG;AACtC,uBAAe,aAAa,QAAQ,OAAO,MAAM;AACjD;AAAA,MACJ;AAAA,IACJ;AAGA,mBAAe,iBAAAF,QAAK,UAAU,YAAY;AAE1C,WAAO,SAAS,KAAK,UAAQ;AACzB,YAAM,iBAAiB,iBAAAA,QAAK,UAAU,IAAI;AAC1C,YAAM,iBAAiB,eAAe,QAAQ,aAAa,EAAE;AAC7D,aAAO,mBAAmB,gBACtB,mBAAmB,gBACnB,mBAAmB,eAAe,SAClC,mBAAmB,eAAe;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,aAAa,WAAgB,mBAAwB;AACvD,YAAQ,IAAI,qCAAqC,WAAW,sBAAsB,KAAK,YAAY;AAGnG,UAAM,UAAU,eAAAC,QAAG,YAAY,KAAK,YAAY,EAC3C,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,EAC7B,IAAI,OAAK,iBAAAD,QAAK,KAAK,KAAK,cAAc,CAAC,CAAC;AAE7C,YAAQ,IAAI,kCAAkC,OAAO;AAErD,UAAM,WAAW,KAAK,YAAY,SAAS,SAAS;AACpD,YAAQ,IAAI,iCAAiC,QAAQ;AAErD,QAAI,UAAU;AACV,UAAI;AACA,cAAM,eAAe,MAAM,OAAO;AAClC,cAAM,cAAc,OAAO,KAAK,YAAY;AAC5C,eAAO,IAAI,eAAAE,QAAG;AAAA,UACV;AAAA,UACA,WAAY;AACR,wBAAY,QAAQ,SAAO;AACvB,mBAAK,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,YACzC,CAAC;AAAA,UACL;AAAA,UACA,EAAE,YAAY,WAAW,SAAS,kBAAkB,QAAQ;AAAA,QAChE;AAAA,MACJ,SAAS,KAAK;AACV,gBAAQ,MAAM,kCAAkC,SAAS,KAAK,GAAG;AACjE,cAAM;AAAA,MACV;AAAA,IACJ;AAGA,UAAM,kBAAkB,OAAO,KAAK,KAAK,YAAY,gBAAgB,CAAC,CAAC;AACvE,QAAI,gBAAgB,SAAS,SAAS,GAAG;AACrC,UAAI;AAEA,cAAM,aAAa,iBAAAF,QAAK,KAAK,KAAK,cAAc,gBAAgB,SAAS;AACzE,cAAM,eAAe,MAAM,OAAO;AAClC,cAAM,cAAc,OAAO,KAAK,YAAY;AAC5C,eAAO,IAAI,eAAAE,QAAG;AAAA,UACV;AAAA,UACA,WAAY;AACR,wBAAY,QAAQ,SAAO;AACvB,mBAAK,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,YACzC,CAAC;AAAA,UACL;AAAA,UACA,EAAE,YAAY,WAAW,SAAS,kBAAkB,QAAQ;AAAA,QAChE;AAAA,MACJ,SAAS,KAAK;AACV,gBAAQ,MAAM,mCAAmC,SAAS,KAAK,GAAG;AAClE,cAAM;AAAA,MACV;AAAA,IACJ;AAEA,UAAM,IAAI,MAAM,UAAU,SAAS,+BAA+B;AAAA,EACtE;AAAA,EAEA,MAAM,IAAI,MAAc;AACpB,UAAM,OAAc,CAAC;AAErB,UAAM,gBAAgB,CAAC,OAAO,SAAS,QAAQ,QAAQ,SAAS,OAAO,EAAE,OAAO,CAAC,KAAU,SAAc;AACrG,UAAI,IAAI,IAAI,IAAI,SAAgB,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AACxD,aAAO;AAAA,IACX,GAAG,CAAC,CAAC;AAEL,SAAK,SAAS;AAAA,MACV,SAAS;AAAA,IACb,CAAC;AAED,UAAM,gBAAgB,MAAM,qBAAqB;AACjD,SAAK,SAAS,aAAa;AAE3B,UAAM,KAAK,KAAK,WAAW,MAAM,EAAE,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAC3E,YAAQ,IAAI,0BAA0B,EAAE;AAGxC,QAAI;AACA,YAAM,mBAAoB,eAAAA,QAAW;AACrC,cAAQ,IAAI,qCAAqC,OAAO,qBAAqB,UAAU;AACvF,UAAI,OAAO,qBAAqB,YAAY;AACxC,cAAM,MAAM,IAAI,iBAAiB,IAAI,EAAE,SAAS,KAAK,KAAK,YAAY,iBAAAF,QAAK,KAAK,KAAK,cAAc,kBAAkB,EAAE,CAAC;AACxH,cAAM,IAAI,KAAK,KAAK,aAAa,KAAK,IAAI,CAAC;AAC3C,cAAM,IAAI,SAAS;AAEnB,eAAO;AAAA,UACH,WAAW,IAAI;AAAA,UACf;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,GAAG;AACR,cAAQ,IAAI,kDAAkD,CAAC;AAAA,IAEnE;AAGA,QAAI,gBAAgB;AAEpB,YAAQ,IAAI,mCAAmC,aAAa;AAS5D,oBAAgB,cAAc;AAAA,MAC1B;AAAA,MACA,CAAC,QAAgB,SAAiB,OAAe,eAAuB;AACpE,eAAO,SAAS,OAAO,cAAc,KAAK,GAAG,UAAU,GAAG,KAAK;AAAA,MACnE;AAAA,IACJ;AAGA,oBAAgB,cAAc;AAAA,MAC1B;AAAA,MACA,CAAC,QAAgB,SAAiB,OAAe,eAAuB;AACpE,eAAO,WAAW,OAAO,gBAAgB,KAAK,GAAG,UAAU,GAAG,KAAK;AAAA,MACvE;AAAA,IACJ;AAEA,oBAAgB,cAAc;AAAA,MAC1B;AAAA,MACA,CAAC,QAAgB,MAAc,OAAe,eAAuB;AACjE,eAAO,SAAS,IAAI,cAAc,KAAK,GAAG,UAAU,GAAG,KAAK;AAAA,MAChE;AAAA,IACJ;AAGA,oBAAgB,cAAc,QAAQ,sBAAsB,aAAa;AAEzE,YAAQ,IAAI,yBAAyB,aAAa;AAElD,YAAQ,IAAI,8BAA8B,OAAO,KAAK,iBAAiB,OAAO;AAC9E,YAAQ,IAAI,uBAAuB,KAAK,YAAY;AAEpD,QAAI;AACA,YAAM,SAAS,eAAAE,QAAG,aAAa,eAAe,KAAK,KAAK;AAAA,QACpD,UAAU,iBAAAF,QAAK,KAAK,KAAK,cAAc,kBAAkB;AAAA,MAC7D,CAAC;AAED,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,MACJ;AAAA,IACJ,SAAS,GAAG;AACR,cAAQ,IAAI,+BAA+B,CAAC;AAC5C,YAAM;AAAA,IACV;AAAA,EACJ;AACJ;AAEA,SAAS,OAAO,QAAgB,MAAyB,SAA2B;AAChF,QAAM,MAAM,SAAS,OAAO,iBAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AAChE,QAAM,SAAS,iBAAAA,QAAK,KAAK,KAAK,GAAG,MAAM,KAAK;AAE5C,iBAAAC,QAAG,eAAe,QAAQ,KAAK,SAAS,GAAG,MAAM;AACrD;AAEA,SAAS,KAAK,QAAgB,SAA6B;AACvD,QAAM,MAAM,SAAS,OAAO,iBAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AAChE,QAAM,SAAS,iBAAAA,QAAK,KAAK,KAAK,GAAG,MAAM,KAAK;AAE5C,MAAI,CAAC,eAAAC,QAAG,WAAW,MAAM,GAAG;AACxB,UAAM,IAAI,MAAM,aAAa,MAAM,aAAa;AAAA,EACpD;AAEA,SAAO,eAAAA,QAAG,aAAa,QAAQ,MAAM;AACzC;AAEA,SAAS,OAAO,QAAgB,QAAgB,SAAqB;AACjE,QAAM,MAAM,SAAS,OAAO,iBAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AAChE,QAAM,SAAS,iBAAAA,QAAK,KAAK,KAAK,GAAG,MAAM,KAAK;AAC5C,MAAI,CAAC,eAAAC,QAAG,WAAW,MAAM,EAAG,QAAO;AAGnC,MAAI,CAAC,QAAQ;AACT,UAAME,OAAM,GAAG,MAAM;AACrB,QAAI;AACA,qBAAAF,QAAG,aAAa,QAAQE,IAAG;AAAA,IAC/B,SAAS,GAAG;AAAA,IAEZ;AACA,QAAI;AACA,qBAAAF,QAAG,WAAW,MAAM;AACpB,aAAO;AAAA,IACX,SAAS,GAAG;AACR,aAAO;AAAA,IACX;AAAA,EACJ;AAGA,QAAM,MAAM,GAAG,MAAM;AACrB,MAAI;AACA,mBAAAA,QAAG,aAAa,QAAQ,GAAG;AAAA,EAC/B,SAAS,GAAG;AAAA,EAEZ;AAEA,MAAI,MAAM,eAAAA,QAAG,aAAa,QAAQ,MAAM;AACxC,QAAM,UAAU,OAAO,QAAQ,yBAAyB,MAAM;AAG9D,QAAM,UAAU,IAAI;AAAA,IAChB,eAAe,OAAO,uBAAuB,OAAO,+BAA+B,OAAO;AAAA,IAC1F;AAAA,EACJ;AAEA,QAAM,aAAa,IAAI,MAAM,OAAO;AAEpC,MAAI,YAAY;AACZ,UAAM,WAAW,WAAW;AAG5B,UAAM,MAAM,IAAI;AAChB,UAAM,WAAW,IAAI,QAAQ,KAAK,QAAQ;AAC1C,UAAM,aAAa,IAAI,QAAQ,KAAK,QAAQ;AAC5C,QAAI,YAAY;AAChB,QAAI,aAAa,GAAI,aAAY;AAAA,aACxB,eAAe,GAAI,aAAY;AAAA,QACnC,aAAY,KAAK,IAAI,UAAU,UAAU;AAE9C,QAAI,cAAc,IAAI;AAClB,YAAM,cAAc,IAAI,SAAS;AACjC,YAAM,cAAc,gBAAgB,MAAM,MAAM;AAChD,UAAI,IAAI,YAAY;AACpB,UAAI,QAAQ;AACZ,aAAO,IAAI,OAAO,QAAQ,GAAG;AACzB,cAAM,KAAK,IAAI,CAAC;AAChB,YAAI,OAAO,YAAa;AAAA,iBACf,OAAO,YAAa;AAC7B;AAAA,MACJ;AACA,UAAI,aAAa;AACjB,UAAI,SAAS;AACb,UAAI,IAAI,MAAM,YAAY,aAAa,CAAC,MAAM;AAC1C,iBAAS,aAAa;AAE1B,YAAM,SAAS,IAAI,MAAM,GAAG,QAAQ;AACpC,YAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,YAAM,SAAS;AAAA,IACnB,OAAO;AAEH,YAAM,OAAO,IAAI,QAAQ,KAAK,QAAQ;AACtC,UAAI,SAAS,SAAS,KAAK,OAAO,IAAI,IAAI,QAAQ,QAAQ,QAAQ;AAClE,UAAI,WAAW,GAAI,UAAS;AAC5B,YAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,IAAI,MAAM,MAAM;AAAA,IACnD;AAAA,EACJ;AAGA,QAAM,WAAW,IAAI;AAAA,IACjB,sBAAsB,OAAO,wBAAwB,OAAO;AAAA,IAC5D;AAAA,EACJ;AACA,QAAM,IAAI,QAAQ,UAAU,EAAE;AAG9B,QAAM,IAAI,QAAQ,WAAW,MAAM;AAEnC,iBAAAA,QAAG,cAAc,QAAQ,KAAK,MAAM;AAEpC,SAAO,WAAW,MAAM,kBAAkB,MAAM;AACpD;AAEA,SAAS,OAAO,SAAiB,SAAiB,SAA6B;AAC3E,QAAM,MAAM,SAAS,OAAO,iBAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AAChE,QAAM,UAAU,iBAAAA,QAAK,KAAK,KAAK,GAAG,OAAO,KAAK;AAC9C,QAAM,UAAU,iBAAAA,QAAK,KAAK,KAAK,GAAG,OAAO,KAAK;AAG9C,MAAI,CAAC,eAAAC,QAAG,WAAW,OAAO,GAAG;AACzB,WAAO,gBAAgB,OAAO;AAAA,EAClC;AAGA,MAAI,eAAAA,QAAG,WAAW,OAAO,GAAG;AACxB,WAAO,gBAAgB,OAAO;AAAA,EAClC;AAEA,MAAI;AAEA,mBAAAA,QAAG,WAAW,SAAS,OAAO;AAC9B,WAAO,yBAAyB,OAAO,YAAY,OAAO;AAAA,EAC9D,SAAS,OAAO;AACZ,WAAO,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,EACzF;AACJ;AAEA,SAAS,KAAK,QAAgB,MAA+B,SAA2B;AACpF,QAAM,MAAM,SAAS,OAAO,iBAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AAChE,QAAM,SAAS,iBAAAA,QAAK,KAAK,KAAK,GAAG,MAAM,KAAK;AAE5C,MAAI,cAAc,OAAO,SAAS,aAAa,KAAK,SAAS,IAAI;AAEjE,iBAAAC,QAAG,cAAc,QAAQ,aAAa,MAAM;AAChD;AAEA,SAAS,OAAO,QAAgB,QAAgB,MAAyB,SAAqB;AAC1F,QAAM,MAAM,SAAS,OAAO,iBAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AAChE,QAAM,SAAS,iBAAAA,QAAK,KAAK,KAAK,GAAG,MAAM,KAAK;AAE5C,MAAI;AAEJ,MAAI,CAAC,eAAAC,QAAG,WAAW,MAAM,GAAG;AAExB,QAAI;AACA,qBAAAA,QAAG,cAAc,QAAQ,IAAI,MAAM;AAEnC,aAAO,8BAA8B,MAAM;AAAA,IAC/C,SAAS,GAAG;AAER,aAAO,iCAAiC,MAAM;AAAA,IAClD;AAAA,EACJ;AAEA,QAAM,eAAAA,QAAG,aAAa,QAAQ,MAAM;AAEpC,QAAM,cAAc;AAEpB,QAAM,UAAU,OAAO,QAAQ,yBAAyB,MAAM;AAC9D,QAAM,UAAU,IAAI;AAAA,IAChB,eAAe,OAAO,uBAAuB,OAAO,+BAA+B,OAAO;AAAA,IAC1F;AAAA,EACJ;AACA,QAAM,aAAa,IAAI,MAAM,OAAO;AAGpC,MAAI,WAAW;AAEf,MAAI,YAAY;AACZ,QAAI,WAAgB,WAAW;AAC/B,UAAM,UAAU,IAAI,MAAM,UAAU,WAAW,EAAE;AACjD,QAAI,cAAc,KAAK,OAAO,EAAG,YAAW;AAAA,aACnC,WAAW,KAAK,OAAO,EAAG,YAAW;AAAA,aACrC,yBAAyB,KAAK,OAAO,EAAG,YAAW;AAAA,EAChE;AAGA,MAAI;AACJ,MAAI,OAAO,SAAS,YAAY;AAC5B,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI,aAAa,gBAAgB;AAC7B,UAAI,kBAAkB,KAAK,KAAK,EAAG,WAAU;AAAA;AAEzC,kBAAU,YAAY,MAAM,GAAG,MAAM;AAAA,UACjC;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,IACT,WAAW,aAAa,aAAa;AACjC,UAAI,eAAe,KAAK,KAAK,EAAG,WAAU;AAAA,eACjC,cAAc,KAAK,KAAK;AAC7B,kBAAU,MAAM,QAAQ,eAAe,SAAS,MAAM,IAAI;AAAA,UACzD,WAAU,SAAS,MAAM,MAAM,KAAK;AAAA,IAC7C,OAAO;AACH,gBAAU,SAAS,MAAM,MAAM,KAAK;AAAA,IACxC;AAAA,EACJ,OAAO;AACH,cAAU,SAAS,MAAM,MAAM,YAAY,MAAM,CAAC,CAAC;AAAA,EACvD;AAGA,MAAI,YAAY;AACZ,UAAM,WAAW,WAAW;AAE5B,UAAM,WAAW,IAAI,QAAQ,KAAK,QAAQ;AAC1C,UAAM,aAAa,IAAI,QAAQ,KAAK,QAAQ;AAC5C,QAAI,YAAY;AAChB,QAAI,aAAa,GAAI,aAAY;AAAA,aACxB,eAAe,GAAI,aAAY;AAAA,QACnC,aAAY,KAAK,IAAI,UAAU,UAAU;AAE9C,QAAI,cAAc,IAAI;AAElB,YAAM,WAAW,IAAI;AAAA,QACjB,sBAAsB,OAAO,wBAAwB,OAAO;AAAA,QAC5D;AAAA,MACJ;AACA,UAAI,SAAS,KAAK,GAAG,GAAG;AACpB,cAAM,IAAI;AAAA,UACN;AAAA,UACA,GAAG,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,QACzD;AAAA,MACJ,OAAO;AACH,cACI,MAAM;AAAA;AAAA,EAAO,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,MACvE;AAAA,IACJ,OAAO;AACH,YAAM,cAAc,IAAI,SAAS;AACjC,YAAM,cAAc,gBAAgB,MAAM,MAAM;AAChD,UAAI,IAAI,YAAY;AACpB,UAAI,QAAQ;AACZ,YAAM,MAAM,IAAI;AAChB,aAAO,IAAI,OAAO,QAAQ,GAAG;AACzB,cAAM,KAAK,IAAI,CAAC;AAChB,YAAI,OAAO,YAAa;AAAA,iBACf,OAAO,YAAa;AAC7B;AAAA,MACJ;AACA,UAAI,aAAa;AACjB,UAAI,SAAS;AACb,UAAI,IAAI,MAAM,YAAY,aAAa,CAAC,MAAM;AAC1C,iBAAS,aAAa;AAE1B,YAAM,SAAS,IAAI,MAAM,GAAG,QAAQ;AACpC,YAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,YAAM,SAAS,UAAU;AAAA,IAC7B;AAAA,EACJ,OAAO;AAEH,UAAM,WAAW,IAAI;AAAA,MACjB,sBAAsB,OAAO,wBAAwB,OAAO;AAAA,MAC5D;AAAA,IACJ;AACA,QAAI,SAAS,KAAK,GAAG,GAAG;AACpB,YAAM,IAAI;AAAA,QACN;AAAA,QACA,GAAG,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,MACzD;AAAA,IACJ,OAAO;AACH,YACI,MAAM;AAAA;AAAA,EAAO,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,IACvE;AAAA,EACJ;AAEA,iBAAAA,QAAG,cAAc,QAAQ,KAAK,MAAM;AAEpC,MAAI,QAAQ,aAAa;AACrB,WAAO,SAAS,MAAM,gBAAgB,MAAM;AAAA,EAChD,OAAO;AACH,WAAO,WAAW,MAAM,SAAS,MAAM;AAAA,EAC3C;AACJ;AAEA,SAAS,YAAY,KAAU,QAAgB,GAAW;AACtD,QAAM,aAAa;AACnB,QAAM,SAAS,WAAW,OAAO,KAAK;AACtC,QAAM,cAAc,WAAW,OAAO,QAAQ,CAAC;AAE/C,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,IAAI,OAAO;AACjB,MAAI,MAAM,SAAU,QAAO,KAAK,UAAU,GAAG;AAC7C,MAAI,MAAM,YAAY,MAAM,UAAW,QAAO,OAAO,GAAG;AACxD,MAAI,MAAM,WAAY,QAAO,IAAI,SAAS;AAC1C,MAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,UAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC;AACtD,WACI,QACA,MAAM,IAAI,CAAC,OAAO,cAAc,EAAE,EAAE,KAAK,KAAK,IAC9C,OACA,SACA;AAAA,EAER;AACA,MAAI,MAAM,UAAU;AAChB,UAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,UAAU,KAAK,IAAI,CAAC,MAAM;AAC5B,YAAM,UAAU,aAAa,CAAC,IAAI,IAAI,KAAK,UAAU,CAAC;AACtD,YAAM,IAAI,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC;AACvC,aAAO,cAAc,UAAU,OAAO;AAAA,IAC1C,CAAC;AACD,WAAO,QAAQ,QAAQ,KAAK,KAAK,IAAI,OAAO,SAAS;AAAA,EACzD;AACA,SAAO,OAAO,GAAG;AACrB;AAEA,SAAS,aAAa,KAAU;AAC5B,SAAO,6BAA6B,KAAK,GAAG;AAChD;AAEA,eAAe,uBAAuB;AAElC,QAAM,iBAAiB,oBAAI,IAAiB;AAE5C,iBAAe,IAAI,UAAU,MAAM;AACnC,iBAAe,IAAI,UAAU,MAAM;AACnC,iBAAe,IAAI,UAAU,MAAM;AACnC,iBAAe,IAAI,QAAQ,IAAI;AAC/B,iBAAe,IAAI,QAAQ,IAAI;AAE/B,QAAM,UAA+B;AAAA;AAAA,IAEjC,SAAS,CAAC,eAAuB;AAC7B,YAAMG,UAAS,eAAe,IAAI,UAAU;AAC5C,UAAI,CAACA,SAAQ;AACT,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AAEA,aAAOA,QAAO,WAAWA;AAAA,IAC7B;AAAA;AAAA,IAGA,QAAQ,OAAO,eAAuB;AAClC,YAAMA,UAAS,eAAe,IAAI,UAAU;AAC5C,UAAI,CAACA,SAAQ;AACT,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AACA,aAAO;AAAA,QACH,SAASA,QAAO,WAAWA;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,aAAW,CAAC,MAAM,aAAa,KAAK,gBAAgB;AAChD,YAAQ,IAAI,IAAI,cAAc,WAAW;AAAA,EAC7C;AAEA,SAAO;AACX;AAEO,IAAM,WAAN,MAAe;AAAA,EAIlB,YAAY,SAAqB;AAC7B,SAAK,UAAU;AAAA,MACX,UAAU;AAAA,MACV,iBAAiB,CAAC;AAAA,MAClB,GAAG;AAAA,IACP;AACA,SAAK,KAAK,IAAI,GAAG,KAAK,OAAO;AAAA,EACjC;AAAA,EAEA,SAAS,SAAiC;AACtC,SAAK,GAAG,SAAS,OAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAQ,MAAc;AACxB,WAAO,MAAM,KAAK,GAAG,IAAI,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAgB,MAA+B;AAClD,WAAO,OAAO,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,QAAwB;AACzB,WAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAgB,QAAmC;AACvD,WAAO,OAAO,QAAQ,UAAU,IAAI,KAAK,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,SAAyB;AAC9C,WAAO,OAAO,SAAS,SAAS,KAAK,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,QAAgB,MAAqC;AACvD,WAAO,KAAK,QAAQ,MAAM,KAAK,OAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAgB,QAAgB,MAAiC;AACrE,WAAO,OAAO,QAAQ,QAAQ,MAAM,KAAK,OAAO;AAAA,EACnD;AACJ;","names":["path","fs","vm","bak","module"]}
|
package/dist/database.mjs
CHANGED
|
@@ -240,28 +240,22 @@ var VM = class {
|
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
};
|
|
243
|
-
function create(dbName, code) {
|
|
244
|
-
const DIR = "databases";
|
|
245
|
-
const
|
|
246
|
-
const baseDir = path.resolve(basePath, DIR);
|
|
247
|
-
const dbPath = path.join(baseDir, `${dbName}.ts`);
|
|
243
|
+
function create(dbName, code, options) {
|
|
244
|
+
const DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
245
|
+
const dbPath = path.join(DIR, `${dbName}.ts`);
|
|
248
246
|
fs.appendFileSync(dbPath, code.toString(), "utf8");
|
|
249
247
|
}
|
|
250
|
-
function read(dbName) {
|
|
251
|
-
const DIR = "databases";
|
|
252
|
-
const
|
|
253
|
-
const baseDir = path.resolve(basePath, DIR);
|
|
254
|
-
const dbPath = path.join(baseDir, `${dbName}.ts`);
|
|
248
|
+
function read(dbName, options) {
|
|
249
|
+
const DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
250
|
+
const dbPath = path.join(DIR, `${dbName}.ts`);
|
|
255
251
|
if (!fs.existsSync(dbPath)) {
|
|
256
252
|
throw new Error(`Database '${dbName}' not found`);
|
|
257
253
|
}
|
|
258
254
|
return fs.readFileSync(dbPath, "utf8");
|
|
259
255
|
}
|
|
260
|
-
function remove(dbName, fnName) {
|
|
261
|
-
const DIR = "databases";
|
|
262
|
-
const
|
|
263
|
-
const baseDir = path.resolve(basePath, DIR);
|
|
264
|
-
const dbPath = path.join(baseDir, `${dbName}.ts`);
|
|
256
|
+
function remove(dbName, fnName, options) {
|
|
257
|
+
const DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
258
|
+
const dbPath = path.join(DIR, `${dbName}.ts`);
|
|
265
259
|
if (!fs.existsSync(dbPath)) return false;
|
|
266
260
|
if (!fnName) {
|
|
267
261
|
const bak2 = `${dbPath}.bak`;
|
|
@@ -331,12 +325,10 @@ function remove(dbName, fnName) {
|
|
|
331
325
|
fs.writeFileSync(dbPath, src, "utf8");
|
|
332
326
|
return `Removed ${fnName} from database ${dbName}.`;
|
|
333
327
|
}
|
|
334
|
-
function rename(oldName, newName) {
|
|
335
|
-
const DIR = "databases";
|
|
336
|
-
const
|
|
337
|
-
const
|
|
338
|
-
const oldPath = path.join(baseDir, `${oldName}.ts`);
|
|
339
|
-
const newPath = path.join(baseDir, `${newName}.ts`);
|
|
328
|
+
function rename(oldName, newName, options) {
|
|
329
|
+
const DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
330
|
+
const oldPath = path.join(DIR, `${oldName}.ts`);
|
|
331
|
+
const newPath = path.join(DIR, `${newName}.ts`);
|
|
340
332
|
if (!fs.existsSync(oldPath)) {
|
|
341
333
|
return `Error: File '${oldName}.ts' does not exist in the database`;
|
|
342
334
|
}
|
|
@@ -350,19 +342,15 @@ function rename(oldName, newName) {
|
|
|
350
342
|
return `Error renaming file: ${error instanceof Error ? error.message : String(error)}`;
|
|
351
343
|
}
|
|
352
344
|
}
|
|
353
|
-
function save(dbName, code) {
|
|
354
|
-
const DIR = "databases";
|
|
355
|
-
const
|
|
356
|
-
const baseDir = path.resolve(basePath, DIR);
|
|
357
|
-
const dbPath = path.join(baseDir, `${dbName}.ts`);
|
|
345
|
+
function save(dbName, code, options) {
|
|
346
|
+
const DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
347
|
+
const dbPath = path.join(DIR, `${dbName}.ts`);
|
|
358
348
|
let fileContent = typeof code === "function" ? code.toString() : code;
|
|
359
349
|
fs.writeFileSync(dbPath, fileContent, "utf8");
|
|
360
350
|
}
|
|
361
|
-
function update(dbName, fnName, code) {
|
|
362
|
-
const DIR = "databases";
|
|
363
|
-
const
|
|
364
|
-
const baseDir = path.resolve(basePath, DIR);
|
|
365
|
-
const dbPath = path.join(baseDir, `${dbName}.ts`);
|
|
351
|
+
function update(dbName, fnName, code, options) {
|
|
352
|
+
const DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
353
|
+
const dbPath = path.join(DIR, `${dbName}.ts`);
|
|
366
354
|
let src;
|
|
367
355
|
if (!fs.existsSync(dbPath)) {
|
|
368
356
|
try {
|
|
@@ -546,11 +534,12 @@ async function SystemModuleResolver() {
|
|
|
546
534
|
}
|
|
547
535
|
var Database = class {
|
|
548
536
|
constructor(options) {
|
|
549
|
-
this.
|
|
537
|
+
this.options = {
|
|
550
538
|
language: "ts",
|
|
551
539
|
registerModules: {},
|
|
552
540
|
...options
|
|
553
|
-
}
|
|
541
|
+
};
|
|
542
|
+
this.vm = new VM(this.options);
|
|
554
543
|
}
|
|
555
544
|
register(context) {
|
|
556
545
|
this.vm.register(context);
|
|
@@ -558,6 +547,43 @@ var Database = class {
|
|
|
558
547
|
async execute(code) {
|
|
559
548
|
return await this.vm.run(code);
|
|
560
549
|
}
|
|
550
|
+
// ===== Database Helper Methods =====
|
|
551
|
+
/**
|
|
552
|
+
* Create a new database file with the given code
|
|
553
|
+
*/
|
|
554
|
+
create(dbName, code) {
|
|
555
|
+
return create(dbName, code, this.options);
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Read the contents of a database file
|
|
559
|
+
*/
|
|
560
|
+
read(dbName) {
|
|
561
|
+
return read(dbName, this.options);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Remove a function or the entire database file
|
|
565
|
+
*/
|
|
566
|
+
remove(dbName, fnName) {
|
|
567
|
+
return remove(dbName, fnName || "", this.options);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Rename a database file
|
|
571
|
+
*/
|
|
572
|
+
rename(oldName, newName) {
|
|
573
|
+
return rename(oldName, newName, this.options);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Save code to a database file (overwrites existing content)
|
|
577
|
+
*/
|
|
578
|
+
save(dbName, code) {
|
|
579
|
+
return save(dbName, code, this.options);
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Update a function in a database file
|
|
583
|
+
*/
|
|
584
|
+
update(dbName, fnName, code) {
|
|
585
|
+
return update(dbName, fnName, code, this.options);
|
|
586
|
+
}
|
|
561
587
|
};
|
|
562
588
|
export {
|
|
563
589
|
Database,
|
|
@@ -568,3 +594,4 @@ export {
|
|
|
568
594
|
save,
|
|
569
595
|
update
|
|
570
596
|
};
|
|
597
|
+
//# sourceMappingURL=database.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database.ts"],"sourcesContent":["import vm from \"node:vm\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { transformSync } from 'esbuild';\n\ninterface VMOptions {\n language?: 'ts' | 'js';\n registerModules?: { [key: string]: any };\n dir?: string;\n}\n\nclass VM {\n private transpiler: typeof transformSync;\n private ctx: vm.Context;\n private registerModules: { [key: string]: any };\n private DATABASE_DIR: string;\n private SCRIPTDB_DIR: string;\n private pkgScriptDB: { dependencies?: Record<string, string> } = {};\n private language: 'ts' | 'js';\n private _registerModules: { [key: string]: any };\n constructor(options?: VMOptions) {\n // Set directories based on options or defaults\n this.DATABASE_DIR = options?.dir || path.join(process.cwd(), 'databases');\n this.SCRIPTDB_DIR = process.cwd();\n\n // Ensure directories exist\n if (!fs.existsSync(this.DATABASE_DIR)) {\n fs.mkdirSync(this.DATABASE_DIR, { recursive: true });\n }\n if (!fs.existsSync(this.SCRIPTDB_DIR)) {\n fs.mkdirSync(this.SCRIPTDB_DIR, { recursive: true });\n }\n\n // Load scriptdb workspace package.json if it exists\n const pkgPath = path.join(this.SCRIPTDB_DIR, 'package.json');\n if (fs.existsSync(pkgPath)) {\n this.pkgScriptDB = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n }\n this.language = options?.language || 'ts';\n this.transpiler = transformSync;\n\n this.registerModules = options?.registerModules || {};\n this._registerModules = { ...this.registerModules };\n\n // Add require function to initial context for fallback path\n this._registerModules.require = ((moduleId: string) => this.createRequire(moduleId)).bind(this);\n\n this.ctx = vm.createContext(this._registerModules);\n\n\n }\n\n register(context: { [key: string]: any }) {\n this.registerModules = { ...this.registerModules, ...context };\n this._registerModules = { ...this._registerModules, ...context };\n // Always ensure our custom require function is present (with @db alias support)\n // Store the original require if it exists in context\n const originalRequire = context.require;\n this._registerModules.require = ((moduleId: string) => {\n // Try custom require first (handles @db aliases and database files)\n try {\n return this.createRequire(moduleId);\n } catch (e) {\n // Fall back to original require for node_modules\n if (originalRequire) {\n return originalRequire(moduleId);\n }\n throw e;\n }\n }).bind(this);\n // Update context with all modules including require\n this.ctx = vm.createContext(this._registerModules);\n }\n\n private createRequire(moduleId: string): any {\n // Validate moduleId\n if (!moduleId) {\n console.error('[createRequire] moduleId is undefined');\n return {};\n }\n\n console.log('[createRequire] Loading module:', moduleId, 'from DATABASE_DIR:', this.DATABASE_DIR);\n\n // Handle @db/ path alias\n if (moduleId.startsWith('@db/')) {\n const relativePath = moduleId.substring(4); // Remove '@db/'\n moduleId = './' + relativePath;\n console.log('[createRequire] Resolved @db/ alias to:', moduleId);\n }\n\n // Handle relative paths (e.g., './users')\n if (moduleId.startsWith('./') || moduleId.startsWith('../')) {\n const dbDir = this.DATABASE_DIR || process.cwd();\n const fullPath = path.join(dbDir, moduleId);\n\n console.log('[createRequire] Full path:', fullPath);\n\n // Try to find the file with an extension\n let actualPath: string | undefined = fullPath;\n if (fs.existsSync(fullPath)) {\n actualPath = fullPath;\n } else {\n const extensions = ['.ts', '.tsx', '.js', '.mjs'];\n for (const ext of extensions) {\n if (fs.existsSync(fullPath + ext)) {\n actualPath = fullPath + ext;\n break;\n }\n }\n }\n\n console.log('[createRequire] Actual path:', actualPath);\n\n if (!actualPath || !fs.existsSync(actualPath)) {\n console.log('[createRequire] File not found, throwing error');\n throw new Error(`Module '${moduleId}' not found at ${fullPath}`);\n }\n\n // For TypeScript files, read and transpile the content\n if (actualPath.endsWith('.ts') || actualPath.endsWith('.tsx')) {\n const content = fs.readFileSync(actualPath, 'utf8');\n const js = this.transpiler(content, { loader: 'ts', format: 'cjs' }).code;\n\n // Create a wrapper object to capture the final exports\n const moduleWrapper = { exports: {} };\n const originalModule = this._registerModules.module;\n const originalExports = this._registerModules.exports;\n\n this._registerModules.module = moduleWrapper;\n this._registerModules.exports = moduleWrapper.exports;\n\n try {\n vm.runInContext(js, this.ctx, { filename: actualPath });\n } finally {\n if (originalModule) {\n this._registerModules.module = originalModule;\n } else {\n delete this._registerModules.module;\n }\n if (originalExports) {\n this._registerModules.exports = originalExports;\n } else {\n delete this._registerModules.exports;\n }\n }\n\n console.log('[createRequire] Returning exports:', moduleWrapper.exports);\n return moduleWrapper.exports;\n }\n\n // For JS files, use standard require\n const result = require(actualPath);\n console.log('[createRequire] Returning (JS):', result);\n return result;\n }\n\n // For node_modules, use standard require\n return require(moduleId);\n }\n\n resolvePath(fileList: any[], query: string) {\n const aliases = { '@db': this.DATABASE_DIR };\n\n let resolvedPath = query;\n for (const [alias, target] of Object.entries(aliases)) {\n if (resolvedPath.startsWith(alias + '/')) {\n resolvedPath = resolvedPath.replace(alias, target);\n break;\n }\n }\n\n // Normalize path separators for cross-platform compatibility\n resolvedPath = path.normalize(resolvedPath);\n\n return fileList.find(file => {\n const normalizedFile = path.normalize(file);\n const fileWithoutExt = normalizedFile.replace(/\\.[^/.]+$/, \"\");\n return normalizedFile === resolvedPath ||\n fileWithoutExt === resolvedPath ||\n normalizedFile === resolvedPath + '.ts' ||\n normalizedFile === resolvedPath + '.js';\n });\n }\n\n async moduleLinker(specifier: any, referencingModule: any) {\n console.log('[moduleLinker] Loading specifier:', specifier, 'from DATABASE_DIR:', this.DATABASE_DIR);\n\n // Try database files first\n const dbFiles = fs.readdirSync(this.DATABASE_DIR)\n .filter(f => f.endsWith(\".ts\"))\n .map(f => path.join(this.DATABASE_DIR, f));\n\n console.log('[moduleLinker] Database files:', dbFiles);\n\n const dbResult = this.resolvePath(dbFiles, specifier);\n console.log('[moduleLinker] Resolved path:', dbResult);\n\n if (dbResult) {\n try {\n const actualModule = await import(dbResult);\n const exportNames = Object.keys(actualModule);\n return new vm.SyntheticModule(\n exportNames,\n function () {\n exportNames.forEach(key => {\n this.setExport(key, actualModule[key]);\n });\n },\n { identifier: specifier, context: referencingModule.context }\n );\n } catch (err) {\n console.error(`Failed to load database module ${specifier}:`, err);\n throw err;\n }\n }\n\n // Try workspace packages\n const allowedPackages = Object.keys(this.pkgScriptDB.dependencies || {});\n if (allowedPackages.includes(specifier)) {\n try {\n // Import from scriptdb workspace node_modules\n const modulePath = path.join(this.SCRIPTDB_DIR, 'node_modules', specifier);\n const actualModule = await import(modulePath);\n const exportNames = Object.keys(actualModule);\n return new vm.SyntheticModule(\n exportNames,\n function () {\n exportNames.forEach(key => {\n this.setExport(key, actualModule[key]);\n });\n },\n { identifier: specifier, context: referencingModule.context }\n );\n } catch (err) {\n console.error(`Failed to load workspace module ${specifier}:`, err);\n throw err;\n }\n }\n\n throw new Error(`Module ${specifier} is not allowed or not found.`);\n }\n\n async run(code: string) {\n const logs: any[] = [];\n\n const customConsole = ['log', 'error', 'warn', 'info', 'debug', 'trace'].reduce((acc: any, type: any) => {\n acc[type] = (...args: any[]) => logs.push({ type, args });\n return acc;\n }, {});\n\n this.register({\n console: customConsole\n });\n\n const systemModules = await SystemModuleResolver();\n this.register(systemModules);\n\n const js = this.transpiler(code, { loader: this.language, format: 'cjs' }).code;\n console.log('[run] Transpiled code:', js);\n\n // Try to use SourceTextModule if available (requires Node.js --experimental-vm-modules)\n try {\n const SourceTextModule = (vm as any).SourceTextModule;\n console.log('[run] SourceTextModule available:', typeof SourceTextModule === 'function');\n if (typeof SourceTextModule === 'function') {\n const mod = new SourceTextModule(js, { context: this.ctx, identifier: path.join(this.SCRIPTDB_DIR, 'virtual-entry.js') });\n await mod.link(this.moduleLinker.bind(this));\n await mod.evaluate();\n\n return {\n namespace: mod.namespace,\n logs: logs\n };\n }\n } catch (e) {\n console.log('[run] SourceTextModule failed, using fallback:', e);\n // SourceTextModule not available, fall through to alternative approach\n }\n\n // Fallback: Pre-process imports and use vm.runInContext\n let processedCode = js;\n\n console.log('[run] Original transpiled code:', processedCode);\n\n // esbuild converts: import { users } from './users'\n // to: var import_users = require(\"./users\");\n // and uses: import_users.users\n // But our module exports: exports.users = []\n // So we need to convert import_users.users -> import_users\n\n // First, convert static imports to require calls\n processedCode = processedCode.replace(\n /var\\s+(\\w+)\\s+=\\s+require\\((['\"])([^'\"]+)\\2\\);/g,\n (_match: string, varName: string, quote: string, modulePath: string) => {\n return `const ${varName} = require(${quote}${modulePath}${quote});`;\n }\n );\n\n // Convert any remaining static imports to require calls\n processedCode = processedCode.replace(\n /import\\s+\\{([^}]+)\\}\\s+from\\s+(['\"])([^'\"]+)\\2/g,\n (_match: string, imports: string, quote: string, modulePath: string) => {\n return `const { ${imports} } = require(${quote}${modulePath}${quote});`;\n }\n );\n\n processedCode = processedCode.replace(\n /import\\s+(\\w+)\\s+from\\s+(['\"])([^'\"]+)\\2/g,\n (_match: string, name: string, quote: string, modulePath: string) => {\n return `const ${name} = require(${quote}${modulePath}${quote});`;\n }\n );\n\n // Convert dynamic import() to require()\n processedCode = processedCode.replace(/import\\(([^)]+)\\)/g, 'require($1)');\n\n console.log('[run] Processed code:', processedCode);\n\n console.log('[run] Context has require:', typeof this._registerModules.require);\n console.log('[run] DATABASE_DIR:', this.DATABASE_DIR);\n\n try {\n const result = vm.runInContext(processedCode, this.ctx, {\n filename: path.join(this.SCRIPTDB_DIR, 'virtual-entry.js')\n });\n\n return {\n namespace: result,\n logs: logs\n };\n } catch (e) {\n console.log('[run] Error executing code:', e);\n throw e;\n }\n }\n}\n\nfunction create(dbName: string, code: string | Function, options?: VMOptions): void {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n // Prepare the export line\n fs.appendFileSync(dbPath, code.toString(), 'utf8');\n}\n\nfunction read(dbName: string, options?: VMOptions): string {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n\n if (!fs.existsSync(dbPath)) {\n throw new Error(`Database '${dbName}' not found`);\n }\n\n return fs.readFileSync(dbPath, 'utf8');\n}\n\nfunction remove(dbName: string, fnName: string, options?: VMOptions) {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n if (!fs.existsSync(dbPath)) return false;\n\n // if no functionName provided -> remove the whole file (after backup)\n if (!fnName) {\n const bak = `${dbPath}.bak`;\n try {\n fs.copyFileSync(dbPath, bak);\n } catch (e) {\n // ignore backup errors\n }\n try {\n fs.unlinkSync(dbPath);\n return \"Removed successfully\";\n } catch (e) {\n return \"Removed failed\";\n }\n }\n\n // create a backup before editing the file in-place\n const bak = `${dbPath}.bak`;\n try {\n fs.copyFileSync(dbPath, bak);\n } catch (e) {\n // ignore backup errors but continue carefully\n }\n\n let src = fs.readFileSync(dbPath, \"utf8\");\n const escaped = fnName.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n\n // regex to find a declaration of the named symbol (function, class, or var/const/let assignment)\n const startRe = new RegExp(\n `function\\\\s+${escaped}\\\\s*\\\\(|\\\\bclass\\\\s+${escaped}\\\\b|\\\\b(?:const|let|var)\\\\s+${escaped}\\\\s*=\\\\s*(?:function\\\\b|class\\\\b|\\\\(|\\\\{|\\\\[)`,\n \"m\"\n );\n\n const startMatch = src.match(startRe);\n\n if (startMatch) {\n const startIdx = startMatch.index;\n\n // find the first meaningful character after startIdx: {, [, or ; or newline\n const len = src.length;\n const idxCurly = src.indexOf(\"{\", startIdx);\n const idxBracket = src.indexOf(\"[\", startIdx);\n let braceOpen = -1;\n if (idxCurly === -1) braceOpen = idxBracket;\n else if (idxBracket === -1) braceOpen = idxCurly;\n else braceOpen = Math.min(idxCurly, idxBracket);\n\n if (braceOpen !== -1) {\n const openingChar = src[braceOpen];\n const closingChar = openingChar === \"[\" ? \"]\" : \"}\";\n let i = braceOpen + 1;\n let depth = 1;\n while (i < len && depth > 0) {\n const ch = src[i];\n if (ch === openingChar) depth++;\n else if (ch === closingChar) depth--;\n i++;\n }\n let braceClose = i;\n let endIdx = braceClose;\n if (src.slice(braceClose, braceClose + 1) === \";\")\n endIdx = braceClose + 1;\n\n const before = src.slice(0, startIdx);\n const after = src.slice(endIdx);\n src = before + after;\n } else {\n // fallback: remove until next semicolon or a blank line\n const semi = src.indexOf(\";\", startIdx);\n let endIdx = semi !== -1 ? semi + 1 : src.indexOf(\"\\n\\n\", startIdx);\n if (endIdx === -1) endIdx = len;\n src = src.slice(0, startIdx) + src.slice(endIdx);\n }\n }\n\n // remove any export const <name>: any = <name>; lines\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"g\"\n );\n src = src.replace(exportRe, \"\");\n\n // tidy up multiple blank lines\n src = src.replace(/\\n{3,}/g, \"\\n\\n\");\n\n fs.writeFileSync(dbPath, src, \"utf8\");\n\n return `Removed ${fnName} from database ${dbName}.`;\n}\n\nfunction rename(oldName: string, newName: string, options?: VMOptions): string {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const oldPath = path.join(DIR, `${oldName}.ts`);\n const newPath = path.join(DIR, `${newName}.ts`);\n\n // Check if the source file exists\n if (!fs.existsSync(oldPath)) {\n return `Error: File '${oldName}.ts' does not exist in the database`;\n }\n\n // Check if the destination file already exists\n if (fs.existsSync(newPath)) {\n return `Error: File '${newName}.ts' already exists in the database`;\n }\n\n try {\n // Rename the file\n fs.renameSync(oldPath, newPath);\n return `Successfully renamed '${oldName}.ts' to '${newName}.ts'`;\n } catch (error) {\n return `Error renaming file: ${error instanceof Error ? error.message : String(error)}`;\n }\n}\n\nfunction save(dbName: string, code: string | Function | any, options?: VMOptions): void {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n\n let fileContent = typeof code === 'function' ? code.toString() : code;\n\n fs.writeFileSync(dbPath, fileContent, 'utf8');\n}\n\nfunction update(dbName: string, fnName: string, code: string | Function, options?: VMOptions) {\n const DIR = options?.dir || path.join(process.cwd(), 'databases');\n const dbPath = path.join(DIR, `${dbName}.ts`);\n\n let src;\n\n if (!fs.existsSync(dbPath)) {\n // If dbPath doesn't exist, create an empty module file so we can insert into it.\n try {\n fs.writeFileSync(dbPath, \"\", \"utf8\");\n // console.log(\"Created new database file:\", dbPath);\n return `Created new database file: ${dbPath}`;\n } catch (e) {\n // console.error(\"Failed to create dbPath file:\", dbPath, e && e.message ? e.message : e);\n return `Failed to create dbPath file: ${dbPath}`;\n }\n }\n\n src = fs.readFileSync(dbPath, \"utf8\");\n\n const originalSrc = src;\n\n const escaped = fnName.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n const startRe = new RegExp(\n `function\\\\s+${escaped}\\\\s*\\\\(|\\\\bclass\\\\s+${escaped}\\\\b|\\\\b(?:const|let|var)\\\\s+${escaped}\\\\s*=\\\\s*(?:function\\\\b|class\\\\b|\\\\(|\\\\{|\\\\[)`,\n \"m\"\n );\n const startMatch = src.match(startRe);\n\n // determine declKind in the current file (if present)\n let declKind = null;\n\n if (startMatch) {\n let startIdx: any = startMatch.index;\n const snippet = src.slice(startIdx, startIdx + 80);\n if (/^function\\b/.test(snippet)) declKind = \"functionDecl\";\n else if (/^class\\b/.test(snippet)) declKind = \"classDecl\";\n else if (/^\\b(?:const|let|var)\\b/.test(snippet)) declKind = \"varAssign\";\n }\n\n // build replacement code for this value\n let newCode;\n if (typeof code === \"function\") {\n const fnStr = code.toString();\n // prefer const assignment for anonymous functions/classes or arrow functions\n if (declKind === \"functionDecl\") {\n if (/^function\\s+\\w+/.test(fnStr)) newCode = fnStr;\n else\n newCode = `function ${fnName}${fnStr.replace(\n /^function\\s*\\(/,\n \"(\"\n )}`;\n } else if (declKind === \"classDecl\") {\n if (/^class\\s+\\w+/.test(fnStr)) newCode = fnStr;\n else if (/^class\\s*\\{/.test(fnStr))\n newCode = fnStr.replace(/^class\\s*\\{/, `class ${fnName} {`);\n else newCode = `const ${fnName} = ${fnStr};`;\n } else {\n newCode = `const ${fnName} = ${fnStr};`;\n }\n } else {\n newCode = `const ${fnName} = ${valueToCode(code, 0)};`;\n }\n\n // replacement: if found startMatch, find block and replace between startIdx and endIdx\n if (startMatch) {\n const startIdx = startMatch.index;\n // find first '{' or '[' after startIdx\n const idxCurly = src.indexOf(\"{\", startIdx);\n const idxBracket = src.indexOf(\"[\", startIdx);\n let braceOpen = -1;\n if (idxCurly === -1) braceOpen = idxBracket;\n else if (idxBracket === -1) braceOpen = idxCurly;\n else braceOpen = Math.min(idxCurly, idxBracket);\n\n if (braceOpen === -1) {\n // no block — fallback: replace export or append\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"m\"\n );\n if (exportRe.test(src)) {\n src = src.replace(\n exportRe,\n `${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`\n );\n } else {\n src =\n src + `\\n\\n${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`;\n }\n } else {\n const openingChar = src[braceOpen];\n const closingChar = openingChar === \"[\" ? \"]\" : \"}\";\n let i = braceOpen + 1;\n let depth = 1;\n const len = src.length;\n while (i < len && depth > 0) {\n const ch = src[i];\n if (ch === openingChar) depth++;\n else if (ch === closingChar) depth--;\n i++;\n }\n let braceClose = i;\n let endIdx = braceClose;\n if (src.slice(braceClose, braceClose + 1) === \";\")\n endIdx = braceClose + 1;\n\n const before = src.slice(0, startIdx);\n const after = src.slice(endIdx);\n src = before + newCode + after;\n }\n } else {\n // not found — try to insert before existing export or append\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"m\"\n );\n if (exportRe.test(src)) {\n src = src.replace(\n exportRe,\n `${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`\n );\n } else {\n src =\n src + `\\n\\n${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`;\n }\n }\n\n fs.writeFileSync(dbPath, src, \"utf8\");\n\n if (src === originalSrc) {\n return `Saved ${fnName} to database ${dbName}.`;\n } else {\n return `Updated ${dbName} with ${fnName}.`;\n }\n}\n\nfunction valueToCode(val: any, depth: number = 0): string {\n const indentUnit = \" \";\n const indent = indentUnit.repeat(depth);\n const indentInner = indentUnit.repeat(depth + 1);\n\n if (val === null) return \"null\";\n const t = typeof val;\n if (t === \"string\") return JSON.stringify(val);\n if (t === \"number\" || t === \"boolean\") return String(val);\n if (t === \"function\") return val.toString();\n if (Array.isArray(val)) {\n if (val.length === 0) return \"[]\";\n const items = val.map((v) => valueToCode(v, depth + 1));\n return (\n \"[\\n\" +\n items.map((it) => indentInner + it).join(\",\\n\") +\n \"\\n\" +\n indent +\n \"]\"\n );\n }\n if (t === \"object\") {\n const keys = Object.keys(val);\n if (keys.length === 0) return \"{}\";\n const entries = keys.map((k) => {\n const keyPart = isIdentifier(k) ? k : JSON.stringify(k);\n const v = valueToCode(val[k], depth + 1);\n return indentInner + keyPart + \": \" + v;\n });\n return \"{\\n\" + entries.join(\",\\n\") + \"\\n\" + indent + \"}\";\n }\n return String(val);\n}\n\nfunction isIdentifier(key: any) {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n}\n\nasync function SystemModuleResolver() {\n\n const moduleRegistry = new Map<string, any>();\n\n moduleRegistry.set(\"update\", update);\n moduleRegistry.set(\"remove\", remove);\n moduleRegistry.set(\"create\", create);\n moduleRegistry.set(\"save\", save);\n moduleRegistry.set(\"read\", read);\n\n const context: Record<string, any> = {\n // Add require-like functionality\n require: (moduleName: string) => {\n const module = moduleRegistry.get(moduleName);\n if (!module) {\n throw new Error(`Module '${moduleName}' not found`);\n }\n // Return the default export if available, otherwise the module itself\n return module.default || module;\n },\n\n // Add import functionality (simulated)\n import: async (moduleName: string) => {\n const module = moduleRegistry.get(moduleName);\n if (!module) {\n throw new Error(`Module '${moduleName}' not found`);\n }\n return {\n default: module.default || module\n };\n }\n };\n\n for (const [name, moduleExports] of moduleRegistry) {\n context[name] = moduleExports.default || moduleExports;\n }\n\n return context;\n}\n\nexport class Database {\n private vm: VM;\n private options: VMOptions;\n\n constructor(options?: VMOptions) {\n this.options = {\n language: 'ts',\n registerModules: {},\n ...options\n };\n this.vm = new VM(this.options);\n }\n\n register(context: { [key: string]: any }) {\n this.vm.register(context);\n }\n\n async execute(code: string) {\n return await this.vm.run(code);\n }\n\n // ===== Database Helper Methods =====\n\n /**\n * Create a new database file with the given code\n */\n create(dbName: string, code: string | Function): void {\n return create(dbName, code, this.options);\n }\n\n /**\n * Read the contents of a database file\n */\n read(dbName: string): string {\n return read(dbName, this.options);\n }\n\n /**\n * Remove a function or the entire database file\n */\n remove(dbName: string, fnName?: string): string | boolean {\n return remove(dbName, fnName || \"\", this.options);\n }\n\n /**\n * Rename a database file\n */\n rename(oldName: string, newName: string): string {\n return rename(oldName, newName, this.options);\n }\n\n /**\n * Save code to a database file (overwrites existing content)\n */\n save(dbName: string, code: string | Function | any): void {\n return save(dbName, code, this.options);\n }\n\n /**\n * Update a function in a database file\n */\n update(dbName: string, fnName: string, code: string | Function): string {\n return update(dbName, fnName, code, this.options);\n }\n}\n\n// Export Database class and keep helper functions for backward compatibility\nexport { create, read, remove, rename, save, update };\n\n\n"],"mappings":"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","names":["bak"]}
|
package/dist/dom.js
CHANGED
package/dist/dom.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts"],"sourcesContent":["/**\n * Elit - DomNode Core Class\n */\n\nimport type { VNode, Child, Children, Props, State, StateOptions, VirtualListController, JsonNode, VNodeJson } from './types';\n\n/**\n * Helper: Resolve element from string ID or HTMLElement (eliminates duplication in render methods)\n */\nfunction resolveElement(rootElement: string | HTMLElement): HTMLElement | null {\n return typeof rootElement === 'string'\n ? document.getElementById(rootElement.replace('#', ''))\n : rootElement;\n}\n\n/**\n * Helper: Ensure element exists or throw error (eliminates duplication in validation)\n */\nfunction ensureElement(el: HTMLElement | null, rootElement: string | HTMLElement): HTMLElement {\n if (!el) {\n throw new Error(`Element not found: ${rootElement}`);\n }\n return el;\n}\n\n/**\n * Helper: Check if child should be skipped (eliminates duplication in child rendering)\n */\nfunction shouldSkipChild(child: any): boolean {\n return child == null || child === false;\n}\n\n/**\n * Helper: Check if value is primitive JSON type (eliminates duplication in JSON conversion)\n */\nfunction isPrimitiveJson(json: any): json is string | number | boolean | null | undefined {\n return json == null || typeof json === 'boolean' || typeof json === 'string' || typeof json === 'number';\n}\n\nexport class DomNode {\n private elementCache = new WeakMap<Element, boolean>();\n\n createElement(tagName: string, props: Props = {}, children: Children = []): VNode {\n return { tagName, props, children };\n }\n\n renderToDOM(vNode: Child, parent: HTMLElement | SVGElement | DocumentFragment): void {\n if (vNode == null || vNode === false) return;\n\n // Handle primitive values (strings, numbers)\n if (typeof vNode !== 'object') {\n parent.appendChild(document.createTextNode(String(vNode)));\n return;\n }\n\n // Handle arrays (Child[])\n if (Array.isArray(vNode)) {\n for (const child of vNode) {\n this.renderToDOM(child, parent);\n }\n return;\n }\n\n // Handle VNode\n const { tagName, props, children } = vNode;\n\n // Handle fragment (empty tagName) - render children directly to parent\n if (!tagName) {\n // Fragments don't have their own element, so skip ref handling\n // The ref will be handled by the wrapper element created by reactive()\n // Render children directly to parent\n for (const child of children) {\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (const c of child) {\n !shouldSkipChild(c) && this.renderToDOM(c, parent);\n }\n } else {\n this.renderToDOM(child, parent);\n }\n }\n return;\n }\n\n const isSVG = tagName === 'svg' || (tagName[0] === 's' && tagName[1] === 'v' && tagName[2] === 'g') ||\n (parent as any).namespaceURI === 'http://www.w3.org/2000/svg';\n\n const el = isSVG\n ? document.createElementNS('http://www.w3.org/2000/svg', tagName.replace('svg', '').toLowerCase() || tagName)\n : document.createElement(tagName);\n\n for (const key in props) {\n const value = props[key];\n if (value == null || value === false) continue;\n\n const c = key.charCodeAt(0);\n // class or className (c=99)\n if (c === 99 && (key.length < 6 || key[5] === 'N')) {\n const classValue = Array.isArray(value) ? value.join(' ') : value;\n isSVG ? (el as SVGElement).setAttribute('class', classValue) : (el as HTMLElement).className = classValue;\n }\n // style (s=115)\n else if (c === 115 && key.length === 5) {\n if (typeof value === 'string') {\n (el as HTMLElement).style.cssText = value;\n } else {\n const s = (el as HTMLElement).style;\n for (const k in value) (s as any)[k] = value[k];\n }\n }\n // on* events (o=111, n=110)\n else if (c === 111 && key.charCodeAt(1) === 110) {\n (el as any)[key.toLowerCase()] = value;\n }\n // dangerouslySetInnerHTML (d=100)\n else if (c === 100 && key.length > 20) {\n (el as HTMLElement).innerHTML = value.__html;\n }\n // ref (r=114)\n else if (c === 114 && key.length === 3) {\n setTimeout(() => {\n typeof value === 'function' ? value(el as HTMLElement) : (value.current = el as HTMLElement);\n }, 0);\n }\n else {\n el.setAttribute(key, value === true ? '' : String(value));\n }\n }\n\n const len = children.length;\n if (!len) {\n parent.appendChild(el);\n return;\n }\n\n const renderChildren = (target: HTMLElement | SVGElement | DocumentFragment) => {\n for (let i = 0; i < len; i++) {\n const child = children[i];\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (let j = 0, cLen = child.length; j < cLen; j++) {\n const c = child[j];\n !shouldSkipChild(c) && this.renderToDOM(c, target);\n }\n } else {\n this.renderToDOM(child, target);\n }\n }\n };\n\n if (len > 30) {\n const fragment = document.createDocumentFragment();\n renderChildren(fragment);\n el.appendChild(fragment);\n } else {\n renderChildren(el);\n }\n\n parent.appendChild(el);\n }\n\n render(rootElement: string | HTMLElement, vNode: VNode): HTMLElement {\n const el = ensureElement(resolveElement(rootElement), rootElement);\n\n // Clear existing content before rendering\n el.innerHTML = '';\n\n if (vNode.children && vNode.children.length > 500) {\n const fragment = document.createDocumentFragment();\n this.renderToDOM(vNode, fragment);\n el.appendChild(fragment);\n } else {\n this.renderToDOM(vNode, el);\n }\n return el;\n }\n\n batchRender(rootElement: string | HTMLElement, vNodes: VNode[]): HTMLElement {\n const el = ensureElement(resolveElement(rootElement), rootElement);\n\n const len = vNodes.length;\n\n if (len > 3000) {\n const fragment = document.createDocumentFragment();\n let processed = 0;\n const chunkSize = 1500;\n\n const processChunk = (): void => {\n const end = Math.min(processed + chunkSize, len);\n for (let i = processed; i < end; i++) {\n this.renderToDOM(vNodes[i], fragment);\n }\n processed = end;\n\n if (processed >= len) {\n el.appendChild(fragment);\n } else {\n requestAnimationFrame(processChunk);\n }\n };\n\n processChunk();\n } else {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < len; i++) {\n this.renderToDOM(vNodes[i], fragment);\n }\n el.appendChild(fragment);\n }\n return el;\n }\n\n renderChunked(\n rootElement: string | HTMLElement,\n vNodes: VNode[],\n chunkSize = 5000,\n onProgress?: (current: number, total: number) => void\n ): HTMLElement {\n const el = ensureElement(resolveElement(rootElement), rootElement);\n\n const len = vNodes.length;\n let index = 0;\n\n const renderChunk = (): void => {\n const end = Math.min(index + chunkSize, len);\n const fragment = document.createDocumentFragment();\n\n for (let i = index; i < end; i++) {\n this.renderToDOM(vNodes[i], fragment);\n }\n\n el.appendChild(fragment);\n index = end;\n\n if (onProgress) onProgress(index, len);\n\n if (index < len) {\n requestAnimationFrame(renderChunk);\n }\n };\n\n requestAnimationFrame(renderChunk);\n return el;\n }\n\n renderToHead(...vNodes: Array<VNode | VNode[]>): HTMLHeadElement | null {\n const head = document.head;\n if (head) {\n for (const vNode of vNodes.flat()) {\n vNode && this.renderToDOM(vNode, head);\n }\n }\n return head;\n }\n\n addStyle(cssText: string): HTMLStyleElement {\n const el = document.createElement('style');\n el.textContent = cssText;\n return document.head.appendChild(el);\n }\n\n addMeta(attrs: Record<string, string>): HTMLMetaElement {\n const el = document.createElement('meta');\n for (const k in attrs) el.setAttribute(k, attrs[k]);\n return document.head.appendChild(el);\n }\n\n addLink(attrs: Record<string, string>): HTMLLinkElement {\n const el = document.createElement('link');\n for (const k in attrs) el.setAttribute(k, attrs[k]);\n return document.head.appendChild(el);\n }\n\n setTitle(text: string): string {\n return document.title = text;\n }\n\n // Reactive State Management\n createState<T>(initialValue: T, options: StateOptions = {}): State<T> {\n let value = initialValue;\n const listeners = new Set<(value: T) => void>();\n let updateTimer: NodeJS.Timeout | null = null;\n const { throttle = 0, deep = false } = options;\n\n const notify = () => listeners.forEach(fn => fn(value));\n\n const scheduleUpdate = () => {\n if (throttle > 0) {\n if (!updateTimer) {\n updateTimer = setTimeout(() => {\n updateTimer = null;\n notify();\n }, throttle);\n }\n } else {\n notify();\n }\n };\n\n return {\n get value() { return value; },\n set value(newValue: T) {\n const changed = deep ? JSON.stringify(value) !== JSON.stringify(newValue) : value !== newValue;\n if (changed) {\n value = newValue;\n scheduleUpdate();\n }\n },\n subscribe(fn: (value: T) => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n destroy() {\n listeners.clear();\n updateTimer && clearTimeout(updateTimer);\n }\n };\n }\n\n computed<T extends any[], R>(states: { [K in keyof T]: State<T[K]> }, computeFn: (...values: T) => R): State<R> {\n const values = states.map(s => s.value) as unknown as T;\n const result = this.createState(computeFn(...values));\n\n states.forEach((state, index) => {\n state.subscribe((newValue: any) => {\n values[index] = newValue;\n result.value = computeFn(...values);\n });\n });\n\n return result;\n }\n\n effect(stateFn: () => void): void {\n stateFn();\n }\n\n // Virtual scrolling helper for large lists\n createVirtualList<T>(\n container: HTMLElement,\n items: T[],\n renderItem: (item: T, index: number) => VNode,\n itemHeight = 50,\n bufferSize = 5\n ): VirtualListController {\n const viewportHeight = container.clientHeight;\n const totalHeight = items.length * itemHeight;\n let scrollTop = 0;\n\n const getVisibleRange = (): { start: number; end: number } => {\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - bufferSize);\n const end = Math.min(items.length, Math.ceil((scrollTop + viewportHeight) / itemHeight) + bufferSize);\n return { start, end };\n };\n\n const render = (): void => {\n const { start, end } = getVisibleRange();\n const wrapper = document.createElement('div');\n wrapper.style.cssText = `height:${totalHeight}px;position:relative`;\n\n for (let i = start; i < end; i++) {\n const itemEl = document.createElement('div');\n itemEl.style.cssText = `position:absolute;top:${i * itemHeight}px;height:${itemHeight}px;width:100%`;\n this.renderToDOM(renderItem(items[i], i), itemEl);\n wrapper.appendChild(itemEl);\n }\n\n container.innerHTML = '';\n container.appendChild(wrapper);\n };\n\n const scrollHandler = (): void => {\n scrollTop = container.scrollTop;\n requestAnimationFrame(render);\n };\n\n container.addEventListener('scroll', scrollHandler);\n\n render();\n return {\n render,\n destroy: () => {\n container.removeEventListener('scroll', scrollHandler);\n container.innerHTML = '';\n }\n };\n }\n\n // Lazy load components\n lazy<T extends any[], R>(loadFn: () => Promise<(...args: T) => R>): (...args: T) => Promise<R | VNode> {\n let component: ((...args: T) => R) | null = null;\n let loading = false;\n\n return async (...args: T): Promise<R | VNode> => {\n if (!component && !loading) {\n loading = true;\n component = await loadFn();\n loading = false;\n }\n return component ? component(...args) : { tagName: 'div', props: { class: 'loading' }, children: ['Loading...'] };\n };\n }\n\n // Memory management - cleanup unused elements\n cleanupUnusedElements(root: HTMLElement): number {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const node = walker.currentNode as Element;\n if (node.id && node.id.startsWith('r') && !this.elementCache.has(node)) {\n toRemove.push(node);\n }\n }\n\n toRemove.forEach(el => el.remove());\n return toRemove.length;\n }\n\n // Server-Side Rendering - convert VNode to HTML string\n renderToString(vNode: Child, options: { pretty?: boolean; indent?: number } = {}): string {\n const { pretty = false, indent = 0 } = options;\n const indentStr = pretty ? ' '.repeat(indent) : '';\n const newLine = pretty ? '\\n' : '';\n\n let resolvedVNode = this.resolveStateValue(vNode);\n resolvedVNode = this.unwrapReactive(resolvedVNode);\n\n if (Array.isArray(resolvedVNode)) {\n return resolvedVNode.map(child => this.renderToString(child, options)).join('');\n }\n\n if (typeof resolvedVNode !== 'object' || resolvedVNode === null) {\n if (resolvedVNode === null || resolvedVNode === undefined || resolvedVNode === false) {\n return '';\n }\n return this.escapeHtml(String(resolvedVNode));\n }\n\n const { tagName, props, children } = resolvedVNode;\n const isSelfClosing = this.isSelfClosingTag(tagName);\n\n let html = `${indentStr}<${tagName}`;\n\n const attrs = this.propsToAttributes(props);\n if (attrs) {\n html += ` ${attrs}`;\n }\n\n if (isSelfClosing) {\n html += ` />${newLine}`;\n return html;\n }\n\n html += '>';\n\n if (props.dangerouslySetInnerHTML) {\n html += props.dangerouslySetInnerHTML.__html;\n html += `</${tagName}>${newLine}`;\n return html;\n }\n\n if (children && children.length > 0) {\n const resolvedChildren = children.map((c: Child) => {\n const resolved = this.resolveStateValue(c);\n return this.unwrapReactive(resolved);\n });\n\n const hasComplexChildren = resolvedChildren.some(\n (c: any) => typeof c === 'object' && c !== null && !Array.isArray(c) && 'tagName' in c\n );\n\n if (pretty && hasComplexChildren) {\n html += newLine;\n for (const child of resolvedChildren) {\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (const c of child) {\n if (!shouldSkipChild(c)) {\n html += this.renderToString(c, { pretty, indent: indent + 1 });\n }\n }\n } else {\n html += this.renderToString(child, { pretty, indent: indent + 1 });\n }\n }\n html += indentStr;\n } else {\n for (const child of resolvedChildren) {\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (const c of child) {\n if (!shouldSkipChild(c)) {\n html += this.renderToString(c, { pretty: false, indent: 0 });\n }\n }\n } else {\n html += this.renderToString(child, { pretty: false, indent: 0 });\n }\n }\n }\n }\n\n html += `</${tagName}>${newLine}`;\n return html;\n }\n\n private resolveStateValue(value: any): any {\n if (value && typeof value === 'object' && 'value' in value && 'subscribe' in value) {\n return value.value;\n }\n return value;\n }\n\n private isReactiveWrapper(vNode: any): boolean {\n if (!vNode || typeof vNode !== 'object' || !vNode.tagName) {\n return false;\n }\n return vNode.tagName === 'span' &&\n vNode.props?.id &&\n typeof vNode.props.id === 'string' &&\n vNode.props.id.match(/^r[a-z0-9]{9}$/);\n }\n\n private unwrapReactive(vNode: any): Child {\n if (!this.isReactiveWrapper(vNode)) {\n return vNode;\n }\n\n const children = vNode.children;\n if (!children || children.length === 0) {\n return '';\n }\n\n if (children.length === 1) {\n const child = children[0];\n\n if (child && typeof child === 'object' && child.tagName === 'span') {\n const props = child.props;\n const hasNoProps = !props || Object.keys(props).length === 0;\n const hasSingleStringChild = child.children &&\n child.children.length === 1 &&\n typeof child.children[0] === 'string';\n\n if (hasNoProps && hasSingleStringChild) {\n return child.children[0];\n }\n }\n\n return this.unwrapReactive(child);\n }\n\n return children.map((c: Child) => this.unwrapReactive(c));\n }\n\n private escapeHtml(text: string): string {\n const htmlEscapes: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return text.replace(/[&<>\"']/g, char => htmlEscapes[char]);\n }\n\n private isSelfClosingTag(tagName: string): boolean {\n const selfClosingTags = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n return selfClosingTags.has(tagName.toLowerCase());\n }\n\n private propsToAttributes(props: Props): string {\n const attrs: string[] = [];\n\n for (const key in props) {\n if (key === 'children' || key === 'dangerouslySetInnerHTML' || key === 'ref') {\n continue;\n }\n\n let value = props[key];\n value = this.resolveStateValue(value);\n\n if (value == null || value === false) continue;\n\n if (key.startsWith('on') && typeof value === 'function') {\n continue;\n }\n\n if (key === 'className' || key === 'class') {\n const className = Array.isArray(value) ? value.join(' ') : value;\n if (className) {\n attrs.push(`class=\"${this.escapeHtml(String(className))}\"`);\n }\n continue;\n }\n\n if (key === 'style') {\n const styleStr = this.styleToString(value);\n if (styleStr) {\n attrs.push(`style=\"${this.escapeHtml(styleStr)}\"`);\n }\n continue;\n }\n\n if (value === true) {\n attrs.push(key);\n continue;\n }\n\n attrs.push(`${key}=\"${this.escapeHtml(String(value))}\"`);\n }\n\n return attrs.join(' ');\n }\n\n private styleToString(style: any): string {\n if (typeof style === 'string') {\n return style;\n }\n\n if (typeof style === 'object' && style !== null) {\n const styles: string[] = [];\n for (const key in style) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n styles.push(`${cssKey}:${style[key]}`);\n }\n return styles.join(';');\n }\n\n return '';\n }\n\n private isState(value: any): value is State<any> {\n return value && typeof value === 'object' && 'value' in value && 'subscribe' in value && typeof value.subscribe === 'function';\n }\n\n private reactiveNodes = new Map<State<any>, { node: Text | null, renderFn: (v: any) => Child }>();\n\n private createReactiveChild(state: State<any>, renderFn: (value: any) => Child): Child {\n const currentValue = renderFn(state.value);\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n const entry = { node: null as Text | null, renderFn };\n this.reactiveNodes.set(state, entry);\n\n state.subscribe(() => {\n if (entry.node && entry.node.parentNode) {\n const newValue = renderFn(state.value);\n entry.node.textContent = String(newValue ?? '');\n }\n });\n }\n\n return currentValue;\n }\n\n jsonToVNode(json: JsonNode | string | number | boolean | null | undefined | State<any>): Child {\n if (this.isState(json)) {\n return this.createReactiveChild(json, (v: any) => v);\n }\n\n if (isPrimitiveJson(json)) {\n return json as Child;\n }\n\n const { tag, attributes = {}, children } = json;\n\n const props: Props = {};\n for (const key in attributes) {\n const value = attributes[key];\n if (key === 'class') {\n props.className = this.isState(value) ? value.value : value;\n } else {\n props[key] = this.isState(value) ? value.value : value;\n }\n }\n\n const childrenArray: Children = [];\n if (children != null) {\n if (Array.isArray(children)) {\n for (const child of children) {\n if (this.isState(child)) {\n childrenArray.push(this.createReactiveChild(child, (v: any) => v));\n } else {\n const converted = this.jsonToVNode(child);\n if (converted != null && converted !== false) {\n childrenArray.push(converted);\n }\n }\n }\n } else if (this.isState(children)) {\n childrenArray.push(this.createReactiveChild(children, (v: any) => v));\n } else if (typeof children === 'object' && 'tag' in children) {\n const converted = this.jsonToVNode(children);\n if (converted != null && converted !== false) {\n childrenArray.push(converted);\n }\n } else {\n childrenArray.push(children as Child);\n }\n }\n\n return { tagName: tag, props, children: childrenArray };\n }\n\n vNodeJsonToVNode(json: VNodeJson | State<any>): Child {\n if (this.isState(json)) {\n return this.createReactiveChild(json, (v: any) => v);\n }\n\n if (isPrimitiveJson(json)) {\n return json as Child;\n }\n\n const { tagName, props = {}, children = [] } = json;\n\n const resolvedProps: Props = {};\n for (const key in props) {\n const value = props[key];\n resolvedProps[key] = this.isState(value) ? value.value : value;\n }\n\n const childrenArray: Children = [];\n for (const child of children) {\n if (this.isState(child)) {\n childrenArray.push(this.createReactiveChild(child, (v: any) => v));\n } else {\n const converted = this.vNodeJsonToVNode(child);\n if (converted != null && converted !== false) {\n childrenArray.push(converted);\n }\n }\n }\n\n return { tagName, props: resolvedProps, children: childrenArray };\n }\n\n renderJson(rootElement: string | HTMLElement, json: JsonNode): HTMLElement {\n const vNode = this.jsonToVNode(json);\n if (!vNode || typeof vNode !== 'object' || !('tagName' in vNode)) {\n throw new Error('Invalid JSON structure');\n }\n return this.render(rootElement, vNode as VNode);\n }\n\n renderVNode(rootElement: string | HTMLElement, json: VNodeJson): HTMLElement {\n const vNode = this.vNodeJsonToVNode(json);\n if (!vNode || typeof vNode !== 'object' || !('tagName' in vNode)) {\n throw new Error('Invalid VNode JSON structure');\n }\n return this.render(rootElement, vNode as VNode);\n }\n\n renderJsonToString(json: JsonNode, options: { pretty?: boolean; indent?: number } = {}): string {\n const vNode = this.jsonToVNode(json);\n return this.renderToString(vNode, options);\n }\n\n renderVNodeToString(json: VNodeJson, options: { pretty?: boolean; indent?: number } = {}): string {\n const vNode = this.vNodeJsonToVNode(json);\n return this.renderToString(vNode, options);\n }\n\n\n // Generate complete HTML document as string (for SSR)\n renderToHTMLDocument(vNode: Child, options: {\n title?: string;\n meta?: Array<Record<string, string>>;\n links?: Array<Record<string, string>>;\n scripts?: Array<{ src?: string; content?: string; async?: boolean; defer?: boolean; type?: string }>;\n styles?: Array<{ href?: string; content?: string }>;\n lang?: string;\n head?: string;\n bodyAttrs?: Record<string, string>;\n pretty?: boolean;\n } = {}): string {\n const { title = '', meta = [], links = [], scripts = [], styles = [], lang = 'en', head = '', bodyAttrs = {}, pretty = false } = options;\n const nl = pretty ? '\\n' : '';\n const indent = pretty ? ' ' : '';\n const indent2 = pretty ? ' ' : '';\n\n let html = `<!DOCTYPE html>${nl}<html lang=\"${lang}\">${nl}${indent}<head>${nl}${indent2}<meta charset=\"UTF-8\">${nl}${indent2}<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">${nl}`;\n if (title) html += `${indent2}<title>${this.escapeHtml(title)}</title>${nl}`;\n\n for (const m of meta) {\n html += `${indent2}<meta`;\n for (const k in m) html += ` ${k}=\"${this.escapeHtml(m[k])}\"`;\n html += `>${nl}`;\n }\n\n for (const l of links) {\n html += `${indent2}<link`;\n for (const k in l) html += ` ${k}=\"${this.escapeHtml(l[k])}\"`;\n html += `>${nl}`;\n }\n\n for (const s of styles) {\n if (s.href) {\n html += `${indent2}<link rel=\"stylesheet\" href=\"${this.escapeHtml(s.href)}\">${nl}`;\n } else if (s.content) {\n html += `${indent2}<style>${s.content}</style>${nl}`;\n }\n }\n\n if (head) html += head + nl;\n html += `${indent}</head>${nl}${indent}<body`;\n for (const k in bodyAttrs) html += ` ${k}=\"${this.escapeHtml(bodyAttrs[k])}\"`;\n html += `>${nl}`;\n html += this.renderToString(vNode, { pretty, indent: 2 });\n\n for (const script of scripts) {\n html += `${indent2}<script`;\n if (script.type) html += ` type=\"${this.escapeHtml(script.type)}\"`;\n if (script.async) html += ` async`;\n if (script.defer) html += ` defer`;\n if (script.src) {\n html += ` src=\"${this.escapeHtml(script.src)}\"></script>${nl}`;\n } else if (script.content) {\n html += `>${script.content}</script>${nl}`;\n } else {\n html += `></script>${nl}`;\n }\n }\n\n html += `${indent}</body>${nl}</html>`;\n return html;\n }\n\n // Expose elementCache for reactive updates\n getElementCache(): WeakMap<Element, boolean> {\n return this.elementCache;\n }\n}\n\nexport const dom = new DomNode();\n\n// Export helper functions for convenience\nexport const render = dom.render.bind(dom);\nexport const renderToString = dom.renderToString.bind(dom);\nexport const mount = render; // alias for render\n"],"mappings":"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","names":["render"]}
|
package/dist/dom.mjs
CHANGED
package/dist/dom.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts"],"sourcesContent":["/**\n * Elit - DomNode Core Class\n */\n\nimport type { VNode, Child, Children, Props, State, StateOptions, VirtualListController, JsonNode, VNodeJson } from './types';\n\n/**\n * Helper: Resolve element from string ID or HTMLElement (eliminates duplication in render methods)\n */\nfunction resolveElement(rootElement: string | HTMLElement): HTMLElement | null {\n return typeof rootElement === 'string'\n ? document.getElementById(rootElement.replace('#', ''))\n : rootElement;\n}\n\n/**\n * Helper: Ensure element exists or throw error (eliminates duplication in validation)\n */\nfunction ensureElement(el: HTMLElement | null, rootElement: string | HTMLElement): HTMLElement {\n if (!el) {\n throw new Error(`Element not found: ${rootElement}`);\n }\n return el;\n}\n\n/**\n * Helper: Check if child should be skipped (eliminates duplication in child rendering)\n */\nfunction shouldSkipChild(child: any): boolean {\n return child == null || child === false;\n}\n\n/**\n * Helper: Check if value is primitive JSON type (eliminates duplication in JSON conversion)\n */\nfunction isPrimitiveJson(json: any): json is string | number | boolean | null | undefined {\n return json == null || typeof json === 'boolean' || typeof json === 'string' || typeof json === 'number';\n}\n\nexport class DomNode {\n private elementCache = new WeakMap<Element, boolean>();\n\n createElement(tagName: string, props: Props = {}, children: Children = []): VNode {\n return { tagName, props, children };\n }\n\n renderToDOM(vNode: Child, parent: HTMLElement | SVGElement | DocumentFragment): void {\n if (vNode == null || vNode === false) return;\n\n // Handle primitive values (strings, numbers)\n if (typeof vNode !== 'object') {\n parent.appendChild(document.createTextNode(String(vNode)));\n return;\n }\n\n // Handle arrays (Child[])\n if (Array.isArray(vNode)) {\n for (const child of vNode) {\n this.renderToDOM(child, parent);\n }\n return;\n }\n\n // Handle VNode\n const { tagName, props, children } = vNode;\n\n // Handle fragment (empty tagName) - render children directly to parent\n if (!tagName) {\n // Fragments don't have their own element, so skip ref handling\n // The ref will be handled by the wrapper element created by reactive()\n // Render children directly to parent\n for (const child of children) {\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (const c of child) {\n !shouldSkipChild(c) && this.renderToDOM(c, parent);\n }\n } else {\n this.renderToDOM(child, parent);\n }\n }\n return;\n }\n\n const isSVG = tagName === 'svg' || (tagName[0] === 's' && tagName[1] === 'v' && tagName[2] === 'g') ||\n (parent as any).namespaceURI === 'http://www.w3.org/2000/svg';\n\n const el = isSVG\n ? document.createElementNS('http://www.w3.org/2000/svg', tagName.replace('svg', '').toLowerCase() || tagName)\n : document.createElement(tagName);\n\n for (const key in props) {\n const value = props[key];\n if (value == null || value === false) continue;\n\n const c = key.charCodeAt(0);\n // class or className (c=99)\n if (c === 99 && (key.length < 6 || key[5] === 'N')) {\n const classValue = Array.isArray(value) ? value.join(' ') : value;\n isSVG ? (el as SVGElement).setAttribute('class', classValue) : (el as HTMLElement).className = classValue;\n }\n // style (s=115)\n else if (c === 115 && key.length === 5) {\n if (typeof value === 'string') {\n (el as HTMLElement).style.cssText = value;\n } else {\n const s = (el as HTMLElement).style;\n for (const k in value) (s as any)[k] = value[k];\n }\n }\n // on* events (o=111, n=110)\n else if (c === 111 && key.charCodeAt(1) === 110) {\n (el as any)[key.toLowerCase()] = value;\n }\n // dangerouslySetInnerHTML (d=100)\n else if (c === 100 && key.length > 20) {\n (el as HTMLElement).innerHTML = value.__html;\n }\n // ref (r=114)\n else if (c === 114 && key.length === 3) {\n setTimeout(() => {\n typeof value === 'function' ? value(el as HTMLElement) : (value.current = el as HTMLElement);\n }, 0);\n }\n else {\n el.setAttribute(key, value === true ? '' : String(value));\n }\n }\n\n const len = children.length;\n if (!len) {\n parent.appendChild(el);\n return;\n }\n\n const renderChildren = (target: HTMLElement | SVGElement | DocumentFragment) => {\n for (let i = 0; i < len; i++) {\n const child = children[i];\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (let j = 0, cLen = child.length; j < cLen; j++) {\n const c = child[j];\n !shouldSkipChild(c) && this.renderToDOM(c, target);\n }\n } else {\n this.renderToDOM(child, target);\n }\n }\n };\n\n if (len > 30) {\n const fragment = document.createDocumentFragment();\n renderChildren(fragment);\n el.appendChild(fragment);\n } else {\n renderChildren(el);\n }\n\n parent.appendChild(el);\n }\n\n render(rootElement: string | HTMLElement, vNode: VNode): HTMLElement {\n const el = ensureElement(resolveElement(rootElement), rootElement);\n\n // Clear existing content before rendering\n el.innerHTML = '';\n\n if (vNode.children && vNode.children.length > 500) {\n const fragment = document.createDocumentFragment();\n this.renderToDOM(vNode, fragment);\n el.appendChild(fragment);\n } else {\n this.renderToDOM(vNode, el);\n }\n return el;\n }\n\n batchRender(rootElement: string | HTMLElement, vNodes: VNode[]): HTMLElement {\n const el = ensureElement(resolveElement(rootElement), rootElement);\n\n const len = vNodes.length;\n\n if (len > 3000) {\n const fragment = document.createDocumentFragment();\n let processed = 0;\n const chunkSize = 1500;\n\n const processChunk = (): void => {\n const end = Math.min(processed + chunkSize, len);\n for (let i = processed; i < end; i++) {\n this.renderToDOM(vNodes[i], fragment);\n }\n processed = end;\n\n if (processed >= len) {\n el.appendChild(fragment);\n } else {\n requestAnimationFrame(processChunk);\n }\n };\n\n processChunk();\n } else {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < len; i++) {\n this.renderToDOM(vNodes[i], fragment);\n }\n el.appendChild(fragment);\n }\n return el;\n }\n\n renderChunked(\n rootElement: string | HTMLElement,\n vNodes: VNode[],\n chunkSize = 5000,\n onProgress?: (current: number, total: number) => void\n ): HTMLElement {\n const el = ensureElement(resolveElement(rootElement), rootElement);\n\n const len = vNodes.length;\n let index = 0;\n\n const renderChunk = (): void => {\n const end = Math.min(index + chunkSize, len);\n const fragment = document.createDocumentFragment();\n\n for (let i = index; i < end; i++) {\n this.renderToDOM(vNodes[i], fragment);\n }\n\n el.appendChild(fragment);\n index = end;\n\n if (onProgress) onProgress(index, len);\n\n if (index < len) {\n requestAnimationFrame(renderChunk);\n }\n };\n\n requestAnimationFrame(renderChunk);\n return el;\n }\n\n renderToHead(...vNodes: Array<VNode | VNode[]>): HTMLHeadElement | null {\n const head = document.head;\n if (head) {\n for (const vNode of vNodes.flat()) {\n vNode && this.renderToDOM(vNode, head);\n }\n }\n return head;\n }\n\n addStyle(cssText: string): HTMLStyleElement {\n const el = document.createElement('style');\n el.textContent = cssText;\n return document.head.appendChild(el);\n }\n\n addMeta(attrs: Record<string, string>): HTMLMetaElement {\n const el = document.createElement('meta');\n for (const k in attrs) el.setAttribute(k, attrs[k]);\n return document.head.appendChild(el);\n }\n\n addLink(attrs: Record<string, string>): HTMLLinkElement {\n const el = document.createElement('link');\n for (const k in attrs) el.setAttribute(k, attrs[k]);\n return document.head.appendChild(el);\n }\n\n setTitle(text: string): string {\n return document.title = text;\n }\n\n // Reactive State Management\n createState<T>(initialValue: T, options: StateOptions = {}): State<T> {\n let value = initialValue;\n const listeners = new Set<(value: T) => void>();\n let updateTimer: NodeJS.Timeout | null = null;\n const { throttle = 0, deep = false } = options;\n\n const notify = () => listeners.forEach(fn => fn(value));\n\n const scheduleUpdate = () => {\n if (throttle > 0) {\n if (!updateTimer) {\n updateTimer = setTimeout(() => {\n updateTimer = null;\n notify();\n }, throttle);\n }\n } else {\n notify();\n }\n };\n\n return {\n get value() { return value; },\n set value(newValue: T) {\n const changed = deep ? JSON.stringify(value) !== JSON.stringify(newValue) : value !== newValue;\n if (changed) {\n value = newValue;\n scheduleUpdate();\n }\n },\n subscribe(fn: (value: T) => void) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n destroy() {\n listeners.clear();\n updateTimer && clearTimeout(updateTimer);\n }\n };\n }\n\n computed<T extends any[], R>(states: { [K in keyof T]: State<T[K]> }, computeFn: (...values: T) => R): State<R> {\n const values = states.map(s => s.value) as unknown as T;\n const result = this.createState(computeFn(...values));\n\n states.forEach((state, index) => {\n state.subscribe((newValue: any) => {\n values[index] = newValue;\n result.value = computeFn(...values);\n });\n });\n\n return result;\n }\n\n effect(stateFn: () => void): void {\n stateFn();\n }\n\n // Virtual scrolling helper for large lists\n createVirtualList<T>(\n container: HTMLElement,\n items: T[],\n renderItem: (item: T, index: number) => VNode,\n itemHeight = 50,\n bufferSize = 5\n ): VirtualListController {\n const viewportHeight = container.clientHeight;\n const totalHeight = items.length * itemHeight;\n let scrollTop = 0;\n\n const getVisibleRange = (): { start: number; end: number } => {\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - bufferSize);\n const end = Math.min(items.length, Math.ceil((scrollTop + viewportHeight) / itemHeight) + bufferSize);\n return { start, end };\n };\n\n const render = (): void => {\n const { start, end } = getVisibleRange();\n const wrapper = document.createElement('div');\n wrapper.style.cssText = `height:${totalHeight}px;position:relative`;\n\n for (let i = start; i < end; i++) {\n const itemEl = document.createElement('div');\n itemEl.style.cssText = `position:absolute;top:${i * itemHeight}px;height:${itemHeight}px;width:100%`;\n this.renderToDOM(renderItem(items[i], i), itemEl);\n wrapper.appendChild(itemEl);\n }\n\n container.innerHTML = '';\n container.appendChild(wrapper);\n };\n\n const scrollHandler = (): void => {\n scrollTop = container.scrollTop;\n requestAnimationFrame(render);\n };\n\n container.addEventListener('scroll', scrollHandler);\n\n render();\n return {\n render,\n destroy: () => {\n container.removeEventListener('scroll', scrollHandler);\n container.innerHTML = '';\n }\n };\n }\n\n // Lazy load components\n lazy<T extends any[], R>(loadFn: () => Promise<(...args: T) => R>): (...args: T) => Promise<R | VNode> {\n let component: ((...args: T) => R) | null = null;\n let loading = false;\n\n return async (...args: T): Promise<R | VNode> => {\n if (!component && !loading) {\n loading = true;\n component = await loadFn();\n loading = false;\n }\n return component ? component(...args) : { tagName: 'div', props: { class: 'loading' }, children: ['Loading...'] };\n };\n }\n\n // Memory management - cleanup unused elements\n cleanupUnusedElements(root: HTMLElement): number {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const node = walker.currentNode as Element;\n if (node.id && node.id.startsWith('r') && !this.elementCache.has(node)) {\n toRemove.push(node);\n }\n }\n\n toRemove.forEach(el => el.remove());\n return toRemove.length;\n }\n\n // Server-Side Rendering - convert VNode to HTML string\n renderToString(vNode: Child, options: { pretty?: boolean; indent?: number } = {}): string {\n const { pretty = false, indent = 0 } = options;\n const indentStr = pretty ? ' '.repeat(indent) : '';\n const newLine = pretty ? '\\n' : '';\n\n let resolvedVNode = this.resolveStateValue(vNode);\n resolvedVNode = this.unwrapReactive(resolvedVNode);\n\n if (Array.isArray(resolvedVNode)) {\n return resolvedVNode.map(child => this.renderToString(child, options)).join('');\n }\n\n if (typeof resolvedVNode !== 'object' || resolvedVNode === null) {\n if (resolvedVNode === null || resolvedVNode === undefined || resolvedVNode === false) {\n return '';\n }\n return this.escapeHtml(String(resolvedVNode));\n }\n\n const { tagName, props, children } = resolvedVNode;\n const isSelfClosing = this.isSelfClosingTag(tagName);\n\n let html = `${indentStr}<${tagName}`;\n\n const attrs = this.propsToAttributes(props);\n if (attrs) {\n html += ` ${attrs}`;\n }\n\n if (isSelfClosing) {\n html += ` />${newLine}`;\n return html;\n }\n\n html += '>';\n\n if (props.dangerouslySetInnerHTML) {\n html += props.dangerouslySetInnerHTML.__html;\n html += `</${tagName}>${newLine}`;\n return html;\n }\n\n if (children && children.length > 0) {\n const resolvedChildren = children.map((c: Child) => {\n const resolved = this.resolveStateValue(c);\n return this.unwrapReactive(resolved);\n });\n\n const hasComplexChildren = resolvedChildren.some(\n (c: any) => typeof c === 'object' && c !== null && !Array.isArray(c) && 'tagName' in c\n );\n\n if (pretty && hasComplexChildren) {\n html += newLine;\n for (const child of resolvedChildren) {\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (const c of child) {\n if (!shouldSkipChild(c)) {\n html += this.renderToString(c, { pretty, indent: indent + 1 });\n }\n }\n } else {\n html += this.renderToString(child, { pretty, indent: indent + 1 });\n }\n }\n html += indentStr;\n } else {\n for (const child of resolvedChildren) {\n if (shouldSkipChild(child)) continue;\n\n if (Array.isArray(child)) {\n for (const c of child) {\n if (!shouldSkipChild(c)) {\n html += this.renderToString(c, { pretty: false, indent: 0 });\n }\n }\n } else {\n html += this.renderToString(child, { pretty: false, indent: 0 });\n }\n }\n }\n }\n\n html += `</${tagName}>${newLine}`;\n return html;\n }\n\n private resolveStateValue(value: any): any {\n if (value && typeof value === 'object' && 'value' in value && 'subscribe' in value) {\n return value.value;\n }\n return value;\n }\n\n private isReactiveWrapper(vNode: any): boolean {\n if (!vNode || typeof vNode !== 'object' || !vNode.tagName) {\n return false;\n }\n return vNode.tagName === 'span' &&\n vNode.props?.id &&\n typeof vNode.props.id === 'string' &&\n vNode.props.id.match(/^r[a-z0-9]{9}$/);\n }\n\n private unwrapReactive(vNode: any): Child {\n if (!this.isReactiveWrapper(vNode)) {\n return vNode;\n }\n\n const children = vNode.children;\n if (!children || children.length === 0) {\n return '';\n }\n\n if (children.length === 1) {\n const child = children[0];\n\n if (child && typeof child === 'object' && child.tagName === 'span') {\n const props = child.props;\n const hasNoProps = !props || Object.keys(props).length === 0;\n const hasSingleStringChild = child.children &&\n child.children.length === 1 &&\n typeof child.children[0] === 'string';\n\n if (hasNoProps && hasSingleStringChild) {\n return child.children[0];\n }\n }\n\n return this.unwrapReactive(child);\n }\n\n return children.map((c: Child) => this.unwrapReactive(c));\n }\n\n private escapeHtml(text: string): string {\n const htmlEscapes: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return text.replace(/[&<>\"']/g, char => htmlEscapes[char]);\n }\n\n private isSelfClosingTag(tagName: string): boolean {\n const selfClosingTags = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n return selfClosingTags.has(tagName.toLowerCase());\n }\n\n private propsToAttributes(props: Props): string {\n const attrs: string[] = [];\n\n for (const key in props) {\n if (key === 'children' || key === 'dangerouslySetInnerHTML' || key === 'ref') {\n continue;\n }\n\n let value = props[key];\n value = this.resolveStateValue(value);\n\n if (value == null || value === false) continue;\n\n if (key.startsWith('on') && typeof value === 'function') {\n continue;\n }\n\n if (key === 'className' || key === 'class') {\n const className = Array.isArray(value) ? value.join(' ') : value;\n if (className) {\n attrs.push(`class=\"${this.escapeHtml(String(className))}\"`);\n }\n continue;\n }\n\n if (key === 'style') {\n const styleStr = this.styleToString(value);\n if (styleStr) {\n attrs.push(`style=\"${this.escapeHtml(styleStr)}\"`);\n }\n continue;\n }\n\n if (value === true) {\n attrs.push(key);\n continue;\n }\n\n attrs.push(`${key}=\"${this.escapeHtml(String(value))}\"`);\n }\n\n return attrs.join(' ');\n }\n\n private styleToString(style: any): string {\n if (typeof style === 'string') {\n return style;\n }\n\n if (typeof style === 'object' && style !== null) {\n const styles: string[] = [];\n for (const key in style) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n styles.push(`${cssKey}:${style[key]}`);\n }\n return styles.join(';');\n }\n\n return '';\n }\n\n private isState(value: any): value is State<any> {\n return value && typeof value === 'object' && 'value' in value && 'subscribe' in value && typeof value.subscribe === 'function';\n }\n\n private reactiveNodes = new Map<State<any>, { node: Text | null, renderFn: (v: any) => Child }>();\n\n private createReactiveChild(state: State<any>, renderFn: (value: any) => Child): Child {\n const currentValue = renderFn(state.value);\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n const entry = { node: null as Text | null, renderFn };\n this.reactiveNodes.set(state, entry);\n\n state.subscribe(() => {\n if (entry.node && entry.node.parentNode) {\n const newValue = renderFn(state.value);\n entry.node.textContent = String(newValue ?? '');\n }\n });\n }\n\n return currentValue;\n }\n\n jsonToVNode(json: JsonNode | string | number | boolean | null | undefined | State<any>): Child {\n if (this.isState(json)) {\n return this.createReactiveChild(json, (v: any) => v);\n }\n\n if (isPrimitiveJson(json)) {\n return json as Child;\n }\n\n const { tag, attributes = {}, children } = json;\n\n const props: Props = {};\n for (const key in attributes) {\n const value = attributes[key];\n if (key === 'class') {\n props.className = this.isState(value) ? value.value : value;\n } else {\n props[key] = this.isState(value) ? value.value : value;\n }\n }\n\n const childrenArray: Children = [];\n if (children != null) {\n if (Array.isArray(children)) {\n for (const child of children) {\n if (this.isState(child)) {\n childrenArray.push(this.createReactiveChild(child, (v: any) => v));\n } else {\n const converted = this.jsonToVNode(child);\n if (converted != null && converted !== false) {\n childrenArray.push(converted);\n }\n }\n }\n } else if (this.isState(children)) {\n childrenArray.push(this.createReactiveChild(children, (v: any) => v));\n } else if (typeof children === 'object' && 'tag' in children) {\n const converted = this.jsonToVNode(children);\n if (converted != null && converted !== false) {\n childrenArray.push(converted);\n }\n } else {\n childrenArray.push(children as Child);\n }\n }\n\n return { tagName: tag, props, children: childrenArray };\n }\n\n vNodeJsonToVNode(json: VNodeJson | State<any>): Child {\n if (this.isState(json)) {\n return this.createReactiveChild(json, (v: any) => v);\n }\n\n if (isPrimitiveJson(json)) {\n return json as Child;\n }\n\n const { tagName, props = {}, children = [] } = json;\n\n const resolvedProps: Props = {};\n for (const key in props) {\n const value = props[key];\n resolvedProps[key] = this.isState(value) ? value.value : value;\n }\n\n const childrenArray: Children = [];\n for (const child of children) {\n if (this.isState(child)) {\n childrenArray.push(this.createReactiveChild(child, (v: any) => v));\n } else {\n const converted = this.vNodeJsonToVNode(child);\n if (converted != null && converted !== false) {\n childrenArray.push(converted);\n }\n }\n }\n\n return { tagName, props: resolvedProps, children: childrenArray };\n }\n\n renderJson(rootElement: string | HTMLElement, json: JsonNode): HTMLElement {\n const vNode = this.jsonToVNode(json);\n if (!vNode || typeof vNode !== 'object' || !('tagName' in vNode)) {\n throw new Error('Invalid JSON structure');\n }\n return this.render(rootElement, vNode as VNode);\n }\n\n renderVNode(rootElement: string | HTMLElement, json: VNodeJson): HTMLElement {\n const vNode = this.vNodeJsonToVNode(json);\n if (!vNode || typeof vNode !== 'object' || !('tagName' in vNode)) {\n throw new Error('Invalid VNode JSON structure');\n }\n return this.render(rootElement, vNode as VNode);\n }\n\n renderJsonToString(json: JsonNode, options: { pretty?: boolean; indent?: number } = {}): string {\n const vNode = this.jsonToVNode(json);\n return this.renderToString(vNode, options);\n }\n\n renderVNodeToString(json: VNodeJson, options: { pretty?: boolean; indent?: number } = {}): string {\n const vNode = this.vNodeJsonToVNode(json);\n return this.renderToString(vNode, options);\n }\n\n\n // Generate complete HTML document as string (for SSR)\n renderToHTMLDocument(vNode: Child, options: {\n title?: string;\n meta?: Array<Record<string, string>>;\n links?: Array<Record<string, string>>;\n scripts?: Array<{ src?: string; content?: string; async?: boolean; defer?: boolean; type?: string }>;\n styles?: Array<{ href?: string; content?: string }>;\n lang?: string;\n head?: string;\n bodyAttrs?: Record<string, string>;\n pretty?: boolean;\n } = {}): string {\n const { title = '', meta = [], links = [], scripts = [], styles = [], lang = 'en', head = '', bodyAttrs = {}, pretty = false } = options;\n const nl = pretty ? '\\n' : '';\n const indent = pretty ? ' ' : '';\n const indent2 = pretty ? ' ' : '';\n\n let html = `<!DOCTYPE html>${nl}<html lang=\"${lang}\">${nl}${indent}<head>${nl}${indent2}<meta charset=\"UTF-8\">${nl}${indent2}<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">${nl}`;\n if (title) html += `${indent2}<title>${this.escapeHtml(title)}</title>${nl}`;\n\n for (const m of meta) {\n html += `${indent2}<meta`;\n for (const k in m) html += ` ${k}=\"${this.escapeHtml(m[k])}\"`;\n html += `>${nl}`;\n }\n\n for (const l of links) {\n html += `${indent2}<link`;\n for (const k in l) html += ` ${k}=\"${this.escapeHtml(l[k])}\"`;\n html += `>${nl}`;\n }\n\n for (const s of styles) {\n if (s.href) {\n html += `${indent2}<link rel=\"stylesheet\" href=\"${this.escapeHtml(s.href)}\">${nl}`;\n } else if (s.content) {\n html += `${indent2}<style>${s.content}</style>${nl}`;\n }\n }\n\n if (head) html += head + nl;\n html += `${indent}</head>${nl}${indent}<body`;\n for (const k in bodyAttrs) html += ` ${k}=\"${this.escapeHtml(bodyAttrs[k])}\"`;\n html += `>${nl}`;\n html += this.renderToString(vNode, { pretty, indent: 2 });\n\n for (const script of scripts) {\n html += `${indent2}<script`;\n if (script.type) html += ` type=\"${this.escapeHtml(script.type)}\"`;\n if (script.async) html += ` async`;\n if (script.defer) html += ` defer`;\n if (script.src) {\n html += ` src=\"${this.escapeHtml(script.src)}\"></script>${nl}`;\n } else if (script.content) {\n html += `>${script.content}</script>${nl}`;\n } else {\n html += `></script>${nl}`;\n }\n }\n\n html += `${indent}</body>${nl}</html>`;\n return html;\n }\n\n // Expose elementCache for reactive updates\n getElementCache(): WeakMap<Element, boolean> {\n return this.elementCache;\n }\n}\n\nexport const dom = new DomNode();\n\n// Export helper functions for convenience\nexport const render = dom.render.bind(dom);\nexport const renderToString = dom.renderToString.bind(dom);\nexport const mount = render; // alias for render\n"],"mappings":"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","names":["render"]}
|
package/dist/el.js
CHANGED