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.
- package/README.md +39 -9
- package/builders/aggregators/abstractAggregator.d.ts +4 -2
- package/builders/aggregators/abstractAggregator.js +11 -4
- package/builders/aggregators/selectAggregator.d.ts +12 -4
- package/builders/aggregators/selectAggregator.js +29 -12
- package/builders/highLvlBuilders/abstractRequestBuilder.d.ts +10 -4
- package/builders/highLvlBuilders/abstractRequestBuilder.js +14 -3
- package/builders/highLvlBuilders/deleteRequestBuilder.d.ts +4 -2
- package/builders/highLvlBuilders/insertRequestBuilder.d.ts +4 -2
- package/builders/highLvlBuilders/insertRequestBuilder.js +1 -0
- package/builders/highLvlBuilders/selectRequestBuilder.d.ts +21 -16
- package/builders/highLvlBuilders/selectRequestBuilder.js +22 -11
- package/builders/highLvlBuilders/updateRequestBuilder.d.ts +4 -2
- package/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +16 -3
- package/builders/joinBuilders/builders/abstractJoinBuilder.js +19 -2
- package/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +16 -4
- package/builders/joinBuilders/builders/selectWithFiveJoins.js +19 -10
- package/builders/joinBuilders/builders/selectWithFourJoins.d.ts +31 -12
- package/builders/joinBuilders/builders/selectWithFourJoins.js +31 -21
- package/builders/joinBuilders/builders/selectWithJoin.d.ts +28 -12
- package/builders/joinBuilders/builders/selectWithJoin.js +23 -18
- package/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +30 -12
- package/builders/joinBuilders/builders/selectWithThreeJoins.js +28 -20
- package/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +29 -12
- package/builders/joinBuilders/builders/selectWithTwoJoins.js +25 -19
- package/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +14 -13
- package/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +13 -12
- package/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +8 -7
- package/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +8 -7
- package/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +8 -7
- package/builders/lowLvlBuilders/selects/select.d.ts +5 -1
- package/builders/lowLvlBuilders/selects/select.js +3 -2
- package/builders/lowLvlBuilders/selects/selectFrom.d.ts +9 -3
- package/builders/lowLvlBuilders/selects/selectJoined.d.ts +8 -2
- package/builders/lowLvlBuilders/selects/whereSelect.d.ts +1 -1
- package/builders/requestBuilders/updates/static.d.ts +2 -2
- package/builders/requestBuilders/where/static.d.ts +9 -9
- package/columns/column.d.ts +24 -20
- package/columns/column.js +8 -1
- package/data/tables/citiesTable.d.ts +14 -0
- package/data/tables/citiesTable.js +17 -0
- package/data/tables/userGroupsTable.d.ts +7 -0
- package/data/tables/userGroupsTable.js +15 -0
- package/data/tables/usersTable.d.ts +16 -0
- package/data/tables/usersTable.js +31 -0
- package/data/tables/usersToUserGroups.d.ts +7 -0
- package/data/tables/usersToUserGroups.js +17 -0
- package/data/types/rolesType.d.ts +1 -0
- package/data/types/rolesType.js +6 -0
- package/docs/cases/simple_delete.js +1 -1
- package/docs/cases/simple_insert.js +9 -4
- package/docs/cases/simple_join.js +20 -6
- package/docs/cases/simple_select.js +15 -9
- package/docs/cases/simple_update.js +1 -1
- package/docs/tables/citiesTable.d.ts +5 -5
- package/docs/tables/citiesTable.js +1 -2
- package/docs/tables/userGroupsTable.d.ts +3 -3
- package/docs/tables/usersTable.d.ts +9 -10
- package/docs/tables/usersTable.js +2 -2
- package/docs/tables/usersToUserGroups.d.ts +2 -2
- package/mappers/responseMapper.d.ts +4 -1
- package/mappers/responseMapper.js +18 -6
- package/migrator/migrator.js +16 -7
- package/package.json +1 -1
- package/serializer/serializer.js +14 -1
- package/tables/abstractTable.d.ts +19 -20
- package/tables/abstractTable.js +4 -3
- package/tables/inferTypes.d.ts +14 -0
- package/tables/migrationsTable.d.ts +3 -3
- 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'] });
|
|
@@ -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
|
|
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
|
|
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(
|
|
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
|
-
}).
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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().
|
|
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(
|
|
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))
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
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
|
-
.
|
|
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(
|
|
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("
|
|
5
|
-
fullName: import("
|
|
6
|
-
phone: import("
|
|
7
|
-
media: import("
|
|
8
|
-
decimalField: import("
|
|
9
|
-
bigIntField: import("
|
|
10
|
-
createdAt: import("
|
|
11
|
-
createdAtWithTimezone: import("
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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;
|
package/migrator/migrator.js
CHANGED
|
@@ -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
|
|
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 === '
|
|
25
|
+
if (key === 'migrationRootFolder') {
|
|
25
26
|
// proceed value
|
|
26
27
|
migrationFolderTo = value;
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
|
-
|
|
31
|
-
migrationFolderTo =
|
|
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
|
|
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
package/serializer/serializer.js
CHANGED
|
@@ -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
|
|
33
|
-
|
|
34
|
-
|
|
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
|
}
|
package/tables/abstractTable.js
CHANGED
|
@@ -53,11 +53,12 @@ class AbstractTable {
|
|
|
53
53
|
this._logger = db.logger();
|
|
54
54
|
this.db = db;
|
|
55
55
|
}
|
|
56
|
-
|
|
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(), {
|
|
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));
|
package/tables/inferTypes.d.ts
CHANGED
|
@@ -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
|
}
|