From 8c2b99c8d61a1ea9d046f786867f13c0dbee5931 Mon Sep 17 00:00:00 2001 From: inferrinizzard Date: Sat, 1 Oct 2022 12:14:57 -0700 Subject: [PATCH 1/5] move language validation to general format function --- src/sqlFormatter.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sqlFormatter.ts b/src/sqlFormatter.ts index 45b0409849..7452b75769 100644 --- a/src/sqlFormatter.ts +++ b/src/sqlFormatter.ts @@ -62,11 +62,15 @@ const defaultOptions: FormatOptions = { * @param {FormatOptions} cfg Configuration options (see docs in README) * @return {string} formatted query */ -export const format = (query: string, cfg: Partial = {}): string => { +export const format = (query: string, cfg: Partial = defaultOptions): string => { if (typeof query !== 'string') { throw new Error('Invalid query argument. Expected string, instead got ' + typeof query); } + if (typeof cfg.language === 'string' && !supportedDialects.includes(cfg.language)) { + throw new ConfigError(`Unsupported SQL dialect: ${cfg.language}`); + } + const options = validateConfig({ ...defaultOptions, ...cfg, @@ -80,11 +84,7 @@ export const format = (query: string, cfg: Partial = {}): string export class ConfigError extends Error {} -function validateConfig(cfg: FormatOptions): FormatOptions { - if (typeof cfg.language === 'string' && !supportedDialects.includes(cfg.language)) { - throw new ConfigError(`Unsupported SQL dialect: ${cfg.language}`); - } - +const validateConfig = (cfg: FormatOptions): FormatOptions => { if ('multilineLists' in cfg) { throw new ConfigError('multilineLists config is no more supported.'); } @@ -116,11 +116,11 @@ function validateConfig(cfg: FormatOptions): FormatOptions { } return cfg; -} +}; -function validateParams(params: ParamItems | string[]): boolean { +const validateParams = (params: ParamItems | string[]): boolean => { const paramValues = params instanceof Array ? params : Object.values(params); return paramValues.every(p => typeof p === 'string'); -} +}; export type FormatFn = typeof format; From 2d6c0a7745cbc3199eebb54dc6c869801a15b458 Mon Sep 17 00:00:00 2001 From: inferrinizzard Date: Sat, 1 Oct 2022 12:25:56 -0700 Subject: [PATCH 2/5] move config validation to validateConfigs.ts --- src/sqlFormatter.ts | 47 ++-------------------------------------- src/validateConfigs.ts | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 src/validateConfigs.ts diff --git a/src/sqlFormatter.ts b/src/sqlFormatter.ts index 7452b75769..5bf8f0a8eb 100644 --- a/src/sqlFormatter.ts +++ b/src/sqlFormatter.ts @@ -16,7 +16,7 @@ import SingleStoreDbFormatter from './languages/singlestoredb/singlestoredb.form import SnowflakeFormatter from './languages/snowflake/snowflake.formatter'; import { FormatOptions } from './FormatOptions'; -import { ParamItems } from './formatter/Params'; +import { ConfigError, validateConfig, validateQuery } from './validateConfigs'; export const formatters = { bigquery: BigQueryFormatter, @@ -63,9 +63,7 @@ const defaultOptions: FormatOptions = { * @return {string} formatted query */ export const format = (query: string, cfg: Partial = defaultOptions): string => { - if (typeof query !== 'string') { - throw new Error('Invalid query argument. Expected string, instead got ' + typeof query); - } + validateQuery(query); if (typeof cfg.language === 'string' && !supportedDialects.includes(cfg.language)) { throw new ConfigError(`Unsupported SQL dialect: ${cfg.language}`); @@ -82,45 +80,4 @@ export const format = (query: string, cfg: Partial = defaultOptio return new FormatterCls(options).format(query); }; -export class ConfigError extends Error {} - -const validateConfig = (cfg: FormatOptions): FormatOptions => { - if ('multilineLists' in cfg) { - throw new ConfigError('multilineLists config is no more supported.'); - } - if ('newlineBeforeOpenParen' in cfg) { - throw new ConfigError('newlineBeforeOpenParen config is no more supported.'); - } - if ('newlineBeforeCloseParen' in cfg) { - throw new ConfigError('newlineBeforeCloseParen config is no more supported.'); - } - if ('aliasAs' in cfg) { - throw new ConfigError('aliasAs config is no more supported.'); - } - - if (cfg.expressionWidth <= 0) { - throw new ConfigError( - `expressionWidth config must be positive number. Received ${cfg.expressionWidth} instead.` - ); - } - - if (cfg.commaPosition === 'before' && cfg.useTabs) { - throw new ConfigError( - 'commaPosition: before does not work when tabs are used for indentation.' - ); - } - - if (cfg.params && !validateParams(cfg.params)) { - // eslint-disable-next-line no-console - console.warn('WARNING: All "params" option values should be strings.'); - } - - return cfg; -}; - -const validateParams = (params: ParamItems | string[]): boolean => { - const paramValues = params instanceof Array ? params : Object.values(params); - return paramValues.every(p => typeof p === 'string'); -}; - export type FormatFn = typeof format; diff --git a/src/validateConfigs.ts b/src/validateConfigs.ts new file mode 100644 index 0000000000..52284731e0 --- /dev/null +++ b/src/validateConfigs.ts @@ -0,0 +1,49 @@ +import { FormatOptions } from './FormatOptions'; +import { ParamItems } from './formatter/Params'; + +export class ConfigError extends Error {} + +export const validateQuery = (query: string) => { + if (typeof query !== 'string') { + throw new Error('Invalid query argument. Expected string, instead got ' + typeof query); + } +}; + +export const validateConfig = (cfg: FormatOptions): FormatOptions => { + if ('multilineLists' in cfg) { + throw new ConfigError('multilineLists config is no more supported.'); + } + if ('newlineBeforeOpenParen' in cfg) { + throw new ConfigError('newlineBeforeOpenParen config is no more supported.'); + } + if ('newlineBeforeCloseParen' in cfg) { + throw new ConfigError('newlineBeforeCloseParen config is no more supported.'); + } + if ('aliasAs' in cfg) { + throw new ConfigError('aliasAs config is no more supported.'); + } + + if (cfg.expressionWidth <= 0) { + throw new ConfigError( + `expressionWidth config must be positive number. Received ${cfg.expressionWidth} instead.` + ); + } + + if (cfg.commaPosition === 'before' && cfg.useTabs) { + throw new ConfigError( + 'commaPosition: before does not work when tabs are used for indentation.' + ); + } + + if (cfg.params && !validateParams(cfg.params)) { + // eslint-disable-next-line no-console + console.warn('WARNING: All "params" option values should be strings.'); + } + + return cfg; +}; + +const validateParams = (params: ParamItems | string[]): boolean => { + const paramValues = params instanceof Array ? params : Object.values(params); + return paramValues.every(p => typeof p === 'string'); +}; From 23a33b5660f71c9fa76af86b96c4d23093f2ab82 Mon Sep 17 00:00:00 2001 From: inferrinizzard Date: Sat, 1 Oct 2022 12:27:42 -0700 Subject: [PATCH 3/5] add lang specific format for standard sql --- src/sqlFormatter.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/sqlFormatter.ts b/src/sqlFormatter.ts index 5bf8f0a8eb..5ec62c0a71 100644 --- a/src/sqlFormatter.ts +++ b/src/sqlFormatter.ts @@ -80,4 +80,16 @@ export const format = (query: string, cfg: Partial = defaultOptio return new FormatterCls(options).format(query); }; +export const formatStandardSQL: FormatFn = ( + query: string, + cfg: Partial> = {} +): string => { + validateQuery(query); + const options = validateConfig({ + ...defaultOptions, + ...cfg, + }); + return new SqlFormatter(options).format(query); +}; + export type FormatFn = typeof format; From 7d4017027d8221f23d3c7c982772d135daead3af Mon Sep 17 00:00:00 2001 From: inferrinizzard Date: Sat, 1 Oct 2022 13:36:45 -0700 Subject: [PATCH 4/5] add language specific format fns for all dialects --- src/sqlFormatter.ts | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/sqlFormatter.ts b/src/sqlFormatter.ts index 5ec62c0a71..24f5b29c3e 100644 --- a/src/sqlFormatter.ts +++ b/src/sqlFormatter.ts @@ -15,6 +15,7 @@ import TransactSqlFormatter from 'src/languages/transactsql/transactsql.formatte import SingleStoreDbFormatter from './languages/singlestoredb/singlestoredb.formatter'; import SnowflakeFormatter from './languages/snowflake/snowflake.formatter'; +import Formatter from './formatter/Formatter'; import { FormatOptions } from './FormatOptions'; import { ConfigError, validateConfig, validateQuery } from './validateConfigs'; @@ -80,16 +81,32 @@ export const format = (query: string, cfg: Partial = defaultOptio return new FormatterCls(options).format(query); }; -export const formatStandardSQL: FormatFn = ( - query: string, - cfg: Partial> = {} -): string => { - validateQuery(query); - const options = validateConfig({ - ...defaultOptions, - ...cfg, - }); - return new SqlFormatter(options).format(query); -}; +const languageFormat = + (FormatterCls: Lang) => + (query: string, cfg: Partial> = {}) => { + validateQuery(query); + const options = validateConfig({ + ...defaultOptions, + ...cfg, + }); + return new FormatterCls(options).format(query); + }; export type FormatFn = typeof format; + +export const formatBigQuery: FormatFn = languageFormat(BigQueryFormatter); +export const formatDb2: FormatFn = languageFormat(Db2Formatter); +export const formatHive: FormatFn = languageFormat(HiveFormatter); +export const formatMariaDb: FormatFn = languageFormat(MariaDbFormatter); +export const formatMySql: FormatFn = languageFormat(MySqlFormatter); +export const formatN1ql: FormatFn = languageFormat(N1qlFormatter); +export const formatPlSql: FormatFn = languageFormat(PlSqlFormatter); +export const formatPostgreSql: FormatFn = languageFormat(PostgreSqlFormatter); +export const formatRedshift: FormatFn = languageFormat(RedshiftFormatter); +export const formatSpark: FormatFn = languageFormat(SparkFormatter); +export const formatSqlite: FormatFn = languageFormat(SqliteFormatter); +export const formatStandardSQL: FormatFn = languageFormat(SqlFormatter); +export const formatTrino: FormatFn = languageFormat(TrinoFormatter); +export const formatTransactSql: FormatFn = languageFormat(TransactSqlFormatter); +export const formatSingleStoreDb: FormatFn = languageFormat(SingleStoreDbFormatter); +export const formatSnowflake: FormatFn = languageFormat(SnowflakeFormatter); From 50cd0274168010531fe2ad60cd6e87c285a1c4ce Mon Sep 17 00:00:00 2001 From: inferrinizzard Date: Sat, 1 Oct 2022 13:38:51 -0700 Subject: [PATCH 5/5] update exports --- src/index.ts | 21 ++++++++++++++++++++- src/sqlFormatter.ts | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index d0d3f6376e..59725952d5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,23 @@ -export * from './sqlFormatter'; +export { + format, + formatBigQuery, + formatDb2, + formatHive, + formatMariaDb, + formatMySql, + formatN1ql, + formatPlSql, + formatPostgreSql, + formatRedshift, + formatSpark, + formatSqlite, + formatStandardSQL, + formatTrino, + formatTransactSql, + formatSingleStoreDb, + formatSnowflake, +} from './sqlFormatter'; +export type { SqlLanguage, FormatFn } from './sqlFormatter'; export type { IndentStyle, KeywordCase, diff --git a/src/sqlFormatter.ts b/src/sqlFormatter.ts index 24f5b29c3e..89aa8d6686 100644 --- a/src/sqlFormatter.ts +++ b/src/sqlFormatter.ts @@ -19,7 +19,7 @@ import Formatter from './formatter/Formatter'; import { FormatOptions } from './FormatOptions'; import { ConfigError, validateConfig, validateQuery } from './validateConfigs'; -export const formatters = { +const formatters = { bigquery: BigQueryFormatter, db2: Db2Formatter, hive: HiveFormatter,