elit 3.3.7 → 3.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +8 -7
- package/dist/database.js.map +1 -1
- package/dist/database.mjs +8 -7
- package/dist/database.mjs.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +23 -1
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +23 -1
- package/dist/server.mjs.map +1 -1
- package/package.json +1 -1
- package/src/database.ts +15 -7
- package/src/server.ts +31 -1
package/dist/cli.js
CHANGED
|
@@ -5933,7 +5933,7 @@ var require_package = __commonJS({
|
|
|
5933
5933
|
"package.json"(exports2, module2) {
|
|
5934
5934
|
module2.exports = {
|
|
5935
5935
|
name: "elit",
|
|
5936
|
-
version: "3.3.
|
|
5936
|
+
version: "3.3.9",
|
|
5937
5937
|
description: "Optimized lightweight library for creating DOM elements with reactive state",
|
|
5938
5938
|
main: "dist/index.js",
|
|
5939
5939
|
module: "dist/index.mjs",
|
package/dist/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAKA,UAAU,SAAS;IACf,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAKA,UAAU,SAAS;IACf,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AA0UD,iBAAS,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAKlF;AAED,iBAAS,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CASzD;AAED,iBAAS,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,kBA6FlE;AAED,iBAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAsB7E;AAED,iBAAS,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAI,CAOtF;AAED,iBAAS,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,SAAS,UAuI3F;AAsFD,qBAAa,QAAQ;IACjB,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,OAAO,CAAY;gBAEf,OAAO,CAAC,EAAE,SAAS;IAS/B,QAAQ,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAIlC,OAAO,CAAC,IAAI,EAAE,MAAM;;;;IAM1B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAIrD;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI5B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAIzD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAIhD;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI;IAIzD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM;CAG1E;AAGD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/database.js
CHANGED
|
@@ -46,6 +46,7 @@ var import_esbuild = require("esbuild");
|
|
|
46
46
|
var VM = class {
|
|
47
47
|
constructor(options) {
|
|
48
48
|
this.pkgScriptDB = {};
|
|
49
|
+
this.options = options || {};
|
|
49
50
|
this.DATABASE_DIR = options?.dir || import_node_path.default.join(process.cwd(), "databases");
|
|
50
51
|
this.SCRIPTDB_DIR = process.cwd();
|
|
51
52
|
if (!import_node_fs.default.existsSync(this.DATABASE_DIR)) {
|
|
@@ -215,7 +216,7 @@ var VM = class {
|
|
|
215
216
|
this.register({
|
|
216
217
|
console: customConsole
|
|
217
218
|
});
|
|
218
|
-
const systemModules = await SystemModuleResolver();
|
|
219
|
+
const systemModules = await SystemModuleResolver(this.options);
|
|
219
220
|
this.register(systemModules);
|
|
220
221
|
const js = this.transpiler(code, { loader: this.language, format: "cjs" }).code;
|
|
221
222
|
console.log("[run] Transpiled code:", js);
|
|
@@ -532,13 +533,13 @@ function valueToCode(val, depth = 0) {
|
|
|
532
533
|
function isIdentifier(key) {
|
|
533
534
|
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);
|
|
534
535
|
}
|
|
535
|
-
async function SystemModuleResolver() {
|
|
536
|
+
async function SystemModuleResolver(customOptions) {
|
|
536
537
|
const moduleRegistry = /* @__PURE__ */ new Map();
|
|
537
|
-
moduleRegistry.set("update", update);
|
|
538
|
-
moduleRegistry.set("remove", remove);
|
|
539
|
-
moduleRegistry.set("create", create);
|
|
540
|
-
moduleRegistry.set("save", save);
|
|
541
|
-
moduleRegistry.set("read", read);
|
|
538
|
+
moduleRegistry.set("update", (dbName, fnName, code) => update(dbName, fnName, code, customOptions));
|
|
539
|
+
moduleRegistry.set("remove", (dbName, fnName) => remove(dbName, fnName, customOptions));
|
|
540
|
+
moduleRegistry.set("create", (dbName, code) => create(dbName, code, customOptions));
|
|
541
|
+
moduleRegistry.set("save", (dbName, code) => save(dbName, code, customOptions));
|
|
542
|
+
moduleRegistry.set("read", (dbName) => read(dbName, customOptions));
|
|
542
543
|
const context = {
|
|
543
544
|
// Add require-like functionality
|
|
544
545
|
require: (moduleName) => {
|
package/dist/database.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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 private options: VMOptions;\n constructor(options?: VMOptions) {\n this.options = options || {};\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(this.options);\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(customOptions?: VMOptions) {\n\n const moduleRegistry = new Map<string, any>();\n\n // Wrap functions to automatically pass customOptions when called from within VM\n moduleRegistry.set(\"update\", (dbName: string, fnName: string, code: string | Function) =>\n update(dbName, fnName, code, customOptions));\n moduleRegistry.set(\"remove\", (dbName: string, fnName: string) =>\n remove(dbName, fnName, customOptions));\n moduleRegistry.set(\"create\", (dbName: string, code: string | Function) =>\n create(dbName, code, customOptions));\n moduleRegistry.set(\"save\", (dbName: string, code: string | Function | any) =>\n save(dbName, code, customOptions));\n moduleRegistry.set(\"read\", (dbName: string) =>\n read(dbName, customOptions));\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":["path","fs","vm","bak","module"]}
|
package/dist/database.mjs
CHANGED
|
@@ -14,6 +14,7 @@ import { transformSync } from "esbuild";
|
|
|
14
14
|
var VM = class {
|
|
15
15
|
constructor(options) {
|
|
16
16
|
this.pkgScriptDB = {};
|
|
17
|
+
this.options = options || {};
|
|
17
18
|
this.DATABASE_DIR = options?.dir || path.join(process.cwd(), "databases");
|
|
18
19
|
this.SCRIPTDB_DIR = process.cwd();
|
|
19
20
|
if (!fs.existsSync(this.DATABASE_DIR)) {
|
|
@@ -183,7 +184,7 @@ var VM = class {
|
|
|
183
184
|
this.register({
|
|
184
185
|
console: customConsole
|
|
185
186
|
});
|
|
186
|
-
const systemModules = await SystemModuleResolver();
|
|
187
|
+
const systemModules = await SystemModuleResolver(this.options);
|
|
187
188
|
this.register(systemModules);
|
|
188
189
|
const js = this.transpiler(code, { loader: this.language, format: "cjs" }).code;
|
|
189
190
|
console.log("[run] Transpiled code:", js);
|
|
@@ -500,13 +501,13 @@ function valueToCode(val, depth = 0) {
|
|
|
500
501
|
function isIdentifier(key) {
|
|
501
502
|
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);
|
|
502
503
|
}
|
|
503
|
-
async function SystemModuleResolver() {
|
|
504
|
+
async function SystemModuleResolver(customOptions) {
|
|
504
505
|
const moduleRegistry = /* @__PURE__ */ new Map();
|
|
505
|
-
moduleRegistry.set("update", update);
|
|
506
|
-
moduleRegistry.set("remove", remove);
|
|
507
|
-
moduleRegistry.set("create", create);
|
|
508
|
-
moduleRegistry.set("save", save);
|
|
509
|
-
moduleRegistry.set("read", read);
|
|
506
|
+
moduleRegistry.set("update", (dbName, fnName, code) => update(dbName, fnName, code, customOptions));
|
|
507
|
+
moduleRegistry.set("remove", (dbName, fnName) => remove(dbName, fnName, customOptions));
|
|
508
|
+
moduleRegistry.set("create", (dbName, code) => create(dbName, code, customOptions));
|
|
509
|
+
moduleRegistry.set("save", (dbName, code) => save(dbName, code, customOptions));
|
|
510
|
+
moduleRegistry.set("read", (dbName) => read(dbName, customOptions));
|
|
510
511
|
const context = {
|
|
511
512
|
// Add require-like functionality
|
|
512
513
|
require: (moduleName) => {
|
package/dist/database.mjs.map
CHANGED
|
@@ -1 +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"]}
|
|
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 private options: VMOptions;\n constructor(options?: VMOptions) {\n this.options = options || {};\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(this.options);\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(customOptions?: VMOptions) {\n\n const moduleRegistry = new Map<string, any>();\n\n // Wrap functions to automatically pass customOptions when called from within VM\n moduleRegistry.set(\"update\", (dbName: string, fnName: string, code: string | Function) =>\n update(dbName, fnName, code, customOptions));\n moduleRegistry.set(\"remove\", (dbName: string, fnName: string) =>\n remove(dbName, fnName, customOptions));\n moduleRegistry.set(\"create\", (dbName: string, code: string | Function) =>\n create(dbName, code, customOptions));\n moduleRegistry.set(\"save\", (dbName: string, code: string | Function | any) =>\n save(dbName, code, customOptions));\n moduleRegistry.set(\"read\", (dbName: string) =>\n read(dbName, customOptions));\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/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -2898,9 +2898,31 @@ var ServerRouter = class {
|
|
|
2898
2898
|
const query = this.parseQuery(url);
|
|
2899
2899
|
req.query = query;
|
|
2900
2900
|
req.params = params;
|
|
2901
|
+
let _statusCode = 200;
|
|
2902
|
+
const elitRes = res;
|
|
2903
|
+
elitRes.status = function(code) {
|
|
2904
|
+
_statusCode = code;
|
|
2905
|
+
return this;
|
|
2906
|
+
};
|
|
2907
|
+
elitRes.json = function(data, statusCode) {
|
|
2908
|
+
const code = statusCode !== void 0 ? statusCode : _statusCode;
|
|
2909
|
+
this.writeHead(code, { "Content-Type": "application/json" });
|
|
2910
|
+
this.end(JSON.stringify(data));
|
|
2911
|
+
return this;
|
|
2912
|
+
};
|
|
2913
|
+
elitRes.send = function(data) {
|
|
2914
|
+
if (typeof data === "string") {
|
|
2915
|
+
this.writeHead(_statusCode, { "Content-Type": "text/html" });
|
|
2916
|
+
this.end(data);
|
|
2917
|
+
} else {
|
|
2918
|
+
this.writeHead(_statusCode, { "Content-Type": "application/json" });
|
|
2919
|
+
this.end(JSON.stringify(data));
|
|
2920
|
+
}
|
|
2921
|
+
return this;
|
|
2922
|
+
};
|
|
2901
2923
|
const ctx = {
|
|
2902
2924
|
req,
|
|
2903
|
-
res,
|
|
2925
|
+
res: elitRes,
|
|
2904
2926
|
params,
|
|
2905
2927
|
query,
|
|
2906
2928
|
body,
|