@slonik/sql-tag 48.12.3 → 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
|
@@ -8,7 +8,7 @@ export const escapeLiteralValue = (subject) => {
|
|
|
8
8
|
if (character === "'") {
|
|
9
9
|
escaped += character + character;
|
|
10
10
|
}
|
|
11
|
-
else if (character ===
|
|
11
|
+
else if (character === "\\") {
|
|
12
12
|
escaped += character + character;
|
|
13
13
|
hasBackslash = true;
|
|
14
14
|
}
|
|
@@ -18,7 +18,7 @@ export const escapeLiteralValue = (subject) => {
|
|
|
18
18
|
}
|
|
19
19
|
escaped += "'";
|
|
20
20
|
if (hasBackslash === true) {
|
|
21
|
-
escaped =
|
|
21
|
+
escaped = "E" + escaped;
|
|
22
22
|
}
|
|
23
23
|
return escaped;
|
|
24
24
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { escapeLiteralValue } from
|
|
2
|
-
import test from
|
|
3
|
-
test(
|
|
4
|
-
t.is(escapeLiteralValue(
|
|
5
|
-
t.is(escapeLiteralValue(
|
|
6
|
-
t.is(escapeLiteralValue('"foo"'), '\
|
|
7
|
-
t.is(escapeLiteralValue(
|
|
1
|
+
import { escapeLiteralValue } from "./escapeLiteralValue.js";
|
|
2
|
+
import test from "ava";
|
|
3
|
+
test("escapes SQL literal value", (t) => {
|
|
4
|
+
t.is(escapeLiteralValue("foo"), "'foo'");
|
|
5
|
+
t.is(escapeLiteralValue("foo bar"), "'foo bar'");
|
|
6
|
+
t.is(escapeLiteralValue('"foo"'), "'\"foo\"'");
|
|
7
|
+
t.is(escapeLiteralValue("foo\\bar"), "E'foo\\\\bar'");
|
|
8
8
|
});
|
|
9
9
|
//# sourceMappingURL=escapeLiteralValue.test.js.map
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
* This way, we can safely detect placeholders that are part of a nested fragment.
|
|
12
12
|
*/
|
|
13
13
|
export const formatSlonikPlaceholder = (index) => {
|
|
14
|
-
return
|
|
14
|
+
return "$slonik_" + String(index);
|
|
15
15
|
};
|
|
16
16
|
//# sourceMappingURL=formatSlonikPlaceholder.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const isPrimitiveValueExpression = (maybe) => {
|
|
2
|
-
return (typeof maybe ===
|
|
3
|
-
typeof maybe ===
|
|
4
|
-
typeof maybe ===
|
|
5
|
-
typeof maybe ===
|
|
2
|
+
return (typeof maybe === "string" ||
|
|
3
|
+
typeof maybe === "number" ||
|
|
4
|
+
typeof maybe === "boolean" ||
|
|
5
|
+
typeof maybe === "bigint" ||
|
|
6
6
|
maybe === null);
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=isPrimitiveValueExpression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isSqlToken.d.ts","sourceRoot":"","sources":["../../src/utilities/isSqlToken.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"isSqlToken.d.ts","sourceRoot":"","sources":["../../src/utilities/isSqlToken.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAiC5D,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,YAmCxD,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ArrayToken, BinaryToken, ComparisonPredicateToken, DateToken, FragmentToken, IdentifierToken, IntervalToken, JsonBinaryToken, JsonToken, ListToken, QueryToken, TimestampToken, UnnestToken, UuidToken, } from
|
|
2
|
-
import { hasOwnProperty } from
|
|
3
|
-
import { UnexpectedStateError } from
|
|
1
|
+
import { ArrayToken, BinaryToken, ComparisonPredicateToken, DateToken, FragmentToken, IdentifierToken, IntervalToken, JsonBinaryToken, JsonToken, ListToken, QueryToken, TimestampToken, UnnestToken, UuidToken, } from "../tokens.js";
|
|
2
|
+
import { hasOwnProperty } from "./hasOwnProperty.js";
|
|
3
|
+
import { UnexpectedStateError } from "@slonik/errors";
|
|
4
4
|
const Tokens = [
|
|
5
5
|
ArrayToken,
|
|
6
6
|
BinaryToken,
|
|
@@ -19,24 +19,24 @@ const Tokens = [
|
|
|
19
19
|
];
|
|
20
20
|
const tokenNames = new Set(Tokens.map((token) => {
|
|
21
21
|
const tokenTypeName = Symbol.keyFor(token);
|
|
22
|
-
if (typeof tokenTypeName !==
|
|
23
|
-
throw new UnexpectedStateError(
|
|
22
|
+
if (typeof tokenTypeName !== "string") {
|
|
23
|
+
throw new UnexpectedStateError("Expected token type be a symbol with inferrable key");
|
|
24
24
|
}
|
|
25
25
|
return tokenTypeName;
|
|
26
26
|
}));
|
|
27
27
|
export const isSqlToken = (subject) => {
|
|
28
|
-
if (typeof subject !==
|
|
28
|
+
if (typeof subject !== "object" || subject === null) {
|
|
29
29
|
return false;
|
|
30
30
|
}
|
|
31
|
-
if (!hasOwnProperty(subject,
|
|
31
|
+
if (!hasOwnProperty(subject, "type")) {
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
const tokenType = subject.type;
|
|
35
|
-
if (typeof tokenType !==
|
|
35
|
+
if (typeof tokenType !== "symbol") {
|
|
36
36
|
return false;
|
|
37
37
|
}
|
|
38
38
|
const tokenTypeName = Symbol.keyFor(tokenType);
|
|
39
|
-
if (typeof tokenTypeName !==
|
|
39
|
+
if (typeof tokenTypeName !== "string") {
|
|
40
40
|
return false;
|
|
41
41
|
}
|
|
42
42
|
// It is worth clarifying that we don't care if symbols match.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isSqlToken.js","sourceRoot":"","sources":["../../src/utilities/isSqlToken.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,wBAAwB,EACxB,SAAS,EACT,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,MAAM,GAAG;IACb,UAAU;IACV,WAAW;IACX,wBAAwB;IACxB,SAAS;IACT,aAAa;IACb,eAAe;IACf,aAAa;IACb,eAAe;IACf,SAAS;IACT,SAAS;IACT,UAAU;IACV,cAAc;IACd,WAAW;IACX,SAAS;CACD,CAAC;AAEX,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;IACnB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAoB,
|
|
1
|
+
{"version":3,"file":"isSqlToken.js","sourceRoot":"","sources":["../../src/utilities/isSqlToken.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,wBAAwB,EACxB,SAAS,EACT,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,MAAM,GAAG;IACb,UAAU;IACV,WAAW;IACX,wBAAwB;IACxB,SAAS;IACT,aAAa;IACb,eAAe;IACf,aAAa;IACb,eAAe;IACf,SAAS;IACT,SAAS;IACT,UAAU;IACV,cAAc;IACd,WAAW;IACX,SAAS;CACD,CAAC;AAEX,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;IACnB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAoB,CAAC,qDAAqD,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAA2B,EAAE;IACtE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8DAA8D;IAC9D,4BAA4B;IAC5B,+BAA+B;IAC/B,8BAA8B;IAC9B,EAAE;IACF,gDAAgD;IAChD,8CAA8C;IAC9C,sDAAsD;IACtD,EAAE;IACF,yDAAyD;IACzD,oDAAoD;IACpD,6CAA6C;IAC7C,kCAAkC;IAClC,OAAO,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { configure } from
|
|
1
|
+
import { configure } from "safe-stable-stringify";
|
|
2
2
|
const stringify = configure({
|
|
3
3
|
bigint: true,
|
|
4
|
-
circularValue:
|
|
4
|
+
circularValue: "[Circular]",
|
|
5
5
|
strict: true,
|
|
6
6
|
});
|
|
7
7
|
export const safeStringify = (subject) => {
|
|
@@ -13,7 +13,7 @@ export const safeStringify = (subject) => {
|
|
|
13
13
|
}
|
|
14
14
|
const result = stringify(subject);
|
|
15
15
|
if (result === undefined) {
|
|
16
|
-
throw new Error(
|
|
16
|
+
throw new Error("Expected result to be string");
|
|
17
17
|
}
|
|
18
18
|
return result;
|
|
19
19
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { stripArrayNotation } from
|
|
2
|
-
import test from
|
|
3
|
-
test(
|
|
4
|
-
t.is(stripArrayNotation(
|
|
5
|
-
t.is(stripArrayNotation(
|
|
6
|
-
t.is(stripArrayNotation(
|
|
1
|
+
import { stripArrayNotation } from "./stripArrayNotation.js";
|
|
2
|
+
import test from "ava";
|
|
3
|
+
test("strips array notation", (t) => {
|
|
4
|
+
t.is(stripArrayNotation("foo"), "foo");
|
|
5
|
+
t.is(stripArrayNotation("foo[]"), "foo");
|
|
6
|
+
t.is(stripArrayNotation("foo[][]"), "foo");
|
|
7
7
|
});
|
|
8
8
|
//# sourceMappingURL=stripArrayNotation.test.js.map
|
package/package.json
CHANGED
|
@@ -1,67 +1,63 @@
|
|
|
1
1
|
{
|
|
2
|
+
"name": "@slonik/sql-tag",
|
|
3
|
+
"version": "48.13.0",
|
|
4
|
+
"description": "A Node.js PostgreSQL client with strict types, detailed logging and assertions.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"postgresql",
|
|
7
|
+
"promise",
|
|
8
|
+
"types"
|
|
9
|
+
],
|
|
10
|
+
"license": "BSD-3-Clause",
|
|
2
11
|
"author": {
|
|
3
|
-
"email": "gajus@gajus.com",
|
|
4
12
|
"name": "Gajus Kuizinas",
|
|
13
|
+
"email": "gajus@gajus.com",
|
|
5
14
|
"url": "http://gajus.com"
|
|
6
15
|
},
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
],
|
|
11
|
-
"files": [
|
|
12
|
-
"src/**/*.test.ts"
|
|
13
|
-
],
|
|
14
|
-
"nodeArguments": [
|
|
15
|
-
"--import=tsimp"
|
|
16
|
-
]
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/gajus/slonik"
|
|
17
19
|
},
|
|
20
|
+
"files": [
|
|
21
|
+
"./src",
|
|
22
|
+
"./dist"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
18
27
|
"dependencies": {
|
|
19
|
-
"@slonik/errors": "^48.
|
|
20
|
-
"@slonik/types": "^48.
|
|
28
|
+
"@slonik/errors": "^48.13.0",
|
|
29
|
+
"@slonik/types": "^48.13.0",
|
|
21
30
|
"roarr": "^7.21.4",
|
|
22
31
|
"safe-stable-stringify": "^2.5.0",
|
|
23
32
|
"serialize-error": "^12.0.0",
|
|
24
33
|
"zod": "^4.3.6"
|
|
25
34
|
},
|
|
26
|
-
"description": "A Node.js PostgreSQL client with strict types, detailed logging and assertions.",
|
|
27
35
|
"devDependencies": {
|
|
28
36
|
"@standard-schema/spec": "^1.0.0",
|
|
29
37
|
"@types/node": "^24.10.13",
|
|
30
38
|
"ava": "^6.4.1",
|
|
31
39
|
"cspell": "^9.6.4",
|
|
32
|
-
"eslint": "9.39.2",
|
|
33
40
|
"tsimp": "^2.0.12",
|
|
34
|
-
"typescript": "^5.9.3"
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"ava": {
|
|
44
|
+
"extensions": [
|
|
45
|
+
"ts"
|
|
46
|
+
],
|
|
47
|
+
"files": [
|
|
48
|
+
"src/**/*.test.ts"
|
|
49
|
+
],
|
|
50
|
+
"nodeArguments": [
|
|
51
|
+
"--import=tsimp"
|
|
52
|
+
]
|
|
37
53
|
},
|
|
38
54
|
"engines": {
|
|
39
55
|
"node": ">=24"
|
|
40
56
|
},
|
|
41
|
-
"files": [
|
|
42
|
-
"./src",
|
|
43
|
-
"./dist"
|
|
44
|
-
],
|
|
45
|
-
"keywords": [
|
|
46
|
-
"postgresql",
|
|
47
|
-
"promise",
|
|
48
|
-
"types"
|
|
49
|
-
],
|
|
50
|
-
"license": "BSD-3-Clause",
|
|
51
|
-
"main": "./dist/index.js",
|
|
52
|
-
"name": "@slonik/sql-tag",
|
|
53
|
-
"repository": {
|
|
54
|
-
"type": "git",
|
|
55
|
-
"url": "https://github.com/gajus/slonik"
|
|
56
|
-
},
|
|
57
|
-
"type": "module",
|
|
58
|
-
"types": "./dist/index.d.ts",
|
|
59
|
-
"version": "48.12.3",
|
|
60
57
|
"scripts": {
|
|
61
58
|
"build": "rm -fr ./dist && tsc --project ./tsconfig.json",
|
|
62
|
-
"lint": "npm run lint:cspell && npm run lint:
|
|
59
|
+
"lint": "npm run lint:cspell && npm run lint:tsc",
|
|
63
60
|
"lint:cspell": "cspell . --no-progress --gitignore",
|
|
64
|
-
"lint:eslint": "eslint --cache ./src",
|
|
65
61
|
"lint:tsc": "tsc --noEmit",
|
|
66
62
|
"test": "ava --verbose --serial"
|
|
67
63
|
}
|
package/src/Logger.ts
CHANGED
package/src/declarations.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Logger } from
|
|
2
|
-
import type { PrimitiveValueExpression } from
|
|
3
|
-
import { safeStringify } from
|
|
4
|
-
import { UnexpectedStateError } from
|
|
1
|
+
import { Logger } from "../Logger.js";
|
|
2
|
+
import type { PrimitiveValueExpression } from "../types.js";
|
|
3
|
+
import { safeStringify } from "../utilities/safeStringify.js";
|
|
4
|
+
import { UnexpectedStateError } from "@slonik/errors";
|
|
5
5
|
|
|
6
6
|
const log = Logger.child({
|
|
7
|
-
namespace:
|
|
7
|
+
namespace: "createPrimitiveValueExpressions",
|
|
8
8
|
});
|
|
9
9
|
|
|
10
10
|
export const createPrimitiveValueExpressions = (
|
|
@@ -19,10 +19,10 @@ export const createPrimitiveValueExpressions = (
|
|
|
19
19
|
if (
|
|
20
20
|
Array.isArray(value) ||
|
|
21
21
|
Buffer.isBuffer(value) ||
|
|
22
|
-
typeof value ===
|
|
23
|
-
typeof value ===
|
|
24
|
-
typeof value ===
|
|
25
|
-
typeof value ===
|
|
22
|
+
typeof value === "string" ||
|
|
23
|
+
typeof value === "number" ||
|
|
24
|
+
typeof value === "boolean" ||
|
|
25
|
+
typeof value === "bigint" ||
|
|
26
26
|
value === null
|
|
27
27
|
) {
|
|
28
28
|
primitiveValueExpressions.push(value);
|
|
@@ -32,10 +32,10 @@ export const createPrimitiveValueExpressions = (
|
|
|
32
32
|
value: JSON.parse(safeStringify(value)),
|
|
33
33
|
values: JSON.parse(safeStringify(values)),
|
|
34
34
|
},
|
|
35
|
-
|
|
35
|
+
"unexpected value expression",
|
|
36
36
|
);
|
|
37
37
|
|
|
38
|
-
throw new UnexpectedStateError(
|
|
38
|
+
throw new UnexpectedStateError("Unexpected value expression.");
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { FragmentToken } from
|
|
2
|
-
import type { ArraySqlToken, SqlFragmentToken } from
|
|
3
|
-
import { createSqlTag } from
|
|
4
|
-
import test from
|
|
1
|
+
import { FragmentToken } from "../../tokens.js";
|
|
2
|
+
import type { ArraySqlToken, SqlFragmentToken } from "../../types.js";
|
|
3
|
+
import { createSqlTag } from "../createSqlTag.js";
|
|
4
|
+
import test from "ava";
|
|
5
5
|
|
|
6
6
|
const sql = createSqlTag();
|
|
7
7
|
|
|
8
|
-
test(
|
|
9
|
-
const query = sql.fragment`SELECT ${sql.array([],
|
|
8
|
+
test("binds an empty array", (t) => {
|
|
9
|
+
const query = sql.fragment`SELECT ${sql.array([], "int4")}`;
|
|
10
10
|
|
|
11
11
|
t.deepEqual(query, {
|
|
12
12
|
sql: 'SELECT $slonik_1::"int4"[]',
|
|
@@ -15,11 +15,11 @@ test('binds an empty array', (t) => {
|
|
|
15
15
|
});
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
test(
|
|
18
|
+
test("binds bigint", (t) => {
|
|
19
19
|
const query = sql.fragment`SELECT ${sql.array(
|
|
20
20
|
// eslint-disable-next-line unicorn/numeric-separators-style
|
|
21
21
|
[9007199254740999n],
|
|
22
|
-
|
|
22
|
+
"int8",
|
|
23
23
|
)}`;
|
|
24
24
|
|
|
25
25
|
t.deepEqual(query, {
|
|
@@ -30,8 +30,8 @@ test('binds bigint', (t) => {
|
|
|
30
30
|
});
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
test(
|
|
34
|
-
const query = sql.fragment`SELECT ${sql.array([1, 2, 3],
|
|
33
|
+
test("binds an array with multiple values", (t) => {
|
|
34
|
+
const query = sql.fragment`SELECT ${sql.array([1, 2, 3], "int4")}`;
|
|
35
35
|
|
|
36
36
|
t.deepEqual(query, {
|
|
37
37
|
sql: 'SELECT $slonik_1::"int4"[]',
|
|
@@ -40,24 +40,18 @@ test('binds an array with multiple values', (t) => {
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
test(
|
|
44
|
-
const query = sql.fragment`SELECT ${sql.array(
|
|
45
|
-
[Buffer.from('foo')],
|
|
46
|
-
'bytea',
|
|
47
|
-
)}`;
|
|
43
|
+
test("binds an array with bytea values", (t) => {
|
|
44
|
+
const query = sql.fragment`SELECT ${sql.array([Buffer.from("foo")], "bytea")}`;
|
|
48
45
|
|
|
49
46
|
t.deepEqual(query, {
|
|
50
47
|
sql: 'SELECT $slonik_1::"bytea"[]',
|
|
51
48
|
type: FragmentToken,
|
|
52
|
-
values: [[Buffer.from(
|
|
49
|
+
values: [[Buffer.from("foo")]],
|
|
53
50
|
});
|
|
54
51
|
});
|
|
55
52
|
|
|
56
|
-
test(
|
|
57
|
-
const query = sql.fragment`SELECT ${1}, ${sql.array(
|
|
58
|
-
[1, 2, 3],
|
|
59
|
-
'int4',
|
|
60
|
-
)}, ${3}`;
|
|
53
|
+
test("offsets positional parameter indexes", (t) => {
|
|
54
|
+
const query = sql.fragment`SELECT ${1}, ${sql.array([1, 2, 3], "int4")}, ${3}`;
|
|
61
55
|
|
|
62
56
|
t.deepEqual(query, {
|
|
63
57
|
sql: 'SELECT $slonik_1, $slonik_2::"int4"[], $slonik_3',
|
|
@@ -66,40 +60,34 @@ test('offsets positional parameter indexes', (t) => {
|
|
|
66
60
|
});
|
|
67
61
|
});
|
|
68
62
|
|
|
69
|
-
test(
|
|
70
|
-
const query = sql.fragment`SELECT ${sql.array(
|
|
71
|
-
[1, 2, 3],
|
|
72
|
-
sql.fragment`int[]`,
|
|
73
|
-
)}`;
|
|
63
|
+
test("binds a SQL token", (t) => {
|
|
64
|
+
const query = sql.fragment`SELECT ${sql.array([1, 2, 3], sql.fragment`int[]`)}`;
|
|
74
65
|
|
|
75
66
|
t.deepEqual(query, {
|
|
76
|
-
sql:
|
|
67
|
+
sql: "SELECT $slonik_1::int[]",
|
|
77
68
|
type: FragmentToken,
|
|
78
69
|
values: [[1, 2, 3]],
|
|
79
70
|
});
|
|
80
71
|
});
|
|
81
72
|
|
|
82
|
-
test(
|
|
73
|
+
test("throws if array member is not a primitive value expression", (t) => {
|
|
83
74
|
const error = t.throws(() => {
|
|
84
75
|
sql.fragment`SELECT ${sql.array(
|
|
85
76
|
[
|
|
86
77
|
// @ts-expect-error - intentional
|
|
87
78
|
() => {},
|
|
88
79
|
],
|
|
89
|
-
|
|
80
|
+
"int",
|
|
90
81
|
)}`;
|
|
91
82
|
});
|
|
92
83
|
|
|
93
|
-
t.is(
|
|
94
|
-
error?.message,
|
|
95
|
-
'Invalid array member type. Must be a primitive value expression.',
|
|
96
|
-
);
|
|
84
|
+
t.is(error?.message, "Invalid array member type. Must be a primitive value expression.");
|
|
97
85
|
});
|
|
98
86
|
|
|
99
87
|
test('throws if memberType is not a string or SqlToken of different type than "SLONIK_TOKEN_FRAGMENT"', (t) => {
|
|
100
88
|
const error = t.throws(() => {
|
|
101
89
|
// @ts-expect-error - intentional
|
|
102
|
-
sql.fragment`SELECT ${sql.array([1, 2, 3], sql.identifier([
|
|
90
|
+
sql.fragment`SELECT ${sql.array([1, 2, 3], sql.identifier(["int"]))}`;
|
|
103
91
|
});
|
|
104
92
|
|
|
105
93
|
t.is(
|
|
@@ -115,11 +103,11 @@ function assertType<T>(_value: T): void {
|
|
|
115
103
|
}
|
|
116
104
|
|
|
117
105
|
test('produces ArraySqlToken<"int4"> for integer arrays', (t) => {
|
|
118
|
-
const arrayToken = sql.array([1, 2, 3],
|
|
106
|
+
const arrayToken = sql.array([1, 2, 3], "int4");
|
|
119
107
|
|
|
120
|
-
assertType<ArraySqlToken<
|
|
108
|
+
assertType<ArraySqlToken<"int4">>(arrayToken);
|
|
121
109
|
|
|
122
|
-
t.is(arrayToken.memberType,
|
|
110
|
+
t.is(arrayToken.memberType, "int4");
|
|
123
111
|
t.deepEqual(arrayToken.values, [1, 2, 3]);
|
|
124
112
|
|
|
125
113
|
const query = sql.fragment`SELECT ${arrayToken}`;
|
|
@@ -131,46 +119,46 @@ test('produces ArraySqlToken<"int4"> for integer arrays', (t) => {
|
|
|
131
119
|
});
|
|
132
120
|
|
|
133
121
|
test('produces ArraySqlToken<"text"> for text arrays', (t) => {
|
|
134
|
-
const arrayToken = sql.array([
|
|
122
|
+
const arrayToken = sql.array(["a", "b", "c"], "text");
|
|
135
123
|
|
|
136
|
-
assertType<ArraySqlToken<
|
|
124
|
+
assertType<ArraySqlToken<"text">>(arrayToken);
|
|
137
125
|
|
|
138
|
-
t.is(arrayToken.memberType,
|
|
139
|
-
t.deepEqual(arrayToken.values, [
|
|
126
|
+
t.is(arrayToken.memberType, "text");
|
|
127
|
+
t.deepEqual(arrayToken.values, ["a", "b", "c"]);
|
|
140
128
|
|
|
141
129
|
const query = sql.fragment`SELECT ${arrayToken}`;
|
|
142
130
|
|
|
143
131
|
t.deepEqual(query, {
|
|
144
132
|
sql: 'SELECT $slonik_1::"text"[]',
|
|
145
133
|
type: FragmentToken,
|
|
146
|
-
values: [[
|
|
134
|
+
values: [["a", "b", "c"]],
|
|
147
135
|
});
|
|
148
136
|
});
|
|
149
137
|
|
|
150
|
-
test(
|
|
151
|
-
const int8Array = sql.array([1n, 2n],
|
|
152
|
-
assertType<ArraySqlToken<
|
|
153
|
-
t.is(int8Array.memberType,
|
|
138
|
+
test("type inference with different PostgreSQL types", (t) => {
|
|
139
|
+
const int8Array = sql.array([1n, 2n], "int8");
|
|
140
|
+
assertType<ArraySqlToken<"int8">>(int8Array);
|
|
141
|
+
t.is(int8Array.memberType, "int8");
|
|
154
142
|
|
|
155
|
-
const float8Array = sql.array([1.1, 2.2, 3.3],
|
|
156
|
-
assertType<ArraySqlToken<
|
|
157
|
-
t.is(float8Array.memberType,
|
|
143
|
+
const float8Array = sql.array([1.1, 2.2, 3.3], "float8");
|
|
144
|
+
assertType<ArraySqlToken<"float8">>(float8Array);
|
|
145
|
+
t.is(float8Array.memberType, "float8");
|
|
158
146
|
|
|
159
|
-
const boolArray = sql.array([true, false, true],
|
|
160
|
-
assertType<ArraySqlToken<
|
|
161
|
-
t.is(boolArray.memberType,
|
|
147
|
+
const boolArray = sql.array([true, false, true], "bool");
|
|
148
|
+
assertType<ArraySqlToken<"bool">>(boolArray);
|
|
149
|
+
t.is(boolArray.memberType, "bool");
|
|
162
150
|
|
|
163
|
-
const uuidArray = sql.array([
|
|
164
|
-
assertType<ArraySqlToken<
|
|
165
|
-
t.is(uuidArray.memberType,
|
|
151
|
+
const uuidArray = sql.array(["550e8400-e29b-41d4-a716-446655440000"], "uuid");
|
|
152
|
+
assertType<ArraySqlToken<"uuid">>(uuidArray);
|
|
153
|
+
t.is(uuidArray.memberType, "uuid");
|
|
166
154
|
|
|
167
|
-
const timestampArray = sql.array([new Date().toISOString()],
|
|
168
|
-
assertType<ArraySqlToken<
|
|
169
|
-
t.is(timestampArray.memberType,
|
|
155
|
+
const timestampArray = sql.array([new Date().toISOString()], "timestamp");
|
|
156
|
+
assertType<ArraySqlToken<"timestamp">>(timestampArray);
|
|
157
|
+
t.is(timestampArray.memberType, "timestamp");
|
|
170
158
|
|
|
171
|
-
const jsonbArray = sql.array([JSON.stringify({ key:
|
|
172
|
-
assertType<ArraySqlToken<
|
|
173
|
-
t.is(jsonbArray.memberType,
|
|
159
|
+
const jsonbArray = sql.array([JSON.stringify({ key: "value" })], "jsonb");
|
|
160
|
+
assertType<ArraySqlToken<"jsonb">>(jsonbArray);
|
|
161
|
+
t.is(jsonbArray.memberType, "jsonb");
|
|
174
162
|
|
|
175
163
|
const query = sql.fragment`
|
|
176
164
|
SELECT
|
|
@@ -184,16 +172,16 @@ test('type inference with different PostgreSQL types', (t) => {
|
|
|
184
172
|
t.truthy(query.sql.includes('::"bool"[]'));
|
|
185
173
|
});
|
|
186
174
|
|
|
187
|
-
test(
|
|
188
|
-
const arrayToken = sql.array([1, 2, 3],
|
|
175
|
+
test("backward compatibility - existing code without explicit types still works", (t) => {
|
|
176
|
+
const arrayToken = sql.array([1, 2, 3], "int4");
|
|
189
177
|
|
|
190
178
|
const token: ArraySqlToken = arrayToken;
|
|
191
179
|
|
|
192
|
-
t.is(token.memberType,
|
|
180
|
+
t.is(token.memberType, "int4");
|
|
193
181
|
|
|
194
182
|
const fragmentArray = sql.array([1, 2, 3], sql.fragment`int[]`);
|
|
195
183
|
|
|
196
|
-
t.is(typeof fragmentArray.memberType,
|
|
184
|
+
t.is(typeof fragmentArray.memberType, "object");
|
|
197
185
|
t.is((fragmentArray.memberType as SqlFragmentToken).type, FragmentToken);
|
|
198
186
|
|
|
199
187
|
t.deepEqual(fragmentArray.values, [1, 2, 3]);
|
|
@@ -201,7 +189,7 @@ test('backward compatibility - existing code without explicit types still works'
|
|
|
201
189
|
const query = sql.fragment`SELECT ${fragmentArray}`;
|
|
202
190
|
|
|
203
191
|
t.deepEqual(query, {
|
|
204
|
-
sql:
|
|
192
|
+
sql: "SELECT $slonik_1::int[]",
|
|
205
193
|
type: FragmentToken,
|
|
206
194
|
values: [[1, 2, 3]],
|
|
207
195
|
});
|
|
@@ -1,26 +1,24 @@
|
|
|
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 ${sql.date(
|
|
9
|
-
new Date('2022-08-19T03:27:24.951Z'),
|
|
10
|
-
)}`;
|
|
7
|
+
test("binds a date", (t) => {
|
|
8
|
+
const query = sql.fragment`SELECT ${sql.date(new Date("2022-08-19T03:27:24.951Z"))}`;
|
|
11
9
|
|
|
12
10
|
t.deepEqual(query, {
|
|
13
|
-
sql:
|
|
11
|
+
sql: "SELECT $slonik_1::date",
|
|
14
12
|
type: FragmentToken,
|
|
15
|
-
values: [
|
|
13
|
+
values: ["2022-08-19"],
|
|
16
14
|
});
|
|
17
15
|
});
|
|
18
16
|
|
|
19
|
-
test(
|
|
17
|
+
test("throws if not instance of Date", (t) => {
|
|
20
18
|
const error = t.throws(() => {
|
|
21
19
|
// @ts-expect-error - intentional
|
|
22
20
|
sql.fragment`SELECT ${sql.date(1)}`;
|
|
23
21
|
});
|
|
24
22
|
|
|
25
|
-
t.is(error?.message,
|
|
23
|
+
t.is(error?.message, "Date parameter value must be an instance of Date.");
|
|
26
24
|
});
|