drizzle-auto 1.1.10 → 1.1.12

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 +160 -92
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -6,127 +6,195 @@ const path = require("path");
6
6
  const fs = require("fs");
7
7
 
8
8
  /* =============================================================
9
- 🎨 NEON-PULSE UI CORE (Same as Next)
9
+ 🎨 NEON-PULSE UI CORE
10
10
  ============================================================= */
11
11
  const T = {
12
- reset: "\x1b[0m",
13
- bold: "\x1b[1m",
14
- italic: "\x1b[3m",
15
- underline: "\x1b[4m",
16
- cyan: "\x1b[38;5;51m",
17
- pink: "\x1b[38;5;201m",
18
- lime: "\x1b[38;5;118m",
19
- yellow: "\x1b[38;5;226m",
20
- red: "\x1b[38;5;196m",
21
- gray: "\x1b[38;5;244m",
22
- magenta: "\x1b[38;5;201m",
23
- bg_dark: "\x1b[48;5;234m"
12
+ reset: "\x1b[0m",
13
+ bold: "\x1b[1m",
14
+ italic: "\x1b[3m",
15
+ underline: "\x1b[4m",
16
+ cyan: "\x1b[38;5;51m",
17
+ pink: "\x1b[38;5;201m",
18
+ lime: "\x1b[38;5;118m",
19
+ yellow: "\x1b[38;5;226m",
20
+ red: "\x1b[38;5;196m",
21
+ gray: "\x1b[38;5;244m",
22
+ magenta: "\x1b[38;5;201m",
23
+ bg_dark: "\x1b[48;5;234m"
24
24
  };
25
25
 
26
26
  /* =============================================================
27
- ⏳ SPINNER & LOADING
27
+ ⏳ SPINNER & LOADING
28
28
  ============================================================= */
29
29
  const frames = ["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];
30
30
  let spinIdx = 0;
31
31
  let spinInterval;
32
32
 
33
33
  function startLoading(msg) {
34
- stopLoading();
35
- spinInterval = setInterval(() => {
36
- process.stdout.write(`\r${T.cyan}${frames[spinIdx++ % frames.length]}${T.reset} ${T.bold}${msg}${T.reset} `);
37
- }, 80);
34
+ stopLoading();
35
+ spinInterval = setInterval(() => {
36
+ process.stdout.write(\r${T.cyan}${frames[spinIdx++ % frames.length]}${T.reset} ${T.bold}${msg}${T.reset} );
37
+ }, 80);
38
38
  }
39
39
 
40
40
  function stopLoading() {
41
- if (spinInterval) { clearInterval(spinInterval); spinInterval = null; process.stdout.write("\r\x1b[K"); }
41
+ if (spinInterval) {
42
+ clearInterval(spinInterval);
43
+ spinInterval = null;
44
+ process.stdout.write("\r\x1b[K"); // Clear line
42
45
  }
46
+ }
47
+
48
+ /* =============================================================
49
+ 🧩 AUTO SCRIPT INJECTOR
50
+ ============================================================= */
51
+ const PKG = path.join(process.cwd(), "package.json");
52
+ function injectScript() {
53
+ if (!fs.existsSync(PKG)) return;
54
+ const pkg = JSON.parse(fs.readFileSync(PKG, "utf8"));
55
+ pkg.scripts ||= {};
56
+ if (!pkg.scripts.tea) {
57
+ pkg.scripts.tea = "drizzle-auto";
58
+ fs.writeFileSync(PKG, JSON.stringify(pkg, null, 2));
59
+ console.log(${T.lime}☕ Script added → npm run tea${T.reset});
60
+ }
61
+ }
62
+ injectScript();
43
63
 
44
- /* =========================
45
- 🔍 ALL FILES DRIZZLE DETECTOR
46
- ========================= */
64
+ /* =============================================================
65
+ 🔍 ALL FILES DRIZZLE DETECTOR
66
+ ============================================================= */
47
67
  function findDrizzleConfig(root) {
48
- const exts = ["js","mjs","ts","mts","cjs"];
49
- const files = [];
50
- function walk(dir) {
51
- fs.readdirSync(dir, { withFileTypes: true }).forEach(file => {
52
- const full = path.join(dir, file.name);
53
- if (file.isDirectory() && !/node_modules|\.git|\.next|dist/.test(file.name)) walk(full);
54
- else if (file.isFile() && exts.some(ext => file.name === `drizzle.config.${ext}`)) files.push(full);
55
- });
56
- }
57
- walk(root);
58
- return files;
68
+ const exts = ["js","mjs","ts","mts","cjs"];
69
+ const files = [];
70
+
71
+ function walk(dir) {
72
+ fs.readdirSync(dir, { withFileTypes: true }).forEach(file => {
73
+ const full = path.join(dir, file.name);
74
+ if (file.isDirectory() && !/node_modules|.git|.next|dist/.test(file.name)) {
75
+ walk(full);
76
+ } else if (file.isFile() && exts.some(ext => file.name === drizzle.config.${ext})) {
77
+ files.push(full);
78
+ }
79
+ });
80
+ }
81
+
82
+ walk(root);
83
+ return files;
59
84
  }
60
85
 
61
86
  function justifyStructure() {
62
- const configs = findDrizzleConfig(process.cwd());
63
- if (configs.length === 0) return { ok: false, msg: "Missing drizzle.config.*" };
64
- for (const configPath of configs) {
65
- try {
66
- const content = fs.readFileSync(configPath, "utf8");
67
- const schemaMatch = content.match(/schema:\s*["'](.+?)["']/);
68
- if (schemaMatch && schemaMatch[1]) {
69
- const schemaFull = path.resolve(path.dirname(configPath), schemaMatch[1]);
70
- if (!fs.existsSync(schemaFull)) return { ok: false, msg: `Schema not found: ${schemaMatch[1]}` };
71
- }
72
- } catch { return { ok: false, msg: `Config parse error in ${configPath}` }; }
73
- }
74
- return { ok: true, config: configs };
75
- }
76
-
77
- /* =========================
78
- ⚙️ SAFE STEP RUNNER
79
- ========================= */
87
+ const root = process.cwd();
88
+ const configs = findDrizzleConfig(root);
89
+ if (configs.length === 0) return { ok: false, msg: "Missing drizzle.config.*" };
90
+
91
+ for (const configPath of configs) {
92
+ try {
93
+ const content = fs.readFileSync(configPath, "utf8");
94
+ const schemaMatch = content.match(/schema:\s*"'["']/);
95
+ if (schemaMatch && schemaMatch[1]) {
96
+ const schemaFull = path.resolve(path.dirname(configPath), schemaMatch[1]);
97
+ if (!fs.existsSync(schemaFull)) {
98
+ return { ok: false, msg: Schema not found: ${schemaMatch[1]} in ${configPath} };
99
+ }
100
+ }
101
+ } catch (e) {
102
+ return { ok: false, msg: Config parse error in ${configPath} };
103
+ }
104
+ }
105
+
106
+ return { ok: true, config: configs };
107
+ }
108
+
109
+ /* =============================================================
110
+ ⚙️ SAFE STEP RUNNER
111
+ ============================================================= */
80
112
  function runStep(args, label) {
81
- return new Promise(resolve => {
82
- startLoading(`${T.pink}${label}${T.reset}`);
83
- let localErr = false;
84
- const child = spawn("npx", args, { shell: true, stdio: ["inherit","pipe","pipe"] });
85
- child.stdout.on("data", data => {
86
- const out = data.toString();
87
- if (!out.includes('Pulling schema')) { stopLoading(); process.stdout.write(`${T.gray}${out}${T.reset}`); }
88
- if (/error|failed|ENOTFOUND/i.test(out)) localErr = true;
89
- });
90
- child.stderr.on("data", data => { stopLoading(); process.stderr.write(`${T.red}${T.bold}✖ ${data}${T.reset}`); localErr = true; });
91
- child.on("close", code => { stopLoading(); resolve(code === 0 && !localErr); });
92
- });
93
- }
94
-
95
- /* =========================
96
- 🔁 ENGINE WORKFLOW
97
- ========================= */
113
+ return new Promise((resolve) => {
114
+ startLoading(${T.pink}${label}${T.reset});
115
+ let localErr = false;
116
+
117
+ const child = spawn("npx", args, { shell: true, stdio: ["inherit", "pipe", "pipe"] });
118
+
119
+ child.stdout.on("data", (data) => {
120
+ const out = data.toString();
121
+ if (!out.includes('Pulling schema')) {
122
+ stopLoading();
123
+ process.stdout.write(`${T.gray}${out}${T.reset}`);
124
+ }
125
+ if (/error|failed|ENOTFOUND/i.test(out)) localErr = true;
126
+ });
127
+
128
+ child.stderr.on("data", (data) => {
129
+ stopLoading();
130
+ process.stderr.write(`${T.red}${T.bold}✖ ${data}${T.reset}`);
131
+ localErr = true;
132
+ });
133
+
134
+ child.on("close", (code) => {
135
+ stopLoading();
136
+ resolve(code === 0 && !localErr);
137
+ });
138
+
139
+ });
140
+ }
141
+
142
+ /* =============================================================
143
+ 🔁 ENGINE WORKFLOW
144
+ ============================================================= */
98
145
  let isRunning = false;
146
+ let hasError = false;
99
147
 
100
148
  async function triggerEngine(event) {
101
- if (isRunning) return;
102
- isRunning = true;
103
-
104
- const audit = justifyStructure();
105
- if (!audit.ok) { console.log(`${T.red}${T.bold}🛑 CRITICAL FAILURE:${T.reset} ${audit.msg}`); isRunning=false; return; }
149
+ if (isRunning) return;
150
+ isRunning = true;
106
151
 
107
- const steps = [
108
- { name: "Build Check", args:["drizzle-kit","check"] },
109
- { name: "Generate Migrations", args:["drizzle-kit","generate"] },
110
- { name: "Push Database", args:["drizzle-kit","push"] }
111
- ];
152
+ const audit = justifyStructure();
153
+ if (!audit.ok) {
154
+ console.log(${T.red}${T.bold}🛑 CRITICAL FAILURE:${T.reset} ${audit.msg});
155
+ hasError = true; isRunning = false; return;
156
+ }
112
157
 
113
- for (const step of steps) {
114
- const success = await runStep(step.args, step.name);
115
- if (!success) { console.log(`\n${T.red}${T.bold}✖ PIPELINE CRASHED AT [${step.name.toUpperCase()}]${T.reset}`); isRunning=false; return; }
116
- }
158
+ const steps = [
159
+ { name: "Confirming Integrity", args: ["drizzle-kit", "check"] },
160
+ { name: "Generating Migrations", args: ["drizzle-kit", "generate"] },
161
+ { name: "Pushing to Database", args: ["drizzle-kit", "push"] }
162
+ ];
163
+
164
+ for (const step of steps) {
165
+ const success = await runStep(step.args, step.name);
166
+ if (!success) {
167
+ console.log(\n${T.red}${T.bold}✖ PIPELINE CRASHED AT [${step.name.toUpperCase()}]${T.reset});
168
+ hasError = true; isRunning = false; return;
169
+ }
170
+ }
117
171
 
118
- console.log(`\n${T.lime}${T.bold}✔ SYSTEM JUSTIFIED & SYNCED${T.reset}`);
119
- console.log(`${T.gray}Waiting for next server-side change...${T.reset}\n`);
120
- isRunning = false;
172
+ hasError = false;
173
+ console.log(\n${T.lime}${T.bold}✔ SYSTEM JUSTIFIED & SYNCED${T.reset});
174
+ console.log(${T.gray}Waiting for next server-side change...${T.reset}\n);
175
+ isRunning = false;
121
176
  }
122
177
 
123
- /* =========================
124
- 👀 WATCHER & CRASH PROTECTION
125
- ========================= */
126
- chokidar.watch(".", { ignored:[/node_modules/, /\.git/, /\.next/, /dist/], ignoreInitial:true, usePolling:true, interval:300 })
127
- .on("all",(e,f)=>triggerEngine(`${e.toUpperCase()} -> ${path.basename(f)}`));
178
+ /* =============================================================
179
+ 👀 WATCHER & GLOBAL CRASH PROTECTION
180
+ ============================================================= */
181
+ chokidar.watch(".", {
182
+ ignored: [/node_modules/, /.git/, /.next/, /dist/],
183
+ ignoreInitial: true,
184
+ usePolling: true,
185
+ interval: 300
186
+ }).on("all", (e, f) => triggerEngine(${e.toUpperCase()} -> ${path.basename(f)}));
128
187
 
129
188
  triggerEngine("Initial Audit");
130
189
 
131
- process.on("uncaughtException",(err)=>{ stopLoading(); console.log(`\n${T.red}${T.bold}🛡️ PROTECTIVE SHIELD:${T.reset} ${err.message}`); isRunning=false; });
132
- process.on("SIGINT",()=>{ stopLoading(); console.log(`\n${T.yellow}Shutting down Drizzle-Auto...${T.reset}`); process.exit(); });
190
+ process.on("uncaughtException", (err) => {
191
+ stopLoading();
192
+ console.log(\n${T.red}${T.bold}🛡️ PROTECTIVE SHIELD:${T.reset} ${err.message});
193
+ isRunning = false;
194
+ });
195
+
196
+ process.on("SIGINT", () => {
197
+ stopLoading();
198
+ console.log(\n${T.yellow}Shutting down Drizzle-Auto...${T.reset});
199
+ process.exit();
200
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-auto",
3
- "version": "1.1.10",
3
+ "version": "1.1.12",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "pavel ahmmed hridoy",