drizzle-orm 0.10.25 → 0.10.28
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/.eslintrc +28 -0
- package/.tslintignore +1 -0
- package/CHANGELOG.md +202 -0
- package/README.md +439 -0
- package/dist/builders/aggregators/abstractAggregator.d.ts +11 -0
- package/dist/builders/aggregators/abstractAggregator.js +35 -0
- package/dist/builders/aggregators/deleteAggregator.d.ts +16 -0
- package/dist/builders/aggregators/deleteAggregator.js +42 -0
- package/dist/builders/aggregators/insertAggregator.d.ts +22 -0
- package/dist/builders/aggregators/insertAggregator.js +106 -0
- package/dist/builders/aggregators/selectAggregator.d.ts +39 -0
- package/dist/builders/aggregators/selectAggregator.js +143 -0
- package/dist/builders/aggregators/updateAggregator.d.ts +19 -0
- package/dist/builders/aggregators/updateAggregator.js +50 -0
- package/dist/builders/highLvlBuilders/abstractRequestBuilder.d.ts +27 -0
- package/dist/builders/highLvlBuilders/abstractRequestBuilder.js +32 -0
- package/dist/builders/highLvlBuilders/deleteRequestBuilder.d.ts +19 -0
- package/dist/builders/highLvlBuilders/deleteRequestBuilder.js +61 -0
- package/dist/builders/highLvlBuilders/insertRequestBuilder.d.ts +20 -0
- package/dist/builders/highLvlBuilders/insertRequestBuilder.js +73 -0
- package/dist/builders/highLvlBuilders/order.d.ts +5 -0
- package/dist/builders/highLvlBuilders/order.js +8 -0
- package/dist/builders/highLvlBuilders/selectRequestBuilder.d.ts +47 -0
- package/dist/builders/highLvlBuilders/selectRequestBuilder.js +128 -0
- package/dist/builders/highLvlBuilders/updateRequestBuilder.d.ts +22 -0
- package/dist/builders/highLvlBuilders/updateRequestBuilder.js +80 -0
- package/dist/builders/index.d.ts +18 -0
- package/dist/builders/index.js +54 -0
- package/dist/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +40 -0
- package/dist/builders/joinBuilders/builders/abstractJoinBuilder.js +78 -0
- package/dist/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +35 -0
- package/dist/builders/joinBuilders/builders/selectWithFiveJoins.js +45 -0
- package/dist/builders/joinBuilders/builders/selectWithFourJoins.d.ts +55 -0
- package/dist/builders/joinBuilders/builders/selectWithFourJoins.js +78 -0
- package/dist/builders/joinBuilders/builders/selectWithJoin.d.ts +49 -0
- package/dist/builders/joinBuilders/builders/selectWithJoin.js +64 -0
- package/dist/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +53 -0
- package/dist/builders/joinBuilders/builders/selectWithThreeJoins.js +73 -0
- package/dist/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +51 -0
- package/dist/builders/joinBuilders/builders/selectWithTwoJoins.js +68 -0
- package/dist/builders/joinBuilders/join.d.ts +23 -0
- package/dist/builders/joinBuilders/join.js +28 -0
- package/dist/builders/joinBuilders/joinWith.d.ts +14 -0
- package/dist/builders/joinBuilders/joinWith.js +14 -0
- package/dist/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +20 -0
- package/dist/builders/joinBuilders/responses/selectResponseFiveJoins.js +35 -0
- package/dist/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +19 -0
- package/dist/builders/joinBuilders/responses/selectResponseFourJoins.js +34 -0
- package/dist/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +18 -0
- package/dist/builders/joinBuilders/responses/selectResponseThreeJoins.js +33 -0
- package/dist/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +17 -0
- package/dist/builders/joinBuilders/responses/selectResponseTwoJoins.js +32 -0
- package/dist/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +16 -0
- package/dist/builders/joinBuilders/responses/selectResponseWithJoin.js +31 -0
- package/dist/builders/joinBuilders/static.d.ts +5 -0
- package/dist/builders/joinBuilders/static.js +9 -0
- package/dist/builders/lowLvlBuilders/alter.d.ts +0 -0
- package/dist/builders/lowLvlBuilders/alter.js +1 -0
- package/dist/builders/lowLvlBuilders/create.d.ts +12 -0
- package/dist/builders/lowLvlBuilders/create.js +100 -0
- package/dist/builders/lowLvlBuilders/delets/delete.d.ts +5 -0
- package/dist/builders/lowLvlBuilders/delets/delete.js +15 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFilter.d.ts +11 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFilter.js +13 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFrom.d.ts +12 -0
- package/dist/builders/lowLvlBuilders/delets/deleteFrom.js +14 -0
- package/dist/builders/lowLvlBuilders/inserts/insert.d.ts +5 -0
- package/dist/builders/lowLvlBuilders/inserts/insert.js +15 -0
- package/dist/builders/lowLvlBuilders/inserts/insertInto.d.ts +13 -0
- package/dist/builders/lowLvlBuilders/inserts/insertInto.js +16 -0
- package/dist/builders/lowLvlBuilders/inserts/onConflictInsert.d.ts +12 -0
- package/dist/builders/lowLvlBuilders/inserts/onConflictInsert.js +13 -0
- package/dist/builders/lowLvlBuilders/inserts/valuesInsert.d.ts +16 -0
- package/dist/builders/lowLvlBuilders/inserts/valuesInsert.js +19 -0
- package/dist/builders/lowLvlBuilders/selects/select.d.ts +9 -0
- package/dist/builders/lowLvlBuilders/selects/select.js +16 -0
- package/dist/builders/lowLvlBuilders/selects/selectFrom.d.ts +28 -0
- package/dist/builders/lowLvlBuilders/selects/selectFrom.js +34 -0
- package/dist/builders/lowLvlBuilders/selects/selectJoined.d.ts +26 -0
- package/dist/builders/lowLvlBuilders/selects/selectJoined.js +30 -0
- package/dist/builders/lowLvlBuilders/selects/whereSelect.d.ts +17 -0
- package/dist/builders/lowLvlBuilders/selects/whereSelect.js +25 -0
- package/dist/builders/lowLvlBuilders/updates/update.d.ts +5 -0
- package/dist/builders/lowLvlBuilders/updates/update.js +15 -0
- package/dist/builders/lowLvlBuilders/updates/updateIn.d.ts +13 -0
- package/dist/builders/lowLvlBuilders/updates/updateIn.js +15 -0
- package/dist/builders/lowLvlBuilders/updates/whereSelect.d.ts +11 -0
- package/dist/builders/lowLvlBuilders/updates/whereSelect.js +13 -0
- package/dist/builders/lowLvlBuilders/updates/whereSet.d.ts +14 -0
- package/dist/builders/lowLvlBuilders/updates/whereSet.js +18 -0
- package/dist/builders/requestBuilders/updates/combine.d.ts +9 -0
- package/dist/builders/requestBuilders/updates/combine.js +26 -0
- package/dist/builders/requestBuilders/updates/increment.d.ts +13 -0
- package/dist/builders/requestBuilders/updates/increment.js +18 -0
- package/dist/builders/requestBuilders/updates/setObjects.d.ts +12 -0
- package/dist/builders/requestBuilders/updates/setObjects.js +19 -0
- package/dist/builders/requestBuilders/updates/static.d.ts +7 -0
- package/dist/builders/requestBuilders/updates/static.js +15 -0
- package/dist/builders/requestBuilders/updates/updates.d.ts +9 -0
- package/dist/builders/requestBuilders/updates/updates.js +10 -0
- package/dist/builders/requestBuilders/where/and.d.ts +11 -0
- package/dist/builders/requestBuilders/where/and.js +31 -0
- package/dist/builders/requestBuilders/where/const.d.ts +9 -0
- package/dist/builders/requestBuilders/where/const.js +25 -0
- package/dist/builders/requestBuilders/where/constArray.d.ts +9 -0
- package/dist/builders/requestBuilders/where/constArray.js +39 -0
- package/dist/builders/requestBuilders/where/eqWhere.d.ts +12 -0
- package/dist/builders/requestBuilders/where/eqWhere.js +20 -0
- package/dist/builders/requestBuilders/where/greater.d.ts +15 -0
- package/dist/builders/requestBuilders/where/greater.js +20 -0
- package/dist/builders/requestBuilders/where/greaterEq.d.ts +15 -0
- package/dist/builders/requestBuilders/where/greaterEq.js +20 -0
- package/dist/builders/requestBuilders/where/in.d.ts +12 -0
- package/dist/builders/requestBuilders/where/in.js +20 -0
- package/dist/builders/requestBuilders/where/isNotNull.d.ts +11 -0
- package/dist/builders/requestBuilders/where/isNotNull.js +18 -0
- package/dist/builders/requestBuilders/where/isNull.d.ts +11 -0
- package/dist/builders/requestBuilders/where/isNull.js +18 -0
- package/dist/builders/requestBuilders/where/less.d.ts +15 -0
- package/dist/builders/requestBuilders/where/less.js +20 -0
- package/dist/builders/requestBuilders/where/lessEq.d.ts +15 -0
- package/dist/builders/requestBuilders/where/lessEq.js +20 -0
- package/dist/builders/requestBuilders/where/like.d.ts +12 -0
- package/dist/builders/requestBuilders/where/like.js +20 -0
- package/dist/builders/requestBuilders/where/notEqWhere.d.ts +12 -0
- package/dist/builders/requestBuilders/where/notEqWhere.js +20 -0
- package/dist/builders/requestBuilders/where/or.d.ts +11 -0
- package/dist/builders/requestBuilders/where/or.js +31 -0
- package/dist/builders/requestBuilders/where/rawWhere.d.ts +9 -0
- package/dist/builders/requestBuilders/where/rawWhere.js +15 -0
- package/dist/builders/requestBuilders/where/static.d.ts +17 -0
- package/dist/builders/requestBuilders/where/static.js +49 -0
- package/dist/builders/requestBuilders/where/var.d.ts +13 -0
- package/dist/builders/requestBuilders/where/var.js +18 -0
- package/dist/builders/requestBuilders/where/where.d.ts +8 -0
- package/dist/builders/requestBuilders/where/where.js +6 -0
- package/dist/builders/transaction/transaction.d.ts +8 -0
- package/dist/builders/transaction/transaction.js +20 -0
- package/dist/columns/column.d.ts +72 -0
- package/dist/columns/column.js +101 -0
- package/dist/columns/index.d.ts +10 -0
- package/dist/columns/index.js +27 -0
- package/dist/columns/types/columnType.d.ts +7 -0
- package/dist/columns/types/columnType.js +6 -0
- package/dist/columns/types/pgBigDecimal.d.ts +10 -0
- package/dist/columns/types/pgBigDecimal.js +31 -0
- package/dist/columns/types/pgBigInt.d.ts +15 -0
- package/dist/columns/types/pgBigInt.js +32 -0
- package/dist/columns/types/pgBigSerial.d.ts +15 -0
- package/dist/columns/types/pgBigSerial.js +32 -0
- package/dist/columns/types/pgBoolean.d.ts +8 -0
- package/dist/columns/types/pgBoolean.js +18 -0
- package/dist/columns/types/pgEnum.d.ts +9 -0
- package/dist/columns/types/pgEnum.js +18 -0
- package/dist/columns/types/pgInteger.d.ts +8 -0
- package/dist/columns/types/pgInteger.js +21 -0
- package/dist/columns/types/pgJsonb.d.ts +9 -0
- package/dist/columns/types/pgJsonb.js +20 -0
- package/dist/columns/types/pgSerial.d.ts +8 -0
- package/dist/columns/types/pgSerial.js +18 -0
- package/dist/columns/types/pgSmallInt.d.ts +8 -0
- package/dist/columns/types/pgSmallInt.js +18 -0
- package/dist/columns/types/pgText.d.ts +8 -0
- package/dist/columns/types/pgText.js +18 -0
- package/dist/columns/types/pgTime.d.ts +8 -0
- package/dist/columns/types/pgTime.js +18 -0
- package/dist/columns/types/pgTimestamp.d.ts +8 -0
- package/dist/columns/types/pgTimestamp.js +18 -0
- package/dist/columns/types/pgTimestamptz.d.ts +8 -0
- package/dist/columns/types/pgTimestamptz.js +18 -0
- package/dist/columns/types/pgVarChar.d.ts +9 -0
- package/dist/columns/types/pgVarChar.js +24 -0
- package/dist/db/db.d.ts +18 -0
- package/dist/db/db.js +25 -0
- package/dist/db/dbConnector.d.ts +9 -0
- package/dist/db/dbConnector.js +32 -0
- package/dist/db/dbStringConnector.d.ts +6 -0
- package/dist/db/dbStringConnector.js +29 -0
- package/dist/db/group_by.d.ts +0 -0
- package/dist/db/group_by.js +68 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.js +14 -0
- package/dist/db/session.d.ts +9 -0
- package/dist/db/session.js +16 -0
- package/dist/docs/cases/simple_delete.d.ts +1 -0
- package/dist/docs/cases/simple_delete.js +35 -0
- package/dist/docs/cases/simple_insert.d.ts +1 -0
- package/dist/docs/cases/simple_insert.js +57 -0
- package/dist/docs/cases/simple_join.d.ts +1 -0
- package/dist/docs/cases/simple_join.js +115 -0
- package/dist/docs/cases/simple_select.d.ts +1 -0
- package/dist/docs/cases/simple_select.js +50 -0
- package/dist/docs/cases/simple_update.d.ts +1 -0
- package/dist/docs/cases/simple_update.js +39 -0
- package/dist/docs/tables/citiesTable.d.ts +14 -0
- package/dist/docs/tables/citiesTable.js +21 -0
- package/dist/docs/tables/userGroupsTable.d.ts +7 -0
- package/dist/docs/tables/userGroupsTable.js +18 -0
- package/dist/docs/tables/usersTable.d.ts +17 -0
- package/dist/docs/tables/usersTable.js +35 -0
- package/dist/docs/tables/usersToUserGroups.d.ts +7 -0
- package/dist/docs/tables/usersToUserGroups.js +20 -0
- package/dist/docs/types/rolesType.d.ts +1 -0
- package/dist/docs/types/rolesType.js +6 -0
- package/dist/errors/baseError.d.ts +22 -0
- package/dist/errors/baseError.js +35 -0
- package/dist/errors/builderError.d.ts +14 -0
- package/dist/errors/builderError.js +25 -0
- package/dist/errors/dbErrors.d.ts +12 -0
- package/dist/errors/dbErrors.js +28 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +31 -0
- package/dist/indexes/tableIndex.d.ts +11 -0
- package/dist/indexes/tableIndex.js +17 -0
- package/dist/logger/abstractLogger.d.ts +4 -0
- package/dist/logger/abstractLogger.js +5 -0
- package/dist/logger/consoleLogger.d.ts +5 -0
- package/dist/logger/consoleLogger.js +15 -0
- package/dist/mappers/index.d.ts +0 -0
- package/dist/mappers/index.js +1 -0
- package/dist/mappers/responseMapper.d.ts +10 -0
- package/dist/mappers/responseMapper.js +35 -0
- package/dist/migrator/index.d.ts +0 -0
- package/dist/migrator/index.js +1 -0
- package/dist/migrator/migrator.d.ts +11 -0
- package/dist/migrator/migrator.js +105 -0
- package/dist/serializer/serializer.d.ts +47 -0
- package/dist/serializer/serializer.js +258 -0
- package/dist/tables/abstractTable.d.ts +68 -0
- package/dist/tables/abstractTable.js +151 -0
- package/dist/tables/index.d.ts +3 -0
- package/dist/tables/index.js +11 -0
- package/dist/tables/inferTypes.d.ts +39 -0
- package/dist/tables/inferTypes.js +2 -0
- package/dist/tables/migrationsTable.d.ts +7 -0
- package/dist/tables/migrationsTable.js +18 -0
- package/dist/test.d.ts +1 -0
- package/dist/test.js +65 -0
- package/dist/types/type.d.ts +10 -0
- package/dist/types/type.js +14 -0
- package/dist/utils/ecranate.d.ts +2 -0
- package/dist/utils/ecranate.js +8 -0
- package/package.json +3 -7
- package/pnpm-lock.yaml +1842 -0
- package/src/builders/aggregators/abstractAggregator.ts +41 -0
- package/src/builders/aggregators/deleteAggregator.ts +44 -0
- package/src/builders/aggregators/insertAggregator.ts +120 -0
- package/src/builders/aggregators/selectAggregator.ts +163 -0
- package/src/builders/aggregators/updateAggregator.ts +56 -0
- package/src/builders/highLvlBuilders/abstractRequestBuilder.ts +51 -0
- package/src/builders/highLvlBuilders/deleteRequestBuilder.ts +59 -0
- package/src/builders/highLvlBuilders/insertRequestBuilder.ts +75 -0
- package/src/builders/highLvlBuilders/order.ts +4 -0
- package/src/builders/highLvlBuilders/selectRequestBuilder.ts +229 -0
- package/src/builders/highLvlBuilders/updateRequestBuilder.ts +80 -0
- package/src/builders/index.ts +21 -0
- package/src/builders/joinBuilders/builders/abstractJoinBuilder.ts +98 -0
- package/src/builders/joinBuilders/builders/selectWithFiveJoins.ts +110 -0
- package/src/builders/joinBuilders/builders/selectWithFourJoins.ts +254 -0
- package/src/builders/joinBuilders/builders/selectWithJoin.ts +189 -0
- package/src/builders/joinBuilders/builders/selectWithThreeJoins.ts +231 -0
- package/src/builders/joinBuilders/builders/selectWithTwoJoins.ts +210 -0
- package/src/builders/joinBuilders/join.ts +40 -0
- package/src/builders/joinBuilders/joinWith.ts +21 -0
- package/src/builders/joinBuilders/responses/selectResponseFiveJoins.ts +82 -0
- package/src/builders/joinBuilders/responses/selectResponseFourJoins.ts +73 -0
- package/src/builders/joinBuilders/responses/selectResponseThreeJoins.ts +64 -0
- package/src/builders/joinBuilders/responses/selectResponseTwoJoins.ts +57 -0
- package/src/builders/joinBuilders/responses/selectResponseWithJoin.ts +49 -0
- package/src/builders/joinBuilders/static.ts +9 -0
- package/src/builders/lowLvlBuilders/alter.ts +0 -0
- package/src/builders/lowLvlBuilders/create.ts +115 -0
- package/src/builders/lowLvlBuilders/delets/delete.ts +13 -0
- package/src/builders/lowLvlBuilders/delets/deleteFilter.ts +17 -0
- package/src/builders/lowLvlBuilders/delets/deleteFrom.ts +15 -0
- package/src/builders/lowLvlBuilders/inserts/insert.ts +11 -0
- package/src/builders/lowLvlBuilders/inserts/insertInto.ts +16 -0
- package/src/builders/lowLvlBuilders/inserts/onConflictInsert.ts +19 -0
- package/src/builders/lowLvlBuilders/inserts/valuesInsert.ts +27 -0
- package/src/builders/lowLvlBuilders/selects/select.ts +14 -0
- package/src/builders/lowLvlBuilders/selects/selectFrom.ts +50 -0
- package/src/builders/lowLvlBuilders/selects/selectJoined.ts +44 -0
- package/src/builders/lowLvlBuilders/selects/whereSelect.ts +36 -0
- package/src/builders/lowLvlBuilders/updates/update.ts +13 -0
- package/src/builders/lowLvlBuilders/updates/updateIn.ts +17 -0
- package/src/builders/lowLvlBuilders/updates/whereSelect.ts +17 -0
- package/src/builders/lowLvlBuilders/updates/whereSet.ts +21 -0
- package/src/builders/requestBuilders/updates/combine.ts +34 -0
- package/src/builders/requestBuilders/updates/increment.ts +24 -0
- package/src/builders/requestBuilders/updates/setObjects.ts +27 -0
- package/src/builders/requestBuilders/updates/static.ts +15 -0
- package/src/builders/requestBuilders/updates/updates.ts +8 -0
- package/src/builders/requestBuilders/where/and.ts +35 -0
- package/src/builders/requestBuilders/where/const.ts +23 -0
- package/src/builders/requestBuilders/where/constArray.ts +37 -0
- package/src/builders/requestBuilders/where/eqWhere.ts +20 -0
- package/src/builders/requestBuilders/where/greater.ts +20 -0
- package/src/builders/requestBuilders/where/greaterEq.ts +20 -0
- package/src/builders/requestBuilders/where/in.ts +20 -0
- package/src/builders/requestBuilders/where/isNotNull.ts +17 -0
- package/src/builders/requestBuilders/where/isNull.ts +17 -0
- package/src/builders/requestBuilders/where/less.ts +20 -0
- package/src/builders/requestBuilders/where/lessEq.ts +20 -0
- package/src/builders/requestBuilders/where/like.ts +20 -0
- package/src/builders/requestBuilders/where/notEqWhere.ts +20 -0
- package/src/builders/requestBuilders/where/or.ts +35 -0
- package/src/builders/requestBuilders/where/rawWhere.ts +10 -0
- package/src/builders/requestBuilders/where/static.ts +60 -0
- package/src/builders/requestBuilders/where/var.ts +19 -0
- package/src/builders/requestBuilders/where/where.ts +5 -0
- package/src/builders/transaction/transaction.ts +21 -0
- package/src/columns/column.ts +195 -0
- package/src/columns/index.ts +10 -0
- package/src/columns/types/columnType.ts +8 -0
- package/src/columns/types/pgBigDecimal.ts +29 -0
- package/src/columns/types/pgBigInt.ts +36 -0
- package/src/columns/types/pgBigSerial.ts +36 -0
- package/src/columns/types/pgBoolean.ts +18 -0
- package/src/columns/types/pgEnum.ts +17 -0
- package/src/columns/types/pgInteger.ts +21 -0
- package/src/columns/types/pgJsonb.ts +21 -0
- package/src/columns/types/pgSerial.ts +18 -0
- package/src/columns/types/pgSmallInt.ts +18 -0
- package/src/columns/types/pgText.ts +18 -0
- package/src/columns/types/pgTime.ts +18 -0
- package/src/columns/types/pgTimestamp.ts +18 -0
- package/src/columns/types/pgTimestamptz.ts +18 -0
- package/src/columns/types/pgVarChar.ts +24 -0
- package/src/db/db.ts +43 -0
- package/src/db/dbConnector.ts +30 -0
- package/src/db/dbStringConnector.ts +29 -0
- package/src/db/group_by.ts +75 -0
- package/src/db/index.ts +4 -0
- package/src/db/session.ts +16 -0
- package/src/docs/cases/simple_delete.ts +35 -0
- package/src/docs/cases/simple_insert.ts +65 -0
- package/src/docs/cases/simple_join.ts +140 -0
- package/src/docs/cases/simple_select.ts +72 -0
- package/src/docs/cases/simple_update.ts +40 -0
- package/src/docs/tables/citiesTable.ts +22 -0
- package/src/docs/tables/userGroupsTable.ts +12 -0
- package/src/docs/tables/usersTable.ts +33 -0
- package/src/docs/tables/usersToUserGroups.ts +14 -0
- package/src/docs/types/rolesType.ts +4 -0
- package/src/errors/baseError.ts +47 -0
- package/src/errors/builderError.ts +31 -0
- package/src/errors/dbErrors.ts +24 -0
- package/src/index.ts +20 -0
- package/src/indexes/tableIndex.ts +25 -0
- package/src/logger/abstractLogger.ts +4 -0
- package/src/logger/consoleLogger.ts +11 -0
- package/src/mappers/index.ts +0 -0
- package/src/mappers/responseMapper.ts +46 -0
- package/src/migrator/index.ts +0 -0
- package/src/migrator/migrator.ts +97 -0
- package/src/serializer/serializer.ts +336 -0
- package/src/tables/abstractTable.ts +188 -0
- package/src/tables/index.ts +4 -0
- package/src/tables/inferTypes.ts +67 -0
- package/src/tables/migrationsTable.ts +11 -0
- package/src/types/type.ts +15 -0
- package/src/utils/ecranate.ts +4 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/* eslint-disable max-len */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
|
+
import { Create, DbConnector } from '../..';
|
|
4
|
+
import { eq } from '../../builders';
|
|
5
|
+
import ConsoleLogger from '../../logger/consoleLogger';
|
|
6
|
+
import { ExtractModel } from '../../tables/inferTypes';
|
|
7
|
+
import CitiesTable from '../tables/citiesTable';
|
|
8
|
+
import UserGroupsTable from '../tables/userGroupsTable';
|
|
9
|
+
import UsersTable from '../tables/usersTable';
|
|
10
|
+
import UsersToUserGroupsTable from '../tables/usersToUserGroups';
|
|
11
|
+
|
|
12
|
+
(async () => {
|
|
13
|
+
try {
|
|
14
|
+
const db = await new DbConnector()
|
|
15
|
+
.connectionString('postgresql://postgres@127.0.0.1/migrator')
|
|
16
|
+
.connect();
|
|
17
|
+
|
|
18
|
+
db.useLogger(new ConsoleLogger());
|
|
19
|
+
|
|
20
|
+
const usersTable = new UsersTable(db);
|
|
21
|
+
const citiesTable = new CitiesTable(db);
|
|
22
|
+
const usersToUserGroupsTable = new UsersToUserGroupsTable(db);
|
|
23
|
+
const userGroupsTable = new UserGroupsTable(db);
|
|
24
|
+
|
|
25
|
+
// await db.session().execute(Create.table(usersTable).build());
|
|
26
|
+
// await db.session().execute(Create.table(citiesTable).build());
|
|
27
|
+
// await db.session().execute(Create.table(userGroupsTable).build());
|
|
28
|
+
// await db.session().execute(Create.table(usersToUserGroupsTable).build());
|
|
29
|
+
|
|
30
|
+
const userRes = await usersTable.insertMany([{
|
|
31
|
+
decimalField: 4.2,
|
|
32
|
+
createdAt: new Date(),
|
|
33
|
+
role: 'foo',
|
|
34
|
+
}, {
|
|
35
|
+
decimalField: 5.8,
|
|
36
|
+
createdAt: new Date(),
|
|
37
|
+
role: 'foo',
|
|
38
|
+
}]).all();
|
|
39
|
+
|
|
40
|
+
const citiesRes = await citiesTable.insertMany([{
|
|
41
|
+
foundationDate: new Date(),
|
|
42
|
+
userId: userRes[0]?.id!,
|
|
43
|
+
}, {
|
|
44
|
+
foundationDate: new Date(),
|
|
45
|
+
userId: userRes[1]?.id!,
|
|
46
|
+
}]).all();
|
|
47
|
+
|
|
48
|
+
const userGroups = await userGroupsTable.insertMany([{
|
|
49
|
+
name: 'firstGroup',
|
|
50
|
+
}, {
|
|
51
|
+
name: 'secondGroup',
|
|
52
|
+
}]).all();
|
|
53
|
+
|
|
54
|
+
await usersToUserGroupsTable.insertMany([{
|
|
55
|
+
userId: userRes[0]?.id!,
|
|
56
|
+
groupId: userGroups[0]?.id!,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
userId: userRes[1]?.id!,
|
|
60
|
+
groupId: userGroups[1]?.id!,
|
|
61
|
+
}]).execute();
|
|
62
|
+
|
|
63
|
+
// map case
|
|
64
|
+
const userWithCities = await citiesTable.select()
|
|
65
|
+
.where(eq(citiesTable.id, 1))
|
|
66
|
+
.leftJoin(UsersTable,
|
|
67
|
+
(city) => city.userId,
|
|
68
|
+
(users) => users.id)
|
|
69
|
+
.execute();
|
|
70
|
+
|
|
71
|
+
const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user }));
|
|
72
|
+
|
|
73
|
+
// foreach case
|
|
74
|
+
// const userWithCities1 = await citiesTable.select()
|
|
75
|
+
// .where(eq(citiesTable.id, 1))
|
|
76
|
+
// .leftJoin(UsersTable,
|
|
77
|
+
// (city) => city.userId,
|
|
78
|
+
// (users) => users.id)
|
|
79
|
+
// .execute();
|
|
80
|
+
|
|
81
|
+
// let user;
|
|
82
|
+
// const cities = [];
|
|
83
|
+
|
|
84
|
+
// userWithCities.foreach((dbCity, dbUser) => {
|
|
85
|
+
// cities.push(dbCity);
|
|
86
|
+
// user = dbUser;
|
|
87
|
+
// });
|
|
88
|
+
|
|
89
|
+
// const usersTable = new UsersTable(db);
|
|
90
|
+
// const citiesTable = new CitiesTable(db);
|
|
91
|
+
|
|
92
|
+
const sdf = await citiesTable.select({
|
|
93
|
+
id: citiesTable.id,
|
|
94
|
+
userId: citiesTable.userId,
|
|
95
|
+
}).where(eq(citiesTable.id, 1))
|
|
96
|
+
.leftJoin(UsersTable,
|
|
97
|
+
(city) => city.userId,
|
|
98
|
+
(users) => users.id,
|
|
99
|
+
{
|
|
100
|
+
id: usersTable.id,
|
|
101
|
+
})
|
|
102
|
+
.execute();
|
|
103
|
+
|
|
104
|
+
// group case
|
|
105
|
+
const usersWithUserGroups = await usersToUserGroupsTable.select()
|
|
106
|
+
.where(eq(userGroupsTable.id, 1))
|
|
107
|
+
.leftJoin(UsersTable,
|
|
108
|
+
(userToGroup) => userToGroup.userId,
|
|
109
|
+
(users) => users.id,
|
|
110
|
+
{
|
|
111
|
+
id: usersTable.id,
|
|
112
|
+
})
|
|
113
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
114
|
+
(userToGroup) => userToGroup.groupId,
|
|
115
|
+
(userGroup) => userGroup.id,
|
|
116
|
+
{
|
|
117
|
+
id: userGroupsTable.id,
|
|
118
|
+
})
|
|
119
|
+
.execute();
|
|
120
|
+
|
|
121
|
+
const userGroupWithUsers = usersWithUserGroups.group({
|
|
122
|
+
one: (_, dbUser, dbUserGroup) => dbUser!,
|
|
123
|
+
many: (_, dbUser, dbUserGroup) => dbUserGroup!,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// const userWithGroups: ExtractModel<UsersTable> & { groups: ExtractModel<UserGroupsTable>[] } = {
|
|
127
|
+
// ...userGroupWithUsers.one,
|
|
128
|
+
// groups: userGroupWithUsers.many,
|
|
129
|
+
// };
|
|
130
|
+
|
|
131
|
+
// console.log('city', city!);
|
|
132
|
+
// console.log('cityUsers', cityUsers);
|
|
133
|
+
// console.log('cityWithUsers', forEachCities);
|
|
134
|
+
// console.log('cityWithUsers1', forEachUsers);
|
|
135
|
+
|
|
136
|
+
// how to handle many-to-many relations
|
|
137
|
+
} catch (e) {
|
|
138
|
+
console.log(e);
|
|
139
|
+
}
|
|
140
|
+
})();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { Create, DbConnector } from '../..';
|
|
3
|
+
import {
|
|
4
|
+
and, eq, like, or,
|
|
5
|
+
} from '../../builders';
|
|
6
|
+
import Order from '../../builders/highLvlBuilders/order';
|
|
7
|
+
import {
|
|
8
|
+
greater, greaterEq, inArray, isNull, less, lessEq, notEq,
|
|
9
|
+
} from '../../builders/requestBuilders/where/static';
|
|
10
|
+
import ConsoleLogger from '../../logger/consoleLogger';
|
|
11
|
+
import UsersTable from '../tables/usersTable';
|
|
12
|
+
|
|
13
|
+
(async () => {
|
|
14
|
+
try {
|
|
15
|
+
const db = await new DbConnector()
|
|
16
|
+
.connectionString('postgresql://postgres@127.0.0.1/migrator')
|
|
17
|
+
.connect();
|
|
18
|
+
|
|
19
|
+
const usersTable = new UsersTable(db);
|
|
20
|
+
|
|
21
|
+
db.useLogger(new ConsoleLogger());
|
|
22
|
+
|
|
23
|
+
// select all
|
|
24
|
+
const allSelect = await usersTable.select().all();
|
|
25
|
+
|
|
26
|
+
// select first
|
|
27
|
+
const firstSelect = await usersTable.select().all();
|
|
28
|
+
|
|
29
|
+
// select using filters
|
|
30
|
+
const eqSelect = await usersTable.select().where(eq(usersTable.phone, 'hello')).all();
|
|
31
|
+
|
|
32
|
+
const andSelect = await usersTable.select().where(
|
|
33
|
+
and([eq(usersTable.phone, 'hello')]),
|
|
34
|
+
).all();
|
|
35
|
+
|
|
36
|
+
const orSelect = await usersTable.select().where(
|
|
37
|
+
or([eq(usersTable.phone, 'hello')]),
|
|
38
|
+
).all();
|
|
39
|
+
|
|
40
|
+
// select using limit, offset
|
|
41
|
+
const limitOffsetSelect = await usersTable.select().limit(20).offset(20).all();
|
|
42
|
+
|
|
43
|
+
const likeSelect = await usersTable.select().where(like(usersTable.phone, 'hello')).all();
|
|
44
|
+
|
|
45
|
+
const inArraySelect = await usersTable.select().where(inArray(usersTable.phone, ['hello'])).all();
|
|
46
|
+
|
|
47
|
+
const greaterSelect = await usersTable.select().where(greater(usersTable.bigIntField, 3)).all();
|
|
48
|
+
|
|
49
|
+
const lessSelect = await usersTable.select().where(less(usersTable.bigIntField, 3)).all();
|
|
50
|
+
|
|
51
|
+
const greaterEqSelect = await usersTable.select().where(greaterEq(usersTable.bigIntField, 3))
|
|
52
|
+
.all();
|
|
53
|
+
|
|
54
|
+
const lessEqSelect = await usersTable.select().where(lessEq(usersTable.bigIntField, 3));
|
|
55
|
+
|
|
56
|
+
const isNullSelect = await usersTable.select().where(isNull(usersTable.phone)).all();
|
|
57
|
+
|
|
58
|
+
const notEqSelect = await usersTable.select().where(notEq(usersTable.phone, 'hello')).all();
|
|
59
|
+
|
|
60
|
+
const partialSelect = await usersTable.select({
|
|
61
|
+
mappedId: usersTable.id,
|
|
62
|
+
mappedPhone: usersTable.phone,
|
|
63
|
+
}).all();
|
|
64
|
+
|
|
65
|
+
// const { mappedId, mappedPhone } = partialSelect;
|
|
66
|
+
|
|
67
|
+
// ordered select
|
|
68
|
+
const ordered = await usersTable.select().orderBy((table) => table.phone, Order.ASC).all();
|
|
69
|
+
} catch (e) {
|
|
70
|
+
console.log(e);
|
|
71
|
+
}
|
|
72
|
+
})();
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { DbConnector } from '../..';
|
|
3
|
+
import { eq } from '../../builders';
|
|
4
|
+
import ConsoleLogger from '../../logger/consoleLogger';
|
|
5
|
+
import CitiesTable from '../tables/citiesTable';
|
|
6
|
+
import UserGroupsTable from '../tables/userGroupsTable';
|
|
7
|
+
import UsersTable from '../tables/usersTable';
|
|
8
|
+
|
|
9
|
+
(async () => {
|
|
10
|
+
try {
|
|
11
|
+
const db = await new DbConnector()
|
|
12
|
+
.connectionString('postgresql://postgres@127.0.0.1/migrator')
|
|
13
|
+
.connect();
|
|
14
|
+
|
|
15
|
+
db.useLogger(new ConsoleLogger());
|
|
16
|
+
|
|
17
|
+
const usersTable = new UsersTable(db);
|
|
18
|
+
const citiesTable = new CitiesTable(db);
|
|
19
|
+
const userGroupsTable = new UserGroupsTable(db);
|
|
20
|
+
|
|
21
|
+
await usersTable.update()
|
|
22
|
+
.where(eq(usersTable.phone, 'hello'))
|
|
23
|
+
.set({ fullName: 'newName' })
|
|
24
|
+
.execute();
|
|
25
|
+
|
|
26
|
+
const updatedCities = await citiesTable.update()
|
|
27
|
+
.where(eq(citiesTable.location, 'USA'))
|
|
28
|
+
.set({ metadata: { population: 1, connection: 'first' } })
|
|
29
|
+
.all();
|
|
30
|
+
|
|
31
|
+
console.log(updatedCities);
|
|
32
|
+
|
|
33
|
+
const updatedUserGroup = await userGroupsTable.update()
|
|
34
|
+
.where(eq(userGroupsTable.id, 1))
|
|
35
|
+
.set({ description: 'updated description' })
|
|
36
|
+
.all();
|
|
37
|
+
} catch (e) {
|
|
38
|
+
console.log(e);
|
|
39
|
+
}
|
|
40
|
+
})();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import AbstractTable from '../../tables/abstractTable';
|
|
2
|
+
import UsersTable from './usersTable';
|
|
3
|
+
|
|
4
|
+
interface CityMeta {
|
|
5
|
+
population: number,
|
|
6
|
+
connection: string,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default class CitiesTable extends AbstractTable<CitiesTable> {
|
|
10
|
+
public id = this.serial('id').primaryKey();
|
|
11
|
+
|
|
12
|
+
public foundationDate = this.timestamp('name').notNull();
|
|
13
|
+
public location = this.varchar('page', { size: 256 });
|
|
14
|
+
|
|
15
|
+
public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onUpdate: 'CASCADE' });
|
|
16
|
+
|
|
17
|
+
public metadata = this.jsonb<CityMeta>('metadata');
|
|
18
|
+
|
|
19
|
+
public tableName(): string {
|
|
20
|
+
return 'cities';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import AbstractTable from '../../tables/abstractTable';
|
|
2
|
+
|
|
3
|
+
export default class UserGroupsTable extends AbstractTable<UserGroupsTable> {
|
|
4
|
+
public id = this.serial('id').primaryKey();
|
|
5
|
+
|
|
6
|
+
public name = this.varchar('name');
|
|
7
|
+
public description = this.varchar('description');
|
|
8
|
+
|
|
9
|
+
public tableName(): string {
|
|
10
|
+
return 'user_groups';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
// import { Defaults } from '../../columns/column';
|
|
3
|
+
import { Defaults } from '../../columns/column';
|
|
4
|
+
import AbstractTable from '../../tables/abstractTable';
|
|
5
|
+
import { createEnum } from '../../types/type';
|
|
6
|
+
// import { rolesEnum } from '../types/rolesType';
|
|
7
|
+
|
|
8
|
+
export const rolesEnum = createEnum({ alias: 'test-enum', values: ['foo', 'bar', 'baz'] });
|
|
9
|
+
|
|
10
|
+
export default class UsersTable extends AbstractTable<UsersTable> {
|
|
11
|
+
public id = this.serial('id').primaryKey();
|
|
12
|
+
public fullName = this.text('full_name');
|
|
13
|
+
|
|
14
|
+
public phone = this.varchar('phone', { size: 256 });
|
|
15
|
+
public media = this.jsonb<string[]>('media');
|
|
16
|
+
public decimalField = this.decimal('test', { precision: 100, scale: 2 }).notNull();
|
|
17
|
+
public bigIntField = this.bigint('test1', 'max_bytes_53');
|
|
18
|
+
public role = this.type(rolesEnum, 'name_in_table').notNull();
|
|
19
|
+
|
|
20
|
+
public createdAt = this.timestamp('created_at').notNull();
|
|
21
|
+
|
|
22
|
+
// public createdAtWithTimezone = this.timestamptz('created_at');
|
|
23
|
+
|
|
24
|
+
public updatedAt = this.timestamp('updated_at').defaultValue(Defaults.CURRENT_TIMESTAMP);
|
|
25
|
+
public isArchived = this.bool('is_archived').defaultValue(false);
|
|
26
|
+
|
|
27
|
+
public phoneFullNameIndex = this.index([this.phone, this.fullName]);
|
|
28
|
+
public phoneIndex = this.uniqueIndex(this.phone);
|
|
29
|
+
|
|
30
|
+
public tableName(): string {
|
|
31
|
+
return 'users';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import AbstractTable from '../../tables/abstractTable';
|
|
2
|
+
import UserGroupsTable from './userGroupsTable';
|
|
3
|
+
import UsersTable from './usersTable';
|
|
4
|
+
|
|
5
|
+
export default class UsersToUserGroupsTable extends AbstractTable<UsersToUserGroupsTable> {
|
|
6
|
+
public groupId = this.int('city_id').foreignKey(UserGroupsTable, (table) => table.id, { onDelete: 'CASCADE' });
|
|
7
|
+
public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onDelete: 'CASCADE' });
|
|
8
|
+
|
|
9
|
+
public manyToManyIndex = this.index([this.groupId, this.userId]);
|
|
10
|
+
|
|
11
|
+
public tableName(): string {
|
|
12
|
+
return 'users_to_user_groups';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
export interface Failure {
|
|
3
|
+
type: PgSessionError;
|
|
4
|
+
reason: Error;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export enum PgSessionError {
|
|
8
|
+
PgQueryExecutionError,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type Either<L, A> = Left<L, A> | Right<L, A>;
|
|
12
|
+
|
|
13
|
+
export class Left<L, A> {
|
|
14
|
+
public readonly value: L;
|
|
15
|
+
|
|
16
|
+
public constructor(value: L) {
|
|
17
|
+
this.value = value;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public isLeft(): this is Left<L, A> {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public isRight(): this is Right<L, A> {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class Right<L, A> {
|
|
30
|
+
public readonly value: A;
|
|
31
|
+
|
|
32
|
+
public constructor(value: A) {
|
|
33
|
+
this.value = value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public isLeft(): this is Left<L, A> {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public isRight(): this is Right<L, A> {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const left = <L, A>(l: L): Either<L, A> => new Left(l);
|
|
46
|
+
|
|
47
|
+
export const right = <L, A>(a: A): Either<L, A> => new Right<L, A>(a);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Expr from '../builders/requestBuilders/where/where';
|
|
2
|
+
import { AbstractColumn } from '../columns/column';
|
|
3
|
+
import ColumnType from '../columns/types/columnType';
|
|
4
|
+
|
|
5
|
+
export enum BuilderType{
|
|
6
|
+
SELECT,
|
|
7
|
+
JOINED_SELECT,
|
|
8
|
+
TWO_JOINED_SELECT,
|
|
9
|
+
DELETE,
|
|
10
|
+
INSERT,
|
|
11
|
+
UPDATE,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default class BuilderError extends Error {
|
|
15
|
+
public constructor(
|
|
16
|
+
builderType: BuilderType,
|
|
17
|
+
tableName: string,
|
|
18
|
+
columns: AbstractColumn<ColumnType>[],
|
|
19
|
+
reason: Error,
|
|
20
|
+
filter?: Expr,
|
|
21
|
+
) {
|
|
22
|
+
super('');
|
|
23
|
+
this.message = ` Error while building select query from ${tableName}\n-----\nIf you see current error, please create [github issue](https://github.com/lambda-direct/drizzle-orm/issues) and provide following information\n
|
|
24
|
+
Reason: ${reason.message}
|
|
25
|
+
Query builder: ${BuilderType[builderType]}
|
|
26
|
+
Table name: ${tableName}
|
|
27
|
+
Filter query: ${filter ? filter.toQuery().query : 'undefined'}
|
|
28
|
+
Values: ${filter ? filter.toQuery().values : 'undefined'}
|
|
29
|
+
Column names: ${columns.map((column) => column.getColumnName()).join(', ')}\n-----\n`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
export class DatabaseSelectError extends Error {
|
|
3
|
+
public constructor(tableName: string, reason: Error, query: string) {
|
|
4
|
+
super(` Got an error, while selecting from ${tableName}. Reason: ${reason.message}. Query to database looks like:\n${query}\n`);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class DatabaseDeleteError extends Error {
|
|
9
|
+
public constructor(tableName: string, reason: Error, query: string) {
|
|
10
|
+
super(` Got an error, while deleting from ${tableName}. Reason: ${reason.message}. Query to database looks like:\n${query}\n`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class DatabaseInsertError extends Error {
|
|
15
|
+
public constructor(tableName: string, reason: Error, query: string) {
|
|
16
|
+
super(` Got an error, while inserting to ${tableName}. Reason: ${reason.message}. Query to database looks like:\n${query}\n`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class DatabaseUpdateError extends Error {
|
|
21
|
+
public constructor(tableName: string, reason: Error, query: string) {
|
|
22
|
+
super(` Got an error, while updating ${tableName}. Reason: ${reason.message}. Query to database looks like:\n${query}\n`);
|
|
23
|
+
}
|
|
24
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* eslint-disable import/export */
|
|
2
|
+
import { ClientConfig } from 'pg';
|
|
3
|
+
import { DB, DbConnector } from './db';
|
|
4
|
+
import Migrator from './migrator/migrator';
|
|
5
|
+
|
|
6
|
+
export * from './db';
|
|
7
|
+
export * from './builders';
|
|
8
|
+
export * from './columns';
|
|
9
|
+
export * from './tables';
|
|
10
|
+
|
|
11
|
+
export const drizzle = {
|
|
12
|
+
async connect(config: ClientConfig): Promise<DB> {
|
|
13
|
+
const dbConnector: DbConnector = new DbConnector().params(config);
|
|
14
|
+
return dbConnector.connect();
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
migrator(db: DB): Migrator {
|
|
18
|
+
return new Migrator(db);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Column } from '../columns/column';
|
|
2
|
+
import ColumnType from '../columns/types/columnType';
|
|
3
|
+
|
|
4
|
+
export default class TableIndex {
|
|
5
|
+
private _columns: Column<ColumnType<any>, boolean, boolean>[] = [];
|
|
6
|
+
private _tableName: string;
|
|
7
|
+
private _isUnique: boolean;
|
|
8
|
+
|
|
9
|
+
public constructor(tableName: string,
|
|
10
|
+
columns: Column<ColumnType<any>, boolean, boolean>[],
|
|
11
|
+
isUnique: boolean = false) {
|
|
12
|
+
this._columns = columns;
|
|
13
|
+
this._tableName = tableName;
|
|
14
|
+
this._isUnique = isUnique;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public getColumns = (): Column<ColumnType<any>, boolean, boolean>[] => this._columns;
|
|
18
|
+
|
|
19
|
+
public indexName = (): string => {
|
|
20
|
+
const columnNames = this._columns.map((column) => column.getColumnName());
|
|
21
|
+
return `${this._tableName}_${columnNames.join('_')}_index`;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
public isUnique = (): boolean => this._isUnique;
|
|
25
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { QueryResult } from 'pg';
|
|
2
|
+
import { AbstractColumn } from '../columns/column';
|
|
3
|
+
import ColumnType from '../columns/types/columnType';
|
|
4
|
+
import { ExtractModel } from '../tables/inferTypes';
|
|
5
|
+
|
|
6
|
+
// eslint-disable-next-line max-len
|
|
7
|
+
// const checkProperties = (obj: any) => Object.values(obj).every((x) => x === null || Number.isNaN(x));
|
|
8
|
+
|
|
9
|
+
export default class QueryResponseMapper {
|
|
10
|
+
public static map = <ITable>(mappedServiceToDb: { [name in keyof ExtractModel<ITable>]
|
|
11
|
+
: AbstractColumn<ColumnType>; },
|
|
12
|
+
queryResult: QueryResult<any>, joinId?: number) => {
|
|
13
|
+
const response: Array<ExtractModel<ITable>> = [];
|
|
14
|
+
|
|
15
|
+
queryResult.rows.forEach((row) => {
|
|
16
|
+
const mappedRow: ExtractModel<ITable> = {} as ExtractModel<ITable>;
|
|
17
|
+
|
|
18
|
+
Object.keys(mappedServiceToDb).forEach((key) => {
|
|
19
|
+
const column = mappedServiceToDb[key as keyof ExtractModel<ITable>];
|
|
20
|
+
const alias = `${column.getAlias()}${joinId ? `_${joinId}` : ''}`;
|
|
21
|
+
const value = column.getColumnType().selectStrategy(row[alias]) as any;
|
|
22
|
+
mappedRow[key as keyof ExtractModel<ITable>] = value === null ? undefined : value;
|
|
23
|
+
});
|
|
24
|
+
response.push(mappedRow);
|
|
25
|
+
});
|
|
26
|
+
return response;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
public static partialMap = <T>(partial: { [name: string]
|
|
30
|
+
: AbstractColumn<ColumnType>; }, queryResult: QueryResult<any>, joinId?: number) => {
|
|
31
|
+
const response: Array<ExtractModel<T>> = [];
|
|
32
|
+
|
|
33
|
+
queryResult.rows.forEach((row) => {
|
|
34
|
+
const mappedRow: ExtractModel<T> = {} as ExtractModel<T>;
|
|
35
|
+
|
|
36
|
+
Object.keys(partial).forEach((key) => {
|
|
37
|
+
const column = partial[key];
|
|
38
|
+
const alias = `${column.getAlias()}${joinId ? `_${joinId}` : ''}`;
|
|
39
|
+
const value = column.getColumnType().selectStrategy(row[alias]) as any;
|
|
40
|
+
mappedRow[key as keyof ExtractModel<T>] = value === null ? undefined : value;
|
|
41
|
+
});
|
|
42
|
+
response.push(mappedRow);
|
|
43
|
+
});
|
|
44
|
+
return response;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax */
|
|
2
|
+
/* eslint-disable import/export */
|
|
3
|
+
/* eslint-disable max-classes-per-file */
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as crypto from 'crypto'
|
|
7
|
+
import { Create } from '../builders';
|
|
8
|
+
import Transaction from '../builders/transaction/transaction';
|
|
9
|
+
import Db from '../db/db';
|
|
10
|
+
import { MigrationsTable } from '../tables';
|
|
11
|
+
|
|
12
|
+
export type InCodeConfig = { migrationFolder: string };
|
|
13
|
+
|
|
14
|
+
export default class Migrator {
|
|
15
|
+
public constructor(private db: Db) {
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public async migrate(configPath: string): Promise<void>
|
|
19
|
+
public async migrate(config: InCodeConfig): Promise<void>
|
|
20
|
+
public async migrate(configPath?: unknown) {
|
|
21
|
+
let migrationFolderTo: string | undefined;
|
|
22
|
+
if (typeof configPath === 'string') {
|
|
23
|
+
const configAsString = fs.readFileSync(path.resolve('.', configPath), 'utf8');
|
|
24
|
+
const splitted = configAsString.trim().split('\n');
|
|
25
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
26
|
+
for (const split of splitted) {
|
|
27
|
+
const entry = split.trim().split(':');
|
|
28
|
+
const key = entry[0];
|
|
29
|
+
const value = entry[1].trim().replace(/['"]+/g, '');
|
|
30
|
+
|
|
31
|
+
if (key === 'migrationRootFolder') {
|
|
32
|
+
// proceed value
|
|
33
|
+
migrationFolderTo = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
migrationFolderTo = (configPath as InCodeConfig).migrationFolder;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!migrationFolderTo) {
|
|
41
|
+
throw Error('no migration folder defined');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const migrationTable = new MigrationsTable(this.db);
|
|
45
|
+
|
|
46
|
+
await this.db.session().execute(Create.table(migrationTable).build());
|
|
47
|
+
|
|
48
|
+
const dbMigrations = await migrationTable.select().all();
|
|
49
|
+
const lastDbMigration = dbMigrations.length > 0
|
|
50
|
+
? dbMigrations[dbMigrations.length - 1]
|
|
51
|
+
: undefined;
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
const files = fs.readdirSync(migrationFolderTo);
|
|
55
|
+
const transaction = new Transaction(this.db.session());
|
|
56
|
+
await transaction.begin();
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
for await (const migrationFolder of files) {
|
|
60
|
+
const migrationFiles = fs.readdirSync(`${migrationFolderTo}/${migrationFolder}`);
|
|
61
|
+
const migrationFile = migrationFiles.filter((file) => file === 'migration.sql')[0];
|
|
62
|
+
|
|
63
|
+
const query = fs.readFileSync(`${migrationFolderTo}/${migrationFolder}/${migrationFile}`).toString();
|
|
64
|
+
|
|
65
|
+
const year = Number(migrationFolder.slice(0, 4));
|
|
66
|
+
// second param for Date() is month index, that started from 0, so we need
|
|
67
|
+
// to decrement a value for month
|
|
68
|
+
const month = Number(migrationFolder.slice(4, 6)) - 1;
|
|
69
|
+
const day = Number(migrationFolder.slice(6, 8));
|
|
70
|
+
const hour = Number(migrationFolder.slice(8, 10));
|
|
71
|
+
const min = Number(migrationFolder.slice(10, 12));
|
|
72
|
+
const sec = Number(migrationFolder.slice(12, 14));
|
|
73
|
+
|
|
74
|
+
const folderAsMillis = new Date(year, month, day, hour, min, sec).getTime();
|
|
75
|
+
if (!lastDbMigration || lastDbMigration.createdAt! < folderAsMillis) {
|
|
76
|
+
await this.db.session().execute(query);
|
|
77
|
+
await migrationTable.insert({
|
|
78
|
+
hash: this.generateHash(query),
|
|
79
|
+
createdAt: folderAsMillis,
|
|
80
|
+
}).execute();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
await transaction.commit();
|
|
85
|
+
} catch (e) {
|
|
86
|
+
// if (this.db.logger()) {
|
|
87
|
+
// this.db.logger()!.error(e);
|
|
88
|
+
// }
|
|
89
|
+
transaction.rollback();
|
|
90
|
+
throw e
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private generateHash(value: string): string {
|
|
95
|
+
return crypto.createHash('sha256').update(value).digest('hex')
|
|
96
|
+
}
|
|
97
|
+
}
|