@loopback/repository 4.0.0-alpha.9 → 4.0.0
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 +25 -0
- package/README.md +93 -389
- package/dist/common-types.d.ts +96 -0
- package/dist/common-types.js +24 -0
- package/dist/common-types.js.map +1 -0
- package/dist/connectors/connector.d.ts +48 -0
- package/{lib → dist/connectors}/connector.js +1 -1
- package/dist/connectors/connector.js.map +1 -0
- package/{lib/crud-connector.d.ts → dist/connectors/crud.connector.d.ts} +51 -51
- package/{lib/common-types.js → dist/connectors/crud.connector.js} +2 -2
- package/dist/connectors/crud.connector.js.map +1 -0
- package/dist/connectors/index.d.ts +3 -0
- package/dist/connectors/index.js +11 -0
- package/dist/connectors/index.js.map +1 -0
- package/{lib6/kv-connector.d.ts → dist/connectors/kv.connector.d.ts} +28 -28
- package/{lib/datasource.js → dist/connectors/kv.connector.js} +2 -2
- package/dist/connectors/kv.connector.js.map +1 -0
- package/dist/datasource.d.ts +27 -0
- package/{lib6 → dist}/datasource.js +1 -1
- package/dist/datasource.js.map +1 -0
- package/dist/decorators/index.d.ts +3 -0
- package/dist/decorators/index.js +11 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/metadata.d.ts +12 -0
- package/dist/decorators/metadata.js +51 -0
- package/dist/decorators/metadata.js.map +1 -0
- package/dist/decorators/model.decorator.d.ts +40 -0
- package/dist/decorators/model.decorator.js +112 -0
- package/dist/decorators/model.decorator.js.map +1 -0
- package/dist/decorators/repository.decorator.d.ts +106 -0
- package/dist/decorators/repository.decorator.js +114 -0
- package/dist/decorators/repository.decorator.js.map +1 -0
- package/dist/define-model-class.d.ts +55 -0
- package/dist/define-model-class.js +57 -0
- package/dist/define-model-class.js.map +1 -0
- package/dist/define-repository-class.d.ts +119 -0
- package/dist/define-repository-class.js +98 -0
- package/dist/define-repository-class.js.map +1 -0
- package/dist/errors/entity-not-found.error.d.ts +8 -0
- package/dist/errors/entity-not-found.error.js +28 -0
- package/dist/errors/entity-not-found.error.js.map +1 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.js +10 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/invalid-relation.error.d.ts +10 -0
- package/dist/errors/invalid-relation.error.js +28 -0
- package/dist/errors/invalid-relation.error.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/keys.d.ts +34 -0
- package/dist/keys.js +44 -0
- package/dist/keys.js.map +1 -0
- package/dist/mixins/index.d.ts +1 -0
- package/dist/mixins/index.js +9 -0
- package/dist/mixins/index.js.map +1 -0
- package/dist/mixins/repository.mixin.d.ts +377 -0
- package/dist/mixins/repository.mixin.js +405 -0
- package/dist/mixins/repository.mixin.js.map +1 -0
- package/dist/model.d.ts +232 -0
- package/dist/model.js +367 -0
- package/dist/model.js.map +1 -0
- package/dist/relations/belongs-to/belongs-to.accessor.d.ts +17 -0
- package/dist/relations/belongs-to/belongs-to.accessor.js +40 -0
- package/dist/relations/belongs-to/belongs-to.accessor.js.map +1 -0
- package/dist/relations/belongs-to/belongs-to.decorator.d.ts +11 -0
- package/dist/relations/belongs-to/belongs-to.decorator.js +64 -0
- package/dist/relations/belongs-to/belongs-to.decorator.js.map +1 -0
- package/dist/relations/belongs-to/belongs-to.helpers.d.ts +17 -0
- package/dist/relations/belongs-to/belongs-to.helpers.js +63 -0
- package/dist/relations/belongs-to/belongs-to.helpers.js.map +1 -0
- package/dist/relations/belongs-to/belongs-to.inclusion-resolver.d.ts +14 -0
- package/dist/relations/belongs-to/belongs-to.inclusion-resolver.js +36 -0
- package/dist/relations/belongs-to/belongs-to.inclusion-resolver.js.map +1 -0
- package/dist/relations/belongs-to/belongs-to.repository.d.ts +28 -0
- package/dist/relations/belongs-to/belongs-to.repository.js +33 -0
- package/dist/relations/belongs-to/belongs-to.repository.js.map +1 -0
- package/dist/relations/belongs-to/index.d.ts +4 -0
- package/dist/relations/belongs-to/index.js +12 -0
- package/dist/relations/belongs-to/index.js.map +1 -0
- package/dist/relations/has-many/has-many-through.helpers.d.ts +182 -0
- package/dist/relations/has-many/has-many-through.helpers.js +282 -0
- package/dist/relations/has-many/has-many-through.helpers.js.map +1 -0
- package/dist/relations/has-many/has-many-through.inclusion-resolver.d.ts +16 -0
- package/dist/relations/has-many/has-many-through.inclusion-resolver.js +78 -0
- package/dist/relations/has-many/has-many-through.inclusion-resolver.js.map +1 -0
- package/dist/relations/has-many/has-many-through.repository-factory.d.ts +17 -0
- package/dist/relations/has-many/has-many-through.repository-factory.js +37 -0
- package/dist/relations/has-many/has-many-through.repository-factory.js.map +1 -0
- package/dist/relations/has-many/has-many-through.repository.d.ts +114 -0
- package/dist/relations/has-many/has-many-through.repository.js +103 -0
- package/dist/relations/has-many/has-many-through.repository.js.map +1 -0
- package/dist/relations/has-many/has-many.decorator.d.ts +11 -0
- package/dist/relations/has-many/has-many.decorator.js +36 -0
- package/dist/relations/has-many/has-many.decorator.js.map +1 -0
- package/dist/relations/has-many/has-many.helpers.d.ts +26 -0
- package/dist/relations/has-many/has-many.helpers.js +78 -0
- package/dist/relations/has-many/has-many.helpers.js.map +1 -0
- package/dist/relations/has-many/has-many.inclusion-resolver.d.ts +14 -0
- package/dist/relations/has-many/has-many.inclusion-resolver.js +45 -0
- package/dist/relations/has-many/has-many.inclusion-resolver.js.map +1 -0
- package/dist/relations/has-many/has-many.repository-factory.d.ts +28 -0
- package/dist/relations/has-many/has-many.repository-factory.js +39 -0
- package/dist/relations/has-many/has-many.repository-factory.js.map +1 -0
- package/dist/relations/has-many/has-many.repository.d.ts +54 -0
- package/dist/relations/has-many/has-many.repository.js +38 -0
- package/dist/relations/has-many/has-many.repository.js.map +1 -0
- package/dist/relations/has-many/index.d.ts +6 -0
- package/dist/relations/has-many/index.js +14 -0
- package/dist/relations/has-many/index.js.map +1 -0
- package/dist/relations/has-one/has-one.decorator.d.ts +3 -0
- package/dist/relations/has-one/has-one.decorator.js +37 -0
- package/dist/relations/has-one/has-one.decorator.js.map +1 -0
- package/dist/relations/has-one/has-one.helpers.d.ts +17 -0
- package/dist/relations/has-one/has-one.helpers.js +64 -0
- package/dist/relations/has-one/has-one.helpers.js.map +1 -0
- package/dist/relations/has-one/has-one.inclusion-resolver.d.ts +14 -0
- package/dist/relations/has-one/has-one.inclusion-resolver.js +35 -0
- package/dist/relations/has-one/has-one.inclusion-resolver.js.map +1 -0
- package/dist/relations/has-one/has-one.repository-factory.d.ts +28 -0
- package/dist/relations/has-one/has-one.repository-factory.js +39 -0
- package/dist/relations/has-one/has-one.repository-factory.js.map +1 -0
- package/dist/relations/has-one/has-one.repository.d.ts +53 -0
- package/dist/relations/has-one/has-one.repository.js +45 -0
- package/dist/relations/has-one/has-one.repository.js.map +1 -0
- package/dist/relations/has-one/index.d.ts +3 -0
- package/dist/relations/has-one/index.js +11 -0
- package/dist/relations/has-one/index.js.map +1 -0
- package/dist/relations/index.d.ts +6 -0
- package/dist/relations/index.js +14 -0
- package/dist/relations/index.js.map +1 -0
- package/dist/relations/relation.decorator.d.ts +39 -0
- package/dist/relations/relation.decorator.js +88 -0
- package/dist/relations/relation.decorator.js.map +1 -0
- package/dist/relations/relation.helpers.d.ts +105 -0
- package/dist/relations/relation.helpers.js +298 -0
- package/dist/relations/relation.helpers.js.map +1 -0
- package/dist/relations/relation.types.d.ts +142 -0
- package/dist/relations/relation.types.js +21 -0
- package/dist/relations/relation.types.js.map +1 -0
- package/dist/repositories/constraint-utils.d.ts +49 -0
- package/dist/repositories/constraint-utils.js +87 -0
- package/dist/repositories/constraint-utils.js.map +1 -0
- package/dist/repositories/index.d.ts +5 -0
- package/dist/repositories/index.js +13 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/kv.repository.bridge.d.ts +30 -0
- package/dist/repositories/kv.repository.bridge.js +76 -0
- package/dist/repositories/kv.repository.bridge.js.map +1 -0
- package/dist/repositories/kv.repository.d.ts +74 -0
- package/{lib/crud-connector.js → dist/repositories/kv.repository.js} +2 -2
- package/dist/repositories/kv.repository.js.map +1 -0
- package/dist/repositories/legacy-juggler-bridge.d.ts +305 -0
- package/dist/repositories/legacy-juggler-bridge.js +452 -0
- package/dist/repositories/legacy-juggler-bridge.js.map +1 -0
- package/dist/repositories/repository.d.ts +223 -0
- package/dist/repositories/repository.js +157 -0
- package/dist/repositories/repository.js.map +1 -0
- package/dist/transaction.d.ts +30 -0
- package/dist/transaction.js +18 -0
- package/dist/transaction.js.map +1 -0
- package/dist/type-resolver.d.ts +42 -0
- package/dist/type-resolver.js +61 -0
- package/dist/type-resolver.js.map +1 -0
- package/{lib → dist}/types/any.d.ts +1 -1
- package/{lib6 → dist}/types/any.js +3 -2
- package/dist/types/any.js.map +1 -0
- package/{lib6 → dist}/types/array.d.ts +4 -4
- package/{lib → dist}/types/array.js +6 -4
- package/dist/types/array.js.map +1 -0
- package/{lib → dist}/types/boolean.d.ts +1 -1
- package/{lib6 → dist}/types/boolean.js +3 -2
- package/dist/types/boolean.js.map +1 -0
- package/{lib6 → dist}/types/buffer.d.ts +2 -2
- package/{lib → dist}/types/buffer.js +8 -6
- package/dist/types/buffer.js.map +1 -0
- package/{lib → dist}/types/date.d.ts +1 -1
- package/{lib → dist}/types/date.js +6 -4
- package/dist/types/date.js.map +1 -0
- package/{lib → dist}/types/index.d.ts +11 -9
- package/dist/types/index.js +49 -0
- package/dist/types/index.js.map +1 -0
- package/{lib6 → dist}/types/model.d.ts +2 -1
- package/{lib6 → dist}/types/model.js +2 -2
- package/dist/types/model.js.map +1 -0
- package/dist/types/null.d.ts +12 -0
- package/{lib/types/boolean.js → dist/types/null.js} +12 -11
- package/dist/types/null.js.map +1 -0
- package/{lib6 → dist}/types/number.d.ts +1 -1
- package/{lib → dist}/types/number.js +6 -4
- package/dist/types/number.js.map +1 -0
- package/{lib → dist}/types/object.d.ts +1 -1
- package/{lib → dist}/types/object.js +7 -6
- package/dist/types/object.js.map +1 -0
- package/{lib → dist}/types/string.d.ts +1 -1
- package/{lib → dist}/types/string.js +3 -2
- package/dist/types/string.js.map +1 -0
- package/{lib6 → dist}/types/type.d.ts +7 -7
- package/{lib6 → dist}/types/type.js +1 -1
- package/dist/types/type.js.map +1 -0
- package/{lib → dist}/types/union.d.ts +1 -1
- package/{lib → dist}/types/union.js +6 -4
- package/dist/types/union.js.map +1 -0
- package/package.json +49 -33
- package/src/common-types.ts +123 -0
- package/src/connectors/connector.ts +70 -0
- package/src/connectors/crud.connector.ts +208 -0
- package/src/connectors/index.ts +8 -0
- package/src/connectors/kv.connector.ts +113 -0
- package/src/datasource.ts +37 -0
- package/src/decorators/index.ts +8 -0
- package/src/decorators/metadata.ts +84 -0
- package/src/decorators/model.decorator.ts +166 -0
- package/src/decorators/repository.decorator.ts +223 -0
- package/src/define-model-class.ts +90 -0
- package/src/define-repository-class.ts +170 -0
- package/src/errors/entity-not-found.error.ts +40 -0
- package/src/errors/index.ts +7 -0
- package/src/errors/invalid-relation.error.ts +39 -0
- package/src/index.ts +36 -0
- package/src/keys.ts +40 -0
- package/{index.d.ts → src/mixins/index.ts} +2 -2
- package/src/mixins/repository.mixin.ts +499 -0
- package/src/model.ts +539 -0
- package/src/relations/belongs-to/belongs-to.accessor.ts +74 -0
- package/src/relations/belongs-to/belongs-to.decorator.ts +81 -0
- package/src/relations/belongs-to/belongs-to.helpers.ts +78 -0
- package/src/relations/belongs-to/belongs-to.inclusion-resolver.ts +71 -0
- package/src/relations/belongs-to/belongs-to.repository.ts +55 -0
- package/src/relations/belongs-to/index.ts +9 -0
- package/src/relations/has-many/has-many-through.helpers.ts +361 -0
- package/src/relations/has-many/has-many-through.inclusion-resolver.ts +135 -0
- package/src/relations/has-many/has-many-through.repository-factory.ts +121 -0
- package/src/relations/has-many/has-many-through.repository.ts +318 -0
- package/src/relations/has-many/has-many.decorator.ts +38 -0
- package/src/relations/has-many/has-many.helpers.ts +100 -0
- package/src/relations/has-many/has-many.inclusion-resolver.ts +88 -0
- package/src/relations/has-many/has-many.repository-factory.ts +76 -0
- package/src/relations/has-many/has-many.repository.ts +118 -0
- package/src/relations/has-many/index.ts +11 -0
- package/src/relations/has-one/has-one.decorator.ts +40 -0
- package/src/relations/has-one/has-one.helpers.ts +84 -0
- package/src/relations/has-one/has-one.inclusion-resolver.ts +65 -0
- package/src/relations/has-one/has-one.repository-factory.ts +72 -0
- package/src/relations/has-one/has-one.repository.ts +127 -0
- package/src/relations/has-one/index.ts +8 -0
- package/src/relations/index.ts +11 -0
- package/src/relations/relation.decorator.ts +90 -0
- package/src/relations/relation.helpers.ts +364 -0
- package/src/relations/relation.types.ts +180 -0
- package/src/repositories/constraint-utils.ts +98 -0
- package/src/repositories/index.ts +10 -0
- package/src/repositories/kv.repository.bridge.ts +97 -0
- package/src/repositories/kv.repository.ts +87 -0
- package/src/repositories/legacy-juggler-bridge.ts +788 -0
- package/src/repositories/repository.ts +441 -0
- package/src/transaction.ts +39 -0
- package/src/type-resolver.ts +98 -0
- package/src/types/any.ts +38 -0
- package/src/types/array.ts +53 -0
- package/src/types/boolean.ts +35 -0
- package/src/types/buffer.ts +53 -0
- package/src/types/date.ts +61 -0
- package/src/types/index.ts +52 -0
- package/src/types/model.ts +24 -0
- package/src/types/null.ts +35 -0
- package/src/types/number.ts +42 -0
- package/src/types/object.ts +53 -0
- package/src/types/string.ts +42 -0
- package/src/types/type.ts +51 -0
- package/src/types/union.ts +55 -0
- package/api-docs/apple-touch-icon-114x114-precomposed.png +0 -0
- package/api-docs/apple-touch-icon-144x144-precomposed.png +0 -0
- package/api-docs/apple-touch-icon-57x57-precomposed.png +0 -0
- package/api-docs/apple-touch-icon-72x72-precomposed.png +0 -0
- package/api-docs/apple-touch-icon-precomposed.png +0 -0
- package/api-docs/apple-touch-icon.png +0 -0
- package/api-docs/css/bootstrap.min.css +0 -9
- package/api-docs/css/code-themes/arta.css +0 -158
- package/api-docs/css/code-themes/ascetic.css +0 -50
- package/api-docs/css/code-themes/brown_paper.css +0 -104
- package/api-docs/css/code-themes/brown_papersq.png +0 -0
- package/api-docs/css/code-themes/dark.css +0 -103
- package/api-docs/css/code-themes/default.css +0 -135
- package/api-docs/css/code-themes/far.css +0 -111
- package/api-docs/css/code-themes/github.css +0 -127
- package/api-docs/css/code-themes/googlecode.css +0 -144
- package/api-docs/css/code-themes/idea.css +0 -121
- package/api-docs/css/code-themes/ir_black.css +0 -104
- package/api-docs/css/code-themes/magula.css +0 -121
- package/api-docs/css/code-themes/monokai.css +0 -114
- package/api-docs/css/code-themes/pojoaque.css +0 -104
- package/api-docs/css/code-themes/pojoaque.jpg +0 -0
- package/api-docs/css/code-themes/rainbow.css +0 -114
- package/api-docs/css/code-themes/school_book.css +0 -111
- package/api-docs/css/code-themes/school_book.png +0 -0
- package/api-docs/css/code-themes/sl-theme.css +0 -45
- package/api-docs/css/code-themes/solarized_dark.css +0 -88
- package/api-docs/css/code-themes/solarized_light.css +0 -88
- package/api-docs/css/code-themes/sunburst.css +0 -158
- package/api-docs/css/code-themes/tomorrow-night-blue.css +0 -52
- package/api-docs/css/code-themes/tomorrow-night-bright.css +0 -51
- package/api-docs/css/code-themes/tomorrow-night-eighties.css +0 -51
- package/api-docs/css/code-themes/tomorrow-night.css +0 -52
- package/api-docs/css/code-themes/tomorrow.css +0 -49
- package/api-docs/css/code-themes/vs.css +0 -86
- package/api-docs/css/code-themes/xcode.css +0 -154
- package/api-docs/css/code-themes/zenburn.css +0 -115
- package/api-docs/css/main.css +0 -139
- package/api-docs/favicon.ico +0 -0
- package/api-docs/fonts/0ihfXUL2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
- package/api-docs/fonts/OsJ2DjdpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
- package/api-docs/fonts/_aijTyevf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
- package/api-docs/index.html +0 -18017
- package/api-docs/js/main.js +0 -19
- package/api-docs/js/vendor/bootstrap.min.js +0 -6
- package/api-docs/js/vendor/jquery-1.10.1.min.js +0 -6
- package/api-docs/js/vendor/jquery.scrollTo-1.4.3.1.js +0 -218
- package/api-docs/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js +0 -11
- package/index.js +0 -9
- package/lib/common-types.d.ts +0 -44
- package/lib/common-types.js.map +0 -1
- package/lib/connector.d.ts +0 -12
- package/lib/connector.js.map +0 -1
- package/lib/crud-connector.js.map +0 -1
- package/lib/datasource.d.ts +0 -11
- package/lib/datasource.js.map +0 -1
- package/lib/decorators/model.d.ts +0 -17
- package/lib/decorators/model.js +0 -55
- package/lib/decorators/model.js.map +0 -1
- package/lib/decorators/relation.d.ts +0 -65
- package/lib/decorators/relation.js +0 -126
- package/lib/decorators/relation.js.map +0 -1
- package/lib/decorators/repository.d.ts +0 -61
- package/lib/decorators/repository.js +0 -107
- package/lib/decorators/repository.js.map +0 -1
- package/lib/index.d.ts +0 -17
- package/lib/index.js +0 -21
- package/lib/index.js.map +0 -1
- package/lib/kv-connector.d.ts +0 -77
- package/lib/kv-connector.js +0 -7
- package/lib/kv-connector.js.map +0 -1
- package/lib/kv-repository.d.ts +0 -78
- package/lib/kv-repository.js +0 -7
- package/lib/kv-repository.js.map +0 -1
- package/lib/legacy-juggler-bridge.d.ts +0 -53
- package/lib/legacy-juggler-bridge.js +0 -142
- package/lib/legacy-juggler-bridge.js.map +0 -1
- package/lib/loopback-datasource-juggler.d.ts +0 -666
- package/lib/loopback-datasource-juggler.js +0 -8
- package/lib/loopback-datasource-juggler.js.map +0 -1
- package/lib/mixin.d.ts +0 -43
- package/lib/mixin.js +0 -34
- package/lib/mixin.js.map +0 -1
- package/lib/model.d.ts +0 -137
- package/lib/model.js +0 -182
- package/lib/model.js.map +0 -1
- package/lib/query.d.ts +0 -112
- package/lib/query.js +0 -25
- package/lib/query.js.map +0 -1
- package/lib/repository-mixin.d.ts +0 -20
- package/lib/repository-mixin.js +0 -111
- package/lib/repository-mixin.js.map +0 -1
- package/lib/repository.d.ts +0 -172
- package/lib/repository.js +0 -128
- package/lib/repository.js.map +0 -1
- package/lib/types/any.js +0 -35
- package/lib/types/any.js.map +0 -1
- package/lib/types/array.d.ts +0 -14
- package/lib/types/array.js.map +0 -1
- package/lib/types/boolean.js.map +0 -1
- package/lib/types/buffer.d.ts +0 -14
- package/lib/types/buffer.js.map +0 -1
- package/lib/types/date.js.map +0 -1
- package/lib/types/index.js +0 -33
- package/lib/types/index.js.map +0 -1
- package/lib/types/model.d.ts +0 -11
- package/lib/types/model.js +0 -25
- package/lib/types/model.js.map +0 -1
- package/lib/types/number.d.ts +0 -12
- package/lib/types/number.js.map +0 -1
- package/lib/types/object.js.map +0 -1
- package/lib/types/string.js.map +0 -1
- package/lib/types/type.d.ts +0 -38
- package/lib/types/type.js +0 -7
- package/lib/types/type.js.map +0 -1
- package/lib/types/union.js.map +0 -1
- package/lib6/common-types.d.ts +0 -44
- package/lib6/common-types.js +0 -7
- package/lib6/common-types.js.map +0 -1
- package/lib6/connector.d.ts +0 -12
- package/lib6/connector.js +0 -7
- package/lib6/connector.js.map +0 -1
- package/lib6/crud-connector.d.ts +0 -130
- package/lib6/crud-connector.js +0 -7
- package/lib6/crud-connector.js.map +0 -1
- package/lib6/datasource.d.ts +0 -11
- package/lib6/datasource.js.map +0 -1
- package/lib6/decorators/model.d.ts +0 -17
- package/lib6/decorators/model.js +0 -55
- package/lib6/decorators/model.js.map +0 -1
- package/lib6/decorators/relation.d.ts +0 -65
- package/lib6/decorators/relation.js +0 -126
- package/lib6/decorators/relation.js.map +0 -1
- package/lib6/decorators/repository.d.ts +0 -61
- package/lib6/decorators/repository.js +0 -117
- package/lib6/decorators/repository.js.map +0 -1
- package/lib6/index.d.ts +0 -17
- package/lib6/index.js +0 -21
- package/lib6/index.js.map +0 -1
- package/lib6/kv-connector.js +0 -7
- package/lib6/kv-connector.js.map +0 -1
- package/lib6/kv-repository.d.ts +0 -78
- package/lib6/kv-repository.js +0 -7
- package/lib6/kv-repository.js.map +0 -1
- package/lib6/legacy-juggler-bridge.d.ts +0 -53
- package/lib6/legacy-juggler-bridge.js +0 -158
- package/lib6/legacy-juggler-bridge.js.map +0 -1
- package/lib6/loopback-datasource-juggler.d.ts +0 -666
- package/lib6/loopback-datasource-juggler.js +0 -8
- package/lib6/loopback-datasource-juggler.js.map +0 -1
- package/lib6/mixin.d.ts +0 -43
- package/lib6/mixin.js +0 -34
- package/lib6/mixin.js.map +0 -1
- package/lib6/model.d.ts +0 -137
- package/lib6/model.js +0 -182
- package/lib6/model.js.map +0 -1
- package/lib6/query.d.ts +0 -112
- package/lib6/query.js +0 -25
- package/lib6/query.js.map +0 -1
- package/lib6/repository-mixin.d.ts +0 -20
- package/lib6/repository-mixin.js +0 -111
- package/lib6/repository-mixin.js.map +0 -1
- package/lib6/repository.d.ts +0 -172
- package/lib6/repository.js +0 -128
- package/lib6/repository.js.map +0 -1
- package/lib6/types/any.d.ts +0 -12
- package/lib6/types/any.js.map +0 -1
- package/lib6/types/array.js +0 -53
- package/lib6/types/array.js.map +0 -1
- package/lib6/types/boolean.d.ts +0 -12
- package/lib6/types/boolean.js.map +0 -1
- package/lib6/types/buffer.js +0 -57
- package/lib6/types/buffer.js.map +0 -1
- package/lib6/types/date.d.ts +0 -12
- package/lib6/types/date.js +0 -60
- package/lib6/types/date.js.map +0 -1
- package/lib6/types/index.d.ts +0 -30
- package/lib6/types/index.js +0 -33
- package/lib6/types/index.js.map +0 -1
- package/lib6/types/model.js.map +0 -1
- package/lib6/types/number.js +0 -40
- package/lib6/types/number.js.map +0 -1
- package/lib6/types/object.d.ts +0 -15
- package/lib6/types/object.js +0 -49
- package/lib6/types/object.js.map +0 -1
- package/lib6/types/string.d.ts +0 -12
- package/lib6/types/string.js +0 -40
- package/lib6/types/string.js.map +0 -1
- package/lib6/types/type.js.map +0 -1
- package/lib6/types/union.d.ts +0 -14
- package/lib6/types/union.js +0 -51
- package/lib6/types/union.js.map +0 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2018,2020. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
ClassDecoratorFactory,
|
|
8
|
+
MetadataAccessor,
|
|
9
|
+
MetadataInspector,
|
|
10
|
+
MetadataMap,
|
|
11
|
+
PropertyDecoratorFactory,
|
|
12
|
+
} from '@loopback/core';
|
|
13
|
+
import {
|
|
14
|
+
ModelDefinition,
|
|
15
|
+
ModelDefinitionSyntax,
|
|
16
|
+
PropertyDefinition,
|
|
17
|
+
PropertyType,
|
|
18
|
+
RelationDefinitionMap,
|
|
19
|
+
} from '../model';
|
|
20
|
+
import {RELATIONS_KEY} from '../relations/relation.decorator';
|
|
21
|
+
|
|
22
|
+
export const MODEL_KEY = MetadataAccessor.create<
|
|
23
|
+
Partial<ModelDefinitionSyntax>,
|
|
24
|
+
ClassDecorator
|
|
25
|
+
>('loopback:model');
|
|
26
|
+
export const MODEL_PROPERTIES_KEY = MetadataAccessor.create<
|
|
27
|
+
PropertyDefinition,
|
|
28
|
+
PropertyDecorator
|
|
29
|
+
>('loopback:model-properties');
|
|
30
|
+
export const MODEL_WITH_PROPERTIES_KEY = MetadataAccessor.create<
|
|
31
|
+
ModelDefinition,
|
|
32
|
+
ClassDecorator
|
|
33
|
+
>('loopback:model-and-properties');
|
|
34
|
+
|
|
35
|
+
export type PropertyMap = MetadataMap<Partial<PropertyDefinition>>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Decorator for model definitions
|
|
39
|
+
* @param definition
|
|
40
|
+
* @returns A class decorator for `model`
|
|
41
|
+
*/
|
|
42
|
+
export function model(definition?: Partial<ModelDefinitionSyntax>) {
|
|
43
|
+
return function (target: Function & {definition?: ModelDefinition}) {
|
|
44
|
+
definition = definition ?? {};
|
|
45
|
+
const def: ModelDefinitionSyntax = Object.assign(definition, {
|
|
46
|
+
name: definition.name ?? target.name,
|
|
47
|
+
});
|
|
48
|
+
const decorator = ClassDecoratorFactory.createDecorator(
|
|
49
|
+
MODEL_KEY,
|
|
50
|
+
definition,
|
|
51
|
+
{decoratorName: '@model'},
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
decorator(target);
|
|
55
|
+
|
|
56
|
+
// Build "ModelDefinition" and store it on model constructor
|
|
57
|
+
buildModelDefinition(target, def);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Build model definition from decorations
|
|
63
|
+
* @param target - Target model class
|
|
64
|
+
* @param def - Model definition spec
|
|
65
|
+
*/
|
|
66
|
+
export function buildModelDefinition(
|
|
67
|
+
target: Function & {definition?: ModelDefinition | undefined},
|
|
68
|
+
def?: ModelDefinitionSyntax,
|
|
69
|
+
) {
|
|
70
|
+
// Check if the definition for this class has been built (not from the super
|
|
71
|
+
// class)
|
|
72
|
+
const baseClass = Object.getPrototypeOf(target);
|
|
73
|
+
if (
|
|
74
|
+
!def &&
|
|
75
|
+
target.definition &&
|
|
76
|
+
baseClass &&
|
|
77
|
+
target.definition !== baseClass.definition
|
|
78
|
+
) {
|
|
79
|
+
return target.definition;
|
|
80
|
+
}
|
|
81
|
+
const modelDef = new ModelDefinition(def ?? {name: target.name});
|
|
82
|
+
const prototype = target.prototype;
|
|
83
|
+
const propertyMap: PropertyMap =
|
|
84
|
+
MetadataInspector.getAllPropertyMetadata(MODEL_PROPERTIES_KEY, prototype) ??
|
|
85
|
+
{};
|
|
86
|
+
for (const [propName, propDef] of Object.entries(propertyMap)) {
|
|
87
|
+
const designType =
|
|
88
|
+
propDef.type ??
|
|
89
|
+
MetadataInspector.getDesignTypeForProperty(prototype, propName);
|
|
90
|
+
if (!designType) {
|
|
91
|
+
const err: Error & {code?: string} = new Error(
|
|
92
|
+
`The definition of model property ${modelDef.name}.${propName} is missing ` +
|
|
93
|
+
'`type` field and TypeScript did not provide any design-time type. ' +
|
|
94
|
+
'Learn more at https://loopback.io/doc/en/lb4/Error-codes.html#cannot_infer_property_type',
|
|
95
|
+
);
|
|
96
|
+
err.code = 'CANNOT_INFER_PROPERTY_TYPE';
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (propDef.hidden) {
|
|
101
|
+
modelDef.settings.hiddenProperties =
|
|
102
|
+
modelDef.settings.hiddenProperties ?? [];
|
|
103
|
+
modelDef.settings.hiddenProperties.push(propName);
|
|
104
|
+
}
|
|
105
|
+
propDef.type = designType;
|
|
106
|
+
modelDef.addProperty(propName, propDef);
|
|
107
|
+
}
|
|
108
|
+
target.definition = modelDef;
|
|
109
|
+
const relationMeta: RelationDefinitionMap =
|
|
110
|
+
MetadataInspector.getAllPropertyMetadata(RELATIONS_KEY, prototype) ?? {};
|
|
111
|
+
const relations: RelationDefinitionMap = {};
|
|
112
|
+
// Build an object keyed by relation names
|
|
113
|
+
Object.values(relationMeta).forEach(r => {
|
|
114
|
+
relations[r.name] = r;
|
|
115
|
+
});
|
|
116
|
+
target.definition.relations = relations;
|
|
117
|
+
return modelDef;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Decorator for model properties
|
|
122
|
+
* @param definition
|
|
123
|
+
* @returns A property decorator
|
|
124
|
+
*/
|
|
125
|
+
export function property(definition?: Partial<PropertyDefinition>) {
|
|
126
|
+
return PropertyDecoratorFactory.createDecorator(
|
|
127
|
+
MODEL_PROPERTIES_KEY,
|
|
128
|
+
Object.assign({}, definition),
|
|
129
|
+
{decoratorName: '@property'},
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export namespace property {
|
|
134
|
+
export const ERR_PROP_NOT_ARRAY =
|
|
135
|
+
'@property.array can only decorate array properties!';
|
|
136
|
+
export const ERR_NO_ARGS = 'decorator received less than two parameters';
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
*
|
|
140
|
+
* @param itemType - The type of array items.
|
|
141
|
+
* Examples: `number`, `Product`, `() => Order`.
|
|
142
|
+
* @param definition - Optional PropertyDefinition object for additional
|
|
143
|
+
* metadata
|
|
144
|
+
*/
|
|
145
|
+
export function array(
|
|
146
|
+
itemType: PropertyType,
|
|
147
|
+
definition?: Partial<PropertyDefinition>,
|
|
148
|
+
) {
|
|
149
|
+
return function (target: object, propertyName: string) {
|
|
150
|
+
const propType = MetadataInspector.getDesignTypeForProperty(
|
|
151
|
+
target,
|
|
152
|
+
propertyName,
|
|
153
|
+
);
|
|
154
|
+
if (propType !== Array) {
|
|
155
|
+
throw new Error(ERR_PROP_NOT_ARRAY);
|
|
156
|
+
} else {
|
|
157
|
+
property(
|
|
158
|
+
Object.assign(
|
|
159
|
+
{type: Array, itemType} as Partial<PropertyDefinition>,
|
|
160
|
+
definition,
|
|
161
|
+
),
|
|
162
|
+
)(target, propertyName);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2018,2020. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {Context, inject, Injection} from '@loopback/core';
|
|
7
|
+
import assert from 'assert';
|
|
8
|
+
import {Class} from '../common-types';
|
|
9
|
+
import {DataSource} from '../datasource';
|
|
10
|
+
import {Entity, Model} from '../model';
|
|
11
|
+
import {DefaultCrudRepository, Repository} from '../repositories';
|
|
12
|
+
import {juggler} from '../repositories/legacy-juggler-bridge';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Type definition for decorators returned by `@repository` decorator factory
|
|
16
|
+
*/
|
|
17
|
+
export type RepositoryDecorator = (
|
|
18
|
+
target: Object,
|
|
19
|
+
key?: string,
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
descriptorOrIndex?: TypedPropertyDescriptor<any> | number,
|
|
22
|
+
) => void;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Metadata for a repository
|
|
26
|
+
*/
|
|
27
|
+
export class RepositoryMetadata {
|
|
28
|
+
/**
|
|
29
|
+
* Name of the predefined repository
|
|
30
|
+
*/
|
|
31
|
+
name?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Name of the model
|
|
34
|
+
*/
|
|
35
|
+
modelName?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Class of the model
|
|
38
|
+
*/
|
|
39
|
+
modelClass?: typeof Entity;
|
|
40
|
+
/**
|
|
41
|
+
* Name of the data source
|
|
42
|
+
*/
|
|
43
|
+
dataSourceName?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Instance of the data source
|
|
46
|
+
*/
|
|
47
|
+
dataSource?: juggler.DataSource | DataSource;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Constructor for RepositoryMetadata
|
|
51
|
+
*
|
|
52
|
+
* @param modelOrRepo - Name or class of the model. If the value is a string and
|
|
53
|
+
* `dataSource` is not present, it will treated as the name of a predefined
|
|
54
|
+
* repository
|
|
55
|
+
* @param dataSource - Name or instance of the data source
|
|
56
|
+
*
|
|
57
|
+
* For example:
|
|
58
|
+
*
|
|
59
|
+
* - new RepositoryMetadata(repoName);
|
|
60
|
+
* - new RepositoryMetadata(modelName, dataSourceName);
|
|
61
|
+
* - new RepositoryMetadata(modelClass, dataSourceInstance);
|
|
62
|
+
* - new RepositoryMetadata(modelName, dataSourceInstance);
|
|
63
|
+
* - new RepositoryMetadata(modelClass, dataSourceName);
|
|
64
|
+
*/
|
|
65
|
+
constructor(
|
|
66
|
+
modelOrRepo: string | typeof Entity,
|
|
67
|
+
dataSource?: string | juggler.DataSource | DataSource,
|
|
68
|
+
) {
|
|
69
|
+
this.name =
|
|
70
|
+
typeof modelOrRepo === 'string' && dataSource === undefined
|
|
71
|
+
? modelOrRepo
|
|
72
|
+
: undefined;
|
|
73
|
+
this.modelName =
|
|
74
|
+
typeof modelOrRepo === 'string' && dataSource != null
|
|
75
|
+
? modelOrRepo
|
|
76
|
+
: undefined;
|
|
77
|
+
this.modelClass =
|
|
78
|
+
typeof modelOrRepo === 'function' ? modelOrRepo : undefined;
|
|
79
|
+
this.dataSourceName =
|
|
80
|
+
typeof dataSource === 'string' ? dataSource : undefined;
|
|
81
|
+
this.dataSource = typeof dataSource === 'object' ? dataSource : undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Decorator for repository injections on properties or method arguments
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* class CustomerController {
|
|
91
|
+
* @repository(CustomerRepository) public custRepo: CustomerRepository;
|
|
92
|
+
*
|
|
93
|
+
* constructor(
|
|
94
|
+
* @repository(ProductRepository) public prodRepo: ProductRepository,
|
|
95
|
+
* ) {}
|
|
96
|
+
* // ...
|
|
97
|
+
* }
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* @param repositoryName - Name of the repo
|
|
101
|
+
*/
|
|
102
|
+
export function repository(
|
|
103
|
+
repositoryName: string | Class<Repository<Model>>,
|
|
104
|
+
): RepositoryDecorator;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Decorator for DefaultCrudRepository generation and injection on properties
|
|
108
|
+
* or method arguments based on the given model and dataSource (or their names)
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* class CustomerController {
|
|
113
|
+
* @repository('Customer', 'mySqlDataSource')
|
|
114
|
+
* public custRepo: DefaultCrudRepository<
|
|
115
|
+
* Customer,
|
|
116
|
+
* typeof Customer.prototype.id
|
|
117
|
+
* >;
|
|
118
|
+
*
|
|
119
|
+
* constructor(
|
|
120
|
+
* @repository(Product, mySqlDataSource)
|
|
121
|
+
* public prodRepo: DefaultCrudRepository<
|
|
122
|
+
* Product,
|
|
123
|
+
* typeof Product.prototype.id
|
|
124
|
+
* >,
|
|
125
|
+
* ) {}
|
|
126
|
+
* // ...
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @param model - Name/class of the model
|
|
131
|
+
* @param dataSource - Name/instance of the dataSource
|
|
132
|
+
*/
|
|
133
|
+
export function repository(
|
|
134
|
+
model: string | typeof Entity,
|
|
135
|
+
dataSource: string | juggler.DataSource,
|
|
136
|
+
): RepositoryDecorator;
|
|
137
|
+
|
|
138
|
+
export function repository(
|
|
139
|
+
modelOrRepo: string | Class<Repository<Model>> | typeof Entity,
|
|
140
|
+
dataSource?: string | juggler.DataSource,
|
|
141
|
+
) {
|
|
142
|
+
// if string, repository or not a model ctor,
|
|
143
|
+
// keep it a string / assign to ctor's name (string) for DI
|
|
144
|
+
const stringOrModel =
|
|
145
|
+
typeof modelOrRepo !== 'string' && !modelOrRepo.prototype.getId
|
|
146
|
+
? modelOrRepo.name
|
|
147
|
+
: (modelOrRepo as typeof Entity);
|
|
148
|
+
const meta = new RepositoryMetadata(stringOrModel, dataSource);
|
|
149
|
+
return function (
|
|
150
|
+
target: Object,
|
|
151
|
+
key?: string,
|
|
152
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
|
+
descriptorOrIndex?: TypedPropertyDescriptor<any> | number,
|
|
154
|
+
) {
|
|
155
|
+
if (key || typeof descriptorOrIndex === 'number') {
|
|
156
|
+
if (meta.name) {
|
|
157
|
+
// Make it shortcut to `@inject('repositories.MyRepo')`
|
|
158
|
+
// Please note key is undefined for constructor. If strictNullChecks
|
|
159
|
+
// is true, the compiler will complain as reflect-metadata won't
|
|
160
|
+
// accept undefined or null for key. Use ! to fool the compiler.
|
|
161
|
+
inject('repositories.' + meta.name, meta)(
|
|
162
|
+
target,
|
|
163
|
+
key!,
|
|
164
|
+
descriptorOrIndex,
|
|
165
|
+
);
|
|
166
|
+
} else {
|
|
167
|
+
// Use repository-factory to create a repository from model + dataSource
|
|
168
|
+
inject('', meta, resolve)(target, key!, descriptorOrIndex);
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// Mixin repository into the class
|
|
173
|
+
throw new Error('Class level @repository is not implemented');
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export namespace repository {
|
|
178
|
+
/**
|
|
179
|
+
* Decorator used to inject a Getter for a repository
|
|
180
|
+
* Mainly intended for usage with repository injections on relation repository
|
|
181
|
+
* factory
|
|
182
|
+
* @param nameOrClass - The repository class (ProductRepository) or a string name ('ProductRepository').
|
|
183
|
+
*/
|
|
184
|
+
export function getter(nameOrClass: string | Class<Repository<Model>>) {
|
|
185
|
+
const name =
|
|
186
|
+
typeof nameOrClass === 'string' ? nameOrClass : nameOrClass.name;
|
|
187
|
+
return inject.getter(`repositories.${name}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Resolve the @repository injection
|
|
193
|
+
* @param ctx - Context
|
|
194
|
+
* @param injection - Injection metadata
|
|
195
|
+
*/
|
|
196
|
+
async function resolve(ctx: Context, injection: Injection) {
|
|
197
|
+
const meta = injection.metadata as RepositoryMetadata;
|
|
198
|
+
let modelClass = meta.modelClass;
|
|
199
|
+
if (meta.modelName) {
|
|
200
|
+
modelClass = (await ctx.get('models.' + meta.modelName)) as typeof Entity;
|
|
201
|
+
}
|
|
202
|
+
if (!modelClass) {
|
|
203
|
+
throw new Error(
|
|
204
|
+
'Invalid repository config: ' +
|
|
205
|
+
' neither modelClass nor modelName was specified.',
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
let dataSource = meta.dataSource;
|
|
210
|
+
if (meta.dataSourceName) {
|
|
211
|
+
dataSource = await ctx.get<DataSource>(
|
|
212
|
+
'datasources.' + meta.dataSourceName,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
assert(
|
|
216
|
+
dataSource instanceof juggler.DataSource,
|
|
217
|
+
'DataSource must be provided',
|
|
218
|
+
);
|
|
219
|
+
return new DefaultCrudRepository(
|
|
220
|
+
modelClass,
|
|
221
|
+
dataSource! as juggler.DataSource,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import * as assert from 'assert';
|
|
7
|
+
import {DataObject, PrototypeOf} from './common-types';
|
|
8
|
+
import {model} from './decorators';
|
|
9
|
+
import {Model, ModelDefinition} from './model';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Create (define) a new model class with the given name and definition.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const Product = defineModelClass(Entity, new ModelDefinition('Product'));
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* To enable type safety, you should describe properties of your model:
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* const Product = defineModelClass<
|
|
24
|
+
* typeof Entity,
|
|
25
|
+
* {id: number, name: string}
|
|
26
|
+
* >(Entity, new ModelDefinition('Product'));
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* If your model allows arbitrary (free-form) properties, then add `AnyObject`
|
|
30
|
+
* to the type describing model properties.
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* const Product = defineModelClass<
|
|
34
|
+
* typeof Entity,
|
|
35
|
+
* AnyObject & {id: number},
|
|
36
|
+
* >(Entity, new ModelDefinition('Product'));
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @param base The base model to extend, typically Model or Entity.
|
|
40
|
+
* You can also use your own base class, e.g. `User`.
|
|
41
|
+
* @param definition Definition of the model to create.
|
|
42
|
+
* @typeParam BaseCtor Constructor type of the base class,
|
|
43
|
+
* e.g `typeof Model` or `typeof Entity`
|
|
44
|
+
* @typeParam Props Interface describing model properties,
|
|
45
|
+
* e.g. `{title: string}` or `AnyObject & {id: number}`.
|
|
46
|
+
*/
|
|
47
|
+
export function defineModelClass<
|
|
48
|
+
BaseCtor extends typeof Model,
|
|
49
|
+
Props extends object = {},
|
|
50
|
+
>(
|
|
51
|
+
base: BaseCtor /* Model or Entity */,
|
|
52
|
+
definition: ModelDefinition,
|
|
53
|
+
): DynamicModelCtor<BaseCtor, Props> {
|
|
54
|
+
const modelName = definition.name;
|
|
55
|
+
const defineNamedModelClass = new Function(
|
|
56
|
+
base.name,
|
|
57
|
+
`return class ${modelName} extends ${base.name} {}`,
|
|
58
|
+
);
|
|
59
|
+
const modelClass = defineNamedModelClass(base) as DynamicModelCtor<
|
|
60
|
+
BaseCtor,
|
|
61
|
+
Props
|
|
62
|
+
>;
|
|
63
|
+
assert.equal(modelClass.name, modelName);
|
|
64
|
+
|
|
65
|
+
// Apply `@model(definition)` to the generated class
|
|
66
|
+
model(definition)(modelClass);
|
|
67
|
+
return modelClass;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* A type describing a model class created via `defineModelClass`.
|
|
72
|
+
*
|
|
73
|
+
* Assuming template arguments `BaseCtor` and `Props`, this type describes
|
|
74
|
+
* a class constructor with the following properties:
|
|
75
|
+
* - a constructor function accepting `DataObject<Props>` as the only argument,
|
|
76
|
+
* this argument is optional
|
|
77
|
+
* - all static fields (properties, methods) from `BaseCtor` are inherited and
|
|
78
|
+
* available as static fields on the dynamic class
|
|
79
|
+
* - all prototype fields from `BaseCtor` prototype are inherited and available
|
|
80
|
+
* as prototype fields on the dynamic class
|
|
81
|
+
*/
|
|
82
|
+
export type DynamicModelCtor<
|
|
83
|
+
BaseCtor extends typeof Model,
|
|
84
|
+
Props extends object,
|
|
85
|
+
> = {
|
|
86
|
+
/** Model constructor accepting partial model data. */
|
|
87
|
+
new (
|
|
88
|
+
data?: DataObject<PrototypeOf<BaseCtor> & Props>,
|
|
89
|
+
): PrototypeOf<BaseCtor> & Props;
|
|
90
|
+
} & BaseCtor;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2020. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import assert from 'assert';
|
|
7
|
+
import {PrototypeOf} from './common-types';
|
|
8
|
+
import {Entity, Model} from './model';
|
|
9
|
+
import {
|
|
10
|
+
DefaultCrudRepository,
|
|
11
|
+
DefaultKeyValueRepository,
|
|
12
|
+
juggler,
|
|
13
|
+
Repository,
|
|
14
|
+
} from './repositories';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Signature for a Repository class bound to a given model. The constructor
|
|
18
|
+
* accepts only the dataSource to use for persistence.
|
|
19
|
+
*
|
|
20
|
+
* `define*` functions return a class implementing this interface.
|
|
21
|
+
*
|
|
22
|
+
* @typeParam M - Model class
|
|
23
|
+
* @typeParam R - Repository class/interface
|
|
24
|
+
*/
|
|
25
|
+
export interface ModelRepositoryClass<
|
|
26
|
+
M extends Model,
|
|
27
|
+
R extends Repository<M>,
|
|
28
|
+
> {
|
|
29
|
+
/**
|
|
30
|
+
* The constructor for the generated repository class
|
|
31
|
+
* @param dataSource - DataSource object
|
|
32
|
+
*/
|
|
33
|
+
new (dataSource: juggler.DataSource): R;
|
|
34
|
+
prototype: R;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Signature for repository classes that can be used as the base class for
|
|
39
|
+
* `define*` functions. The constructor of a base repository class accepts
|
|
40
|
+
* the target model constructor and the datasource to use.
|
|
41
|
+
*
|
|
42
|
+
* `define*` functions require a class implementing this interface on input.
|
|
43
|
+
*
|
|
44
|
+
* @typeParam M - Model class constructor, e.g `typeof Model`.
|
|
45
|
+
* **❗️IMPORTANT: The type argument `M` is describing the model constructor type
|
|
46
|
+
* (e.g. `typeof Model`), not the model instance type (`Model`) as is the case
|
|
47
|
+
* in other repository-related types. The constructor type is required
|
|
48
|
+
* to support custom repository classes requiring a Model subclass in the
|
|
49
|
+
* constructor arguments, e.g. `Entity` or a user-provided model.**
|
|
50
|
+
*
|
|
51
|
+
* @typeParam R - Repository class/interface
|
|
52
|
+
*/
|
|
53
|
+
export interface BaseRepositoryClass<
|
|
54
|
+
M extends typeof Model,
|
|
55
|
+
R extends Repository<PrototypeOf<M>>,
|
|
56
|
+
> {
|
|
57
|
+
/**
|
|
58
|
+
* The constructor for the generated repository class
|
|
59
|
+
* @param modelClass - Model class
|
|
60
|
+
* @param dataSource - DataSource object
|
|
61
|
+
*/
|
|
62
|
+
new (modelClass: M, dataSource: juggler.DataSource): R;
|
|
63
|
+
prototype: R;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Create (define) a repository class for the given model.
|
|
68
|
+
*
|
|
69
|
+
* See also `defineCrudRepositoryClass` and `defineKeyValueRepositoryClass`
|
|
70
|
+
* for convenience wrappers providing repository class factory for the default
|
|
71
|
+
* CRUD and KeyValue implementations.
|
|
72
|
+
*
|
|
73
|
+
* **❗️IMPORTANT: The compiler (TypeScript 3.8) is not able to correctly infer
|
|
74
|
+
* generic arguments `M` and `R` from the class constructors provided in
|
|
75
|
+
* function arguments. You must always provide both M and R types explicitly.**
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* const AddressRepository = defineRepositoryClass<
|
|
81
|
+
* typeof Address,
|
|
82
|
+
* DefaultEntityCrudRepository<
|
|
83
|
+
* Address,
|
|
84
|
+
* typeof Address.prototype.id,
|
|
85
|
+
* AddressRelations
|
|
86
|
+
* >,
|
|
87
|
+
* >(Address, DefaultCrudRepository);
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @param modelClass - A model class such as `Address`.
|
|
91
|
+
* @param baseRepositoryClass - Repository implementation to use as the base,
|
|
92
|
+
* e.g. `DefaultCrudRepository`.
|
|
93
|
+
*
|
|
94
|
+
* @typeParam M - Model class constructor (e.g. `typeof Address`)
|
|
95
|
+
* @typeParam R - Repository class (e.g. `DefaultCrudRepository<Address, number>`)
|
|
96
|
+
*/
|
|
97
|
+
export function defineRepositoryClass<
|
|
98
|
+
M extends typeof Model,
|
|
99
|
+
R extends Repository<PrototypeOf<M>>,
|
|
100
|
+
>(
|
|
101
|
+
modelClass: M,
|
|
102
|
+
baseRepositoryClass: BaseRepositoryClass<M, R>,
|
|
103
|
+
): ModelRepositoryClass<PrototypeOf<M>, R> {
|
|
104
|
+
const repoName = modelClass.name + 'Repository';
|
|
105
|
+
const defineNamedRepo = new Function(
|
|
106
|
+
'ModelCtor',
|
|
107
|
+
'BaseRepository',
|
|
108
|
+
`return class ${repoName} extends BaseRepository {
|
|
109
|
+
constructor(dataSource) {
|
|
110
|
+
super(ModelCtor, dataSource);
|
|
111
|
+
}
|
|
112
|
+
};`,
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const repo = defineNamedRepo(modelClass, baseRepositoryClass);
|
|
116
|
+
assert.equal(repo.name, repoName);
|
|
117
|
+
return repo;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Create (define) an entity CRUD repository class for the given model.
|
|
122
|
+
* This function always uses `DefaultCrudRepository` as the base class,
|
|
123
|
+
* use `defineRepositoryClass` if you want to use your own base repository.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
*
|
|
127
|
+
* ```ts
|
|
128
|
+
* const ProductRepository = defineCrudRepositoryClass<
|
|
129
|
+
* Product,
|
|
130
|
+
* typeof Product.prototype.id,
|
|
131
|
+
* ProductRelations
|
|
132
|
+
* >(Product);
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @param entityClass - An entity class such as `Product`.
|
|
136
|
+
*
|
|
137
|
+
* @typeParam E - An entity class
|
|
138
|
+
* @typeParam IdType - ID type for the entity
|
|
139
|
+
* @typeParam Relations - Relations for the entity
|
|
140
|
+
*/
|
|
141
|
+
export function defineCrudRepositoryClass<
|
|
142
|
+
E extends Entity,
|
|
143
|
+
IdType,
|
|
144
|
+
Relations extends object,
|
|
145
|
+
>(
|
|
146
|
+
entityClass: typeof Entity & {prototype: E},
|
|
147
|
+
): ModelRepositoryClass<E, DefaultCrudRepository<E, IdType, Relations>> {
|
|
148
|
+
return defineRepositoryClass(entityClass, DefaultCrudRepository);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Create (define) a KeyValue repository class for the given entity.
|
|
153
|
+
* This function always uses `DefaultKeyValueRepository` as the base class,
|
|
154
|
+
* use `defineRepositoryClass` if you want to use your own base repository.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
*
|
|
158
|
+
* ```ts
|
|
159
|
+
* const ProductKeyValueRepository = defineKeyValueRepositoryClass(Product);
|
|
160
|
+
* ```
|
|
161
|
+
*
|
|
162
|
+
* @param modelClass - An entity class such as `Product`.
|
|
163
|
+
*
|
|
164
|
+
* @typeParam M - Model class
|
|
165
|
+
*/
|
|
166
|
+
export function defineKeyValueRepositoryClass<M extends Model>(
|
|
167
|
+
modelClass: typeof Model & {prototype: M},
|
|
168
|
+
): ModelRepositoryClass<M, DefaultKeyValueRepository<M>> {
|
|
169
|
+
return defineRepositoryClass(modelClass, DefaultKeyValueRepository);
|
|
170
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2018,2019. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {Entity} from '../model';
|
|
7
|
+
|
|
8
|
+
export class EntityNotFoundError<ID, Props extends object = {}> extends Error {
|
|
9
|
+
code: string;
|
|
10
|
+
entityName: string;
|
|
11
|
+
entityId: ID;
|
|
12
|
+
|
|
13
|
+
constructor(
|
|
14
|
+
entityOrName: typeof Entity | string,
|
|
15
|
+
entityId: ID,
|
|
16
|
+
extraProperties?: Props,
|
|
17
|
+
) {
|
|
18
|
+
const entityName =
|
|
19
|
+
typeof entityOrName === 'string'
|
|
20
|
+
? entityOrName
|
|
21
|
+
: entityOrName.modelName || entityOrName.name;
|
|
22
|
+
|
|
23
|
+
const quotedId = JSON.stringify(entityId);
|
|
24
|
+
|
|
25
|
+
super(`Entity not found: ${entityName} with id ${quotedId}`);
|
|
26
|
+
|
|
27
|
+
Error.captureStackTrace(this, this.constructor);
|
|
28
|
+
|
|
29
|
+
this.code = 'ENTITY_NOT_FOUND';
|
|
30
|
+
this.entityName = entityName;
|
|
31
|
+
this.entityId = entityId;
|
|
32
|
+
|
|
33
|
+
Object.assign(this, extraProperties);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
+
export function isEntityNotFoundError(e: any): e is EntityNotFoundError<any> {
|
|
39
|
+
return e instanceof EntityNotFoundError;
|
|
40
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2018. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
export * from './entity-not-found.error';
|
|
7
|
+
export * from './invalid-relation.error';
|