@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,33 +1,30 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import { createSqlTag } from
|
|
3
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
3
|
+
import test from "ava";
|
|
4
4
|
|
|
5
5
|
const sql = createSqlTag();
|
|
6
6
|
|
|
7
|
-
test(
|
|
8
|
-
const query = sql.fragment`SELECT ${
|
|
7
|
+
test("creates an object describing a query with inlined identifiers", (t) => {
|
|
8
|
+
const query = sql.fragment`SELECT ${"foo"} FROM ${sql.identifier(["bar"])}`;
|
|
9
9
|
|
|
10
10
|
t.deepEqual(query, {
|
|
11
11
|
sql: 'SELECT $slonik_1 FROM "bar"',
|
|
12
12
|
type: FragmentToken,
|
|
13
|
-
values: [
|
|
13
|
+
values: ["foo"],
|
|
14
14
|
});
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
test(
|
|
18
|
-
const query = sql.fragment`SELECT ${
|
|
19
|
-
'bar',
|
|
20
|
-
'baz',
|
|
21
|
-
])}`;
|
|
17
|
+
test("creates an object describing a query with inlined identifiers (specifier)", (t) => {
|
|
18
|
+
const query = sql.fragment`SELECT ${"foo"} FROM ${sql.identifier(["bar", "baz"])}`;
|
|
22
19
|
|
|
23
20
|
t.deepEqual(query, {
|
|
24
21
|
sql: 'SELECT $slonik_1 FROM "bar"."baz"',
|
|
25
22
|
type: FragmentToken,
|
|
26
|
-
values: [
|
|
23
|
+
values: ["foo"],
|
|
27
24
|
});
|
|
28
25
|
});
|
|
29
26
|
|
|
30
|
-
test(
|
|
27
|
+
test("throws if an identifier name array member type is not a string", (t) => {
|
|
31
28
|
const error = t.throws(() => {
|
|
32
29
|
sql.fragment`${sql.identifier([
|
|
33
30
|
// @ts-expect-error - intentional
|
|
@@ -35,5 +32,5 @@ test('throws if an identifier name array member type is not a string', (t) => {
|
|
|
35
32
|
])}`;
|
|
36
33
|
});
|
|
37
34
|
|
|
38
|
-
t.is(error?.message,
|
|
35
|
+
t.is(error?.message, "Identifier name array member type must be a string.");
|
|
39
36
|
});
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import { createSqlTag } from
|
|
3
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
3
|
+
import test from "ava";
|
|
4
4
|
|
|
5
5
|
const sql = createSqlTag();
|
|
6
6
|
|
|
7
|
-
test(
|
|
7
|
+
test("creates an empty make_interval invocation", (t) => {
|
|
8
8
|
const query = sql.fragment`SELECT ${sql.interval({})}`;
|
|
9
9
|
|
|
10
10
|
t.deepEqual(query, {
|
|
11
|
-
sql:
|
|
11
|
+
sql: "SELECT make_interval()",
|
|
12
12
|
type: FragmentToken,
|
|
13
13
|
values: [],
|
|
14
14
|
});
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
test(
|
|
17
|
+
test("creates an interval", (t) => {
|
|
18
18
|
const query = sql.fragment`SELECT ${sql.interval({
|
|
19
19
|
days: 4,
|
|
20
20
|
hours: 5,
|
|
@@ -26,19 +26,19 @@ test('creates an interval', (t) => {
|
|
|
26
26
|
})}`;
|
|
27
27
|
|
|
28
28
|
t.deepEqual(query, {
|
|
29
|
-
sql:
|
|
29
|
+
sql: "SELECT make_interval(years => $slonik_1, months => $slonik_2, weeks => $slonik_3, days => $slonik_4, hours => $slonik_5, mins => $slonik_6, secs => $slonik_7)",
|
|
30
30
|
type: FragmentToken,
|
|
31
31
|
values: [1, 2, 3, 4, 5, 6, 7],
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
test(
|
|
35
|
+
test("throws if contains unknown properties", (t) => {
|
|
36
36
|
const error = t.throws(() => {
|
|
37
37
|
sql.fragment`SELECT ${sql.interval({
|
|
38
38
|
// @ts-expect-error - intentional
|
|
39
|
-
foo:
|
|
39
|
+
foo: "bar",
|
|
40
40
|
})}`;
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
t.is(error?.message,
|
|
43
|
+
t.is(error?.message, "Interval input must not contain unknown properties.");
|
|
44
44
|
});
|
|
@@ -1,85 +1,82 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import { createSqlTag } from
|
|
3
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
3
|
+
import test from "ava";
|
|
4
4
|
|
|
5
5
|
const sql = createSqlTag();
|
|
6
6
|
|
|
7
|
-
test(
|
|
7
|
+
test("creates a list of values", (t) => {
|
|
8
8
|
const query = sql.fragment`SELECT (${sql.join([1, 2, 3], sql.fragment`, `)})`;
|
|
9
9
|
|
|
10
10
|
t.deepEqual(query, {
|
|
11
|
-
sql:
|
|
11
|
+
sql: "SELECT ($slonik_1, $slonik_2, $slonik_3)",
|
|
12
12
|
type: FragmentToken,
|
|
13
13
|
values: [1, 2, 3],
|
|
14
14
|
});
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
test(
|
|
17
|
+
test("creates a list of values using glue", (t) => {
|
|
18
18
|
const query = sql.fragment`SELECT ${sql.join(
|
|
19
19
|
[sql.fragment`TRUE`, sql.fragment`TRUE`],
|
|
20
20
|
sql.fragment` AND `,
|
|
21
21
|
)}`;
|
|
22
22
|
|
|
23
23
|
t.deepEqual(query, {
|
|
24
|
-
sql:
|
|
24
|
+
sql: "SELECT TRUE AND TRUE",
|
|
25
25
|
type: FragmentToken,
|
|
26
26
|
values: [],
|
|
27
27
|
});
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
test(
|
|
31
|
-
const query = sql.fragment`SELECT (${sql.join(
|
|
32
|
-
[1, sql.fragment`foo`, 3],
|
|
33
|
-
sql.fragment`, `,
|
|
34
|
-
)})`;
|
|
30
|
+
test("interpolates SQL tokens", (t) => {
|
|
31
|
+
const query = sql.fragment`SELECT (${sql.join([1, sql.fragment`foo`, 3], sql.fragment`, `)})`;
|
|
35
32
|
|
|
36
33
|
t.deepEqual(query, {
|
|
37
|
-
sql:
|
|
34
|
+
sql: "SELECT ($slonik_1, foo, $slonik_2)",
|
|
38
35
|
type: FragmentToken,
|
|
39
36
|
values: [1, 3],
|
|
40
37
|
});
|
|
41
38
|
});
|
|
42
39
|
|
|
43
|
-
test(
|
|
40
|
+
test("interpolates SQL tokens with bound values", (t) => {
|
|
44
41
|
const query = sql.fragment`SELECT ${sql.join(
|
|
45
42
|
[1, sql.fragment`to_timestamp(${2}), ${3}`, 4],
|
|
46
43
|
sql.fragment`, `,
|
|
47
44
|
)}`;
|
|
48
45
|
|
|
49
46
|
t.deepEqual(query, {
|
|
50
|
-
sql:
|
|
47
|
+
sql: "SELECT $slonik_1, to_timestamp($slonik_2), $slonik_3, $slonik_4",
|
|
51
48
|
type: FragmentToken,
|
|
52
49
|
values: [1, 2, 3, 4],
|
|
53
50
|
});
|
|
54
51
|
});
|
|
55
52
|
|
|
56
|
-
test(
|
|
53
|
+
test("offsets positional parameter indexes", (t) => {
|
|
57
54
|
const query = sql.fragment`SELECT ${1}, ${sql.join(
|
|
58
55
|
[1, sql.fragment`to_timestamp(${2}), ${3}`, 4],
|
|
59
56
|
sql.fragment`, `,
|
|
60
57
|
)}, ${3}`;
|
|
61
58
|
|
|
62
59
|
t.deepEqual(query, {
|
|
63
|
-
sql:
|
|
60
|
+
sql: "SELECT $slonik_1, $slonik_2, to_timestamp($slonik_3), $slonik_4, $slonik_5, $slonik_6",
|
|
64
61
|
type: FragmentToken,
|
|
65
62
|
values: [1, 1, 2, 3, 4, 3],
|
|
66
63
|
});
|
|
67
64
|
});
|
|
68
65
|
|
|
69
|
-
test(
|
|
66
|
+
test("supports bigint", (t) => {
|
|
70
67
|
const query = sql.fragment`SELECT ${1n}, ${sql.join(
|
|
71
68
|
[sql.fragment`to_timestamp(${2n})`, 3n],
|
|
72
69
|
sql.fragment`, `,
|
|
73
70
|
)}, ${4n}`;
|
|
74
71
|
|
|
75
72
|
t.deepEqual(query, {
|
|
76
|
-
sql:
|
|
73
|
+
sql: "SELECT $slonik_1, to_timestamp($slonik_2), $slonik_3, $slonik_4",
|
|
77
74
|
type: FragmentToken,
|
|
78
75
|
values: [1n, 2n, 3n, 4n],
|
|
79
76
|
});
|
|
80
77
|
});
|
|
81
78
|
|
|
82
|
-
test(
|
|
79
|
+
test("nests expressions", (t) => {
|
|
83
80
|
const query = sql.fragment`SELECT ${sql.join(
|
|
84
81
|
[
|
|
85
82
|
sql.fragment`(${sql.join([1, 2], sql.fragment`, `)})`,
|
|
@@ -89,27 +86,24 @@ test('nests expressions', (t) => {
|
|
|
89
86
|
)}`;
|
|
90
87
|
|
|
91
88
|
t.deepEqual(query, {
|
|
92
|
-
sql:
|
|
89
|
+
sql: "SELECT ($slonik_1, $slonik_2), ($slonik_3, $slonik_4)",
|
|
93
90
|
type: FragmentToken,
|
|
94
91
|
values: [1, 2, 3, 4],
|
|
95
92
|
});
|
|
96
93
|
});
|
|
97
94
|
|
|
98
|
-
test(
|
|
99
|
-
const data = Buffer.from(
|
|
100
|
-
const query = sql.fragment`SELECT (${sql.join(
|
|
101
|
-
['a', sql.binary(data)],
|
|
102
|
-
sql.fragment`, `,
|
|
103
|
-
)})`;
|
|
95
|
+
test("binary join expressions", (t) => {
|
|
96
|
+
const data = Buffer.from("1f", "hex");
|
|
97
|
+
const query = sql.fragment`SELECT (${sql.join(["a", sql.binary(data)], sql.fragment`, `)})`;
|
|
104
98
|
|
|
105
99
|
t.deepEqual(query, {
|
|
106
|
-
sql:
|
|
100
|
+
sql: "SELECT ($slonik_1, $slonik_2)",
|
|
107
101
|
type: FragmentToken,
|
|
108
|
-
values: [
|
|
102
|
+
values: ["a", data],
|
|
109
103
|
});
|
|
110
104
|
});
|
|
111
105
|
|
|
112
|
-
test(
|
|
106
|
+
test("throws is member is not a SQL token or a primitive value expression", (t) => {
|
|
113
107
|
const error = t.throws(() => {
|
|
114
108
|
sql.fragment`${sql.join(
|
|
115
109
|
[
|
|
@@ -122,6 +116,6 @@ test('throws is member is not a SQL token or a primitive value expression', (t)
|
|
|
122
116
|
|
|
123
117
|
t.is(
|
|
124
118
|
error?.message,
|
|
125
|
-
|
|
119
|
+
"Invalid list member type. Must be a SQL token or a primitive value expression.",
|
|
126
120
|
);
|
|
127
121
|
});
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import { createSqlTag } from
|
|
3
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
3
|
+
import test from "ava";
|
|
4
4
|
|
|
5
5
|
const sql = createSqlTag();
|
|
6
6
|
|
|
7
|
-
test(
|
|
7
|
+
test("creates a value list (object)", (t) => {
|
|
8
8
|
const query = sql.fragment`SELECT ${sql.json({
|
|
9
|
-
foo:
|
|
9
|
+
foo: "bar",
|
|
10
10
|
})}`;
|
|
11
11
|
|
|
12
12
|
t.deepEqual(query, {
|
|
13
|
-
sql:
|
|
13
|
+
sql: "SELECT $slonik_1::json",
|
|
14
14
|
type: FragmentToken,
|
|
15
15
|
values: ['{"foo":"bar"}'],
|
|
16
16
|
});
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
test(
|
|
19
|
+
test("creates a value list (array)", (t) => {
|
|
20
20
|
const query = sql.fragment`SELECT ${sql.json([
|
|
21
21
|
{
|
|
22
|
-
foo:
|
|
22
|
+
foo: "bar",
|
|
23
23
|
},
|
|
24
24
|
])}`;
|
|
25
25
|
|
|
26
26
|
t.deepEqual(query, {
|
|
27
|
-
sql:
|
|
27
|
+
sql: "SELECT $slonik_1::json",
|
|
28
28
|
type: FragmentToken,
|
|
29
29
|
values: ['[{"foo":"bar"}]'],
|
|
30
30
|
});
|
|
@@ -34,72 +34,69 @@ test("stringifies NULL to 'null'::json", (t) => {
|
|
|
34
34
|
const query = sql.fragment`SELECT ${sql.json(null)}`;
|
|
35
35
|
|
|
36
36
|
t.deepEqual(query, {
|
|
37
|
-
sql:
|
|
37
|
+
sql: "SELECT $slonik_1::json",
|
|
38
38
|
type: FragmentToken,
|
|
39
|
-
values: [
|
|
39
|
+
values: ["null"],
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
test(
|
|
44
|
-
const query = sql.fragment`SELECT ${sql.json(
|
|
43
|
+
test("JSON encodes string values", (t) => {
|
|
44
|
+
const query = sql.fragment`SELECT ${sql.json("example string")}`;
|
|
45
45
|
|
|
46
46
|
t.deepEqual(query, {
|
|
47
|
-
sql:
|
|
47
|
+
sql: "SELECT $slonik_1::json",
|
|
48
48
|
type: FragmentToken,
|
|
49
49
|
values: ['"example string"'],
|
|
50
50
|
});
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
test(
|
|
53
|
+
test("JSON encodes numeric values", (t) => {
|
|
54
54
|
const query = sql.fragment`SELECT ${sql.json(1_234)}`;
|
|
55
55
|
|
|
56
56
|
t.deepEqual(query, {
|
|
57
|
-
sql:
|
|
57
|
+
sql: "SELECT $slonik_1::json",
|
|
58
58
|
type: FragmentToken,
|
|
59
|
-
values: [
|
|
59
|
+
values: ["1234"],
|
|
60
60
|
});
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
test(
|
|
63
|
+
test("JSON encodes boolean values", (t) => {
|
|
64
64
|
const query = sql.fragment`SELECT ${sql.json(true)}`;
|
|
65
65
|
|
|
66
66
|
t.deepEqual(query, {
|
|
67
|
-
sql:
|
|
67
|
+
sql: "SELECT $slonik_1::json",
|
|
68
68
|
type: FragmentToken,
|
|
69
|
-
values: [
|
|
69
|
+
values: ["true"],
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
test(
|
|
73
|
+
test("throws if payload is undefined", (t) => {
|
|
74
74
|
const error = t.throws(() => {
|
|
75
75
|
sql.fragment`SELECT ${sql.json(undefined)}`;
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
t.is(error?.message,
|
|
78
|
+
t.is(error?.message, "JSON payload must not be undefined.");
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
test(
|
|
81
|
+
test("throws if payload cannot be stringified (non-primitive object)", (t) => {
|
|
82
82
|
const error = t.throws(() => {
|
|
83
83
|
// @ts-expect-error - intentional
|
|
84
84
|
sql.fragment`SELECT ${sql.json(() => {})}`;
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
t.is(
|
|
88
|
-
error?.message,
|
|
89
|
-
'JSON payload must be a primitive value or a plain object.',
|
|
90
|
-
);
|
|
87
|
+
t.is(error?.message, "JSON payload must be a primitive value or a plain object.");
|
|
91
88
|
});
|
|
92
89
|
|
|
93
|
-
test(
|
|
90
|
+
test("Object types with optional properties are allowed", (t) => {
|
|
94
91
|
type TypeWithOptionalProperty = { foo: string; opt?: string };
|
|
95
92
|
const testValue: TypeWithOptionalProperty = {
|
|
96
|
-
foo:
|
|
93
|
+
foo: "bar",
|
|
97
94
|
};
|
|
98
95
|
|
|
99
96
|
const query = sql.fragment`SELECT ${sql.json(testValue)}`;
|
|
100
97
|
|
|
101
98
|
t.deepEqual(query, {
|
|
102
|
-
sql:
|
|
99
|
+
sql: "SELECT $slonik_1::json",
|
|
103
100
|
type: FragmentToken,
|
|
104
101
|
values: ['{"foo":"bar"}'],
|
|
105
102
|
});
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import { createSqlTag } from
|
|
3
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
3
|
+
import test from "ava";
|
|
4
4
|
|
|
5
5
|
const sql = createSqlTag();
|
|
6
6
|
|
|
7
|
-
test(
|
|
7
|
+
test("creates a value list (object)", (t) => {
|
|
8
8
|
const query = sql.fragment`SELECT ${sql.jsonb({
|
|
9
|
-
foo:
|
|
9
|
+
foo: "bar",
|
|
10
10
|
})}`;
|
|
11
11
|
|
|
12
12
|
t.deepEqual(query, {
|
|
13
|
-
sql:
|
|
13
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
14
14
|
type: FragmentToken,
|
|
15
15
|
values: ['{"foo":"bar"}'],
|
|
16
16
|
});
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
test(
|
|
19
|
+
test("creates a value list (array)", (t) => {
|
|
20
20
|
const query = sql.fragment`SELECT ${sql.jsonb([
|
|
21
21
|
{
|
|
22
|
-
foo:
|
|
22
|
+
foo: "bar",
|
|
23
23
|
},
|
|
24
24
|
])}`;
|
|
25
25
|
|
|
26
26
|
t.deepEqual(query, {
|
|
27
|
-
sql:
|
|
27
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
28
28
|
type: FragmentToken,
|
|
29
29
|
values: ['[{"foo":"bar"}]'],
|
|
30
30
|
});
|
|
@@ -34,72 +34,69 @@ test("stringifies NULL to 'null'::jsonb", (t) => {
|
|
|
34
34
|
const query = sql.fragment`SELECT ${sql.jsonb(null)}`;
|
|
35
35
|
|
|
36
36
|
t.deepEqual(query, {
|
|
37
|
-
sql:
|
|
37
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
38
38
|
type: FragmentToken,
|
|
39
|
-
values: [
|
|
39
|
+
values: ["null"],
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
test(
|
|
44
|
-
const query = sql.fragment`SELECT ${sql.jsonb(
|
|
43
|
+
test("JSON encodes string values", (t) => {
|
|
44
|
+
const query = sql.fragment`SELECT ${sql.jsonb("example string")}`;
|
|
45
45
|
|
|
46
46
|
t.deepEqual(query, {
|
|
47
|
-
sql:
|
|
47
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
48
48
|
type: FragmentToken,
|
|
49
49
|
values: ['"example string"'],
|
|
50
50
|
});
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
test(
|
|
53
|
+
test("JSON encodes numeric values", (t) => {
|
|
54
54
|
const query = sql.fragment`SELECT ${sql.jsonb(1_234)}`;
|
|
55
55
|
|
|
56
56
|
t.deepEqual(query, {
|
|
57
|
-
sql:
|
|
57
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
58
58
|
type: FragmentToken,
|
|
59
|
-
values: [
|
|
59
|
+
values: ["1234"],
|
|
60
60
|
});
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
test(
|
|
63
|
+
test("JSON encodes boolean values", (t) => {
|
|
64
64
|
const query = sql.fragment`SELECT ${sql.jsonb(true)}`;
|
|
65
65
|
|
|
66
66
|
t.deepEqual(query, {
|
|
67
|
-
sql:
|
|
67
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
68
68
|
type: FragmentToken,
|
|
69
|
-
values: [
|
|
69
|
+
values: ["true"],
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
test(
|
|
73
|
+
test("throws if payload is undefined", (t) => {
|
|
74
74
|
const error = t.throws(() => {
|
|
75
75
|
sql.fragment`SELECT ${sql.jsonb(undefined)}`;
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
t.is(error?.message,
|
|
78
|
+
t.is(error?.message, "JSON payload must not be undefined.");
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
test(
|
|
81
|
+
test("throws if payload cannot be stringified (non-primitive object)", (t) => {
|
|
82
82
|
const error = t.throws(() => {
|
|
83
83
|
// @ts-expect-error - intentional
|
|
84
84
|
sql.fragment`SELECT ${sql.jsonb(() => {})}`;
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
t.is(
|
|
88
|
-
error?.message,
|
|
89
|
-
'JSON payload must be a primitive value or a plain object.',
|
|
90
|
-
);
|
|
87
|
+
t.is(error?.message, "JSON payload must be a primitive value or a plain object.");
|
|
91
88
|
});
|
|
92
89
|
|
|
93
|
-
test(
|
|
90
|
+
test("Object types with optional properties are allowed", (t) => {
|
|
94
91
|
type TypeWithOptionalProperty = { foo: string; opt?: string };
|
|
95
92
|
const testValue: TypeWithOptionalProperty = {
|
|
96
|
-
foo:
|
|
93
|
+
foo: "bar",
|
|
97
94
|
};
|
|
98
95
|
|
|
99
96
|
const query = sql.fragment`SELECT ${sql.jsonb(testValue)}`;
|
|
100
97
|
|
|
101
98
|
t.deepEqual(query, {
|
|
102
|
-
sql:
|
|
99
|
+
sql: "SELECT $slonik_1::jsonb",
|
|
103
100
|
type: FragmentToken,
|
|
104
101
|
values: ['{"foo":"bar"}'],
|
|
105
102
|
});
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import { createSqlTag } from
|
|
3
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
3
|
+
import test from "ava";
|
|
4
4
|
|
|
5
5
|
const sql = createSqlTag();
|
|
6
6
|
|
|
7
|
-
test(
|
|
8
|
-
const query = sql.fragment`CREATE USER foo WITH PASSWORD ${sql.literalValue(
|
|
9
|
-
'bar',
|
|
10
|
-
)}`;
|
|
7
|
+
test("creates an object describing a query with an inlined literal value", (t) => {
|
|
8
|
+
const query = sql.fragment`CREATE USER foo WITH PASSWORD ${sql.literalValue("bar")}`;
|
|
11
9
|
|
|
12
10
|
t.deepEqual(query, {
|
|
13
11
|
sql: "CREATE USER foo WITH PASSWORD 'bar'",
|