typeorm 0.3.30 → 0.3.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/browser/data-source/BaseDataSourceOptions.d.ts +7 -20
- package/browser/data-source/BaseDataSourceOptions.js.map +1 -1
- package/browser/driver/types/InvalidFindOptionsWhereBehavior.d.ts +15 -0
- package/browser/driver/types/InvalidFindOptionsWhereBehavior.js +3 -0
- package/browser/driver/types/InvalidFindOptionsWhereBehavior.js.map +1 -0
- package/browser/entity-manager/EntityManager.d.ts +23 -0
- package/browser/entity-manager/EntityManager.js +79 -106
- package/browser/entity-manager/EntityManager.js.map +1 -1
- package/browser/metadata/types/ClosureTreeOptions.d.ts +1 -0
- package/browser/metadata/types/ClosureTreeOptions.js.map +1 -1
- package/browser/metadata-builder/ClosureJunctionEntityMetadataBuilder.js +6 -2
- package/browser/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/persistence/SubjectExecutor.js +0 -8
- package/browser/persistence/SubjectExecutor.js.map +1 -1
- package/browser/query-builder/QueryBuilder.js +17 -0
- package/browser/query-builder/QueryBuilder.js.map +1 -1
- package/browser/repository/TreeRepository.js +2 -2
- package/browser/repository/TreeRepository.js.map +1 -1
- package/browser/util/OrmUtils.d.ts +16 -9
- package/browser/util/OrmUtils.js +33 -13
- package/browser/util/OrmUtils.js.map +1 -1
- package/commands/MigrationGenerateCommand.d.ts +6 -0
- package/commands/MigrationGenerateCommand.js +13 -2
- package/commands/MigrationGenerateCommand.js.map +1 -1
- package/data-source/BaseDataSourceOptions.d.ts +7 -20
- package/data-source/BaseDataSourceOptions.js.map +1 -1
- package/driver/types/InvalidFindOptionsWhereBehavior.d.ts +15 -0
- package/driver/types/InvalidFindOptionsWhereBehavior.js +4 -0
- package/driver/types/InvalidFindOptionsWhereBehavior.js.map +1 -0
- package/entity-manager/EntityManager.d.ts +23 -0
- package/entity-manager/EntityManager.js +79 -106
- package/entity-manager/EntityManager.js.map +1 -1
- package/metadata/types/ClosureTreeOptions.d.ts +1 -0
- package/metadata/types/ClosureTreeOptions.js.map +1 -1
- package/metadata-builder/ClosureJunctionEntityMetadataBuilder.js +6 -2
- package/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/package.json +18 -19
- package/persistence/SubjectExecutor.js +0 -8
- package/persistence/SubjectExecutor.js.map +1 -1
- package/query-builder/QueryBuilder.js +17 -0
- package/query-builder/QueryBuilder.js.map +1 -1
- package/repository/TreeRepository.js +2 -2
- package/repository/TreeRepository.js.map +1 -1
- package/util/OrmUtils.d.ts +16 -9
- package/util/OrmUtils.js +33 -13
- package/util/OrmUtils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/repository/TreeRepository.ts"],"names":[],"mappings":";;;AACA,uDAAmD;AACnD,wDAAoD;AACpD,uEAAmE;AAGnE,qEAAiE;AACjE,6CAAyC;AAEzC;;;;GAIG;AACH,MAAa,cAEX,SAAQ,uBAAkB;IACxB,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAyB;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,OAAO,CAAC,GAAG,CACb,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAC/D,CAAA;QACD,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAyB;QAC/B,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChD,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE,CACpC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,kBAAkB,GACpB,UAAU,CAAC,iBAAiB,IAAI,UAAU,CAAC,YAAY,CAAA;QAE3D,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAChD,mCAAgB,CAAC,8BAA8B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAE5D,OAAO,EAAE;aACJ,KAAK,CACF,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,YAAY,CACxC,kBAAkB,CACrB,UAAU,CACd;aACA,OAAO,EAAE,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,eAAe,CACX,MAAc,EACd,OAAyB;QAEzB,MAAM,EAAE,GAAG,IAAI,CAAC,6BAA6B,CACzC,YAAY,EACZ,aAAa,EACb,MAAM,CACT,CAAA;QACD,mCAAgB,CAAC,8BAA8B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC5D,OAAO,EAAE,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACrB,MAAc,EACd,OAAyB;QAEzB,gEAAgE;QAEhE,MAAM,EAAE,GACJ,IAAI,CAAC,6BAA6B,CAC9B,YAAY,EACZ,aAAa,EACb,MAAM,CACT,CAAA;QACL,mCAAgB,CAAC,8BAA8B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAE5D,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAA;QAC7C,MAAM,YAAY,GAAG,yCAAmB,CAAC,kBAAkB,CACvD,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,YAAY,EACZ,QAAQ,CAAC,GAAG,CACf,CAAA;QACD,yCAAmB,CAAC,uBAAuB,CACvC,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,QAAQ,CAAC,QAAQ,EACjB,YAAY,EACZ;YACI,KAAK,EAAE,CAAC,CAAC;YACT,GAAG,OAAO;SACb,CACJ,CAAA;QAED,OAAO,MAAM,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,6BAA6B,CACrC,YAAY,EACZ,aAAa,EACb,MAAM,CACT,CAAC,QAAQ,EAAE,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,6BAA6B,CACzB,KAAa,EACb,iBAAyB,EACzB,MAAc;QAEd,0CAA0C;QAC1C,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAC7B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAEhD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YAC7C,MAAM,aAAa,GACf,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,iBAAiB;iBAC/C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACZ,OAAO,CACH,MAAM,CAAC,iBAAiB,CAAC;oBACzB,GAAG;oBACH,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC3B,KAAK;oBACL,MAAM,CAAC,KAAK,CAAC;oBACb,GAAG;oBACH,MAAM,CAAC,MAAM,CAAC,gBAAiB,CAAC,YAAY,CAAC,CAChD,CAAA;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtB,MAAM,UAAU,GAAkB,EAAE,CAAA;YACpC,MAAM,cAAc,GAChB,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,eAAe;iBAC7C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACZ,UAAU,CAAC,MAAM,CAAC,gBAAiB,CAAC,YAAY,CAAC;oBAC7C,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;gBACnD,OAAO,CACH,MAAM,CAAC,iBAAiB,CAAC;oBACzB,GAAG;oBACH,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC3B,MAAM;oBACN,MAAM,CAAC,gBAAiB,CAAC,YAAY,CACxC,CAAA;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAChC,SAAS,CACN,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAC5C,iBAAiB,EACjB,aAAa,CAChB;iBACA,KAAK,CAAC,cAAc,CAAC;iBACrB,aAAa,CAAC,UAAU,CAAC,CAAA;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACjD,MAAM,cAAc,GAChB,KAAK;gBACL,GAAG;gBACH,IAAI,CAAC,QAAQ,CAAC,mBAAoB,CAAC,YAAY;gBAC/C,WAAW;gBACX,SAAS;gBACT,IAAI,CAAC,QAAQ,CAAC,mBAAoB,CAAC,YAAY;gBAC/C,cAAc;gBACd,IAAI,CAAC,QAAQ,CAAC,oBAAqB,CAAC,YAAY,CAAA;YACpD,MAAM,UAAU,GAAkB,EAAE,CAAA;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;iBAC9B,kBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;gBAChD,MAAM,aAAa,GACf,UAAU,CAAC,gBAAiB,CAAC,YAAY,CAAC,OAAO,CAC7C,GAAG,EACH,GAAG,CACN,CAAA;gBACL,UAAU,CAAC,aAAa,CAAC;oBACrB,UAAU,CAAC,gBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;gBACvD,OAAO,CACH,SAAS;oBACT,UAAU,CAAC,gBAAiB,CAAC,YAAY;oBACzC,MAAM;oBACN,aAAa,CAChB,CAAA;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,OAAO,CAAC,CAAA;YAElB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAChC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC;iBAC7D,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC/C,MAAM,QAAQ,GAAG,EAAE;qBACd,QAAQ,EAAE;qBACV,MAAM,CACH,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,IACvB,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAC1C,EAAE,EACF,MAAM,CACT;qBACA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;qBACpD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;gBAErD,IACI,yBAAW,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAC5D,CAAC;oBACC,OAAO,GAAG,KAAK,IACX,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAC1C,SAAS,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;gBACzC,CAAC;qBAAM,CAAC;oBACJ,OAAO,GAAG,KAAK,IACX,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAC1C,uBAAuB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;gBAC5D,CAAC;YACL,CAAC,CAAC,CAAA;QACN,CAAC;QAED,MAAM,IAAI,2BAAY,CAAC,iCAAiC,CAAC,CAAA;IAC7D,CAAC;IAED;;OAEG;IACH,aAAa,CACT,MAAc,EACd,OAAyB;QAEzB,MAAM,EAAE,GAAG,IAAI,CAAC,2BAA2B,CACvC,YAAY,EACZ,aAAa,EACb,MAAM,CACT,CAAA;QACD,mCAAgB,CAAC,8BAA8B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC5D,OAAO,EAAE,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACnB,MAAc,EACd,OAAyB;QAEzB,gEAAgE;QAChE,MAAM,EAAE,GAAG,IAAI,CAAC,2BAA2B,CACvC,YAAY,EACZ,aAAa,EACb,MAAM,CACT,CAAA;QACD,mCAAgB,CAAC,8BAA8B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAE5D,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAA;QAC7C,MAAM,YAAY,GAAG,yCAAmB,CAAC,kBAAkB,CACvD,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,YAAY,EACZ,QAAQ,CAAC,GAAG,CACf,CAAA;QACD,yCAAmB,CAAC,qBAAqB,CACrC,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,QAAQ,CAAC,QAAQ,EACjB,YAAY,CACf,CAAA;QACD,OAAO,MAAM,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,2BAA2B,CACnC,YAAY,EACZ,aAAa,EACb,MAAM,CACT,CAAC,QAAQ,EAAE,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,2BAA2B,CACvB,KAAa,EACb,iBAAyB,EACzB,MAAc;QAEd,0CAA0C;QAC1C,kFAAkF;QAElF,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YAC7C,MAAM,aAAa,GACf,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,eAAe;iBAC7C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACZ,OAAO,CACH,iBAAiB;oBACjB,GAAG;oBACH,MAAM,CAAC,YAAY;oBACnB,KAAK;oBACL,KAAK;oBACL,GAAG;oBACH,MAAM,CAAC,gBAAiB,CAAC,YAAY,CACxC,CAAA;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtB,MAAM,UAAU,GAAkB,EAAE,CAAA;YACpC,MAAM,cAAc,GAChB,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,iBAAiB;iBAC/C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACZ,UAAU,CAAC,MAAM,CAAC,gBAAiB,CAAC,YAAY,CAAC;oBAC7C,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;gBACnD,OAAO,CACH,iBAAiB;oBACjB,GAAG;oBACH,MAAM,CAAC,YAAY;oBACnB,MAAM;oBACN,MAAM,CAAC,gBAAiB,CAAC,YAAY,CACxC,CAAA;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAChC,SAAS,CACN,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAC5C,iBAAiB,EACjB,aAAa,CAChB;iBACA,KAAK,CAAC,cAAc,CAAC;iBACrB,aAAa,CAAC,UAAU,CAAC,CAAA;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACjD,MAAM,aAAa,GACf,SAAS;gBACT,IAAI,CAAC,QAAQ,CAAC,mBAAoB,CAAC,YAAY;gBAC/C,WAAW;gBACX,KAAK;gBACL,GAAG;gBACH,IAAI,CAAC,QAAQ,CAAC,mBAAoB,CAAC,YAAY;gBAC/C,OAAO;gBACP,KAAK;gBACL,GAAG;gBACH,IAAI,CAAC,QAAQ,CAAC,oBAAqB,CAAC,YAAY,CAAA;YACpD,MAAM,UAAU,GAAkB,EAAE,CAAA;YACpC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ;iBAC/B,kBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;gBAChD,MAAM,aAAa,GACf,UAAU,CAAC,gBAAiB,CAAC,YAAY,CAAC,OAAO,CAC7C,GAAG,EACH,GAAG,CACN,CAAA;gBACL,UAAU,CAAC,aAAa,CAAC;oBACrB,UAAU,CAAC,gBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;gBACvD,OAAO,CACH,SAAS;oBACT,UAAU,CAAC,gBAAiB,CAAC,YAAY;oBACzC,MAAM;oBACN,aAAa,CAChB,CAAA;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,OAAO,CAAC,CAAA;YAElB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAChC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC;iBAC5D,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YACxD,+HAA+H;YAC/H,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC/C,MAAM,QAAQ,GAAG,EAAE;qBACd,QAAQ,EAAE;qBACV,MAAM,CACH,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,IACvB,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAC1C,EAAE,EACF,MAAM,CACT;qBACA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;qBACpD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;gBAErD,IACI,yBAAW,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAC5D,CAAC;oBACC,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,KAAK,IACvC,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAC1C,SAAS,CAAA;gBACb,CAAC;qBAAM,CAAC;oBACJ,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAC9C,IAAI,CAAC,QAAQ,CAAC,sBAAuB,CAAC,YAC1C,QAAQ,CAAA;gBACZ,CAAC;YACL,CAAC,CAAC,CAAA;QACN,CAAC;QAED,MAAM,IAAI,2BAAY,CAAC,iCAAiC,CAAC,CAAA;IAC7D,CAAC;CAQJ;AAlZD,wCAkZC","file":"TreeRepository.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\nimport { TypeORMError } from \"../error/TypeORMError\"\nimport { FindOptionsUtils } from \"../find-options/FindOptionsUtils\"\nimport { FindTreeOptions } from \"../find-options/FindTreeOptions\"\nimport { SelectQueryBuilder } from \"../query-builder/SelectQueryBuilder\"\nimport { TreeRepositoryUtils } from \"../util/TreeRepositoryUtils\"\nimport { Repository } from \"./Repository\"\n\n/**\n * Repository with additional functions to work with trees.\n *\n * @see Repository\n */\nexport class TreeRepository<\n Entity extends ObjectLiteral,\n> extends Repository<Entity> {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets complete trees for all roots in the table.\n */\n async findTrees(options?: FindTreeOptions): Promise<Entity[]> {\n const roots = await this.findRoots(options)\n await Promise.all(\n roots.map((root) => this.findDescendantsTree(root, options)),\n )\n return roots\n }\n\n /**\n * Roots are entities that have no ancestors. Finds them all.\n */\n findRoots(options?: FindTreeOptions): Promise<Entity[]> {\n const escapeAlias = (alias: string) =>\n this.manager.connection.driver.escape(alias)\n const escapeColumn = (column: string) =>\n this.manager.connection.driver.escape(column)\n\n const joinColumn = this.metadata.treeParentRelation!.joinColumns[0]\n const parentPropertyName =\n joinColumn.givenDatabaseName || joinColumn.databaseName\n\n const qb = this.createQueryBuilder(\"treeEntity\")\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n\n return qb\n .where(\n `${escapeAlias(\"treeEntity\")}.${escapeColumn(\n parentPropertyName,\n )} IS NULL`,\n )\n .getMany()\n }\n\n /**\n * Gets all children (descendants) of the given entity. Returns them all in a flat array.\n */\n findDescendants(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity[]> {\n const qb = this.createDescendantsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n return qb.getMany()\n }\n\n /**\n * Gets all children (descendants) of the given entity. Returns them in a tree - nested into each other.\n */\n async findDescendantsTree(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity> {\n // todo: throw exception if there is no column of this relation?\n\n const qb: SelectQueryBuilder<Entity> =\n this.createDescendantsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n\n const entities = await qb.getRawAndEntities()\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n \"treeEntity\",\n entities.raw,\n )\n TreeRepositoryUtils.buildChildrenEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n {\n depth: -1,\n ...options,\n },\n )\n\n return entity\n }\n\n /**\n * Gets number of descendants of the entity.\n */\n countDescendants(entity: Entity): Promise<number> {\n return this.createDescendantsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n ).getCount()\n }\n\n /**\n * Creates a query builder used to get descendants of the entities in a tree.\n */\n createDescendantsQueryBuilder(\n alias: string,\n closureTableAlias: string,\n entity: Entity,\n ): SelectQueryBuilder<Entity> {\n // create shortcuts for better readability\n const escape = (alias: string) =>\n this.manager.connection.driver.escape(alias)\n\n if (this.metadata.treeType === \"closure-table\") {\n const joinCondition =\n this.metadata.closureJunctionTable.descendantColumns\n .map((column) => {\n return (\n escape(closureTableAlias) +\n \".\" +\n escape(column.propertyPath) +\n \" = \" +\n escape(alias) +\n \".\" +\n escape(column.referencedColumn!.propertyPath)\n )\n })\n .join(\" AND \")\n\n const parameters: ObjectLiteral = {}\n const whereCondition =\n this.metadata.closureJunctionTable.ancestorColumns\n .map((column) => {\n parameters[column.referencedColumn!.propertyName] =\n column.referencedColumn!.getEntityValue(entity)\n return (\n escape(closureTableAlias) +\n \".\" +\n escape(column.propertyPath) +\n \" = :\" +\n column.referencedColumn!.propertyName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(\n this.metadata.closureJunctionTable.tablePath,\n closureTableAlias,\n joinCondition,\n )\n .where(whereCondition)\n .setParameters(parameters)\n } else if (this.metadata.treeType === \"nested-set\") {\n const whereCondition =\n alias +\n \".\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" BETWEEN \" +\n \"joined.\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" AND joined.\" +\n this.metadata.nestedSetRightColumn!.propertyPath\n const parameters: ObjectLiteral = {}\n const joinCondition = this.metadata\n .treeParentRelation!.joinColumns.map((joinColumn) => {\n const parameterName =\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n parameters[parameterName] =\n joinColumn.referencedColumn!.getEntityValue(entity)\n return (\n \"joined.\" +\n joinColumn.referencedColumn!.propertyPath +\n \" = :\" +\n parameterName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(this.metadata.targetName, \"joined\", whereCondition)\n .where(joinCondition, parameters)\n } else if (this.metadata.treeType === \"materialized-path\") {\n return this.createQueryBuilder(alias).where((qb) => {\n const subQuery = qb\n .subQuery()\n .select(\n `${this.metadata.targetName}.${\n this.metadata.materializedPathColumn!.propertyPath\n }`,\n \"path\",\n )\n .from(this.metadata.target, this.metadata.targetName)\n .whereInIds(this.metadata.getEntityIdMap(entity))\n\n if (\n DriverUtils.isSQLiteFamily(this.manager.connection.driver)\n ) {\n return `${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n } LIKE ${subQuery.getQuery()} || '%'`\n } else {\n return `${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n } LIKE NULLIF(CONCAT(${subQuery.getQuery()}, '%'), '%')`\n }\n })\n }\n\n throw new TypeORMError(`Supported only in tree entities`)\n }\n\n /**\n * Gets all parents (ancestors) of the given entity. Returns them all in a flat array.\n */\n findAncestors(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity[]> {\n const qb = this.createAncestorsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n return qb.getMany()\n }\n\n /**\n * Gets all parents (ancestors) of the given entity. Returns them in a tree - nested into each other.\n */\n async findAncestorsTree(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity> {\n // todo: throw exception if there is no column of this relation?\n const qb = this.createAncestorsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n\n const entities = await qb.getRawAndEntities()\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n \"treeEntity\",\n entities.raw,\n )\n TreeRepositoryUtils.buildParentEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n )\n return entity\n }\n\n /**\n * Gets number of ancestors of the entity.\n */\n countAncestors(entity: Entity): Promise<number> {\n return this.createAncestorsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n ).getCount()\n }\n\n /**\n * Creates a query builder used to get ancestors of the entities in the tree.\n */\n createAncestorsQueryBuilder(\n alias: string,\n closureTableAlias: string,\n entity: Entity,\n ): SelectQueryBuilder<Entity> {\n // create shortcuts for better readability\n // const escape = (alias: string) => this.manager.connection.driver.escape(alias);\n\n if (this.metadata.treeType === \"closure-table\") {\n const joinCondition =\n this.metadata.closureJunctionTable.ancestorColumns\n .map((column) => {\n return (\n closureTableAlias +\n \".\" +\n column.propertyPath +\n \" = \" +\n alias +\n \".\" +\n column.referencedColumn!.propertyPath\n )\n })\n .join(\" AND \")\n\n const parameters: ObjectLiteral = {}\n const whereCondition =\n this.metadata.closureJunctionTable.descendantColumns\n .map((column) => {\n parameters[column.referencedColumn!.propertyName] =\n column.referencedColumn!.getEntityValue(entity)\n return (\n closureTableAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n column.referencedColumn!.propertyName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(\n this.metadata.closureJunctionTable.tablePath,\n closureTableAlias,\n joinCondition,\n )\n .where(whereCondition)\n .setParameters(parameters)\n } else if (this.metadata.treeType === \"nested-set\") {\n const joinCondition =\n \"joined.\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" BETWEEN \" +\n alias +\n \".\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" AND \" +\n alias +\n \".\" +\n this.metadata.nestedSetRightColumn!.propertyPath\n const parameters: ObjectLiteral = {}\n const whereCondition = this.metadata\n .treeParentRelation!.joinColumns.map((joinColumn) => {\n const parameterName =\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n parameters[parameterName] =\n joinColumn.referencedColumn!.getEntityValue(entity)\n return (\n \"joined.\" +\n joinColumn.referencedColumn!.propertyPath +\n \" = :\" +\n parameterName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(this.metadata.targetName, \"joined\", joinCondition)\n .where(whereCondition, parameters)\n } else if (this.metadata.treeType === \"materialized-path\") {\n // example: SELECT * FROM category category WHERE (SELECT mpath FROM `category` WHERE id = 2) LIKE CONCAT(category.mpath, '%');\n return this.createQueryBuilder(alias).where((qb) => {\n const subQuery = qb\n .subQuery()\n .select(\n `${this.metadata.targetName}.${\n this.metadata.materializedPathColumn!.propertyPath\n }`,\n \"path\",\n )\n .from(this.metadata.target, this.metadata.targetName)\n .whereInIds(this.metadata.getEntityIdMap(entity))\n\n if (\n DriverUtils.isSQLiteFamily(this.manager.connection.driver)\n ) {\n return `${subQuery.getQuery()} LIKE ${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n } || '%'`\n } else {\n return `${subQuery.getQuery()} LIKE CONCAT(${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n }, '%')`\n }\n })\n }\n\n throw new TypeORMError(`Supported only in tree entities`)\n }\n\n /**\n * Moves entity to the children of then given entity.\n *\n move(entity: Entity, to: Entity): Promise<void> {\n return Promise.resolve();\n } */\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/repository/TreeRepository.ts"],"names":[],"mappings":"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","file":"TreeRepository.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\nimport { TypeORMError } from \"../error/TypeORMError\"\nimport { FindOptionsUtils } from \"../find-options/FindOptionsUtils\"\nimport { FindTreeOptions } from \"../find-options/FindTreeOptions\"\nimport { SelectQueryBuilder } from \"../query-builder/SelectQueryBuilder\"\nimport { TreeRepositoryUtils } from \"../util/TreeRepositoryUtils\"\nimport { Repository } from \"./Repository\"\n\n/**\n * Repository with additional functions to work with trees.\n *\n * @see Repository\n */\nexport class TreeRepository<\n Entity extends ObjectLiteral,\n> extends Repository<Entity> {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets complete trees for all roots in the table.\n */\n async findTrees(options?: FindTreeOptions): Promise<Entity[]> {\n const roots = await this.findRoots(options)\n await Promise.all(\n roots.map((root) => this.findDescendantsTree(root, options)),\n )\n return roots\n }\n\n /**\n * Roots are entities that have no ancestors. Finds them all.\n */\n findRoots(options?: FindTreeOptions): Promise<Entity[]> {\n const escapeAlias = (alias: string) =>\n this.manager.connection.driver.escape(alias)\n const escapeColumn = (column: string) =>\n this.manager.connection.driver.escape(column)\n\n const joinColumn = this.metadata.treeParentRelation!.joinColumns[0]\n const parentPropertyName =\n joinColumn.givenDatabaseName || joinColumn.databaseName\n\n const qb = this.createQueryBuilder(\"treeEntity\")\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n\n return qb\n .where(\n `${escapeAlias(\"treeEntity\")}.${escapeColumn(\n parentPropertyName,\n )} IS NULL`,\n )\n .getMany()\n }\n\n /**\n * Gets all children (descendants) of the given entity. Returns them all in a flat array.\n */\n findDescendants(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity[]> {\n const qb = this.createDescendantsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n return qb.getMany()\n }\n\n /**\n * Gets all children (descendants) of the given entity. Returns them in a tree - nested into each other.\n */\n async findDescendantsTree(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity> {\n // todo: throw exception if there is no column of this relation?\n\n const qb: SelectQueryBuilder<Entity> =\n this.createDescendantsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n\n const entities = await qb.getRawAndEntities()\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n \"treeEntity\",\n entities.raw,\n )\n TreeRepositoryUtils.buildChildrenEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n {\n depth: -1,\n ...options,\n },\n )\n\n return entity\n }\n\n /**\n * Gets number of descendants of the entity.\n */\n countDescendants(entity: Entity): Promise<number> {\n return this.createDescendantsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n ).getCount()\n }\n\n /**\n * Creates a query builder used to get descendants of the entities in a tree.\n */\n createDescendantsQueryBuilder(\n alias: string,\n closureTableAlias: string,\n entity: Entity,\n ): SelectQueryBuilder<Entity> {\n // create shortcuts for better readability\n const escape = (alias: string) =>\n this.manager.connection.driver.escape(alias)\n\n if (this.metadata.treeType === \"closure-table\") {\n const joinCondition =\n this.metadata.closureJunctionTable.descendantColumns\n .map((column) => {\n return (\n escape(closureTableAlias) +\n \".\" +\n escape(column.propertyPath) +\n \" = \" +\n escape(alias) +\n \".\" +\n escape(column.referencedColumn!.propertyPath)\n )\n })\n .join(\" AND \")\n\n const parameters: ObjectLiteral = {}\n const whereCondition =\n this.metadata.closureJunctionTable.ancestorColumns\n .map((column) => {\n parameters[column.referencedColumn!.propertyName] =\n column.referencedColumn!.getEntityValue(entity)\n return (\n escape(closureTableAlias) +\n \".\" +\n escape(column.propertyPath) +\n \" = :\" +\n column.referencedColumn!.propertyName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(\n this.metadata.closureJunctionTable.target,\n closureTableAlias,\n joinCondition,\n )\n .where(whereCondition)\n .setParameters(parameters)\n } else if (this.metadata.treeType === \"nested-set\") {\n const whereCondition =\n alias +\n \".\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" BETWEEN \" +\n \"joined.\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" AND joined.\" +\n this.metadata.nestedSetRightColumn!.propertyPath\n const parameters: ObjectLiteral = {}\n const joinCondition = this.metadata\n .treeParentRelation!.joinColumns.map((joinColumn) => {\n const parameterName =\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n parameters[parameterName] =\n joinColumn.referencedColumn!.getEntityValue(entity)\n return (\n \"joined.\" +\n joinColumn.referencedColumn!.propertyPath +\n \" = :\" +\n parameterName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(this.metadata.targetName, \"joined\", whereCondition)\n .where(joinCondition, parameters)\n } else if (this.metadata.treeType === \"materialized-path\") {\n return this.createQueryBuilder(alias).where((qb) => {\n const subQuery = qb\n .subQuery()\n .select(\n `${this.metadata.targetName}.${\n this.metadata.materializedPathColumn!.propertyPath\n }`,\n \"path\",\n )\n .from(this.metadata.target, this.metadata.targetName)\n .whereInIds(this.metadata.getEntityIdMap(entity))\n\n if (\n DriverUtils.isSQLiteFamily(this.manager.connection.driver)\n ) {\n return `${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n } LIKE ${subQuery.getQuery()} || '%'`\n } else {\n return `${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n } LIKE NULLIF(CONCAT(${subQuery.getQuery()}, '%'), '%')`\n }\n })\n }\n\n throw new TypeORMError(`Supported only in tree entities`)\n }\n\n /**\n * Gets all parents (ancestors) of the given entity. Returns them all in a flat array.\n */\n findAncestors(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity[]> {\n const qb = this.createAncestorsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n return qb.getMany()\n }\n\n /**\n * Gets all parents (ancestors) of the given entity. Returns them in a tree - nested into each other.\n */\n async findAncestorsTree(\n entity: Entity,\n options?: FindTreeOptions,\n ): Promise<Entity> {\n // todo: throw exception if there is no column of this relation?\n const qb = this.createAncestorsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n )\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options)\n\n const entities = await qb.getRawAndEntities()\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n \"treeEntity\",\n entities.raw,\n )\n TreeRepositoryUtils.buildParentEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n )\n return entity\n }\n\n /**\n * Gets number of ancestors of the entity.\n */\n countAncestors(entity: Entity): Promise<number> {\n return this.createAncestorsQueryBuilder(\n \"treeEntity\",\n \"treeClosure\",\n entity,\n ).getCount()\n }\n\n /**\n * Creates a query builder used to get ancestors of the entities in the tree.\n */\n createAncestorsQueryBuilder(\n alias: string,\n closureTableAlias: string,\n entity: Entity,\n ): SelectQueryBuilder<Entity> {\n // create shortcuts for better readability\n // const escape = (alias: string) => this.manager.connection.driver.escape(alias);\n\n if (this.metadata.treeType === \"closure-table\") {\n const joinCondition =\n this.metadata.closureJunctionTable.ancestorColumns\n .map((column) => {\n return (\n closureTableAlias +\n \".\" +\n column.propertyPath +\n \" = \" +\n alias +\n \".\" +\n column.referencedColumn!.propertyPath\n )\n })\n .join(\" AND \")\n\n const parameters: ObjectLiteral = {}\n const whereCondition =\n this.metadata.closureJunctionTable.descendantColumns\n .map((column) => {\n parameters[column.referencedColumn!.propertyName] =\n column.referencedColumn!.getEntityValue(entity)\n return (\n closureTableAlias +\n \".\" +\n column.propertyPath +\n \" = :\" +\n column.referencedColumn!.propertyName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(\n this.metadata.closureJunctionTable.target,\n closureTableAlias,\n joinCondition,\n )\n .where(whereCondition)\n .setParameters(parameters)\n } else if (this.metadata.treeType === \"nested-set\") {\n const joinCondition =\n \"joined.\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" BETWEEN \" +\n alias +\n \".\" +\n this.metadata.nestedSetLeftColumn!.propertyPath +\n \" AND \" +\n alias +\n \".\" +\n this.metadata.nestedSetRightColumn!.propertyPath\n const parameters: ObjectLiteral = {}\n const whereCondition = this.metadata\n .treeParentRelation!.joinColumns.map((joinColumn) => {\n const parameterName =\n joinColumn.referencedColumn!.propertyPath.replace(\n \".\",\n \"_\",\n )\n parameters[parameterName] =\n joinColumn.referencedColumn!.getEntityValue(entity)\n return (\n \"joined.\" +\n joinColumn.referencedColumn!.propertyPath +\n \" = :\" +\n parameterName\n )\n })\n .join(\" AND \")\n\n return this.createQueryBuilder(alias)\n .innerJoin(this.metadata.targetName, \"joined\", joinCondition)\n .where(whereCondition, parameters)\n } else if (this.metadata.treeType === \"materialized-path\") {\n // example: SELECT * FROM category category WHERE (SELECT mpath FROM `category` WHERE id = 2) LIKE CONCAT(category.mpath, '%');\n return this.createQueryBuilder(alias).where((qb) => {\n const subQuery = qb\n .subQuery()\n .select(\n `${this.metadata.targetName}.${\n this.metadata.materializedPathColumn!.propertyPath\n }`,\n \"path\",\n )\n .from(this.metadata.target, this.metadata.targetName)\n .whereInIds(this.metadata.getEntityIdMap(entity))\n\n if (\n DriverUtils.isSQLiteFamily(this.manager.connection.driver)\n ) {\n return `${subQuery.getQuery()} LIKE ${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n } || '%'`\n } else {\n return `${subQuery.getQuery()} LIKE CONCAT(${alias}.${\n this.metadata.materializedPathColumn!.propertyPath\n }, '%')`\n }\n })\n }\n\n throw new TypeORMError(`Supported only in tree entities`)\n }\n\n /**\n * Moves entity to the children of then given entity.\n *\n move(entity: Entity, to: Entity): Promise<void> {\n return Promise.resolve();\n } */\n}\n"],"sourceRoot":".."}
|
package/util/OrmUtils.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DeepPartial } from "../common/DeepPartial";
|
|
2
2
|
import { ObjectLiteral } from "../common/ObjectLiteral";
|
|
3
3
|
import { PrimitiveCriteria, SinglePrimitiveCriteria } from "../common/PrimitiveCriteria";
|
|
4
|
+
import type { InvalidFindOptionsWhereBehavior } from "../driver/types/InvalidFindOptionsWhereBehavior";
|
|
4
5
|
export declare class OrmUtils {
|
|
5
6
|
/**
|
|
6
7
|
* Chunks array into pieces.
|
|
@@ -53,7 +54,13 @@ export declare class OrmUtils {
|
|
|
53
54
|
*/
|
|
54
55
|
static parseSqlCheckExpression(sql: string, columnName: string): string[] | undefined;
|
|
55
56
|
/**
|
|
56
|
-
* Checks
|
|
57
|
+
* Checks whether the given criteria is null or wholly empty — `null`,
|
|
58
|
+
* `undefined`, `""`, an empty array, or an empty plain object. Does not
|
|
59
|
+
* recurse into array elements, so it is safe on self-referential/cyclic
|
|
60
|
+
* arrays. Per-element OR-branch emptiness (an array containing an empty
|
|
61
|
+
* element) is handled where object criteria is validated, not here.
|
|
62
|
+
*
|
|
63
|
+
* @param criteria
|
|
57
64
|
*/
|
|
58
65
|
static isCriteriaNullOrEmpty(criteria: unknown): boolean;
|
|
59
66
|
/**
|
|
@@ -71,16 +78,16 @@ export declare class OrmUtils {
|
|
|
71
78
|
private static mergeObjectKey;
|
|
72
79
|
private static merge;
|
|
73
80
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
81
|
+
* Applies invalidWhereValuesBehavior to a plain-object where criteria: for
|
|
82
|
+
* each own key a null/undefined value is thrown on, skipped, or converted
|
|
83
|
+
* to IsNull() per the configured behavior. Only plain FindOptionsWhere
|
|
84
|
+
* objects are normalized; anything else (entity/class instances,
|
|
85
|
+
* FindOperators, arrays, Date, Buffer, primitives) — and the criteria when
|
|
86
|
+
* no behavior is configured — is returned untouched.
|
|
87
|
+
*
|
|
76
88
|
* @param criteria
|
|
77
89
|
* @param options
|
|
78
|
-
* @param options.null
|
|
79
|
-
* @param options.undefined
|
|
80
90
|
* @param path
|
|
81
91
|
*/
|
|
82
|
-
static normalizeWhereCriteria(criteria:
|
|
83
|
-
null?: "ignore" | "sql-null" | "throw";
|
|
84
|
-
undefined?: "ignore" | "throw";
|
|
85
|
-
}, path?: string): ObjectLiteral;
|
|
92
|
+
static normalizeWhereCriteria(criteria: any, options?: InvalidFindOptionsWhereBehavior, path?: string): any;
|
|
86
93
|
}
|
package/util/OrmUtils.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OrmUtils = void 0;
|
|
4
|
-
const InstanceChecker_1 = require("./InstanceChecker");
|
|
5
4
|
const error_1 = require("../error");
|
|
6
5
|
const IsNull_1 = require("../find-options/operator/IsNull");
|
|
7
6
|
class OrmUtils {
|
|
@@ -260,7 +259,13 @@ class OrmUtils {
|
|
|
260
259
|
return undefined;
|
|
261
260
|
}
|
|
262
261
|
/**
|
|
263
|
-
* Checks
|
|
262
|
+
* Checks whether the given criteria is null or wholly empty — `null`,
|
|
263
|
+
* `undefined`, `""`, an empty array, or an empty plain object. Does not
|
|
264
|
+
* recurse into array elements, so it is safe on self-referential/cyclic
|
|
265
|
+
* arrays. Per-element OR-branch emptiness (an array containing an empty
|
|
266
|
+
* element) is handled where object criteria is validated, not here.
|
|
267
|
+
*
|
|
268
|
+
* @param criteria
|
|
264
269
|
*/
|
|
265
270
|
static isCriteriaNullOrEmpty(criteria) {
|
|
266
271
|
return (criteria === undefined ||
|
|
@@ -441,19 +446,37 @@ class OrmUtils {
|
|
|
441
446
|
}
|
|
442
447
|
}
|
|
443
448
|
/**
|
|
444
|
-
*
|
|
445
|
-
*
|
|
449
|
+
* Applies invalidWhereValuesBehavior to a plain-object where criteria: for
|
|
450
|
+
* each own key a null/undefined value is thrown on, skipped, or converted
|
|
451
|
+
* to IsNull() per the configured behavior. Only plain FindOptionsWhere
|
|
452
|
+
* objects are normalized; anything else (entity/class instances,
|
|
453
|
+
* FindOperators, arrays, Date, Buffer, primitives) — and the criteria when
|
|
454
|
+
* no behavior is configured — is returned untouched.
|
|
455
|
+
*
|
|
446
456
|
* @param criteria
|
|
447
457
|
* @param options
|
|
448
|
-
* @param options.null
|
|
449
|
-
* @param options.undefined
|
|
450
458
|
* @param path
|
|
451
459
|
*/
|
|
452
460
|
static normalizeWhereCriteria(criteria, options, path) {
|
|
453
|
-
if (!options)
|
|
461
|
+
if (!options) {
|
|
462
|
+
return criteria;
|
|
463
|
+
}
|
|
464
|
+
// multiple criteria are possible at the top level
|
|
465
|
+
if (!path && Array.isArray(criteria)) {
|
|
466
|
+
return criteria.map((criterion, index) => OrmUtils.normalizeWhereCriteria(criterion, options, String(index)));
|
|
467
|
+
}
|
|
468
|
+
// Only iterate a plain object criteria. Anything else — an entity/class
|
|
469
|
+
// instance, a FindOperator, an array, Date, Buffer, a primitive — is
|
|
470
|
+
// passed through untouched (its keys are not a bag of column
|
|
471
|
+
// conditions). Validating those properly would need entity metadata,
|
|
472
|
+
// which is out of scope here.
|
|
473
|
+
if (!OrmUtils.isPlainObject(criteria)) {
|
|
454
474
|
return criteria;
|
|
475
|
+
}
|
|
455
476
|
const result = {};
|
|
456
477
|
for (const [key, value] of Object.entries(criteria)) {
|
|
478
|
+
if (key === "__proto__")
|
|
479
|
+
continue;
|
|
457
480
|
const propertyPath = path ? `${path}.${key}` : key;
|
|
458
481
|
if (value === undefined) {
|
|
459
482
|
const behavior = options.undefined || "ignore";
|
|
@@ -461,7 +484,7 @@ class OrmUtils {
|
|
|
461
484
|
throw new error_1.TypeORMError(`Undefined value encountered in property '${propertyPath}' of a where condition. ` +
|
|
462
485
|
`Set 'invalidWhereValuesBehavior.undefined' to 'ignore' in connection options to skip properties with undefined values.`);
|
|
463
486
|
}
|
|
464
|
-
// "ignore" — skip this key
|
|
487
|
+
// else: "ignore" — skip this key
|
|
465
488
|
}
|
|
466
489
|
else if (value === null) {
|
|
467
490
|
const behavior = options.null || "ignore";
|
|
@@ -473,12 +496,9 @@ class OrmUtils {
|
|
|
473
496
|
else if (behavior === "sql-null") {
|
|
474
497
|
result[key] = (0, IsNull_1.IsNull)();
|
|
475
498
|
}
|
|
476
|
-
// "ignore" — skip this key
|
|
499
|
+
// else: "ignore" — skip this key
|
|
477
500
|
}
|
|
478
|
-
else if (
|
|
479
|
-
!Array.isArray(value) &&
|
|
480
|
-
!(value instanceof Date) &&
|
|
481
|
-
!InstanceChecker_1.InstanceChecker.isFindOperator(value)) {
|
|
501
|
+
else if (OrmUtils.isPlainObject(value)) {
|
|
482
502
|
const nested = OrmUtils.normalizeWhereCriteria(value, options, propertyPath);
|
|
483
503
|
if (Object.keys(nested).length > 0) {
|
|
484
504
|
result[key] = nested;
|
package/util/OrmUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/OrmUtils.ts"],"names":[],"mappings":"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","file":"OrmUtils.js","sourcesContent":["import { DeepPartial } from \"../common/DeepPartial\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport {\n PrimitiveCriteria,\n SinglePrimitiveCriteria,\n} from \"../common/PrimitiveCriteria\"\nimport { InstanceChecker } from \"./InstanceChecker\"\nimport { TypeORMError } from \"../error\"\nimport { IsNull } from \"../find-options/operator/IsNull\"\n\nexport class OrmUtils {\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Chunks array into pieces.\n */\n public static chunk<T>(array: T[], size: number): T[][] {\n return Array.from(Array(Math.ceil(array.length / size)), (_, i) => {\n return array.slice(i * size, i * size + size)\n })\n }\n\n public static splitClassesAndStrings<T>(\n classesAndStrings: (string | T)[],\n ): [T[], string[]] {\n return [\n classesAndStrings.filter(\n (cls): cls is T => typeof cls !== \"string\",\n ),\n classesAndStrings.filter(\n (str): str is string => typeof str === \"string\",\n ),\n ]\n }\n\n public static groupBy<T, R>(\n array: T[],\n propertyCallback: (item: T) => R,\n ): { id: R; items: T[] }[] {\n return array.reduce((groupedArray, value) => {\n const key = propertyCallback(value)\n let grouped = groupedArray.find((i) => i.id === key)\n if (!grouped) {\n grouped = { id: key, items: [] }\n groupedArray.push(grouped)\n }\n grouped.items.push(value)\n return groupedArray\n }, [] as Array<{ id: R; items: T[] }>)\n }\n\n public static uniq<T>(array: T[], criteria?: (item: T) => unknown): T[]\n public static uniq<T, K extends keyof T>(array: T[], property: K): T[]\n public static uniq<T, K extends keyof T>(\n array: T[],\n criteriaOrProperty?: ((item: T) => unknown) | K,\n ): T[] {\n return array.reduce((uniqueArray, item) => {\n let found: boolean = false\n if (typeof criteriaOrProperty === \"function\") {\n const itemValue = criteriaOrProperty(item)\n found = !!uniqueArray.find(\n (uniqueItem) =>\n criteriaOrProperty(uniqueItem) === itemValue,\n )\n } else if (typeof criteriaOrProperty === \"string\") {\n found = !!uniqueArray.find(\n (uniqueItem) =>\n uniqueItem[criteriaOrProperty] ===\n item[criteriaOrProperty],\n )\n } else {\n found = uniqueArray.indexOf(item) !== -1\n }\n\n if (!found) uniqueArray.push(item)\n\n return uniqueArray\n }, [] as T[])\n }\n\n /**\n * Deep Object.assign.\n */\n public static mergeDeep<T>(\n target: T,\n ...sources: (DeepPartial<T> | undefined)[]\n ): T {\n if (!sources.length) {\n return target\n }\n\n for (const source of sources) {\n OrmUtils.merge(target, source)\n }\n\n return target\n }\n\n /**\n * Creates a shallow copy of the object, without invoking the constructor\n */\n public static cloneObject<T extends object>(object: T): T {\n if (object === null || object === undefined) {\n return object\n }\n\n return Object.assign(\n Object.create(Object.getPrototypeOf(object)) as T,\n object,\n )\n }\n\n /**\n * Deep compare objects.\n *\n * @see http://stackoverflow.com/a/1144249\n */\n public static deepCompare<T>(...args: T[]): boolean {\n let i: any, l: any, leftChain: any, rightChain: any\n\n if (args.length < 1) {\n return true // Die silently? Don't know how to handle such case, please help...\n // throw \"Need two or more arguments to compare\";\n }\n\n for (i = 1, l = args.length; i < l; i++) {\n leftChain = [] // Todo: this can be cached\n rightChain = []\n\n if (\n !OrmUtils.compare2Objects(\n leftChain,\n rightChain,\n args[0],\n args[i],\n )\n ) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Gets deeper value of object.\n */\n public static deepValue(obj: ObjectLiteral, path: string): any {\n const segments = path.split(\".\")\n for (let i = 0, len = segments.length; i < len; i++) {\n obj = obj[segments[i]]\n }\n return obj\n }\n\n public static replaceEmptyObjectsWithBooleans(obj: any) {\n for (const key in obj) {\n if (obj[key] && typeof obj[key] === \"object\") {\n if (Object.keys(obj[key]).length === 0) {\n obj[key] = true\n } else {\n OrmUtils.replaceEmptyObjectsWithBooleans(obj[key])\n }\n }\n }\n }\n\n public static propertyPathsToTruthyObject(paths: string[]) {\n const obj: any = {}\n for (const path of paths) {\n const props = path.split(\".\")\n if (!props.length) continue\n\n if (!obj[props[0]] || obj[props[0]] === true) {\n obj[props[0]] = {}\n }\n let recursiveChild = obj[props[0]]\n for (const [key, prop] of props.entries()) {\n if (key === 0) continue\n\n if (recursiveChild[prop]) {\n recursiveChild = recursiveChild[prop]\n } else if (key === props.length - 1) {\n recursiveChild[prop] = {}\n recursiveChild = null\n } else {\n recursiveChild[prop] = {}\n recursiveChild = recursiveChild[prop]\n }\n }\n }\n OrmUtils.replaceEmptyObjectsWithBooleans(obj)\n return obj\n }\n\n /**\n * Check if two entity-id-maps are the same\n */\n public static compareIds(\n firstId: ObjectLiteral | undefined,\n secondId: ObjectLiteral | undefined,\n ): boolean {\n if (\n firstId === undefined ||\n firstId === null ||\n secondId === undefined ||\n secondId === null\n )\n return false\n\n // Optimized version for the common case\n if (\n ((typeof firstId.id === \"string\" &&\n typeof secondId.id === \"string\") ||\n (typeof firstId.id === \"number\" &&\n typeof secondId.id === \"number\")) &&\n Object.keys(firstId).length === 1 &&\n Object.keys(secondId).length === 1\n ) {\n return firstId.id === secondId.id\n }\n\n return OrmUtils.deepCompare(firstId, secondId)\n }\n\n /**\n * Transforms given value into boolean value.\n */\n public static toBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value\n\n if (typeof value === \"string\") return value === \"true\" || value === \"1\"\n\n if (typeof value === \"number\") return value > 0\n\n return false\n }\n\n /**\n * Checks if two arrays of unique values contain the same values\n */\n public static isArraysEqual<T>(arr1: T[], arr2: T[]): boolean {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n return arr1.every((element) => arr2.includes(element))\n }\n\n public static areMutuallyExclusive<T>(...lists: T[][]): boolean {\n const haveSharedObjects = lists.some((list) => {\n const otherLists = lists.filter((otherList) => otherList !== list)\n return list.some((item) =>\n otherLists.some((otherList) => otherList.includes(item)),\n )\n })\n return !haveSharedObjects\n }\n\n /**\n * Parses the CHECK constraint on the specified column and returns\n * all values allowed by the constraint or undefined if the constraint\n * is not present.\n */\n public static parseSqlCheckExpression(\n sql: string,\n columnName: string,\n ): string[] | undefined {\n const enumMatch = sql.match(\n new RegExp(\n `\"${columnName}\" varchar CHECK\\\\s*\\\\(\\\\s*\"${columnName}\"\\\\s+IN\\\\s*`,\n ),\n )\n\n if (enumMatch && enumMatch.index) {\n const afterMatch = sql.substring(\n enumMatch.index + enumMatch[0].length,\n )\n\n // This is an enum\n // all enum values stored as a comma separated list\n const chars = afterMatch\n\n /**\n * * When outside quotes: empty string\n * * When inside single quotes: `'`\n */\n let currentQuotes = \"\"\n let nextValue = \"\"\n const enumValues: string[] = []\n for (let idx = 0; idx < chars.length; idx++) {\n const char = chars[idx]\n switch (char) {\n case \",\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n nextValue = \"\"\n } else {\n nextValue += char\n }\n break\n case \"'\":\n if (currentQuotes == char) {\n const isNextCharQuote = chars[idx + 1] === char\n if (isNextCharQuote) {\n // double quote in sql should be treated as a\n // single quote that's part of the quoted string\n nextValue += char\n idx += 1 // skip that next quote\n } else {\n currentQuotes = \"\"\n }\n } else {\n currentQuotes = char\n }\n break\n case \")\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n return enumValues\n } else {\n nextValue += char\n }\n break\n default:\n if (currentQuotes != \"\") {\n nextValue += char\n }\n }\n }\n }\n return undefined\n }\n\n /**\n * Checks if given criteria is null or empty.\n */\n public static isCriteriaNullOrEmpty(criteria: unknown): boolean {\n return (\n criteria === undefined ||\n criteria === null ||\n criteria === \"\" ||\n (Array.isArray(criteria) && criteria.length === 0) ||\n (OrmUtils.isPlainObject(criteria) &&\n Object.keys(criteria).length === 0)\n )\n }\n\n /**\n * Checks if given criteria is a primitive value.\n * Primitive values are strings, numbers and dates.\n */\n public static isSinglePrimitiveCriteria(\n criteria: unknown,\n ): criteria is SinglePrimitiveCriteria {\n return (\n typeof criteria === \"string\" ||\n typeof criteria === \"number\" ||\n criteria instanceof Date\n )\n }\n\n /**\n * Checks if given criteria is a primitive value or an array of primitive values.\n */\n public static isPrimitiveCriteria(\n criteria: unknown,\n ): criteria is PrimitiveCriteria {\n if (Array.isArray(criteria)) {\n return criteria.every((value) =>\n OrmUtils.isSinglePrimitiveCriteria(value),\n )\n }\n\n return OrmUtils.isSinglePrimitiveCriteria(criteria)\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private static compare2Objects(\n leftChain: any,\n rightChain: any,\n x: any,\n y: any,\n ) {\n let p\n\n // remember that NaN === NaN returns false\n // and isNaN(undefined) returns true\n if (Number.isNaN(x) && Number.isNaN(y)) return true\n\n // Compare primitives and functions.\n // Check if both arguments link to the same object.\n // Especially useful on the step where we compare prototypes\n if (x === y) return true\n\n // Unequal, but either is null or undefined (use case: jsonb comparison)\n // PR #3776, todo: add tests\n if (x === null || y === null || x === undefined || y === undefined)\n return false\n\n // Fix the buffer compare bug.\n // See: https://github.com/typeorm/typeorm/issues/3654\n if (\n (typeof x.equals === \"function\" ||\n typeof x.equals === \"function\") &&\n x.equals(y)\n )\n return true\n\n // Works in case when functions are created in constructor.\n // Comparing dates is a common scenario. Another built-ins?\n // We can even handle functions passed across iframes\n if (\n (typeof x === \"function\" && typeof y === \"function\") ||\n (x instanceof Date && y instanceof Date) ||\n (x instanceof RegExp && y instanceof RegExp) ||\n (typeof x === \"string\" && typeof y === \"string\") ||\n (typeof x === \"number\" && typeof y === \"number\")\n )\n return x.toString() === y.toString()\n\n // At last checking prototypes as good as we can\n if (!(typeof x === \"object\" && typeof y === \"object\")) return false\n\n if (\n Object.prototype.isPrototypeOf.call(x, y) ||\n Object.prototype.isPrototypeOf.call(y, x)\n )\n return false\n\n if (x.constructor !== y.constructor) return false\n\n if (x.prototype !== y.prototype) return false\n\n // Check for infinitive linking loops\n if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1)\n return false\n\n // Quick checking of one object being a subset of another.\n // todo: cache the structure of arguments[0] for performance\n for (p in y) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n }\n\n for (p in x) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n\n switch (typeof x[p]) {\n case \"object\":\n case \"function\":\n leftChain.push(x)\n rightChain.push(y)\n\n if (\n !OrmUtils.compare2Objects(\n leftChain,\n rightChain,\n x[p],\n y[p],\n )\n ) {\n return false\n }\n\n leftChain.pop()\n rightChain.pop()\n break\n\n default:\n if (x[p] !== y[p]) {\n return false\n }\n break\n }\n }\n\n return true\n }\n\n // Checks if it's an object made by Object.create(null), {} or new Object()\n private static isPlainObject(item: any) {\n if (item === null || item === undefined) {\n return false\n }\n\n return !item.constructor || item.constructor === Object\n }\n\n private static mergeArrayKey(\n target: any,\n key: number,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n target[key] = memo.get(value)\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!OrmUtils.isPlainObject(value) && !Array.isArray(value)) {\n target[key] = value\n return\n }\n\n if (!target[key]) {\n target[key] = Array.isArray(value) ? [] : {}\n }\n\n memo.set(value, target[key])\n OrmUtils.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static mergeObjectKey(\n target: any,\n key: string,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n Object.assign(target, { [key]: memo.get(value) })\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!OrmUtils.isPlainObject(value) && !Array.isArray(value)) {\n Object.assign(target, { [key]: value })\n return\n }\n\n if (!target[key]) {\n Object.assign(target, { [key]: Array.isArray(value) ? [] : {} })\n }\n\n memo.set(value, target[key])\n OrmUtils.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static merge<T>(\n target: T,\n source: DeepPartial<T> | undefined,\n memo: Map<any, any> = new Map(),\n ): void {\n if (OrmUtils.isPlainObject(target) && OrmUtils.isPlainObject(source)) {\n for (const [key, value] of Object.entries(\n source as ObjectLiteral,\n )) {\n if (key === \"__proto__\") continue\n OrmUtils.mergeObjectKey(target, key, value, memo)\n }\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n for (let key = 0; key < source.length; key++) {\n OrmUtils.mergeArrayKey(target, key, source[key], memo)\n }\n }\n }\n\n /**\n * Recursively validates an object where clause, throwing for null/undefined\n * based on the provided invalidWhereValuesBehavior config.\n * @param criteria\n * @param options\n * @param options.null\n * @param options.undefined\n * @param path\n */\n static normalizeWhereCriteria(\n criteria: ObjectLiteral,\n options?: {\n null?: \"ignore\" | \"sql-null\" | \"throw\"\n undefined?: \"ignore\" | \"throw\"\n },\n path?: string,\n ): ObjectLiteral {\n if (!options) return criteria\n\n const result: ObjectLiteral = {}\n\n for (const [key, value] of Object.entries(criteria)) {\n const propertyPath = path ? `${path}.${key}` : key\n\n if (value === undefined) {\n const behavior = options.undefined || \"ignore\"\n if (behavior === \"throw\") {\n throw new TypeORMError(\n `Undefined value encountered in property '${propertyPath}' of a where condition. ` +\n `Set 'invalidWhereValuesBehavior.undefined' to 'ignore' in connection options to skip properties with undefined values.`,\n )\n }\n // \"ignore\" — skip this key\n } else if (value === null) {\n const behavior = options.null || \"ignore\"\n if (behavior === \"throw\") {\n throw new TypeORMError(\n `Null value encountered in property '${propertyPath}' of a where condition. ` +\n `To match with SQL NULL, the IsNull() operator must be used. ` +\n `Set 'invalidWhereValuesBehavior.null' to 'ignore' or 'sql-null' in connection options to skip or handle null values.`,\n )\n } else if (behavior === \"sql-null\") {\n result[key] = IsNull()\n }\n // \"ignore\" — skip this key\n } else if (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !InstanceChecker.isFindOperator(value)\n ) {\n const nested = OrmUtils.normalizeWhereCriteria(\n value,\n options,\n propertyPath,\n )\n if (Object.keys(nested).length > 0) {\n result[key] = nested\n }\n } else {\n result[key] = value\n }\n }\n\n return result\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/util/OrmUtils.ts"],"names":[],"mappings":"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","file":"OrmUtils.js","sourcesContent":["import { DeepPartial } from \"../common/DeepPartial\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport {\n PrimitiveCriteria,\n SinglePrimitiveCriteria,\n} from \"../common/PrimitiveCriteria\"\nimport type { InvalidFindOptionsWhereBehavior } from \"../driver/types/InvalidFindOptionsWhereBehavior\"\nimport { TypeORMError } from \"../error\"\nimport { IsNull } from \"../find-options/operator/IsNull\"\n\nexport class OrmUtils {\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Chunks array into pieces.\n */\n public static chunk<T>(array: T[], size: number): T[][] {\n return Array.from(Array(Math.ceil(array.length / size)), (_, i) => {\n return array.slice(i * size, i * size + size)\n })\n }\n\n public static splitClassesAndStrings<T>(\n classesAndStrings: (string | T)[],\n ): [T[], string[]] {\n return [\n classesAndStrings.filter(\n (cls): cls is T => typeof cls !== \"string\",\n ),\n classesAndStrings.filter(\n (str): str is string => typeof str === \"string\",\n ),\n ]\n }\n\n public static groupBy<T, R>(\n array: T[],\n propertyCallback: (item: T) => R,\n ): { id: R; items: T[] }[] {\n return array.reduce((groupedArray, value) => {\n const key = propertyCallback(value)\n let grouped = groupedArray.find((i) => i.id === key)\n if (!grouped) {\n grouped = { id: key, items: [] }\n groupedArray.push(grouped)\n }\n grouped.items.push(value)\n return groupedArray\n }, [] as Array<{ id: R; items: T[] }>)\n }\n\n public static uniq<T>(array: T[], criteria?: (item: T) => unknown): T[]\n public static uniq<T, K extends keyof T>(array: T[], property: K): T[]\n public static uniq<T, K extends keyof T>(\n array: T[],\n criteriaOrProperty?: ((item: T) => unknown) | K,\n ): T[] {\n return array.reduce((uniqueArray, item) => {\n let found: boolean = false\n if (typeof criteriaOrProperty === \"function\") {\n const itemValue = criteriaOrProperty(item)\n found = !!uniqueArray.find(\n (uniqueItem) =>\n criteriaOrProperty(uniqueItem) === itemValue,\n )\n } else if (typeof criteriaOrProperty === \"string\") {\n found = !!uniqueArray.find(\n (uniqueItem) =>\n uniqueItem[criteriaOrProperty] ===\n item[criteriaOrProperty],\n )\n } else {\n found = uniqueArray.indexOf(item) !== -1\n }\n\n if (!found) uniqueArray.push(item)\n\n return uniqueArray\n }, [] as T[])\n }\n\n /**\n * Deep Object.assign.\n */\n public static mergeDeep<T>(\n target: T,\n ...sources: (DeepPartial<T> | undefined)[]\n ): T {\n if (!sources.length) {\n return target\n }\n\n for (const source of sources) {\n OrmUtils.merge(target, source)\n }\n\n return target\n }\n\n /**\n * Creates a shallow copy of the object, without invoking the constructor\n */\n public static cloneObject<T extends object>(object: T): T {\n if (object === null || object === undefined) {\n return object\n }\n\n return Object.assign(\n Object.create(Object.getPrototypeOf(object)) as T,\n object,\n )\n }\n\n /**\n * Deep compare objects.\n *\n * @see http://stackoverflow.com/a/1144249\n */\n public static deepCompare<T>(...args: T[]): boolean {\n let i: any, l: any, leftChain: any, rightChain: any\n\n if (args.length < 1) {\n return true // Die silently? Don't know how to handle such case, please help...\n // throw \"Need two or more arguments to compare\";\n }\n\n for (i = 1, l = args.length; i < l; i++) {\n leftChain = [] // Todo: this can be cached\n rightChain = []\n\n if (\n !OrmUtils.compare2Objects(\n leftChain,\n rightChain,\n args[0],\n args[i],\n )\n ) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Gets deeper value of object.\n */\n public static deepValue(obj: ObjectLiteral, path: string): any {\n const segments = path.split(\".\")\n for (let i = 0, len = segments.length; i < len; i++) {\n obj = obj[segments[i]]\n }\n return obj\n }\n\n public static replaceEmptyObjectsWithBooleans(obj: any) {\n for (const key in obj) {\n if (obj[key] && typeof obj[key] === \"object\") {\n if (Object.keys(obj[key]).length === 0) {\n obj[key] = true\n } else {\n OrmUtils.replaceEmptyObjectsWithBooleans(obj[key])\n }\n }\n }\n }\n\n public static propertyPathsToTruthyObject(paths: string[]) {\n const obj: any = {}\n for (const path of paths) {\n const props = path.split(\".\")\n if (!props.length) continue\n\n if (!obj[props[0]] || obj[props[0]] === true) {\n obj[props[0]] = {}\n }\n let recursiveChild = obj[props[0]]\n for (const [key, prop] of props.entries()) {\n if (key === 0) continue\n\n if (recursiveChild[prop]) {\n recursiveChild = recursiveChild[prop]\n } else if (key === props.length - 1) {\n recursiveChild[prop] = {}\n recursiveChild = null\n } else {\n recursiveChild[prop] = {}\n recursiveChild = recursiveChild[prop]\n }\n }\n }\n OrmUtils.replaceEmptyObjectsWithBooleans(obj)\n return obj\n }\n\n /**\n * Check if two entity-id-maps are the same\n */\n public static compareIds(\n firstId: ObjectLiteral | undefined,\n secondId: ObjectLiteral | undefined,\n ): boolean {\n if (\n firstId === undefined ||\n firstId === null ||\n secondId === undefined ||\n secondId === null\n )\n return false\n\n // Optimized version for the common case\n if (\n ((typeof firstId.id === \"string\" &&\n typeof secondId.id === \"string\") ||\n (typeof firstId.id === \"number\" &&\n typeof secondId.id === \"number\")) &&\n Object.keys(firstId).length === 1 &&\n Object.keys(secondId).length === 1\n ) {\n return firstId.id === secondId.id\n }\n\n return OrmUtils.deepCompare(firstId, secondId)\n }\n\n /**\n * Transforms given value into boolean value.\n */\n public static toBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value\n\n if (typeof value === \"string\") return value === \"true\" || value === \"1\"\n\n if (typeof value === \"number\") return value > 0\n\n return false\n }\n\n /**\n * Checks if two arrays of unique values contain the same values\n */\n public static isArraysEqual<T>(arr1: T[], arr2: T[]): boolean {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n return arr1.every((element) => arr2.includes(element))\n }\n\n public static areMutuallyExclusive<T>(...lists: T[][]): boolean {\n const haveSharedObjects = lists.some((list) => {\n const otherLists = lists.filter((otherList) => otherList !== list)\n return list.some((item) =>\n otherLists.some((otherList) => otherList.includes(item)),\n )\n })\n return !haveSharedObjects\n }\n\n /**\n * Parses the CHECK constraint on the specified column and returns\n * all values allowed by the constraint or undefined if the constraint\n * is not present.\n */\n public static parseSqlCheckExpression(\n sql: string,\n columnName: string,\n ): string[] | undefined {\n const enumMatch = sql.match(\n new RegExp(\n `\"${columnName}\" varchar CHECK\\\\s*\\\\(\\\\s*\"${columnName}\"\\\\s+IN\\\\s*`,\n ),\n )\n\n if (enumMatch && enumMatch.index) {\n const afterMatch = sql.substring(\n enumMatch.index + enumMatch[0].length,\n )\n\n // This is an enum\n // all enum values stored as a comma separated list\n const chars = afterMatch\n\n /**\n * * When outside quotes: empty string\n * * When inside single quotes: `'`\n */\n let currentQuotes = \"\"\n let nextValue = \"\"\n const enumValues: string[] = []\n for (let idx = 0; idx < chars.length; idx++) {\n const char = chars[idx]\n switch (char) {\n case \",\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n nextValue = \"\"\n } else {\n nextValue += char\n }\n break\n case \"'\":\n if (currentQuotes == char) {\n const isNextCharQuote = chars[idx + 1] === char\n if (isNextCharQuote) {\n // double quote in sql should be treated as a\n // single quote that's part of the quoted string\n nextValue += char\n idx += 1 // skip that next quote\n } else {\n currentQuotes = \"\"\n }\n } else {\n currentQuotes = char\n }\n break\n case \")\":\n if (currentQuotes == \"\") {\n enumValues.push(nextValue)\n return enumValues\n } else {\n nextValue += char\n }\n break\n default:\n if (currentQuotes != \"\") {\n nextValue += char\n }\n }\n }\n }\n return undefined\n }\n\n /**\n * Checks whether the given criteria is null or wholly empty — `null`,\n * `undefined`, `\"\"`, an empty array, or an empty plain object. Does not\n * recurse into array elements, so it is safe on self-referential/cyclic\n * arrays. Per-element OR-branch emptiness (an array containing an empty\n * element) is handled where object criteria is validated, not here.\n *\n * @param criteria\n */\n public static isCriteriaNullOrEmpty(criteria: unknown): boolean {\n return (\n criteria === undefined ||\n criteria === null ||\n criteria === \"\" ||\n (Array.isArray(criteria) && criteria.length === 0) ||\n (OrmUtils.isPlainObject(criteria) &&\n Object.keys(criteria).length === 0)\n )\n }\n\n /**\n * Checks if given criteria is a primitive value.\n * Primitive values are strings, numbers and dates.\n */\n public static isSinglePrimitiveCriteria(\n criteria: unknown,\n ): criteria is SinglePrimitiveCriteria {\n return (\n typeof criteria === \"string\" ||\n typeof criteria === \"number\" ||\n criteria instanceof Date\n )\n }\n\n /**\n * Checks if given criteria is a primitive value or an array of primitive values.\n */\n public static isPrimitiveCriteria(\n criteria: unknown,\n ): criteria is PrimitiveCriteria {\n if (Array.isArray(criteria)) {\n return criteria.every((value) =>\n OrmUtils.isSinglePrimitiveCriteria(value),\n )\n }\n\n return OrmUtils.isSinglePrimitiveCriteria(criteria)\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private static compare2Objects(\n leftChain: any,\n rightChain: any,\n x: any,\n y: any,\n ) {\n let p\n\n // remember that NaN === NaN returns false\n // and isNaN(undefined) returns true\n if (Number.isNaN(x) && Number.isNaN(y)) return true\n\n // Compare primitives and functions.\n // Check if both arguments link to the same object.\n // Especially useful on the step where we compare prototypes\n if (x === y) return true\n\n // Unequal, but either is null or undefined (use case: jsonb comparison)\n // PR #3776, todo: add tests\n if (x === null || y === null || x === undefined || y === undefined)\n return false\n\n // Fix the buffer compare bug.\n // See: https://github.com/typeorm/typeorm/issues/3654\n if (\n (typeof x.equals === \"function\" ||\n typeof x.equals === \"function\") &&\n x.equals(y)\n )\n return true\n\n // Works in case when functions are created in constructor.\n // Comparing dates is a common scenario. Another built-ins?\n // We can even handle functions passed across iframes\n if (\n (typeof x === \"function\" && typeof y === \"function\") ||\n (x instanceof Date && y instanceof Date) ||\n (x instanceof RegExp && y instanceof RegExp) ||\n (typeof x === \"string\" && typeof y === \"string\") ||\n (typeof x === \"number\" && typeof y === \"number\")\n )\n return x.toString() === y.toString()\n\n // At last checking prototypes as good as we can\n if (!(typeof x === \"object\" && typeof y === \"object\")) return false\n\n if (\n Object.prototype.isPrototypeOf.call(x, y) ||\n Object.prototype.isPrototypeOf.call(y, x)\n )\n return false\n\n if (x.constructor !== y.constructor) return false\n\n if (x.prototype !== y.prototype) return false\n\n // Check for infinitive linking loops\n if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1)\n return false\n\n // Quick checking of one object being a subset of another.\n // todo: cache the structure of arguments[0] for performance\n for (p in y) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n }\n\n for (p in x) {\n if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n return false\n } else if (typeof y[p] !== typeof x[p]) {\n return false\n }\n\n switch (typeof x[p]) {\n case \"object\":\n case \"function\":\n leftChain.push(x)\n rightChain.push(y)\n\n if (\n !OrmUtils.compare2Objects(\n leftChain,\n rightChain,\n x[p],\n y[p],\n )\n ) {\n return false\n }\n\n leftChain.pop()\n rightChain.pop()\n break\n\n default:\n if (x[p] !== y[p]) {\n return false\n }\n break\n }\n }\n\n return true\n }\n\n // Checks if it's an object made by Object.create(null), {} or new Object()\n private static isPlainObject(item: any) {\n if (item === null || item === undefined) {\n return false\n }\n\n return !item.constructor || item.constructor === Object\n }\n\n private static mergeArrayKey(\n target: any,\n key: number,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n target[key] = memo.get(value)\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!OrmUtils.isPlainObject(value) && !Array.isArray(value)) {\n target[key] = value\n return\n }\n\n if (!target[key]) {\n target[key] = Array.isArray(value) ? [] : {}\n }\n\n memo.set(value, target[key])\n OrmUtils.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static mergeObjectKey(\n target: any,\n key: string,\n value: any,\n memo: Map<any, any>,\n ) {\n // Have we seen this before? Prevent infinite recursion.\n if (memo.has(value)) {\n Object.assign(target, { [key]: memo.get(value) })\n return\n }\n\n if (value instanceof Promise) {\n // Skip promises entirely.\n // This is a hold-over from the old code & is because we don't want to pull in\n // the lazy fields. Ideally we'd remove these promises via another function first\n // but for now we have to do it here.\n return\n }\n\n if (!OrmUtils.isPlainObject(value) && !Array.isArray(value)) {\n Object.assign(target, { [key]: value })\n return\n }\n\n if (!target[key]) {\n Object.assign(target, { [key]: Array.isArray(value) ? [] : {} })\n }\n\n memo.set(value, target[key])\n OrmUtils.merge(target[key], value, memo)\n memo.delete(value)\n }\n\n private static merge<T>(\n target: T,\n source: DeepPartial<T> | undefined,\n memo: Map<any, any> = new Map(),\n ): void {\n if (OrmUtils.isPlainObject(target) && OrmUtils.isPlainObject(source)) {\n for (const [key, value] of Object.entries(\n source as ObjectLiteral,\n )) {\n if (key === \"__proto__\") continue\n OrmUtils.mergeObjectKey(target, key, value, memo)\n }\n }\n\n if (Array.isArray(target) && Array.isArray(source)) {\n for (let key = 0; key < source.length; key++) {\n OrmUtils.mergeArrayKey(target, key, source[key], memo)\n }\n }\n }\n\n /**\n * Applies invalidWhereValuesBehavior to a plain-object where criteria: for\n * each own key a null/undefined value is thrown on, skipped, or converted\n * to IsNull() per the configured behavior. Only plain FindOptionsWhere\n * objects are normalized; anything else (entity/class instances,\n * FindOperators, arrays, Date, Buffer, primitives) — and the criteria when\n * no behavior is configured — is returned untouched.\n *\n * @param criteria\n * @param options\n * @param path\n */\n static normalizeWhereCriteria(\n criteria: any,\n options?: InvalidFindOptionsWhereBehavior,\n path?: string,\n ): any {\n if (!options) {\n return criteria\n }\n\n // multiple criteria are possible at the top level\n if (!path && Array.isArray(criteria)) {\n return criteria.map(\n (criterion, index): ObjectLiteral =>\n OrmUtils.normalizeWhereCriteria(\n criterion,\n options,\n String(index),\n ),\n )\n }\n\n // Only iterate a plain object criteria. Anything else — an entity/class\n // instance, a FindOperator, an array, Date, Buffer, a primitive — is\n // passed through untouched (its keys are not a bag of column\n // conditions). Validating those properly would need entity metadata,\n // which is out of scope here.\n if (!OrmUtils.isPlainObject(criteria)) {\n return criteria\n }\n\n const result: ObjectLiteral = {}\n for (const [key, value] of Object.entries(criteria)) {\n if (key === \"__proto__\") continue\n const propertyPath = path ? `${path}.${key}` : key\n\n if (value === undefined) {\n const behavior = options.undefined || \"ignore\"\n if (behavior === \"throw\") {\n throw new TypeORMError(\n `Undefined value encountered in property '${propertyPath}' of a where condition. ` +\n `Set 'invalidWhereValuesBehavior.undefined' to 'ignore' in connection options to skip properties with undefined values.`,\n )\n }\n // else: \"ignore\" — skip this key\n } else if (value === null) {\n const behavior = options.null || \"ignore\"\n if (behavior === \"throw\") {\n throw new TypeORMError(\n `Null value encountered in property '${propertyPath}' of a where condition. ` +\n `To match with SQL NULL, the IsNull() operator must be used. ` +\n `Set 'invalidWhereValuesBehavior.null' to 'ignore' or 'sql-null' in connection options to skip or handle null values.`,\n )\n } else if (behavior === \"sql-null\") {\n result[key] = IsNull()\n }\n // else: \"ignore\" — skip this key\n } else if (OrmUtils.isPlainObject(value)) {\n const nested = OrmUtils.normalizeWhereCriteria(\n value,\n options,\n propertyPath,\n )\n if (Object.keys(nested).length > 0) {\n result[key] = nested\n }\n } else {\n result[key] = value\n }\n }\n\n return result\n }\n}\n"],"sourceRoot":".."}
|