elit 3.3.8 → 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 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.8",
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",
@@ -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;AAwUD,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;AAgFD,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"}
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) => {
@@ -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":["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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAe;AACf,qBAAe;AACf,uBAAiB;AACjB,qBAA8B;AAQ9B,IAAM,KAAN,MAAS;AAAA,EAUL,YAAY,SAAqB;AAJjC,SAAQ,cAAyD,CAAC;AAK9D,SAAK,UAAU,WAAW,CAAC;AAE3B,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,KAAK,OAAO;AAC7D,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,qBAAqB,eAA2B;AAE3D,QAAM,iBAAiB,oBAAI,IAAiB;AAG5C,iBAAe,IAAI,UAAU,CAAC,QAAgB,QAAgB,SAC1D,OAAO,QAAQ,QAAQ,MAAM,aAAa,CAAC;AAC/C,iBAAe,IAAI,UAAU,CAAC,QAAgB,WAC1C,OAAO,QAAQ,QAAQ,aAAa,CAAC;AACzC,iBAAe,IAAI,UAAU,CAAC,QAAgB,SAC1C,OAAO,QAAQ,MAAM,aAAa,CAAC;AACvC,iBAAe,IAAI,QAAQ,CAAC,QAAgB,SACxC,KAAK,QAAQ,MAAM,aAAa,CAAC;AACrC,iBAAe,IAAI,QAAQ,CAAC,WACxB,KAAK,QAAQ,aAAa,CAAC;AAE/B,QAAM,UAA+B;AAAA;AAAA,IAEjC,SAAS,CAAC,eAAuB;AAC7B,YAAMG,UAAS,eAAe,IAAI,UAAU;AAC5C,UAAI,CAACA,SAAQ;AACT,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AAEA,aAAOA,QAAO,WAAWA;AAAA,IAC7B;AAAA;AAAA,IAGA,QAAQ,OAAO,eAAuB;AAClC,YAAMA,UAAS,eAAe,IAAI,UAAU;AAC5C,UAAI,CAACA,SAAQ;AACT,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AACA,aAAO;AAAA,QACH,SAASA,QAAO,WAAWA;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,aAAW,CAAC,MAAM,aAAa,KAAK,gBAAgB;AAChD,YAAQ,IAAI,IAAI,cAAc,WAAW;AAAA,EAC7C;AAEA,SAAO;AACX;AAEO,IAAM,WAAN,MAAe;AAAA,EAIlB,YAAY,SAAqB;AAC7B,SAAK,UAAU;AAAA,MACX,UAAU;AAAA,MACV,iBAAiB,CAAC;AAAA,MAClB,GAAG;AAAA,IACP;AACA,SAAK,KAAK,IAAI,GAAG,KAAK,OAAO;AAAA,EACjC;AAAA,EAEA,SAAS,SAAiC;AACtC,SAAK,GAAG,SAAS,OAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAQ,MAAc;AACxB,WAAO,MAAM,KAAK,GAAG,IAAI,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAgB,MAA+B;AAClD,WAAO,OAAO,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,QAAwB;AACzB,WAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAgB,QAAmC;AACvD,WAAO,OAAO,QAAQ,UAAU,IAAI,KAAK,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAiB,SAAyB;AAC9C,WAAO,OAAO,SAAS,SAAS,KAAK,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,QAAgB,MAAqC;AACvD,WAAO,KAAK,QAAQ,MAAM,KAAK,OAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAgB,QAAgB,MAAiC;AACrE,WAAO,OAAO,QAAQ,QAAQ,MAAM,KAAK,OAAO;AAAA,EACnD;AACJ;","names":["path","fs","vm","bak","module"]}
package/dist/database.mjs CHANGED
@@ -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) => {
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elit",
3
- "version": "3.3.8",
3
+ "version": "3.3.9",
4
4
  "description": "Optimized lightweight library for creating DOM elements with reactive state",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
package/src/database.ts CHANGED
@@ -18,7 +18,9 @@ class VM {
18
18
  private pkgScriptDB: { dependencies?: Record<string, string> } = {};
19
19
  private language: 'ts' | 'js';
20
20
  private _registerModules: { [key: string]: any };
21
+ private options: VMOptions;
21
22
  constructor(options?: VMOptions) {
23
+ this.options = options || {};
22
24
  // Set directories based on options or defaults
23
25
  this.DATABASE_DIR = options?.dir || path.join(process.cwd(), 'databases');
24
26
  this.SCRIPTDB_DIR = process.cwd();
@@ -252,7 +254,7 @@ class VM {
252
254
  console: customConsole
253
255
  });
254
256
 
255
- const systemModules = await SystemModuleResolver();
257
+ const systemModules = await SystemModuleResolver(this.options);
256
258
  this.register(systemModules);
257
259
 
258
260
  const js = this.transpiler(code, { loader: this.language, format: 'cjs' }).code;
@@ -656,15 +658,21 @@ function isIdentifier(key: any) {
656
658
  return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);
657
659
  }
658
660
 
659
- async function SystemModuleResolver() {
661
+ async function SystemModuleResolver(customOptions?: VMOptions) {
660
662
 
661
663
  const moduleRegistry = new Map<string, any>();
662
664
 
663
- moduleRegistry.set("update", update);
664
- moduleRegistry.set("remove", remove);
665
- moduleRegistry.set("create", create);
666
- moduleRegistry.set("save", save);
667
- moduleRegistry.set("read", read);
665
+ // Wrap functions to automatically pass customOptions when called from within VM
666
+ moduleRegistry.set("update", (dbName: string, fnName: string, code: string | Function) =>
667
+ update(dbName, fnName, code, customOptions));
668
+ moduleRegistry.set("remove", (dbName: string, fnName: string) =>
669
+ remove(dbName, fnName, customOptions));
670
+ moduleRegistry.set("create", (dbName: string, code: string | Function) =>
671
+ create(dbName, code, customOptions));
672
+ moduleRegistry.set("save", (dbName: string, code: string | Function | any) =>
673
+ save(dbName, code, customOptions));
674
+ moduleRegistry.set("read", (dbName: string) =>
675
+ read(dbName, customOptions));
668
676
 
669
677
  const context: Record<string, any> = {
670
678
  // Add require-like functionality