When pg-minify fails, it's hard to locate the issue
- Dominant language
- TypeScript
- Stars
- 835
- Forks
- 64
- Avg merge
- 17m
- Merged PRs (30d)
- 5
Description
### Summary
When pg-minify fails, Graphile Migrate outputs pg-minify's error, but doesn't relate it to the file that actually caused the problem. This is particularly problematic if you have a large (e.g. initial) migration and you're using the `current/` folder - you don't know which file the error occurred in.
### Steps to reproduce
`current/12000-insert_iso3166_countries.sql`:
```sql
COPY countries (name, alpha_2, code) FROM stdin DELIMITER '|';
Kyrgyzstan|KG|417
Lao People's Democratic Republic|LA|418
Latvia|LV|428
\.
```
### Expected results
Error on line 3 of `12000-insert_iso3166_countries.sql` (we don't support `COPY` syntax).
### Actual results
```
🛑 Error occurred whilst processing migration
SQLParsingError: Error parsing SQL at {line:24153,col:11}: Unclosed text block.
```
### Additional context
graphile-migrate 1.0.1; linux; `current/` folder.
### Possible Solution
The following mod to `dist/commands/watch.js` gives more information:
```js
let currentBodyMinified;
try {
currentBodyMinified = pgMinify(currentBodyFromDryRun);
} catch (e) {
const matches = e.message.match(/Error parsing SQL at \{line:(\d+),col:(\d+)\}/);
if (matches) {
const [_, ln, col] = matches;
const lines = currentBodyFromDryRun.split("\n");
const leadingLines = lines.slice(0, +ln);
const lastSplit = [...leadingLines].reverse().find(l => l.match(/^--! split/));
let filename = null;
let offset = 0;
if (lastSplit) {
filename = lastSplit.split(':')[1].trim();
const index = leadingLines.indexOf(lastSplit);
offset = index + 1;
}
const previousLine = lines[+ln - 2];
const line = lines[+ln - 1];
const nextLine = lines[+ln];
const details = filename ? `current/${filename} line ${+ln - offset}-ish` : `current.sql line ${ln}-ish`
console.error(`Error happened around here ${details}:`);
console.error();
console.error(previousLine || "");
console.error(line || "");
console.error("-".repeat(+col - 1) + "^");
console.error(nextLine || "");
}
throw e;
}
```
produces:
```
Error happened around here current/12000-insert_iso3166_countries.sql line 3-ish:
Kyrgyzstan|KG|417
Lao People's Democratic Republic|LA|418
----------^
Latvia|LV|428
🛑 Error occurred whilst processing migration
SQLParsingError: Error parsing SQL at {line:24153,col:11}: Unclosed text block.
```
Contributor guide
Assessment
This issue has not been assessed yet.