@open-mercato/cli 0.4.4-canary-8eeaebdd84 → 0.4.4-canary-e6eb0baecb

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/bin.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { run } from "./mercato.js";
3
- const BOOTSTRAP_FREE_COMMANDS = ["generate", "db", "init", "eject", "help", "--help", "-h"];
3
+ const BOOTSTRAP_FREE_COMMANDS = ["generate", "db", "init", "help", "--help", "-h"];
4
4
  function needsBootstrap(argv) {
5
5
  const [, , first] = argv;
6
6
  if (!first) return false;
package/dist/bin.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/bin.ts"],
4
- "sourcesContent": ["/**\n * CLI binary entry point for @open-mercato/cli package.\n *\n * Called from within a Next.js app directory as: yarn mercato <command>\n * Uses dynamic app resolution to find generated files at .mercato/generated/\n */\nimport { run } from './mercato.js'\n\n// Commands that can run without bootstrap (without generated files)\n// - generate: creates the generated files\n// - db: uses resolver directly to find modules and migrations\n// - init: runs yarn commands to set up the app\n// - help: just shows help text\nconst BOOTSTRAP_FREE_COMMANDS = ['generate', 'db', 'init', 'eject', 'help', '--help', '-h']\n\nfunction needsBootstrap(argv: string[]): boolean {\n const [, , first] = argv\n if (!first) return false // help screen\n return !BOOTSTRAP_FREE_COMMANDS.includes(first)\n}\n\nasync function tryBootstrap(): Promise<boolean> {\n try {\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const { registerCliModules } = await import('./mercato.js')\n // Use the CLI resolver to find the app directory (handles monorepo detection)\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n const data = await bootstrapFromAppRoot(appDir)\n // Register CLI modules directly to avoid module resolution issues\n registerCliModules(data.modules)\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n // Check if the error is about missing generated files\n if (\n message.includes('Cannot find module') &&\n (message.includes('/generated/') || message.includes('.generated') || message.includes('.mercato'))\n ) {\n return false\n }\n // Re-throw other errors\n throw err\n }\n}\n\nasync function main(): Promise<void> {\n const requiresBootstrap = needsBootstrap(process.argv)\n\n if (requiresBootstrap) {\n const bootstrapSucceeded = await tryBootstrap()\n if (!bootstrapSucceeded) {\n console.error('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.error('\u2551 Generated files not found! \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 The CLI requires generated files to discover modules. \u2551')\n console.error('\u2551 Please run the following command first: \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 yarn mercato generate \u2551')\n console.error('\u2551 \u2551')\n console.error('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n process.exit(1)\n }\n }\n\n const code = await run(process.argv)\n process.exit(code ?? 0)\n}\n\nmain().catch((e) => {\n console.error(e)\n process.exit(1)\n})\n"],
5
- "mappings": "AAMA,SAAS,WAAW;AAOpB,MAAM,0BAA0B,CAAC,YAAY,MAAM,QAAQ,SAAS,QAAQ,UAAU,IAAI;AAE1F,SAAS,eAAe,MAAyB;AAC/C,QAAM,CAAC,EAAE,EAAE,KAAK,IAAI;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,wBAAwB,SAAS,KAAK;AAChD;AAEA,eAAe,eAAiC;AAC9C,MAAI;AACF,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,kDAAkD;AAChG,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,cAAc;AAE1D,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAC3D,UAAM,WAAW,eAAe;AAChC,UAAM,SAAS,SAAS,UAAU;AAClC,UAAM,OAAO,MAAM,qBAAqB,MAAM;AAE9C,uBAAmB,KAAK,OAAO;AAC/B,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,QACE,QAAQ,SAAS,oBAAoB,MACpC,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,UAAU,IACjG;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,OAAsB;AACnC,QAAM,oBAAoB,eAAe,QAAQ,IAAI;AAErD,MAAI,mBAAmB;AACrB,UAAM,qBAAqB,MAAM,aAAa;AAC9C,QAAI,CAAC,oBAAoB;AACvB,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,IAAI,QAAQ,IAAI;AACnC,UAAQ,KAAK,QAAQ,CAAC;AACxB;AAEA,KAAK,EAAE,MAAM,CAAC,MAAM;AAClB,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AAChB,CAAC;",
4
+ "sourcesContent": ["/**\n * CLI binary entry point for @open-mercato/cli package.\n *\n * Called from within a Next.js app directory as: yarn mercato <command>\n * Uses dynamic app resolution to find generated files at .mercato/generated/\n */\nimport { run } from './mercato.js'\n\n// Commands that can run without bootstrap (without generated files)\n// - generate: creates the generated files\n// - db: uses resolver directly to find modules and migrations\n// - init: runs yarn commands to set up the app\n// - help: just shows help text\nconst BOOTSTRAP_FREE_COMMANDS = ['generate', 'db', 'init', 'help', '--help', '-h']\n\nfunction needsBootstrap(argv: string[]): boolean {\n const [, , first] = argv\n if (!first) return false // help screen\n return !BOOTSTRAP_FREE_COMMANDS.includes(first)\n}\n\nasync function tryBootstrap(): Promise<boolean> {\n try {\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const { registerCliModules } = await import('./mercato.js')\n // Use the CLI resolver to find the app directory (handles monorepo detection)\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n const data = await bootstrapFromAppRoot(appDir)\n // Register CLI modules directly to avoid module resolution issues\n registerCliModules(data.modules)\n return true\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n // Check if the error is about missing generated files\n if (\n message.includes('Cannot find module') &&\n (message.includes('/generated/') || message.includes('.generated') || message.includes('.mercato'))\n ) {\n return false\n }\n // Re-throw other errors\n throw err\n }\n}\n\nasync function main(): Promise<void> {\n const requiresBootstrap = needsBootstrap(process.argv)\n\n if (requiresBootstrap) {\n const bootstrapSucceeded = await tryBootstrap()\n if (!bootstrapSucceeded) {\n console.error('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.error('\u2551 Generated files not found! \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 The CLI requires generated files to discover modules. \u2551')\n console.error('\u2551 Please run the following command first: \u2551')\n console.error('\u2551 \u2551')\n console.error('\u2551 yarn mercato generate \u2551')\n console.error('\u2551 \u2551')\n console.error('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n process.exit(1)\n }\n }\n\n const code = await run(process.argv)\n process.exit(code ?? 0)\n}\n\nmain().catch((e) => {\n console.error(e)\n process.exit(1)\n})\n"],
5
+ "mappings": "AAMA,SAAS,WAAW;AAOpB,MAAM,0BAA0B,CAAC,YAAY,MAAM,QAAQ,QAAQ,UAAU,IAAI;AAEjF,SAAS,eAAe,MAAyB;AAC/C,QAAM,CAAC,EAAE,EAAE,KAAK,IAAI;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,wBAAwB,SAAS,KAAK;AAChD;AAEA,eAAe,eAAiC;AAC9C,MAAI;AACF,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,kDAAkD;AAChG,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,cAAc;AAE1D,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAC3D,UAAM,WAAW,eAAe;AAChC,UAAM,SAAS,SAAS,UAAU;AAClC,UAAM,OAAO,MAAM,qBAAqB,MAAM;AAE9C,uBAAmB,KAAK,OAAO;AAC/B,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,QACE,QAAQ,SAAS,oBAAoB,MACpC,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,UAAU,IACjG;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,OAAsB;AACnC,QAAM,oBAAoB,eAAe,QAAQ,IAAI;AAErD,MAAI,mBAAmB;AACrB,UAAM,qBAAqB,MAAM,aAAa;AAC9C,QAAI,CAAC,oBAAoB;AACvB,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gFAAsE;AACpF,cAAQ,MAAM,iFAAuE;AACrF,cAAQ,MAAM,gaAAuE;AACrF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,IAAI,QAAQ,IAAI;AACnC,UAAQ,KAAK,QAAQ,CAAC;AACxB;AAEA,KAAK,EAAE,MAAM,CAAC,MAAM;AAClB,UAAQ,MAAM,CAAC;AACf,UAAQ,KAAK,CAAC;AAChB,CAAC;",
6
6
  "names": []
7
7
  }
package/dist/mercato.js CHANGED
@@ -389,43 +389,6 @@ async function run(argv = process.argv) {
389
389
  return 1;
390
390
  }
391
391
  }
392
- if (first === "eject") {
393
- try {
394
- const { createResolver } = await import("./lib/resolver.js");
395
- const { listEjectableModules, ejectModule } = await import("./lib/eject.js");
396
- const resolver = createResolver();
397
- const isList = second === "--list" || second === "-l";
398
- const moduleId = !isList ? second : void 0;
399
- if (isList || !moduleId) {
400
- const ejectable = listEjectableModules(resolver);
401
- if (ejectable.length === 0) {
402
- console.log("No ejectable modules found.");
403
- } else {
404
- console.log("Ejectable modules:\n");
405
- for (const mod2 of ejectable) {
406
- const desc = mod2.description ? ` \u2014 ${mod2.description}` : "";
407
- console.log(` ${mod2.id} (from: ${mod2.from})${desc}`);
408
- }
409
- console.log("\nUsage: yarn mercato eject <moduleId>");
410
- }
411
- return 0;
412
- }
413
- console.log(`Ejecting module "${moduleId}"...`);
414
- ejectModule(resolver, moduleId);
415
- console.log(`
416
- \u2705 Module "${moduleId}" ejected successfully!
417
- `);
418
- console.log("Next steps:");
419
- console.log(" 1. Run generators: yarn mercato generate all");
420
- console.log(` 2. Customize: edit src/modules/${moduleId}/`);
421
- console.log(" 3. Start dev: yarn dev");
422
- return 0;
423
- } catch (error) {
424
- const message = error instanceof Error ? error.message : String(error);
425
- console.error(`\u274C Eject failed: ${message}`);
426
- return 1;
427
- }
428
- }
429
392
  let modName = first;
430
393
  let cmdName = second;
431
394
  let rest = remaining;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/mercato.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: Generated files and DI container are imported statically to avoid ESM/CJS interop issues.\n// Commands that need to run before generation (e.g., `init`) handle missing modules gracefully.\n\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { runWorker } from '@open-mercato/queue/worker'\nimport type { Module } from '@open-mercato/shared/modules/registry'\nimport { getCliModules, hasCliModules, registerCliModules } from './registry'\nexport { getCliModules, hasCliModules, registerCliModules }\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { resolveInitDerivedSecrets } from './lib/init-secrets'\nimport type { ChildProcess } from 'node:child_process'\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nlet envLoaded = false\n\nasync function ensureEnvLoaded() {\n if (envLoaded) return\n envLoaded = true\n\n // Try to find and load .env from the app directory\n // First, try to find the app directory via resolver\n try {\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // Load .env from app directory if it exists\n const envPath = path.join(appDir, '.env')\n if (fs.existsSync(envPath)) {\n const dotenv = await import('dotenv')\n dotenv.config({ path: envPath })\n return\n }\n } catch {\n // Resolver might fail during early init, fall back to default behavior\n }\n\n // Fall back to default dotenv behavior (loads from cwd)\n try {\n await import('dotenv/config')\n } catch {}\n}\n\n// Helper to run a CLI command directly (without spawning a process)\nasync function runModuleCommand(\n allModules: Module[],\n moduleName: string,\n commandName: string,\n args: string[] = [],\n options: { optional?: boolean } = {},\n): Promise<void> {\n const mod = allModules.find((m) => m.id === moduleName)\n if (!mod) {\n if (options.optional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 module not enabled`)\n return\n }\n throw new Error(`Module not found: \"${moduleName}\"`)\n }\n if (!mod.cli || mod.cli.length === 0) {\n if (options.optional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 module has no CLI commands`)\n return\n }\n throw new Error(`Module \"${moduleName}\" has no CLI commands`)\n }\n const cmd = mod.cli.find((c) => c.command === commandName)\n if (!cmd) {\n if (options.optional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 command not found`)\n return\n }\n throw new Error(`Command \"${commandName}\" not found in module \"${moduleName}\"`)\n }\n await cmd.run(args)\n}\n\n// Build all CLI modules (registered + built-in)\nasync function buildAllModules(): Promise<Module[]> {\n const modules = getCliModules()\n\n // Load optional app-level CLI commands\n let appCli: any[] = []\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch {}\n\n const all = modules.slice()\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n return all\n}\n\nexport async function run(argv = process.argv) {\n await ensureEnvLoaded()\n const [, , ...parts] = argv\n const [first, second, ...remaining] = parts\n \n // Handle init command directly\n if (first === 'init') {\n const { execSync } = await import('child_process')\n\n console.log('\uD83D\uDE80 Initializing Open Mercato app...\\n')\n\n try {\n const initArgs = parts.slice(1).filter(Boolean)\n const reinstall = initArgs.includes('--reinstall') || initArgs.includes('-r')\n process.env.OM_INIT_FLOW = 'true'\n if (reinstall) {\n process.env.OM_INIT_REINSTALL = 'true'\n } else if (process.env.OM_INIT_REINSTALL) {\n delete process.env.OM_INIT_REINSTALL\n }\n const skipExamples = initArgs.includes('--no-examples') || initArgs.includes('--no-exampls')\n const stressTestEnabled =\n initArgs.includes('--stresstest') || initArgs.includes('--stress-test')\n const stressTestLite =\n initArgs.includes('--lite') ||\n initArgs.includes('--stress-lite') ||\n initArgs.some((arg) => arg.startsWith('--payload=lite') || arg.startsWith('--mode=lite'))\n let stressTestCount = 6000\n for (let i = 0; i < initArgs.length; i += 1) {\n const arg = initArgs[i]\n const countPrefixes = ['--count=', '--stress-count=', '--stresstest-count=']\n const matchedPrefix = countPrefixes.find((prefix) => arg.startsWith(prefix))\n if (matchedPrefix) {\n const value = arg.slice(matchedPrefix.length)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n if (arg === '--count' || arg === '--stress-count' || arg === '--stresstest-count' || arg === '-n') {\n const next = initArgs[i + 1]\n if (next && !next.startsWith('-')) {\n const parsed = Number.parseInt(next, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n if (arg.startsWith('-n=')) {\n const value = arg.slice(3)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n console.log(`\uD83D\uDD04 Reinstall mode: ${reinstall ? 'enabled' : 'disabled'}`)\n console.log(`\uD83C\uDFA8 Example content: ${skipExamples ? 'skipped (--no-examples)' : 'enabled'}`)\n console.log(\n `\uD83C\uDFCB\uFE0F Stress test dataset: ${\n stressTestEnabled\n ? `enabled (target ${stressTestCount} contacts${stressTestLite ? ', lite payload' : ''})`\n : 'disabled'\n }`\n )\n\n if (reinstall) {\n // Load env variables so DATABASE_URL is available\n await ensureEnvLoaded()\n console.log('\u267B\uFE0F Reinstall mode enabled: dropping all database tables...')\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n if (!dbUrl) {\n console.error('DATABASE_URL is not set. Aborting reinstall.')\n return 1\n }\n const client = new Client({ connectionString: dbUrl })\n try {\n await client.connect()\n // Collect all user tables in public schema\n const res = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = 'public'`)\n const dropTargets = new Set<string>((res.rows || []).map((r: any) => String(r.tablename)))\n for (const forced of ['vector_search', 'vector_search_migrations']) {\n const exists = await client.query(\n `SELECT to_regclass($1) AS regclass`,\n [`public.${forced}`],\n )\n const regclass = (exists as { rows?: Array<{ regclass: string | null }> }).rows?.[0]?.regclass ?? null\n if (regclass) {\n dropTargets.add(forced)\n }\n }\n if (dropTargets.size === 0) {\n console.log(' No tables found in public schema.')\n } else {\n let dropped = 0\n await client.query('BEGIN')\n try {\n for (const t of dropTargets) {\n await client.query(`DROP TABLE IF EXISTS \"${t}\" CASCADE`)\n dropped += 1\n }\n await client.query('COMMIT')\n console.log(` Dropped ${dropped} tables.`)\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n }\n }\n } finally {\n try { await client.end() } catch {}\n }\n // Also flush Redis\n try {\n const Redis = (await import('ioredis')).default\n const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379'\n const redis = new Redis(redisUrl)\n await redis.flushall()\n await redis.quit()\n console.log(' Redis flushed.')\n } catch {}\n console.log('\u2705 Database cleared. Proceeding with fresh initialization...\\n')\n }\n\n // Step 1: Run generators directly (no process spawn)\n console.log('\uD83D\uDD27 Preparing modules (registry, entities, DI)...')\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds, generateModuleRegistry, generateModuleRegistryCli, generateModuleEntities, generateModuleDi, generateOpenApi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: true })\n await generateModuleRegistry({ resolver, quiet: true })\n await generateModuleRegistryCli({ resolver, quiet: true })\n await generateModuleEntities({ resolver, quiet: true })\n await generateModuleDi({ resolver, quiet: true })\n await generateOpenApi({ resolver, quiet: true })\n console.log('\u2705 Modules prepared\\n')\n\n // Step 3: Apply database migrations directly\n console.log('\uD83D\uDCCA Applying database migrations...')\n const { dbMigrate } = await import('./lib/db')\n await dbMigrate(resolver)\n console.log('\u2705 Migrations applied\\n')\n\n // Step 4: Bootstrap to register modules and entity IDs\n // Use the shared dynamicLoader which compiles TypeScript files on-the-fly\n console.log('\uD83D\uDD17 Bootstrapping application...')\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const bootstrapData = await bootstrapFromAppRoot(resolver.getAppDir())\n // Register CLI modules directly (bootstrapFromAppRoot returns the data for this purpose)\n registerCliModules(bootstrapData.modules)\n console.log('\u2705 Bootstrap complete\\n')\n\n // Step 5: Build all modules for CLI commands\n const allModules = await buildAllModules()\n\n // Step 6: Restore configuration defaults\n console.log('\u2699\uFE0F Restoring module defaults...')\n await runModuleCommand(allModules, 'configs', 'restore-defaults', [])\n console.log('\u2705 Module defaults restored\\n')\n\n // Step 7: Setup RBAC (tenant/org, users, ACLs)\n const findArgValue = (names: string[], fallback: string) => {\n for (const name of names) {\n const match = initArgs.find((arg) => arg.startsWith(name))\n if (match) {\n const value = match.slice(name.length)\n if (value) return value\n }\n }\n return fallback\n }\n const readEnvDefault = (key: string) => {\n const value = process.env[key]\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n return undefined\n }\n const defaultEmail = readEnvDefault('OM_INIT_SUPERADMIN_EMAIL') ?? 'superadmin@acme.com'\n const defaultPassword = readEnvDefault('OM_INIT_SUPERADMIN_PASSWORD') ?? 'secret'\n const orgName = findArgValue(['--org=', '--orgName='], 'Acme Corp')\n const email = findArgValue(['--email='], defaultEmail)\n const password = findArgValue(['--password='], defaultPassword)\n const derivedSecrets = resolveInitDerivedSecrets({ email, env: process.env })\n const adminEmailDerived = derivedSecrets.adminEmail\n const employeeEmailDerived = derivedSecrets.employeeEmail\n if (adminEmailDerived && derivedSecrets.adminPassword) {\n process.env.OM_INIT_ADMIN_PASSWORD = derivedSecrets.adminPassword\n }\n if (employeeEmailDerived && derivedSecrets.employeePassword) {\n process.env.OM_INIT_EMPLOYEE_PASSWORD = derivedSecrets.employeePassword\n }\n const roles = findArgValue(['--roles='], 'superadmin,admin,employee')\n const skipPasswordPolicyRaw = initArgs.find((arg) =>\n arg === '--skip-password-policy' ||\n arg.startsWith('--skip-password-policy=') ||\n arg === '--allow-weak-password' ||\n arg.startsWith('--allow-weak-password=')\n )\n const skipPasswordPolicy = skipPasswordPolicyRaw\n ? parseBooleanToken(skipPasswordPolicyRaw.split('=')[1] ?? 'true') ?? true\n : true\n\n console.log('\uD83D\uDD10 Setting up RBAC and users...')\n // Run auth setup command via CLI\n const setupArgs = [\n '--orgName', orgName,\n '--email', email,\n '--password', password,\n '--roles', roles,\n ]\n if (skipPasswordPolicy) {\n setupArgs.push('--skip-password-policy')\n }\n await runModuleCommand(allModules, 'auth', 'setup', setupArgs)\n // Query DB to get tenant/org IDs using pg directly\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n const pgClient = new Client({ connectionString: dbUrl })\n await pgClient.connect()\n const orgResult = await pgClient.query(\n `SELECT o.id as org_id, o.tenant_id FROM organizations o\n JOIN users u ON u.organization_id = o.id\n LIMIT 1`\n )\n await pgClient.end()\n const tenantId = orgResult?.rows?.[0]?.tenant_id ?? null\n const orgId = orgResult?.rows?.[0]?.org_id ?? null\n if (!tenantId || !orgId) {\n throw new Error('Auth setup failed to create a tenant/org. Aborting init.')\n }\n console.log('\u2705 RBAC setup complete:', { tenantId, organizationId: orgId }, '\\n')\n\n console.log('\uD83C\uDF9B\uFE0F Seeding feature toggle defaults...')\n await runModuleCommand(allModules, 'feature_toggles', 'seed-defaults', [])\n console.log('\uD83C\uDF9B\uFE0F \u2705 Feature toggle defaults seeded\\n')\n\n if (tenantId) {\n console.log('\uD83D\uDC65 Seeding tenant-scoped roles...')\n await runModuleCommand(allModules, 'auth', 'seed-roles', ['--tenant', tenantId])\n console.log('\uD83D\uDEE1\uFE0F \u2705 Roles seeded\\n')\n } else {\n console.log('\u26A0\uFE0F Skipping role seeding because tenant ID was not available.\\n')\n }\n\n if (orgId && tenantId) {\n if (reinstall) {\n console.log('\uD83E\uDDE9 Reinstalling custom field definitions...')\n await runModuleCommand(allModules, 'entities', 'reinstall', ['--tenant', tenantId])\n console.log('\uD83E\uDDE9 \u2705 Custom field definitions reinstalled\\n')\n }\n\n const parsedEncryption = parseBooleanToken(process.env.TENANT_DATA_ENCRYPTION ?? 'yes')\n const encryptionEnabled = parsedEncryption === null ? true : parsedEncryption\n if (encryptionEnabled) {\n console.log('\uD83D\uDD12 Seeding encryption defaults...')\n await runModuleCommand(allModules, 'entities', 'seed-encryption', ['--tenant', tenantId, '--org', orgId])\n console.log('\uD83D\uDD12 \u2705 Encryption defaults seeded\\n')\n } else {\n console.log('\u26A0\uFE0F TENANT_DATA_ENCRYPTION disabled; skipping encryption defaults.\\n')\n }\n\n // Seed module defaults (structural data: dictionaries, tax rates, units, etc.)\n console.log('\uD83D\uDCDA Seeding module defaults...')\n const seedContainer = await createRequestContainer()\n const seedEm = seedContainer.resolve('em') as any\n const seedCtx = { em: seedEm, tenantId, organizationId: orgId, container: seedContainer }\n for (const mod of allModules) {\n if (mod.setup?.seedDefaults) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedDefaults(seedCtx)\n }\n }\n console.log('\u2705 Module defaults seeded\\n')\n\n if (skipExamples) {\n console.log('\uD83D\uDEAB Example data seeding skipped (--no-examples)\\n')\n } else {\n // Seed example data (demo products, customers, orders, etc.)\n console.log('\uD83C\uDFA8 Seeding example data...')\n for (const mod of allModules) {\n if (mod.setup?.seedExamples) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedExamples(seedCtx)\n }\n }\n console.log('\u2705 Example data seeded\\n')\n }\n\n if (stressTestEnabled) {\n console.log(\n `\uD83C\uDFCB\uFE0F Seeding stress test customers${stressTestLite ? ' (lite payload)' : ''}...`\n )\n const stressArgs = ['--tenant', tenantId, '--org', orgId, '--count', String(stressTestCount)]\n if (stressTestLite) stressArgs.push('--lite')\n await runModuleCommand(allModules, 'customers', 'seed-stresstest', stressArgs, { optional: true })\n console.log(`\u2705 Stress test customers seeded (requested ${stressTestCount})\\n`)\n }\n\n console.log('\uD83E\uDDE9 Enabling default dashboard widgets...')\n await runModuleCommand(allModules, 'dashboards', 'seed-defaults', ['--tenant', tenantId], { optional: true })\n console.log('\u2705 Dashboard widgets enabled\\n')\n\n console.log('\uD83D\uDCCA Enabling analytics widgets for admin and employee roles...')\n await runModuleCommand(allModules, 'dashboards', 'enable-analytics-widgets', [\n '--tenant',\n tenantId,\n '--roles',\n 'admin,employee',\n ])\n console.log('\u2705 Analytics widgets enabled for roles\\n')\n\n } else {\n console.log('\u26A0\uFE0F Could not get organization ID or tenant ID, skipping seeding steps\\n')\n }\n\n console.log('\uD83E\uDDE0 Building search indexes...')\n const vectorArgs = tenantId\n ? ['--tenant', tenantId, ...(orgId ? ['--org', orgId] : [])]\n : ['--purgeFirst=false']\n await runModuleCommand(allModules, 'search', 'reindex', vectorArgs, { optional: true })\n console.log('\u2705 Search indexes built\\n')\n\n console.log('\uD83D\uDD0D Rebuilding query indexes...')\n const queryIndexArgs = ['--force', ...(tenantId ? ['--tenant', tenantId] : [])]\n await runModuleCommand(allModules, 'query_index', 'reindex', queryIndexArgs, { optional: true })\n console.log('\u2705 Query indexes rebuilt\\n')\n\n const adminPasswordOverride = derivedSecrets.adminPassword\n const employeePasswordOverride = derivedSecrets.employeePassword\n const createdUsers: Array<{ label: string; icon: string; email: string }> = []\n const createdPasswords = new Map<string, string>()\n const pushUser = (label: string, icon: string, value: string | null, passwordValue: string) => {\n if (!value) return\n if (createdUsers.some((entry) => entry.email.toLowerCase() === value.toLowerCase())) return\n createdUsers.push({ label, icon, email: value })\n createdPasswords.set(value.toLowerCase(), passwordValue)\n }\n pushUser('Superadmin', '\uD83D\uDC51', email, password)\n pushUser('Admin', '\uD83E\uDDF0', adminEmailDerived, adminPasswordOverride ?? password)\n pushUser('Employee', '\uD83D\uDC77', employeeEmailDerived, employeePasswordOverride ?? password)\n\n // Simplified success message: we know which users were created\n console.log('\uD83C\uDF89 App initialization complete!\\n')\n console.log('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.log('\u2551 \uD83D\uDE80 You\\'re now ready to start development! \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Start the dev server: \u2551')\n console.log('\u2551 yarn dev \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Users created: \u2551')\n for (const entry of createdUsers) {\n const label = `${entry.icon} ${entry.label}:`\n const labelPad = label.padEnd(13)\n const entryPassword = createdPasswords.get(entry.email.toLowerCase()) ?? password\n console.log(`\u2551 ${labelPad}${entry.email.padEnd(42)} \u2551`)\n console.log(`\u2551 Password: ${entryPassword.padEnd(44)} \u2551`)\n }\n console.log('\u2551 \u2551')\n console.log('\u2551 Happy coding! \u2551')\n console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n\n return 0\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error('\u274C Initialization failed:', error.message)\n } else {\n console.error('\u274C Initialization failed:', error)\n }\n return 1\n }\n }\n\n // Handle eject command directly (bootstrap-free)\n if (first === 'eject') {\n try {\n const { createResolver } = await import('./lib/resolver')\n const { listEjectableModules, ejectModule } = await import('./lib/eject')\n const resolver = createResolver()\n\n const isList = second === '--list' || second === '-l'\n const moduleId = !isList ? second : undefined\n\n if (isList || !moduleId) {\n const ejectable = listEjectableModules(resolver)\n if (ejectable.length === 0) {\n console.log('No ejectable modules found.')\n } else {\n console.log('Ejectable modules:\\n')\n for (const mod of ejectable) {\n const desc = mod.description ? ` \u2014 ${mod.description}` : ''\n console.log(` ${mod.id} (from: ${mod.from})${desc}`)\n }\n console.log('\\nUsage: yarn mercato eject <moduleId>')\n }\n return 0\n }\n\n console.log(`Ejecting module \"${moduleId}\"...`)\n ejectModule(resolver, moduleId)\n console.log(`\\n\u2705 Module \"${moduleId}\" ejected successfully!\\n`)\n console.log('Next steps:')\n console.log(' 1. Run generators: yarn mercato generate all')\n console.log(` 2. Customize: edit src/modules/${moduleId}/`)\n console.log(' 3. Start dev: yarn dev')\n return 0\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\u274C Eject failed: ${message}`)\n return 1\n }\n }\n\n let modName = first\n let cmdName = second\n let rest = remaining\n\n if (first === 'reindex') {\n modName = 'query_index'\n cmdName = 'reindex'\n rest = second !== undefined ? [second, ...remaining] : remaining\n }\n\n // Handle 'mercato generate' without subcommand - default to 'generate all'\n if (first === 'generate' && !second) {\n cmdName = 'all'\n rest = remaining\n }\n\n // Load modules from registered CLI modules\n const modules = getCliModules()\n \n // Load optional app-level CLI commands lazily without static import resolution\n let appCli: any[] = []\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch {}\n const all = modules.slice()\n \n // Built-in CLI module: queue\n all.push({\n id: 'queue',\n cli: [\n {\n command: 'worker',\n run: async (args: string[]) => {\n const isAllQueues = args.includes('--all')\n const queueName = isAllQueues ? null : args[0]\n\n // Collect all discovered workers from modules\n type WorkerEntry = {\n id: string\n queue: string\n concurrency: number\n handler: (job: unknown, ctx: unknown) => Promise<void> | void\n }\n const allWorkers: WorkerEntry[] = []\n for (const mod of getCliModules()) {\n const modWorkers = (mod as { workers?: WorkerEntry[] }).workers\n if (modWorkers) {\n allWorkers.push(...modWorkers)\n }\n }\n const discoveredQueues = [...new Set(allWorkers.map((w) => w.queue))]\n\n if (!queueName && !isAllQueues) {\n console.error('Usage: mercato queue worker <queueName> | --all')\n console.error('Example: mercato queue worker events')\n console.error('Example: mercato queue worker --all')\n if (discoveredQueues.length > 0) {\n console.error(`Discovered queues: ${discoveredQueues.join(', ')}`)\n }\n return\n }\n\n const concurrencyArg = args.find((a) => a.startsWith('--concurrency='))\n const concurrencyOverride = concurrencyArg ? Number(concurrencyArg.split('=')[1]) : undefined\n\n if (isAllQueues) {\n // Run workers for all discovered queues\n if (discoveredQueues.length === 0) {\n console.error('[worker] No queues discovered from modules')\n return\n }\n\n const container = await createRequestContainer()\n console.log(`[worker] Starting workers for all queues: ${discoveredQueues.join(', ')}`)\n\n // Start all queue workers in background mode\n const workerPromises = discoveredQueues.map(async (queue) => {\n const queueWorkers = allWorkers.filter((w) => w.queue === queue)\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Starting \"${queue}\" with ${queueWorkers.length} handler(s), concurrency: ${concurrency}`)\n\n await runWorker({\n queueName: queue,\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n concurrency,\n background: true,\n handler: async (job, ctx) => {\n for (const worker of queueWorkers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n },\n })\n })\n\n await Promise.all(workerPromises)\n\n console.log('[worker] All workers started. Press Ctrl+C to stop')\n\n // Keep the process alive\n await new Promise(() => {})\n } else {\n // Find workers for this specific queue\n const queueWorkers = allWorkers.filter((w) => w.queue === queueName)\n\n if (queueWorkers.length > 0) {\n // Use discovered workers\n const container = await createRequestContainer()\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Found ${queueWorkers.length} worker(s) for queue \"${queueName}\"`)\n\n await runWorker({\n queueName: queueName!,\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n concurrency,\n handler: async (job, ctx) => {\n for (const worker of queueWorkers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n },\n })\n } else {\n console.error(`No workers found for queue \"${queueName}\"`)\n if (discoveredQueues.length > 0) {\n console.error(`Available queues: ${discoveredQueues.join(', ')}`)\n }\n }\n }\n },\n },\n {\n command: 'clear',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue clear <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n })\n : createQueue(queueName, 'local')\n\n const res = await queue.clear()\n await queue.close()\n console.log(`Cleared queue \"${queueName}\", removed ${res.removed} jobs`)\n },\n },\n {\n command: 'status',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue status <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n })\n : createQueue(queueName, 'local')\n\n const counts = await queue.getJobCounts()\n console.log(`Queue \"${queueName}\" status:`)\n console.log(` Waiting: ${counts.waiting}`)\n console.log(` Active: ${counts.active}`)\n console.log(` Completed: ${counts.completed}`)\n console.log(` Failed: ${counts.failed}`)\n await queue.close()\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: events\n all.push({\n id: 'events',\n cli: [\n {\n command: 'emit',\n run: async (args: string[]) => {\n const eventName = args[0]\n if (!eventName) {\n console.error('Usage: mercato events emit <event> [jsonPayload] [--persistent|-p]')\n return\n }\n const persistent = args.includes('--persistent') || args.includes('-p')\n const payloadArg = args[1] && !args[1].startsWith('--') ? args[1] : undefined\n let payload: any = {}\n if (payloadArg) {\n try { payload = JSON.parse(payloadArg) } catch { payload = payloadArg }\n }\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n await bus.emit(eventName, payload, { persistent })\n console.log(`Emitted \"${eventName}\"${persistent ? ' (persistent)' : ''}`)\n },\n },\n {\n command: 'clear',\n run: async () => {\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n const res = await bus.clearQueue()\n console.log(`Cleared events queue, removed ${res.removed} events`)\n },\n },\n ],\n } as any)\n \n // Built-in CLI module: scaffold\n all.push({\n id: 'scaffold',\n cli: [\n {\n command: 'module',\n run: async (args: string[]) => {\n const name = (args[0] || '').trim()\n if (!name) {\n console.error('Usage: mercato scaffold module <name>')\n return\n }\n const fs = await import('node:fs')\n const path = await import('node:path')\n const { execSync } = await import('node:child_process')\n const base = path.resolve('src/modules', name)\n const folders = ['api', 'backend', 'frontend', 'data', 'subscribers']\n for (const f of folders) fs.mkdirSync(path.join(base, f), { recursive: true })\n const moduleTitle = `${name[0].toUpperCase()}${name.slice(1)}`\n const indexTs = `export const metadata = { title: '${moduleTitle}', group: 'Modules' }\\n`\n fs.writeFileSync(path.join(base, 'index.ts'), indexTs, { flag: 'wx' })\n const ceTs = `export const entities = [\\n {\\n id: '${name}:sample',\\n label: '${moduleTitle} Sample',\\n description: 'Describe your custom entity',\\n showInSidebar: true,\\n fields: [\\n // { key: 'priority', kind: 'integer', label: 'Priority' },\\n ],\\n },\\n]\\n\\nexport default entities\\n`\n fs.writeFileSync(path.join(base, 'ce.ts'), ceTs, { flag: 'wx' })\n const entitiesTs = `import { Entity, PrimaryKey, Property } from '@mikro-orm/core'\\n\\n// Add your entities here. Example:\\n// @Entity({ tableName: '${name}_items' })\\n// export class ${moduleTitle}Item {\\n// @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' }) id!: string\\n// @Property({ type: 'text' }) title!: string\\n// @Property({ name: 'organization_id', type: 'uuid', nullable: true }) organizationId?: string | null\\n// @Property({ name: 'tenant_id', type: 'uuid', nullable: true }) tenantId?: string | null\\n// @Property({ name: 'created_at', type: Date, onCreate: () => new Date() }) createdAt: Date = new Date()\\n// @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() }) updatedAt: Date = new Date()\\n// @Property({ name: 'deleted_at', type: Date, nullable: true }) deletedAt?: Date | null\\n// }\\n`\n fs.writeFileSync(path.join(base, 'data', 'entities.ts'), entitiesTs, { flag: 'wx' })\n console.log(`Created module at ${path.relative(process.cwd(), base)}`)\n execSync('yarn modules:prepare', { stdio: 'inherit' })\n },\n },\n {\n command: 'entity',\n run: async () => {\n const fs = await import('node:fs')\n const path = await import('node:path')\n const readline = await import('node:readline/promises')\n const { stdin: input, stdout: output } = await import('node:process')\n const { execSync } = await import('node:child_process')\n const rl = readline.createInterface({ input, output })\n try {\n const moduleId = (await rl.question('Module id (folder under src/modules): ')).trim()\n const className = (await rl.question('Entity class name (e.g., Todo): ')).trim()\n const tableName = (await rl.question(`DB table name (default: ${className.toLowerCase()}s): `)).trim() || `${className.toLowerCase()}s`\n const extra = (await rl.question('Additional fields (comma list name:type, e.g., title:text,is_done:boolean): ')).trim()\n const extras = extra\n ? extra.split(',').map(s => s.trim()).filter(Boolean).map(s => {\n const [n,t] = s.split(':').map(x=>x.trim()); return { n, t }\n })\n : []\n const base = path.resolve('src/modules', moduleId, 'data')\n fs.mkdirSync(base, { recursive: true })\n const file = path.join(base, 'entities.ts')\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : `import { Entity, PrimaryKey, Property } from '@mikro-orm/core'\\n\\n`\n content += `\\n@Entity({ tableName: '${tableName}' })\\nexport class ${className} {\\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\\n id!: string\\n\\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\\n organizationId?: string | null\\n\\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\\n tenantId?: string | null\\n\\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\\n createdAt: Date = new Date()\\n\\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })\\n updatedAt: Date = new Date()\\n\\n @Property({ name: 'deleted_at', type: Date, nullable: true })\\n deletedAt?: Date | null\\n`\n for (const f of extras) {\n const n = f.n\n const t = f.t\n if (!n || !t) continue\n const map = {\n text: { ts: 'string', db: 'text' },\n multiline: { ts: 'string', db: 'text' },\n integer: { ts: 'number', db: 'int' },\n float: { ts: 'number', db: 'float' },\n boolean: { ts: 'boolean', db: 'boolean' },\n date: { ts: 'Date', db: 'Date' },\n } as const\n const info = map[t as keyof typeof map]\n const fallback = { ts: 'string', db: 'text' }\n const resolved = info || fallback\n const propName = n.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n const columnName = n.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`)\n const dbType = resolved.db\n const tsType = resolved.ts\n const defaultValue =\n resolved.ts === 'boolean' ? ' = false' :\n resolved.ts === 'Date' ? ' = new Date()' :\n ''\n content += `\\n @Property({ name: '${columnName}', type: ${dbType === 'Date' ? 'Date' : `'${dbType}'`}${resolved.ts === 'boolean' ? ', default: false' : ''} })\\n ${propName}${tsType === 'number' ? '?: number | null' : tsType === 'boolean' ? ': boolean' : tsType === 'Date' ? ': Date' : '!: string'}${defaultValue}\\n`\n }\n content += `}\\n`\n fs.writeFileSync(file, content)\n console.log(`Updated ${path.relative(process.cwd(), file)}`)\n console.log('Generating and applying migrations...')\n execSync('yarn modules:prepare', { stdio: 'inherit' })\n execSync('yarn db:generate', { stdio: 'inherit' })\n execSync('yarn db:migrate', { stdio: 'inherit' })\n } finally {\n rl.close()\n }\n },\n },\n {\n command: 'crud',\n run: async (args: string[]) => {\n const fs = await import('node:fs')\n const path = await import('node:path')\n const { execSync } = await import('node:child_process')\n const mod = (args[0] || '').trim()\n const entity = (args[1] || '').trim()\n const routeSeg = (args[2] || '').trim() || `${entity.toLowerCase()}s`\n if (!mod || !entity) {\n console.error('Usage: mercato scaffold crud <moduleId> <EntityClass> [routeSegment]')\n return\n }\n const baseDir = path.resolve('src/modules', mod, 'api', routeSeg)\n fs.mkdirSync(baseDir, { recursive: true })\n const entitySnake = entity.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()\n const tmpl = `import { z } from 'zod'\\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\\nimport { ${entity} } from '@open-mercato/shared/modules/${mod}/data/entities'\\nimport { E } from '#generated/entities.ids.generated'\\nimport ceEntities from '@open-mercato/shared/modules/${mod}/ce'\\nimport { buildCustomFieldSelectorsForEntity, extractCustomFieldsFromItem, buildCustomFieldFiltersFromQuery } from '@open-mercato/shared/lib/crud/custom-fields'\\nimport type { CustomFieldSet } from '@open-mercato/shared/modules/entities'\\n\\n// Field constants - update these based on your entity's actual fields\\nconst F = {\\n id: 'id',\\n tenant_id: 'tenant_id',\\n organization_id: 'organization_id',\\n created_at: 'created_at',\\n updated_at: 'updated_at',\\n deleted_at: 'deleted_at',\\n} as const\\n\\nconst querySchema = z.object({\\n id: z.string().uuid().optional(),\\n page: z.coerce.number().min(1).default(1),\\n pageSize: z.coerce.number().min(1).max(100).default(50),\\n sortField: z.string().optional().default('id'),\\n sortDir: z.enum(['asc','desc']).optional().default('asc'),\\n withDeleted: z.coerce.boolean().optional().default(false),\\n}).passthrough()\\n\\nconst createSchema = z.object({}).passthrough()\\nconst updateSchema = z.object({ id: z.string().uuid() }).passthrough()\\n\\ntype Query = z.infer<typeof querySchema>\\n\\nconst fieldSets: CustomFieldSet[] = []\\nconst ceEntity = Array.isArray(ceEntities) ? ceEntities.find((entity) => entity?.id === '${mod}:${entitySnake}') : undefined\\nif (ceEntity?.fields?.length) {\\n fieldSets.push({ entity: ceEntity.id, fields: ceEntity.fields, source: '${mod}' })\\n}\\n\\nconst cfSel = buildCustomFieldSelectorsForEntity(E.${mod}.${entitySnake}, fieldSets)\\nconst sortFieldMap: Record<string, unknown> = { id: F.id, created_at: F.created_at, ...Object.fromEntries(cfSel.keys.map(k => [\\`cf_\\${k}\\`, \\`cf:\\${k}\\`])) }\\n\\nexport const { metadata, GET, POST, PUT, DELETE } = makeCrudRoute({\\n metadata: { GET: { requireAuth: true }, POST: { requireAuth: true }, PUT: { requireAuth: true }, DELETE: { requireAuth: true } },\\n orm: { entity: ${entity}, idField: 'id', orgField: 'organizationId', tenantField: 'tenantId', softDeleteField: 'deletedAt' },\\n events: { module: '${mod}', entity: '${entitySnake}', persistent: true },\\n indexer: { entityType: E.${mod}.${entitySnake} },\\n list: {\\n schema: querySchema,\\n entityId: E.${mod}.${entitySnake},\\n fields: [F.id, F.created_at, ...cfSel.selectors],\\n sortFieldMap,\\n buildFilters: async (q: Query, ctx) => ({\\n ...(await buildCustomFieldFiltersFromQuery({\\n entityId: E.${mod}.${entitySnake},\\n query: q as any,\\n em: ctx.container.resolve('em'),\\n tenantId: ctx.auth!.tenantId,\\n })),\\n }),\\n transformItem: (item: any) => ({ id: item.id, created_at: item.created_at, ...extractCustomFieldsFromItem(item, cfSel.keys) }),\\n },\\n create: { schema: createSchema, mapToEntity: (input: any) => ({}), customFields: { enabled: true, entityId: E.${mod}.${entitySnake}, pickPrefixed: true } },\\n update: { schema: updateSchema, applyToEntity: (entity: ${entity}, input: any) => {}, customFields: { enabled: true, entityId: E.${mod}.${entitySnake}, pickPrefixed: true } },\\n del: { idFrom: 'query', softDelete: true },\\n})\\n`\n const file = path.join(baseDir, 'route.ts')\n fs.writeFileSync(file, tmpl, { flag: 'wx' })\n console.log(`Created CRUD route: ${path.relative(process.cwd(), file)}`)\n execSync('yarn modules:prepare', { stdio: 'inherit' })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: generate\n all.push({\n id: 'generate',\n cli: [\n {\n command: 'all',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds, generateModuleRegistry, generateModuleRegistryCli, generateModuleEntities, generateModuleDi, generateOpenApi } = await import('./lib/generators')\n const resolver = createResolver()\n const quiet = args.includes('--quiet') || args.includes('-q')\n\n console.log('Running all generators...')\n await generateEntityIds({ resolver, quiet })\n await generateModuleRegistry({ resolver, quiet })\n await generateModuleRegistryCli({ resolver, quiet })\n await generateModuleEntities({ resolver, quiet })\n await generateModuleDi({ resolver, quiet })\n await generateOpenApi({ resolver, quiet })\n console.log('All generators completed.')\n },\n },\n {\n command: 'entity-ids',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'registry',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleRegistry } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleRegistry({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'entities',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleEntities } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleEntities({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'di',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleDi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleDi({ resolver, quiet: args.includes('--quiet') })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: db\n all.push({\n id: 'db',\n cli: [\n {\n command: 'generate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGenerate } = await import('./lib/db')\n const resolver = createResolver()\n await dbGenerate(resolver)\n },\n },\n {\n command: 'migrate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbMigrate } = await import('./lib/db')\n const resolver = createResolver()\n await dbMigrate(resolver)\n },\n },\n {\n command: 'greenfield',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGreenfield } = await import('./lib/db')\n const resolver = createResolver()\n const yes = args.includes('--yes') || args.includes('-y')\n await dbGreenfield(resolver, { yes })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: server (runs Next.js + workers)\n all.push({\n id: 'server',\n cli: [\n {\n command: 'dev',\n run: async () => {\n const { spawn } = await import('child_process')\n const path = await import('path')\n const { createResolver } = await import('./lib/resolver')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // In monorepo, packages are hoisted to root; in standalone, they're in app's node_modules\n const nodeModulesBase = resolver.isMonorepo() ? resolver.getRootDir() : appDir\n\n const processes: ChildProcess[] = []\n const autoSpawnWorkers = process.env.AUTO_SPAWN_WORKERS !== 'false'\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed) {\n proc.kill('SIGTERM')\n }\n }\n }\n\n process.on('SIGTERM', cleanup)\n process.on('SIGINT', cleanup)\n\n console.log('[server] Starting Open Mercato in dev mode...')\n\n // Resolve paths relative to where node_modules are located\n const nextBin = path.join(nodeModulesBase, 'node_modules/next/dist/bin/next')\n const mercatoBin = path.join(nodeModulesBase, 'node_modules/@open-mercato/cli/bin/mercato')\n\n // Start Next.js dev\n const nextProcess = spawn('node', [nextBin, 'dev', '--turbopack'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(nextProcess)\n\n // Start workers if enabled\n if (autoSpawnWorkers) {\n console.log('[server] Starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(workerProcess)\n }\n\n // Wait for any process to exit\n await Promise.race(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n proc.on('exit', () => resolve())\n })\n )\n )\n\n cleanup()\n },\n },\n {\n command: 'start',\n run: async () => {\n const { spawn } = await import('child_process')\n const path = await import('path')\n const { createResolver } = await import('./lib/resolver')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // In monorepo, packages are hoisted to root; in standalone, they're in app's node_modules\n const nodeModulesBase = resolver.isMonorepo() ? resolver.getRootDir() : appDir\n\n const processes: ChildProcess[] = []\n const autoSpawnWorkers = process.env.AUTO_SPAWN_WORKERS !== 'false'\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed) {\n proc.kill('SIGTERM')\n }\n }\n }\n\n process.on('SIGTERM', cleanup)\n process.on('SIGINT', cleanup)\n\n console.log('[server] Starting Open Mercato in production mode...')\n\n // Resolve paths relative to where node_modules are located\n const nextBin = path.join(nodeModulesBase, 'node_modules/next/dist/bin/next')\n const mercatoBin = path.join(nodeModulesBase, 'node_modules/@open-mercato/cli/bin/mercato')\n\n // Start Next.js production server\n const nextProcess = spawn('node', [nextBin, 'start'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(nextProcess)\n\n // Start workers if enabled\n if (autoSpawnWorkers) {\n console.log('[server] Starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(workerProcess)\n }\n\n // Wait for any process to exit\n await Promise.race(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n proc.on('exit', () => resolve())\n })\n )\n )\n\n cleanup()\n },\n },\n ],\n } as any)\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n const quietBanner = process.env.OM_CLI_QUIET === '1'\n const banner = '\uD83E\uDDE9 Open Mercato CLI'\n if (!quietBanner) {\n const header = [\n '\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557',\n `\u2551 ${banner.padEnd(21)}\u2551`,\n '\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D',\n ].join('\\n')\n console.log(header)\n }\n const pad = (s: string) => ` ${s}`\n\n if (!modName || modName === 'help' || modName === '--help' || modName === '-h') {\n console.log(pad('Usage: \u2728 mercato <module> <command> [args]'))\n const list = all\n .filter((m) => m.cli && m.cli.length)\n .map((m) => `\u2022 ${m.id}: ${m.cli!.map((c) => `\"${c.command}\"`).join(', ')}`)\n if (list.length) {\n console.log('\\n' + pad('Available:'))\n console.log(list.map(pad).join('\\n'))\n } else {\n console.log(pad('\uD83C\uDF00 No CLI commands available'))\n }\n return 0\n }\n\n const mod = all.find((m) => m.id === modName)\n if (!mod) {\n console.error(`\u274C Module not found: \"${modName}\"`)\n return 1\n }\n if (!mod.cli || mod.cli.length === 0) {\n console.error(`\uD83D\uDEAB Module \"${modName}\" has no CLI commands`)\n return 1\n }\n if (!cmdName) {\n console.log(pad(`Commands for \"${modName}\": ${mod.cli.map((c) => c.command).join(', ')}`))\n return 1\n }\n const cmd = mod.cli.find((c) => c.command === cmdName)\n if (!cmd) {\n console.error(`\uD83E\uDD14 Unknown command \"${cmdName}\". Available: ${mod.cli.map((c) => c.command).join(', ')}`)\n return 1\n }\n\n console.log('')\n const started = Date.now()\n console.log(`\uD83D\uDE80 Running ${modName}:${cmdName} ${rest.join(' ')}`)\n try {\n await cmd.run(rest)\n const ms = Date.now() - started\n console.log(`\u23F1\uFE0F Done in ${ms}ms`)\n return 0\n } catch (e: any) {\n console.error(`\uD83D\uDCA5 Failed: ${e?.message || e}`)\n return 1\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n// Note: Generated files and DI container are imported statically to avoid ESM/CJS interop issues.\n// Commands that need to run before generation (e.g., `init`) handle missing modules gracefully.\n\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { runWorker } from '@open-mercato/queue/worker'\nimport type { Module } from '@open-mercato/shared/modules/registry'\nimport { getCliModules, hasCliModules, registerCliModules } from './registry'\nexport { getCliModules, hasCliModules, registerCliModules }\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { resolveInitDerivedSecrets } from './lib/init-secrets'\nimport type { ChildProcess } from 'node:child_process'\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nlet envLoaded = false\n\nasync function ensureEnvLoaded() {\n if (envLoaded) return\n envLoaded = true\n\n // Try to find and load .env from the app directory\n // First, try to find the app directory via resolver\n try {\n const { createResolver } = await import('./lib/resolver.js')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // Load .env from app directory if it exists\n const envPath = path.join(appDir, '.env')\n if (fs.existsSync(envPath)) {\n const dotenv = await import('dotenv')\n dotenv.config({ path: envPath })\n return\n }\n } catch {\n // Resolver might fail during early init, fall back to default behavior\n }\n\n // Fall back to default dotenv behavior (loads from cwd)\n try {\n await import('dotenv/config')\n } catch {}\n}\n\n// Helper to run a CLI command directly (without spawning a process)\nasync function runModuleCommand(\n allModules: Module[],\n moduleName: string,\n commandName: string,\n args: string[] = [],\n options: { optional?: boolean } = {},\n): Promise<void> {\n const mod = allModules.find((m) => m.id === moduleName)\n if (!mod) {\n if (options.optional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 module not enabled`)\n return\n }\n throw new Error(`Module not found: \"${moduleName}\"`)\n }\n if (!mod.cli || mod.cli.length === 0) {\n if (options.optional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 module has no CLI commands`)\n return\n }\n throw new Error(`Module \"${moduleName}\" has no CLI commands`)\n }\n const cmd = mod.cli.find((c) => c.command === commandName)\n if (!cmd) {\n if (options.optional) {\n console.log(`\u23ED\uFE0F Skipping \"${moduleName}:${commandName}\" \u2014 command not found`)\n return\n }\n throw new Error(`Command \"${commandName}\" not found in module \"${moduleName}\"`)\n }\n await cmd.run(args)\n}\n\n// Build all CLI modules (registered + built-in)\nasync function buildAllModules(): Promise<Module[]> {\n const modules = getCliModules()\n\n // Load optional app-level CLI commands\n let appCli: any[] = []\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch {}\n\n const all = modules.slice()\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n return all\n}\n\nexport async function run(argv = process.argv) {\n await ensureEnvLoaded()\n const [, , ...parts] = argv\n const [first, second, ...remaining] = parts\n \n // Handle init command directly\n if (first === 'init') {\n const { execSync } = await import('child_process')\n\n console.log('\uD83D\uDE80 Initializing Open Mercato app...\\n')\n\n try {\n const initArgs = parts.slice(1).filter(Boolean)\n const reinstall = initArgs.includes('--reinstall') || initArgs.includes('-r')\n process.env.OM_INIT_FLOW = 'true'\n if (reinstall) {\n process.env.OM_INIT_REINSTALL = 'true'\n } else if (process.env.OM_INIT_REINSTALL) {\n delete process.env.OM_INIT_REINSTALL\n }\n const skipExamples = initArgs.includes('--no-examples') || initArgs.includes('--no-exampls')\n const stressTestEnabled =\n initArgs.includes('--stresstest') || initArgs.includes('--stress-test')\n const stressTestLite =\n initArgs.includes('--lite') ||\n initArgs.includes('--stress-lite') ||\n initArgs.some((arg) => arg.startsWith('--payload=lite') || arg.startsWith('--mode=lite'))\n let stressTestCount = 6000\n for (let i = 0; i < initArgs.length; i += 1) {\n const arg = initArgs[i]\n const countPrefixes = ['--count=', '--stress-count=', '--stresstest-count=']\n const matchedPrefix = countPrefixes.find((prefix) => arg.startsWith(prefix))\n if (matchedPrefix) {\n const value = arg.slice(matchedPrefix.length)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n if (arg === '--count' || arg === '--stress-count' || arg === '--stresstest-count' || arg === '-n') {\n const next = initArgs[i + 1]\n if (next && !next.startsWith('-')) {\n const parsed = Number.parseInt(next, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n if (arg.startsWith('-n=')) {\n const value = arg.slice(3)\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed > 0) {\n stressTestCount = parsed\n break\n }\n }\n }\n console.log(`\uD83D\uDD04 Reinstall mode: ${reinstall ? 'enabled' : 'disabled'}`)\n console.log(`\uD83C\uDFA8 Example content: ${skipExamples ? 'skipped (--no-examples)' : 'enabled'}`)\n console.log(\n `\uD83C\uDFCB\uFE0F Stress test dataset: ${\n stressTestEnabled\n ? `enabled (target ${stressTestCount} contacts${stressTestLite ? ', lite payload' : ''})`\n : 'disabled'\n }`\n )\n\n if (reinstall) {\n // Load env variables so DATABASE_URL is available\n await ensureEnvLoaded()\n console.log('\u267B\uFE0F Reinstall mode enabled: dropping all database tables...')\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n if (!dbUrl) {\n console.error('DATABASE_URL is not set. Aborting reinstall.')\n return 1\n }\n const client = new Client({ connectionString: dbUrl })\n try {\n await client.connect()\n // Collect all user tables in public schema\n const res = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = 'public'`)\n const dropTargets = new Set<string>((res.rows || []).map((r: any) => String(r.tablename)))\n for (const forced of ['vector_search', 'vector_search_migrations']) {\n const exists = await client.query(\n `SELECT to_regclass($1) AS regclass`,\n [`public.${forced}`],\n )\n const regclass = (exists as { rows?: Array<{ regclass: string | null }> }).rows?.[0]?.regclass ?? null\n if (regclass) {\n dropTargets.add(forced)\n }\n }\n if (dropTargets.size === 0) {\n console.log(' No tables found in public schema.')\n } else {\n let dropped = 0\n await client.query('BEGIN')\n try {\n for (const t of dropTargets) {\n await client.query(`DROP TABLE IF EXISTS \"${t}\" CASCADE`)\n dropped += 1\n }\n await client.query('COMMIT')\n console.log(` Dropped ${dropped} tables.`)\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n }\n }\n } finally {\n try { await client.end() } catch {}\n }\n // Also flush Redis\n try {\n const Redis = (await import('ioredis')).default\n const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379'\n const redis = new Redis(redisUrl)\n await redis.flushall()\n await redis.quit()\n console.log(' Redis flushed.')\n } catch {}\n console.log('\u2705 Database cleared. Proceeding with fresh initialization...\\n')\n }\n\n // Step 1: Run generators directly (no process spawn)\n console.log('\uD83D\uDD27 Preparing modules (registry, entities, DI)...')\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds, generateModuleRegistry, generateModuleRegistryCli, generateModuleEntities, generateModuleDi, generateOpenApi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: true })\n await generateModuleRegistry({ resolver, quiet: true })\n await generateModuleRegistryCli({ resolver, quiet: true })\n await generateModuleEntities({ resolver, quiet: true })\n await generateModuleDi({ resolver, quiet: true })\n await generateOpenApi({ resolver, quiet: true })\n console.log('\u2705 Modules prepared\\n')\n\n // Step 3: Apply database migrations directly\n console.log('\uD83D\uDCCA Applying database migrations...')\n const { dbMigrate } = await import('./lib/db')\n await dbMigrate(resolver)\n console.log('\u2705 Migrations applied\\n')\n\n // Step 4: Bootstrap to register modules and entity IDs\n // Use the shared dynamicLoader which compiles TypeScript files on-the-fly\n console.log('\uD83D\uDD17 Bootstrapping application...')\n const { bootstrapFromAppRoot } = await import('@open-mercato/shared/lib/bootstrap/dynamicLoader')\n const bootstrapData = await bootstrapFromAppRoot(resolver.getAppDir())\n // Register CLI modules directly (bootstrapFromAppRoot returns the data for this purpose)\n registerCliModules(bootstrapData.modules)\n console.log('\u2705 Bootstrap complete\\n')\n\n // Step 5: Build all modules for CLI commands\n const allModules = await buildAllModules()\n\n // Step 6: Restore configuration defaults\n console.log('\u2699\uFE0F Restoring module defaults...')\n await runModuleCommand(allModules, 'configs', 'restore-defaults', [])\n console.log('\u2705 Module defaults restored\\n')\n\n // Step 7: Setup RBAC (tenant/org, users, ACLs)\n const findArgValue = (names: string[], fallback: string) => {\n for (const name of names) {\n const match = initArgs.find((arg) => arg.startsWith(name))\n if (match) {\n const value = match.slice(name.length)\n if (value) return value\n }\n }\n return fallback\n }\n const readEnvDefault = (key: string) => {\n const value = process.env[key]\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n return undefined\n }\n const defaultEmail = readEnvDefault('OM_INIT_SUPERADMIN_EMAIL') ?? 'superadmin@acme.com'\n const defaultPassword = readEnvDefault('OM_INIT_SUPERADMIN_PASSWORD') ?? 'secret'\n const orgName = findArgValue(['--org=', '--orgName='], 'Acme Corp')\n const email = findArgValue(['--email='], defaultEmail)\n const password = findArgValue(['--password='], defaultPassword)\n const derivedSecrets = resolveInitDerivedSecrets({ email, env: process.env })\n const adminEmailDerived = derivedSecrets.adminEmail\n const employeeEmailDerived = derivedSecrets.employeeEmail\n if (adminEmailDerived && derivedSecrets.adminPassword) {\n process.env.OM_INIT_ADMIN_PASSWORD = derivedSecrets.adminPassword\n }\n if (employeeEmailDerived && derivedSecrets.employeePassword) {\n process.env.OM_INIT_EMPLOYEE_PASSWORD = derivedSecrets.employeePassword\n }\n const roles = findArgValue(['--roles='], 'superadmin,admin,employee')\n const skipPasswordPolicyRaw = initArgs.find((arg) =>\n arg === '--skip-password-policy' ||\n arg.startsWith('--skip-password-policy=') ||\n arg === '--allow-weak-password' ||\n arg.startsWith('--allow-weak-password=')\n )\n const skipPasswordPolicy = skipPasswordPolicyRaw\n ? parseBooleanToken(skipPasswordPolicyRaw.split('=')[1] ?? 'true') ?? true\n : true\n\n console.log('\uD83D\uDD10 Setting up RBAC and users...')\n // Run auth setup command via CLI\n const setupArgs = [\n '--orgName', orgName,\n '--email', email,\n '--password', password,\n '--roles', roles,\n ]\n if (skipPasswordPolicy) {\n setupArgs.push('--skip-password-policy')\n }\n await runModuleCommand(allModules, 'auth', 'setup', setupArgs)\n // Query DB to get tenant/org IDs using pg directly\n const { Client } = await import('pg')\n const dbUrl = process.env.DATABASE_URL\n const pgClient = new Client({ connectionString: dbUrl })\n await pgClient.connect()\n const orgResult = await pgClient.query(\n `SELECT o.id as org_id, o.tenant_id FROM organizations o\n JOIN users u ON u.organization_id = o.id\n LIMIT 1`\n )\n await pgClient.end()\n const tenantId = orgResult?.rows?.[0]?.tenant_id ?? null\n const orgId = orgResult?.rows?.[0]?.org_id ?? null\n if (!tenantId || !orgId) {\n throw new Error('Auth setup failed to create a tenant/org. Aborting init.')\n }\n console.log('\u2705 RBAC setup complete:', { tenantId, organizationId: orgId }, '\\n')\n\n console.log('\uD83C\uDF9B\uFE0F Seeding feature toggle defaults...')\n await runModuleCommand(allModules, 'feature_toggles', 'seed-defaults', [])\n console.log('\uD83C\uDF9B\uFE0F \u2705 Feature toggle defaults seeded\\n')\n\n if (tenantId) {\n console.log('\uD83D\uDC65 Seeding tenant-scoped roles...')\n await runModuleCommand(allModules, 'auth', 'seed-roles', ['--tenant', tenantId])\n console.log('\uD83D\uDEE1\uFE0F \u2705 Roles seeded\\n')\n } else {\n console.log('\u26A0\uFE0F Skipping role seeding because tenant ID was not available.\\n')\n }\n\n if (orgId && tenantId) {\n if (reinstall) {\n console.log('\uD83E\uDDE9 Reinstalling custom field definitions...')\n await runModuleCommand(allModules, 'entities', 'reinstall', ['--tenant', tenantId])\n console.log('\uD83E\uDDE9 \u2705 Custom field definitions reinstalled\\n')\n }\n\n const parsedEncryption = parseBooleanToken(process.env.TENANT_DATA_ENCRYPTION ?? 'yes')\n const encryptionEnabled = parsedEncryption === null ? true : parsedEncryption\n if (encryptionEnabled) {\n console.log('\uD83D\uDD12 Seeding encryption defaults...')\n await runModuleCommand(allModules, 'entities', 'seed-encryption', ['--tenant', tenantId, '--org', orgId])\n console.log('\uD83D\uDD12 \u2705 Encryption defaults seeded\\n')\n } else {\n console.log('\u26A0\uFE0F TENANT_DATA_ENCRYPTION disabled; skipping encryption defaults.\\n')\n }\n\n // Seed module defaults (structural data: dictionaries, tax rates, units, etc.)\n console.log('\uD83D\uDCDA Seeding module defaults...')\n const seedContainer = await createRequestContainer()\n const seedEm = seedContainer.resolve('em') as any\n const seedCtx = { em: seedEm, tenantId, organizationId: orgId, container: seedContainer }\n for (const mod of allModules) {\n if (mod.setup?.seedDefaults) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedDefaults(seedCtx)\n }\n }\n console.log('\u2705 Module defaults seeded\\n')\n\n if (skipExamples) {\n console.log('\uD83D\uDEAB Example data seeding skipped (--no-examples)\\n')\n } else {\n // Seed example data (demo products, customers, orders, etc.)\n console.log('\uD83C\uDFA8 Seeding example data...')\n for (const mod of allModules) {\n if (mod.setup?.seedExamples) {\n console.log(` \uD83D\uDCE6 ${mod.id}...`)\n await mod.setup.seedExamples(seedCtx)\n }\n }\n console.log('\u2705 Example data seeded\\n')\n }\n\n if (stressTestEnabled) {\n console.log(\n `\uD83C\uDFCB\uFE0F Seeding stress test customers${stressTestLite ? ' (lite payload)' : ''}...`\n )\n const stressArgs = ['--tenant', tenantId, '--org', orgId, '--count', String(stressTestCount)]\n if (stressTestLite) stressArgs.push('--lite')\n await runModuleCommand(allModules, 'customers', 'seed-stresstest', stressArgs, { optional: true })\n console.log(`\u2705 Stress test customers seeded (requested ${stressTestCount})\\n`)\n }\n\n console.log('\uD83E\uDDE9 Enabling default dashboard widgets...')\n await runModuleCommand(allModules, 'dashboards', 'seed-defaults', ['--tenant', tenantId], { optional: true })\n console.log('\u2705 Dashboard widgets enabled\\n')\n\n console.log('\uD83D\uDCCA Enabling analytics widgets for admin and employee roles...')\n await runModuleCommand(allModules, 'dashboards', 'enable-analytics-widgets', [\n '--tenant',\n tenantId,\n '--roles',\n 'admin,employee',\n ])\n console.log('\u2705 Analytics widgets enabled for roles\\n')\n\n } else {\n console.log('\u26A0\uFE0F Could not get organization ID or tenant ID, skipping seeding steps\\n')\n }\n\n console.log('\uD83E\uDDE0 Building search indexes...')\n const vectorArgs = tenantId\n ? ['--tenant', tenantId, ...(orgId ? ['--org', orgId] : [])]\n : ['--purgeFirst=false']\n await runModuleCommand(allModules, 'search', 'reindex', vectorArgs, { optional: true })\n console.log('\u2705 Search indexes built\\n')\n\n console.log('\uD83D\uDD0D Rebuilding query indexes...')\n const queryIndexArgs = ['--force', ...(tenantId ? ['--tenant', tenantId] : [])]\n await runModuleCommand(allModules, 'query_index', 'reindex', queryIndexArgs, { optional: true })\n console.log('\u2705 Query indexes rebuilt\\n')\n\n const adminPasswordOverride = derivedSecrets.adminPassword\n const employeePasswordOverride = derivedSecrets.employeePassword\n const createdUsers: Array<{ label: string; icon: string; email: string }> = []\n const createdPasswords = new Map<string, string>()\n const pushUser = (label: string, icon: string, value: string | null, passwordValue: string) => {\n if (!value) return\n if (createdUsers.some((entry) => entry.email.toLowerCase() === value.toLowerCase())) return\n createdUsers.push({ label, icon, email: value })\n createdPasswords.set(value.toLowerCase(), passwordValue)\n }\n pushUser('Superadmin', '\uD83D\uDC51', email, password)\n pushUser('Admin', '\uD83E\uDDF0', adminEmailDerived, adminPasswordOverride ?? password)\n pushUser('Employee', '\uD83D\uDC77', employeeEmailDerived, employeePasswordOverride ?? password)\n\n // Simplified success message: we know which users were created\n console.log('\uD83C\uDF89 App initialization complete!\\n')\n console.log('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557')\n console.log('\u2551 \uD83D\uDE80 You\\'re now ready to start development! \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Start the dev server: \u2551')\n console.log('\u2551 yarn dev \u2551')\n console.log('\u2551 \u2551')\n console.log('\u2551 Users created: \u2551')\n for (const entry of createdUsers) {\n const label = `${entry.icon} ${entry.label}:`\n const labelPad = label.padEnd(13)\n const entryPassword = createdPasswords.get(entry.email.toLowerCase()) ?? password\n console.log(`\u2551 ${labelPad}${entry.email.padEnd(42)} \u2551`)\n console.log(`\u2551 Password: ${entryPassword.padEnd(44)} \u2551`)\n }\n console.log('\u2551 \u2551')\n console.log('\u2551 Happy coding! \u2551')\n console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D')\n\n return 0\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error('\u274C Initialization failed:', error.message)\n } else {\n console.error('\u274C Initialization failed:', error)\n }\n return 1\n }\n }\n\n let modName = first\n let cmdName = second\n let rest = remaining\n\n if (first === 'reindex') {\n modName = 'query_index'\n cmdName = 'reindex'\n rest = second !== undefined ? [second, ...remaining] : remaining\n }\n\n // Handle 'mercato generate' without subcommand - default to 'generate all'\n if (first === 'generate' && !second) {\n cmdName = 'all'\n rest = remaining\n }\n\n // Load modules from registered CLI modules\n const modules = getCliModules()\n \n // Load optional app-level CLI commands lazily without static import resolution\n let appCli: any[] = []\n try {\n const dynImport: any = (Function('return import') as any)()\n const app = await dynImport.then((f: any) => f('@/cli')).catch(() => null)\n if (app && Array.isArray(app?.default)) appCli = app.default\n } catch {}\n const all = modules.slice()\n \n // Built-in CLI module: queue\n all.push({\n id: 'queue',\n cli: [\n {\n command: 'worker',\n run: async (args: string[]) => {\n const isAllQueues = args.includes('--all')\n const queueName = isAllQueues ? null : args[0]\n\n // Collect all discovered workers from modules\n type WorkerEntry = {\n id: string\n queue: string\n concurrency: number\n handler: (job: unknown, ctx: unknown) => Promise<void> | void\n }\n const allWorkers: WorkerEntry[] = []\n for (const mod of getCliModules()) {\n const modWorkers = (mod as { workers?: WorkerEntry[] }).workers\n if (modWorkers) {\n allWorkers.push(...modWorkers)\n }\n }\n const discoveredQueues = [...new Set(allWorkers.map((w) => w.queue))]\n\n if (!queueName && !isAllQueues) {\n console.error('Usage: mercato queue worker <queueName> | --all')\n console.error('Example: mercato queue worker events')\n console.error('Example: mercato queue worker --all')\n if (discoveredQueues.length > 0) {\n console.error(`Discovered queues: ${discoveredQueues.join(', ')}`)\n }\n return\n }\n\n const concurrencyArg = args.find((a) => a.startsWith('--concurrency='))\n const concurrencyOverride = concurrencyArg ? Number(concurrencyArg.split('=')[1]) : undefined\n\n if (isAllQueues) {\n // Run workers for all discovered queues\n if (discoveredQueues.length === 0) {\n console.error('[worker] No queues discovered from modules')\n return\n }\n\n const container = await createRequestContainer()\n console.log(`[worker] Starting workers for all queues: ${discoveredQueues.join(', ')}`)\n\n // Start all queue workers in background mode\n const workerPromises = discoveredQueues.map(async (queue) => {\n const queueWorkers = allWorkers.filter((w) => w.queue === queue)\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Starting \"${queue}\" with ${queueWorkers.length} handler(s), concurrency: ${concurrency}`)\n\n await runWorker({\n queueName: queue,\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n concurrency,\n background: true,\n handler: async (job, ctx) => {\n for (const worker of queueWorkers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n },\n })\n })\n\n await Promise.all(workerPromises)\n\n console.log('[worker] All workers started. Press Ctrl+C to stop')\n\n // Keep the process alive\n await new Promise(() => {})\n } else {\n // Find workers for this specific queue\n const queueWorkers = allWorkers.filter((w) => w.queue === queueName)\n\n if (queueWorkers.length > 0) {\n // Use discovered workers\n const container = await createRequestContainer()\n const concurrency = concurrencyOverride ?? Math.max(...queueWorkers.map((w) => w.concurrency), 1)\n\n console.log(`[worker] Found ${queueWorkers.length} worker(s) for queue \"${queueName}\"`)\n\n await runWorker({\n queueName: queueName!,\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n concurrency,\n handler: async (job, ctx) => {\n for (const worker of queueWorkers) {\n await worker.handler(job, { ...ctx, resolve: container.resolve.bind(container) })\n }\n },\n })\n } else {\n console.error(`No workers found for queue \"${queueName}\"`)\n if (discoveredQueues.length > 0) {\n console.error(`Available queues: ${discoveredQueues.join(', ')}`)\n }\n }\n }\n },\n },\n {\n command: 'clear',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue clear <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n })\n : createQueue(queueName, 'local')\n\n const res = await queue.clear()\n await queue.close()\n console.log(`Cleared queue \"${queueName}\", removed ${res.removed} jobs`)\n },\n },\n {\n command: 'status',\n run: async (args: string[]) => {\n const queueName = args[0]\n if (!queueName) {\n console.error('Usage: mercato queue status <queueName>')\n return\n }\n\n const strategyEnv = process.env.QUEUE_STRATEGY || 'local'\n const { createQueue } = await import('@open-mercato/queue')\n\n const queue = strategyEnv === 'async'\n ? createQueue(queueName, 'async', {\n connection: { url: process.env.REDIS_URL || process.env.QUEUE_REDIS_URL },\n })\n : createQueue(queueName, 'local')\n\n const counts = await queue.getJobCounts()\n console.log(`Queue \"${queueName}\" status:`)\n console.log(` Waiting: ${counts.waiting}`)\n console.log(` Active: ${counts.active}`)\n console.log(` Completed: ${counts.completed}`)\n console.log(` Failed: ${counts.failed}`)\n await queue.close()\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: events\n all.push({\n id: 'events',\n cli: [\n {\n command: 'emit',\n run: async (args: string[]) => {\n const eventName = args[0]\n if (!eventName) {\n console.error('Usage: mercato events emit <event> [jsonPayload] [--persistent|-p]')\n return\n }\n const persistent = args.includes('--persistent') || args.includes('-p')\n const payloadArg = args[1] && !args[1].startsWith('--') ? args[1] : undefined\n let payload: any = {}\n if (payloadArg) {\n try { payload = JSON.parse(payloadArg) } catch { payload = payloadArg }\n }\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n await bus.emit(eventName, payload, { persistent })\n console.log(`Emitted \"${eventName}\"${persistent ? ' (persistent)' : ''}`)\n },\n },\n {\n command: 'clear',\n run: async () => {\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const bus = (container.resolve('eventBus') as any)\n const res = await bus.clearQueue()\n console.log(`Cleared events queue, removed ${res.removed} events`)\n },\n },\n ],\n } as any)\n \n // Built-in CLI module: scaffold\n all.push({\n id: 'scaffold',\n cli: [\n {\n command: 'module',\n run: async (args: string[]) => {\n const name = (args[0] || '').trim()\n if (!name) {\n console.error('Usage: mercato scaffold module <name>')\n return\n }\n const fs = await import('node:fs')\n const path = await import('node:path')\n const { execSync } = await import('node:child_process')\n const base = path.resolve('src/modules', name)\n const folders = ['api', 'backend', 'frontend', 'data', 'subscribers']\n for (const f of folders) fs.mkdirSync(path.join(base, f), { recursive: true })\n const moduleTitle = `${name[0].toUpperCase()}${name.slice(1)}`\n const indexTs = `export const metadata = { title: '${moduleTitle}', group: 'Modules' }\\n`\n fs.writeFileSync(path.join(base, 'index.ts'), indexTs, { flag: 'wx' })\n const ceTs = `export const entities = [\\n {\\n id: '${name}:sample',\\n label: '${moduleTitle} Sample',\\n description: 'Describe your custom entity',\\n showInSidebar: true,\\n fields: [\\n // { key: 'priority', kind: 'integer', label: 'Priority' },\\n ],\\n },\\n]\\n\\nexport default entities\\n`\n fs.writeFileSync(path.join(base, 'ce.ts'), ceTs, { flag: 'wx' })\n const entitiesTs = `import { Entity, PrimaryKey, Property } from '@mikro-orm/core'\\n\\n// Add your entities here. Example:\\n// @Entity({ tableName: '${name}_items' })\\n// export class ${moduleTitle}Item {\\n// @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' }) id!: string\\n// @Property({ type: 'text' }) title!: string\\n// @Property({ name: 'organization_id', type: 'uuid', nullable: true }) organizationId?: string | null\\n// @Property({ name: 'tenant_id', type: 'uuid', nullable: true }) tenantId?: string | null\\n// @Property({ name: 'created_at', type: Date, onCreate: () => new Date() }) createdAt: Date = new Date()\\n// @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() }) updatedAt: Date = new Date()\\n// @Property({ name: 'deleted_at', type: Date, nullable: true }) deletedAt?: Date | null\\n// }\\n`\n fs.writeFileSync(path.join(base, 'data', 'entities.ts'), entitiesTs, { flag: 'wx' })\n console.log(`Created module at ${path.relative(process.cwd(), base)}`)\n execSync('yarn modules:prepare', { stdio: 'inherit' })\n },\n },\n {\n command: 'entity',\n run: async () => {\n const fs = await import('node:fs')\n const path = await import('node:path')\n const readline = await import('node:readline/promises')\n const { stdin: input, stdout: output } = await import('node:process')\n const { execSync } = await import('node:child_process')\n const rl = readline.createInterface({ input, output })\n try {\n const moduleId = (await rl.question('Module id (folder under src/modules): ')).trim()\n const className = (await rl.question('Entity class name (e.g., Todo): ')).trim()\n const tableName = (await rl.question(`DB table name (default: ${className.toLowerCase()}s): `)).trim() || `${className.toLowerCase()}s`\n const extra = (await rl.question('Additional fields (comma list name:type, e.g., title:text,is_done:boolean): ')).trim()\n const extras = extra\n ? extra.split(',').map(s => s.trim()).filter(Boolean).map(s => {\n const [n,t] = s.split(':').map(x=>x.trim()); return { n, t }\n })\n : []\n const base = path.resolve('src/modules', moduleId, 'data')\n fs.mkdirSync(base, { recursive: true })\n const file = path.join(base, 'entities.ts')\n let content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : `import { Entity, PrimaryKey, Property } from '@mikro-orm/core'\\n\\n`\n content += `\\n@Entity({ tableName: '${tableName}' })\\nexport class ${className} {\\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\\n id!: string\\n\\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\\n organizationId?: string | null\\n\\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\\n tenantId?: string | null\\n\\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\\n createdAt: Date = new Date()\\n\\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })\\n updatedAt: Date = new Date()\\n\\n @Property({ name: 'deleted_at', type: Date, nullable: true })\\n deletedAt?: Date | null\\n`\n for (const f of extras) {\n const n = f.n\n const t = f.t\n if (!n || !t) continue\n const map = {\n text: { ts: 'string', db: 'text' },\n multiline: { ts: 'string', db: 'text' },\n integer: { ts: 'number', db: 'int' },\n float: { ts: 'number', db: 'float' },\n boolean: { ts: 'boolean', db: 'boolean' },\n date: { ts: 'Date', db: 'Date' },\n } as const\n const info = map[t as keyof typeof map]\n const fallback = { ts: 'string', db: 'text' }\n const resolved = info || fallback\n const propName = n.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n const columnName = n.replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`)\n const dbType = resolved.db\n const tsType = resolved.ts\n const defaultValue =\n resolved.ts === 'boolean' ? ' = false' :\n resolved.ts === 'Date' ? ' = new Date()' :\n ''\n content += `\\n @Property({ name: '${columnName}', type: ${dbType === 'Date' ? 'Date' : `'${dbType}'`}${resolved.ts === 'boolean' ? ', default: false' : ''} })\\n ${propName}${tsType === 'number' ? '?: number | null' : tsType === 'boolean' ? ': boolean' : tsType === 'Date' ? ': Date' : '!: string'}${defaultValue}\\n`\n }\n content += `}\\n`\n fs.writeFileSync(file, content)\n console.log(`Updated ${path.relative(process.cwd(), file)}`)\n console.log('Generating and applying migrations...')\n execSync('yarn modules:prepare', { stdio: 'inherit' })\n execSync('yarn db:generate', { stdio: 'inherit' })\n execSync('yarn db:migrate', { stdio: 'inherit' })\n } finally {\n rl.close()\n }\n },\n },\n {\n command: 'crud',\n run: async (args: string[]) => {\n const fs = await import('node:fs')\n const path = await import('node:path')\n const { execSync } = await import('node:child_process')\n const mod = (args[0] || '').trim()\n const entity = (args[1] || '').trim()\n const routeSeg = (args[2] || '').trim() || `${entity.toLowerCase()}s`\n if (!mod || !entity) {\n console.error('Usage: mercato scaffold crud <moduleId> <EntityClass> [routeSegment]')\n return\n }\n const baseDir = path.resolve('src/modules', mod, 'api', routeSeg)\n fs.mkdirSync(baseDir, { recursive: true })\n const entitySnake = entity.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()\n const tmpl = `import { z } from 'zod'\\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\\nimport { ${entity} } from '@open-mercato/shared/modules/${mod}/data/entities'\\nimport { E } from '#generated/entities.ids.generated'\\nimport ceEntities from '@open-mercato/shared/modules/${mod}/ce'\\nimport { buildCustomFieldSelectorsForEntity, extractCustomFieldsFromItem, buildCustomFieldFiltersFromQuery } from '@open-mercato/shared/lib/crud/custom-fields'\\nimport type { CustomFieldSet } from '@open-mercato/shared/modules/entities'\\n\\n// Field constants - update these based on your entity's actual fields\\nconst F = {\\n id: 'id',\\n tenant_id: 'tenant_id',\\n organization_id: 'organization_id',\\n created_at: 'created_at',\\n updated_at: 'updated_at',\\n deleted_at: 'deleted_at',\\n} as const\\n\\nconst querySchema = z.object({\\n id: z.string().uuid().optional(),\\n page: z.coerce.number().min(1).default(1),\\n pageSize: z.coerce.number().min(1).max(100).default(50),\\n sortField: z.string().optional().default('id'),\\n sortDir: z.enum(['asc','desc']).optional().default('asc'),\\n withDeleted: z.coerce.boolean().optional().default(false),\\n}).passthrough()\\n\\nconst createSchema = z.object({}).passthrough()\\nconst updateSchema = z.object({ id: z.string().uuid() }).passthrough()\\n\\ntype Query = z.infer<typeof querySchema>\\n\\nconst fieldSets: CustomFieldSet[] = []\\nconst ceEntity = Array.isArray(ceEntities) ? ceEntities.find((entity) => entity?.id === '${mod}:${entitySnake}') : undefined\\nif (ceEntity?.fields?.length) {\\n fieldSets.push({ entity: ceEntity.id, fields: ceEntity.fields, source: '${mod}' })\\n}\\n\\nconst cfSel = buildCustomFieldSelectorsForEntity(E.${mod}.${entitySnake}, fieldSets)\\nconst sortFieldMap: Record<string, unknown> = { id: F.id, created_at: F.created_at, ...Object.fromEntries(cfSel.keys.map(k => [\\`cf_\\${k}\\`, \\`cf:\\${k}\\`])) }\\n\\nexport const { metadata, GET, POST, PUT, DELETE } = makeCrudRoute({\\n metadata: { GET: { requireAuth: true }, POST: { requireAuth: true }, PUT: { requireAuth: true }, DELETE: { requireAuth: true } },\\n orm: { entity: ${entity}, idField: 'id', orgField: 'organizationId', tenantField: 'tenantId', softDeleteField: 'deletedAt' },\\n events: { module: '${mod}', entity: '${entitySnake}', persistent: true },\\n indexer: { entityType: E.${mod}.${entitySnake} },\\n list: {\\n schema: querySchema,\\n entityId: E.${mod}.${entitySnake},\\n fields: [F.id, F.created_at, ...cfSel.selectors],\\n sortFieldMap,\\n buildFilters: async (q: Query, ctx) => ({\\n ...(await buildCustomFieldFiltersFromQuery({\\n entityId: E.${mod}.${entitySnake},\\n query: q as any,\\n em: ctx.container.resolve('em'),\\n tenantId: ctx.auth!.tenantId,\\n })),\\n }),\\n transformItem: (item: any) => ({ id: item.id, created_at: item.created_at, ...extractCustomFieldsFromItem(item, cfSel.keys) }),\\n },\\n create: { schema: createSchema, mapToEntity: (input: any) => ({}), customFields: { enabled: true, entityId: E.${mod}.${entitySnake}, pickPrefixed: true } },\\n update: { schema: updateSchema, applyToEntity: (entity: ${entity}, input: any) => {}, customFields: { enabled: true, entityId: E.${mod}.${entitySnake}, pickPrefixed: true } },\\n del: { idFrom: 'query', softDelete: true },\\n})\\n`\n const file = path.join(baseDir, 'route.ts')\n fs.writeFileSync(file, tmpl, { flag: 'wx' })\n console.log(`Created CRUD route: ${path.relative(process.cwd(), file)}`)\n execSync('yarn modules:prepare', { stdio: 'inherit' })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: generate\n all.push({\n id: 'generate',\n cli: [\n {\n command: 'all',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds, generateModuleRegistry, generateModuleRegistryCli, generateModuleEntities, generateModuleDi, generateOpenApi } = await import('./lib/generators')\n const resolver = createResolver()\n const quiet = args.includes('--quiet') || args.includes('-q')\n\n console.log('Running all generators...')\n await generateEntityIds({ resolver, quiet })\n await generateModuleRegistry({ resolver, quiet })\n await generateModuleRegistryCli({ resolver, quiet })\n await generateModuleEntities({ resolver, quiet })\n await generateModuleDi({ resolver, quiet })\n await generateOpenApi({ resolver, quiet })\n console.log('All generators completed.')\n },\n },\n {\n command: 'entity-ids',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateEntityIds } = await import('./lib/generators')\n const resolver = createResolver()\n await generateEntityIds({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'registry',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleRegistry } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleRegistry({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'entities',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleEntities } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleEntities({ resolver, quiet: args.includes('--quiet') })\n },\n },\n {\n command: 'di',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { generateModuleDi } = await import('./lib/generators')\n const resolver = createResolver()\n await generateModuleDi({ resolver, quiet: args.includes('--quiet') })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: db\n all.push({\n id: 'db',\n cli: [\n {\n command: 'generate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGenerate } = await import('./lib/db')\n const resolver = createResolver()\n await dbGenerate(resolver)\n },\n },\n {\n command: 'migrate',\n run: async () => {\n const { createResolver } = await import('./lib/resolver')\n const { dbMigrate } = await import('./lib/db')\n const resolver = createResolver()\n await dbMigrate(resolver)\n },\n },\n {\n command: 'greenfield',\n run: async (args: string[]) => {\n const { createResolver } = await import('./lib/resolver')\n const { dbGreenfield } = await import('./lib/db')\n const resolver = createResolver()\n const yes = args.includes('--yes') || args.includes('-y')\n await dbGreenfield(resolver, { yes })\n },\n },\n ],\n } as any)\n\n // Built-in CLI module: server (runs Next.js + workers)\n all.push({\n id: 'server',\n cli: [\n {\n command: 'dev',\n run: async () => {\n const { spawn } = await import('child_process')\n const path = await import('path')\n const { createResolver } = await import('./lib/resolver')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // In monorepo, packages are hoisted to root; in standalone, they're in app's node_modules\n const nodeModulesBase = resolver.isMonorepo() ? resolver.getRootDir() : appDir\n\n const processes: ChildProcess[] = []\n const autoSpawnWorkers = process.env.AUTO_SPAWN_WORKERS !== 'false'\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed) {\n proc.kill('SIGTERM')\n }\n }\n }\n\n process.on('SIGTERM', cleanup)\n process.on('SIGINT', cleanup)\n\n console.log('[server] Starting Open Mercato in dev mode...')\n\n // Resolve paths relative to where node_modules are located\n const nextBin = path.join(nodeModulesBase, 'node_modules/next/dist/bin/next')\n const mercatoBin = path.join(nodeModulesBase, 'node_modules/@open-mercato/cli/bin/mercato')\n\n // Start Next.js dev\n const nextProcess = spawn('node', [nextBin, 'dev', '--turbopack'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(nextProcess)\n\n // Start workers if enabled\n if (autoSpawnWorkers) {\n console.log('[server] Starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(workerProcess)\n }\n\n // Wait for any process to exit\n await Promise.race(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n proc.on('exit', () => resolve())\n })\n )\n )\n\n cleanup()\n },\n },\n {\n command: 'start',\n run: async () => {\n const { spawn } = await import('child_process')\n const path = await import('path')\n const { createResolver } = await import('./lib/resolver')\n const resolver = createResolver()\n const appDir = resolver.getAppDir()\n\n // In monorepo, packages are hoisted to root; in standalone, they're in app's node_modules\n const nodeModulesBase = resolver.isMonorepo() ? resolver.getRootDir() : appDir\n\n const processes: ChildProcess[] = []\n const autoSpawnWorkers = process.env.AUTO_SPAWN_WORKERS !== 'false'\n\n function cleanup() {\n console.log('[server] Shutting down...')\n for (const proc of processes) {\n if (!proc.killed) {\n proc.kill('SIGTERM')\n }\n }\n }\n\n process.on('SIGTERM', cleanup)\n process.on('SIGINT', cleanup)\n\n console.log('[server] Starting Open Mercato in production mode...')\n\n // Resolve paths relative to where node_modules are located\n const nextBin = path.join(nodeModulesBase, 'node_modules/next/dist/bin/next')\n const mercatoBin = path.join(nodeModulesBase, 'node_modules/@open-mercato/cli/bin/mercato')\n\n // Start Next.js production server\n const nextProcess = spawn('node', [nextBin, 'start'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(nextProcess)\n\n // Start workers if enabled\n if (autoSpawnWorkers) {\n console.log('[server] Starting workers for all queues...')\n const workerProcess = spawn('node', [mercatoBin, 'queue', 'worker', '--all'], {\n stdio: 'inherit',\n env: process.env,\n cwd: appDir,\n })\n processes.push(workerProcess)\n }\n\n // Wait for any process to exit\n await Promise.race(\n processes.map(\n (proc) =>\n new Promise<void>((resolve) => {\n proc.on('exit', () => resolve())\n })\n )\n )\n\n cleanup()\n },\n },\n ],\n } as any)\n\n if (appCli.length) all.push({ id: 'app', cli: appCli } as any)\n\n const quietBanner = process.env.OM_CLI_QUIET === '1'\n const banner = '\uD83E\uDDE9 Open Mercato CLI'\n if (!quietBanner) {\n const header = [\n '\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557',\n `\u2551 ${banner.padEnd(21)}\u2551`,\n '\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D',\n ].join('\\n')\n console.log(header)\n }\n const pad = (s: string) => ` ${s}`\n\n if (!modName || modName === 'help' || modName === '--help' || modName === '-h') {\n console.log(pad('Usage: \u2728 mercato <module> <command> [args]'))\n const list = all\n .filter((m) => m.cli && m.cli.length)\n .map((m) => `\u2022 ${m.id}: ${m.cli!.map((c) => `\"${c.command}\"`).join(', ')}`)\n if (list.length) {\n console.log('\\n' + pad('Available:'))\n console.log(list.map(pad).join('\\n'))\n } else {\n console.log(pad('\uD83C\uDF00 No CLI commands available'))\n }\n return 0\n }\n\n const mod = all.find((m) => m.id === modName)\n if (!mod) {\n console.error(`\u274C Module not found: \"${modName}\"`)\n return 1\n }\n if (!mod.cli || mod.cli.length === 0) {\n console.error(`\uD83D\uDEAB Module \"${modName}\" has no CLI commands`)\n return 1\n }\n if (!cmdName) {\n console.log(pad(`Commands for \"${modName}\": ${mod.cli.map((c) => c.command).join(', ')}`))\n return 1\n }\n const cmd = mod.cli.find((c) => c.command === cmdName)\n if (!cmd) {\n console.error(`\uD83E\uDD14 Unknown command \"${cmdName}\". Available: ${mod.cli.map((c) => c.command).join(', ')}`)\n return 1\n }\n\n console.log('')\n const started = Date.now()\n console.log(`\uD83D\uDE80 Running ${modName}:${cmdName} ${rest.join(' ')}`)\n try {\n await cmd.run(rest)\n const ms = Date.now() - started\n console.log(`\u23F1\uFE0F Done in ${ms}ms`)\n return 0\n } catch (e: any) {\n console.error(`\uD83D\uDCA5 Failed: ${e?.message || e}`)\n return 1\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Client", "dbUrl", "mod", "createRequestContainer", "fs", "path"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/cli",
3
- "version": "0.4.4-canary-8eeaebdd84",
3
+ "version": "0.4.4-canary-e6eb0baecb",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -55,7 +55,7 @@
55
55
  "@mikro-orm/core": "^6.6.2",
56
56
  "@mikro-orm/migrations": "^6.6.2",
57
57
  "@mikro-orm/postgresql": "^6.6.2",
58
- "@open-mercato/shared": "0.4.4-canary-8eeaebdd84",
58
+ "@open-mercato/shared": "0.4.4-canary-e6eb0baecb",
59
59
  "pg": "8.16.3",
60
60
  "typescript": "^5.9.3"
61
61
  },
package/src/bin.ts CHANGED
@@ -11,7 +11,7 @@ import { run } from './mercato.js'
11
11
  // - db: uses resolver directly to find modules and migrations
12
12
  // - init: runs yarn commands to set up the app
13
13
  // - help: just shows help text
14
- const BOOTSTRAP_FREE_COMMANDS = ['generate', 'db', 'init', 'eject', 'help', '--help', '-h']
14
+ const BOOTSTRAP_FREE_COMMANDS = ['generate', 'db', 'init', 'help', '--help', '-h']
15
15
 
16
16
  function needsBootstrap(argv: string[]): boolean {
17
17
  const [, , first] = argv
package/src/mercato.ts CHANGED
@@ -470,46 +470,6 @@ export async function run(argv = process.argv) {
470
470
  }
471
471
  }
472
472
 
473
- // Handle eject command directly (bootstrap-free)
474
- if (first === 'eject') {
475
- try {
476
- const { createResolver } = await import('./lib/resolver')
477
- const { listEjectableModules, ejectModule } = await import('./lib/eject')
478
- const resolver = createResolver()
479
-
480
- const isList = second === '--list' || second === '-l'
481
- const moduleId = !isList ? second : undefined
482
-
483
- if (isList || !moduleId) {
484
- const ejectable = listEjectableModules(resolver)
485
- if (ejectable.length === 0) {
486
- console.log('No ejectable modules found.')
487
- } else {
488
- console.log('Ejectable modules:\n')
489
- for (const mod of ejectable) {
490
- const desc = mod.description ? ` — ${mod.description}` : ''
491
- console.log(` ${mod.id} (from: ${mod.from})${desc}`)
492
- }
493
- console.log('\nUsage: yarn mercato eject <moduleId>')
494
- }
495
- return 0
496
- }
497
-
498
- console.log(`Ejecting module "${moduleId}"...`)
499
- ejectModule(resolver, moduleId)
500
- console.log(`\n✅ Module "${moduleId}" ejected successfully!\n`)
501
- console.log('Next steps:')
502
- console.log(' 1. Run generators: yarn mercato generate all')
503
- console.log(` 2. Customize: edit src/modules/${moduleId}/`)
504
- console.log(' 3. Start dev: yarn dev')
505
- return 0
506
- } catch (error: unknown) {
507
- const message = error instanceof Error ? error.message : String(error)
508
- console.error(`❌ Eject failed: ${message}`)
509
- return 1
510
- }
511
- }
512
-
513
473
  let modName = first
514
474
  let cmdName = second
515
475
  let rest = remaining
package/dist/lib/eject.js DELETED
@@ -1,120 +0,0 @@
1
- import path from "node:path";
2
- import fs from "node:fs";
3
- const SKIP_DIRS = /* @__PURE__ */ new Set(["__tests__", "__mocks__", "node_modules"]);
4
- function parseModuleMetadata(indexPath) {
5
- if (!fs.existsSync(indexPath)) return {};
6
- const source = fs.readFileSync(indexPath, "utf8");
7
- const result = {};
8
- const ejectableMatch = source.match(/ejectable\s*:\s*(true|false)/);
9
- if (ejectableMatch) {
10
- result.ejectable = ejectableMatch[1] === "true";
11
- }
12
- const titleMatch = source.match(/title\s*:\s*['"]([^'"]+)['"]/);
13
- if (titleMatch) {
14
- result.title = titleMatch[1];
15
- }
16
- const descMatch = source.match(/description\s*:\s*['"]([^'"]+)['"]/);
17
- if (descMatch) {
18
- result.description = descMatch[1];
19
- }
20
- return result;
21
- }
22
- function copyDirRecursive(src, dest) {
23
- fs.mkdirSync(dest, { recursive: true });
24
- const entries = fs.readdirSync(src, { withFileTypes: true });
25
- for (const entry of entries) {
26
- if (SKIP_DIRS.has(entry.name)) continue;
27
- const srcPath = path.join(src, entry.name);
28
- const destPath = path.join(dest, entry.name);
29
- if (entry.isDirectory()) {
30
- copyDirRecursive(srcPath, destPath);
31
- } else {
32
- fs.copyFileSync(srcPath, destPath);
33
- }
34
- }
35
- }
36
- function updateModulesTs(modulesPath, moduleId) {
37
- if (!fs.existsSync(modulesPath)) {
38
- throw new Error(`modules.ts not found at ${modulesPath}`);
39
- }
40
- const source = fs.readFileSync(modulesPath, "utf8");
41
- const pattern = new RegExp(
42
- `(\\{\\s*id:\\s*['"]${moduleId}['"]\\s*,\\s*from:\\s*)'([^']*)'`
43
- );
44
- const patternDouble = new RegExp(
45
- `(\\{\\s*id:\\s*['"]${moduleId}['"]\\s*,\\s*from:\\s*)"([^"]*)"`
46
- );
47
- let updated = source;
48
- if (pattern.test(source)) {
49
- updated = source.replace(pattern, `$1'@app'`);
50
- } else if (patternDouble.test(source)) {
51
- updated = source.replace(patternDouble, `$1"@app"`);
52
- } else {
53
- throw new Error(
54
- `Could not find module entry for "${moduleId}" in ${modulesPath}. Expected a pattern like: { id: '${moduleId}', from: '...' }`
55
- );
56
- }
57
- fs.writeFileSync(modulesPath, updated);
58
- }
59
- function listEjectableModules(resolver) {
60
- const modules = resolver.loadEnabledModules();
61
- const ejectable = [];
62
- for (const entry of modules) {
63
- if (entry.from === "@app") continue;
64
- const { pkgBase } = resolver.getModulePaths(entry);
65
- const indexPath = path.join(pkgBase, "index.ts");
66
- const metadata = parseModuleMetadata(indexPath);
67
- if (metadata.ejectable) {
68
- ejectable.push({
69
- id: entry.id,
70
- title: metadata.title,
71
- description: metadata.description,
72
- from: entry.from || "@open-mercato/core"
73
- });
74
- }
75
- }
76
- return ejectable;
77
- }
78
- function ejectModule(resolver, moduleId) {
79
- const modules = resolver.loadEnabledModules();
80
- const entry = modules.find((m) => m.id === moduleId);
81
- if (!entry) {
82
- throw new Error(
83
- `Module "${moduleId}" is not listed in src/modules.ts. Available modules: ${modules.map((m) => m.id).join(", ")}`
84
- );
85
- }
86
- if (entry.from === "@app") {
87
- throw new Error(
88
- `Module "${moduleId}" is already local (from: '@app'). Nothing to eject.`
89
- );
90
- }
91
- const { pkgBase, appBase } = resolver.getModulePaths(entry);
92
- if (!fs.existsSync(pkgBase)) {
93
- throw new Error(
94
- `Package source directory not found: ${pkgBase}. Make sure the package is installed.`
95
- );
96
- }
97
- const indexPath = path.join(pkgBase, "index.ts");
98
- const metadata = parseModuleMetadata(indexPath);
99
- if (!metadata.ejectable) {
100
- throw new Error(
101
- `Module "${moduleId}" is not marked as ejectable. Only modules with \`ejectable: true\` in their metadata can be ejected.`
102
- );
103
- }
104
- if (fs.existsSync(appBase)) {
105
- throw new Error(
106
- `Destination directory already exists: ${appBase}. Remove it first or resolve the conflict manually.`
107
- );
108
- }
109
- copyDirRecursive(pkgBase, appBase);
110
- const modulesPath = resolver.getModulesConfigPath();
111
- updateModulesTs(modulesPath, moduleId);
112
- }
113
- export {
114
- copyDirRecursive,
115
- ejectModule,
116
- listEjectableModules,
117
- parseModuleMetadata,
118
- updateModulesTs
119
- };
120
- //# sourceMappingURL=eject.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/lib/eject.ts"],
4
- "sourcesContent": ["import path from 'node:path'\nimport fs from 'node:fs'\nimport type { PackageResolver, ModuleEntry } from './resolver'\n\ntype ModuleMetadata = {\n ejectable?: boolean\n title?: string\n description?: string\n}\n\nconst SKIP_DIRS = new Set(['__tests__', '__mocks__', 'node_modules'])\n\nexport function parseModuleMetadata(indexPath: string): ModuleMetadata {\n if (!fs.existsSync(indexPath)) return {}\n\n const source = fs.readFileSync(indexPath, 'utf8')\n const result: ModuleMetadata = {}\n\n const ejectableMatch = source.match(/ejectable\\s*:\\s*(true|false)/)\n if (ejectableMatch) {\n result.ejectable = ejectableMatch[1] === 'true'\n }\n\n const titleMatch = source.match(/title\\s*:\\s*['\"]([^'\"]+)['\"]/)\n if (titleMatch) {\n result.title = titleMatch[1]\n }\n\n const descMatch = source.match(/description\\s*:\\s*['\"]([^'\"]+)['\"]/)\n if (descMatch) {\n result.description = descMatch[1]\n }\n\n return result\n}\n\nexport function copyDirRecursive(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true })\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry.name)) continue\n\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n copyDirRecursive(srcPath, destPath)\n } else {\n fs.copyFileSync(srcPath, destPath)\n }\n }\n}\n\nexport function updateModulesTs(modulesPath: string, moduleId: string): void {\n if (!fs.existsSync(modulesPath)) {\n throw new Error(`modules.ts not found at ${modulesPath}`)\n }\n\n const source = fs.readFileSync(modulesPath, 'utf8')\n\n // Match the module entry and replace its `from` value with '@app'\n // Handles patterns like: { id: 'currencies', from: '@open-mercato/core' }\n const pattern = new RegExp(\n `(\\\\{\\\\s*id:\\\\s*['\"]${moduleId}['\"]\\\\s*,\\\\s*from:\\\\s*)'([^']*)'`,\n )\n const patternDouble = new RegExp(\n `(\\\\{\\\\s*id:\\\\s*['\"]${moduleId}['\"]\\\\s*,\\\\s*from:\\\\s*)\"([^\"]*)\"`,\n )\n\n let updated = source\n if (pattern.test(source)) {\n updated = source.replace(pattern, `$1'@app'`)\n } else if (patternDouble.test(source)) {\n updated = source.replace(patternDouble, `$1\"@app\"`)\n } else {\n throw new Error(\n `Could not find module entry for \"${moduleId}\" in ${modulesPath}. ` +\n `Expected a pattern like: { id: '${moduleId}', from: '...' }`,\n )\n }\n\n fs.writeFileSync(modulesPath, updated)\n}\n\nexport type EjectableModule = {\n id: string\n title?: string\n description?: string\n from: string\n}\n\nexport function listEjectableModules(resolver: PackageResolver): EjectableModule[] {\n const modules = resolver.loadEnabledModules()\n const ejectable: EjectableModule[] = []\n\n for (const entry of modules) {\n if (entry.from === '@app') continue\n\n const { pkgBase } = resolver.getModulePaths(entry)\n const indexPath = path.join(pkgBase, 'index.ts')\n const metadata = parseModuleMetadata(indexPath)\n\n if (metadata.ejectable) {\n ejectable.push({\n id: entry.id,\n title: metadata.title,\n description: metadata.description,\n from: entry.from || '@open-mercato/core',\n })\n }\n }\n\n return ejectable\n}\n\nexport function ejectModule(resolver: PackageResolver, moduleId: string): void {\n const modules = resolver.loadEnabledModules()\n const entry = modules.find((m: ModuleEntry) => m.id === moduleId)\n\n if (!entry) {\n throw new Error(\n `Module \"${moduleId}\" is not listed in src/modules.ts. ` +\n `Available modules: ${modules.map((m: ModuleEntry) => m.id).join(', ')}`,\n )\n }\n\n if (entry.from === '@app') {\n throw new Error(\n `Module \"${moduleId}\" is already local (from: '@app'). Nothing to eject.`,\n )\n }\n\n const { pkgBase, appBase } = resolver.getModulePaths(entry)\n\n if (!fs.existsSync(pkgBase)) {\n throw new Error(\n `Package source directory not found: ${pkgBase}. ` +\n `Make sure the package is installed.`,\n )\n }\n\n const indexPath = path.join(pkgBase, 'index.ts')\n const metadata = parseModuleMetadata(indexPath)\n\n if (!metadata.ejectable) {\n throw new Error(\n `Module \"${moduleId}\" is not marked as ejectable. ` +\n `Only modules with \\`ejectable: true\\` in their metadata can be ejected.`,\n )\n }\n\n if (fs.existsSync(appBase)) {\n throw new Error(\n `Destination directory already exists: ${appBase}. ` +\n `Remove it first or resolve the conflict manually.`,\n )\n }\n\n copyDirRecursive(pkgBase, appBase)\n\n const modulesPath = resolver.getModulesConfigPath()\n updateModulesTs(modulesPath, moduleId)\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
package/src/lib/eject.ts DELETED
@@ -1,164 +0,0 @@
1
- import path from 'node:path'
2
- import fs from 'node:fs'
3
- import type { PackageResolver, ModuleEntry } from './resolver'
4
-
5
- type ModuleMetadata = {
6
- ejectable?: boolean
7
- title?: string
8
- description?: string
9
- }
10
-
11
- const SKIP_DIRS = new Set(['__tests__', '__mocks__', 'node_modules'])
12
-
13
- export function parseModuleMetadata(indexPath: string): ModuleMetadata {
14
- if (!fs.existsSync(indexPath)) return {}
15
-
16
- const source = fs.readFileSync(indexPath, 'utf8')
17
- const result: ModuleMetadata = {}
18
-
19
- const ejectableMatch = source.match(/ejectable\s*:\s*(true|false)/)
20
- if (ejectableMatch) {
21
- result.ejectable = ejectableMatch[1] === 'true'
22
- }
23
-
24
- const titleMatch = source.match(/title\s*:\s*['"]([^'"]+)['"]/)
25
- if (titleMatch) {
26
- result.title = titleMatch[1]
27
- }
28
-
29
- const descMatch = source.match(/description\s*:\s*['"]([^'"]+)['"]/)
30
- if (descMatch) {
31
- result.description = descMatch[1]
32
- }
33
-
34
- return result
35
- }
36
-
37
- export function copyDirRecursive(src: string, dest: string): void {
38
- fs.mkdirSync(dest, { recursive: true })
39
-
40
- const entries = fs.readdirSync(src, { withFileTypes: true })
41
- for (const entry of entries) {
42
- if (SKIP_DIRS.has(entry.name)) continue
43
-
44
- const srcPath = path.join(src, entry.name)
45
- const destPath = path.join(dest, entry.name)
46
-
47
- if (entry.isDirectory()) {
48
- copyDirRecursive(srcPath, destPath)
49
- } else {
50
- fs.copyFileSync(srcPath, destPath)
51
- }
52
- }
53
- }
54
-
55
- export function updateModulesTs(modulesPath: string, moduleId: string): void {
56
- if (!fs.existsSync(modulesPath)) {
57
- throw new Error(`modules.ts not found at ${modulesPath}`)
58
- }
59
-
60
- const source = fs.readFileSync(modulesPath, 'utf8')
61
-
62
- // Match the module entry and replace its `from` value with '@app'
63
- // Handles patterns like: { id: 'currencies', from: '@open-mercato/core' }
64
- const pattern = new RegExp(
65
- `(\\{\\s*id:\\s*['"]${moduleId}['"]\\s*,\\s*from:\\s*)'([^']*)'`,
66
- )
67
- const patternDouble = new RegExp(
68
- `(\\{\\s*id:\\s*['"]${moduleId}['"]\\s*,\\s*from:\\s*)"([^"]*)"`,
69
- )
70
-
71
- let updated = source
72
- if (pattern.test(source)) {
73
- updated = source.replace(pattern, `$1'@app'`)
74
- } else if (patternDouble.test(source)) {
75
- updated = source.replace(patternDouble, `$1"@app"`)
76
- } else {
77
- throw new Error(
78
- `Could not find module entry for "${moduleId}" in ${modulesPath}. ` +
79
- `Expected a pattern like: { id: '${moduleId}', from: '...' }`,
80
- )
81
- }
82
-
83
- fs.writeFileSync(modulesPath, updated)
84
- }
85
-
86
- export type EjectableModule = {
87
- id: string
88
- title?: string
89
- description?: string
90
- from: string
91
- }
92
-
93
- export function listEjectableModules(resolver: PackageResolver): EjectableModule[] {
94
- const modules = resolver.loadEnabledModules()
95
- const ejectable: EjectableModule[] = []
96
-
97
- for (const entry of modules) {
98
- if (entry.from === '@app') continue
99
-
100
- const { pkgBase } = resolver.getModulePaths(entry)
101
- const indexPath = path.join(pkgBase, 'index.ts')
102
- const metadata = parseModuleMetadata(indexPath)
103
-
104
- if (metadata.ejectable) {
105
- ejectable.push({
106
- id: entry.id,
107
- title: metadata.title,
108
- description: metadata.description,
109
- from: entry.from || '@open-mercato/core',
110
- })
111
- }
112
- }
113
-
114
- return ejectable
115
- }
116
-
117
- export function ejectModule(resolver: PackageResolver, moduleId: string): void {
118
- const modules = resolver.loadEnabledModules()
119
- const entry = modules.find((m: ModuleEntry) => m.id === moduleId)
120
-
121
- if (!entry) {
122
- throw new Error(
123
- `Module "${moduleId}" is not listed in src/modules.ts. ` +
124
- `Available modules: ${modules.map((m: ModuleEntry) => m.id).join(', ')}`,
125
- )
126
- }
127
-
128
- if (entry.from === '@app') {
129
- throw new Error(
130
- `Module "${moduleId}" is already local (from: '@app'). Nothing to eject.`,
131
- )
132
- }
133
-
134
- const { pkgBase, appBase } = resolver.getModulePaths(entry)
135
-
136
- if (!fs.existsSync(pkgBase)) {
137
- throw new Error(
138
- `Package source directory not found: ${pkgBase}. ` +
139
- `Make sure the package is installed.`,
140
- )
141
- }
142
-
143
- const indexPath = path.join(pkgBase, 'index.ts')
144
- const metadata = parseModuleMetadata(indexPath)
145
-
146
- if (!metadata.ejectable) {
147
- throw new Error(
148
- `Module "${moduleId}" is not marked as ejectable. ` +
149
- `Only modules with \`ejectable: true\` in their metadata can be ejected.`,
150
- )
151
- }
152
-
153
- if (fs.existsSync(appBase)) {
154
- throw new Error(
155
- `Destination directory already exists: ${appBase}. ` +
156
- `Remove it first or resolve the conflict manually.`,
157
- )
158
- }
159
-
160
- copyDirRecursive(pkgBase, appBase)
161
-
162
- const modulesPath = resolver.getModulesConfigPath()
163
- updateModulesTs(modulesPath, moduleId)
164
- }