UNPKG

2.51 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3'use strict';
4
5const { format, FORMATTERS } = require('../lib/sqlFormatter');
6const fs = require('fs');
7const { version } = require('../package.json');
8const { ArgumentParser } = require('argparse');
9
10const formatterKeys = Object.keys(FORMATTERS);
11
12function 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
59function 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
68function 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
85function writeOutput(file, query) {
86 if (file === null) {
87 // No output file, write to console
88 console.log(query);
89 } else {
90 fs.writeFileSync(file, query);
91 }
92}
93
94const args = getArgs();
95const cfg = configFromArgs(args);
96const query = getInput(args.file);
97const formattedQuery = format(query, cfg).trim() + '\n';
98writeOutput(args.output, formattedQuery);