From 22093c2dc3375478fa0a4fd4888f2e3d91ff3ce9 Mon Sep 17 00:00:00 2001 From: Ivan Kerin Date: Fri, 9 Aug 2019 17:27:19 +0300 Subject: [PATCH] Slonik - add support for json token type (#37437) * Add support for json token type * Fix bugs * Add tests to verify jeson objects --- types/slonik/index.d.ts | 27 ++++++++++++++++++++++++++- types/slonik/slonik-tests.ts | 27 +++++++++++++++++++++++++++ types/slonik/symbols.d.ts | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/types/slonik/index.d.ts b/types/slonik/index.d.ts index 86c17bfba5..60fd69bbc1 100644 --- a/types/slonik/index.d.ts +++ b/types/slonik/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for slonik 18.2 +// Type definitions for slonik 18.6 // Project: https://github.com/gajus/slonik#readme // Definitions by: Sebastian Sebald // Misha Kaletsky @@ -26,6 +26,22 @@ export type LogicalBooleanOperatorType = 'AND' | 'OR'; // EXPRESSIONS AND TOKENS // ---------------------------------------------------------------------- +export type SerializableValueType = + | string + | number + | boolean + | null + | object + | SerializableValueObject + | SerializableValueArray; + +export interface SerializableValueObject { + [x: string]: SerializableValueType; +} + +export interface SerializableValueArray + extends ReadonlyArray {} + export interface IdentifierTokenType { names: ReadonlyArray; type: typeof SlonikSymbol.IdentifierTokenSymbol; @@ -60,6 +76,11 @@ export interface ArraySqlTokenType { values: PrimitiveValueExpressionType[]; } +export interface JsonSqlTokenType { + value: SerializableValueType; + type: typeof SlonikSymbol.JsonTokenSymbol; +} + export interface TupleSqlTokenType { values: PrimitiveValueExpressionType[]; type: typeof SlonikSymbol.TupleTokenSymbol; @@ -101,6 +122,7 @@ export type SqlTokenType = AssignmentListTokenType | IdentifierTokenType | IdentifierListTokenType | + JsonSqlTokenType | RawSqlTokenType | SqlSqlTokenType | TupleListSqlTokenType | @@ -325,6 +347,9 @@ export interface SqlTaggedTemplateType { identifierList: ( identifiers: IdentifierListMemberType[] ) => IdentifierListTokenType; + json: ( + value: SerializableValueType + ) => JsonSqlTokenType; raw: ( rawSql: string, values?: PrimitiveValueExpressionType[] diff --git a/types/slonik/slonik-tests.ts b/types/slonik/slonik-tests.ts index 0b1dbc9fbc..3efcced500 100644 --- a/types/slonik/slonik-tests.ts +++ b/types/slonik/slonik-tests.ts @@ -283,6 +283,33 @@ createTimestampWithTimeZoneTypeParser(); // ExpectType SqlSqlTokenType const query1 = sql`SELECT ${'baz'} FROM (${query0})`; + await connection.query(sql` + SELECT (${sql.json([1, 2, { test: 12, other: 'test' }])}) + `); + + await connection.query(sql` + SELECT (${sql.json('test')}) + `); + + await connection.query(sql` + SELECT (${sql.json(null)}) + `); + + await connection.query(sql` + SELECT (${sql.json(123)}) + `); + + await connection.query(sql` + SELECT (${sql.json({ + nested: { + object: { is: { this: 'test', other: 12, and: new Date('123') } }, + }, + })}) + `); + + // $ExpectError + sql`SELECT ${sql.json(undefined)}`; + await connection.query(sql` SELECT (${sql.valueList([1, 2, 3])}) `); diff --git a/types/slonik/symbols.d.ts b/types/slonik/symbols.d.ts index b50d07564a..44d7a3ec39 100644 --- a/types/slonik/symbols.d.ts +++ b/types/slonik/symbols.d.ts @@ -4,6 +4,7 @@ export const BooleanExpressionTokenSymbol: unique symbol; export const ComparisonPredicateTokenSymbol: unique symbol; export const IdentifierListTokenSymbol: unique symbol; export const IdentifierTokenSymbol: unique symbol; +export const JsonTokenSymbol: unique symbol; export const RawSqlTokenSymbol: unique symbol; export const SqlTokenSymbol: unique symbol; export const ValueListTokenSymbol: unique symbol;