1 | #!/usr/bin/env node
|
2 |
|
3 | 'use strict';
|
4 |
|
5 | const { format, FORMATTERS } = require('../lib/sqlFormatter');
|
6 | const fs = require('fs');
|
7 | const { version } = require('../package.json');
|
8 | const { ArgumentParser } = require('argparse');
|
9 |
|
10 | const formatterKeys = Object.keys(FORMATTERS);
|
11 |
|
12 | function getArgs() {
|
13 | const parser = new ArgumentParser({
|
14 | version,
|
15 | addHelp: true,
|
16 | description: 'SQL Formatter',
|
17 | });
|
18 |
|
19 | parser.addArgument(['-f', '--file'], {
|
20 | help: 'Input SQL file (defaults to stdin)',
|
21 | });
|
22 | parser.addArgument(['-o', '--output'], {
|
23 | help: 'File to write SQL output (defaults to stdout)',
|
24 | });
|
25 |
|
26 | parser.addArgument(['-l', '--language'], {
|
27 | help: 'SQL Formatter dialect (defaults to basic sql)',
|
28 | choices: formatterKeys,
|
29 | defaultValue: 'sql',
|
30 | });
|
31 |
|
32 | const indentationGroup = parser.addMutuallyExclusiveGroup();
|
33 | indentationGroup.addArgument(['-i', '--indent'], {
|
34 | help: 'Number of spaces to indent query blocks (defaults to 2)',
|
35 | metavar: 'N',
|
36 | type: 'int',
|
37 | defaultValue: 2,
|
38 | });
|
39 | indentationGroup.addArgument(['-t', '--tab-indent'], {
|
40 | help: 'Indent query blocks with tabs instead of spaces',
|
41 | action: 'storeTrue',
|
42 | });
|
43 |
|
44 | parser.addArgument(['-u', '--uppercase'], {
|
45 | help: 'Capitalize language keywords',
|
46 | action: 'storeTrue',
|
47 | });
|
48 |
|
49 | parser.addArgument(['--lines-between-queries'], {
|
50 | help: 'How many newlines to insert between queries (separated by ";")',
|
51 | metavar: 'N',
|
52 | type: 'int',
|
53 | default: 1,
|
54 | });
|
55 |
|
56 | return parser.parseArgs();
|
57 | }
|
58 |
|
59 | function configFromArgs(args) {
|
60 | return {
|
61 | language: args.language,
|
62 | indent: args.tab_indent ? '\t' : ' '.repeat(args.indent),
|
63 | uppercase: args.uppercase,
|
64 | linesBetweenQueries: args.lines_between_queries,
|
65 | };
|
66 | }
|
67 |
|
68 | function getInput(file) {
|
69 | const infile = file || process.stdin.fd;
|
70 | try {
|
71 | return fs.readFileSync(infile, 'utf-8');
|
72 | } catch (e) {
|
73 | if (e.code === 'EAGAIN') {
|
74 | console.error('Error: no file specified and no data in stdin');
|
75 | process.exit(1);
|
76 | }
|
77 | if (e.code === 'ENOENT') {
|
78 | console.error(`Error: could not open file ${infile}`);
|
79 | process.exit(1);
|
80 | }
|
81 | throw e;
|
82 | }
|
83 | }
|
84 |
|
85 | function writeOutput(file, query) {
|
86 | if (file === null) {
|
87 |
|
88 | console.log(query);
|
89 | } else {
|
90 | fs.writeFileSync(file, query);
|
91 | }
|
92 | }
|
93 |
|
94 | const args = getArgs();
|
95 | const cfg = configFromArgs(args);
|
96 | const query = getInput(args.file);
|
97 | const formattedQuery = format(query, cfg).trim() + '\n';
|
98 | writeOutput(args.output, formattedQuery);
|