-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(docs): refactor docs to create artifacts at runtime
Signed-off-by: Diana Lau <[email protected]>
- Loading branch information
Showing
8 changed files
with
204 additions
and
151 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
--- | ||
lang: en | ||
title: 'Creating Artifacts at Runtime' | ||
keywords: LoopBack 4.0, LoopBack 4, Node.js, TypeScript, OpenAPI | ||
sidebar: lb4_sidebar | ||
permalink: /doc/en/lb4/Creating-artifacts-runtime.html | ||
summary: Create LoopBack artifacts at runtime | ||
--- | ||
|
||
Besides using the [command-line interface](Command-line-interface.md) to | ||
generate LoopBack artifacts, you can also create the artifacts below at runtime: | ||
|
||
- [Model](Creating-model-runtime.md) | ||
- [DataSource](Creating-datasource-runtime.md) | ||
- [Repository](Creating-repository-runtime.md) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
--- | ||
lang: en | ||
title: 'Creating DataSources at Runtime' | ||
keywords: LoopBack 4.0, LoopBack 4, Node.js, TypeScript, OpenAPI, DataSource | ||
sidebar: lb4_sidebar | ||
permalink: /doc/en/lb4/Creating-datasource-runtime.html | ||
summary: Create LoopBack DataSources at runtime | ||
--- | ||
|
||
A datasource can be created at runtime by creating an instance of | ||
`juggler.DataSource`. It requires a name for the datasource, the connector, and | ||
the connection details. | ||
|
||
```ts | ||
import {juggler} from '@loopback/repository'; | ||
const dsName = 'bookstore-ds'; | ||
const bookDs = new juggler.DataSource({ | ||
name: dsName, | ||
connector: require('loopback-connector-mongodb'), | ||
url: 'mongodb://sysop:moon@localhost', | ||
}); | ||
await bookDs.connect(); | ||
app.dataSource(bookDs, dsName); | ||
``` | ||
|
||
For details about datasource options, refer to the [DataSource | ||
documentation])(https://apidocs.strongloop.com/loopback-datasource-juggler/#datasource) | ||
. | ||
|
||
Attach the newly created datasource to the app by calling `app.dataSource()`. | ||
|
||
{% include note.html content=" | ||
The `app.datasource()` method is available only on application classes | ||
with `RepositoryMixin` applied. | ||
" %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
--- | ||
lang: en | ||
title: 'Creating Models at Runtime' | ||
keywords: LoopBack 4.0, LoopBack 4, Node.js, TypeScript, OpenAPI, Model | ||
sidebar: lb4_sidebar | ||
permalink: /doc/en/lb4/Creating-model-runtime.html | ||
summary: Create LoopBack Models at runtime | ||
--- | ||
|
||
Models can also be created at runtime using the `defineModelClass()` helper | ||
function from the `@loopback/repository` class. It expects a base model to | ||
extend (typically `Model` or `Entity`), followed by a `ModelDefinition` object | ||
as shown in the example below. | ||
|
||
```ts | ||
const bookDef = new ModelDefinition('Book') | ||
.addProperty('id', {type: 'number', id: true}) | ||
.addProperty('title', {type: 'string'}); | ||
const BookModel = defineModelClass<typeof Entity, {id: number; title?: string}>( | ||
Entity, // Base model | ||
bookDef, // ModelDefinition | ||
); | ||
``` | ||
|
||
You will notice that we are specifying generic parameters for the | ||
`defineModelClass()` function. The first parameter is the base model, the second | ||
one is an interface providing the TypeScript description for the properties of | ||
the model we are defining. If the interface is not specified, the generated | ||
class will have only members inherited from the base model class, which | ||
typically means no properties. | ||
|
||
In case you need to use an existing Model as the base class, specify the Model | ||
as the base class instead of `Entity`. | ||
|
||
```ts | ||
// Assuming User is a pre-existing Model class in the app | ||
import {User} from './user.model'; | ||
import DynamicModelCtor from '@loopback/repository'; | ||
const StudentModel = defineModelClass< | ||
typeof User, | ||
// id being provided by the base class User | ||
{university?: string} | ||
>(User, studentDef); | ||
``` | ||
|
||
If you want make this new Model available from other parts of the app, you can | ||
call `app.model(StudentModel)` to create a binding for it. | ||
|
||
{% include note.html content=" | ||
The `app.model()` method is available only on application classes with | ||
`RepositoryMixin` applied. | ||
" %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
--- | ||
lang: en | ||
title: 'Creating Repositories at Runtime' | ||
keywords: LoopBack 4.0, LoopBack 4, Node.js, TypeScript, OpenAPI, Repository | ||
sidebar: lb4_sidebar | ||
permalink: /doc/en/lb4/Creating-repository-runtime.html | ||
summary: Create LoopBack Repositories at runtime | ||
--- | ||
|
||
Repositories can be created at runtime using the `defineCrudRepositoryClass` | ||
helper function from the `@loopback/rest-crud` package. It creates | ||
`DefaultCrudRepository`-based repository classes by default. | ||
|
||
```ts | ||
const BookRepository = defineCrudRepositoryClass< | ||
Book, | ||
typeof Book.prototype.id, | ||
BookRelations | ||
>(BookModel); | ||
``` | ||
|
||
In case you want to use a non-`DefaultCrudRepository` repository class or you | ||
want to create a custom repository, use the `defineRepositoryClass()` helper | ||
function instead. Pass a second parameter to this function as the base class for | ||
the new repository. | ||
|
||
There are two options for doing this: | ||
|
||
## 1. Using a base repository class | ||
|
||
Create a base repository with your custom implementation, and then specify this | ||
repository as the base class. | ||
|
||
```ts | ||
class MyRepoBase< | ||
E extends Entity, | ||
IdType, | ||
Relations extends object | ||
> extends DefaultCrudRepository<E, IdType, Relations> { | ||
// Custom implementation | ||
} | ||
|
||
const BookRepositoryClass = defineRepositoryClass< | ||
typeof BookModel, | ||
MyRepoBase<BookModel, typeof BookModel.prototype.id, BookRelations> | ||
>(BookModel, MyRepoBase); | ||
``` | ||
|
||
## 2. Using a Repository mixin | ||
|
||
Create a repository mixin with your customization as shown in the | ||
[Defining A Repository Mixin Class Factory Function](https://loopback.io/doc/en/lb4/migration-models-mixins.html#defining-a-repository-mixin-class-factory-function) | ||
example, apply the mixin on the base repository class (e.g. | ||
`DefaultCrudRepository`) then specify this combined repository as the base class | ||
to be used. | ||
|
||
```ts | ||
const BookRepositoryClass = defineRepositoryClass< | ||
typeof BookModel, | ||
DefaultCrudRepository< | ||
BookModel, | ||
typeof BookModel.prototype.id, | ||
BookRelations | ||
> & | ||
FindByTitle<BookModel> | ||
>(BookModel, FindByTitleRepositoryMixin(DefaultCrudRepository)); | ||
``` | ||
|
||
Dependency injection has to be configured for the datasource as shown below. | ||
|
||
```ts | ||
inject(`datasources.${dsName.name}`)(BookRepository, undefined, 0); | ||
const repoBinding = app.repository(BookRepository); | ||
``` | ||
|
||
{% include note.html content=" | ||
The `app.repository()` method is available only on application classes | ||
with `RepositoryMixin` applied. | ||
" %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters