@slonik/sql-tag 48.12.2 → 48.13.0
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/README.md +0 -1
- package/dist/Logger.js +2 -2
- package/dist/factories/createPrimitiveValueExpressions.d.ts +1 -1
- package/dist/factories/createPrimitiveValueExpressions.js +10 -10
- package/dist/factories/createSqlTag.d.ts +2 -2
- package/dist/factories/createSqlTag.d.ts.map +1 -1
- package/dist/factories/createSqlTag.js +16 -16
- package/dist/factories/createSqlTag.js.map +1 -1
- package/dist/factories/createSqlTag.test/array.test.js +44 -44
- package/dist/factories/createSqlTag.test/array.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/date.test.js +9 -9
- package/dist/factories/createSqlTag.test/date.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/identifier.test.js +11 -14
- package/dist/factories/createSqlTag.test/identifier.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/interval.test.js +10 -10
- package/dist/factories/createSqlTag.test/join.test.js +24 -24
- package/dist/factories/createSqlTag.test/join.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/json.test.js +27 -27
- package/dist/factories/createSqlTag.test/json.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/jsonb.test.js +27 -27
- package/dist/factories/createSqlTag.test/jsonb.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/literalValue.test.js +5 -5
- package/dist/factories/createSqlTag.test/literalValue.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/sql.test.js +37 -37
- package/dist/factories/createSqlTag.test/sql.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/timestamp.test.js +9 -9
- package/dist/factories/createSqlTag.test/timestamp.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/type.test.js +4 -4
- package/dist/factories/createSqlTag.test/typeAlias.test.js +8 -8
- package/dist/factories/createSqlTag.test/unnest.test.js +25 -25
- package/dist/factories/createSqlTag.test/unnest.test.js.map +1 -1
- package/dist/factories/createSqlTag.test/uuid.test.js +10 -10
- package/dist/factories/createSqlTag.test/uuid.test.js.map +1 -1
- package/dist/factories/createSqlTokenSqlFragment.d.ts +1 -1
- package/dist/factories/createSqlTokenSqlFragment.d.ts.map +1 -1
- package/dist/factories/createSqlTokenSqlFragment.js +28 -67
- package/dist/factories/createSqlTokenSqlFragment.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +4 -4
- package/dist/sqlFragmentFactories/createArraySqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createArraySqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createArraySqlFragment.js +15 -15
- package/dist/sqlFragmentFactories/createArraySqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createBinarySqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createBinarySqlFragment.js +4 -4
- package/dist/sqlFragmentFactories/createDateSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createDateSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createDateSqlFragment.js +5 -5
- package/dist/sqlFragmentFactories/createDateSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createFragmentSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createFragmentSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createFragmentSqlFragment.js +7 -7
- package/dist/sqlFragmentFactories/createFragmentSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createIdentifierSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createIdentifierSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createIdentifierSqlFragment.js +6 -6
- package/dist/sqlFragmentFactories/createIdentifierSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createIntervalSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createIntervalSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createIntervalSqlFragment.js +10 -20
- package/dist/sqlFragmentFactories/createIntervalSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createJsonSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createJsonSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createJsonSqlFragment.js +16 -18
- package/dist/sqlFragmentFactories/createJsonSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createListSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createListSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createListSqlFragment.js +9 -9
- package/dist/sqlFragmentFactories/createListSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createQuerySqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createQuerySqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createQuerySqlFragment.js +7 -7
- package/dist/sqlFragmentFactories/createQuerySqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createTimestampSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createTimestampSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createTimestampSqlFragment.js +5 -7
- package/dist/sqlFragmentFactories/createTimestampSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createUnnestSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createUnnestSqlFragment.d.ts.map +1 -1
- package/dist/sqlFragmentFactories/createUnnestSqlFragment.js +19 -20
- package/dist/sqlFragmentFactories/createUnnestSqlFragment.js.map +1 -1
- package/dist/sqlFragmentFactories/createUuidSqlFragment.d.ts +1 -1
- package/dist/sqlFragmentFactories/createUuidSqlFragment.js +5 -5
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +14 -14
- package/dist/tokens.js.map +1 -1
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/utilities/countArrayDimensions.js +1 -1
- package/dist/utilities/countArrayDimensions.test.js +6 -6
- package/dist/utilities/escapeIdentifier.test.js +5 -5
- package/dist/utilities/escapeLiteralValue.js +2 -2
- package/dist/utilities/escapeLiteralValue.test.js +7 -7
- package/dist/utilities/formatSlonikPlaceholder.js +1 -1
- package/dist/utilities/isPlainObject.js +1 -1
- package/dist/utilities/isPrimitiveValueExpression.js +4 -4
- package/dist/utilities/isSqlToken.d.ts +1 -1
- package/dist/utilities/isSqlToken.d.ts.map +1 -1
- package/dist/utilities/isSqlToken.js +9 -9
- package/dist/utilities/isSqlToken.js.map +1 -1
- package/dist/utilities/safeStringify.js +3 -3
- package/dist/utilities/stripArrayNotation.js +1 -1
- package/dist/utilities/stripArrayNotation.test.js +6 -6
- package/package.json +35 -39
- package/src/Logger.ts +2 -2
- package/src/declarations.d.ts +2 -2
- package/src/factories/createPrimitiveValueExpressions.ts +11 -11
- package/src/factories/createSqlTag.test/array.test.ts +54 -66
- package/src/factories/createSqlTag.test/date.test.ts +9 -11
- package/src/factories/createSqlTag.test/identifier.test.ts +11 -14
- package/src/factories/createSqlTag.test/interval.test.ts +10 -10
- package/src/factories/createSqlTag.test/join.test.ts +25 -31
- package/src/factories/createSqlTag.test/json.test.ts +27 -30
- package/src/factories/createSqlTag.test/jsonb.test.ts +27 -30
- package/src/factories/createSqlTag.test/literalValue.test.ts +5 -7
- package/src/factories/createSqlTag.test/sql.test.ts +38 -41
- package/src/factories/createSqlTag.test/timestamp.test.ts +9 -14
- package/src/factories/createSqlTag.test/type.test.ts +4 -4
- package/src/factories/createSqlTag.test/typeAlias.test.ts +9 -9
- package/src/factories/createSqlTag.test/unnest.test.ts +25 -34
- package/src/factories/createSqlTag.test/uuid.test.ts +10 -12
- package/src/factories/createSqlTag.ts +26 -47
- package/src/factories/createSqlTokenSqlFragment.ts +30 -74
- package/src/index.ts +5 -5
- package/src/sqlFragmentFactories/createArraySqlFragment.ts +17 -22
- package/src/sqlFragmentFactories/createBinarySqlFragment.ts +5 -5
- package/src/sqlFragmentFactories/createDateSqlFragment.ts +6 -8
- package/src/sqlFragmentFactories/createFragmentSqlFragment.ts +9 -11
- package/src/sqlFragmentFactories/createIdentifierSqlFragment.ts +8 -12
- package/src/sqlFragmentFactories/createIntervalSqlFragment.ts +11 -23
- package/src/sqlFragmentFactories/createJsonSqlFragment.ts +17 -25
- package/src/sqlFragmentFactories/createListSqlFragment.ts +10 -14
- package/src/sqlFragmentFactories/createQuerySqlFragment.ts +9 -11
- package/src/sqlFragmentFactories/createTimestampSqlFragment.ts +6 -11
- package/src/sqlFragmentFactories/createUnnestSqlFragment.ts +20 -29
- package/src/sqlFragmentFactories/createUuidSqlFragment.ts +6 -6
- package/src/tokens.ts +14 -16
- package/src/types.ts +65 -87
- package/src/utilities/countArrayDimensions.test.ts +6 -6
- package/src/utilities/countArrayDimensions.ts +1 -1
- package/src/utilities/escapeIdentifier.test.ts +5 -5
- package/src/utilities/escapeLiteralValue.test.ts +7 -7
- package/src/utilities/escapeLiteralValue.ts +2 -2
- package/src/utilities/formatSlonikPlaceholder.ts +1 -1
- package/src/utilities/isPlainObject.ts +1 -1
- package/src/utilities/isPrimitiveValueExpression.ts +4 -4
- package/src/utilities/isSqlToken.ts +10 -12
- package/src/utilities/safeStringify.ts +3 -3
- package/src/utilities/stripArrayNotation.test.ts +6 -6
- package/src/utilities/stripArrayNotation.ts +1 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createArraySqlFragment } from
|
|
2
|
-
import { createBinarySqlFragment } from
|
|
3
|
-
import { createDateSqlFragment } from
|
|
4
|
-
import { createFragmentSqlFragment } from
|
|
5
|
-
import { createIdentifierSqlFragment } from
|
|
6
|
-
import { createIntervalSqlFragment } from
|
|
7
|
-
import { createJsonSqlFragment } from
|
|
8
|
-
import { createListSqlFragment } from
|
|
9
|
-
import { createQuerySqlFragment } from
|
|
10
|
-
import { createTimestampSqlFragment } from
|
|
11
|
-
import { createUnnestSqlFragment } from
|
|
12
|
-
import { createUuidSqlFragment } from
|
|
1
|
+
import { createArraySqlFragment } from "../sqlFragmentFactories/createArraySqlFragment.js";
|
|
2
|
+
import { createBinarySqlFragment } from "../sqlFragmentFactories/createBinarySqlFragment.js";
|
|
3
|
+
import { createDateSqlFragment } from "../sqlFragmentFactories/createDateSqlFragment.js";
|
|
4
|
+
import { createFragmentSqlFragment } from "../sqlFragmentFactories/createFragmentSqlFragment.js";
|
|
5
|
+
import { createIdentifierSqlFragment } from "../sqlFragmentFactories/createIdentifierSqlFragment.js";
|
|
6
|
+
import { createIntervalSqlFragment } from "../sqlFragmentFactories/createIntervalSqlFragment.js";
|
|
7
|
+
import { createJsonSqlFragment } from "../sqlFragmentFactories/createJsonSqlFragment.js";
|
|
8
|
+
import { createListSqlFragment } from "../sqlFragmentFactories/createListSqlFragment.js";
|
|
9
|
+
import { createQuerySqlFragment } from "../sqlFragmentFactories/createQuerySqlFragment.js";
|
|
10
|
+
import { createTimestampSqlFragment } from "../sqlFragmentFactories/createTimestampSqlFragment.js";
|
|
11
|
+
import { createUnnestSqlFragment } from "../sqlFragmentFactories/createUnnestSqlFragment.js";
|
|
12
|
+
import { createUuidSqlFragment } from "../sqlFragmentFactories/createUuidSqlFragment.js";
|
|
13
13
|
import {
|
|
14
14
|
ArrayToken,
|
|
15
15
|
BinaryToken,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
TimestampToken,
|
|
25
25
|
UnnestToken,
|
|
26
26
|
UuidToken,
|
|
27
|
-
} from
|
|
27
|
+
} from "../tokens.js";
|
|
28
28
|
import type {
|
|
29
29
|
ArraySqlToken,
|
|
30
30
|
BinarySqlToken,
|
|
@@ -41,69 +41,25 @@ import type {
|
|
|
41
41
|
TimestampSqlToken,
|
|
42
42
|
UnnestSqlToken,
|
|
43
43
|
UuidSqlToken,
|
|
44
|
-
} from
|
|
45
|
-
import { UnexpectedStateError } from
|
|
44
|
+
} from "../types.js";
|
|
45
|
+
import { UnexpectedStateError } from "@slonik/errors";
|
|
46
46
|
|
|
47
|
-
type TokenHandler = (
|
|
48
|
-
token: SqlTokenType,
|
|
49
|
-
greatestParameterPosition: number,
|
|
50
|
-
) => SqlFragmentToken;
|
|
47
|
+
type TokenHandler = (token: SqlTokenType, greatestParameterPosition: number) => SqlFragmentToken;
|
|
51
48
|
|
|
52
49
|
const tokenHandlers = new Map<symbol, TokenHandler>([
|
|
53
|
-
[
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
],
|
|
57
|
-
[
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
],
|
|
61
|
-
[
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
],
|
|
65
|
-
[
|
|
66
|
-
FragmentToken,
|
|
67
|
-
(token, pos) =>
|
|
68
|
-
createFragmentSqlFragment(token as FragmentSqlTokenType, pos),
|
|
69
|
-
],
|
|
70
|
-
[
|
|
71
|
-
IdentifierToken,
|
|
72
|
-
(token) => createIdentifierSqlFragment(token as IdentifierSqlToken),
|
|
73
|
-
],
|
|
74
|
-
[
|
|
75
|
-
IntervalToken,
|
|
76
|
-
(token, pos) => createIntervalSqlFragment(token as IntervalSqlToken, pos),
|
|
77
|
-
],
|
|
78
|
-
[
|
|
79
|
-
JsonBinaryToken,
|
|
80
|
-
(token, pos) =>
|
|
81
|
-
createJsonSqlFragment(token as JsonBinarySqlToken, pos, true),
|
|
82
|
-
],
|
|
83
|
-
[
|
|
84
|
-
JsonToken,
|
|
85
|
-
(token, pos) => createJsonSqlFragment(token as JsonSqlToken, pos, false),
|
|
86
|
-
],
|
|
87
|
-
[
|
|
88
|
-
ListToken,
|
|
89
|
-
(token, pos) => createListSqlFragment(token as ListSqlToken, pos),
|
|
90
|
-
],
|
|
91
|
-
[
|
|
92
|
-
QueryToken,
|
|
93
|
-
(token, pos) => createQuerySqlFragment(token as QuerySqlToken, pos),
|
|
94
|
-
],
|
|
95
|
-
[
|
|
96
|
-
TimestampToken,
|
|
97
|
-
(token, pos) => createTimestampSqlFragment(token as TimestampSqlToken, pos),
|
|
98
|
-
],
|
|
99
|
-
[
|
|
100
|
-
UnnestToken,
|
|
101
|
-
(token, pos) => createUnnestSqlFragment(token as UnnestSqlToken, pos),
|
|
102
|
-
],
|
|
103
|
-
[
|
|
104
|
-
UuidToken,
|
|
105
|
-
(token, pos) => createUuidSqlFragment(token as UuidSqlToken, pos),
|
|
106
|
-
],
|
|
50
|
+
[ArrayToken, (token, pos) => createArraySqlFragment(token as ArraySqlToken, pos)],
|
|
51
|
+
[BinaryToken, (token, pos) => createBinarySqlFragment(token as BinarySqlToken, pos)],
|
|
52
|
+
[DateToken, (token, pos) => createDateSqlFragment(token as DateSqlToken, pos)],
|
|
53
|
+
[FragmentToken, (token, pos) => createFragmentSqlFragment(token as FragmentSqlTokenType, pos)],
|
|
54
|
+
[IdentifierToken, (token) => createIdentifierSqlFragment(token as IdentifierSqlToken)],
|
|
55
|
+
[IntervalToken, (token, pos) => createIntervalSqlFragment(token as IntervalSqlToken, pos)],
|
|
56
|
+
[JsonBinaryToken, (token, pos) => createJsonSqlFragment(token as JsonBinarySqlToken, pos, true)],
|
|
57
|
+
[JsonToken, (token, pos) => createJsonSqlFragment(token as JsonSqlToken, pos, false)],
|
|
58
|
+
[ListToken, (token, pos) => createListSqlFragment(token as ListSqlToken, pos)],
|
|
59
|
+
[QueryToken, (token, pos) => createQuerySqlFragment(token as QuerySqlToken, pos)],
|
|
60
|
+
[TimestampToken, (token, pos) => createTimestampSqlFragment(token as TimestampSqlToken, pos)],
|
|
61
|
+
[UnnestToken, (token, pos) => createUnnestSqlFragment(token as UnnestSqlToken, pos)],
|
|
62
|
+
[UuidToken, (token, pos) => createUuidSqlFragment(token as UuidSqlToken, pos)],
|
|
107
63
|
]);
|
|
108
64
|
|
|
109
65
|
export const createSqlTokenSqlFragment = (
|
|
@@ -116,5 +72,5 @@ export const createSqlTokenSqlFragment = (
|
|
|
116
72
|
return handler(token, greatestParameterPosition);
|
|
117
73
|
}
|
|
118
74
|
|
|
119
|
-
throw new UnexpectedStateError(
|
|
75
|
+
throw new UnexpectedStateError("Unexpected token type.");
|
|
120
76
|
};
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { createSqlTag } from
|
|
2
|
-
export { createSqlTokenSqlFragment } from
|
|
1
|
+
export { createSqlTag } from "./factories/createSqlTag.js";
|
|
2
|
+
export { createSqlTokenSqlFragment } from "./factories/createSqlTokenSqlFragment.js";
|
|
3
3
|
export {
|
|
4
4
|
ArrayToken,
|
|
5
5
|
BinaryToken,
|
|
@@ -15,7 +15,7 @@ export {
|
|
|
15
15
|
TimestampToken,
|
|
16
16
|
UnnestToken,
|
|
17
17
|
UuidToken,
|
|
18
|
-
} from
|
|
18
|
+
} from "./tokens.js";
|
|
19
19
|
export {
|
|
20
20
|
type ArraySqlToken,
|
|
21
21
|
type BinarySqlToken,
|
|
@@ -37,5 +37,5 @@ export {
|
|
|
37
37
|
type UnnestSqlToken,
|
|
38
38
|
type UuidSqlToken,
|
|
39
39
|
type ValueExpression,
|
|
40
|
-
} from
|
|
41
|
-
export { isSqlToken } from
|
|
40
|
+
} from "./types.js";
|
|
41
|
+
export { isSqlToken } from "./utilities/isSqlToken.js";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { createSqlTokenSqlFragment } from
|
|
2
|
-
import { FragmentToken } from
|
|
3
|
-
import type { ArraySqlToken, SqlFragmentToken } from
|
|
4
|
-
import { escapeIdentifier } from
|
|
5
|
-
import { formatSlonikPlaceholder } from
|
|
6
|
-
import { isPrimitiveValueExpression } from
|
|
7
|
-
import { isSqlToken } from
|
|
8
|
-
import { InvalidInputError, UnexpectedStateError } from
|
|
1
|
+
import { createSqlTokenSqlFragment } from "../factories/createSqlTokenSqlFragment.js";
|
|
2
|
+
import { FragmentToken } from "../tokens.js";
|
|
3
|
+
import type { ArraySqlToken, SqlFragmentToken } from "../types.js";
|
|
4
|
+
import { escapeIdentifier } from "../utilities/escapeIdentifier.js";
|
|
5
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
6
|
+
import { isPrimitiveValueExpression } from "../utilities/isPrimitiveValueExpression.js";
|
|
7
|
+
import { isSqlToken } from "../utilities/isSqlToken.js";
|
|
8
|
+
import { InvalidInputError, UnexpectedStateError } from "@slonik/errors";
|
|
9
9
|
|
|
10
10
|
export const createArraySqlFragment = (
|
|
11
11
|
token: ArraySqlToken,
|
|
@@ -14,19 +14,19 @@ export const createArraySqlFragment = (
|
|
|
14
14
|
let placeholderIndex = greatestParameterPosition;
|
|
15
15
|
|
|
16
16
|
for (const value of token.values) {
|
|
17
|
-
if (token.memberType ===
|
|
17
|
+
if (token.memberType === "bytea") {
|
|
18
18
|
if (Buffer.isBuffer(value)) {
|
|
19
19
|
continue;
|
|
20
20
|
} else {
|
|
21
21
|
throw new InvalidInputError(
|
|
22
|
-
|
|
22
|
+
"Invalid array member type. Non-buffer value bound to bytea type.",
|
|
23
23
|
);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
if (!isPrimitiveValueExpression(value)) {
|
|
28
28
|
throw new InvalidInputError(
|
|
29
|
-
|
|
29
|
+
"Invalid array member type. Must be a primitive value expression.",
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -35,26 +35,21 @@ export const createArraySqlFragment = (
|
|
|
35
35
|
|
|
36
36
|
placeholderIndex++;
|
|
37
37
|
|
|
38
|
-
let sql = formatSlonikPlaceholder(placeholderIndex) +
|
|
38
|
+
let sql = formatSlonikPlaceholder(placeholderIndex) + "::";
|
|
39
39
|
|
|
40
40
|
if (
|
|
41
41
|
isSqlToken(token.memberType) &&
|
|
42
|
-
Symbol.keyFor(token.memberType.type) ===
|
|
42
|
+
Symbol.keyFor(token.memberType.type) === "SLONIK_TOKEN_FRAGMENT"
|
|
43
43
|
) {
|
|
44
|
-
const sqlFragment = createSqlTokenSqlFragment(
|
|
45
|
-
token.memberType,
|
|
46
|
-
placeholderIndex,
|
|
47
|
-
);
|
|
44
|
+
const sqlFragment = createSqlTokenSqlFragment(token.memberType, placeholderIndex);
|
|
48
45
|
|
|
49
46
|
if (sqlFragment.values.length > 0) {
|
|
50
|
-
throw new UnexpectedStateError(
|
|
51
|
-
'Type is not expected to have a value binding.',
|
|
52
|
-
);
|
|
47
|
+
throw new UnexpectedStateError("Type is not expected to have a value binding.");
|
|
53
48
|
}
|
|
54
49
|
|
|
55
50
|
sql += sqlFragment.sql;
|
|
56
|
-
} else if (typeof token.memberType ===
|
|
57
|
-
sql += escapeIdentifier(token.memberType) +
|
|
51
|
+
} else if (typeof token.memberType === "string") {
|
|
52
|
+
sql += escapeIdentifier(token.memberType) + "[]";
|
|
58
53
|
} else {
|
|
59
54
|
throw new InvalidInputError(
|
|
60
55
|
'Unsupported `memberType`. `memberType` must be a string or SqlToken of "SLONIK_TOKEN_FRAGMENT" type.',
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import type { BinarySqlToken, SqlFragmentToken } from
|
|
3
|
-
import { formatSlonikPlaceholder } from
|
|
4
|
-
import { InvalidInputError } from
|
|
1
|
+
import { FragmentToken } from "../tokens.js";
|
|
2
|
+
import type { BinarySqlToken, SqlFragmentToken } from "../types.js";
|
|
3
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
4
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
5
5
|
|
|
6
6
|
export const createBinarySqlFragment = (
|
|
7
7
|
token: BinarySqlToken,
|
|
8
8
|
greatestParameterPosition: number,
|
|
9
9
|
): SqlFragmentToken => {
|
|
10
10
|
if (!Buffer.isBuffer(token.data)) {
|
|
11
|
-
throw new InvalidInputError(
|
|
11
|
+
throw new InvalidInputError("Binary value must be a buffer.");
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
return {
|
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import type { DateSqlToken, SqlFragmentToken } from
|
|
3
|
-
import { formatSlonikPlaceholder } from
|
|
4
|
-
import { InvalidInputError } from
|
|
1
|
+
import { FragmentToken } from "../tokens.js";
|
|
2
|
+
import type { DateSqlToken, SqlFragmentToken } from "../types.js";
|
|
3
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
4
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
5
5
|
|
|
6
6
|
export const createDateSqlFragment = (
|
|
7
7
|
token: DateSqlToken,
|
|
8
8
|
greatestParameterPosition: number,
|
|
9
9
|
): SqlFragmentToken => {
|
|
10
10
|
if (!(token.date instanceof Date)) {
|
|
11
|
-
throw new InvalidInputError(
|
|
12
|
-
'Date parameter value must be an instance of Date.',
|
|
13
|
-
);
|
|
11
|
+
throw new InvalidInputError("Date parameter value must be an instance of Date.");
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
return {
|
|
17
|
-
sql: formatSlonikPlaceholder(greatestParameterPosition + 1) +
|
|
15
|
+
sql: formatSlonikPlaceholder(greatestParameterPosition + 1) + "::date",
|
|
18
16
|
type: FragmentToken,
|
|
19
17
|
values: [token.date.toISOString().slice(0, 10)],
|
|
20
18
|
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { slonikPlaceholderRegexRule } from
|
|
2
|
-
import { FragmentToken } from
|
|
3
|
-
import type { FragmentSqlToken, SqlFragmentToken } from
|
|
4
|
-
import { formatSlonikPlaceholder } from
|
|
5
|
-
import { UnexpectedStateError } from
|
|
1
|
+
import { slonikPlaceholderRegexRule } from "../regexRules/slonikPlaceholderRegexRule.js";
|
|
2
|
+
import { FragmentToken } from "../tokens.js";
|
|
3
|
+
import type { FragmentSqlToken, SqlFragmentToken } from "../types.js";
|
|
4
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
5
|
+
import { UnexpectedStateError } from "@slonik/errors";
|
|
6
6
|
|
|
7
7
|
export const createFragmentSqlFragment = (
|
|
8
8
|
token: FragmentSqlToken,
|
|
9
9
|
greatestParameterPosition: number,
|
|
10
10
|
): SqlFragmentToken => {
|
|
11
|
-
let sql =
|
|
11
|
+
let sql = "";
|
|
12
12
|
|
|
13
13
|
let leastMatchedParameterPosition = Number.POSITIVE_INFINITY;
|
|
14
14
|
let greatestMatchedParameterPosition = 0;
|
|
@@ -24,14 +24,12 @@ export const createFragmentSqlFragment = (
|
|
|
24
24
|
leastMatchedParameterPosition = parameterPosition;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
return formatSlonikPlaceholder(
|
|
28
|
-
parameterPosition + greatestParameterPosition,
|
|
29
|
-
);
|
|
27
|
+
return formatSlonikPlaceholder(parameterPosition + greatestParameterPosition);
|
|
30
28
|
});
|
|
31
29
|
|
|
32
30
|
if (greatestMatchedParameterPosition > token.values.length) {
|
|
33
31
|
throw new UnexpectedStateError(
|
|
34
|
-
|
|
32
|
+
"The greatest parameter position is greater than the number of parameter values.",
|
|
35
33
|
);
|
|
36
34
|
}
|
|
37
35
|
|
|
@@ -39,7 +37,7 @@ export const createFragmentSqlFragment = (
|
|
|
39
37
|
leastMatchedParameterPosition !== Number.POSITIVE_INFINITY &&
|
|
40
38
|
leastMatchedParameterPosition !== 1
|
|
41
39
|
) {
|
|
42
|
-
throw new UnexpectedStateError(
|
|
40
|
+
throw new UnexpectedStateError("Parameter position must start at 1.");
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
return {
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import type { IdentifierSqlToken, SqlFragmentToken } from
|
|
3
|
-
import { escapeIdentifier } from
|
|
4
|
-
import { InvalidInputError } from
|
|
1
|
+
import { FragmentToken } from "../tokens.js";
|
|
2
|
+
import type { IdentifierSqlToken, SqlFragmentToken } from "../types.js";
|
|
3
|
+
import { escapeIdentifier } from "../utilities/escapeIdentifier.js";
|
|
4
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
5
5
|
|
|
6
|
-
export const createIdentifierSqlFragment = (
|
|
7
|
-
token: IdentifierSqlToken,
|
|
8
|
-
): SqlFragmentToken => {
|
|
6
|
+
export const createIdentifierSqlFragment = (token: IdentifierSqlToken): SqlFragmentToken => {
|
|
9
7
|
const sql = token.names
|
|
10
8
|
.map((identifierName) => {
|
|
11
|
-
if (typeof identifierName !==
|
|
12
|
-
throw new InvalidInputError(
|
|
13
|
-
'Identifier name array member type must be a string.',
|
|
14
|
-
);
|
|
9
|
+
if (typeof identifierName !== "string") {
|
|
10
|
+
throw new InvalidInputError("Identifier name array member type must be a string.");
|
|
15
11
|
}
|
|
16
12
|
|
|
17
13
|
return escapeIdentifier(identifierName);
|
|
18
14
|
})
|
|
19
|
-
.join(
|
|
15
|
+
.join(".");
|
|
20
16
|
|
|
21
17
|
return {
|
|
22
18
|
sql,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import type { IntervalSqlToken, SqlFragmentToken } from
|
|
3
|
-
import { formatSlonikPlaceholder } from
|
|
4
|
-
import { InvalidInputError } from
|
|
5
|
-
import { z } from
|
|
1
|
+
import { FragmentToken } from "../tokens.js";
|
|
2
|
+
import type { IntervalSqlToken, SqlFragmentToken } from "../types.js";
|
|
3
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
4
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
5
|
+
import { z } from "zod";
|
|
6
6
|
|
|
7
7
|
const IntervalInput = z
|
|
8
8
|
.object({
|
|
@@ -16,19 +16,11 @@ const IntervalInput = z
|
|
|
16
16
|
})
|
|
17
17
|
.strict();
|
|
18
18
|
|
|
19
|
-
const intervalFragments = [
|
|
20
|
-
'years',
|
|
21
|
-
'months',
|
|
22
|
-
'weeks',
|
|
23
|
-
'days',
|
|
24
|
-
'hours',
|
|
25
|
-
'minutes',
|
|
26
|
-
'seconds',
|
|
27
|
-
];
|
|
19
|
+
const intervalFragments = ["years", "months", "weeks", "days", "hours", "minutes", "seconds"];
|
|
28
20
|
|
|
29
21
|
const tokenMap = {
|
|
30
|
-
minutes:
|
|
31
|
-
seconds:
|
|
22
|
+
minutes: "mins",
|
|
23
|
+
seconds: "secs",
|
|
32
24
|
};
|
|
33
25
|
|
|
34
26
|
export const createIntervalSqlFragment = (
|
|
@@ -40,9 +32,7 @@ export const createIntervalSqlFragment = (
|
|
|
40
32
|
try {
|
|
41
33
|
intervalInput = IntervalInput.parse(token.interval);
|
|
42
34
|
} catch {
|
|
43
|
-
throw new InvalidInputError(
|
|
44
|
-
'Interval input must not contain unknown properties.',
|
|
45
|
-
);
|
|
35
|
+
throw new InvalidInputError("Interval input must not contain unknown properties.");
|
|
46
36
|
}
|
|
47
37
|
|
|
48
38
|
const values: number[] = [];
|
|
@@ -58,15 +48,13 @@ export const createIntervalSqlFragment = (
|
|
|
58
48
|
const mappedToken = tokenMap[intervalFragment] ?? intervalFragment;
|
|
59
49
|
|
|
60
50
|
intervalTokens.push(
|
|
61
|
-
mappedToken +
|
|
62
|
-
' => ' +
|
|
63
|
-
formatSlonikPlaceholder(greatestParameterPosition + values.length),
|
|
51
|
+
mappedToken + " => " + formatSlonikPlaceholder(greatestParameterPosition + values.length),
|
|
64
52
|
);
|
|
65
53
|
}
|
|
66
54
|
}
|
|
67
55
|
|
|
68
56
|
return {
|
|
69
|
-
sql:
|
|
57
|
+
sql: "make_interval(" + intervalTokens.join(", ") + ")",
|
|
70
58
|
type: FragmentToken,
|
|
71
59
|
values,
|
|
72
60
|
};
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import { Logger } from
|
|
2
|
-
import { FragmentToken } from
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from
|
|
8
|
-
import {
|
|
9
|
-
import { isPlainObject } from '../utilities/isPlainObject.js';
|
|
10
|
-
import { safeStringify } from '../utilities/safeStringify.js';
|
|
11
|
-
import { InvalidInputError } from '@slonik/errors';
|
|
12
|
-
import { serializeError } from 'serialize-error';
|
|
1
|
+
import { Logger } from "../Logger.js";
|
|
2
|
+
import { FragmentToken } from "../tokens.js";
|
|
3
|
+
import type { JsonBinarySqlToken, JsonSqlToken, SqlFragmentToken } from "../types.js";
|
|
4
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
5
|
+
import { isPlainObject } from "../utilities/isPlainObject.js";
|
|
6
|
+
import { safeStringify } from "../utilities/safeStringify.js";
|
|
7
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
8
|
+
import { serializeError } from "serialize-error";
|
|
13
9
|
|
|
14
10
|
const log = Logger.child({
|
|
15
|
-
namespace:
|
|
11
|
+
namespace: "createJsonSqlFragment",
|
|
16
12
|
});
|
|
17
13
|
|
|
18
14
|
export const createJsonSqlFragment = (
|
|
@@ -23,19 +19,17 @@ export const createJsonSqlFragment = (
|
|
|
23
19
|
let value;
|
|
24
20
|
|
|
25
21
|
if (token.value === undefined) {
|
|
26
|
-
throw new InvalidInputError(
|
|
22
|
+
throw new InvalidInputError("JSON payload must not be undefined.");
|
|
27
23
|
} else if (token.value === null) {
|
|
28
|
-
value =
|
|
24
|
+
value = "null";
|
|
29
25
|
|
|
30
26
|
// @todo Deep check Array.
|
|
31
27
|
} else if (
|
|
32
28
|
!isPlainObject(token.value) &&
|
|
33
29
|
!Array.isArray(token.value) &&
|
|
34
|
-
![
|
|
30
|
+
!["boolean", "number", "string"].includes(typeof token.value)
|
|
35
31
|
) {
|
|
36
|
-
throw new InvalidInputError(
|
|
37
|
-
'JSON payload must be a primitive value or a plain object.',
|
|
38
|
-
);
|
|
32
|
+
throw new InvalidInputError("JSON payload must be a primitive value or a plain object.");
|
|
39
33
|
} else {
|
|
40
34
|
try {
|
|
41
35
|
value = safeStringify(token.value);
|
|
@@ -44,24 +38,22 @@ export const createJsonSqlFragment = (
|
|
|
44
38
|
{
|
|
45
39
|
error: serializeError(error),
|
|
46
40
|
},
|
|
47
|
-
|
|
41
|
+
"payload cannot be stringified",
|
|
48
42
|
);
|
|
49
43
|
|
|
50
|
-
throw new InvalidInputError(
|
|
44
|
+
throw new InvalidInputError("JSON payload cannot be stringified.");
|
|
51
45
|
}
|
|
52
46
|
|
|
53
47
|
if (value === undefined) {
|
|
54
48
|
throw new InvalidInputError(
|
|
55
|
-
|
|
49
|
+
"JSON payload cannot be stringified. The resulting value is undefined.",
|
|
56
50
|
);
|
|
57
51
|
}
|
|
58
52
|
}
|
|
59
53
|
|
|
60
54
|
return {
|
|
61
55
|
sql:
|
|
62
|
-
formatSlonikPlaceholder(greatestParameterPosition + 1) +
|
|
63
|
-
'::' +
|
|
64
|
-
(binary ? 'jsonb' : 'json'),
|
|
56
|
+
formatSlonikPlaceholder(greatestParameterPosition + 1) + "::" + (binary ? "jsonb" : "json"),
|
|
65
57
|
type: FragmentToken,
|
|
66
58
|
values: [value],
|
|
67
59
|
};
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import { createPrimitiveValueExpressions } from
|
|
2
|
-
import { createSqlTokenSqlFragment } from
|
|
3
|
-
import { FragmentToken } from
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from
|
|
9
|
-
import { formatSlonikPlaceholder } from '../utilities/formatSlonikPlaceholder.js';
|
|
10
|
-
import { isPrimitiveValueExpression } from '../utilities/isPrimitiveValueExpression.js';
|
|
11
|
-
import { isSqlToken } from '../utilities/isSqlToken.js';
|
|
12
|
-
import { InvalidInputError } from '@slonik/errors';
|
|
1
|
+
import { createPrimitiveValueExpressions } from "../factories/createPrimitiveValueExpressions.js";
|
|
2
|
+
import { createSqlTokenSqlFragment } from "../factories/createSqlTokenSqlFragment.js";
|
|
3
|
+
import { FragmentToken } from "../tokens.js";
|
|
4
|
+
import type { ListSqlToken, PrimitiveValueExpression, SqlFragmentToken } from "../types.js";
|
|
5
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
6
|
+
import { isPrimitiveValueExpression } from "../utilities/isPrimitiveValueExpression.js";
|
|
7
|
+
import { isSqlToken } from "../utilities/isSqlToken.js";
|
|
8
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
13
9
|
|
|
14
10
|
export const createListSqlFragment = (
|
|
15
11
|
token: ListSqlToken,
|
|
@@ -21,7 +17,7 @@ export const createListSqlFragment = (
|
|
|
21
17
|
let placeholderIndex = greatestParameterPosition;
|
|
22
18
|
|
|
23
19
|
if (token.members.length === 0) {
|
|
24
|
-
throw new InvalidInputError(
|
|
20
|
+
throw new InvalidInputError("Value list must have at least 1 member.");
|
|
25
21
|
}
|
|
26
22
|
|
|
27
23
|
for (const member of token.members) {
|
|
@@ -37,7 +33,7 @@ export const createListSqlFragment = (
|
|
|
37
33
|
values.push(member);
|
|
38
34
|
} else {
|
|
39
35
|
throw new InvalidInputError(
|
|
40
|
-
|
|
36
|
+
"Invalid list member type. Must be a SQL token or a primitive value expression.",
|
|
41
37
|
);
|
|
42
38
|
}
|
|
43
39
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { slonikPlaceholderRegexRule } from
|
|
2
|
-
import { FragmentToken } from
|
|
3
|
-
import type { QuerySqlToken, SqlFragmentToken } from
|
|
4
|
-
import { formatSlonikPlaceholder } from
|
|
5
|
-
import { UnexpectedStateError } from
|
|
1
|
+
import { slonikPlaceholderRegexRule } from "../regexRules/slonikPlaceholderRegexRule.js";
|
|
2
|
+
import { FragmentToken } from "../tokens.js";
|
|
3
|
+
import type { QuerySqlToken, SqlFragmentToken } from "../types.js";
|
|
4
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
5
|
+
import { UnexpectedStateError } from "@slonik/errors";
|
|
6
6
|
|
|
7
7
|
export const createQuerySqlFragment = (
|
|
8
8
|
token: QuerySqlToken,
|
|
9
9
|
greatestParameterPosition: number,
|
|
10
10
|
): SqlFragmentToken => {
|
|
11
|
-
let sql =
|
|
11
|
+
let sql = "";
|
|
12
12
|
|
|
13
13
|
let leastMatchedParameterPosition = Number.POSITIVE_INFINITY;
|
|
14
14
|
let greatestMatchedParameterPosition = 0;
|
|
@@ -24,14 +24,12 @@ export const createQuerySqlFragment = (
|
|
|
24
24
|
leastMatchedParameterPosition = parameterPosition;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
return formatSlonikPlaceholder(
|
|
28
|
-
parameterPosition + greatestParameterPosition,
|
|
29
|
-
);
|
|
27
|
+
return formatSlonikPlaceholder(parameterPosition + greatestParameterPosition);
|
|
30
28
|
});
|
|
31
29
|
|
|
32
30
|
if (greatestMatchedParameterPosition > token.values.length) {
|
|
33
31
|
throw new UnexpectedStateError(
|
|
34
|
-
|
|
32
|
+
"The greatest parameter position is greater than the number of parameter values.",
|
|
35
33
|
);
|
|
36
34
|
}
|
|
37
35
|
|
|
@@ -39,7 +37,7 @@ export const createQuerySqlFragment = (
|
|
|
39
37
|
leastMatchedParameterPosition !== Number.POSITIVE_INFINITY &&
|
|
40
38
|
leastMatchedParameterPosition !== 1
|
|
41
39
|
) {
|
|
42
|
-
throw new UnexpectedStateError(
|
|
40
|
+
throw new UnexpectedStateError("Parameter position must start at 1.");
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
return {
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import type { SqlFragmentToken, TimestampSqlToken } from
|
|
3
|
-
import { formatSlonikPlaceholder } from
|
|
4
|
-
import { InvalidInputError } from
|
|
1
|
+
import { FragmentToken } from "../tokens.js";
|
|
2
|
+
import type { SqlFragmentToken, TimestampSqlToken } from "../types.js";
|
|
3
|
+
import { formatSlonikPlaceholder } from "../utilities/formatSlonikPlaceholder.js";
|
|
4
|
+
import { InvalidInputError } from "@slonik/errors";
|
|
5
5
|
|
|
6
6
|
export const createTimestampSqlFragment = (
|
|
7
7
|
token: TimestampSqlToken,
|
|
8
8
|
greatestParameterPosition: number,
|
|
9
9
|
): SqlFragmentToken => {
|
|
10
10
|
if (!(token.date instanceof Date)) {
|
|
11
|
-
throw new InvalidInputError(
|
|
12
|
-
'Timestamp parameter value must be an instance of Date.',
|
|
13
|
-
);
|
|
11
|
+
throw new InvalidInputError("Timestamp parameter value must be an instance of Date.");
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
return {
|
|
17
|
-
sql:
|
|
18
|
-
'to_timestamp(' +
|
|
19
|
-
formatSlonikPlaceholder(greatestParameterPosition + 1) +
|
|
20
|
-
')',
|
|
15
|
+
sql: "to_timestamp(" + formatSlonikPlaceholder(greatestParameterPosition + 1) + ")",
|
|
21
16
|
type: FragmentToken,
|
|
22
17
|
values: [String(token.date.getTime() / 1_000)],
|
|
23
18
|
};
|