drizzle-orm 0.9.19 → 0.10.3

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 (70) hide show
  1. package/README.md +39 -9
  2. package/builders/aggregators/abstractAggregator.d.ts +4 -2
  3. package/builders/aggregators/abstractAggregator.js +11 -4
  4. package/builders/aggregators/selectAggregator.d.ts +12 -4
  5. package/builders/aggregators/selectAggregator.js +29 -12
  6. package/builders/highLvlBuilders/abstractRequestBuilder.d.ts +10 -4
  7. package/builders/highLvlBuilders/abstractRequestBuilder.js +14 -3
  8. package/builders/highLvlBuilders/deleteRequestBuilder.d.ts +4 -2
  9. package/builders/highLvlBuilders/insertRequestBuilder.d.ts +4 -2
  10. package/builders/highLvlBuilders/insertRequestBuilder.js +1 -0
  11. package/builders/highLvlBuilders/selectRequestBuilder.d.ts +21 -16
  12. package/builders/highLvlBuilders/selectRequestBuilder.js +22 -11
  13. package/builders/highLvlBuilders/updateRequestBuilder.d.ts +4 -2
  14. package/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +16 -3
  15. package/builders/joinBuilders/builders/abstractJoinBuilder.js +19 -2
  16. package/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +16 -4
  17. package/builders/joinBuilders/builders/selectWithFiveJoins.js +19 -10
  18. package/builders/joinBuilders/builders/selectWithFourJoins.d.ts +31 -12
  19. package/builders/joinBuilders/builders/selectWithFourJoins.js +31 -21
  20. package/builders/joinBuilders/builders/selectWithJoin.d.ts +28 -12
  21. package/builders/joinBuilders/builders/selectWithJoin.js +23 -18
  22. package/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +30 -12
  23. package/builders/joinBuilders/builders/selectWithThreeJoins.js +28 -20
  24. package/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +29 -12
  25. package/builders/joinBuilders/builders/selectWithTwoJoins.js +25 -19
  26. package/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +14 -13
  27. package/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +13 -12
  28. package/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +8 -7
  29. package/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +8 -7
  30. package/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +8 -7
  31. package/builders/lowLvlBuilders/selects/select.d.ts +5 -1
  32. package/builders/lowLvlBuilders/selects/select.js +3 -2
  33. package/builders/lowLvlBuilders/selects/selectFrom.d.ts +9 -3
  34. package/builders/lowLvlBuilders/selects/selectJoined.d.ts +8 -2
  35. package/builders/lowLvlBuilders/selects/whereSelect.d.ts +1 -1
  36. package/builders/requestBuilders/updates/static.d.ts +2 -2
  37. package/builders/requestBuilders/where/static.d.ts +9 -9
  38. package/columns/column.d.ts +24 -20
  39. package/columns/column.js +8 -1
  40. package/data/tables/citiesTable.d.ts +14 -0
  41. package/data/tables/citiesTable.js +17 -0
  42. package/data/tables/userGroupsTable.d.ts +7 -0
  43. package/data/tables/userGroupsTable.js +15 -0
  44. package/data/tables/usersTable.d.ts +16 -0
  45. package/data/tables/usersTable.js +31 -0
  46. package/data/tables/usersToUserGroups.d.ts +7 -0
  47. package/data/tables/usersToUserGroups.js +17 -0
  48. package/data/types/rolesType.d.ts +1 -0
  49. package/data/types/rolesType.js +6 -0
  50. package/docs/cases/simple_delete.js +1 -1
  51. package/docs/cases/simple_insert.js +9 -4
  52. package/docs/cases/simple_join.js +20 -6
  53. package/docs/cases/simple_select.js +15 -9
  54. package/docs/cases/simple_update.js +1 -1
  55. package/docs/tables/citiesTable.d.ts +5 -5
  56. package/docs/tables/citiesTable.js +1 -2
  57. package/docs/tables/userGroupsTable.d.ts +3 -3
  58. package/docs/tables/usersTable.d.ts +9 -10
  59. package/docs/tables/usersTable.js +2 -2
  60. package/docs/tables/usersToUserGroups.d.ts +2 -2
  61. package/mappers/responseMapper.d.ts +4 -1
  62. package/mappers/responseMapper.js +18 -6
  63. package/migrator/migrator.js +16 -7
  64. package/package.json +1 -1
  65. package/serializer/serializer.js +14 -1
  66. package/tables/abstractTable.d.ts +19 -20
  67. package/tables/abstractTable.js +4 -3
  68. package/tables/inferTypes.d.ts +14 -0
  69. package/tables/migrationsTable.d.ts +3 -3
  70. package/test.js +54 -22
@@ -0,0 +1,16 @@
1
+ import AbstractTable from '../../tables/abstractTable';
2
+ export declare const rolesEnum: import("../../types/type").default<"user" | "guest" | "admin">;
3
+ export default class UsersTable extends AbstractTable<UsersTable> {
4
+ id: import("../..").Column<import("../../columns/types/pgSerial").default, true, true, this>;
5
+ fullName: import("../..").Column<import("../..").PgText, true, false, this>;
6
+ phone: import("../..").Column<import("../..").PgVarChar, true, false, this>;
7
+ media: import("../..").Column<import("../..").PgJsonb<string[]>, true, false, this>;
8
+ decimalField: import("../..").Column<import("../..").PgBigDecimal, false, false, this>;
9
+ bigIntField: import("../..").Column<import("../..").PgBigInt, true, true, this>;
10
+ createdAt: import("../..").Column<import("../..").PgTimestamp, false, false, this>;
11
+ createdAtWithTimezone: import("../..").Column<import("../../columns/types/pgTimestamptz").default, true, false, this>;
12
+ isArchived: import("../..").Column<import("../..").PgBoolean, true, false, this>;
13
+ phoneFullNameIndex: import("../../indexes/tableIndex").default;
14
+ phoneIndex: import("../../indexes/tableIndex").default;
15
+ tableName(): string;
16
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rolesEnum = void 0;
4
+ /* eslint-disable max-classes-per-file */
5
+ // import { Defaults } from '../../columns/column';
6
+ const abstractTable_1 = require("../../tables/abstractTable");
7
+ const type_1 = require("../../types/type");
8
+ // import { rolesEnum } from '../types/rolesType';
9
+ exports.rolesEnum = type_1.createEnum({ alias: 'test-enum', values: ['user', 'guest', 'admin'] });
10
+ class UsersTable extends abstractTable_1.default {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.id = this.serial('id').primaryKey();
14
+ this.fullName = this.text('full_name');
15
+ this.phone = this.varchar('phone', { size: 256 });
16
+ this.media = this.jsonb('media');
17
+ this.decimalField = this.decimal('test', { precision: 100, scale: 2 }).notNull();
18
+ this.bigIntField = this.bigint('test1', 'max_bytes_53');
19
+ // public role = this.type(rolesEnum, 'name_in_table', { notNull: true });
20
+ this.createdAt = this.timestamp('created_at').notNull();
21
+ this.createdAtWithTimezone = this.timestamptz('created_at_time_zone');
22
+ // public updatedAt = this.timestamp('updated_at').defaultValue(Defaults.CURRENT_TIMESTAMP);
23
+ this.isArchived = this.bool('is_archived').defaultValue(false);
24
+ this.phoneFullNameIndex = this.index([this.phone, this.fullName]);
25
+ this.phoneIndex = this.uniqueIndex(this.phone);
26
+ }
27
+ tableName() {
28
+ return 'users';
29
+ }
30
+ }
31
+ exports.default = UsersTable;
@@ -0,0 +1,7 @@
1
+ import AbstractTable from '../../tables/abstractTable';
2
+ export default class UsersToUserGroupsTable extends AbstractTable<UsersToUserGroupsTable> {
3
+ groupId: import("../..").Column<import("../..").PgInteger, true, false, this>;
4
+ userId: import("../..").Column<import("../..").PgInteger, true, false, this>;
5
+ manyToManyIndex: import("../../indexes/tableIndex").default;
6
+ tableName(): string;
7
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const abstractTable_1 = require("../../tables/abstractTable");
4
+ const userGroupsTable_1 = require("./userGroupsTable");
5
+ const usersTable_1 = require("./usersTable");
6
+ class UsersToUserGroupsTable extends abstractTable_1.default {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.groupId = this.int('city_id').foreignKey(userGroupsTable_1.default, (table) => table.id, { onDelete: 'CASCADE' });
10
+ this.userId = this.int('user_id').foreignKey(usersTable_1.default, (table) => table.id, { onDelete: 'CASCADE' });
11
+ this.manyToManyIndex = this.index([this.groupId, this.userId]);
12
+ }
13
+ tableName() {
14
+ return 'users_to_user_groups';
15
+ }
16
+ }
17
+ exports.default = UsersToUserGroupsTable;
@@ -0,0 +1 @@
1
+ export declare const rolesEnum: import("../../types/type").default<"foo" | "bar" | "baz">;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rolesEnum = void 0;
4
+ const type_1 = require("../../types/type");
5
+ // eslint-disable-next-line import/prefer-default-export
6
+ exports.rolesEnum = type_1.createEnum({ alias: 'test-enum', values: ['foo', 'bar', 'baz'] });
@@ -22,7 +22,7 @@ const usersTable_1 = require("../tables/usersTable");
22
22
  .all();
23
23
  const deletedUserGroup = await userGroupsTable.delete()
24
24
  .where(builders_1.eq(userGroupsTable.id, 3))
25
- .first();
25
+ .findOne();
26
26
  }
27
27
  catch (e) {
28
28
  console.log(e);
@@ -1,19 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  /* eslint-disable @typescript-eslint/no-unused-vars */
4
- const __1 = require("../..");
4
+ const create_1 = require("../../builders/lowLvlBuilders/create");
5
+ const dbConnector_1 = require("../../db/dbConnector");
6
+ const consoleLogger_1 = require("../../logger/consoleLogger");
5
7
  const citiesTable_1 = require("../tables/citiesTable");
6
8
  const userGroupsTable_1 = require("../tables/userGroupsTable");
7
9
  const usersTable_1 = require("../tables/usersTable");
8
10
  (async () => {
9
11
  try {
10
- const db = await new __1.DbConnector()
12
+ const db = await new dbConnector_1.default()
11
13
  .connectionString('postgresql://postgres@127.0.0.1/drizzle-docs')
12
14
  .connect();
13
15
  const usersTable = new usersTable_1.default(db);
14
16
  const citiesTable = new citiesTable_1.default(db);
15
17
  const userGroupsTable = new userGroupsTable_1.default(db);
16
- await db.session().execute(__1.Create.table(usersTable).build());
18
+ await db.session().execute(create_1.default.table(usersTable).build());
19
+ await db.session().execute(create_1.default.table(citiesTable).build());
20
+ await db.session().execute(create_1.default.table(userGroupsTable).build());
21
+ db.useLogger(new consoleLogger_1.default());
17
22
  await usersTable.insert({
18
23
  decimalField: 12.4,
19
24
  createdAt: new Date(),
@@ -24,7 +29,7 @@ const usersTable_1 = require("../tables/usersTable");
24
29
  }).all();
25
30
  const insertedUserGroup = await userGroupsTable.insert({
26
31
  name: 'firstGroup',
27
- }).first();
32
+ }).findOne();
28
33
  const manyInsertedCities = await citiesTable.insertMany([{
29
34
  foundationDate: new Date(),
30
35
  location: 'USA',
@@ -70,20 +70,34 @@ const usersToUserGroups_1 = require("../tables/usersToUserGroups");
70
70
  // cities.push(dbCity);
71
71
  // user = dbUser;
72
72
  // });
73
+ // const usersTable = new UsersTable(db);
74
+ // const citiesTable = new CitiesTable(db);
75
+ const sdf = await citiesTable.select({
76
+ id: citiesTable.id,
77
+ userId: citiesTable.userId,
78
+ }).where(builders_1.eq(citiesTable.id, 1))
79
+ .leftJoin(usersTable_1.default, (city) => city.userId, (users) => users.id, {
80
+ id: usersTable.id,
81
+ })
82
+ .execute();
73
83
  // group case
74
84
  const usersWithUserGroups = await usersToUserGroupsTable.select()
75
85
  .where(builders_1.eq(userGroupsTable.id, 1))
76
- .leftJoin(usersTable_1.default, (userToGroup) => userToGroup.userId, (users) => users.id)
77
- .leftJoin(userGroupsTable_1.default, (userToGroup) => userToGroup.groupId, (users) => users.id)
86
+ .leftJoin(usersTable_1.default, (userToGroup) => userToGroup.userId, (users) => users.id, {
87
+ id: usersTable.id,
88
+ })
89
+ .leftJoin(usersToUserGroups_1.default, userGroupsTable_1.default, (userToGroup) => userToGroup.groupId, (userGroup) => userGroup.id, {
90
+ id: userGroupsTable.id,
91
+ })
78
92
  .execute();
79
93
  const userGroupWithUsers = usersWithUserGroups.group({
80
94
  one: (_, dbUser, dbUserGroup) => dbUser,
81
95
  many: (_, dbUser, dbUserGroup) => dbUserGroup,
82
96
  });
83
- const userWithGroups = {
84
- ...userGroupWithUsers.one,
85
- groups: userGroupWithUsers.many,
86
- };
97
+ // const userWithGroups: ExtractModel<UsersTable> & { groups: ExtractModel<UserGroupsTable>[] } = {
98
+ // ...userGroupWithUsers.one,
99
+ // groups: userGroupWithUsers.many,
100
+ // };
87
101
  // console.log('city', city!);
88
102
  // console.log('cityUsers', cityUsers);
89
103
  // console.log('cityWithUsers', forEachCities);
@@ -15,21 +15,27 @@ const usersTable_1 = require("../tables/usersTable");
15
15
  // select all
16
16
  const allSelect = await usersTable.select().all();
17
17
  // select first
18
- const firstSelect = await usersTable.select().first();
18
+ const firstSelect = await usersTable.select().findOne();
19
19
  // select using filters
20
20
  const eqSelect = await usersTable.select().where(builders_1.eq(usersTable.phone, 'hello')).all();
21
21
  const andSelect = await usersTable.select().where(builders_1.and([builders_1.eq(usersTable.phone, 'hello')])).all();
22
22
  const orSelect = await usersTable.select().where(builders_1.or([builders_1.eq(usersTable.phone, 'hello')])).all();
23
23
  // select using limit, offset
24
- const limitOffsetSelect = await usersTable.select({ limit: 10, offset: 10 }).all();
24
+ const limitOffsetSelect = await usersTable.select().limit(20).offset(20).all();
25
25
  const likeSelect = await usersTable.select().where(builders_1.like(usersTable.phone, 'hello')).all();
26
- const inArraySelect = usersTable.select().where(static_1.inArray(usersTable.phone, ['hello'])).all();
27
- const greaterSelect = usersTable.select().where(static_1.greater(usersTable.bigIntField, 3)).all();
28
- const lessSelect = usersTable.select().where(static_1.less(usersTable.bigIntField, 3)).all();
29
- const greaterEqSelect = usersTable.select().where(static_1.greaterEq(usersTable.bigIntField, 3)).all();
30
- const lessEqSelect = usersTable.select().where(static_1.lessEq(usersTable.bigIntField, 3));
31
- const isNullSelect = usersTable.select().where(static_1.isNull(usersTable.phone)).all();
32
- const notEqSelect = usersTable.select().where(static_1.notEq(usersTable.phone, 'hello')).all();
26
+ const inArraySelect = await usersTable.select().where(static_1.inArray(usersTable.phone, ['hello'])).all();
27
+ const greaterSelect = await usersTable.select().where(static_1.greater(usersTable.bigIntField, 3)).all();
28
+ const lessSelect = await usersTable.select().where(static_1.less(usersTable.bigIntField, 3)).all();
29
+ const greaterEqSelect = await usersTable.select().where(static_1.greaterEq(usersTable.bigIntField, 3))
30
+ .all();
31
+ const lessEqSelect = await usersTable.select().where(static_1.lessEq(usersTable.bigIntField, 3));
32
+ const isNullSelect = await usersTable.select().where(static_1.isNull(usersTable.phone)).all();
33
+ const notEqSelect = await usersTable.select().where(static_1.notEq(usersTable.phone, 'hello')).all();
34
+ const partialSelect = await usersTable.select({
35
+ mappedId: usersTable.id,
36
+ mappedPhone: usersTable.phone,
37
+ }).all();
38
+ // const { mappedId, mappedPhone } = partialSelect;
33
39
  // ordered select
34
40
  const ordered = await usersTable.select().orderBy((table) => table.phone, order_1.default.ASC).all();
35
41
  }
@@ -25,7 +25,7 @@ const usersTable_1 = require("../tables/usersTable");
25
25
  const updatedUserGroup = await userGroupsTable.update()
26
26
  .where(builders_1.eq(userGroupsTable.id, 1))
27
27
  .set({ description: 'updated description' })
28
- .first();
28
+ .findOne();
29
29
  }
30
30
  catch (e) {
31
31
  console.log(e);
@@ -4,11 +4,11 @@ interface CityMeta {
4
4
  connection: string;
5
5
  }
6
6
  export default class CitiesTable extends AbstractTable<CitiesTable> {
7
- id: import("../..").Column<import("../../columns/types/pgSerial").default, true, true>;
8
- foundationDate: import("../..").Column<import("../..").PgTimestamp, false, false>;
9
- location: import("../..").Column<import("../..").PgVarChar, true, false>;
10
- userId: import("../..").Column<import("../..").PgInteger, true, false>;
11
- metadata: import("../..").Column<import("../..").PgJsonb<CityMeta>, true, false>;
7
+ id: import("../..").Column<import("../../columns/types/pgSerial").default, true, true, this>;
8
+ foundationDate: import("../..").Column<import("../..").PgTimestamp, false, false, this>;
9
+ location: import("../..").Column<import("../..").PgVarChar, true, false, this>;
10
+ userId: import("../..").Column<import("../..").PgInteger, true, false, this>;
11
+ metadata: import("../..").Column<import("../..").PgJsonb<CityMeta>, true, false, this>;
12
12
  tableName(): string;
13
13
  }
14
14
  export {};
@@ -1,14 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const abstractTable_1 = require("../../tables/abstractTable");
4
- const usersTable_1 = require("./usersTable");
5
4
  class CitiesTable extends abstractTable_1.default {
6
5
  constructor() {
7
6
  super(...arguments);
8
7
  this.id = this.serial('id').primaryKey();
9
8
  this.foundationDate = this.timestamp('name').notNull();
10
9
  this.location = this.varchar('page', { size: 256 });
11
- this.userId = this.int('user_id').foreignKey(usersTable_1.default, (table) => table.id, { onUpdate: 'CASCADE' });
10
+ this.userId = this.int('user_id').foreignKey(CitiesTable, (table) => table.id, { onUpdate: 'CASCADE' });
12
11
  this.metadata = this.jsonb('metadata');
13
12
  }
14
13
  tableName() {
@@ -1,7 +1,7 @@
1
1
  import AbstractTable from '../../tables/abstractTable';
2
2
  export default class UserGroupsTable extends AbstractTable<UserGroupsTable> {
3
- id: import("../..").Column<import("../../columns/types/pgSerial").default, true, true>;
4
- name: import("../..").Column<import("../..").PgVarChar, true, false>;
5
- description: import("../..").Column<import("../..").PgVarChar, true, false>;
3
+ id: import("../..").Column<import("../../columns/types/pgSerial").default, true, true, this>;
4
+ name: import("../..").Column<import("../..").PgVarChar, true, false, this>;
5
+ description: import("../..").Column<import("../..").PgVarChar, true, false, this>;
6
6
  tableName(): string;
7
7
  }
@@ -1,16 +1,15 @@
1
1
  import AbstractTable from '../../tables/abstractTable';
2
2
  export declare const rolesEnum: import("../../types/type").default<"user" | "guest" | "admin">;
3
3
  export default class UsersTable extends AbstractTable<UsersTable> {
4
- id: import("../../columns/column").Column<import("../../columns/types/pgSerial").default, true, true>;
5
- fullName: import("../../columns/column").Column<import("../..").PgText, true, false>;
6
- phone: import("../../columns/column").Column<import("../..").PgVarChar, true, false>;
7
- media: import("../../columns/column").Column<import("../..").PgJsonb<string[]>, true, false>;
8
- decimalField: import("../../columns/column").Column<import("../..").PgBigDecimal, false, false>;
9
- bigIntField: import("../../columns/column").Column<import("../..").PgBigInt, true, true>;
10
- createdAt: import("../../columns/column").Column<import("../..").PgTimestamp, false, false>;
11
- createdAtWithTimezone: import("../../columns/column").Column<import("../../columns/types/pgTimestamptz").default, true, false>;
12
- updatedAt: import("../../columns/column").Column<import("../..").PgTimestamp, true, false>;
13
- isArchived: import("../../columns/column").Column<import("../..").PgBoolean, true, false>;
4
+ id: import("../..").Column<import("../../columns/types/pgSerial").default, true, true, this>;
5
+ fullName: import("../..").Column<import("../..").PgText, true, false, this>;
6
+ phone: import("../..").Column<import("../..").PgVarChar, true, false, this>;
7
+ media: import("../..").Column<import("../..").PgJsonb<string[]>, true, false, this>;
8
+ decimalField: import("../..").Column<import("../..").PgBigDecimal, false, false, this>;
9
+ bigIntField: import("../..").Column<import("../..").PgBigInt, true, true, this>;
10
+ createdAt: import("../..").Column<import("../..").PgTimestamp, false, false, this>;
11
+ createdAtWithTimezone: import("../..").Column<import("../../columns/types/pgTimestamptz").default, true, false, this>;
12
+ isArchived: import("../..").Column<import("../..").PgBoolean, true, false, this>;
14
13
  phoneFullNameIndex: import("../../indexes/tableIndex").default;
15
14
  phoneIndex: import("../../indexes/tableIndex").default;
16
15
  tableName(): string;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rolesEnum = void 0;
4
4
  /* eslint-disable max-classes-per-file */
5
- const column_1 = require("../../columns/column");
5
+ // import { Defaults } from '../../columns/column';
6
6
  const abstractTable_1 = require("../../tables/abstractTable");
7
7
  const type_1 = require("../../types/type");
8
8
  // import { rolesEnum } from '../types/rolesType';
@@ -19,7 +19,7 @@ class UsersTable extends abstractTable_1.default {
19
19
  // public role = this.type(rolesEnum, 'name_in_table', { notNull: true });
20
20
  this.createdAt = this.timestamp('created_at').notNull();
21
21
  this.createdAtWithTimezone = this.timestamptz('created_at_time_zone');
22
- this.updatedAt = this.timestamp('updated_at').defaultValue(column_1.Defaults.CURRENT_TIMESTAMP);
22
+ // public updatedAt = this.timestamp('updated_at').defaultValue(Defaults.CURRENT_TIMESTAMP);
23
23
  this.isArchived = this.bool('is_archived').defaultValue(false);
24
24
  this.phoneFullNameIndex = this.index([this.phone, this.fullName]);
25
25
  this.phoneIndex = this.uniqueIndex(this.phone);
@@ -1,7 +1,7 @@
1
1
  import AbstractTable from '../../tables/abstractTable';
2
2
  export default class UsersToUserGroupsTable extends AbstractTable<UsersToUserGroupsTable> {
3
- groupId: import("../..").Column<import("../..").PgInteger, true, false>;
4
- userId: import("../..").Column<import("../..").PgInteger, true, false>;
3
+ groupId: import("../..").Column<import("../..").PgInteger, true, false, this>;
4
+ userId: import("../..").Column<import("../..").PgInteger, true, false, this>;
5
5
  manyToManyIndex: import("../../indexes/tableIndex").default;
6
6
  tableName(): string;
7
7
  }
@@ -3,5 +3,8 @@ import { AbstractColumn } from '../columns/column';
3
3
  import ColumnType from '../columns/types/columnType';
4
4
  import { ExtractModel } from '../tables/inferTypes';
5
5
  export default class QueryResponseMapper {
6
- static map: <ITable>(mappedServiceToDb: { [name in keyof ExtractModel<ITable>]: AbstractColumn<ColumnType<{}>, true, false>; }, queryResult: QueryResult<any>) => (ExtractModel<ITable> | undefined)[];
6
+ static map: <ITable>(mappedServiceToDb: { [name in keyof ExtractModel<ITable>]: AbstractColumn<ColumnType<{}>, true, false, any>; }, queryResult: QueryResult<any>, joinId?: number | undefined) => ExtractModel<ITable>[];
7
+ static partialMap: <T>(partial: {
8
+ [name: string]: AbstractColumn<ColumnType<{}>, true, false, any>;
9
+ }, queryResult: QueryResult<any>, joinId?: number | undefined) => ExtractModel<T>[];
7
10
  }
@@ -1,22 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // eslint-disable-next-line max-len
4
- const checkProperties = (obj) => Object.values(obj).every((x) => x === null || Number.isNaN(x));
4
+ // const checkProperties = (obj: any) => Object.values(obj).every((x) => x === null || Number.isNaN(x));
5
5
  class QueryResponseMapper {
6
6
  }
7
7
  exports.default = QueryResponseMapper;
8
- QueryResponseMapper.map = (mappedServiceToDb, queryResult) => {
8
+ QueryResponseMapper.map = (mappedServiceToDb, queryResult, joinId) => {
9
9
  const response = [];
10
10
  queryResult.rows.forEach((row) => {
11
11
  const mappedRow = {};
12
12
  Object.keys(mappedServiceToDb).forEach((key) => {
13
13
  const column = mappedServiceToDb[key];
14
- const value = column.getColumnType().selectStrategy(row[column.getAlias()]);
14
+ const alias = `${column.getAlias()}${joinId ? `_${joinId}` : ''}`;
15
+ const value = column.getColumnType().selectStrategy(row[alias]);
16
+ mappedRow[key] = value;
17
+ });
18
+ response.push(mappedRow);
19
+ });
20
+ return response;
21
+ };
22
+ QueryResponseMapper.partialMap = (partial, queryResult, joinId) => {
23
+ const response = [];
24
+ queryResult.rows.forEach((row) => {
25
+ const mappedRow = {};
26
+ Object.keys(partial).forEach((key) => {
27
+ const column = partial[key];
28
+ const alias = `${column.getAlias()}${joinId ? `_${joinId}` : ''}`;
29
+ const value = column.getColumnType().selectStrategy(row[alias]);
15
30
  mappedRow[key] = value;
16
31
  });
17
- if (checkProperties(mappedRow)) {
18
- response.push(undefined);
19
- }
20
32
  response.push(mappedRow);
21
33
  });
22
34
  return response;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  /* eslint-disable import/export */
5
5
  /* eslint-disable max-classes-per-file */
6
6
  const fs = require("fs");
7
+ const path = require("path");
7
8
  const builders_1 = require("../builders");
8
9
  const transaction_1 = require("../builders/transaction/transaction");
9
10
  const tables_1 = require("../tables");
@@ -11,24 +12,24 @@ class Migrator {
11
12
  constructor(db) {
12
13
  this.db = db;
13
14
  }
14
- async migrate(configPath, config) {
15
+ async migrate(configPath) {
15
16
  let migrationFolderTo;
16
- if (configPath) {
17
- const configAsString = fs.readFileSync(configPath, 'utf8');
17
+ if (typeof configPath === 'string') {
18
+ const configAsString = fs.readFileSync(path.resolve('.', configPath), 'utf8');
18
19
  const splitted = configAsString.trim().split('\n');
19
20
  // eslint-disable-next-line no-restricted-syntax
20
21
  for (const split of splitted) {
21
22
  const entry = split.trim().split(':');
22
23
  const key = entry[0];
23
24
  const value = entry[1].trim().replace(/['"]+/g, '');
24
- if (key === 'migrationFolder') {
25
+ if (key === 'migrationRootFolder') {
25
26
  // proceed value
26
27
  migrationFolderTo = value;
27
28
  }
28
29
  }
29
30
  }
30
- if (config) {
31
- migrationFolderTo = config.migrationFolder;
31
+ else {
32
+ migrationFolderTo = configPath.migrationFolder;
32
33
  }
33
34
  if (!migrationFolderTo) {
34
35
  throw Error('no migration folder defined');
@@ -47,7 +48,15 @@ class Migrator {
47
48
  const migrationFiles = fs.readdirSync(`${migrationFolderTo}/${migrationFolder}`);
48
49
  const migrationFile = migrationFiles.filter((file) => file === 'migration.sql')[0];
49
50
  const query = fs.readFileSync(`${migrationFolderTo}/${migrationFolder}/${migrationFile}`).toString();
50
- const folderAsMillis = new Date(migrationFolder).getTime();
51
+ const year = Number(migrationFolder.slice(0, 4));
52
+ // second param for Date() is month index, that started from 0, so we need
53
+ // to decrement a value for month
54
+ const month = Number(migrationFolder.slice(4, 6)) - 1;
55
+ const day = Number(migrationFolder.slice(6, 8));
56
+ const hour = Number(migrationFolder.slice(8, 10));
57
+ const min = Number(migrationFolder.slice(10, 12));
58
+ const sec = Number(migrationFolder.slice(12, 14));
59
+ const folderAsMillis = new Date(year, month, day, hour, min, sec).getTime();
51
60
  if (!lastDbMigration || lastDbMigration.createdAt < folderAsMillis) {
52
61
  await this.db.session().execute(query);
53
62
  await migrationTable.insert({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-orm",
3
- "version": "0.9.19",
3
+ "version": "0.10.3",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -30,6 +30,7 @@ class MigrationSerializer {
30
30
  indexToReturn[name] = {
31
31
  name,
32
32
  columns: indexColumnToReturn,
33
+ isUnique: value.isUnique(),
33
34
  };
34
35
  }
35
36
  if (value instanceof columns_1.Column) {
@@ -37,10 +38,22 @@ class MigrationSerializer {
37
38
  name: value.getColumnName(),
38
39
  type: value.getColumnType().getDbName(),
39
40
  primaryKey: !!value.primaryKeyName,
40
- unique: !!value.uniqueKeyName,
41
+ // unique: !!value.uniqueKeyName,
41
42
  default: value.getDefaultValue() === null ? undefined : value.getDefaultValue(),
42
43
  notNull: !value.isNullableFlag,
43
44
  };
45
+ if (value.uniqueKeyName) {
46
+ const indexName = `${value.getParent().tableName()}_${value.getColumnName()}_index`;
47
+ const indexColumnToReturn = {};
48
+ indexColumnToReturn[value.getColumnName()] = {
49
+ name: value.getColumnName(),
50
+ };
51
+ indexToReturn[indexName] = {
52
+ name: indexName,
53
+ columns: indexColumnToReturn,
54
+ isUnique: true,
55
+ };
56
+ }
44
57
  const referenced = value.getReferenced();
45
58
  if (referenced) {
46
59
  columnToReturn[value.getColumnName()].references = {
@@ -29,10 +29,9 @@ export default abstract class AbstractTable<TTable extends AbstractTable<TTable>
29
29
  constructor(db: DB);
30
30
  abstract tableName(): string;
31
31
  withLogger: (logger: BaseLogger) => void;
32
- select({ limit, offset }?: {
33
- limit?: number;
34
- offset?: number;
35
- }): SelectTRB<TTable>;
32
+ select<TType extends ColumnType<any>, TColumn extends AbstractColumn<TType, boolean, boolean, TTable>, T extends {
33
+ [name: string]: TColumn;
34
+ } = {}>(partial?: T): SelectTRB<TTable, T>;
36
35
  update: () => UpdateTRB<TTable>;
37
36
  insert: (value: ExtractModel<TTable>) => InsertTRB<TTable>;
38
37
  insertMany: (values: ExtractModel<TTable>[]) => InsertTRB<TTable>;
@@ -46,23 +45,23 @@ export default abstract class AbstractTable<TTable extends AbstractTable<TTable>
46
45
  protected uniqueIndex(columns: Column<ColumnType, boolean, boolean>): TableIndex;
47
46
  protected varchar(name: string, params?: {
48
47
  size?: number;
49
- }): Column<PgVarChar, true>;
50
- protected int(name: string): Column<PgInteger, true>;
51
- protected smallInt(name: string): Column<PgInteger, true>;
52
- protected serial(name: string): Column<PgSerial, true, true>;
53
- protected bigSerial(name: string, maxBytes: 'max_bytes_53'): Column<PgBigSerial53, true, true>;
54
- protected bigSerial(name: string, maxBytes: 'max_bytes_64'): Column<PgBigSerial64, true, true>;
55
- protected timestamp(name: string): Column<PgTimestamp, true>;
56
- protected timestamptz(name: string): Column<PgTimestamptz, true>;
57
- protected bigint(name: string, maxBytes: 'max_bytes_53'): Column<PgBigInt53, true, true>;
58
- protected bigint(name: string, maxBytes: 'max_bytes_64'): Column<PgBigInt64, true, true>;
59
- protected type<ETtype extends string>(typeEnum: Enum<ETtype>, name: string): Column<PgEnum<ExtractEnumValues<Enum<ETtype>>>, true>;
48
+ }): Column<PgVarChar, true, false, this>;
49
+ protected int(name: string): Column<PgInteger, true, false, this>;
50
+ protected smallInt(name: string): Column<PgInteger, true, false, this>;
51
+ protected serial(name: string): Column<PgSerial, true, true, this>;
52
+ protected bigSerial(name: string, maxBytes: 'max_bytes_53'): Column<PgBigSerial53, true, true, this>;
53
+ protected bigSerial(name: string, maxBytes: 'max_bytes_64'): Column<PgBigSerial64, true, true, this>;
54
+ protected timestamp(name: string): Column<PgTimestamp, true, false, this>;
55
+ protected timestamptz(name: string): Column<PgTimestamptz, true, false, this>;
56
+ protected bigint(name: string, maxBytes: 'max_bytes_53'): Column<PgBigInt53, true, true, this>;
57
+ protected bigint(name: string, maxBytes: 'max_bytes_64'): Column<PgBigInt64, true, true, this>;
58
+ protected type<ETtype extends string>(typeEnum: Enum<ETtype>, name: string): Column<PgEnum<ExtractEnumValues<Enum<ETtype>>>, true, false, this>;
60
59
  protected decimal(name: string, params?: {
61
60
  precision?: number;
62
61
  scale?: number;
63
- }): Column<PgBigDecimal, true>;
64
- protected time(name: string): Column<PgTime, true>;
65
- protected bool(name: string): Column<PgBoolean, true>;
66
- protected text(name: string): Column<PgText, true>;
67
- protected jsonb<TSubType>(name: string): Column<PgJsonb<TSubType>, true>;
62
+ }): Column<PgBigDecimal, true, false, this>;
63
+ protected time(name: string): Column<PgTime, true, false, this>;
64
+ protected bool(name: string): Column<PgBoolean, true, false, this>;
65
+ protected text(name: string): Column<PgText, true, false, this>;
66
+ protected jsonb<TSubType>(name: string): Column<PgJsonb<TSubType>, true, false, this>;
68
67
  }
@@ -53,11 +53,12 @@ class AbstractTable {
53
53
  this._logger = db.logger();
54
54
  this.db = db;
55
55
  }
56
- select({ limit, offset } = {}) {
56
+ // eslint-disable-next-line max-len
57
+ select(partial) {
57
58
  if (!this._session) {
58
59
  throw new Error(`Db was not provided in constructor, while ${this.constructor.name} class was creating. Please make sure, that you provided Db object to ${this.constructor.name} class. Should be -> new ${this.constructor.name}(db)`);
59
60
  }
60
- return new selectRequestBuilder_1.default(this._session, this.mapServiceToDb(), { limit, offset }, this, this._logger);
61
+ return new selectRequestBuilder_1.default(this._session, this.mapServiceToDb(), {}, this, this._logger, partial);
61
62
  }
62
63
  mapServiceToDb() {
63
64
  return Object.getOwnPropertyNames(this)
@@ -73,7 +74,7 @@ class AbstractTable {
73
74
  return new tableIndex_1.default(this.tableName(), columns instanceof Array ? columns : [columns]);
74
75
  }
75
76
  uniqueIndex(columns) {
76
- return new tableIndex_1.default(this.tableName(), columns instanceof Array ? columns : [columns]);
77
+ return new tableIndex_1.default(this.tableName(), columns instanceof Array ? columns : [columns], true);
77
78
  }
78
79
  varchar(name, params = {}) {
79
80
  return new column_1.Column(this, name, new pgVarChar_1.default(params.size));
@@ -3,12 +3,18 @@ import { AbstractColumn, Column, IndexedColumn } from '../columns/column';
3
3
  import ColumnType from '../columns/types/columnType';
4
4
  import TableIndex from '../indexes/tableIndex';
5
5
  import Type from '../types/type';
6
+ import AbstractTable from './abstractTable';
6
7
  export declare type ExtractFieldNames<TTable> = {
7
8
  [Key in keyof TTable]: TTable[Key] extends Function ? never : TTable[Key] extends Column<ColumnType, infer TNullable, infer TAutoIncrement> ? true extends TNullable ? never : Key : TTable[Key] extends IndexedColumn<ColumnType, infer TNullable, infer TAutoIncrement> ? true extends TNullable ? never : Key : never;
8
9
  }[keyof TTable];
9
10
  export declare type ExtractOptionalFieldNames<TTable> = {
10
11
  [Key in keyof TTable]: TTable[Key] extends Function ? never : TTable[Key] extends Column<ColumnType, infer TNullable, infer TAutoIncrement> ? true extends TNullable ? Key : never : TTable[Key] extends IndexedColumn<ColumnType, infer TNullable, infer TAutoIncrement> ? true extends TNullable ? Key : never : never;
11
12
  }[keyof TTable];
13
+ export declare type ExtractPartialObjectFromColumns<TTable> = {
14
+ [Key in ExtractFieldNames<TTable>]: TTable[Key];
15
+ } & {
16
+ [Key in ExtractOptionalFieldNames<TTable>]?: TTable[Key];
17
+ };
12
18
  export declare type ExtractModel<TTable> = {
13
19
  [Key in ExtractFieldNames<TTable>]: ExtractCodeType<TTable[Key]>;
14
20
  } & {
@@ -23,3 +29,11 @@ export declare type ExtractCodeType<T extends AbstractColumn<ColumnType<any>, bo
23
29
  export declare type ExtractTypeEnum<T extends Type<any>> = T extends Type<infer TEnum> ? TEnum : never;
24
30
  export declare type Indexing = IndexedColumn<ColumnType, boolean, boolean> | TableIndex;
25
31
  export declare type AnyColumn = Column<ColumnType, boolean, boolean> | IndexedColumn<ColumnType, boolean, boolean>;
32
+ export declare type PartialFor<TTable extends AbstractTable<TTable>> = {
33
+ [name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>;
34
+ };
35
+ export declare type FullOrPartial<TTable extends AbstractTable<TTable>, TPartial extends PartialFor<TTable>> = [keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>;
36
+ export declare type CheckTwoTypes<TInput, TTable extends AbstractTable<TTable>, TTable1 extends AbstractTable<TTable1>> = TInput extends AbstractTable<TTable> ? TTable : TInput extends AbstractTable<TTable1> ? TTable1 : never;
37
+ export declare type CheckThreeTypes<TInput, TTable extends AbstractTable<TTable>, TTable1 extends AbstractTable<TTable1>, TTable2 extends AbstractTable<TTable2>> = TInput extends AbstractTable<TTable> ? TTable : TInput extends AbstractTable<TTable1> ? TTable1 : TInput extends AbstractTable<TTable2> ? TTable2 : never;
38
+ export declare type CheckFourTypes<TInput, TTable extends AbstractTable<TTable>, TTable1 extends AbstractTable<TTable1>, TTable2 extends AbstractTable<TTable2>, TTable3 extends AbstractTable<TTable3>> = TInput extends AbstractTable<TTable> ? TTable : TInput extends AbstractTable<TTable1> ? TTable1 : TInput extends AbstractTable<TTable2> ? TTable2 : TInput extends AbstractTable<TTable3> ? TTable3 : never;
39
+ export declare type CheckFiveTypes<TInput, TTable extends AbstractTable<TTable>, TTable1 extends AbstractTable<TTable1>, TTable2 extends AbstractTable<TTable2>, TTable3 extends AbstractTable<TTable3>, TTable4 extends AbstractTable<TTable4>> = TInput extends AbstractTable<TTable> ? TTable : TInput extends AbstractTable<TTable1> ? TTable1 : TInput extends AbstractTable<TTable2> ? TTable2 : TInput extends AbstractTable<TTable3> ? TTable3 : TInput extends AbstractTable<TTable4> ? TTable4 : never;
@@ -1,7 +1,7 @@
1
1
  import AbstractTable from './abstractTable';
2
2
  export default class MigrationsTable extends AbstractTable<MigrationsTable> {
3
- id: import("..").Column<import("../columns/types/pgSerial").default, true, true>;
4
- hash: import("..").Column<import("..").PgText, false, false>;
5
- createdAt: import("..").Column<import("..").PgBigInt, true, true>;
3
+ id: import("..").Column<import("../columns/types/pgSerial").default, true, true, this>;
4
+ hash: import("..").Column<import("..").PgText, false, false, this>;
5
+ createdAt: import("..").Column<import("..").PgBigInt, true, true, this>;
6
6
  tableName(): string;
7
7
  }