Skip to content

Commit

Permalink
remove the PrimitiveValue type
Browse files Browse the repository at this point in the history
  • Loading branch information
koskimas committed Jan 12, 2022
1 parent 055d30e commit 53633bd
Show file tree
Hide file tree
Showing 13 changed files with 69 additions and 88 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kysely",
"version": "0.16.4",
"version": "0.16.5",
"description": "Type safe SQL query builder",
"repository": {
"type": "git",
Expand Down
6 changes: 3 additions & 3 deletions src/operation-node/primitive-value-list-node.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { freeze, PrimitiveValue } from '../util/object-utils.js'
import { freeze } from '../util/object-utils.js'
import { OperationNode } from './operation-node.js'

/**
Expand All @@ -8,7 +8,7 @@ import { OperationNode } from './operation-node.js'
*/
export interface PrimitiveValueListNode extends OperationNode {
readonly kind: 'PrimitiveValueListNode'
readonly values: ReadonlyArray<PrimitiveValue>
readonly values: ReadonlyArray<unknown>
}

/**
Expand All @@ -19,7 +19,7 @@ export const PrimitiveValueListNode = freeze({
return node.kind === 'PrimitiveValueListNode'
},

create(values: ReadonlyArray<PrimitiveValue>): PrimitiveValueListNode {
create(values: ReadonlyArray<unknown>): PrimitiveValueListNode {
return freeze({
kind: 'PrimitiveValueListNode',
values: freeze([...values]),
Expand Down
8 changes: 4 additions & 4 deletions src/operation-node/value-node.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { freeze, PrimitiveValue } from '../util/object-utils.js'
import { freeze } from '../util/object-utils.js'
import { OperationNode } from './operation-node.js'

export interface ValueNode extends OperationNode {
readonly kind: 'ValueNode'
readonly value: PrimitiveValue
readonly value: unknown
readonly immediate?: boolean
}

Expand All @@ -15,14 +15,14 @@ export const ValueNode = freeze({
return node.kind === 'ValueNode'
},

create(value: PrimitiveValue): ValueNode {
create(value: unknown): ValueNode {
return freeze({
kind: 'ValueNode',
value,
})
},

createImmediate(value: PrimitiveValue): ValueNode {
createImmediate(value: unknown): ValueNode {
return freeze({
kind: 'ValueNode',
value,
Expand Down
6 changes: 6 additions & 0 deletions src/parser/complex-expression-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,9 @@ export function parseAliasedComplexExpression(

throw new Error(`invalid aliased expression: ${JSON.stringify(exp)}`)
}

export function isComplexExpression(
obj: unknown
): obj is ComplexExpression<any, any> {
return isOperationNodeSource(obj) || isFunction(obj)
}
8 changes: 3 additions & 5 deletions src/parser/default-value-parser.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { isOperationNodeSource } from '../operation-node/operation-node-source.js'
import { RawNode } from '../operation-node/raw-node.js'
import { ValueNode } from '../operation-node/value-node.js'
import { AnyRawBuilder } from '../util/type-utils.js'
import { PrimitiveValue } from '../util/object-utils.js'
import { RawBuilder } from '../raw-builder/raw-builder.js'

export type DefaultValueExpression = PrimitiveValue | AnyRawBuilder
export type DefaultValueExpression = unknown | RawBuilder

export function parseDefaultValueExpression(
value: DefaultValueExpression
): ValueNode | RawNode {
return isOperationNodeSource(value)
return value instanceof RawBuilder
? value.toOperationNode()
: ValueNode.createImmediate(value)
}
15 changes: 8 additions & 7 deletions src/parser/insert-values-parser.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ColumnNode } from '../operation-node/column-node.js'
import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js'
import { ValueListNode } from '../operation-node/value-list-node.js'
import { freeze, isPrimitive, PrimitiveValue } from '../util/object-utils.js'
import { freeze } from '../util/object-utils.js'
import { ParseContext } from './parse-context.js'
import { parseValueExpression, ValueExpression } from './value-parser.js'
import { ValuesNode } from '../operation-node/values-node.js'
Expand All @@ -10,6 +10,7 @@ import {
NullableInsertKeys,
InsertType,
} from '../util/column-type.js'
import { isComplexExpression } from './complex-expression-parser.js'

export type InsertObject<DB, TB extends keyof DB> = {
[C in NonNullableInsertKeys<DB[TB]>]: ValueExpression<
Expand Down Expand Up @@ -73,7 +74,7 @@ function parseRowValues(
): PrimitiveValueListNode | ValueListNode {
const rowColumns = Object.keys(row)

const rowValues: ValueExpression<any, any, PrimitiveValue>[] = new Array(
const rowValues: ValueExpression<any, any, unknown>[] = new Array(
columns.size
).fill(null)

Expand All @@ -86,11 +87,11 @@ function parseRowValues(
}
}

if (rowValues.every(isPrimitive)) {
return PrimitiveValueListNode.create(rowValues)
if (rowValues.some(isComplexExpression)) {
return ValueListNode.create(
rowValues.map((it) => parseValueExpression(ctx, it))
)
}

return ValueListNode.create(
rowValues.map((it) => parseValueExpression(ctx, it))
)
return PrimitiveValueListNode.create(rowValues)
}
10 changes: 3 additions & 7 deletions src/parser/reference-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@ import { ColumnNode } from '../operation-node/column-node.js'
import { ReferenceExpressionNode } from '../operation-node/operation-node-utils.js'
import { ReferenceNode } from '../operation-node/reference-node.js'
import { TableNode } from '../operation-node/table-node.js'
import {
isReadonlyArray,
isString,
PrimitiveValue,
} from '../util/object-utils.js'
import { isReadonlyArray, isString } from '../util/object-utils.js'
import {
AnyColumn,
AnyColumnWithTable,
Expand Down Expand Up @@ -54,7 +50,7 @@ export type ExtractTypeFromReferenceExpression<
? ValueType<O>
: RE extends (qb: any) => SelectQueryBuilder<any, any, infer O>
? ValueType<O>
: PrimitiveValue
: unknown

type ExtractTypeFromStringReference<
DB,
Expand All @@ -74,7 +70,7 @@ type ExtractTypeFromStringReference<
: never
: RE extends AnyColumn<DB, TB>
? ExtractColumnType<DB, TB, RE>
: PrimitiveValue
: unknown

export function parseReferenceExpressionOrList(
ctx: ParseContext,
Expand Down
26 changes: 11 additions & 15 deletions src/parser/value-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ import { ValueExpressionNode } from '../operation-node/operation-node-utils.js'
import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js'
import { ValueListNode } from '../operation-node/value-list-node.js'
import { ValueNode } from '../operation-node/value-node.js'
import {
isPrimitive,
isReadonlyArray,
PrimitiveValue,
} from '../util/object-utils.js'
import { isReadonlyArray } from '../util/object-utils.js'
import { ParseContext } from './parse-context.js'
import { SelectQueryNode } from '../operation-node/select-query-node.js'
import { RawNode } from '../operation-node/raw-node.js'
import {
parseComplexExpression,
ComplexExpression,
isComplexExpression,
} from './complex-expression-parser.js'

export type ValueExpression<DB, TB extends keyof DB, V> =
Expand All @@ -25,7 +22,7 @@ export type ValueExpressionOrList<DB, TB extends keyof DB, V> =

export function parseValueExpressionOrList(
ctx: ParseContext,
arg: ValueExpressionOrList<any, any, PrimitiveValue>
arg: ValueExpressionOrList<any, any, unknown>
): ValueExpressionNode {
if (isReadonlyArray(arg)) {
return parseValueExpressionList(ctx, arg)
Expand All @@ -36,23 +33,22 @@ export function parseValueExpressionOrList(

export function parseValueExpression(
ctx: ParseContext,
exp: ValueExpression<any, any, PrimitiveValue>
exp: ValueExpression<any, any, unknown>
): ValueNode | SelectQueryNode | RawNode {
if (isPrimitive(exp)) {
return ValueNode.create(exp)
if (isComplexExpression(exp)) {
return parseComplexExpression(ctx, exp)
}

return parseComplexExpression(ctx, exp)
return ValueNode.create(exp)
}

function parseValueExpressionList(
ctx: ParseContext,
arg: ReadonlyArray<ValueExpression<any, any, PrimitiveValue>>
arg: ReadonlyArray<ValueExpression<any, any, unknown>>
): PrimitiveValueListNode | ValueListNode {
if (arg.every(isPrimitive)) {
// Optimization for large lists of primitive values.
return PrimitiveValueListNode.create(arg)
if (arg.some(isComplexExpression)) {
return ValueListNode.create(arg.map((it) => parseValueExpression(ctx, it)))
}

return ValueListNode.create(arg.map((it) => parseValueExpression(ctx, it)))
return PrimitiveValueListNode.create(arg)
}
2 changes: 1 addition & 1 deletion src/query-builder/expression-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ import { createQueryId } from '../util/query-id.js'
import { freeze } from '../util/object-utils.js'
import { ParseContext } from '../parser/parse-context.js'
import { FunctionBuilder } from './function-builder.js'
import { RawBuilder } from '../index-nodeless.js'
import {
ExtractTypeFromReferenceExpression,
StringReference,
} from '../parser/reference-parser.js'
import { RawBuilder } from '../raw-builder/raw-builder.js'

export class ExpressionBuilder<DB, TB extends keyof DB> {
readonly #props: ExpressionBuilderProps
Expand Down
3 changes: 1 addition & 2 deletions src/query-compiler/default-query-compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ import {
isNumber,
isBoolean,
isNull,
PrimitiveValue,
isDate,
isBigInt,
} from '../util/object-utils.js'
Expand Down Expand Up @@ -1089,7 +1088,7 @@ export class DefaultQueryCompiler
this.#parameters.push(parameter)
}

protected appendImmediateValue(value: PrimitiveValue): void {
protected appendImmediateValue(value: unknown): void {
if (isString(value)) {
this.append(`'${value}'`)
} else if (isNumber(value) || isBoolean(value)) {
Expand Down
24 changes: 10 additions & 14 deletions src/schema/alter-table-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,13 @@ import {
} from '../operation-node/data-type-node.js'
import { DropColumnNode } from '../operation-node/drop-column-node.js'
import { IdentifierNode } from '../operation-node/identifier-node.js'
import {
isOperationNodeSource,
OperationNodeSource,
} from '../operation-node/operation-node-source.js'
import { OperationNodeSource } from '../operation-node/operation-node-source.js'
import { OnModifyForeignAction } from '../operation-node/references-node.js'
import { RenameColumnNode } from '../operation-node/rename-column-node.js'
import { TableNode } from '../operation-node/table-node.js'
import { ValueNode } from '../operation-node/value-node.js'
import { CompiledQuery } from '../query-compiler/compiled-query.js'
import { Compilable } from '../util/compilable.js'
import { freeze, PrimitiveValue } from '../util/object-utils.js'
import { freeze } from '../util/object-utils.js'
import { preventAwait } from '../util/prevent-await.js'
import {
ColumnDefinitionBuilder,
Expand All @@ -41,6 +37,10 @@ import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.j
import { CheckConstraintNode } from '../operation-node/check-constraint-node.js'
import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js'
import { ColumnNode } from '../operation-node/column-node.js'
import {
DefaultValueExpression,
parseDefaultValueExpression,
} from '../parser/default-value-parser.js'

/**
* This builder can be used to create a `alter table` query.
Expand Down Expand Up @@ -205,14 +205,12 @@ export class AlterColumnBuilder {
})
}

setDefault(value: PrimitiveValue | AnyRawBuilder): AlterTableExecutor {
setDefault(value: DefaultValueExpression): AlterTableExecutor {
return new AlterTableExecutor({
...this.#props,
alterTableNode: AlterTableNode.cloneWith(this.#props.alterTableNode, {
alterColumn: AlterColumnNode.cloneWith(this.#props.alterColumnNode, {
setDefault: isOperationNodeSource(value)
? value.toOperationNode()
: ValueNode.createImmediate(value),
setDefault: parseDefaultValueExpression(value),
}),
}),
})
Expand Down Expand Up @@ -349,7 +347,7 @@ export class AlterTableAddColumnBuilder
})
}

defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder {
defaultTo(value: DefaultValueExpression): AlterTableAddColumnBuilder {
return new AlterTableAddColumnBuilder({
...this.#props,
columnBuilder: this.#props.columnBuilder.defaultTo(value),
Expand Down Expand Up @@ -484,9 +482,7 @@ export class AlterTableModifyColumnBuilder
})
}

defaultTo(
value: PrimitiveValue | AnyRawBuilder
): AlterTableModifyColumnBuilder {
defaultTo(value: DefaultValueExpression): AlterTableModifyColumnBuilder {
return new AlterTableModifyColumnBuilder({
...this.#props,
columnBuilder: this.#props.columnBuilder.defaultTo(value),
Expand Down
18 changes: 14 additions & 4 deletions src/schema/column-definition-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
} from '../operation-node/references-node.js'
import { SelectAllNode } from '../operation-node/select-all-node.js'
import { parseStringReference } from '../parser/reference-parser.js'
import { PrimitiveValue } from '../util/object-utils.js'
import { preventAwait } from '../util/prevent-await.js'
import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js'
import { AnyRawBuilder } from '../util/type-utils.js'
Expand Down Expand Up @@ -105,10 +104,21 @@ export interface ColumnDefinitionBuilderInterface {
* .addColumn('number_of_legs', 'integer', (col) => col.defaultTo(4))
* .execute()
* ```
*
* Raw expressions are also supported:
*
* ```ts
* db.schema
* .createTable('pet')
* .addColumn(
* 'number_of_legs',
* 'integer',
* (col) => col.defaultTo(db.raw('any SQL here'))
* )
* .execute()
* ```
*/
defaultTo(
value: PrimitiveValue | AnyRawBuilder
): ColumnDefinitionBuilderInterface
defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilderInterface

/**
* Adds a check constraint for the column.
Expand Down
29 changes: 4 additions & 25 deletions src/util/object-utils.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,4 @@
export type PrimitiveValue =
| string
| number
| boolean
| null
| Date
| Buffer
| BigInt

export function isEmpty(
obj: ArrayLike<unknown> | string | object | Buffer
): boolean {
export function isEmpty(obj: ArrayLike<unknown> | string | object): boolean {
if (Array.isArray(obj) || isString(obj) || isBuffer(obj)) {
return obj.length === 0
} else if (obj) {
Expand Down Expand Up @@ -43,22 +32,12 @@ export function isBigInt(obj: unknown): obj is BigInt {
return typeof obj === 'bigint'
}

export function isBuffer(obj: unknown): obj is Buffer {
// Don't change the returnd type to `obj is Buffer` to not create a
// hard dependency to node.
export function isBuffer(obj: unknown): obj is { length: number } {
return typeof Buffer !== 'undefined' && Buffer.isBuffer(obj)
}

export function isPrimitive(obj: unknown): obj is PrimitiveValue {
return (
isString(obj) ||
isNumber(obj) ||
isBoolean(obj) ||
isNull(obj) ||
isDate(obj) ||
isBigInt(obj) ||
isBuffer(obj)
)
}

export function isFunction(obj: unknown): obj is Function {
return typeof obj === 'function'
}
Expand Down

0 comments on commit 53633bd

Please sign in to comment.