diff --git a/README.md b/README.md index 64e2fc0b..76bd797b 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ mercur-cli dev - Node.js v20+ - PostgreSQL - Git CLI +- Nodemon # Resources diff --git a/apps/backend/dev-runner.js b/apps/backend/dev-runner.js new file mode 100644 index 00000000..4d91bdd5 --- /dev/null +++ b/apps/backend/dev-runner.js @@ -0,0 +1,62 @@ +const { spawn } = require('child_process') +const path = require('path') + +const ROOT = path.resolve(__dirname, '../..') +const MODULES_DIR = path.join(ROOT, 'packages/modules') +const modules = process.argv.slice(2) + +const children = [] +const run = (cmd, args, opts = {}) => { + const p = spawn(cmd, args, { stdio: 'pipe', shell: true, ...opts }) + children.push(p) + return p +} +const runInherit = (cmd, args, opts = {}) => { + const p = spawn(cmd, args, { stdio: 'inherit', shell: true, ...opts }) + children.push(p) + return p +} + +const backendCmd = + 'CHOKIDAR_USEPOLLING=1 CHOKIDAR_INTERVAL=300 nodemon --verbose --legacy-watch --signal SIGTERM -e js,json,ts -w src -w ../../packages/modules --exec "medusa develop --types=false"' + +const backend = run(backendCmd, [], { + cwd: path.resolve(__dirname), + env: { ...process.env } +}) + +const READY_RE = /(server|medusa).*(ready|listening|running|started)/i +let started = false +const startModules = () => { + if (started) return + started = true + modules.forEach((name) => { + const cwd = path.join(MODULES_DIR, name) + console.log(`\n[watch] ${name} → medusa plugin:develop`) + runInherit('npx', ['medusa', 'plugin:develop'], { cwd, env: process.env }) + }) +} + +backend.stdout.on('data', (b) => { + const line = b.toString() + process.stdout.write(line) + if (READY_RE.test(line)) startModules() +}) +backend.stderr.on('data', (b) => { + const line = b.toString() + process.stderr.write(line) + if (READY_RE.test(line)) startModules() +}) + +setTimeout(startModules, 8000).unref() + +backend.on('exit', (code) => { + children.forEach((c) => c !== backend && !c.killed && c.kill('SIGTERM')) + process.exit(code ?? 0) +}) +;['SIGINT', 'SIGTERM'].forEach((sig) => + process.on(sig, () => { + children.forEach((c) => !c.killed && c.kill('SIGTERM')) + process.exit(0) + }) +) diff --git a/apps/backend/package.json b/apps/backend/package.json index 8f2e3d95..f03cc03c 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -16,7 +16,7 @@ "build": "medusa build && ln -s .medusa/server/public/ public", "seed": "medusa exec ./src/scripts/seed.ts", "start": "medusa start --types=false", - "dev": "medusa develop --types=false", + "dev": "node ./dev-runner.js", "db:migrate": "medusa db:migrate", "test:integration:http": "TEST_TYPE=integration:http NODE_OPTIONS=--experimental-vm-modules jest --silent=false --runInBand --forceExit", "test:integration:modules": "TEST_TYPE=integration:modules NODE_OPTIONS=--experimental-vm-modules jest --silent --runInBand --forceExit", @@ -79,4 +79,4 @@ "engines": { "node": ">=20" } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 61b0a27c..c0017beb 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,9 @@ "format": "turbo run format", "lint": "turbo run lint", "codegen": "cd .", - "generate:oas": "turbo run generate:oas" + "generate:oas": "turbo run generate:oas", + "clean:dirs": "rimraf --glob \"node_modules\" \"**/node_modules\" \"**/.turbo\" \"**/.medusa\" \"**/dist\"", + "reinstall": "yarn", + "clean-build": "yarn clean:dirs && yarn cache clean --force && yarn reinstall && yarn build" } -} \ No newline at end of file +}