kysely 0.8.0 → 0.9.2

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.
Files changed (94) hide show
  1. package/README.md +47 -8
  2. package/dist/cjs/dialect/mysql/mysql-driver.js +7 -7
  3. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +0 -2
  4. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +0 -29
  5. package/dist/cjs/dialect/postgres/postgres-driver.js +5 -5
  6. package/dist/cjs/operation-node/create-schema-node.d.ts +1 -1
  7. package/dist/cjs/operation-node/create-schema-node.js +2 -2
  8. package/dist/cjs/operation-node/create-table-node.d.ts +1 -5
  9. package/dist/cjs/operation-node/create-table-node.js +1 -31
  10. package/dist/cjs/operation-node/join-node.d.ts +2 -1
  11. package/dist/cjs/operation-node/join-node.js +8 -6
  12. package/dist/cjs/operation-node/operation-node-source.d.ts +1 -1
  13. package/dist/cjs/operation-node/operation-node-transformer.js +2 -1
  14. package/dist/cjs/operation-node/primitive-value-list-node.js +1 -1
  15. package/dist/cjs/operation-node/query-node.d.ts +4 -3
  16. package/dist/cjs/operation-node/query-node.js +10 -2
  17. package/dist/cjs/operation-node/select-query-node.d.ts +2 -1
  18. package/dist/cjs/operation-node/select-query-node.js +10 -2
  19. package/dist/cjs/parser/group-by-parser.d.ts +4 -0
  20. package/dist/cjs/parser/group-by-parser.js +9 -0
  21. package/dist/cjs/parser/join-parser.d.ts +6 -3
  22. package/dist/cjs/parser/order-by-parser.d.ts +2 -4
  23. package/dist/cjs/parser/order-by-parser.js +6 -3
  24. package/dist/cjs/parser/reference-parser.d.ts +1 -1
  25. package/dist/cjs/parser/reference-parser.js +1 -1
  26. package/dist/cjs/parser/table-parser.d.ts +8 -8
  27. package/dist/cjs/query-builder/function-builder.d.ts +6 -6
  28. package/dist/cjs/query-builder/function-builder.js +7 -7
  29. package/dist/cjs/query-builder/join-builder.js +8 -8
  30. package/dist/cjs/query-builder/query-builder.js +20 -22
  31. package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
  32. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -3
  33. package/dist/cjs/query-compiler/default-query-compiler.js +23 -29
  34. package/dist/cjs/query-creator.d.ts +14 -11
  35. package/dist/cjs/query-creator.js +14 -11
  36. package/dist/cjs/raw-builder/raw-builder.d.ts +1 -1
  37. package/dist/cjs/raw-builder/raw-builder.js +6 -6
  38. package/dist/cjs/schema/alter-table-builder.d.ts +3 -0
  39. package/dist/cjs/schema/alter-table-builder.js +3 -0
  40. package/dist/cjs/schema/column-definition-builder.d.ts +14 -5
  41. package/dist/cjs/schema/create-schema-builder.js +1 -1
  42. package/dist/cjs/schema/create-table-builder.d.ts +55 -10
  43. package/dist/cjs/schema/create-table-builder.js +59 -17
  44. package/dist/cjs/schema/schema.d.ts +37 -2
  45. package/dist/cjs/schema/schema.js +36 -1
  46. package/dist/cjs/util/object-utils.d.ts +12 -11
  47. package/dist/cjs/util/object-utils.js +6 -2
  48. package/dist/esm/dialect/mysql/mysql-driver.js +8 -8
  49. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +0 -2
  50. package/dist/esm/dialect/mysql/mysql-query-compiler.js +0 -29
  51. package/dist/esm/dialect/postgres/postgres-driver.js +5 -5
  52. package/dist/esm/operation-node/create-schema-node.d.ts +1 -1
  53. package/dist/esm/operation-node/create-schema-node.js +2 -2
  54. package/dist/esm/operation-node/create-table-node.d.ts +1 -5
  55. package/dist/esm/operation-node/create-table-node.js +1 -31
  56. package/dist/esm/operation-node/join-node.d.ts +2 -1
  57. package/dist/esm/operation-node/join-node.js +8 -6
  58. package/dist/esm/operation-node/operation-node-source.d.ts +1 -1
  59. package/dist/esm/operation-node/operation-node-transformer.js +2 -1
  60. package/dist/esm/operation-node/primitive-value-list-node.js +1 -1
  61. package/dist/esm/operation-node/query-node.d.ts +4 -3
  62. package/dist/esm/operation-node/query-node.js +10 -2
  63. package/dist/esm/operation-node/select-query-node.d.ts +2 -1
  64. package/dist/esm/operation-node/select-query-node.js +10 -2
  65. package/dist/esm/parser/group-by-parser.d.ts +4 -0
  66. package/dist/esm/parser/group-by-parser.js +5 -0
  67. package/dist/esm/parser/join-parser.d.ts +6 -3
  68. package/dist/esm/parser/order-by-parser.d.ts +2 -4
  69. package/dist/esm/parser/order-by-parser.js +6 -2
  70. package/dist/esm/parser/reference-parser.d.ts +1 -1
  71. package/dist/esm/parser/reference-parser.js +2 -2
  72. package/dist/esm/parser/table-parser.d.ts +8 -8
  73. package/dist/esm/query-builder/function-builder.d.ts +6 -6
  74. package/dist/esm/query-builder/function-builder.js +7 -7
  75. package/dist/esm/query-builder/join-builder.js +8 -8
  76. package/dist/esm/query-builder/query-builder.js +21 -23
  77. package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
  78. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -3
  79. package/dist/esm/query-compiler/default-query-compiler.js +23 -29
  80. package/dist/esm/query-creator.d.ts +14 -11
  81. package/dist/esm/query-creator.js +14 -11
  82. package/dist/esm/raw-builder/raw-builder.d.ts +1 -1
  83. package/dist/esm/raw-builder/raw-builder.js +6 -6
  84. package/dist/esm/schema/alter-table-builder.d.ts +3 -0
  85. package/dist/esm/schema/alter-table-builder.js +3 -0
  86. package/dist/esm/schema/column-definition-builder.d.ts +14 -5
  87. package/dist/esm/schema/create-schema-builder.js +1 -1
  88. package/dist/esm/schema/create-table-builder.d.ts +55 -10
  89. package/dist/esm/schema/create-table-builder.js +60 -18
  90. package/dist/esm/schema/schema.d.ts +37 -2
  91. package/dist/esm/schema/schema.js +36 -1
  92. package/dist/esm/util/object-utils.d.ts +12 -11
  93. package/dist/esm/util/object-utils.js +4 -1
  94. package/package.json +1 -1
@@ -2,12 +2,18 @@ import { ColumnDefinitionNode } from '../operation-node/column-definition-node.j
2
2
  import { CreateTableNode } from '../operation-node/create-table-node.js';
3
3
  import { preventAwait } from '../util/prevent-await.js';
4
4
  import { ColumnDefinitionBuilder } from './column-definition-builder.js';
5
- import { freeze } from '../util/object-utils.js';
5
+ import { freeze, noop } from '../util/object-utils.js';
6
6
  import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js';
7
7
  import { ColumnNode } from '../operation-node/column-node.js';
8
8
  import { TableNode } from '../operation-node/table-node.js';
9
9
  import { ForeignKeyConstraintBuilder } from './foreign-key-constraint-builder.js';
10
10
  import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
11
+ import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node.js';
12
+ import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.js';
13
+ import { CheckConstraintNode } from '../operation-node/check-constraint-node.js';
14
+ /**
15
+ * This builder can be used to create a `create table` query.
16
+ */
11
17
  export class CreateTableBuilder {
12
18
  #props;
13
19
  constructor(props) {
@@ -31,18 +37,45 @@ export class CreateTableBuilder {
31
37
  * ```ts
32
38
  * await db.schema
33
39
  * .createTable('person')
34
- * .addColumn('int', 'id', (col) => col.increments().primary()),
40
+ * .addColumn('id', 'integer', (col) => col.increments().primaryKey()),
35
41
  * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
36
- * .addColumn('varchar', 'last_name')
37
- * .addColumn('numeric(8, 2)', 'bank_balance')
42
+ * .addColumn('last_name', 'varchar')
43
+ * .addColumn('bank_balance', 'numeric(8, 2)')
38
44
  * .addColumn('data', db.raw('customtype'))
45
+ * .addColumn('parent_id', 'integer', (col) =>
46
+ * col.references('person.id').onDelete('cascade'))
47
+ * )
48
+ * ```
49
+ *
50
+ * With this method, it's once again good to remember that Kysely just builds the query
51
+ * that's as close to the structure of your builder method calls as possible, and doesn't
52
+ * provide the same API for all databses. For example, some databases like older MySQL
53
+ * don't support `references` statement in the column definition. Instead foreign key
54
+ * constraints need to be defined in at the level of the `create table` query. See
55
+ * the next example:
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * .addColumn('parent_id', 'integer')
60
+ * .addForeignKeyConstraint(
61
+ * 'person_parent_id_fk', ['parent_id'], 'person', ['id'],
62
+ * (cb) => cb.onDelete('cascade')
63
+ * )
64
+ * ```
65
+ *
66
+ * Another good example is that PostgreSQL doesn't support the `auto_increment`
67
+ * keyword and you need to define an autoincrementing column for example using
68
+ * `serial`:
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * await db.schema
73
+ * .createTable('person')
74
+ * .addColumn('id', 'serial', (col) => col.primaryKey()),
39
75
  * ```
40
76
  */
41
- addColumn(columnName, dataType, build) {
42
- let columnBuilder = new ColumnDefinitionBuilder(ColumnDefinitionNode.create(columnName, parseDataTypeExpression(dataType)));
43
- if (build) {
44
- columnBuilder = build(columnBuilder);
45
- }
77
+ addColumn(columnName, dataType, build = noop) {
78
+ const columnBuilder = build(new ColumnDefinitionBuilder(ColumnDefinitionNode.create(columnName, parseDataTypeExpression(dataType))));
46
79
  return new CreateTableBuilder({
47
80
  ...this.#props,
48
81
  createTableNode: CreateTableNode.cloneWithColumn(this.#props.createTableNode, columnBuilder.toOperationNode()),
@@ -51,6 +84,9 @@ export class CreateTableBuilder {
51
84
  /**
52
85
  * Adds a primary key constraint for one or more columns.
53
86
  *
87
+ * The constraint name can be anything you want, but it must be unique
88
+ * across the whole database.
89
+ *
54
90
  * @example
55
91
  * ```ts
56
92
  * addPrimaryKeyConstraint('primary_key', ['first_name', 'last_name'])
@@ -59,12 +95,15 @@ export class CreateTableBuilder {
59
95
  addPrimaryKeyConstraint(constraintName, columns) {
60
96
  return new CreateTableBuilder({
61
97
  ...this.#props,
62
- createTableNode: CreateTableNode.cloneWithPrimaryKeyConstraint(this.#props.createTableNode, constraintName, columns),
98
+ createTableNode: CreateTableNode.cloneWithConstraint(this.#props.createTableNode, PrimaryConstraintNode.create(columns, constraintName)),
63
99
  });
64
100
  }
65
101
  /**
66
102
  * Adds a unique constraint for one or more columns.
67
103
  *
104
+ * The constraint name can be anything you want, but it must be unique
105
+ * across the whole database.
106
+ *
68
107
  * @example
69
108
  * ```ts
70
109
  * addUniqueConstraint('first_name_last_name_unique', ['first_name', 'last_name'])
@@ -73,12 +112,15 @@ export class CreateTableBuilder {
73
112
  addUniqueConstraint(constraintName, columns) {
74
113
  return new CreateTableBuilder({
75
114
  ...this.#props,
76
- createTableNode: CreateTableNode.cloneWithUniqueConstraint(this.#props.createTableNode, constraintName, columns),
115
+ createTableNode: CreateTableNode.cloneWithConstraint(this.#props.createTableNode, UniqueConstraintNode.create(columns, constraintName)),
77
116
  });
78
117
  }
79
118
  /**
80
119
  * Adds a check constraint.
81
120
  *
121
+ * The constraint name can be anything you want, but it must be unique
122
+ * across the whole database.
123
+ *
82
124
  * @example
83
125
  * ```ts
84
126
  * addCheckConstraint('check_legs', 'number_of_legs < 5')
@@ -87,12 +129,15 @@ export class CreateTableBuilder {
87
129
  addCheckConstraint(constraintName, checkExpression) {
88
130
  return new CreateTableBuilder({
89
131
  ...this.#props,
90
- createTableNode: CreateTableNode.cloneWithCheckConstraint(this.#props.createTableNode, constraintName, checkExpression),
132
+ createTableNode: CreateTableNode.cloneWithConstraint(this.#props.createTableNode, CheckConstraintNode.create(checkExpression, constraintName)),
91
133
  });
92
134
  }
93
135
  /**
94
136
  * Adds a foreign key constraint.
95
137
  *
138
+ * The constraint name can be anything you want, but it must be unique
139
+ * across the whole database.
140
+ *
96
141
  * @example
97
142
  * ```ts
98
143
  * addForeignKeyConstraint(
@@ -114,14 +159,11 @@ export class CreateTableBuilder {
114
159
  * )
115
160
  * ```
116
161
  */
117
- addForeignKeyConstraint(constraintName, columns, targetTable, targetColumns, build) {
118
- let builder = new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), TableNode.create(targetTable), targetColumns.map(ColumnNode.create), constraintName));
119
- if (build) {
120
- builder = build(builder);
121
- }
162
+ addForeignKeyConstraint(constraintName, columns, targetTable, targetColumns, build = noop) {
163
+ const builder = build(new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), TableNode.create(targetTable), targetColumns.map(ColumnNode.create), constraintName)));
122
164
  return new CreateTableBuilder({
123
165
  ...this.#props,
124
- createTableNode: CreateTableNode.cloneWithForeignKeyConstraint(this.#props.createTableNode, builder.toOperationNode()),
166
+ createTableNode: CreateTableNode.cloneWithConstraint(this.#props.createTableNode, builder.toOperationNode()),
125
167
  });
126
168
  }
127
169
  toOperationNode() {
@@ -22,14 +22,49 @@ export declare class SchemaModule {
22
22
  * ```ts
23
23
  * await db.schema
24
24
  * .createTable('person')
25
- * .addColumn('id', 'int', col => col.primaryKey().increments())
25
+ * .addColumn('id', 'integer', col => col.primaryKey().increments())
26
26
  * .addColumn('first_name', 'varchar', col => col.notNull())
27
27
  * .addColumn('last_name', 'varchar', col => col.notNull())
28
28
  * .addColumn('gender', 'varchar')
29
29
  * .execute()
30
30
  * ```
31
+ *
32
+ * @example
33
+ * This example creates a table with a foreign key. Not all database
34
+ * engines support column-level foreign key constraint definitions.
35
+ * For example if you are using MySQL 5.X see the next example after
36
+ * this one.
37
+ *
38
+ * ```ts
39
+ * await db.schema
40
+ * .createTable('pet')
41
+ * .addColumn('id', 'integer', col => col.primaryKey().increments())
42
+ * .addColumn('owner_id', 'integer', col => col
43
+ * .references('person.id')
44
+ * .onDelete('cascade')
45
+ * )
46
+ * .execute()
47
+ * ```
48
+ *
49
+ * @example
50
+ * This example adds a foreign key constraint for a columns just
51
+ * like the previous example, but using a table-level statement.
52
+ * On MySQL 5.X you need to define foreign key constraints like
53
+ * this:
54
+ *
55
+ * ```ts
56
+ * await db.schema
57
+ * .createTable('pet')
58
+ * .addColumn('id', 'integer', col => col.primaryKey().increments())
59
+ * .addColumn('owner_id', 'integer')
60
+ * .addForeignKeyConstraint(
61
+ * 'pet_owner_id_foreign', ['owner_id'], 'person', ['id'],
62
+ * (constraint) => constraint.onDelete('cascade')
63
+ * )
64
+ * .execute()
65
+ * ```
31
66
  */
32
- createTable(table: string): CreateTableBuilder;
67
+ createTable<TB extends string>(table: TB): CreateTableBuilder<TB, never>;
33
68
  /**
34
69
  * Drop a table.
35
70
  *
@@ -33,12 +33,47 @@ export class SchemaModule {
33
33
  * ```ts
34
34
  * await db.schema
35
35
  * .createTable('person')
36
- * .addColumn('id', 'int', col => col.primaryKey().increments())
36
+ * .addColumn('id', 'integer', col => col.primaryKey().increments())
37
37
  * .addColumn('first_name', 'varchar', col => col.notNull())
38
38
  * .addColumn('last_name', 'varchar', col => col.notNull())
39
39
  * .addColumn('gender', 'varchar')
40
40
  * .execute()
41
41
  * ```
42
+ *
43
+ * @example
44
+ * This example creates a table with a foreign key. Not all database
45
+ * engines support column-level foreign key constraint definitions.
46
+ * For example if you are using MySQL 5.X see the next example after
47
+ * this one.
48
+ *
49
+ * ```ts
50
+ * await db.schema
51
+ * .createTable('pet')
52
+ * .addColumn('id', 'integer', col => col.primaryKey().increments())
53
+ * .addColumn('owner_id', 'integer', col => col
54
+ * .references('person.id')
55
+ * .onDelete('cascade')
56
+ * )
57
+ * .execute()
58
+ * ```
59
+ *
60
+ * @example
61
+ * This example adds a foreign key constraint for a columns just
62
+ * like the previous example, but using a table-level statement.
63
+ * On MySQL 5.X you need to define foreign key constraints like
64
+ * this:
65
+ *
66
+ * ```ts
67
+ * await db.schema
68
+ * .createTable('pet')
69
+ * .addColumn('id', 'integer', col => col.primaryKey().increments())
70
+ * .addColumn('owner_id', 'integer')
71
+ * .addForeignKeyConstraint(
72
+ * 'pet_owner_id_foreign', ['owner_id'], 'person', ['id'],
73
+ * (constraint) => constraint.onDelete('cascade')
74
+ * )
75
+ * .execute()
76
+ * ```
42
77
  */
43
78
  createTable(table) {
44
79
  return new CreateTableBuilder({
@@ -1,18 +1,19 @@
1
1
  /// <reference types="node" />
2
2
  export declare type PrimitiveValue = string | number | boolean | null | Date | Buffer | BigInt;
3
- export declare function isEmpty(obj: ArrayLike<any> | string | object | Buffer): boolean;
4
- export declare function isString(obj: any): obj is string;
5
- export declare function isNumber(obj: any): obj is number;
6
- export declare function isBoolean(obj: any): obj is boolean;
7
- export declare function isNull(obj: any): obj is null;
8
- export declare function isDate(obj: any): obj is Date;
9
- export declare function isBuffer(obj: any): obj is Buffer;
10
- export declare function isBigInt(obj: any): obj is BigInt;
11
- export declare function isPrimitive(obj: any): obj is PrimitiveValue;
12
- export declare function isFunction(obj: any): obj is Function;
13
- export declare function isObject(obj: any): obj is Record<string, any>;
3
+ export declare function isEmpty(obj: ArrayLike<unknown> | string | object | Buffer): boolean;
4
+ export declare function isString(obj: unknown): obj is string;
5
+ export declare function isNumber(obj: unknown): obj is number;
6
+ export declare function isBoolean(obj: unknown): obj is boolean;
7
+ export declare function isNull(obj: unknown): obj is null;
8
+ export declare function isDate(obj: unknown): obj is Date;
9
+ export declare function isBuffer(obj: unknown): obj is Buffer;
10
+ export declare function isBigInt(obj: unknown): obj is BigInt;
11
+ export declare function isPrimitive(obj: unknown): obj is PrimitiveValue;
12
+ export declare function isFunction(obj: unknown): obj is Function;
13
+ export declare function isObject(obj: unknown): obj is Record<string, unknown>;
14
14
  export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
15
15
  export declare function freeze<T>(obj: T): Readonly<T>;
16
16
  export declare function asArray<T>(arg: T | T[]): T[];
17
17
  export declare function asReadonlyArray<T>(arg: T | ReadonlyArray<T>): ReadonlyArray<T>;
18
18
  export declare function isReadonlyArray(arg: unknown): arg is ReadonlyArray<unknown>;
19
+ export declare function noop<T>(obj: T): T;
@@ -41,7 +41,7 @@ export function isFunction(obj) {
41
41
  return typeof obj === 'function';
42
42
  }
43
43
  export function isObject(obj) {
44
- return obj && typeof obj === 'object';
44
+ return typeof obj === 'object' && obj !== null;
45
45
  }
46
46
  export function getLast(arr) {
47
47
  return arr[arr.length - 1];
@@ -68,3 +68,6 @@ export function asReadonlyArray(arg) {
68
68
  export function isReadonlyArray(arg) {
69
69
  return Array.isArray(arg);
70
70
  }
71
+ export function noop(obj) {
72
+ return obj;
73
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.8.0",
3
+ "version": "0.9.2",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",