@grest-ts/sql 0.0.6 → 0.0.8

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.
@@ -1,70 +1,70 @@
1
- import {isColumnOkToUse, isTableReferenced, Key, OrderByStructure, SQL_BOOL, SqlQuery} from "../Types";
2
- import {Expr} from "../SqlExpression";
3
-
4
- export interface GatewayDeleteWhereMethods<Entity> {
5
-
6
- where(c1: Partial<Entity>): GatewayDeleteOrderByMethods<Entity>
7
- }
8
-
9
- export interface GatewayDeleteOrderByMethods<Entity> extends DeleteLimitMethods {
10
-
11
- orderBy(fields: keyof Entity): DeleteLimitMethods
12
-
13
- }
14
-
15
- export interface DeleteWhereMethods<Tables> {
16
-
17
- where<
18
- T1 extends string,
19
- T2 extends string = never,
20
- T3 extends string = never,
21
- T4 extends string = never,
22
- T5 extends string = never,
23
- T6 extends string = never,
24
- T7 extends string = never,
25
- T8 extends string = never,
26
- T9 extends string = never,
27
- T10 extends string = never,
28
- T = Tables
29
- >(
30
- c1: C<T, T1>,
31
- c2?: C<T, T2>,
32
- c3?: C<T, T3>,
33
- c4?: C<T, T4>,
34
- c5?: C<T, T5>,
35
- c6?: C<T, T6>,
36
- c7?: C<T, T7>,
37
- c8?: C<T, T8>,
38
- c9?: C<T, T9>,
39
- c10?: C<T, T10>
40
- ): DeleteOrderByMethods<Tables> & DeleteLimitMethods
41
-
42
- }
43
-
44
- type C<Tables, T extends string> = isTableReferenced<Tables, Key<T>, Expr<T, unknown, SQL_BOOL>>
45
-
46
- export interface DeleteOrderByMethods<Tables> extends DeleteLimitMethods {
47
- orderBy<
48
- TableRef,
49
- Columns extends OrderByStructure<Expr<TableRef, string | unknown, any>>
50
- >(
51
- ...items: isColumnOkToUse<Tables, Columns>
52
- ): DeleteLimitMethods
53
- }
54
-
55
-
56
- export interface DeleteLimitMethods {
57
- noLimit(): ExecDeleteMethods
58
-
59
- limit(limit: number | [number, number]): ExecDeleteMethods
60
-
61
- limit1(): ExecDeleteMethods
62
- }
63
-
64
-
65
- export interface ExecDeleteMethods extends SqlQuery<{ affectedRows: number }> {
66
-
67
- toString(lvl?: number): string
68
-
69
- }
70
-
1
+ import {isColumnOkToUse, isTableReferenced, Key, OrderByStructure, SQL_BOOL, SqlQuery} from "../Types";
2
+ import {Expr} from "../SqlExpression";
3
+
4
+ export interface GatewayDeleteWhereMethods<Entity> {
5
+
6
+ where(c1: Partial<Entity>): GatewayDeleteOrderByMethods<Entity>
7
+ }
8
+
9
+ export interface GatewayDeleteOrderByMethods<Entity> extends DeleteLimitMethods {
10
+
11
+ orderBy(fields: keyof Entity): DeleteLimitMethods
12
+
13
+ }
14
+
15
+ export interface DeleteWhereMethods<Tables> {
16
+
17
+ where<
18
+ T1 extends string,
19
+ T2 extends string = never,
20
+ T3 extends string = never,
21
+ T4 extends string = never,
22
+ T5 extends string = never,
23
+ T6 extends string = never,
24
+ T7 extends string = never,
25
+ T8 extends string = never,
26
+ T9 extends string = never,
27
+ T10 extends string = never,
28
+ T = Tables
29
+ >(
30
+ c1: C<T, T1>,
31
+ c2?: C<T, T2>,
32
+ c3?: C<T, T3>,
33
+ c4?: C<T, T4>,
34
+ c5?: C<T, T5>,
35
+ c6?: C<T, T6>,
36
+ c7?: C<T, T7>,
37
+ c8?: C<T, T8>,
38
+ c9?: C<T, T9>,
39
+ c10?: C<T, T10>
40
+ ): DeleteOrderByMethods<Tables> & DeleteLimitMethods
41
+
42
+ }
43
+
44
+ type C<Tables, T extends string> = isTableReferenced<Tables, Key<T>, Expr<T, unknown, SQL_BOOL>>
45
+
46
+ export interface DeleteOrderByMethods<Tables> extends DeleteLimitMethods {
47
+ orderBy<
48
+ TableRef,
49
+ Columns extends OrderByStructure<Expr<TableRef, string | unknown, any>>
50
+ >(
51
+ ...items: isColumnOkToUse<Tables, Columns>
52
+ ): DeleteLimitMethods
53
+ }
54
+
55
+
56
+ export interface DeleteLimitMethods {
57
+ noLimit(): ExecDeleteMethods
58
+
59
+ limit(limit: number | [number, number]): ExecDeleteMethods
60
+
61
+ limit1(): ExecDeleteMethods
62
+ }
63
+
64
+
65
+ export interface ExecDeleteMethods extends SqlQuery<{ affectedRows: number }> {
66
+
67
+ toString(lvl?: number): string
68
+
69
+ }
70
+
package/src/escape.ts CHANGED
@@ -1,52 +1,52 @@
1
- import {PrepareQueryArgument} from "./Types";
2
- import sql from "sqlstring";
3
-
4
- export function escape(value: string | number | (string | number)[] | PrepareQueryArgument): string {
5
- return (sql as any).escape(value);
6
- }
7
-
8
- const mysqlReservedKeywords = new Set([
9
- "ADD", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "AUTO_INCREMENT",
10
- "BETWEEN", "BIGINT", "BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE",
11
- "CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE", "COLUMN",
12
- "CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS",
13
- "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR",
14
- "DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE",
15
- "DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE",
16
- "DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV",
17
- "DOUBLE", "DROP", "DUAL", "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED",
18
- "EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FLOAT", "FLOAT4", "FLOAT8",
19
- "FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GRANT", "GROUP", "HAVING",
20
- "HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF",
21
- "IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT",
22
- "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO",
23
- "IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT",
24
- "LIKE", "LIMIT", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LONG",
25
- "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB",
26
- "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND",
27
- "MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC",
28
- "ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER",
29
- "OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "RANGE", "READ",
30
- "READS", "REAL", "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT",
31
- "REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE",
32
- "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR",
33
- "SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION",
34
- "SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT",
35
- "SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", "TINYBLOB",
36
- "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION",
37
- "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE",
38
- "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER",
39
- "VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "XOR", "YEAR_MONTH",
40
- "ZEROFILL", "ROWS"
41
- ]);
42
-
43
- export function escapeId(value: string): string {
44
- // We could skip/remove this check, but it makes prettier SQL queries as 99% of strings here do not need escaping.
45
- if (typeof value === "string"
46
- && /^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)
47
- && !mysqlReservedKeywords.has(value.toUpperCase())) {
48
- return value;
49
- } else {
50
- return (sql as any).escapeId(value);
51
- }
1
+ import {PrepareQueryArgument} from "./Types";
2
+ import sql from "sqlstring";
3
+
4
+ export function escape(value: string | number | (string | number)[] | PrepareQueryArgument): string {
5
+ return (sql as any).escape(value);
6
+ }
7
+
8
+ const mysqlReservedKeywords = new Set([
9
+ "ADD", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "AUTO_INCREMENT",
10
+ "BETWEEN", "BIGINT", "BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE",
11
+ "CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE", "COLUMN",
12
+ "CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS",
13
+ "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR",
14
+ "DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE",
15
+ "DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE",
16
+ "DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV",
17
+ "DOUBLE", "DROP", "DUAL", "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED",
18
+ "EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FLOAT", "FLOAT4", "FLOAT8",
19
+ "FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GRANT", "GROUP", "HAVING",
20
+ "HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF",
21
+ "IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT",
22
+ "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO",
23
+ "IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT",
24
+ "LIKE", "LIMIT", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LONG",
25
+ "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB",
26
+ "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND",
27
+ "MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC",
28
+ "ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER",
29
+ "OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "RANGE", "READ",
30
+ "READS", "REAL", "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT",
31
+ "REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE",
32
+ "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR",
33
+ "SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION",
34
+ "SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT",
35
+ "SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", "TINYBLOB",
36
+ "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION",
37
+ "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE",
38
+ "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER",
39
+ "VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "XOR", "YEAR_MONTH",
40
+ "ZEROFILL", "ROWS"
41
+ ]);
42
+
43
+ export function escapeId(value: string): string {
44
+ // We could skip/remove this check, but it makes prettier SQL queries as 99% of strings here do not need escaping.
45
+ if (typeof value === "string"
46
+ && /^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)
47
+ && !mysqlReservedKeywords.has(value.toUpperCase())) {
48
+ return value;
49
+ } else {
50
+ return (sql as any).escapeId(value);
51
+ }
52
52
  }
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
- export * from './SQL';
2
- export * from './SqlFunctions';
3
- export * from './SqlExpression';
4
- export * from './Types';
5
- export * from './MysqlTable';
1
+ export * from './SQL';
2
+ export * from './SqlFunctions';
3
+ export * from './SqlExpression';
4
+ export * from './Types';
5
+ export * from './MysqlTable';
6
6
  export * from './MysqlTableStructureParser';
@@ -1,76 +1,76 @@
1
- import {escape, escapeId} from "../escape";
2
- import {ExecInsertMethods, InsertSetMethods} from "./InsertInterfaces";
3
- import {SQL_ENTITY, SQL_EXPRESSION} from "../Symbols";
4
-
5
- export class InsertBuilder<Entity> implements ExecInsertMethods, InsertSetMethods<Entity> {
6
-
7
- public readonly [SQL_ENTITY]: undefined; // never used
8
-
9
- private _ignore: boolean = false;
10
- private _tableName: string;
11
-
12
- private _set: string[] = []
13
-
14
- private _valueNames: Set<string>;
15
- private _valuesObjects: any[];
16
-
17
- private _select: string;
18
-
19
-
20
- public to(tableName: string) {
21
- this._tableName = tableName;
22
- return this;
23
- }
24
-
25
- public ignore() {
26
- this._ignore = true;
27
- return this;
28
- }
29
-
30
- public select(query: any) {
31
- this._select = query[SQL_EXPRESSION];
32
- return this;
33
- }
34
-
35
- public set(obj: any) {
36
- for (const prop in obj) {
37
- this._set.push(escapeId(prop) + " = " + escape(obj[prop]));
38
- }
39
- return this;
40
- }
41
-
42
- public values(objects: any[]) {
43
- this._valueNames = new Set();
44
- for (let i = 0; i < objects.length; i++) {
45
- for (const prop in objects[i]) {
46
- this._valueNames.add(prop);
47
- }
48
- }
49
- this._valuesObjects = objects;
50
- return this;
51
- }
52
-
53
- private toValuesString() {
54
- const valueNames = Array.from(this._valueNames.values());
55
- const fields = "(" + valueNames.map(e => escapeId(e)).join(", ") + ") VALUES \n";
56
- const cols: string[] = [];
57
- for (let i = 0; i < this._valuesObjects.length; i++) {
58
- const obj = this._valuesObjects[i];
59
- const col: string[] = [];
60
- for (let v = 0; v < valueNames.length; v++) {
61
- const value = obj[valueNames[v]];
62
- col.push(value === undefined ? "NULL" : escape(value))
63
- }
64
- cols.push("(" + col.join(", ") + ")");
65
- col.length = 0;
66
- }
67
- return fields + cols.join(",\n");
68
- }
69
-
70
- public toSqlString() {
71
- return "INSERT " + (this._ignore ? "IGNORE " : "") + "INTO " + this._tableName + " " +
72
- (this._set.length > 0 ? "SET \n " + this._set.join(",\n") + "\n" : "") +
73
- (this._valueNames?.size > 0 ? "" + this.toValuesString() : "") +
74
- (this._select ? this._select : "")
75
- }
1
+ import {escape, escapeId} from "../escape";
2
+ import {ExecInsertMethods, InsertSetMethods} from "./InsertInterfaces";
3
+ import {SQL_ENTITY, SQL_EXPRESSION} from "../Symbols";
4
+
5
+ export class InsertBuilder<Entity> implements ExecInsertMethods, InsertSetMethods<Entity> {
6
+
7
+ public readonly [SQL_ENTITY]: undefined; // never used
8
+
9
+ private _ignore: boolean = false;
10
+ private _tableName: string;
11
+
12
+ private _set: string[] = []
13
+
14
+ private _valueNames: Set<string>;
15
+ private _valuesObjects: any[];
16
+
17
+ private _select: string;
18
+
19
+
20
+ public to(tableName: string) {
21
+ this._tableName = tableName;
22
+ return this;
23
+ }
24
+
25
+ public ignore() {
26
+ this._ignore = true;
27
+ return this;
28
+ }
29
+
30
+ public select(query: any) {
31
+ this._select = query[SQL_EXPRESSION];
32
+ return this;
33
+ }
34
+
35
+ public set(obj: any) {
36
+ for (const prop in obj) {
37
+ this._set.push(escapeId(prop) + " = " + escape(obj[prop]));
38
+ }
39
+ return this;
40
+ }
41
+
42
+ public values(objects: any[]) {
43
+ this._valueNames = new Set();
44
+ for (let i = 0; i < objects.length; i++) {
45
+ for (const prop in objects[i]) {
46
+ this._valueNames.add(prop);
47
+ }
48
+ }
49
+ this._valuesObjects = objects;
50
+ return this;
51
+ }
52
+
53
+ private toValuesString() {
54
+ const valueNames = Array.from(this._valueNames.values());
55
+ const fields = "(" + valueNames.map(e => escapeId(e)).join(", ") + ") VALUES \n";
56
+ const cols: string[] = [];
57
+ for (let i = 0; i < this._valuesObjects.length; i++) {
58
+ const obj = this._valuesObjects[i];
59
+ const col: string[] = [];
60
+ for (let v = 0; v < valueNames.length; v++) {
61
+ const value = obj[valueNames[v]];
62
+ col.push(value === undefined ? "NULL" : escape(value))
63
+ }
64
+ cols.push("(" + col.join(", ") + ")");
65
+ col.length = 0;
66
+ }
67
+ return fields + cols.join(",\n");
68
+ }
69
+
70
+ public toSqlString() {
71
+ return "INSERT " + (this._ignore ? "IGNORE " : "") + "INTO " + this._tableName + " " +
72
+ (this._set.length > 0 ? "SET \n " + this._set.join(",\n") + "\n" : "") +
73
+ (this._valueNames?.size > 0 ? "" + this.toValuesString() : "") +
74
+ (this._select ? this._select : "")
75
+ }
76
76
  }
@@ -1,16 +1,16 @@
1
- import {AliasedTable, IsAMatchingB, NotUsingWithPart, SqlQuery} from "../Types";
2
-
3
- export interface ExecInsertMethods extends SqlQuery<{ insertId: number }> {
4
-
5
- }
6
-
7
- export interface InsertSetMethods<Entity> {
8
-
9
- set(value: Entity): ExecInsertMethods
10
-
11
- values(value: Entity[]): ExecInsertMethods
12
-
13
- select<Result>(value: IsAMatchingB<Result, Entity, AliasedTable<string, string, Result, object, NotUsingWithPart>>): ExecInsertMethods
14
- }
15
-
16
-
1
+ import {AliasedTable, IsAMatchingB, NotUsingWithPart, SqlQuery} from "../Types";
2
+
3
+ export interface ExecInsertMethods extends SqlQuery<{ insertId: number }> {
4
+
5
+ }
6
+
7
+ export interface InsertSetMethods<Entity> {
8
+
9
+ set(value: Entity): ExecInsertMethods
10
+
11
+ values(value: Entity[]): ExecInsertMethods
12
+
13
+ select<Result>(value: IsAMatchingB<Result, Entity, AliasedTable<string, string, Result, object, NotUsingWithPart>>): ExecInsertMethods
14
+ }
15
+
16
+