xy-sql-formatter
Version:
Format whitespace in a SQL query to make it more readable
49 lines (42 loc) • 1.55 kB
text/typescript
import {
DialectFormatOptions,
ProcessedDialectFormatOptions,
} from './formatter/ExpressionFormatter.js';
import Tokenizer from './lexer/Tokenizer.js';
import { TokenizerOptions } from './lexer/TokenizerOptions.js';
export interface DialectOptions {
name: string;
tokenizerOptions: TokenizerOptions;
formatOptions: DialectFormatOptions;
}
export interface Dialect {
tokenizer: Tokenizer;
formatOptions: ProcessedDialectFormatOptions;
}
const cache = new Map<DialectOptions, Dialect>();
/**
* Factory function for building Dialect objects.
* When called repeatedly with same options object returns the cached Dialect,
* to avoid the cost of creating it again.
*/
export const createDialect = (options: DialectOptions): Dialect => {
let dialect = cache.get(options);
if (!dialect) {
dialect = dialectFromOptions(options);
cache.set(options, dialect);
}
return dialect;
};
const dialectFromOptions = (dialectOptions: DialectOptions): Dialect => ({
tokenizer: new Tokenizer(dialectOptions.tokenizerOptions, dialectOptions.name),
formatOptions: processDialectFormatOptions(dialectOptions.formatOptions),
});
const processDialectFormatOptions = (
options: DialectFormatOptions
): ProcessedDialectFormatOptions => ({
alwaysDenseOperators: options.alwaysDenseOperators || [],
onelineClauses: Object.fromEntries(options.onelineClauses.map(name => [name, true])),
tabularOnelineClauses: Object.fromEntries(
(options.tabularOnelineClauses ?? options.onelineClauses).map(name => [name, true])
),
});