migrasafe 1.0.0 → 1.0.1

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/README.md CHANGED
@@ -2,45 +2,70 @@
2
2
 
3
3
  > Detect unsafe SQL migrations before deploying to production.
4
4
 
5
- Zero external dependencies. Single binary. Works in any CI pipeline.
5
+ Zero runtime dependencies. Single binary. Works in any CI pipeline.
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/migrasafe)](https://www.npmjs.com/package/migrasafe)
8
8
  [![license](https://img.shields.io/npm/l/migrasafe)](./LICENSE)
9
+ [![CI](https://github.com/febrifelis/migrasafe/actions/workflows/ci.yml/badge.svg)](https://github.com/febrifelis/migrasafe/actions/workflows/ci.yml)
9
10
 
10
11
  ---
11
12
 
12
13
  ## The Problem
13
14
 
14
- Running a bad migration in production can cause data loss, table locks, or downtime — often irreversible. `migrasafe` catches these issues **before** they reach your database.
15
+ Running a bad migration in production can cause data loss, table locks, or downtime — often irreversible.
16
+
17
+ ```sql
18
+ -- This will lock your table for minutes on 50M rows
19
+ CREATE INDEX idx_users_email ON users(email);
20
+
21
+ -- This will wipe every row if you forget the WHERE
22
+ DELETE FROM sessions;
23
+
24
+ -- This will fail on non-empty tables
25
+ ALTER TABLE orders ADD COLUMN status VARCHAR(20) NOT NULL;
26
+ ```
27
+
28
+ `migrasafe` catches these issues **before** they reach your database.
15
29
 
16
30
  ---
17
31
 
18
32
  ## Install
19
33
 
20
34
  ```bash
21
- # Run without installing
35
+ # Run without installing (recommended for CI)
22
36
  npx migrasafe check ./migrations/
23
37
 
24
- # Or install globally
38
+ # Install globally
25
39
  npm install -g migrasafe
26
40
  ```
27
41
 
42
+ **Requirements:** Node.js >= 18
43
+
28
44
  ---
29
45
 
30
- ## Usage
46
+ ## Quick Start
31
47
 
32
48
  ```bash
33
49
  # Check a single file
34
50
  migrasafe check migration.sql
35
51
 
36
- # Check a directory (scans all .sql files, sorted by name)
52
+ # Check a directory scans all .sql files, sorted by name
37
53
  migrasafe check ./migrations/
38
54
 
39
- # JSON output for CI pipelines and scripting
55
+ # JSON output for scripts and dashboards
40
56
  migrasafe check ./migrations/ --format json
57
+
58
+ # Only report CRITICAL and HIGH (ignore MEDIUM)
59
+ migrasafe check ./migrations/ --min-severity HIGH
60
+
61
+ # Skip files matching a pattern
62
+ migrasafe check ./migrations/ --ignore seed_ --ignore test_
63
+
64
+ # Install a git pre-commit hook
65
+ migrasafe install-hook
41
66
  ```
42
67
 
43
- **Exit codes:** `0` = safe, `1` = unsafe or error.
68
+ **Exit codes:** `0` = safe (no CRITICAL/HIGH), `1` = unsafe or error.
44
69
 
45
70
  ---
46
71
 
@@ -70,39 +95,299 @@ migrations/V2__add_status.sql
70
95
 
71
96
  ---
72
97
 
98
+ ## How It Works
99
+
100
+ ### 1. Write your migration
101
+
102
+ ```sql
103
+ -- migrations/V3__add_user_status.sql
104
+ ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL;
105
+ DROP TABLE old_sessions;
106
+ CREATE INDEX idx_users_status ON users(status);
107
+ ```
108
+
109
+ ### 2. Run migrasafe before deploying
110
+
111
+ ```bash
112
+ npx migrasafe check migrations/V3__add_user_status.sql
113
+ ```
114
+
115
+ ### 3. Read the output
116
+
117
+ ```
118
+ Scanning 1 file(s)...
119
+
120
+ migrations/V3__add_user_status.sql
121
+ ⚠ HIGH Line 1
122
+ Statement: ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL
123
+ Problem : ADD COLUMN NOT NULL without DEFAULT will fail on non-empty tables.
124
+ Fix : Use 3 steps: (1) ADD COLUMN nullable, (2) backfill data, (3) SET NOT NULL.
125
+
126
+ ✖ CRITICAL Line 2
127
+ Statement: DROP TABLE old_sessions
128
+ Problem : DROP TABLE is irreversible — all data will be permanently lost.
129
+ Fix : Use soft-delete or rename the table first, then drop it in a later migration.
130
+
131
+ ● MEDIUM Line 3
132
+ Statement: CREATE INDEX idx_users_status ON users(status)
133
+ Problem : CREATE INDEX without CONCURRENTLY locks the table and blocks reads/writes.
134
+ Fix : Use CREATE INDEX CONCURRENTLY to avoid table lock in production.
135
+
136
+ ── Summary ──────────────────────────────
137
+ CRITICAL : 1
138
+ HIGH : 1
139
+ MEDIUM : 1
140
+ Total : 3 issue(s) across 1 file(s)
141
+
142
+ ✖ UNSAFE — resolve all CRITICAL/HIGH issues before deploying
143
+ ```
144
+
145
+ ### 4. Fix the issues
146
+
147
+ ```sql
148
+ -- migrations/V3__add_user_status.sql (fixed)
149
+
150
+ -- ✅ Step 1: add column nullable first
151
+ ALTER TABLE users ADD COLUMN status VARCHAR(20);
152
+
153
+ -- ✅ Step 2: backfill existing rows
154
+ UPDATE users SET status = 'active' WHERE status IS NULL;
155
+
156
+ -- ✅ Step 3: now it's safe to set NOT NULL
157
+ ALTER TABLE users ALTER COLUMN status SET NOT NULL;
158
+
159
+ -- ✅ Rename instead of drop (drop in a later migration after code is deployed)
160
+ ALTER TABLE old_sessions RENAME TO old_sessions_deprecated;
161
+
162
+ -- ✅ Use CONCURRENTLY to avoid table lock
163
+ CREATE INDEX CONCURRENTLY idx_users_status ON users(status);
164
+ ```
165
+
166
+ ### 5. Run again — all clear
167
+
168
+ ```bash
169
+ npx migrasafe check migrations/V3__add_user_status.sql
170
+
171
+ # ✔ All migrations are safe — no issues found.
172
+ # exit code: 0
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Fix Guide
178
+
179
+ Common issues and how to resolve them:
180
+
181
+ ### ADD COLUMN NOT NULL without DEFAULT
182
+ ```sql
183
+ -- ✖ Fails on non-empty tables
184
+ ALTER TABLE users ADD COLUMN score INTEGER NOT NULL;
185
+
186
+ -- ✅ Safe approach (3 steps)
187
+ ALTER TABLE users ADD COLUMN score INTEGER; -- step 1: add nullable
188
+ UPDATE users SET score = 0 WHERE score IS NULL; -- step 2: backfill
189
+ ALTER TABLE users ALTER COLUMN score SET NOT NULL; -- step 3: enforce
190
+ ```
191
+
192
+ ### DELETE without WHERE
193
+ ```sql
194
+ -- ✖ Wipes entire table
195
+ DELETE FROM sessions;
196
+
197
+ -- ✅ Add a WHERE clause
198
+ DELETE FROM sessions WHERE expires_at < now();
199
+
200
+ -- ✅ Or use TRUNCATE only if intentional (migrasafe will warn)
201
+ TRUNCATE sessions;
202
+ ```
203
+
204
+ ### UPDATE without WHERE
205
+ ```sql
206
+ -- ✖ Updates every row
207
+ UPDATE users SET verified = true;
208
+
209
+ -- ✅ Add a WHERE clause
210
+ UPDATE users SET verified = true WHERE created_at < '2024-01-01';
211
+ ```
212
+
213
+ ### CREATE INDEX without CONCURRENTLY
214
+ ```sql
215
+ -- ✖ Locks the table
216
+ CREATE INDEX idx_users_email ON users(email);
217
+
218
+ -- ✅ Non-blocking
219
+ CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
220
+ ```
221
+
222
+ ### ALTER COLUMN TYPE
223
+ ```sql
224
+ -- ✖ Fails if data cannot be cast
225
+ ALTER TABLE orders ALTER COLUMN total TYPE NUMERIC(12,2);
226
+
227
+ -- ✅ Add an explicit USING clause
228
+ ALTER TABLE orders ALTER COLUMN total TYPE NUMERIC(12,2) USING total::NUMERIC(12,2);
229
+ ```
230
+
231
+ ### DROP TABLE
232
+ ```sql
233
+ -- ✖ Irreversible data loss
234
+ DROP TABLE old_orders;
235
+
236
+ -- ✅ Rename first, deploy, then drop in the next release
237
+ ALTER TABLE old_orders RENAME TO old_orders_deprecated;
238
+ -- (drop in a separate migration after confirming nothing references it)
239
+ ```
240
+
241
+ ### RENAME COLUMN
242
+ ```sql
243
+ -- ✖ Breaking change — old column name disappears immediately
244
+ ALTER TABLE users RENAME COLUMN username TO user_name;
245
+
246
+ -- ✅ Safe approach (expand-contract pattern)
247
+ ALTER TABLE users ADD COLUMN user_name VARCHAR(100); -- step 1: add new
248
+ UPDATE users SET user_name = username; -- step 2: copy data
249
+ -- step 3: deploy app with new column name
250
+ -- step 4: drop old column in next release
251
+ ALTER TABLE users DROP COLUMN username;
252
+ ```
253
+
254
+ ---
255
+
73
256
  ## Rules
74
257
 
75
- | Rule | Severity | Why |
258
+ ### CRITICAL will cause data loss or server failure
259
+
260
+ | Rule | Why |
261
+ |---|---|
262
+ | `DROP DATABASE` | Destroys the entire database and all its data permanently |
263
+ | `ALTER SYSTEM` | Modifies `postgresql.conf` directly — wrong value can make server unbootable |
264
+ | `DROP OWNED BY` | Silently drops all objects (tables, sequences, functions) owned by a role |
265
+ | `DROP TABLE` | Irreversible — all table data permanently lost |
266
+ | `DROP SCHEMA` | Irreversible — all tables, views, and data in the schema lost |
267
+ | `DROP COLUMN` | Irreversible — all column data permanently lost |
268
+ | `TRUNCATE` | Deletes every row immediately, no rollback in some configs |
269
+ | `DELETE` without `WHERE` | Deletes every row in the table |
270
+
271
+ ### HIGH — will cause failures or breaking changes
272
+
273
+ | Rule | Why |
274
+ |---|---|
275
+ | `UPDATE` without `WHERE` | Modifies every row in the table |
276
+ | `RENAME TABLE` | Breaking change — all queries using the old name will fail |
277
+ | `RENAME COLUMN` | Breaking change — all queries using the old column name will fail |
278
+ | `ADD COLUMN NOT NULL` without `DEFAULT` | Fails immediately on non-empty tables |
279
+ | `ALTER COLUMN TYPE` | Fails if existing data cannot be cast to the new type |
280
+ | `ALTER COLUMN SET NOT NULL` | Fails if any existing row contains NULL |
281
+ | `ALTER TABLE DISABLE TRIGGER` | Bypasses trigger-based validation — may allow dirty data |
282
+ | `MODIFY COLUMN` *(MySQL)* | May fail if data cannot be cast to the new type |
283
+ | `CHANGE COLUMN` *(MySQL)* | Renames and/or changes type — breaking change |
284
+
285
+ ### MEDIUM — may cause degraded performance or failures
286
+
287
+ | Rule | Why |
288
+ |---|---|
289
+ | `CREATE INDEX` without `CONCURRENTLY` | Locks the entire table during index build |
290
+ | `REINDEX` without `CONCURRENTLY` | Locks the index and blocks reads/writes |
291
+ | `DROP INDEX` | May degrade query performance for queries relying on it |
292
+ | `DROP CONSTRAINT` | Removes data validation — may allow dirty data |
293
+ | `ADD UNIQUE CONSTRAINT` | Fails if duplicate values already exist |
294
+ | `ADD CHECK CONSTRAINT` | Fails if existing rows violate the constraint |
295
+ | `DROP SEQUENCE` | May break auto-increment columns or application code |
296
+ | `DROP TYPE` | May break columns or functions using this type |
297
+ | `DROP DOMAIN` | May break columns or functions using this domain |
298
+ | `DROP AGGREGATE` | May break queries using this aggregate function |
299
+ | `LOCK TABLE` | Blocks all reads and writes for the duration of the lock |
300
+ | `CLUSTER` | Rewrites the entire table — holds exclusive lock throughout |
301
+ | `DETACH PARTITION` | May break queries and application code targeting the partition |
302
+ | `VACUUM FULL` | Holds an exclusive table lock for the full duration |
303
+
304
+ ---
305
+
306
+ ## What It Does NOT Flag
307
+
308
+ migrasafe is designed to avoid false positives. The following patterns are safe and will not trigger any rule:
309
+
310
+ ```sql
311
+ -- DELETE with WHERE — safe
312
+ DELETE FROM sessions WHERE expires_at < now();
313
+
314
+ -- UPDATE with WHERE — safe
315
+ UPDATE users SET active = false WHERE last_login < '2020-01-01';
316
+
317
+ -- CREATE INDEX CONCURRENTLY — safe, no table lock
318
+ CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
319
+
320
+ -- REINDEX CONCURRENTLY — safe
321
+ REINDEX INDEX CONCURRENTLY idx_users_email;
322
+
323
+ -- ADD COLUMN with DEFAULT — safe on PostgreSQL 11+
324
+ ALTER TABLE users ADD COLUMN preferences JSONB DEFAULT '{}';
325
+
326
+ -- Keywords inside string literals — ignored
327
+ INSERT INTO logs (message) VALUES ('DROP TABLE attempt blocked');
328
+
329
+ -- Keywords inside comments — ignored
330
+ -- This migration does NOT drop any table
331
+ ALTER TABLE users ADD COLUMN verified BOOLEAN DEFAULT false;
332
+
333
+ -- Dollar-quoted function bodies — body content is not executed
334
+ CREATE OR REPLACE FUNCTION cleanup() RETURNS void AS $$
335
+ BEGIN
336
+ DELETE FROM temp_data; -- ignored, inside function body
337
+ END;
338
+ $$ LANGUAGE plpgsql;
339
+ ```
340
+
341
+ ---
342
+
343
+ ## CLI Reference
344
+
345
+ ### `migrasafe check <target>`
346
+
347
+ Check a SQL file or directory for unsafe migrations.
348
+
349
+ | Option | Default | Description |
350
+ |---|---|---|
351
+ | `--format <text\|json>` | `text` | Output format |
352
+ | `--min-severity <level>` | `INFO` | Minimum severity to report: `CRITICAL`, `HIGH`, `MEDIUM`, `LOW`, `INFO` |
353
+ | `--ignore <pattern...>` | — | Skip files matching regex pattern(s) |
354
+
355
+ ### `migrasafe install-hook`
356
+
357
+ Install a git pre-commit hook that automatically runs `migrasafe` on staged `.sql` files before each commit.
358
+
359
+ ```bash
360
+ migrasafe install-hook
361
+ # ✔ migrasafe pre-commit hook installed at .git/hooks/pre-commit
362
+ ```
363
+
364
+ ---
365
+
366
+ ## Configuration File
367
+
368
+ Create `.migrasaferc.json` (or `.migrasaferc` / `migrasafe.config.json`) in your project root:
369
+
370
+ ```json
371
+ {
372
+ "ignore": ["seed_", "test_", "fixtures/"],
373
+ "disableRules": ["LOCK_TABLE", "CLUSTER"],
374
+ "minSeverity": "HIGH"
375
+ }
376
+ ```
377
+
378
+ | Field | Type | Description |
76
379
  |---|---|---|
77
- | `DROP DATABASE` | CRITICAL | Destroys the entire database and all its data |
78
- | `ALTER SYSTEM` | CRITICAL | Modifies server config wrong value can crash the server |
79
- | `DROP OWNED BY` | CRITICAL | Silently drops all objects owned by a role |
80
- | `DROP TABLE` | CRITICAL | Irreversible — all data permanently lost |
81
- | `DROP SCHEMA` | CRITICAL | Irreversible — all tables, views, and data lost |
82
- | `DROP COLUMN` | CRITICAL | Irreversible — column data permanently lost |
83
- | `TRUNCATE` | CRITICAL | Deletes all rows immediately |
84
- | `DELETE` without `WHERE` | CRITICAL | Deletes all rows |
85
- | `UPDATE` without `WHERE` | HIGH | Modifies all rows |
86
- | `RENAME TABLE` | HIGH | Breaking change for existing queries |
87
- | `RENAME COLUMN` | HIGH | Breaking change for existing queries |
88
- | `ADD COLUMN NOT NULL` without `DEFAULT` | HIGH | Fails on non-empty tables |
89
- | `ALTER COLUMN TYPE` | HIGH | May fail if data cannot be cast |
90
- | `ALTER COLUMN SET NOT NULL` | HIGH | Fails if any row has NULL in that column |
91
- | `CREATE INDEX` without `CONCURRENTLY` | MEDIUM | Locks table during index build |
92
- | `DROP INDEX` | MEDIUM | May degrade query performance |
93
- | `DROP CONSTRAINT` | MEDIUM | Removes data validation |
94
- | `ADD UNIQUE CONSTRAINT` | MEDIUM | Fails if duplicate values exist |
95
- | `ADD CHECK CONSTRAINT` | MEDIUM | Fails if existing rows violate the constraint |
96
- | `DROP SEQUENCE` | MEDIUM | May break auto-increment or application code |
97
- | `DROP TYPE` | MEDIUM | May break columns or functions using this type |
98
- | `LOCK TABLE` | MEDIUM | Blocks all reads and writes during the lock |
99
- | `CLUSTER` | MEDIUM | Locks the table for the full duration of the operation |
100
- | `REINDEX` without `CONCURRENTLY` | MEDIUM | Locks index and blocks reads/writes |
101
- | `DETACH PARTITION` | MEDIUM | May break queries targeting the partition |
102
- | `ALTER TABLE DISABLE TRIGGER` | HIGH | Bypasses trigger-based validation — may allow dirty data |
103
- | `VACUUM FULL` | MEDIUM | Locks the table exclusively for the full duration |
104
- | `DROP DOMAIN` | MEDIUM | May break columns or functions that use this domain |
105
- | `DROP AGGREGATE` | MEDIUM | May break queries that use this aggregate function |
380
+ | `ignore` | `string[]` | Regex patterns files matching any pattern are skipped |
381
+ | `disableRules` | `string[]` | Rule IDs to disable (see rule IDs below) |
382
+ | `minSeverity` | `string` | Minimum severity to report (`CRITICAL`, `HIGH`, `MEDIUM`, `LOW`, `INFO`) |
383
+
384
+ CLI flags take precedence over the config file.
385
+
386
+ ### Rule IDs
387
+
388
+ Use these in `disableRules`:
389
+
390
+ `DROP_DATABASE`, `ALTER_SYSTEM`, `DROP_OWNED`, `DROP_TABLE`, `DROP_SCHEMA`, `DROP_COLUMN`, `TRUNCATE`, `DELETE_WITHOUT_WHERE`, `UPDATE_WITHOUT_WHERE`, `RENAME_TABLE`, `RENAME_COLUMN`, `ADD_NOT_NULL_WITHOUT_DEFAULT`, `ALTER_COLUMN_TYPE`, `ALTER_COLUMN_SET_NOT_NULL`, `DISABLE_TRIGGER`, `MYSQL_ALTER_TABLE_MODIFY_COLUMN`, `MYSQL_ALTER_TABLE_CHANGE`, `CREATE_INDEX_WITHOUT_CONCURRENTLY`, `REINDEX_WITHOUT_CONCURRENTLY`, `DROP_INDEX`, `DROP_CONSTRAINT`, `ADD_UNIQUE_CONSTRAINT`, `ADD_CHECK_CONSTRAINT`, `DROP_SEQUENCE`, `DROP_TYPE`, `DROP_DOMAIN`, `DROP_AGGREGATE`, `LOCK_TABLE`, `CLUSTER`, `DETACH_PARTITION`, `VACUUM_FULL`
106
391
 
107
392
  ---
108
393
 
@@ -111,30 +396,59 @@ migrations/V2__add_status.sql
111
396
  ### GitHub Actions
112
397
 
113
398
  ```yaml
114
- - name: Check migration safety
115
- run: npx migrasafe check ./migrations/
399
+ name: Check migrations
400
+
401
+ on: [push, pull_request]
402
+
403
+ jobs:
404
+ migrate-check:
405
+ runs-on: ubuntu-latest
406
+ steps:
407
+ - uses: actions/checkout@v4
408
+ - name: Check migration safety
409
+ run: npx migrasafe check ./migrations/
116
410
  ```
117
411
 
118
412
  ### GitLab CI
119
413
 
120
414
  ```yaml
121
415
  check-migrations:
416
+ image: node:20
122
417
  script:
123
418
  - npx migrasafe check ./migrations/
124
419
  ```
125
420
 
126
- ### Pre-commit hook
421
+ ### Bitbucket Pipelines
422
+
423
+ ```yaml
424
+ pipelines:
425
+ default:
426
+ - step:
427
+ name: Check migration safety
428
+ script:
429
+ - npx migrasafe check ./migrations/
430
+ ```
431
+
432
+ ### Pre-commit hook (manual)
127
433
 
128
434
  ```bash
129
435
  #!/bin/sh
130
- npx migrasafe check ./migrations/
436
+ STAGED_SQL=$(git diff --cached --name-only --diff-filter=ACM | grep '\.sql$')
437
+ if [ -z "$STAGED_SQL" ]; then exit 0; fi
438
+ echo "$STAGED_SQL" | xargs npx migrasafe check
131
439
  ```
132
440
 
441
+ Or use the built-in installer: `migrasafe install-hook`
442
+
133
443
  ---
134
444
 
135
445
  ## JSON Output
136
446
 
137
- Use `--format json` for structured output in scripts or dashboards:
447
+ Use `--format json` for structured output in scripts, dashboards, or custom reporters:
448
+
449
+ ```bash
450
+ migrasafe check ./migrations/ --format json
451
+ ```
138
452
 
139
453
  ```json
140
454
  {
@@ -150,6 +464,13 @@ Use `--format json` for structured output in scripts or dashboards:
150
464
  "file": "migrations/V2__add_status.sql",
151
465
  "issueCount": 2,
152
466
  "issues": [
467
+ {
468
+ "severity": "HIGH",
469
+ "line": 1,
470
+ "statement": "ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL",
471
+ "message": "ADD COLUMN NOT NULL without DEFAULT will fail on non-empty tables.",
472
+ "suggestion": "Use 3 steps: (1) ADD COLUMN nullable, (2) backfill data, (3) SET NOT NULL."
473
+ },
153
474
  {
154
475
  "severity": "CRITICAL",
155
476
  "line": 2,
@@ -165,12 +486,31 @@ Use `--format json` for structured output in scripts or dashboards:
165
486
 
166
487
  ---
167
488
 
168
- ## What It Does NOT Flag
489
+ ## Works With
490
+
491
+ migrasafe understands standard SQL and PostgreSQL extensions out of the box:
492
+
493
+ - **Migration tools:** Flyway, Liquibase, golang-migrate, Alembic, Sqitch, Prisma
494
+ - **Databases:** PostgreSQL (full support), MySQL/MariaDB (core rules + MODIFY/CHANGE COLUMN)
495
+ - **SQL features handled correctly:** dollar-quoted strings (`$$`), single/double-quoted literals, line comments (`--`), block comments (`/* */`), CTEs, subqueries, stored procedures, CRLF line endings, UTF-8 BOM
496
+
497
+ ---
498
+
499
+ ## Security
500
+
501
+ - **No network access** — runs entirely offline
502
+ - **Read-only** — never writes to your database or files
503
+ - **No shell execution** — no `exec()` or `eval()`
504
+ - **File size limit** — rejects files over 10 MB to prevent OOM
505
+ - **Binary file guard** — skips non-text files automatically
506
+ - **Symlink protection** — skips symlinks in directory scans
507
+ - **Statement limit** — rejects files with more than 10,000 statements
508
+
509
+ ---
510
+
511
+ ## Contributing
169
512
 
170
- - `DELETE FROM table WHERE condition` safe, has a WHERE clause
171
- - `UPDATE table SET col = val WHERE condition` — safe, has a WHERE clause
172
- - `CREATE INDEX CONCURRENTLY` — safe, no table lock
173
- - Keywords inside SQL string literals or comments — ignored
513
+ See [CONTRIBUTING.md](./CONTRIBUTING.md) for how to add rules, write tests, and submit pull requests.
174
514
 
175
515
  ---
176
516
 
@@ -206,13 +206,6 @@ const RULES = [
206
206
  suggestion: "Ensure no queries or views reference this aggregate before dropping it.",
207
207
  },
208
208
  // ── MySQL-specific rules ─────────────────────────────────────────────────
209
- {
210
- id: "MYSQL_DROP_DATABASE",
211
- severity: "CRITICAL",
212
- pattern: /\bDROP\s+(?:DATABASE|SCHEMA)\b/i,
213
- message: "DROP DATABASE/SCHEMA is irreversible — all tables and data will be permanently lost.",
214
- suggestion: "Back up the database and confirm with your team before dropping.",
215
- },
216
209
  {
217
210
  id: "MYSQL_ALTER_TABLE_MODIFY_COLUMN",
218
211
  severity: "HIGH",
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/checker/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/checker/rules.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ const program = new commander_1.Command();
15
15
  program
16
16
  .name("migrasafe")
17
17
  .description("Detect unsafe SQL migrations before deploying to production")
18
- .version("1.0.0");
18
+ .version("1.0.1");
19
19
  program
20
20
  .command("check <target>")
21
21
  .description("Check a SQL file or directory of migrations")
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "migrasafe",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Detect unsafe SQL migrations before deploying to production",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
- "migrasafe": "./dist/index.js"
7
+ "migrasafe": "dist/index.js"
8
8
  },
9
9
  "scripts": {
10
10
  "build": "tsc",
@@ -12,7 +12,17 @@
12
12
  "start": "node dist/index.js",
13
13
  "prepublishOnly": "npm run build"
14
14
  },
15
- "keywords": ["sql", "migration", "database", "safety", "cli", "devops", "postgresql", "flyway", "liquibase"],
15
+ "keywords": [
16
+ "sql",
17
+ "migration",
18
+ "database",
19
+ "safety",
20
+ "cli",
21
+ "devops",
22
+ "postgresql",
23
+ "flyway",
24
+ "liquibase"
25
+ ],
16
26
  "author": {
17
27
  "name": "febrifelis",
18
28
  "url": "https://github.com/febrifelis"
@@ -20,7 +30,7 @@
20
30
  "license": "MIT",
21
31
  "repository": {
22
32
  "type": "git",
23
- "url": "https://github.com/febrifelis/migrasafe.git"
33
+ "url": "git+https://github.com/febrifelis/migrasafe.git"
24
34
  },
25
35
  "homepage": "https://github.com/febrifelis/migrasafe#readme",
26
36
  "bugs": {
@@ -41,7 +51,7 @@
41
51
  "typescript": "^6.0.3"
42
52
  },
43
53
  "dependencies": {
44
- "chalk": "^5.6.2",
54
+ "chalk": "^4.1.2",
45
55
  "commander": "^15.0.0"
46
56
  }
47
57
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../src/checker/checker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAoEnD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQvD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAO7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAclE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/checker/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,MAAM,UAAU,CAAC;AAiG3C,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,KAAK,EAAE,CAmBT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAY,MAAM,UAAU,CAAC;AAkBhD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkDrD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAyBrD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvE,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf"}