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,336 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
/* eslint-disable import/no-named-as-default-member */
|
|
3
|
+
/* eslint-disable import/no-named-as-default */
|
|
4
|
+
/* eslint-disable no-param-reassign */
|
|
5
|
+
/* eslint-disable no-restricted-syntax */
|
|
6
|
+
|
|
7
|
+
import { Column } from '../columns';
|
|
8
|
+
import ColumnType from '../columns/types/columnType';
|
|
9
|
+
import { DB } from '../db';
|
|
10
|
+
import TableIndex from '../indexes/tableIndex';
|
|
11
|
+
import { AbstractTable } from '../tables';
|
|
12
|
+
import Enum from '../types/type';
|
|
13
|
+
|
|
14
|
+
interface EnumsAsObject {
|
|
15
|
+
[name: string]: {
|
|
16
|
+
name: string,
|
|
17
|
+
values: string[]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface ColumnAsObject {
|
|
22
|
+
[name: string]: {
|
|
23
|
+
name?: string;
|
|
24
|
+
type?: string;
|
|
25
|
+
primaryKey?: boolean;
|
|
26
|
+
unique?: boolean;
|
|
27
|
+
default?: any;
|
|
28
|
+
notNull?: boolean;
|
|
29
|
+
references?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface IndexColumnAsObject {
|
|
34
|
+
[name: string]: {
|
|
35
|
+
name?: string;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface IndexAsObject {
|
|
40
|
+
[name: string]: {
|
|
41
|
+
name?: string;
|
|
42
|
+
columns?: ColumnAsObject;
|
|
43
|
+
isUnique?: boolean
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface TableAsObject {
|
|
48
|
+
[name: string]: {
|
|
49
|
+
name: string;
|
|
50
|
+
columns: ColumnAsObject;
|
|
51
|
+
indexes: {
|
|
52
|
+
[name: string]: {
|
|
53
|
+
name?: string;
|
|
54
|
+
type?: string;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const serialiseForeignKey = (fkName:string, table:string, column:string, onDelete?:string, onUpdate?:string)=>{
|
|
61
|
+
return`${fkName};${table};${column};${onDelete??''};${onUpdate??''}`
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default class MigrationSerializer {
|
|
65
|
+
public generate = (tables: AbstractTable<any>[], enums: Enum<any>[]) => {
|
|
66
|
+
const result: TableAsObject = {};
|
|
67
|
+
|
|
68
|
+
for (const table of tables) {
|
|
69
|
+
const tableEntries = Object.entries(table);
|
|
70
|
+
const columnToReturn: ColumnAsObject = {};
|
|
71
|
+
const indexToReturn: IndexAsObject = {};
|
|
72
|
+
|
|
73
|
+
for (const properties of tableEntries) {
|
|
74
|
+
const value = properties[1];
|
|
75
|
+
if (value instanceof TableIndex) {
|
|
76
|
+
const columns = value.getColumns();
|
|
77
|
+
const name = value.indexName();
|
|
78
|
+
|
|
79
|
+
const indexColumnToReturn: IndexColumnAsObject = {};
|
|
80
|
+
|
|
81
|
+
for (const column of columns) {
|
|
82
|
+
const columnName = column.getColumnName();
|
|
83
|
+
indexColumnToReturn[columnName] = {
|
|
84
|
+
name: columnName,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
indexToReturn[name] = {
|
|
89
|
+
name,
|
|
90
|
+
columns: indexColumnToReturn,
|
|
91
|
+
isUnique: value.isUnique(),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (value instanceof Column) {
|
|
96
|
+
columnToReturn[value.getColumnName()] = {
|
|
97
|
+
name: value.getColumnName(),
|
|
98
|
+
type: (value.getColumnType() as ColumnType).getDbName(),
|
|
99
|
+
primaryKey: !!value.primaryKeyName,
|
|
100
|
+
// unique: !!value.uniqueKeyName,
|
|
101
|
+
// default: value.getDefaultValue() === null ? undefined : value.getDefaultValue(),
|
|
102
|
+
notNull: !value.isNullableFlag,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
if (value.getDefaultValue() !== undefined && value.getDefaultValue() !== null) {
|
|
106
|
+
columnToReturn[value.getColumnName()].default = value.getDefaultValue();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (value.uniqueKeyName) {
|
|
110
|
+
const indexName = `${value.getParent().tableName()}_${value.getColumnName()}_index`;
|
|
111
|
+
|
|
112
|
+
const indexColumnToReturn: IndexColumnAsObject = {};
|
|
113
|
+
indexColumnToReturn[value.getColumnName()] = {
|
|
114
|
+
name: value.getColumnName(),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
indexToReturn[indexName] = {
|
|
118
|
+
name: indexName,
|
|
119
|
+
columns: indexColumnToReturn,
|
|
120
|
+
isUnique: true,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const referenced = value.getReferenced();
|
|
125
|
+
if (referenced) {
|
|
126
|
+
const fkName=`${value.getParent().tableName()}_${value.getColumnName()}_fkey`;
|
|
127
|
+
const table = referenced.getParentName();
|
|
128
|
+
const column = referenced.getColumnName();
|
|
129
|
+
const onDelete= value.getOnDelete();
|
|
130
|
+
const onUpdate= value.getOnUpdate();
|
|
131
|
+
|
|
132
|
+
const referenceString = serialiseForeignKey(fkName,table,column,onDelete,onUpdate)
|
|
133
|
+
columnToReturn[value.getColumnName()].references = referenceString;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
result[table.tableName()] = {
|
|
139
|
+
name: table.tableName(),
|
|
140
|
+
columns: columnToReturn,
|
|
141
|
+
indexes: indexToReturn,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const enumsToReturn = enums.reduce<{[key:string]: Enum<any>}>((map, obj) => {
|
|
146
|
+
const key = obj.name;
|
|
147
|
+
const newValues = obj.values.reduce((mapped, value) => {
|
|
148
|
+
mapped[value] = value;
|
|
149
|
+
return mapped;
|
|
150
|
+
}, {});
|
|
151
|
+
|
|
152
|
+
map[key] = { name: obj.name, values: newValues };
|
|
153
|
+
return map;
|
|
154
|
+
}, {});
|
|
155
|
+
|
|
156
|
+
return { version: '2', tables: result, enums: enumsToReturn };
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
public fromDatabase = async (db: DB) => {
|
|
160
|
+
const result: TableAsObject = {};
|
|
161
|
+
|
|
162
|
+
const allTables = await db.session().execute('SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema != \'pg_catalog\' and table_schema != \'information_schema\';');
|
|
163
|
+
for await (const row of allTables.rows) {
|
|
164
|
+
try {
|
|
165
|
+
// const tableSchema = row.table_schema;
|
|
166
|
+
const tableName = row.table_name;
|
|
167
|
+
|
|
168
|
+
const columnToReturn: ColumnAsObject = {};
|
|
169
|
+
const indexToReturn: IndexAsObject = {};
|
|
170
|
+
|
|
171
|
+
const tableResponse = await db.session().execute(`SELECT a.attrelid::regclass::text, a.attname
|
|
172
|
+
, CASE WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[])
|
|
173
|
+
AND EXISTS (
|
|
174
|
+
SELECT FROM pg_attrdef ad
|
|
175
|
+
WHERE ad.adrelid = a.attrelid
|
|
176
|
+
AND ad.adnum = a.attnum
|
|
177
|
+
AND pg_get_expr(ad.adbin, ad.adrelid)
|
|
178
|
+
= 'nextval('''
|
|
179
|
+
|| (pg_get_serial_sequence (a.attrelid::regclass::text
|
|
180
|
+
, a.attname))::regclass
|
|
181
|
+
|| '''::regclass)'
|
|
182
|
+
)
|
|
183
|
+
THEN CASE a.atttypid
|
|
184
|
+
WHEN 'int'::regtype THEN 'serial'
|
|
185
|
+
WHEN 'int8'::regtype THEN 'bigserial'
|
|
186
|
+
WHEN 'int2'::regtype THEN 'smallserial'
|
|
187
|
+
END
|
|
188
|
+
ELSE format_type(a.atttypid, a.atttypmod)
|
|
189
|
+
END AS data_type, INFORMATION_SCHEMA.COLUMNS.table_name, INFORMATION_SCHEMA.COLUMNS.column_name, INFORMATION_SCHEMA.COLUMNS.column_default
|
|
190
|
+
FROM pg_attribute a
|
|
191
|
+
JOIN INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.COLUMNS.column_name = a.attname
|
|
192
|
+
WHERE a.attrelid = '${tableName}'::regclass and INFORMATION_SCHEMA.COLUMNS.table_name = '${tableName}'
|
|
193
|
+
AND a.attnum > 0
|
|
194
|
+
AND NOT a.attisdropped
|
|
195
|
+
ORDER BY a.attnum;`);
|
|
196
|
+
const tableConstraints = await db.session().execute(`SELECT c.column_name, c.data_type, constraint_type, constraint_name
|
|
197
|
+
FROM information_schema.table_constraints tc
|
|
198
|
+
JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
|
|
199
|
+
JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema
|
|
200
|
+
AND tc.table_name = c.table_name AND ccu.column_name = c.column_name
|
|
201
|
+
WHERE tc.table_name = '${tableName}';`);
|
|
202
|
+
|
|
203
|
+
const tableForeignKeys = await db.session().execute(`SELECT
|
|
204
|
+
tc.table_schema,
|
|
205
|
+
tc.constraint_name,
|
|
206
|
+
tc.table_name,
|
|
207
|
+
kcu.column_name,
|
|
208
|
+
ccu.table_schema AS foreign_table_schema,
|
|
209
|
+
ccu.table_name AS foreign_table_name,
|
|
210
|
+
ccu.column_name AS foreign_column_name,
|
|
211
|
+
rc.delete_rule, rc.update_rule
|
|
212
|
+
FROM
|
|
213
|
+
information_schema.table_constraints AS tc
|
|
214
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
215
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
216
|
+
AND tc.table_schema = kcu.table_schema
|
|
217
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
218
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
219
|
+
AND ccu.table_schema = tc.table_schema
|
|
220
|
+
JOIN information_schema.referential_constraints AS rc
|
|
221
|
+
ON ccu.constraint_name = rc.constraint_name
|
|
222
|
+
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='${tableName}';`);
|
|
223
|
+
|
|
224
|
+
const mappedRefernces: { [name: string]: string } = {};
|
|
225
|
+
|
|
226
|
+
for (const fk of tableForeignKeys.rows) {
|
|
227
|
+
// const tableFrom = fk.table_name;
|
|
228
|
+
const columnFrom = fk.column_name;
|
|
229
|
+
const tableTo = fk.foreign_table_name;
|
|
230
|
+
const columnTo = fk.foreign_column_name;
|
|
231
|
+
const foreignKeyName = fk.constraint_name;
|
|
232
|
+
const onUpdate = fk.update_rule;
|
|
233
|
+
const onDelete = fk.delete_rule;
|
|
234
|
+
const references = serialiseForeignKey(foreignKeyName,tableTo,columnTo,onDelete,onUpdate)
|
|
235
|
+
mappedRefernces[columnFrom] = references
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
for (const columnResponse of tableResponse.rows) {
|
|
239
|
+
const columnName = columnResponse.attname;
|
|
240
|
+
const columnType = columnResponse.data_type;
|
|
241
|
+
|
|
242
|
+
const primaryKey = tableConstraints.rows.filter((mapRow) => columnName === mapRow.column_name && mapRow.constraint_type === 'PRIMARY KEY');
|
|
243
|
+
const uniqueKey = tableConstraints.rows.filter((mapRow) => columnName === mapRow.column_name && mapRow.constraint_type === 'UNIQUE');
|
|
244
|
+
|
|
245
|
+
const defaultValue: string = columnResponse.column_default === null
|
|
246
|
+
? undefined : columnResponse.column_default;
|
|
247
|
+
|
|
248
|
+
const isSerial = columnType === 'serial';
|
|
249
|
+
|
|
250
|
+
columnToReturn[columnName] = {
|
|
251
|
+
name: columnName,
|
|
252
|
+
type: columnType,
|
|
253
|
+
primaryKey: !!primaryKey[0],
|
|
254
|
+
unique: !!uniqueKey[0],
|
|
255
|
+
default: isSerial ? undefined : defaultValue,
|
|
256
|
+
notNull: !columnResponse.is_nullable,
|
|
257
|
+
references: mappedRefernces[columnName] ?? undefined,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const dbIndexes = await db.session().execute(`select
|
|
262
|
+
t.relname as table_name,
|
|
263
|
+
i.relname as index_name,
|
|
264
|
+
a.attname as column_name
|
|
265
|
+
from
|
|
266
|
+
pg_class t,
|
|
267
|
+
pg_class i,
|
|
268
|
+
pg_index ix,
|
|
269
|
+
pg_attribute a
|
|
270
|
+
where
|
|
271
|
+
t.oid = ix.indrelid
|
|
272
|
+
and i.oid = ix.indexrelid
|
|
273
|
+
and a.attrelid = t.oid
|
|
274
|
+
and a.attnum = ANY(ix.indkey)
|
|
275
|
+
and t.relkind = 'r'
|
|
276
|
+
and t.relname = '${tableName}'
|
|
277
|
+
order by
|
|
278
|
+
t.relname,
|
|
279
|
+
i.relname;`);
|
|
280
|
+
|
|
281
|
+
for (const dbIndex of dbIndexes.rows) {
|
|
282
|
+
const indexName = dbIndex.index_name;
|
|
283
|
+
const indexColumnName = dbIndex.column_name;
|
|
284
|
+
|
|
285
|
+
if (indexToReturn[indexName] !== undefined && indexToReturn[indexName] !== null) {
|
|
286
|
+
indexToReturn[indexName]!.columns![indexColumnName] = {
|
|
287
|
+
name: indexColumnName,
|
|
288
|
+
};
|
|
289
|
+
} else {
|
|
290
|
+
indexToReturn[indexName] = {
|
|
291
|
+
name: indexName,
|
|
292
|
+
columns: {
|
|
293
|
+
[indexColumnName]: {
|
|
294
|
+
name: indexColumnName,
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
result[tableName] = {
|
|
302
|
+
name: tableName,
|
|
303
|
+
columns: columnToReturn,
|
|
304
|
+
indexes: indexToReturn,
|
|
305
|
+
};
|
|
306
|
+
} catch (e) {
|
|
307
|
+
console.log(e);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const allEnums = await db.session().execute(`select n.nspname as enum_schema,
|
|
312
|
+
t.typname as enum_name,
|
|
313
|
+
e.enumlabel as enum_value
|
|
314
|
+
from pg_type t
|
|
315
|
+
join pg_enum e on t.oid = e.enumtypid
|
|
316
|
+
join pg_catalog.pg_namespace n ON n.oid = t.typnamespace;`);
|
|
317
|
+
|
|
318
|
+
const enumsToReturn: EnumsAsObject = {};
|
|
319
|
+
|
|
320
|
+
for (const dbEnum of allEnums.rows) {
|
|
321
|
+
const enumName = dbEnum.enum_name;
|
|
322
|
+
const enumValue = dbEnum.enum_value;
|
|
323
|
+
|
|
324
|
+
if (enumsToReturn[enumName] !== undefined && enumsToReturn[enumName] !== null) {
|
|
325
|
+
enumsToReturn[enumName].values.push(enumValue);
|
|
326
|
+
} else {
|
|
327
|
+
enumsToReturn[enumName] = {
|
|
328
|
+
name: enumName,
|
|
329
|
+
values: [enumValue],
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return { version: '2', tables: result, enums: enumsToReturn };
|
|
335
|
+
};
|
|
336
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import PgVarChar from '../columns/types/pgVarChar';
|
|
2
|
+
import PgTimestamp from '../columns/types/pgTimestamp';
|
|
3
|
+
import PgInteger from '../columns/types/pgInteger';
|
|
4
|
+
import PgBigDecimal from '../columns/types/pgBigDecimal';
|
|
5
|
+
import PgTime from '../columns/types/pgTime';
|
|
6
|
+
import PgBoolean from '../columns/types/pgBoolean';
|
|
7
|
+
import PgText from '../columns/types/pgText';
|
|
8
|
+
import PgJsonb from '../columns/types/pgJsonb';
|
|
9
|
+
import ColumnType from '../columns/types/columnType';
|
|
10
|
+
import InsertTRB from '../builders/highLvlBuilders/insertRequestBuilder';
|
|
11
|
+
import DeleteTRB from '../builders/highLvlBuilders/deleteRequestBuilder';
|
|
12
|
+
import UpdateTRB from '../builders/highLvlBuilders/updateRequestBuilder';
|
|
13
|
+
import SelectTRB from '../builders/highLvlBuilders/selectRequestBuilder';
|
|
14
|
+
import PgBigInt53, { PgBigInt64 } from '../columns/types/pgBigInt';
|
|
15
|
+
import { ISession } from '../db/session';
|
|
16
|
+
import BaseLogger from '../logger/abstractLogger';
|
|
17
|
+
import PgEnum from '../columns/types/pgEnum';
|
|
18
|
+
import DB from '../db/db';
|
|
19
|
+
import { AbstractColumn, Column } from '../columns/column';
|
|
20
|
+
import TableIndex from '../indexes/tableIndex';
|
|
21
|
+
import { ExtractModel } from './inferTypes';
|
|
22
|
+
import Enum, { ExtractEnumValues } from '../types/type';
|
|
23
|
+
import PgSmallInt from '../columns/types/pgSmallInt';
|
|
24
|
+
import PgSerial from '../columns/types/pgSerial';
|
|
25
|
+
import PgTimestamptz from '../columns/types/pgTimestamptz';
|
|
26
|
+
import PgBigSerial53, { PgBigSerial64 } from '../columns/types/pgBigSerial';
|
|
27
|
+
|
|
28
|
+
export default abstract class AbstractTable<TTable extends AbstractTable<TTable>> {
|
|
29
|
+
public db: DB;
|
|
30
|
+
|
|
31
|
+
private _session: ISession;
|
|
32
|
+
private _logger: BaseLogger | undefined;
|
|
33
|
+
|
|
34
|
+
public constructor(db: DB) {
|
|
35
|
+
this._session = db.session();
|
|
36
|
+
this._logger = db.logger();
|
|
37
|
+
this.db = db;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// @TODO document, that you should not use arrow functions for abstract classes
|
|
41
|
+
public abstract tableName(): string;
|
|
42
|
+
|
|
43
|
+
public withLogger = (logger: BaseLogger) => {
|
|
44
|
+
this._logger = logger;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// eslint-disable-next-line max-len
|
|
48
|
+
public select<TType extends ColumnType<any>, TColumn extends AbstractColumn<TType, boolean, boolean, TTable>, T extends {[name: string]: TColumn} = {}>(partial?: T): SelectTRB<TTable, T> {
|
|
49
|
+
if (!this._session) {
|
|
50
|
+
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)`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return new SelectTRB(
|
|
54
|
+
this._session,
|
|
55
|
+
this.mapServiceToDb(),
|
|
56
|
+
{},
|
|
57
|
+
this,
|
|
58
|
+
this._logger,
|
|
59
|
+
partial,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public update = (): UpdateTRB<TTable> => {
|
|
64
|
+
if (!this._session) {
|
|
65
|
+
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)`);
|
|
66
|
+
}
|
|
67
|
+
return new UpdateTRB(this, this._session, this.mapServiceToDb(), this._logger);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
public insert = (value: ExtractModel<TTable>):
|
|
71
|
+
InsertTRB<TTable> => {
|
|
72
|
+
if (!this._session) {
|
|
73
|
+
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)`);
|
|
74
|
+
}
|
|
75
|
+
return new InsertTRB([value], this._session,
|
|
76
|
+
this.mapServiceToDb(), this, this._logger);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
public insertMany = (values: ExtractModel<TTable>[]):
|
|
80
|
+
InsertTRB<TTable> => {
|
|
81
|
+
if (!this._session) {
|
|
82
|
+
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)`);
|
|
83
|
+
}
|
|
84
|
+
return new InsertTRB(values, this._session,
|
|
85
|
+
this.mapServiceToDb(), this, this._logger);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
public delete = (): DeleteTRB<TTable> => {
|
|
89
|
+
if (!this._session) {
|
|
90
|
+
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)`);
|
|
91
|
+
}
|
|
92
|
+
return new DeleteTRB(this, this._session, this.mapServiceToDb(), this._logger);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
public mapServiceToDb(): {[name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>} {
|
|
96
|
+
return Object.getOwnPropertyNames(this)
|
|
97
|
+
.reduce<{[name in keyof ExtractModel<TTable>]
|
|
98
|
+
: AbstractColumn<ColumnType>}>((res, fieldName) => {
|
|
99
|
+
const field: unknown = (this as unknown as TTable)[fieldName as keyof TTable];
|
|
100
|
+
if (field instanceof AbstractColumn) {
|
|
101
|
+
res[fieldName as keyof ExtractModel<TTable>] = field;
|
|
102
|
+
}
|
|
103
|
+
return res;
|
|
104
|
+
}, {} as {[name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
protected index(columns: Array<Column<ColumnType, boolean, boolean>>): TableIndex
|
|
108
|
+
protected index(columns: Column<ColumnType, boolean, boolean>): TableIndex
|
|
109
|
+
protected index(columns: any) {
|
|
110
|
+
return new TableIndex(this.tableName(), columns instanceof Array ? columns : [columns]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
protected uniqueIndex(columns: Array<Column<ColumnType, boolean, boolean>>): TableIndex
|
|
114
|
+
protected uniqueIndex(columns: Column<ColumnType, boolean, boolean>): TableIndex
|
|
115
|
+
protected uniqueIndex(columns: any) {
|
|
116
|
+
return new TableIndex(this.tableName(), columns instanceof Array ? columns : [columns], true);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
protected varchar(name: string, params: {size?: number} = {})
|
|
120
|
+
: Column<PgVarChar, true, false, this> {
|
|
121
|
+
return new Column(this, name, new PgVarChar(params.size));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
protected int(name: string): Column<PgInteger, true, false, this> {
|
|
125
|
+
return new Column(this, name, new PgInteger());
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
protected smallInt(name: string): Column<PgSmallInt, true, false, this> {
|
|
129
|
+
return new Column(this, name, new PgSmallInt());
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
protected serial(name: string): Column<PgSerial, true, true, this> {
|
|
133
|
+
return new Column(this, name, new PgSerial());
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
protected bigSerial(name: string, maxBytes: 'max_bytes_53'): Column<PgBigSerial53, true, true, this>
|
|
137
|
+
protected bigSerial(name: string, maxBytes: 'max_bytes_64'): Column<PgBigSerial64, true, true, this>
|
|
138
|
+
protected bigSerial(name: string, maxBytes: 'max_bytes_53' | 'max_bytes_64') {
|
|
139
|
+
if (maxBytes === 'max_bytes_53') {
|
|
140
|
+
return new Column(this, name, new PgBigSerial53());
|
|
141
|
+
}
|
|
142
|
+
return new Column(this, name, new PgBigSerial64());
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
protected timestamp(name: string): Column<PgTimestamp, true, false, this> {
|
|
146
|
+
return new Column(this, name, new PgTimestamp());
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
protected timestamptz(name: string): Column<PgTimestamptz, true, false, this> {
|
|
150
|
+
return new Column(this, name, new PgTimestamptz());
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
protected bigint(name: string, maxBytes: 'max_bytes_53'): Column<PgBigInt53, true, false, this>
|
|
154
|
+
protected bigint(name: string, maxBytes: 'max_bytes_64'): Column<PgBigInt64, true, false, this>
|
|
155
|
+
protected bigint(name: string, maxBytes: 'max_bytes_53' | 'max_bytes_64') {
|
|
156
|
+
if (maxBytes === 'max_bytes_53') {
|
|
157
|
+
return new Column(this, name, new PgBigInt53());
|
|
158
|
+
}
|
|
159
|
+
return new Column(this, name, new PgBigInt64());
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
protected type<ETtype extends string>(typeEnum: Enum<ETtype>, name: string)
|
|
163
|
+
: Column<PgEnum<ExtractEnumValues<Enum<ETtype>>>, true, false, this> {
|
|
164
|
+
const pgEnum = new PgEnum<ExtractEnumValues<typeof typeEnum>>(typeEnum.name);
|
|
165
|
+
return new Column(this, name, pgEnum);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected decimal(name: string, params: { precision?: number, scale?: number}
|
|
169
|
+
= {}): Column<PgBigDecimal, true, false, this> {
|
|
170
|
+
return new Column(this, name, new PgBigDecimal(params.precision, params.scale));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
protected time(name: string): Column<PgTime, true, false, this> {
|
|
174
|
+
return new Column(this, name, new PgTime());
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
protected bool(name: string): Column<PgBoolean, true, false, this> {
|
|
178
|
+
return new Column(this, name, new PgBoolean());
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
protected text(name: string): Column<PgText, true, false, this> {
|
|
182
|
+
return new Column(this, name, new PgText());
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
protected jsonb<TSubType>(name: string): Column<PgJsonb<TSubType>, true, false, this> {
|
|
186
|
+
return new Column(this, name, new PgJsonb<TSubType>());
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* eslint-disable max-len */
|
|
2
|
+
import { UpdateCustomExpr } from '../builders/requestBuilders/updates/updates';
|
|
3
|
+
import { AbstractColumn, Column, IndexedColumn } from '../columns/column';
|
|
4
|
+
import ColumnType from '../columns/types/columnType';
|
|
5
|
+
import TableIndex from '../indexes/tableIndex';
|
|
6
|
+
import Type from '../types/type';
|
|
7
|
+
import AbstractTable from './abstractTable';
|
|
8
|
+
|
|
9
|
+
export type ExtractFieldNames<TTable> = {
|
|
10
|
+
[Key in keyof TTable]: TTable[Key] extends Function ? never :
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
12
|
+
TTable[Key] extends Column<ColumnType, infer TNullable, infer TAutoIncrement> ?
|
|
13
|
+
true extends TNullable ? never : Key
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
15
|
+
: TTable[Key] extends IndexedColumn<ColumnType, infer TNullable, infer TAutoIncrement> ?
|
|
16
|
+
true extends TNullable ? never : Key:never
|
|
17
|
+
}[keyof TTable];
|
|
18
|
+
|
|
19
|
+
export type ExtractOptionalFieldNames<TTable> = {
|
|
20
|
+
[Key in keyof TTable]: TTable[Key] extends Function ? never :
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
|
+
TTable[Key] extends Column<ColumnType, infer TNullable, infer TAutoIncrement> ?
|
|
23
|
+
true extends TNullable ? Key : never
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
25
|
+
: TTable[Key] extends IndexedColumn<ColumnType, infer TNullable, infer TAutoIncrement> ?
|
|
26
|
+
true extends TNullable ? Key : never : never
|
|
27
|
+
}[keyof TTable];
|
|
28
|
+
|
|
29
|
+
export type ExtractPartialObjectFromColumns<TTable> =
|
|
30
|
+
{[Key in ExtractFieldNames<TTable>]: TTable[Key]} &
|
|
31
|
+
{[Key in ExtractOptionalFieldNames<TTable>]?: TTable[Key] };
|
|
32
|
+
|
|
33
|
+
export type ExtractModel<TTable> =
|
|
34
|
+
{[Key in ExtractFieldNames<TTable>]: ExtractCodeType<TTable[Key]>} &
|
|
35
|
+
{[Key in ExtractOptionalFieldNames<TTable>]?: ExtractCodeType<TTable[Key]>};
|
|
36
|
+
|
|
37
|
+
export type ExtractUpdateModel<TTable> =
|
|
38
|
+
{[Key in ExtractFieldNames<TTable>]:
|
|
39
|
+
ExtractCodeType<TTable[Key]> | UpdateCustomExpr<TTable[Key]>} &
|
|
40
|
+
{[Key in ExtractOptionalFieldNames<TTable>]?:
|
|
41
|
+
ExtractCodeType<TTable[Key]> | UpdateCustomExpr<TTable[Key]> };
|
|
42
|
+
|
|
43
|
+
export type ExtractCodeType<T extends AbstractColumn<ColumnType<any>, boolean, boolean>> =
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
45
|
+
T extends AbstractColumn<ColumnType<infer TCodeType>, infer TNullable, infer TAutoIncrement, any> ?
|
|
46
|
+
TCodeType
|
|
47
|
+
: never;
|
|
48
|
+
|
|
49
|
+
export type ExtractTypeEnum<T extends Type<any>> = T extends Type<infer TEnum>
|
|
50
|
+
? TEnum
|
|
51
|
+
: never;
|
|
52
|
+
|
|
53
|
+
export type Indexing = IndexedColumn<ColumnType, boolean, boolean> | TableIndex;
|
|
54
|
+
|
|
55
|
+
export type AnyColumn = Column<ColumnType, boolean, boolean>
|
|
56
|
+
| IndexedColumn<ColumnType, boolean, boolean>;
|
|
57
|
+
|
|
58
|
+
export type PartialFor<TTable extends AbstractTable<TTable>>
|
|
59
|
+
= {[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>};
|
|
60
|
+
|
|
61
|
+
export type FullOrPartial<TTable extends AbstractTable<TTable>, TPartial extends PartialFor<TTable>>
|
|
62
|
+
= [keyof TPartial] extends [never] ? ExtractModel<TTable>: ExtractModel<TPartial>;
|
|
63
|
+
|
|
64
|
+
export type CheckTwoTypes<TInput, TTable extends AbstractTable<TTable>, TTable1 extends AbstractTable<TTable1>> = TInput extends AbstractTable<TTable> ? TTable : TInput extends AbstractTable<TTable1> ? TTable1 : never;
|
|
65
|
+
export 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;
|
|
66
|
+
export 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;
|
|
67
|
+
export 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;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import AbstractTable from './abstractTable';
|
|
2
|
+
|
|
3
|
+
export default class MigrationsTable extends AbstractTable<MigrationsTable> {
|
|
4
|
+
public id = this.serial('id').primaryKey();
|
|
5
|
+
public hash = this.text('hash').notNull();
|
|
6
|
+
public createdAt = this.bigint('created_at', 'max_bytes_53');
|
|
7
|
+
|
|
8
|
+
public tableName(): string {
|
|
9
|
+
return 'drizzle_migrations';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default class Enum<T extends string> {
|
|
2
|
+
public constructor(
|
|
3
|
+
public name: string,
|
|
4
|
+
public values: T[],
|
|
5
|
+
) {
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type ExtractEnumValues<T> = T extends Enum<infer TValues> ? TValues : never;
|
|
10
|
+
|
|
11
|
+
export function createEnum<T extends string>(
|
|
12
|
+
{ alias, values }:{alias: string, values: T[]},
|
|
13
|
+
): Enum<T> {
|
|
14
|
+
return new Enum(alias, values);
|
|
15
|
+
}
|