Skip to content

Commit

Permalink
feat!: update everything for latest slonik
Browse files Browse the repository at this point in the history
  • Loading branch information
rintaun committed Dec 5, 2022
1 parent e81096b commit cf6417c
Show file tree
Hide file tree
Showing 27 changed files with 589 additions and 246 deletions.
8 changes: 3 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,10 @@
"prettier": "^2.8.0",
"semantic-release": "^19.0.5",
"ts-jest": "^29.0.3",
"ts-node": "^10.9.1",
"typescript": "^4.9.3",
"zod": "^3.19.1"
"ts-node": "^10.9.1"
},
"peerDependencies": {
"typescript": ">= 3.9.0",
"zod": "^3.14.4"
"typescript": ">= 4.9.0",
"zod": "^3.19.1"
}
}
2 changes: 1 addition & 1 deletion src/cli/commands/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ export const handler = async (
)
}

const schemaInfo = new SchemaInfo(createPool(dbUrl), String(schema))
const schemaInfo = new SchemaInfo(await createPool(dbUrl), String(schema))

const generator = new Generator({
schema: schemaInfo,
Expand Down
24 changes: 12 additions & 12 deletions src/datasource/DBDataSource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import DataLoader from 'dataloader'
import {
sql,
DatabasePool,
TaggedTemplateLiteralInvocation,
IdentifierNormalizer,
DatabaseTransactionConnection,
} from 'slonik'
Expand All @@ -22,8 +21,9 @@ import {
ValueOrArray,
} from './queries/types'
import { AsyncLocalStorage } from 'async_hooks'
import type { ZodSchema } from 'zod'
import type { z, ZodSchema } from 'zod'
import { isSqlToken } from './queries/utils'
import { TypedSqlQuery } from '../types'

export interface QueryOptions<TRowType, TResultType = TRowType>
extends BuilderOptions<TRowType> {
Expand Down Expand Up @@ -426,23 +426,23 @@ export default class DBDataSource<
* @param options Query options
*/
protected async query<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options: QueryOptions<TData> & { expected?: 'any' | 'many' }
): Promise<readonly TData[]>
protected async query<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options: QueryOptions<TData> & { expected: 'one' }
): Promise<TData>
protected async query<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options: QueryOptions<TData> & { expected: 'maybeOne' }
): Promise<TData | null>
protected async query<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options?: QueryOptions<TData>
): Promise<TData | null | readonly TData[]>
protected async query<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options?: QueryOptions<TData>
): Promise<TData | null | readonly TData[]> {
switch (options?.expected || 'any') {
Expand All @@ -458,7 +458,7 @@ export default class DBDataSource<
}

private async any<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options?: QueryOptions<TData>
): Promise<readonly TData[]> {
const results = (await this.connection.any(query)).map((row) =>
Expand All @@ -469,7 +469,7 @@ export default class DBDataSource<
}

private async many<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options?: QueryOptions<TData>
): Promise<readonly TData[]> {
const results = (await this.connection.many(query)).map((row) =>
Expand All @@ -480,7 +480,7 @@ export default class DBDataSource<
}

private async one<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options?: QueryOptions<TData>
): Promise<TData> {
const result = this.transformResult<TData, TData>(
Expand All @@ -491,7 +491,7 @@ export default class DBDataSource<
}

private async maybeOne<TData>(
query: TaggedTemplateLiteralInvocation<TData>,
query: TypedSqlQuery<z.ZodAny>,
options?: QueryOptions<TData>
): Promise<TData | null> {
let result = await this.connection.maybeOne(query)
Expand Down Expand Up @@ -538,7 +538,7 @@ export default class DBDataSource<
...options,
expected: 'any',
where: {
[column]: sql`= ${this.builder.any(
[column]: sql.fragment`= ${this.builder.any(
[...args] as unknown as (string | number | boolean | Date | null)[],
type
)}`,
Expand Down
15 changes: 7 additions & 8 deletions src/datasource/__tests__/integration.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import assert from 'assert'
import { createPool, DatabasePool, sql, SqlSqlToken } from 'slonik'
import { createPool, DatabasePool, sql, FragmentSqlToken } from 'slonik'
import { z, ZodSchema } from 'zod'

import { DBDataSource } from '..'
Expand All @@ -8,7 +8,7 @@ interface DummyRowType<TSchema = DefaultJsonbSchema> {
id: number
name: string
code: string
withDefault?: string | SqlSqlToken
withDefault?: string | FragmentSqlToken
camelCase: string
tsTest: Date
dateTest: Date
Expand Down Expand Up @@ -53,18 +53,18 @@ const createRow = <TSchema = DefaultJsonbSchema>(
beforeAll(async () => {
assert(process.env.DATABASE_URL, 'DATABASE_URL must be configured')

pool = createPool(process.env.DATABASE_URL, {
pool = await createPool(process.env.DATABASE_URL, {
captureStackTrace: true,
maximumPoolSize: 1,
idleTimeout: 'DISABLE_TIMEOUT',
idleInTransactionSessionTimeout: 'DISABLE_TIMEOUT',
})

await pool.transaction(async (connection) => {
await connection.query(sql`
await connection.query(sql.unsafe`
CREATE EXTENSION IF NOT EXISTS citext
`)
await connection.query(sql`
await connection.query(sql.unsafe`
CREATE TABLE IF NOT EXISTS "test_table" (
"id" INTEGER PRIMARY KEY,
"name" CITEXT NOT NULL,
Expand All @@ -86,7 +86,6 @@ afterAll(async () => {

class TestDataSource<TSchema = DefaultJsonbSchema> extends DBDataSource<
DummyRowType<TSchema>,
unknown,
DummyRowType<TSchema>,
typeof columnTypes
> {
Expand Down Expand Up @@ -132,7 +131,7 @@ beforeEach(() => {
})

afterEach(() => {
pool.query(sql`TRUNCATE test_table`)
pool.query(sql.unsafe`TRUNCATE test_table`)
})

describe('DBDataSource', () => {
Expand Down Expand Up @@ -167,7 +166,7 @@ describe('DBDataSource', () => {
id: 5,
code: 'A',
name: 'abc',
withDefault: sql`DEFAULT`,
withDefault: sql.fragment`DEFAULT`,
tsTest: new Date('2020-12-05T00:00:00.001Z'),
jsonbTest: { a: 1 },
})
Expand Down
50 changes: 30 additions & 20 deletions src/datasource/__tests__/queries.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,16 @@ describe(QueryBuilder, () => {
})

it('lets you pass in a raw expression', () => {
expect(builder.where(sql`true`)).toMatchSnapshot()
expect(builder.where(sql.fragment`true`)).toMatchSnapshot()
})

it('accepts a list of expressions', () => {
expect(
builder.where([sql`true`, sql`false`, sql`more raw expressions etc.`])
builder.where([
sql.fragment`true`,
sql.fragment`false`,
sql.fragment`more raw expressions etc.`,
])
).toMatchSnapshot()
})

Expand All @@ -72,7 +76,7 @@ describe(QueryBuilder, () => {
})

it('enables custom operators through use of sql tokens', () => {
expect(builder.where({ id: sql`> 1` })).toMatchSnapshot()
expect(builder.where({ id: sql.fragment`> 1` })).toMatchSnapshot()
})

it('produces a valid clause with no conditions', () => {
Expand Down Expand Up @@ -105,25 +109,27 @@ describe(QueryBuilder, () => {
})

it('accepts a single column name as arbitrary sql', () => {
expect(builder.orderBy(sql`anything i want!`)).toMatchSnapshot()
expect(
builder.orderBy(sql.fragment`anything i want!`)
).toMatchSnapshot()
})

it('accepts a mix of different types', () => {
expect(
builder.orderBy([
'a',
sql.identifier(['b']),
sql`c`,
sql.fragment`c`,
'd',
sql.identifier(['e']),
sql`f`,
sql.fragment`f`,
])
).toMatchSnapshot()
})

it('can use order tuples', () => {
expect(
builder.orderBy([['a', 'DESC'], 'b', [sql`c`, 'ASC']])
builder.orderBy([['a', 'DESC'], 'b', [sql.fragment`c`, 'ASC']])
).toMatchSnapshot()
})
})
Expand All @@ -142,18 +148,20 @@ describe(QueryBuilder, () => {
})

it('accepts a single column name as arbitrary sql', () => {
expect(builder.groupBy(sql`anything i want!`)).toMatchSnapshot()
expect(
builder.groupBy(sql.fragment`anything i want!`)
).toMatchSnapshot()
})

it('accepts a mix of different types', () => {
expect(
builder.groupBy([
'a',
sql.identifier(['b']),
sql`c`,
sql.fragment`c`,
'd',
sql.identifier(['e']),
sql`f`,
sql.fragment`f`,
])
).toMatchSnapshot()
})
Expand All @@ -173,15 +181,15 @@ describe(QueryBuilder, () => {
})

it('lets you pass in a raw expression', () => {
expect(builder.having(sql`true`)).toMatchSnapshot()
expect(builder.having(sql.fragment`true`)).toMatchSnapshot()
})

it('accepts a list of expressions', () => {
expect(
builder.having([
sql`true`,
sql`false`,
sql`more raw expressions etc.`,
sql.fragment`true`,
sql.fragment`false`,
sql.fragment`more raw expressions etc.`,
])
).toMatchSnapshot()
})
Expand Down Expand Up @@ -216,7 +224,7 @@ describe(QueryBuilder, () => {
})

it('can accept arbitrary sql', () => {
expect(builder.limit(sql`anything, thanks`)).toMatchSnapshot()
expect(builder.limit(sql.fragment`anything, thanks`)).toMatchSnapshot()
})
})
})
Expand Down Expand Up @@ -329,7 +337,7 @@ describe(QueryBuilder, () => {
expect(
builder.insert({
id: 1,
name: sql`DEFAULT`,
name: sql.fragment`DEFAULT`,
})
).toMatchSnapshot()
})
Expand All @@ -339,11 +347,11 @@ describe(QueryBuilder, () => {
builder.insert([
{
id: 1,
name: sql`DEFAULT`,
name: sql.fragment`DEFAULT`,
},
{
id: 2,
name: sql`DEFAULT`,
name: sql.fragment`DEFAULT`,
},
])
).toMatchSnapshot()
Expand All @@ -358,7 +366,7 @@ describe(QueryBuilder, () => {
},
{
id: 2,
name: sql`DEFAULT`,
name: sql.fragment`DEFAULT`,
},
])
).toMatchSnapshot()
Expand All @@ -380,7 +388,9 @@ describe(QueryBuilder, () => {
})

it('accepts raw sql values', () => {
expect(builder.update({ name: sql`anything i want` })).toMatchSnapshot()
expect(
builder.update({ name: sql.fragment`anything i want` })
).toMatchSnapshot()
})

it('correctly updates Date objects as ISO8601 strings', () => {
Expand Down
Loading

0 comments on commit cf6417c

Please sign in to comment.