drizzle-auto 1.0.16 → 1.0.18

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.
Files changed (2) hide show
  1. package/index.js +77 -41
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -5,104 +5,140 @@ const path = require("path");
5
5
  const chokidar = require("chokidar");
6
6
  const { spawn } = require("child_process");
7
7
 
8
+ /* =========================
9
+ 🧭 PROJECT ROOT
10
+ ========================= */
8
11
  const ROOT = process.cwd();
9
12
  const PKG = path.join(ROOT, "package.json");
10
13
 
11
- /* ================= COLORS ================= */
14
+ /* =========================
15
+ 🎨 COLORS
16
+ ========================= */
12
17
  const C = {
13
- r: "\x1b[0m",
14
- g: "\x1b[32m",
15
- y: "\x1b[33m",
16
- c: "\x1b[36m",
17
- b: "\x1b[1m",
18
+ reset: "\x1b[0m",
19
+ green: "\x1b[32m",
20
+ yellow: "\x1b[33m",
21
+ cyan: "\x1b[36m",
18
22
  red: "\x1b[31m",
23
+ bold: "\x1b[1m",
19
24
  dim: "\x1b[90m"
20
25
  };
21
26
 
22
27
  const log = {
23
- ok: m => console.log(`${C.g}✔${C.r} ${m}`),
24
- info: m => console.log(`${C.c}●${C.r} ${m}`),
25
- warn: m => console.log(`${C.y}▲${C.r} ${m}`),
26
- err: m => console.log(`${C.red}✖${C.r} ${m}`),
27
- dim: m => console.log(`${C.dim}${m}${C.r}`)
28
+ ok: (m) => console.log(`${C.green}✔${C.reset} ${m}`),
29
+ info: (m) => console.log(`${C.cyan}●${C.reset} ${m}`),
30
+ warn: (m) => console.log(`${C.yellow}▲${C.reset} ${m}`),
31
+ err: (m) => console.log(`${C.red}✖${C.reset} ${m}`),
32
+ dim: (m) => console.log(`${C.dim}${m}${C.reset}`)
28
33
  };
29
34
 
30
- /* ================= SCRIPT INJECT ================= */
35
+ /* =========================
36
+ 🧩 SCRIPT INJECTOR
37
+ ========================= */
31
38
  function injectScript() {
32
39
  if (!fs.existsSync(PKG)) return;
33
-
34
40
  const pkg = JSON.parse(fs.readFileSync(PKG, "utf8"));
35
41
  pkg.scripts ||= {};
36
42
 
37
43
  if (!pkg.scripts.tea) {
38
44
  pkg.scripts.tea = "drizzle-auto";
39
45
  fs.writeFileSync(PKG, JSON.stringify(pkg, null, 2));
40
- log.ok("Added script → npm run tea");
46
+ log.ok("Script added → npm run tea");
41
47
  }
42
48
  }
43
49
 
44
- /* ================= DRIZZLE DETECT ================= */
45
- function hasDrizzle() {
46
- return ["js", "mjs", "ts", "mts"]
47
- .some(e => fs.existsSync(path.join(ROOT, `drizzle.config.${e}`)));
50
+ /* =========================
51
+ 🔍 DRIZZLE DETECTOR
52
+ ========================= */
53
+ function detectDrizzle() {
54
+ const configs = ["js", "mjs", "ts", "mts"]
55
+ .map(ext => `drizzle.config.${ext}`)
56
+ .find(f => fs.existsSync(path.join(ROOT, f)));
57
+
58
+ if (!configs) {
59
+ log.warn("No drizzle.config found");
60
+ return null;
61
+ }
62
+
63
+ let schemaPath = null;
64
+ try {
65
+ const content = fs.readFileSync(path.join(ROOT, configs), "utf8");
66
+ const match = content.match(/schema:\s*['"](.+?)['"]/);
67
+ if (match) schemaPath = path.join(ROOT, match[1]);
68
+ } catch {}
69
+
70
+ if (schemaPath && !fs.existsSync(schemaPath)) {
71
+ log.err("Schema file missing");
72
+ return null;
73
+ }
74
+
75
+ return { config: configs, schema: schemaPath };
48
76
  }
49
77
 
50
- /* ================= RUNNER ================= */
51
- function run(args) {
52
- return new Promise(res => {
53
- const p = spawn("npx", args, { shell: true });
54
- let fail = false;
78
+ /* =========================
79
+ ⚙️ SAFE COMMAND RUNNER
80
+ ========================= */
81
+ function run(cmd) {
82
+ return new Promise(resolve => {
83
+ let failed = false;
84
+ const p = spawn("npx", cmd, { shell: true });
55
85
 
56
86
  p.stdout.on("data", d => process.stdout.write(d));
57
87
  p.stderr.on("data", d => {
58
- fail = true;
88
+ failed = true;
59
89
  process.stderr.write(d);
60
90
  });
61
91
 
62
- p.on("close", c => res(c === 0 && !fail));
92
+ p.on("close", code => resolve(code === 0 && !failed));
63
93
  });
64
94
  }
65
95
 
66
- /* ================= PIPELINE ================= */
96
+ /* =========================
97
+ 🔁 PIPELINE (NON-KILLING)
98
+ ========================= */
67
99
  let busy = false;
100
+
68
101
  async function pipeline(trigger) {
69
102
  if (busy) return;
70
103
  busy = true;
71
104
 
72
105
  log.info(`Trigger → ${trigger}`);
73
106
 
74
- if (!hasDrizzle()) {
75
- log.warn("No drizzle config found");
107
+ const drizzle = detectDrizzle();
108
+ if (!drizzle) {
76
109
  busy = false;
77
110
  return;
78
111
  }
79
112
 
80
- if (!(await run(["drizzle-kit", "generate"]))) {
81
- log.err("Generate failed — stopping");
113
+ const genOK = await run(["drizzle-kit", "generate"]);
114
+ if (!genOK) {
115
+ log.err("Generate failed — pipeline paused");
82
116
  busy = false;
83
117
  return;
84
118
  }
85
119
 
86
- if (!(await run(["drizzle-kit", "push"]))) {
87
- log.warn("Push failed — server alive");
120
+ const pushOK = await run(["drizzle-kit", "push"]);
121
+ if (!pushOK) {
122
+ log.warn("Push failed — server still running");
88
123
  busy = false;
89
124
  return;
90
125
  }
91
126
 
92
- log.ok("Drizzle synced");
127
+ log.ok("Drizzle fully synced");
93
128
  busy = false;
94
129
  }
95
130
 
96
- /* ================= ENTRY ================= */
97
- if (process.argv.includes("--inject")) {
98
- injectScript();
99
- process.exit(0);
100
- }
101
-
131
+ /* =========================
132
+ 👀 WATCHER (ALWAYS ALIVE)
133
+ ========================= */
102
134
  injectScript();
103
135
  pipeline("Initial");
104
136
 
105
137
  chokidar.watch(ROOT, {
106
138
  ignored: [/node_modules/, /\.git/, /\.next/, /dist/],
107
- ignoreInitial: true
108
- }).on("all", (_, f) => pipeline(path.basename(f)));
139
+ ignoreInitial: true,
140
+ usePolling: true,
141
+ interval: 300
142
+ }).on("all", (_, file) => {
143
+ pipeline(path.basename(file));
144
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-auto",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "pavel ahmmed hridoy",