diff --git a/CHANGELOG.md b/CHANGELOG.md index 2586111..2f45747 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # Changelog All notable changes to this project will be documented in this file. +## 1.0.1 +- Ensured that nothing is logged directly to the console unless logging is enabled -## 1.0 +## 1.0.0 ### Changed **!BREAKING CHANGES!** - Added literal type information to fields to provide additional information about the field type. (#51) diff --git a/debug/test.js b/debug/test.js index 891ec3b..6f0a4e1 100644 --- a/debug/test.js +++ b/debug/test.js @@ -1,13 +1,14 @@ var soqlParserJs = require('./lib'); -const query = ` -SELECT Id, Name, FORMAT(Amount), - (SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) -FROM Opportunity -WHERE CreatedDate > LAST_N_YEARS:1 -AND StageName = 'Closed Won' -LIMIT 150 -`; +const query = `@`; +// const query = ` +// SELECT Id, Name, FORMAT(Amount), +// (SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) +// FROM Opportunity +// WHERE CreatedDate > LAST_N_YEARS:1 +// AND StageName = 'Closed Won' +// LIMIT 150 +// `; // SELECT Id FROM Account WHERE (Id IN ('1', '2', '3') OR (NOT Id = '2') OR (Name LIKE '%FOO%' OR (Name LIKE '%ARM%' AND FOO = 'bar'))) // SELECT Id FROM Account WHERE dateField != '2018-10-03' AND dateField < LAST_N_DAYS:5 AND dateField < LAST_WEEK AND isDeleted = false AND someOTherField = 'someVal' // SELECT Id, Name, Foo, Bar, Baz, Bax, aaa, bbb, ccc, ddd, Id, Name, Foo, Bar, Baz, Bax, aaa, bbb, ccc, ddd, Id, Name, Foo, Bar, Baz, Bax, aaa, bbb, ccc, ddd, Account.Name, (SELECT Id, Name, Foo, Bar, Baz, Bax, aaa, bbb, ccc, ddd, Id, Name, Foo, Bar, Baz, Bax, aaa, bbb, ccc, ddd, Contact.LastName FROM Account.Contacts), baz, (SELECT Id FROM account WHERE Boo.baz = 'bar'), bax, bar FROM Account diff --git a/docs/src/components/parse-soql-code-output.tsx b/docs/src/components/parse-soql-code-output.tsx new file mode 100644 index 0000000..c33d842 --- /dev/null +++ b/docs/src/components/parse-soql-code-output.tsx @@ -0,0 +1,51 @@ +import SyntaxHighlighter from 'react-syntax-highlighter/prism'; +import * as CopyToClipboard from 'react-copy-to-clipboard'; +import { xonokai } from 'react-syntax-highlighter/styles/prism'; + +import * as React from 'react'; +import { Button } from 'office-ui-fabric-react/lib/Button'; + +export interface CodeOutputProps { + title: string | JSX.Element; + lang: string; + data?: string; + showCopyToClipboard: boolean; + copyToClipboardDisabled: boolean; + showChildrenAboveClipboard?: boolean; + customStyle?: any; +} + +export default class CodeOutput extends React.Component { + constructor(props: CodeOutputProps) { + super(props); + } + + public render() { + return ( +
+
+
{this.props.title}
+ + {this.props.data} + +
+ {this.props.showChildrenAboveClipboard && this.props.children} + {this.props.showCopyToClipboard && this.props.data && ( + +
+
+
+ ); + } +} diff --git a/docs/src/components/parse-soql-format.tsx b/docs/src/components/parse-soql-format.tsx new file mode 100644 index 0000000..1844ab7 --- /dev/null +++ b/docs/src/components/parse-soql-format.tsx @@ -0,0 +1,104 @@ +import * as React from 'react'; +import { Checkbox } from 'office-ui-fabric-react/lib/Checkbox'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { FormatOptions } from 'soql-parser-js'; + +export interface ParseSoqlFormatProps { + style?: any; + formatOptions: FormatOptions; + enabled: boolean; + toggleFormat: (enabled: boolean) => void; + onChange: (formatOptions: FormatOptions) => void; +} + +export default class ParseSoqlFormat extends React.Component { + public setMaxFieldLen = (ev: React.SyntheticEvent) => { + const formatOptions = { + ...this.props.formatOptions, + fieldMaxLineLen: Math.max(0, Number((ev.target as HTMLInputElement).value)), + }; + this.props.onChange(formatOptions); + }; + + public toggleSubqueryParens = () => { + const formatOptions = { + ...this.props.formatOptions, + fieldSubqueryParensOnOwnLine: !this.props.formatOptions.fieldSubqueryParensOnOwnLine, + }; + this.props.onChange(formatOptions); + }; + + public toggleWhereClauseIndent = () => { + const formatOptions = { + ...this.props.formatOptions, + whereClauseOperatorsIndented: !this.props.formatOptions.whereClauseOperatorsIndented, + }; + this.props.onChange(formatOptions); + }; + + public render() { + return ( +
+ this.props.toggleFormat(!this.props.enabled)} + /> +
+
+ + Number of characters before fields wrap -{' '} + + fieldMaxLineLen + + + ) as any + } + type="number" + value={String(this.props.formatOptions.fieldMaxLineLen)} + onChange={this.setMaxFieldLen} + disabled={!this.props.enabled} + /> +
+
+ + Subquery Parenthesis on own line -{' '} + + fieldSubqueryParensOnOwnLine + + + ) as any + } + checked={this.props.formatOptions.fieldSubqueryParensOnOwnLine} + onChange={this.toggleSubqueryParens} + disabled={!this.props.enabled} + /> +
+
+ + Indent items in WHERE clause -{' '} + + whereClauseOperatorsIndented + + + ) as any + } + checked={this.props.formatOptions.whereClauseOperatorsIndented} + onChange={this.toggleWhereClauseIndent} + disabled={!this.props.enabled} + /> +
+
+
+ ); + } +} diff --git a/lib/SoqlParser.ts b/lib/SoqlParser.ts index ca7e8b1..873f575 100644 --- a/lib/SoqlParser.ts +++ b/lib/SoqlParser.ts @@ -1,4 +1,4 @@ -import { ANTLRInputStream, CommonTokenStream } from 'antlr4ts'; +import { ANTLRInputStream, CommonTokenStream, TokenStream } from 'antlr4ts'; import { ParseTreeWalker } from 'antlr4ts/tree'; import * as utils from './utils'; import { SyntaxErrorListener } from './ErrorListener'; @@ -6,6 +6,7 @@ import { SOQLLexer } from './generated/SOQLLexer'; import { SOQLParser, Soql_queryContext } from './generated/SOQLParser'; import { Query } from './models/SoqlQuery.model'; import { Listener, ListenerQuick } from './SoqlListener'; +import { Override } from 'antlr4ts/Decorators'; export interface ConfigBase { logging?: boolean; // default=false @@ -32,7 +33,12 @@ function configureDefaults(config: Partial = {}) { */ function getSoqlQueryContext(soql: string, config: Partial = {}): SOQLParser { let inputStream = new ANTLRInputStream(soql); + let lexer = new SOQLLexer(inputStream); + // bug-56 - The lever must have error listeners added to ensure no logging directly to the console + lexer.removeErrorListeners(); + lexer.addErrorListener(new SyntaxErrorListener()); + let tokenStream = new CommonTokenStream(lexer); const parser = new SOQLParser(tokenStream); diff --git a/package.json b/package.json index b6cd755..d02a1d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "soql-parser-js", - "version": "1.0.0", + "version": "1.0.1", "description": "Salesforce.com SOQL parser.", "main": "dist/index.js", "module": "dist/index.es.js",