vona-module-a-orm 5.0.96 → 5.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +0 -0
- package/cli/entity/metadata/generate.ts +2 -1
- package/cli/model/metadata/generate.ts +6 -2
- package/cli/model/metadata/magic.ts +15 -6
- package/dist/.metadata/index.d.ts +1 -0
- package/dist/.metadata/index.d.ts.map +1 -0
- package/dist/.metadata/locales.d.ts +1 -0
- package/dist/.metadata/locales.d.ts.map +1 -0
- package/dist/.metadata/this.d.ts +1 -0
- package/dist/.metadata/this.d.ts.map +1 -0
- package/dist/bean/aopMethod.transaction.d.ts +2 -1
- package/dist/bean/aopMethod.transaction.d.ts.map +1 -0
- package/dist/bean/bean.database.d.ts +2 -1
- package/dist/bean/bean.database.d.ts.map +1 -0
- package/dist/bean/bean.databaseDialectBase.d.ts +2 -1
- package/dist/bean/bean.databaseDialectBase.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_cache.d.ts +5 -1
- package/dist/bean/bean.model/bean.model_cache.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_crud.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts +3 -1
- package/dist/bean/bean.model/bean.model_crud_inner.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_crud_table.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_crud_table.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_knex.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_knex.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_meta.d.ts +3 -2
- package/dist/bean/bean.model/bean.model_meta.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_utils.d.ts +5 -3
- package/dist/bean/bean.model/bean.model_utils.d.ts.map +1 -0
- package/dist/bean/bean.model/bean.model_view.d.ts +1 -0
- package/dist/bean/bean.model/bean.model_view.d.ts.map +1 -0
- package/dist/bean/bean.model.d.ts +1 -0
- package/dist/bean/bean.model.d.ts.map +1 -0
- package/dist/bean/bean.modelBase.d.ts +1 -0
- package/dist/bean/bean.modelBase.d.ts.map +1 -0
- package/dist/bean/broadcast.columnsClear.d.ts +2 -1
- package/dist/bean/broadcast.columnsClear.d.ts.map +1 -0
- package/dist/bean/event.clientNameReal.d.ts +2 -1
- package/dist/bean/event.clientNameReal.d.ts.map +1 -0
- package/dist/bean/event.columnsClear.d.ts +2 -1
- package/dist/bean/event.columnsClear.d.ts.map +1 -0
- package/dist/bean/hmr.entity.d.ts +1 -0
- package/dist/bean/hmr.entity.d.ts.map +1 -0
- package/dist/bean/hmr.model.d.ts +1 -0
- package/dist/bean/hmr.model.d.ts.map +1 -0
- package/dist/bean/queue.doubleDelete.d.ts +2 -1
- package/dist/bean/queue.doubleDelete.d.ts.map +1 -0
- package/dist/bean/schedule.softDeletionPrune.d.ts +1 -0
- package/dist/bean/schedule.softDeletionPrune.d.ts.map +1 -0
- package/dist/common/buildWhere.d.ts +1 -0
- package/dist/common/buildWhere.d.ts.map +1 -0
- package/dist/common/checkWhere.d.ts +1 -0
- package/dist/common/checkWhere.d.ts.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/utils.d.ts +2 -1
- package/dist/common/utils.d.ts.map +1 -0
- package/dist/config/config.d.ts +1 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/errors.d.ts +1 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/locale/en-us.d.ts +1 -0
- package/dist/config/locale/en-us.d.ts.map +1 -0
- package/dist/config/locale/zh-cn.d.ts +1 -0
- package/dist/config/locale/zh-cn.d.ts.map +1 -0
- package/dist/extend/index.d.ts +1 -0
- package/dist/extend/index.d.ts.map +1 -0
- package/dist/extend/schemaBuilder.d.ts +1 -0
- package/dist/extend/schemaBuilder.d.ts.map +1 -0
- package/dist/extend/tableBuilder.d.ts +1 -0
- package/dist/extend/tableBuilder.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +94 -15
- package/dist/index.js.map +1 -0
- package/dist/lib/const.d.ts +1 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/databaseDialect.d.ts +1 -0
- package/dist/lib/databaseDialect.d.ts.map +1 -0
- package/dist/lib/dto/dto.d.ts +3 -0
- package/dist/lib/dto/dto.d.ts.map +1 -0
- package/dist/lib/dto/dtoAggregate.d.ts +3 -2
- package/dist/lib/dto/dtoAggregate.d.ts.map +1 -0
- package/dist/lib/dto/dtoCreate.d.ts +2 -1
- package/dist/lib/dto/dtoCreate.d.ts.map +1 -0
- package/dist/lib/dto/dtoGet.d.ts +2 -1
- package/dist/lib/dto/dtoGet.d.ts.map +1 -0
- package/dist/lib/dto/dtoGroup.d.ts +2 -1
- package/dist/lib/dto/dtoGroup.d.ts.map +1 -0
- package/dist/lib/dto/dtoListAndCount.d.ts +4 -0
- package/dist/lib/dto/dtoListAndCount.d.ts.map +1 -0
- package/dist/lib/dto/dtoMutate.d.ts +3 -2
- package/dist/lib/dto/dtoMutate.d.ts.map +1 -0
- package/dist/lib/dto/dtoQuery.d.ts +1 -0
- package/dist/lib/dto/dtoQuery.d.ts.map +1 -0
- package/dist/lib/dto/dtoQueryPage.d.ts +1 -0
- package/dist/lib/dto/dtoQueryPage.d.ts.map +1 -0
- package/dist/lib/dto/dtoSelectAndCount.d.ts +2 -1
- package/dist/lib/dto/dtoSelectAndCount.d.ts.map +1 -0
- package/dist/lib/dto/dtoUpdate.d.ts +2 -1
- package/dist/lib/dto/dtoUpdate.d.ts.map +1 -0
- package/dist/lib/dto/index.d.ts +1 -0
- package/dist/lib/dto/index.d.ts.map +1 -0
- package/dist/lib/entity.d.ts +1 -0
- package/dist/lib/entity.d.ts.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/model.d.ts +1 -0
- package/dist/lib/model.d.ts.map +1 -0
- package/dist/lib/modelCacheBase.d.ts +2 -1
- package/dist/lib/modelCacheBase.d.ts.map +1 -0
- package/dist/lib/relations.d.ts +5 -4
- package/dist/lib/relations.d.ts.map +1 -0
- package/dist/lib/relationsDynamic.d.ts +5 -4
- package/dist/lib/relationsDynamic.d.ts.map +1 -0
- package/dist/lib/relationsMutate.d.ts +4 -3
- package/dist/lib/relationsMutate.d.ts.map +1 -0
- package/dist/lib/relationsStatic.d.ts +1 -0
- package/dist/lib/relationsStatic.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/main.d.ts +2 -1
- package/dist/main.d.ts.map +1 -0
- package/dist/service/cacheEntity_.d.ts +1 -0
- package/dist/service/cacheEntity_.d.ts.map +1 -0
- package/dist/service/cacheQuery_.d.ts +1 -0
- package/dist/service/cacheQuery_.d.ts.map +1 -0
- package/dist/service/columnsCache_.d.ts +2 -1
- package/dist/service/columnsCache_.d.ts.map +1 -0
- package/dist/service/columns_.d.ts +2 -1
- package/dist/service/columns_.d.ts.map +1 -0
- package/dist/service/database.d.ts +2 -1
- package/dist/service/database.d.ts.map +1 -0
- package/dist/service/databaseAsyncLocalStorage_.d.ts +1 -0
- package/dist/service/databaseAsyncLocalStorage_.d.ts.map +1 -0
- package/dist/service/databaseClient_.d.ts +2 -1
- package/dist/service/databaseClient_.d.ts.map +1 -0
- package/dist/service/db_.d.ts +2 -1
- package/dist/service/db_.d.ts.map +1 -0
- package/dist/service/entityResolver_.d.ts +1 -0
- package/dist/service/entityResolver_.d.ts.map +1 -0
- package/dist/service/modelResolver_.d.ts +1 -0
- package/dist/service/modelResolver_.d.ts.map +1 -0
- package/dist/service/relations_.d.ts +2 -1
- package/dist/service/relations_.d.ts.map +1 -0
- package/dist/service/transactionAsyncLocalStorage_.d.ts +1 -0
- package/dist/service/transactionAsyncLocalStorage_.d.ts.map +1 -0
- package/dist/service/transactionConsistency/342/200/214_.d.ts +1 -0
- package/dist/service/transactionConsistency/342/200/214_.d.ts.map +1 -0
- package/dist/service/transactionFiber_.d.ts +1 -0
- package/dist/service/transactionFiber_.d.ts.map +1 -0
- package/dist/service/transactionState_.d.ts +2 -1
- package/dist/service/transactionState_.d.ts.map +1 -0
- package/dist/service/transaction_.d.ts +2 -1
- package/dist/service/transaction_.d.ts.map +1 -0
- package/dist/types/columns.d.ts +1 -0
- package/dist/types/columns.d.ts.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/database.d.ts +1 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/depth.d.ts +1 -0
- package/dist/types/depth.d.ts.map +1 -0
- package/dist/types/dialect.d.ts +1 -0
- package/dist/types/dialect.d.ts.map +1 -0
- package/dist/types/dto/dtoAggregate.d.ts +1 -0
- package/dist/types/dto/dtoAggregate.d.ts.map +1 -0
- package/dist/types/dto/dtoGet.d.ts +3 -2
- package/dist/types/dto/dtoGet.d.ts.map +1 -0
- package/dist/types/dto/dtoGroup.d.ts +1 -0
- package/dist/types/dto/dtoGroup.d.ts.map +1 -0
- package/dist/types/dto/dtoListAndCount.d.ts +8 -0
- package/dist/types/dto/dtoListAndCount.d.ts.map +1 -0
- package/dist/types/dto/dtoMutate.d.ts +8 -9
- package/dist/types/dto/dtoMutate.d.ts.map +1 -0
- package/dist/types/dto/dtoQueryBase.d.ts +1 -0
- package/dist/types/dto/dtoQueryBase.d.ts.map +1 -0
- package/dist/types/dto/dtoQueryPageBase.d.ts +1 -0
- package/dist/types/dto/dtoQueryPageBase.d.ts.map +1 -0
- package/dist/types/dto/dtoSelectAndCount.d.ts +2 -1
- package/dist/types/dto/dtoSelectAndCount.d.ts.map +1 -0
- package/dist/types/dto/index.d.ts +2 -0
- package/dist/types/dto/index.d.ts.map +1 -0
- package/dist/types/entity.d.ts +1 -0
- package/dist/types/entity.d.ts.map +1 -0
- package/dist/types/entityBase.d.ts +1 -0
- package/dist/types/entityBase.d.ts.map +1 -0
- package/dist/types/entityBaseEmpty.d.ts +1 -0
- package/dist/types/entityBaseEmpty.d.ts.map +1 -0
- package/dist/types/entityBaseInner.d.ts +1 -0
- package/dist/types/entityBaseInner.d.ts.map +1 -0
- package/dist/types/entityBaseSimple.d.ts +1 -0
- package/dist/types/entityBaseSimple.d.ts.map +1 -0
- package/dist/types/extra.d.ts +1 -0
- package/dist/types/extra.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.d.ts +1 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/model.d.ts +3 -2
- package/dist/types/model.d.ts.map +1 -0
- package/dist/types/modelAggr.d.ts +2 -1
- package/dist/types/modelAggr.d.ts.map +1 -0
- package/dist/types/modelCount.d.ts +2 -1
- package/dist/types/modelCount.d.ts.map +1 -0
- package/dist/types/modelGeneral.d.ts +4 -3
- package/dist/types/modelGeneral.d.ts.map +1 -0
- package/dist/types/modelGroup.d.ts +2 -1
- package/dist/types/modelGroup.d.ts.map +1 -0
- package/dist/types/modelIncrement.d.ts +19 -0
- package/dist/types/modelIncrement.d.ts.map +1 -0
- package/dist/types/modelWhere.d.ts +2 -1
- package/dist/types/modelWhere.d.ts.map +1 -0
- package/dist/types/onion/databaseDialect.d.ts +1 -0
- package/dist/types/onion/databaseDialect.d.ts.map +1 -0
- package/dist/types/onion/entity.d.ts +1 -0
- package/dist/types/onion/entity.d.ts.map +1 -0
- package/dist/types/onion/index.d.ts +1 -0
- package/dist/types/onion/index.d.ts.map +1 -0
- package/dist/types/onion/model.d.ts +1 -0
- package/dist/types/onion/model.d.ts.map +1 -0
- package/dist/types/onion/table.d.ts +1 -0
- package/dist/types/onion/table.d.ts.map +1 -0
- package/dist/types/relations.d.ts +10 -11
- package/dist/types/relations.d.ts.map +1 -0
- package/dist/types/relationsAggr.d.ts +2 -1
- package/dist/types/relationsAggr.d.ts.map +1 -0
- package/dist/types/relationsColumns.d.ts +5 -4
- package/dist/types/relationsColumns.d.ts.map +1 -0
- package/dist/types/relationsDef.d.ts +5 -4
- package/dist/types/relationsDef.d.ts.map +1 -0
- package/dist/types/relationsDefDynamic.d.ts +6 -5
- package/dist/types/relationsDefDynamic.d.ts.map +1 -0
- package/dist/types/relationsDefMutate.d.ts +1 -0
- package/dist/types/relationsDefMutate.d.ts.map +1 -0
- package/dist/types/relationsGroup.d.ts +1 -0
- package/dist/types/relationsGroup.d.ts.map +1 -0
- package/dist/types/relationsMutate.d.ts +4 -3
- package/dist/types/relationsMutate.d.ts.map +1 -0
- package/dist/types/relationsTables.d.ts +1 -0
- package/dist/types/relationsTables.d.ts.map +1 -0
- package/dist/types/transaction.d.ts +1 -0
- package/dist/types/transaction.d.ts.map +1 -0
- package/dist-cli/entity/metadata/generate.js +1 -1
- package/dist-cli/model/metadata/generate.js +4 -2
- package/dist-cli/model/metadata/magic.js +2 -2
- package/package.json +40 -36
- package/src/.metadata/index.ts +348 -0
- package/src/.metadata/locales.ts +13 -0
- package/src/.metadata/this.ts +2 -0
- package/src/bean/aopMethod.transaction.ts +18 -0
- package/src/bean/bean.database.ts +57 -0
- package/src/bean/bean.databaseDialectBase.ts +149 -0
- package/src/bean/bean.model/bean.model_cache.ts +815 -0
- package/src/bean/bean.model/bean.model_crud.ts +46 -0
- package/src/bean/bean.model/bean.model_crud_inner.ts +281 -0
- package/src/bean/bean.model/bean.model_crud_table.ts +59 -0
- package/src/bean/bean.model/bean.model_knex.ts +60 -0
- package/src/bean/bean.model/bean.model_meta.ts +204 -0
- package/src/bean/bean.model/bean.model_utils.ts +275 -0
- package/src/bean/bean.model/bean.model_view.ts +129 -0
- package/src/bean/bean.model.ts +8 -0
- package/src/bean/bean.modelBase.ts +8 -0
- package/src/bean/broadcast.columnsClear.ts +24 -0
- package/src/bean/event.clientNameReal.ts +10 -0
- package/src/bean/event.columnsClear.ts +13 -0
- package/src/bean/hmr.entity.ts +12 -0
- package/src/bean/hmr.model.ts +16 -0
- package/src/bean/queue.doubleDelete.ts +29 -0
- package/src/bean/schedule.softDeletionPrune.ts +45 -0
- package/src/common/buildWhere.ts +238 -0
- package/src/common/checkWhere.ts +128 -0
- package/src/common/index.ts +3 -0
- package/src/common/utils.ts +74 -0
- package/src/config/config.ts +60 -0
- package/src/config/errors.ts +3 -0
- package/src/config/locale/en-us.ts +8 -0
- package/src/config/locale/zh-cn.ts +8 -0
- package/src/extend/index.ts +12 -0
- package/src/extend/schemaBuilder.ts +29 -0
- package/src/extend/tableBuilder.ts +87 -0
- package/src/index.ts +10 -0
- package/src/lib/const.ts +58 -0
- package/src/lib/databaseDialect.ts +7 -0
- package/src/lib/dto/dto.ts +21 -0
- package/src/lib/dto/dtoAggregate.ts +51 -0
- package/src/lib/dto/dtoCreate.ts +14 -0
- package/src/lib/dto/dtoGet.ts +159 -0
- package/src/lib/dto/dtoGroup.ts +57 -0
- package/src/lib/dto/dtoListAndCount.ts +16 -0
- package/src/lib/dto/dtoMutate.ts +82 -0
- package/src/lib/dto/dtoQuery.ts +9 -0
- package/src/lib/dto/dtoQueryPage.ts +9 -0
- package/src/lib/dto/dtoSelectAndCount.ts +20 -0
- package/src/lib/dto/dtoUpdate.ts +16 -0
- package/src/lib/dto/index.ts +1 -0
- package/src/lib/entity.ts +25 -0
- package/src/lib/index.ts +9 -0
- package/src/lib/model.ts +7 -0
- package/src/lib/modelCacheBase.ts +98 -0
- package/src/lib/relations.ts +118 -0
- package/src/lib/relationsDynamic.ts +75 -0
- package/src/lib/relationsMutate.ts +60 -0
- package/src/lib/relationsStatic.ts +18 -0
- package/src/lib/utils.ts +45 -0
- package/src/main.ts +79 -0
- package/src/service/cacheEntity_.ts +37 -0
- package/src/service/cacheQuery_.ts +20 -0
- package/src/service/columnsCache_.ts +69 -0
- package/src/service/columns_.ts +64 -0
- package/src/service/database.ts +126 -0
- package/src/service/databaseAsyncLocalStorage_.ts +29 -0
- package/src/service/databaseClient_.ts +124 -0
- package/src/service/db_.ts +77 -0
- package/src/service/entityResolver_.ts +25 -0
- package/src/service/modelResolver_.ts +19 -0
- package/src/service/relations_.ts +444 -0
- package/src/service/transactionAsyncLocalStorage_.ts +31 -0
- package/src/service/transactionConsistency/342/200/214_.ts +37 -0
- package/src/service/transactionFiber_.ts +42 -0
- package/src/service/transactionState_.ts +35 -0
- package/src/service/transaction_.ts +147 -0
- package/src/types/columns.ts +8 -0
- package/src/types/config.ts +23 -0
- package/src/types/database.ts +64 -0
- package/src/types/depth.ts +55 -0
- package/src/types/dialect.ts +17 -0
- package/src/types/dto/dtoAggregate.ts +3 -0
- package/src/types/dto/dtoGet.ts +23 -0
- package/src/types/dto/dtoGroup.ts +3 -0
- package/src/types/dto/dtoListAndCount.ts +7 -0
- package/src/types/dto/dtoMutate.ts +231 -0
- package/src/types/dto/dtoQueryBase.ts +18 -0
- package/src/types/dto/dtoQueryPageBase.ts +18 -0
- package/src/types/dto/dtoSelectAndCount.ts +11 -0
- package/src/types/dto/index.ts +8 -0
- package/src/types/entity.ts +15 -0
- package/src/types/entityBase.ts +11 -0
- package/src/types/entityBaseEmpty.ts +1 -0
- package/src/types/entityBaseInner.ts +18 -0
- package/src/types/entityBaseSimple.ts +9 -0
- package/src/types/extra.ts +23 -0
- package/src/types/index.ts +30 -0
- package/src/types/logger.ts +6 -0
- package/src/types/model.ts +152 -0
- package/src/types/modelAggr.ts +69 -0
- package/src/types/modelCount.ts +40 -0
- package/src/types/modelGeneral.ts +61 -0
- package/src/types/modelGroup.ts +48 -0
- package/src/types/modelIncrement.ts +50 -0
- package/src/types/modelWhere.ts +85 -0
- package/src/types/onion/databaseDialect.ts +22 -0
- package/src/types/onion/entity.ts +33 -0
- package/src/types/onion/index.ts +4 -0
- package/src/types/onion/model.ts +68 -0
- package/src/types/onion/table.ts +1 -0
- package/src/types/relations.ts +243 -0
- package/src/types/relationsAggr.ts +31 -0
- package/src/types/relationsColumns.ts +116 -0
- package/src/types/relationsDef.ts +152 -0
- package/src/types/relationsDefDynamic.ts +128 -0
- package/src/types/relationsDefMutate.ts +11 -0
- package/src/types/relationsGroup.ts +58 -0
- package/src/types/relationsMutate.ts +118 -0
- package/src/types/relationsTables.ts +38 -0
- package/src/types/transaction.ts +23 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
import { isNil } from '@cabloy/utils';
|
|
4
|
+
import { cast } from 'vona';
|
|
5
|
+
|
|
6
|
+
import type { ServiceDb } from '../service/db_.ts';
|
|
7
|
+
import type { TypeModelColumnValue, TypeModelWhere, TypeModelWhereFieldAll, TypeOpsJoint, TypeOpsNormal } from '../types/modelWhere.ts';
|
|
8
|
+
|
|
9
|
+
import { Op, OpAggrs, OpJointValues, OpNormalValues } from '../types/modelWhere.ts';
|
|
10
|
+
import { isRaw, isRef } from './utils.ts';
|
|
11
|
+
|
|
12
|
+
export function buildWhere<TRecord>(db: ServiceDb, builder: Knex.QueryBuilder, wheres: TypeModelWhere<TRecord>, having: boolean = false) {
|
|
13
|
+
_buildWhereInner(having, db, builder, wheres);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function _buildWhereInner<TRecord>(
|
|
17
|
+
having: boolean,
|
|
18
|
+
db: ServiceDb,
|
|
19
|
+
builder: Knex.QueryBuilder,
|
|
20
|
+
wheres: TypeModelWhere<TRecord>,
|
|
21
|
+
column?: keyof TRecord,
|
|
22
|
+
) {
|
|
23
|
+
// skip
|
|
24
|
+
if (wheres === Op.skip) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// raw
|
|
28
|
+
if (isRaw(wheres)) {
|
|
29
|
+
builder[having ? 'havingRaw' : 'whereRaw'](wheres as Knex.Raw);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// loop
|
|
33
|
+
for (const key in wheres) {
|
|
34
|
+
const value = wheres[key];
|
|
35
|
+
if (key[0] !== '_') {
|
|
36
|
+
// columns
|
|
37
|
+
_buildWhereColumn(having, db, builder, key, value);
|
|
38
|
+
} else if (OpNormalValues.includes(key as any)) {
|
|
39
|
+
// op: normal
|
|
40
|
+
if (column) {
|
|
41
|
+
_buildWhereColumn(having, db, builder, column, value, key as any);
|
|
42
|
+
} else {
|
|
43
|
+
// not go here
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
const op = _checkOpJoint(key as any);
|
|
47
|
+
if (op) {
|
|
48
|
+
// op: joint
|
|
49
|
+
_buildWhereOpJoint(having, db, builder, column, value, op);
|
|
50
|
+
} else {
|
|
51
|
+
// ignored, not throw error
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function _buildWhereOpJoint<TRecord>(
|
|
58
|
+
having: boolean,
|
|
59
|
+
db: ServiceDb,
|
|
60
|
+
builder: Knex.QueryBuilder,
|
|
61
|
+
column: keyof TRecord | undefined,
|
|
62
|
+
wheres: TypeModelWhere<TRecord>,
|
|
63
|
+
op: TypeOpsJoint,
|
|
64
|
+
) {
|
|
65
|
+
// skip
|
|
66
|
+
if (wheres === Op.skip) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// and/or
|
|
70
|
+
if (op === Op.and) {
|
|
71
|
+
builder[having ? 'having' : 'where'](builder => {
|
|
72
|
+
for (const key in wheres) {
|
|
73
|
+
builder.andWhere(builder => {
|
|
74
|
+
_buildWhereInner(false, db, builder, { [key]: wheres[key] } as any, column);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// or
|
|
81
|
+
if (op === Op.or) {
|
|
82
|
+
builder[having ? 'having' : 'where'](builder => {
|
|
83
|
+
for (const key in wheres) {
|
|
84
|
+
builder.orWhere(builder => {
|
|
85
|
+
_buildWhereInner(false, db, builder, { [key]: wheres[key] } as any, column);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// not
|
|
92
|
+
if (op === Op.not) {
|
|
93
|
+
builder[having ? 'havingNot' : 'whereNot'](builder => {
|
|
94
|
+
_buildWhereInner(false, db, builder, wheres, column);
|
|
95
|
+
});
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// exists
|
|
99
|
+
if (op === Op.exists) {
|
|
100
|
+
builder[having ? 'havingExists' : 'whereExists'](wheres as any);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// notexists
|
|
104
|
+
if (op === Op.notExists) {
|
|
105
|
+
builder[having ? 'havingNotExists' : 'whereNotExists'](wheres as any);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function _buildWhereColumn<TRecord>(
|
|
110
|
+
having: boolean,
|
|
111
|
+
db: ServiceDb,
|
|
112
|
+
builder: Knex.QueryBuilder,
|
|
113
|
+
column: keyof TRecord,
|
|
114
|
+
value: TypeModelColumnValue<TRecord, TRecord[keyof TRecord]> | TypeModelWhereFieldAll<TRecord, TRecord[keyof TRecord]>,
|
|
115
|
+
op?: TypeOpsNormal,
|
|
116
|
+
) {
|
|
117
|
+
// skip
|
|
118
|
+
if (value === Op.skip) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// raw
|
|
122
|
+
if (isRaw(value) || isRef(value)) {
|
|
123
|
+
_buildWhereColumnOpNormal(having, db, builder, column, value, op ?? Op.eq);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// null/undefined
|
|
127
|
+
if (isNil(value)) {
|
|
128
|
+
_buildWhereColumnOpNormal(having, db, builder, column, value, op ?? Op.is);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// array
|
|
132
|
+
if (Array.isArray(value)) {
|
|
133
|
+
_buildWhereColumnOpNormal(having, db, builder, column, value, op ?? Op.in);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// date
|
|
137
|
+
if (value instanceof Date) {
|
|
138
|
+
_buildWhereColumnOpNormal(having, db, builder, column, value, op ?? Op.eq);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// object
|
|
142
|
+
if (typeof value === 'object') {
|
|
143
|
+
builder[having ? 'having' : 'where'](builder => {
|
|
144
|
+
_buildWhereInner(false, db, builder, value as any, column);
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// column
|
|
149
|
+
_buildWhereColumnOpNormal(having, db, builder, column, value, op ?? Op.eq);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function _buildWhereColumnOpNormal<TRecord>(
|
|
153
|
+
having: boolean,
|
|
154
|
+
db: ServiceDb,
|
|
155
|
+
builder: Knex.QueryBuilder,
|
|
156
|
+
column: keyof TRecord | string,
|
|
157
|
+
value: any,
|
|
158
|
+
op: TypeOpsNormal,
|
|
159
|
+
) {
|
|
160
|
+
column = _checkHavingColumn(db, column) as string;
|
|
161
|
+
if (op === Op.eq) {
|
|
162
|
+
builder[having ? 'having' : 'where'](column, '=', value);
|
|
163
|
+
} else if (op === Op.notEq) {
|
|
164
|
+
builder[having ? 'having' : 'where'](column, '<>', value);
|
|
165
|
+
} else if (op === Op.eqI) {
|
|
166
|
+
builder[_getOpILikeReal(having, db)](column, value);
|
|
167
|
+
} else if (op === Op.notEqI) {
|
|
168
|
+
builder[having ? 'havingNot' : 'whereNot']((builder: Knex.QueryBuilder) => {
|
|
169
|
+
builder[_getOpILikeReal(having, db)](column, value);
|
|
170
|
+
});
|
|
171
|
+
} else if (op === Op.gt) {
|
|
172
|
+
builder[having ? 'having' : 'where'](column, '>', value);
|
|
173
|
+
} else if (op === Op.gte) {
|
|
174
|
+
builder[having ? 'having' : 'where'](column, '>=', value);
|
|
175
|
+
} else if (op === Op.lt) {
|
|
176
|
+
builder[having ? 'having' : 'where'](column, '<', value);
|
|
177
|
+
} else if (op === Op.lte) {
|
|
178
|
+
builder[having ? 'having' : 'where'](column, '<=', value);
|
|
179
|
+
} else if (op === Op.in) {
|
|
180
|
+
builder[having ? 'havingIn' : 'whereIn'](column, value);
|
|
181
|
+
} else if (op === Op.notIn) {
|
|
182
|
+
builder[having ? 'havingNotIn' : 'whereNotIn'](column, value);
|
|
183
|
+
} else if (op === Op.is) {
|
|
184
|
+
builder[having ? 'havingNull' : 'whereNull'](column);
|
|
185
|
+
} else if (op === Op.isNot) {
|
|
186
|
+
builder[having ? 'havingNotNull' : 'whereNotNull'](column);
|
|
187
|
+
} else if (op === Op.between) {
|
|
188
|
+
builder[having ? 'havingBetween' : 'whereBetween'](column, value);
|
|
189
|
+
} else if (op === Op.notBetween) {
|
|
190
|
+
builder[having ? 'havingNotBetween' : 'whereNotBetween'](column, value);
|
|
191
|
+
} else if (op === Op.startsWith) {
|
|
192
|
+
builder[_getOpLikeReal(having, db)](column, `${value}%` as any);
|
|
193
|
+
} else if (op === Op.endsWith) {
|
|
194
|
+
builder[_getOpLikeReal(having, db)](column, `%${value}` as any);
|
|
195
|
+
} else if (op === Op.includes) {
|
|
196
|
+
builder[_getOpLikeReal(having, db)](column, `%${value}%` as any);
|
|
197
|
+
} else if (op === Op.startsWithI) {
|
|
198
|
+
builder[_getOpILikeReal(having, db)](column, `${value}%` as any);
|
|
199
|
+
} else if (op === Op.endsWithI) {
|
|
200
|
+
builder[_getOpILikeReal(having, db)](column, `%${value}` as any);
|
|
201
|
+
} else if (op === Op.includesI) {
|
|
202
|
+
builder[_getOpILikeReal(having, db)](column, `%${value}%` as any);
|
|
203
|
+
} else if (op === Op.ref) {
|
|
204
|
+
builder[having ? 'having' : 'where'](column, '=', db.connection.ref(value));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function _getOpLikeReal(having: boolean, db: ServiceDb) {
|
|
209
|
+
return db.dialect.capabilities.like ? (having ? 'havingLike' : 'whereLike') : having ? 'havingILike' : 'whereILike';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function _getOpILikeReal(having: boolean, db: ServiceDb) {
|
|
213
|
+
return db.dialect.capabilities.ilike ? (having ? 'havingILike' : 'whereILike') : having ? 'havingLike' : 'whereLike';
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function _checkHavingColumn<TRecord>(db: ServiceDb, column: keyof TRecord | string) {
|
|
217
|
+
let [aggr, name] = cast<string>(column).split('_');
|
|
218
|
+
if (!OpAggrs.includes(aggr) || !name) return column;
|
|
219
|
+
if (aggr === 'count' && name === 'all') name = '*';
|
|
220
|
+
return db.connection.raw(`${_safeOp(aggr)}(${_safeColumn(name)})`);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function _checkOpJoint(op: TypeOpsJoint) {
|
|
224
|
+
for (const item of OpJointValues) {
|
|
225
|
+
if (op.startsWith(item)) {
|
|
226
|
+
return item;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function _safeOp(op) {
|
|
233
|
+
return op.replace(/[\\.*#%'"`;,() ]/g, '');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function _safeColumn(column) {
|
|
237
|
+
return column.replace(/[\\.#%'"`;,() ]/g, '');
|
|
238
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// export function checkWhere(where) {
|
|
2
|
+
// if (where === true || where === false) return where;
|
|
3
|
+
// if (where === undefined || where === null) {
|
|
4
|
+
// return true;
|
|
5
|
+
// }
|
|
6
|
+
// return where;
|
|
7
|
+
// }
|
|
8
|
+
|
|
9
|
+
// import { formatValueArray, isRaw } from './utils.ts';
|
|
10
|
+
|
|
11
|
+
// const __wherePlaceholderOr = '__or__';
|
|
12
|
+
// const __wherePlaceholderAnd = '__and__';
|
|
13
|
+
// const __wherePlaceholderExists = '__exists__';
|
|
14
|
+
// const __wherePlaceholderNotExists = '__notExists__';
|
|
15
|
+
|
|
16
|
+
// export function checkWhere(where) {
|
|
17
|
+
// if (where === true || where === false) return where;
|
|
18
|
+
// if (where === undefined || where === null) {
|
|
19
|
+
// return true;
|
|
20
|
+
// }
|
|
21
|
+
// if (isRaw(where)) {
|
|
22
|
+
// return where;
|
|
23
|
+
// }
|
|
24
|
+
// // loop
|
|
25
|
+
// const wheres: Array<[key: string, value: any]> = [];
|
|
26
|
+
// for (const key in where) {
|
|
27
|
+
// const value = where[key];
|
|
28
|
+
// // raw
|
|
29
|
+
// if (isRaw(value)) {
|
|
30
|
+
// wheres.push([key, value]);
|
|
31
|
+
// continue;
|
|
32
|
+
// }
|
|
33
|
+
// // check key: exists
|
|
34
|
+
// if (key.includes(__wherePlaceholderExists)) {
|
|
35
|
+
// wheres.push(['EXISTS', value]);
|
|
36
|
+
// continue;
|
|
37
|
+
// }
|
|
38
|
+
// // check key: not exists
|
|
39
|
+
// if (key.includes(__wherePlaceholderNotExists)) {
|
|
40
|
+
// wheres.push(['NOTEXISTS', value]);
|
|
41
|
+
// continue;
|
|
42
|
+
// }
|
|
43
|
+
// // check key: or/and
|
|
44
|
+
// let keyOrAnd;
|
|
45
|
+
// if (key.includes(__wherePlaceholderOr)) {
|
|
46
|
+
// keyOrAnd = 'OR';
|
|
47
|
+
// } else if (key.includes(__wherePlaceholderAnd)) {
|
|
48
|
+
// keyOrAnd = 'AND';
|
|
49
|
+
// }
|
|
50
|
+
// if (keyOrAnd) {
|
|
51
|
+
// const _where = _formatOrAnd(value, keyOrAnd);
|
|
52
|
+
// if (_where === true) {
|
|
53
|
+
// // ignore
|
|
54
|
+
// } else if (_where === false) {
|
|
55
|
+
// // deny
|
|
56
|
+
// return false;
|
|
57
|
+
// } else {
|
|
58
|
+
// wheres.push([keyOrAnd, _where]);
|
|
59
|
+
// }
|
|
60
|
+
// continue;
|
|
61
|
+
// }
|
|
62
|
+
// // check array
|
|
63
|
+
// if (Array.isArray(value) && value.length === 0) {
|
|
64
|
+
// return false;
|
|
65
|
+
// }
|
|
66
|
+
// // check object
|
|
67
|
+
// if (value && !(value instanceof Date) && typeof value === 'object') {
|
|
68
|
+
// // check array
|
|
69
|
+
// if (['in', 'notIn'].includes(value.op)) {
|
|
70
|
+
// const arr = formatValueArray(value);
|
|
71
|
+
// if (value.op === 'in' && arr === null) return false;
|
|
72
|
+
// if (value.op === 'notIn' && arr === null) continue;
|
|
73
|
+
// wheres.push([key, { op: value.op, val: arr }]);
|
|
74
|
+
// continue;
|
|
75
|
+
// }
|
|
76
|
+
// }
|
|
77
|
+
// // otherwise
|
|
78
|
+
// wheres.push([key, value]);
|
|
79
|
+
// }
|
|
80
|
+
// if (wheres.length === 0) return true;
|
|
81
|
+
// return wheres;
|
|
82
|
+
// }
|
|
83
|
+
|
|
84
|
+
// function _formatOrAnd(ors, orAnd) {
|
|
85
|
+
// // or
|
|
86
|
+
// if (orAnd === 'OR') {
|
|
87
|
+
// return _formatOrAnd_or(ors);
|
|
88
|
+
// }
|
|
89
|
+
// // and
|
|
90
|
+
// return _formatOrAnd_and(ors);
|
|
91
|
+
// }
|
|
92
|
+
|
|
93
|
+
// function _formatOrAnd_or(ors) {
|
|
94
|
+
// if (ors === undefined || ors === null) return false;
|
|
95
|
+
// if (!Array.isArray(ors)) ors = [ors];
|
|
96
|
+
// const wheres: Array<any> = [];
|
|
97
|
+
// for (const or of ors) {
|
|
98
|
+
// const _where = checkWhere(or);
|
|
99
|
+
// if (_where === false) {
|
|
100
|
+
// // ignore
|
|
101
|
+
// } else if (_where === true) {
|
|
102
|
+
// return true;
|
|
103
|
+
// } else {
|
|
104
|
+
// wheres.push(_where);
|
|
105
|
+
// }
|
|
106
|
+
// }
|
|
107
|
+
// if (wheres.length === 0) return false;
|
|
108
|
+
// return wheres;
|
|
109
|
+
// }
|
|
110
|
+
|
|
111
|
+
// function _formatOrAnd_and(ors) {
|
|
112
|
+
// if (ors === undefined || ors === null) return true;
|
|
113
|
+
// if (!Array.isArray(ors)) ors = [ors];
|
|
114
|
+
// const wheres: Array<any> = [];
|
|
115
|
+
// for (const or of ors) {
|
|
116
|
+
// const _where = checkWhere(or);
|
|
117
|
+
// if (_where === true) {
|
|
118
|
+
// // ignore
|
|
119
|
+
// } else if (_where === false) {
|
|
120
|
+
// // deny
|
|
121
|
+
// return false;
|
|
122
|
+
// } else {
|
|
123
|
+
// wheres.push(_where);
|
|
124
|
+
// }
|
|
125
|
+
// }
|
|
126
|
+
// if (wheres.length === 0) return true;
|
|
127
|
+
// return wheres;
|
|
128
|
+
// }
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Constructable } from 'vona';
|
|
2
|
+
|
|
3
|
+
import { appResource, beanFullNameFromOnionName } from 'vona';
|
|
4
|
+
import { prepareClassType } from 'vona-module-a-openapiutils';
|
|
5
|
+
|
|
6
|
+
import type { BeanModelMeta } from '../bean/bean.model/bean.model_meta.ts';
|
|
7
|
+
import type { TypeModelColumn, TypeModelColumns } from '../types/modelWhere.ts';
|
|
8
|
+
import type { IDecoratorModelOptions, IModelClassRecord } from '../types/onion/model.ts';
|
|
9
|
+
|
|
10
|
+
export function isRaw(raw) {
|
|
11
|
+
return typeof raw?.constructor === 'function' && raw?.constructor?.name === 'Raw';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function isRef(ref) {
|
|
15
|
+
return typeof ref?.constructor === 'function' && ref?.constructor?.name === 'Ref';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getTableOrTableAlias(table: string) {
|
|
19
|
+
const _table = table.toString();
|
|
20
|
+
return _table.includes(' as ') ? _table.split(' as ')[1].trim() : _table;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getTargetColumnName(column: string) {
|
|
24
|
+
if (column.includes(' as ')) return column.split(' as ')[1].trim();
|
|
25
|
+
if (column.includes('.')) return column.split('.')[1].trim();
|
|
26
|
+
return column;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function prepareColumns<TRecord>(columns?: TypeModelColumns<TRecord>): Array<TypeModelColumn<TRecord>> | undefined {
|
|
30
|
+
if (!columns) return undefined;
|
|
31
|
+
columns = Array.isArray(columns) ? columns : [columns];
|
|
32
|
+
if (columns.includes('*')) return undefined;
|
|
33
|
+
return columns;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function prepareClassModel<ModelLike extends BeanModelMeta | keyof IModelClassRecord>(
|
|
37
|
+
classType: ModelLike extends BeanModelMeta ? (() => Constructable<ModelLike>) | Constructable<ModelLike> : ModelLike,
|
|
38
|
+
): Constructable<ModelLike> {
|
|
39
|
+
if (typeof classType === 'string') {
|
|
40
|
+
const beanOptions = appResource.getBean(beanFullNameFromOnionName(classType, 'model'));
|
|
41
|
+
return beanOptions!.beanClass as any;
|
|
42
|
+
}
|
|
43
|
+
return prepareClassType(classType) as any;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getClassEntityFromClassModel<T>(modelClass: Constructable<T>) {
|
|
47
|
+
const beanOptions = appResource.getBean(modelClass);
|
|
48
|
+
const options: IDecoratorModelOptions = beanOptions!.options!;
|
|
49
|
+
return options.entity!;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// export function formatValue(value) {
|
|
53
|
+
// if (typeof value !== 'object' || value instanceof Date) return value;
|
|
54
|
+
// // date
|
|
55
|
+
// if (value.type === 'Date') return moment(value.val).toDate();
|
|
56
|
+
// // like
|
|
57
|
+
// if (value.op === 'like') return `%${value.val}%`;
|
|
58
|
+
// if (value.op === 'likeLeft') return `%${value.val}`;
|
|
59
|
+
// if (value.op === 'likeRight') return `${value.val}%`;
|
|
60
|
+
// if (value.op === 'likeStrict') return `${value.val}`;
|
|
61
|
+
// // in
|
|
62
|
+
// if (['in', 'notIn'].includes(value.op)) {
|
|
63
|
+
// return formatValueArray(value);
|
|
64
|
+
// }
|
|
65
|
+
// // others
|
|
66
|
+
// return value.val;
|
|
67
|
+
// }
|
|
68
|
+
|
|
69
|
+
// export function formatValueArray(value) {
|
|
70
|
+
// if (!value.val) return null;
|
|
71
|
+
// const arr = typeof value.val === 'string' ? value.val.split(',') : value.val;
|
|
72
|
+
// if (arr.length === 0) return null;
|
|
73
|
+
// return arr;
|
|
74
|
+
// }
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { TableIdentityType } from 'table-identity';
|
|
2
|
+
import type { VonaApplication } from 'vona';
|
|
3
|
+
import type { IOnionOptionsMeta } from 'vona-module-a-onion';
|
|
4
|
+
import type { TSummerCachePreset } from 'vona-module-a-summer';
|
|
5
|
+
|
|
6
|
+
import { configAll, configRedis } from 'vona-module-a-summer';
|
|
7
|
+
|
|
8
|
+
import type { IDataBaseConfigDialects } from '../types/config.ts';
|
|
9
|
+
|
|
10
|
+
export function config(_app: VonaApplication) {
|
|
11
|
+
return {
|
|
12
|
+
sharding: {
|
|
13
|
+
cache: {
|
|
14
|
+
doubleDelete: true,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
rest: {
|
|
18
|
+
query: {
|
|
19
|
+
pageSize: {
|
|
20
|
+
default: 20,
|
|
21
|
+
max: 100,
|
|
22
|
+
},
|
|
23
|
+
orders: {
|
|
24
|
+
default: 'createdAt,desc',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
table: {
|
|
29
|
+
identityType: 'bigint' as TableIdentityType,
|
|
30
|
+
},
|
|
31
|
+
model: {
|
|
32
|
+
disableDeleted: false,
|
|
33
|
+
disableInstance: false,
|
|
34
|
+
disableCreateTime: false,
|
|
35
|
+
disableUpdateTime: false,
|
|
36
|
+
},
|
|
37
|
+
softDeletionPrune: {
|
|
38
|
+
enable: true,
|
|
39
|
+
expired: 14 * 24 * 3600 * 1000,
|
|
40
|
+
},
|
|
41
|
+
dialects: {
|
|
42
|
+
'better-sqlite3': 'a-ormdialect:betterSqlite3',
|
|
43
|
+
'mysql': 'a-ormdialect:mysql',
|
|
44
|
+
'mysql2': 'a-ormdialect:mysql3',
|
|
45
|
+
'pg': 'a-ormdialect:pg',
|
|
46
|
+
} as IDataBaseConfigDialects,
|
|
47
|
+
summer: {
|
|
48
|
+
enable: true,
|
|
49
|
+
meta: {} as IOnionOptionsMeta,
|
|
50
|
+
presetDefault: 'redis' as TSummerCachePreset,
|
|
51
|
+
preset: {
|
|
52
|
+
redis: configRedis,
|
|
53
|
+
all: configAll,
|
|
54
|
+
},
|
|
55
|
+
redis: {
|
|
56
|
+
client: 'model',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { VonaApplication } from 'vona';
|
|
2
|
+
|
|
3
|
+
import { ExtendSchemaBuilder } from './schemaBuilder.ts';
|
|
4
|
+
import { ExtendTableBuilder } from './tableBuilder.ts';
|
|
5
|
+
|
|
6
|
+
export * from './schemaBuilder.ts';
|
|
7
|
+
export * from './tableBuilder.ts';
|
|
8
|
+
|
|
9
|
+
export function ExtendKnex(app: VonaApplication) {
|
|
10
|
+
ExtendSchemaBuilder(app);
|
|
11
|
+
ExtendTableBuilder(app);
|
|
12
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
import type { VonaApplication } from 'vona';
|
|
3
|
+
|
|
4
|
+
import knex from 'knex';
|
|
5
|
+
import { cast } from 'vona';
|
|
6
|
+
|
|
7
|
+
import type { IDatabaseClientDialectRecord } from '../types/database.ts';
|
|
8
|
+
import type { IFetchDatabasesResultItem, IFetchIndexesResultItem } from '../types/dialect.ts';
|
|
9
|
+
|
|
10
|
+
export function ExtendSchemaBuilder(app: VonaApplication) {
|
|
11
|
+
['fetchDatabases', 'createDatabase', 'dropDatabase', 'fetchIndexes'].forEach(method => {
|
|
12
|
+
knex.SchemaBuilder.extend(method, async function (...args) {
|
|
13
|
+
const client = cast<Knex.Client>(cast(this).client).config.client as keyof IDatabaseClientDialectRecord;
|
|
14
|
+
const dialect = app.bean.database.getDialect(client);
|
|
15
|
+
return await dialect[method](this, ...args);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
declare module 'knex' {
|
|
21
|
+
namespace Knex {
|
|
22
|
+
interface SchemaBuilder {
|
|
23
|
+
fetchDatabases(databasePrefix: string): Promise<IFetchDatabasesResultItem[]>;
|
|
24
|
+
createDatabase(databaseName: string): Promise<string>;
|
|
25
|
+
dropDatabase(databaseName: string): Promise<void>;
|
|
26
|
+
fetchIndexes(tableName: string): Promise<IFetchIndexesResultItem[]>;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { TableIdentityType } from 'table-identity';
|
|
2
|
+
import type { VonaApplication } from 'vona';
|
|
3
|
+
|
|
4
|
+
import knex from 'knex';
|
|
5
|
+
|
|
6
|
+
import { __ThisModule__ } from '../.metadata/this.ts';
|
|
7
|
+
|
|
8
|
+
export interface IBasicFieldsOptions {
|
|
9
|
+
id?: boolean;
|
|
10
|
+
timestamps?: boolean;
|
|
11
|
+
deleted?: boolean;
|
|
12
|
+
iid?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function ExtendTableBuilder(app: VonaApplication) {
|
|
16
|
+
const scope = app.scope(__ThisModule__);
|
|
17
|
+
function _basicFields(this: knex.Knex.TableBuilder, options?: IBasicFieldsOptions, identityType?: TableIdentityType) {
|
|
18
|
+
options = options || ({} as IBasicFieldsOptions);
|
|
19
|
+
if (options.id !== false) {
|
|
20
|
+
const _identityType = identityType ?? scope.config.table.identityType;
|
|
21
|
+
if (_identityType === 'bigint') {
|
|
22
|
+
this.bigIncrements();
|
|
23
|
+
} else if (_identityType === 'number') {
|
|
24
|
+
this.increments();
|
|
25
|
+
} else {
|
|
26
|
+
throw new Error('Should create column id by yourself');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (options.timestamps !== false) this.timestamps(true, true, true);
|
|
30
|
+
if (options.deleted !== false) this.boolean('deleted').defaultTo(false);
|
|
31
|
+
if (options.iid !== false) this.integer('iid').defaultTo(0);
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
knex.TableBuilder.extend('basicFields', function (this: knex.Knex.TableBuilder, options?: IBasicFieldsOptions) {
|
|
36
|
+
_basicFields.call(this, options, undefined);
|
|
37
|
+
return this;
|
|
38
|
+
});
|
|
39
|
+
knex.TableBuilder.extend('basicFieldsSimple', function (this: knex.Knex.TableBuilder, options?: IBasicFieldsOptions) {
|
|
40
|
+
_basicFields.call(this, options, 'number');
|
|
41
|
+
return this;
|
|
42
|
+
});
|
|
43
|
+
knex.TableBuilder.extend('tableIdentity', function (this: knex.Knex.TableBuilder, columnName: string) {
|
|
44
|
+
const _identityType = scope.config.table.identityType;
|
|
45
|
+
if (_identityType === 'bigint') {
|
|
46
|
+
return this.bigInteger(columnName); // default value is null
|
|
47
|
+
} else if (_identityType === 'number') {
|
|
48
|
+
return this.integer(columnName); // default value is null
|
|
49
|
+
} else {
|
|
50
|
+
throw new Error(`Should create column ${columnName} by yourself`);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
knex.TableBuilder.extend('userId', function (this: knex.Knex.TableBuilder, columnName?: string) {
|
|
54
|
+
return this.tableIdentity(columnName ?? 'userId');
|
|
55
|
+
});
|
|
56
|
+
knex.TableBuilder.extend('int0', function (this: knex.Knex.TableBuilder, columnName: string) {
|
|
57
|
+
return this.integer(columnName).defaultTo(0);
|
|
58
|
+
});
|
|
59
|
+
knex.TableBuilder.extend('int1', function (this: knex.Knex.TableBuilder, columnName: string) {
|
|
60
|
+
return this.integer(columnName).defaultTo(1);
|
|
61
|
+
});
|
|
62
|
+
['description'].forEach(method => {
|
|
63
|
+
knex.TableBuilder.extend(method, function (this: knex.Knex.TableBuilder, length: number = 255) {
|
|
64
|
+
return this.string(method, length);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
['content'].forEach(method => {
|
|
68
|
+
knex.TableBuilder.extend(method, function (this: knex.Knex.TableBuilder, useText?: boolean) {
|
|
69
|
+
return useText ? this.text(method) : this.json(method);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
declare module 'knex' {
|
|
75
|
+
namespace Knex {
|
|
76
|
+
interface TableBuilder {
|
|
77
|
+
basicFields(options?: IBasicFieldsOptions): Knex.TableBuilder;
|
|
78
|
+
basicFieldsSimple(options?: IBasicFieldsOptions): Knex.TableBuilder;
|
|
79
|
+
tableIdentity(columnName?: string): Knex.ColumnBuilder;
|
|
80
|
+
userId(columnName?: string): Knex.ColumnBuilder;
|
|
81
|
+
int0(columnName: string): Knex.ColumnBuilder;
|
|
82
|
+
int1(columnName: string): Knex.ColumnBuilder;
|
|
83
|
+
description(length?: number): Knex.ColumnBuilder;
|
|
84
|
+
content(useText?: boolean): Knex.ColumnBuilder;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import 'bignumber.js';
|
|
2
|
+
|
|
3
|
+
export * from './.metadata/index.ts';
|
|
4
|
+
|
|
5
|
+
export * from './.metadata/locales.ts';
|
|
6
|
+
export * from './bean/bean.model/bean.model_meta.ts';
|
|
7
|
+
export * from './common/index.ts';
|
|
8
|
+
export * from './extend/index.ts';
|
|
9
|
+
export * from './lib/index.ts';
|
|
10
|
+
export * from './types/index.ts';
|