pg-sql2 4.13.0 → 5.0.0-0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # pg-sql2
2
+
3
+ ## 5.0.0-0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`9b296ba54`](undefined) - More secure, more compatible, and lots of fixes
8
+ across the monorepo
9
+
10
+ ## 5.0.0-0.1
11
+
12
+ ### Patch Changes
13
+
14
+ - [#125](https://github.com/benjie/postgraphile-private/pull/125)
15
+ [`91f2256b3`](https://github.com/benjie/postgraphile-private/commit/91f2256b3fd699bec19fc86f1ca79df057e58639)
16
+ Thanks [@benjie](https://github.com/benjie)! - Initial changesets release
17
+
18
+ - Updated dependencies
19
+ [[`91f2256b3`](https://github.com/benjie/postgraphile-private/commit/91f2256b3fd699bec19fc86f1ca79df057e58639)]:
20
+ - @graphile/lru@5.0.0-0.1
package/LICENSE.md CHANGED
@@ -2,23 +2,19 @@
2
2
 
3
3
  Copyright © `2019` Benjie Gillam
4
4
 
5
- Permission is hereby granted, free of charge, to any person
6
- obtaining a copy of this software and associated documentation
7
- files (the Software”), to deal in the Software without
8
- restriction, including without limitation the rights to use,
9
- copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the
11
- Software is furnished to do so, subject to the following
12
- conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the “Software”), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
13
11
 
14
- The above copyright notice and this permission notice shall be
15
- included in all copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
16
14
 
17
- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
18
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24
- OTHER DEALINGS IN THE SOFTWARE.
15
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  # pg-sql2
2
2
 
3
- Create SQL in a powerful and flexible manner without opening yourself to SQL
4
- injection attacks using the power of ES6 tagged template literals.
3
+ [![GitHub Sponsors](https://img.shields.io/github/sponsors/benjie?color=ff69b4&label=github%20sponsors)](https://github.com/sponsors/benjie)
4
+ [![Patreon sponsor button](https://img.shields.io/badge/sponsor-via%20Patreon-orange.svg)](https://patreon.com/benjie)
5
+ [![Discord chat room](https://img.shields.io/discord/489127045289476126.svg)](http://discord.gg/graphile)
6
+ [![Follow](https://img.shields.io/badge/twitter-@GraphileHQ-blue.svg)](https://twitter.com/GraphileHQ)
7
+
8
+ Create highly dynamic SQL in a powerful and flexible manner without opening
9
+ yourself to SQL injection attacks.
5
10
 
6
11
  A key aim of this library is to be very fast, if you think you can improve
7
12
  performance further please open a PR!
@@ -10,9 +15,9 @@ performance further please open a PR!
10
15
 
11
16
  ## Crowd-funded open-source software
12
17
 
13
- To help us develop this software sustainably under the MIT license, we ask
14
- all individuals and businesses that use it to help support its ongoing
15
- maintenance and development via sponsorship.
18
+ To help us develop this software sustainably under the MIT license, we ask all
19
+ individuals and businesses that use it to help support its ongoing maintenance
20
+ and development via sponsorship.
16
21
 
17
22
  ### [Click here to find out more about sponsors and sponsorship.](https://www.graphile.org/sponsor/)
18
23
 
@@ -39,7 +44,7 @@ And please give some love to our featured sponsors 🤩:
39
44
  ## Usage
40
45
 
41
46
  ```js
42
- const sql = require("pg-sql2");
47
+ const { default: sql } = require("pg-sql2");
43
48
  // or import sql from 'pg-sql2';
44
49
 
45
50
  const tableName = "user";
@@ -48,25 +53,25 @@ const fields = ["name", "age", "height"];
48
53
  // sql.join is used to join fragments with a common separator, NOT to join tables!
49
54
  const sqlFields = sql.join(
50
55
  // sql.identifier safely escapes arguments and joins them with dots
51
- fields.map(fieldName => sql.identifier(tableName, fieldName)),
52
- ", "
56
+ fields.map((fieldName) => sql.identifier(tableName, fieldName)),
57
+ ", ",
53
58
  );
54
59
 
55
60
  // sql.value will store the value and instead add a placeholder to the SQL
56
61
  // statement, to ensure that no SQL injection can occur.
57
- const sqlConditions = sql.query`created_at > NOW() - interval '3 years' and age > ${sql.value(
58
- 22
62
+ const sqlConditions = sql`created_at > NOW() - interval '3 years' and age > ${sql.value(
63
+ 22,
59
64
  )}`;
60
65
 
61
66
  // This could be a full query, but we're going to embed it in another query safely
62
- const innerQuery = sql.query`select ${sqlFields} from ${sql.identifier(
63
- tableName
67
+ const innerQuery = sql`select ${sqlFields} from ${sql.identifier(
68
+ tableName,
64
69
  )} where ${sqlConditions}`;
65
70
 
66
71
  // Symbols are automatically assigned unique identifiers
67
72
  const sqlAlias = sql.identifier(Symbol());
68
73
 
69
- const query = sql.query`
74
+ const query = sql`
70
75
  with ${sqlAlias} as (${innerQuery})
71
76
  select
72
77
  (select json_agg(row_to_json(${sqlAlias})) from ${sqlAlias}) as all_data,
@@ -92,17 +97,19 @@ console.log(values); // [ 22 ]
92
97
 
93
98
  ## API
94
99
 
95
- ### `` sql.query`...` ``
100
+ ### `` sql`...` ``
96
101
 
97
- Builds part of (or the whole of) an SQL query, safely interpretting the embedded expressions. If a non `sql.*` expression is passed in, e.g.:
102
+ Builds part of (or the whole of) an SQL query, safely interpreting the embedded
103
+ expressions. If a non `sql` expression is passed in, e.g.:
98
104
 
99
105
  <!-- skip-example -->
100
106
 
101
107
  ```js
102
- sql.query`select ${1}`;
108
+ sql`select ${1}`;
103
109
  ```
104
110
 
105
- then an error will be thrown. Also accessible by the alias `sql.fragment`.
111
+ then an error will be thrown. This prevents SQL injection, as all values must go
112
+ through an allowed API.
106
113
 
107
114
  ### `sql.identifier(ident, ...)`
108
115
 
@@ -112,82 +119,85 @@ then each will be escaped and then they will be joined with dots (e.g.
112
119
 
113
120
  ### `sql.value(val)`
114
121
 
115
- Represents an SQL value, will be replaced with a placeholder and the value collected up at compile time.
122
+ Represents an SQL value, will be replaced with a placeholder and the value
123
+ collected up at compile time.
116
124
 
117
125
  ### `sql.literal(val)`
118
126
 
119
- As `sql.value`, but in the case of very simple values may write them directly
120
- to the SQL statement rather than using a placeholder. Should only be used with
121
- data that is not sensitive and is trusted (not user-provided data), e.g. for
122
- the key arguments to `json_build_object(key, val, key, val, ...)` which you
123
- have produced.
127
+ As `sql.value`, but in the case of very simple values may write them directly to
128
+ the SQL statement rather than using a placeholder. Should only be used with data
129
+ that is not sensitive and is trusted (not user-provided data), e.g. for the key
130
+ arguments to `json_build_object(key, val, key, val, ...)` which you have
131
+ produced.
124
132
 
125
- ### `sql.join(arrayOfFragments, delimeter)`
133
+ ### `sql.join(arrayOfFragments, delimiter)`
126
134
 
127
- Joins an array of sql.query values using the delimeter (which is treated as a raw SQL string); e.g.
135
+ Joins an array of `sql` values using the delimiter (which is treated as a raw
136
+ SQL string); e.g.
128
137
 
129
138
  ```js
130
- const arrayOfSqlFields = ["a", "b", "c", "d"].map(n => sql.identifier(n));
131
- sql.query`select ${sql.join(arrayOfSqlFields, ", ")}`; // -> select "a", "b", "c", "d"
139
+ const arrayOfSqlFields = ["a", "b", "c", "d"].map((n) => sql.identifier(n));
140
+ sql`select ${sql.join(arrayOfSqlFields, ", ")}`; // -> select "a", "b", "c", "d"
132
141
 
133
- const arrayOfSqlConditions = [
134
- sql.query`a = 1`,
135
- sql.query`b = 2`,
136
- sql.query`c = 3`,
137
- ];
138
- sql.query`where (${sql.join(arrayOfSqlConditions, ") and (")})`; // -> where (a = 1) and (b = 2) and (c = 3)
142
+ const arrayOfSqlConditions = [sql`a = 1`, sql`b = 2`, sql`c = 3`];
143
+ sql`where (${sql.join(arrayOfSqlConditions, ") and (")})`; // -> where (a = 1) and (b = 2) and (c = 3)
139
144
 
140
145
  const fragments = [
141
146
  { alias: "name", sqlFragment: sql.identifier("user", "name") },
142
147
  { alias: "age", sqlFragment: sql.identifier("user", "age") },
143
148
  ];
144
- sql.query`
149
+ sql`
145
150
  json_build_object(
146
151
  ${sql.join(
147
152
  fragments.map(
148
- ({ sqlFragment, alias }) =>
149
- sql.query`${sql.literal(alias)}, ${sqlFragment}`
153
+ ({ sqlFragment, alias }) => sql`${sql.literal(alias)}, ${sqlFragment}`,
150
154
  ),
151
- ",\n"
155
+ ",\n",
152
156
  )}
153
157
  )`;
154
158
 
155
159
  const arrayOfSqlInnerJoins = [
156
- sql.query`inner join bar on (bar.foo_id = foo.id)`,
157
- sql.query`inner join baz on (baz.bar_id = bar.id)`,
160
+ sql`inner join bar on (bar.foo_id = foo.id)`,
161
+ sql`inner join baz on (baz.bar_id = bar.id)`,
158
162
  ];
159
- sql.query`select * from foo ${sql.join(arrayOfSqlInnerJoins, " ")}`;
163
+ sql`select * from foo ${sql.join(arrayOfSqlInnerJoins, " ")}`;
160
164
  // select * from foo inner join bar on (bar.foo_id = foo.id) inner join baz on (baz.bar_id = bar.id)
161
165
  ```
162
166
 
163
167
  ### `sql.compile(query)`
164
168
 
165
- Compiles the query into an SQL statement and a list of values, ready to be executed
169
+ Compiles the query into an SQL statement and a list of values, ready to be
170
+ executed
166
171
 
167
172
  ```js
168
- const query = sql.query`...`;
173
+ const query = sql`...`;
169
174
  const { text, values } = sql.compile(query);
170
175
 
171
176
  // const { rows } = await pg.query(text, values);
172
177
  ```
173
178
 
179
+ ### `sql.compile(query, options)`
180
+
181
+ An advanced form of `sql.compile` that can be used to provide the placeholders
182
+ when you're using `sql.placeholder`.
183
+
174
184
  ## History
175
185
 
176
- This is a replacement for [@calebmer's
177
- `pg-sql`](https://www.npmjs.com/package/pg-sql), combining the additional work
178
- that was done to it [in
179
- postgraphql](https://github.com/postgraphql/postgraphql/blob/9c36d7e9b9ad74e665de18964fd2554f9f639903/src/postgres/utils/sql.ts)
186
+ This is a replacement for
187
+ [@calebmer's `pg-sql`](https://www.npmjs.com/package/pg-sql), combining the
188
+ additional work that was done to it
189
+ [in postgraphql](https://github.com/postgraphql/postgraphql/blob/9c36d7e9b9ad74e665de18964fd2554f9f639903/src/postgres/utils/sql.ts)
180
190
  and offering the following enhancements:
181
191
 
182
- - Better development experience for people not using Flow/TypeScript (throws
183
- errors a lot earlier allowing you to catch issues at the source)
192
+ - Better development experience for people not using TypeScript (throws errors a
193
+ lot earlier allowing you to catch issues at the source)
184
194
  - Slightly more helpful error messages
185
- - Uses a symbol-key on the query nodes to protect against an object
186
- accidentally being inserted verbatim and being treated as valid (because
187
- every Symbol is unique an attacker would need control of the code to get a
188
- reference to the Symbol in order to set it on an object (it cannot be
189
- serialised/deserialised via JSON or any other medium), and if the attacker
190
- has control of the code then you've already lost)
195
+ - Uses a symbol-key on the query nodes to protect against an object accidentally
196
+ being inserted verbatim and being treated as valid (because every Symbol is
197
+ unique an attacker would need control of the code to get a reference to the
198
+ Symbol in order to set it on an object (it cannot be serialised/deserialised
199
+ via JSON or any other medium), and if the attacker has control of the code
200
+ then you've already lost)
191
201
  - Adds `sql.literal` which is similar to `sql.value` but when used with simple
192
202
  values can write the valid direct to the SQL statement. **USE WITH CAUTION**.
193
203
  The purpose for this is if you are using _trusted_ values (e.g. for the keys
@@ -0,0 +1,199 @@
1
+ /**
2
+ * This is the secret to our safety; since this is a symbol it cannot be faked
3
+ * in a JSON payload and it cannot be constructed with a new Symbol (even with
4
+ * the same argument), so external data cannot make itself trusted.
5
+ */
6
+ declare const $$type: unique symbol;
7
+ /**
8
+ * Represents raw SQL, the text will be output verbatim into the compiled query.
9
+ */
10
+ export interface SQLRawNode {
11
+ readonly [$$type]: "RAW";
12
+ /** text */
13
+ readonly t: string;
14
+ }
15
+ /**
16
+ * Represents an SQL identifier such as table, column, function, etc name. These
17
+ * identifiers will be automatically escaped when compiled, respecting any
18
+ * reserved words.
19
+ */
20
+ export interface SQLIdentifierNode {
21
+ readonly [$$type]: "IDENTIFIER";
22
+ /** symbol */
23
+ readonly s: symbol;
24
+ /** name */
25
+ readonly n: string;
26
+ }
27
+ /**
28
+ * A value that can be used in `sql.value(...)`; note that objects are **NOT**
29
+ * valid values; you must `JSON.stringify(obj)` or similar.
30
+ */
31
+ export declare type SQLRawValue = string | number | boolean | null | ReadonlyArray<SQLRawValue>;
32
+ /**
33
+ * Represents an SQL value that will be replaced with a placeholder in the
34
+ * compiled SQL statement.
35
+ */
36
+ export interface SQLValueNode {
37
+ readonly [$$type]: "VALUE";
38
+ /** value */
39
+ readonly v: SQLRawValue;
40
+ }
41
+ /**
42
+ * Represents that the SQL inside this should be indented when pretty printed.
43
+ */
44
+ export interface SQLIndentNode {
45
+ readonly [$$type]: "INDENT";
46
+ /** content */
47
+ readonly c: SQLQuery;
48
+ /** flags */
49
+ readonly f: number;
50
+ }
51
+ /**
52
+ * Informs pg-sql2 to treat symbol2 as if it were the same as symbol1
53
+ */
54
+ export interface SQLSymbolAliasNode {
55
+ readonly [$$type]: "SYMBOL_ALIAS";
56
+ readonly a: symbol;
57
+ readonly b: symbol;
58
+ }
59
+ /**
60
+ * A placeholder that should be replaced at compile time using one of the
61
+ * replacements provided.
62
+ */
63
+ export interface SQLPlaceholderNode {
64
+ readonly [$$type]: "PLACEHOLDER";
65
+ /** symbol */
66
+ readonly s: symbol;
67
+ /** fallback */
68
+ readonly k?: SQL;
69
+ }
70
+ /** @internal */
71
+ export declare type SQLNode = SQLRawNode | SQLValueNode | SQLIdentifierNode | SQLIndentNode | SQLSymbolAliasNode | SQLPlaceholderNode;
72
+ /** @internal */
73
+ export interface SQLQuery {
74
+ readonly [$$type]: "QUERY";
75
+ /** nodes */
76
+ readonly n: ReadonlyArray<SQLNode>;
77
+ /** flags */
78
+ readonly f: number;
79
+ /** checksum - for faster isEquivalent checks */
80
+ readonly c: number;
81
+ }
82
+ /**
83
+ * Representation of SQL, identifiers, values, etc; to generate a query that
84
+ * can be issued to the database it needs to be fed to `sql.compile`.
85
+ */
86
+ export declare type SQL = SQLNode | SQLQuery;
87
+ export declare function escapeSqlIdentifier(str: string): string;
88
+ declare function isSQL(node: unknown): node is SQL;
89
+ /**
90
+ * Accepts an sql`...` expression and compiles it out to SQL text with
91
+ * placeholders, and the values to substitute for these values.
92
+ */
93
+ export declare function compile(sql: SQL, options?: {
94
+ placeholderValues?: Map<symbol, SQL>;
95
+ }): {
96
+ text: string;
97
+ values: SQLRawValue[];
98
+ };
99
+ /**
100
+ * Creates a SQL item for some raw SQL text. Just plain ol‘ raw SQL. This
101
+ * method is dangerous though because it involves no escaping, so proceed with
102
+ * caution! It's very very rarely warranted - there is likely a safer way of
103
+ * achieving your goal.
104
+ */
105
+ export declare function raw(text: string): SQL;
106
+ /**
107
+ * Creates a SQL item for a SQL identifier. A SQL identifier is anything like
108
+ * a table, schema, or column name. An identifier may also have a namespace,
109
+ * thus why many names are accepted.
110
+ */
111
+ export declare function identifier(...names: Array<string | symbol>): SQL;
112
+ /**
113
+ * Creates a SQL item for a value that will be included in our final query.
114
+ * This value will be added in a way which avoids SQL injection.
115
+ */
116
+ export declare function value(val: SQLRawValue): SQL;
117
+ declare const trueNode: SQLRawNode;
118
+ declare const falseNode: SQLRawNode;
119
+ declare const nullNode: SQLRawNode;
120
+ export declare const blank: SQLRawNode;
121
+ export declare const dot: SQLRawNode;
122
+ /**
123
+ * If the value is simple will inline it into the query, otherwise will defer
124
+ * to `sql.value`.
125
+ */
126
+ export declare function literal(val: string | number | boolean | null): SQL;
127
+ /**
128
+ * Join some SQL items together, optionally separated by a string. Useful when
129
+ * dealing with lists of SQL items, for example a dynamic list of columns or
130
+ * variadic SQL function arguments.
131
+ */
132
+ export declare function join(items: Array<SQL>, separator?: string): SQL;
133
+ export declare function indent(fragment: SQL): SQL;
134
+ export declare function indent(strings: TemplateStringsArray, ...values: Array<SQL>): SQL;
135
+ export declare function indentIf(condition: boolean, fragment: SQL): SQL;
136
+ /**
137
+ * Wraps the given fragment in parens if necessary (or if forced, e.g. for a
138
+ * subquery or maybe stylistically a join condition).
139
+ *
140
+ * Returns the input SQL fragment if it does not need parenthesis to be
141
+ * inserted into another expression, otherwise a parenthesised fragment if not
142
+ * doing so could cause ambiguity. We're relying on the user to be sensible
143
+ * here, this is not fool-proof.
144
+ *
145
+ * @remarks The following are all parens safe:
146
+ *
147
+ * - A placeholder `$1`
148
+ * - A number `0.123456`
149
+ * - A string `'Foo bar'` / `E'Foo bar'`
150
+ * - An identifier `table.column` / `"MyTaBlE"."MyCoLuMn"`
151
+ *
152
+ * The following might seem but are not parens safe:
153
+ *
154
+ * - A function call `schema.func(param)` - reason: `schema.func(param).*`
155
+ * should be `(schema.func(param)).*`
156
+ * - A simple expression `1 = 2` - reason: `1 = 2 = false` is invalid; whereas
157
+ * `(1 = 2) = false` is fine. Similarly `1 = 2::text` differs from `(1 = 2)::text`.
158
+ * - An identifier `table.column.attribute` / `"MyTaBlE"."MyCoLuMn"."MyAtTrIbUtE"` (this needs to be `(table.column).attribute`)
159
+ */
160
+ export declare function parens(frag: SQL, force?: boolean): SQL;
161
+ export declare function symbolAlias(symbol1: symbol, symbol2: symbol): SQL;
162
+ export declare function placeholder(symbol: symbol, fallback?: SQL): SQLPlaceholderNode;
163
+ export declare function arraysMatch<T>(array1: ReadonlyArray<T>, array2: ReadonlyArray<T>, comparator?: (val1: T, val2: T) => boolean): boolean;
164
+ export declare function isEquivalent(sql1: SQL, sql2: SQL, options?: {
165
+ symbolSubstitutes?: Map<symbol, symbol>;
166
+ }): boolean;
167
+ /**
168
+ * @experimental
169
+ */
170
+ export declare function replaceSymbol(frag: SQL, needle: symbol, replacement: symbol): SQL;
171
+ export declare const sql: PgSQL;
172
+ export default sql;
173
+ export { falseNode as false, sql as fragment, isSQL, nullNode as null, sql as query, trueNode as true, };
174
+ export interface PgSQL {
175
+ (strings: TemplateStringsArray, ...values: Array<SQL>): SQL;
176
+ escapeSqlIdentifier: typeof escapeSqlIdentifier;
177
+ compile: typeof compile;
178
+ isEquivalent: typeof isEquivalent;
179
+ query: PgSQL;
180
+ raw: typeof raw;
181
+ identifier: typeof identifier;
182
+ value: typeof value;
183
+ literal: typeof literal;
184
+ join: typeof join;
185
+ indent: typeof indent;
186
+ indentIf: typeof indentIf;
187
+ parens: typeof parens;
188
+ symbolAlias: typeof symbolAlias;
189
+ placeholder: typeof placeholder;
190
+ blank: typeof blank;
191
+ fragment: PgSQL;
192
+ true: typeof trueNode;
193
+ false: typeof falseNode;
194
+ null: typeof nullNode;
195
+ isSQL: typeof isSQL;
196
+ replaceSymbol: typeof replaceSymbol;
197
+ sql: PgSQL;
198
+ }
199
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}