@nodebrick/nodebrick-core
Advanced tools
Comparing version 0.0.15 to 0.0.16
{ | ||
"name": "@nodebrick/nodebrick-core", | ||
"version": "0.0.15", | ||
"version": "0.0.16", | ||
"description": "Core of Nodebrick", | ||
@@ -5,0 +5,0 @@ "publishConfig": { |
@@ -16,7 +16,86 @@ # nodebrick-core | ||
### Module Structure | ||
Have a look at the existing modules, it's self explenatory. | ||
## Usage | ||
Few things to note: | ||
* `index.ts` | ||
The entrypoint, exporting all the classes/interfaces accessible by other modules (think public api) | ||
* `I<ModuleNameModule>.ts` | ||
The module 'interface' - note we are using the following notation `export abstract class I<ModuleName>` to define interface so they exists in the JS realm and are accessible by InversifyJS | ||
* `<ModuleNameModule>.ts` | ||
The module class implementing and extending the 'interface' | ||
* `<ModuleNameBindings>.ts` | ||
Defines the Inversify bindings for this module are done | ||
* `models` | ||
Folder storing all our models, i.e our business logic data | ||
Models can also define and validates DTO (data transfer object) fields using [class-transformer](https://github.com/typestack/class-transformer) and [class-validator](https://github.com/typestack/class-validator) libraries eg | ||
```typescript | ||
@Exclude() | ||
export abstract class IAPIResponse<TData> | ||
{ | ||
@Expose({name: `request_id`, toClassOnly: true}) | ||
@IsOptional() | ||
public abstract requestId?: string; | ||
@Expose({name: `client_request_id`, toPlainOnly: true}) | ||
@IsString() | ||
@IsOptional() | ||
public abstract clientRequestId?: string; | ||
@Expose({name: `start_time`, toPlainOnly: true}) | ||
@IsDate() | ||
public abstract startTime?: Date; | ||
@Expose({name: `end_time`, toPlainOnly: true}) | ||
@IsDate() | ||
public abstract endTime: Date; | ||
@Expose({toPlainOnly: true}) | ||
@IsInt() | ||
@IsOptional() | ||
// In milliseconds | ||
public abstract duration?: number; | ||
} | ||
``` | ||
For instance a REST API returning the above will automatically create a JSON like | ||
```json | ||
{ | ||
"client_request_id": "933ca46c-25a5-4166-903e-a437700ae4ef", | ||
"startTime": "933ca46c-25a5-4166-903e-a437700ae4ef", | ||
"end_time": "933ca46c-25a5-4166-903e-a437700ae4ef", | ||
"duration": 50 | ||
} | ||
``` | ||
I invite you to read the [class-transformer](https://github.com/typestack/class-transformer) and [class-validator](https://github.com/typestack/class-validator) documentations. | ||
Note that table column can also be created and validated with [nodebrick-database](../nodebrick-database/README.md) and the help [TypeORM](https://typeorm.io/#/) | ||
``` | ||
### Dependency Injection | ||
NodebrickCore provides dependency injection by using internally [InversifyJS](http://inversify.io/) | ||
``` | ||
All the bindings will be defined in the `<ModuleNameBindings>.ts` as for instance | ||
```typescript | ||
// bind the module to its interface using transitive binding, i.e we are reusing the singleton. | ||
bind(INodebrickApiModule).toService(NodebrickApiModule); | ||
// middlewares - transient | ||
bind(IGlobalApiMiddleware).to(GlobalApiMiddleware).inTransientScope(); | ||
bind(IGlobalOptionsMiddleware).to(GlobalOptionsMiddleware).inTransientScope(); | ||
bind(IGlobalRequestMiddleware).to(GlobalRequestMiddleware).inTransientScope(); | ||
// services - singletons | ||
bind(INodebrickApiService).to(NodebrickApiService).inSingletonScope(); | ||
``` | ||
As you can see you have multiple scope for those | ||
### Context | ||
_A context can be defined as all the relevant information that a developer needs to complete a task._ | ||
NodebrickCore with the help of [cls-hooked](https://github.com/jeff-lewis/cls-hooked#readme) provides you with tools to create a context | ||
and attach any | ||
* create a context | ||
import "cls-hooked"; | ||
import "reflect-metadata"; | ||
import "body-parser"; | ||
export * from "./INodebrickCore"; | ||
@@ -5,0 +4,0 @@ export * from "./NodebrickCore"; |
@@ -9,3 +9,2 @@ "use strict"; | ||
require("reflect-metadata"); | ||
require("body-parser"); | ||
/* tslint:enable:no-import-side-effect ordered-imports*/ | ||
@@ -54,2 +53,2 @@ __export(require("./INodebrickCore")); | ||
__export(require("./utils/Timeout")); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5REFBeUQ7QUFDekQsc0JBQW9CO0FBQ3BCLDRCQUEwQjtBQUMxQix1QkFBcUI7QUFDckIsd0RBQXdEO0FBRXhELHNDQUFpQztBQUNqQyxxQ0FBZ0M7QUFDaEMsNkNBQXdDO0FBRXhDLDRDQUF1QztBQUN2Qyx5Q0FBb0M7QUFDcEMsOENBQXlDO0FBQ3pDLHFEQUFnRDtBQUNoRCxzREFBaUQ7QUFDakQseURBQW9EO0FBQ3BELG1EQUE4QztBQUM5Qyx3REFBbUQ7QUFHbkQsb0RBQStDO0FBQy9DLDBDQUFxQztBQUVyQyx3REFBbUQ7QUFFbkQsd0RBQW1EO0FBQ25ELHFEQUFnRDtBQUNoRCw4REFBeUQ7QUFDekQsK0RBQTBEO0FBQzFELDZEQUF3RDtBQUN4RCx1REFBa0Q7QUFDbEQsOENBQXlDO0FBRXpDLGtEQUE2QztBQUM3QyxxQ0FBZ0M7QUFFaEMsbUNBQThCO0FBQzlCLHNDQUFpQztBQUNqQywrQ0FBMEM7QUFDMUMsNENBQXVDO0FBQ3ZDLDZDQUF3QztBQUN4QywwQ0FBcUM7QUFDckMsZ0RBQTJDO0FBQzNDLGdEQUEyQztBQUMzQyxnREFBMkM7QUFDM0MsK0NBQTBDO0FBQzFDLHdEQUFtRDtBQUNuRCx3REFBbUQ7QUFDbkQsNkNBQXdDO0FBQ3hDLDhDQUF5QztBQUV6QywyREFBc0Q7QUFDdEQsd0RBQW1EO0FBT25ELDBEQUFxRDtBQUNyRCxnREFBMkM7QUFDM0MscUNBQWdDIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5REFBeUQ7QUFDekQsc0JBQW9CO0FBQ3BCLDRCQUEwQjtBQUMxQix3REFBd0Q7QUFFeEQsc0NBQWlDO0FBQ2pDLHFDQUFnQztBQUNoQyw2Q0FBd0M7QUFFeEMsNENBQXVDO0FBQ3ZDLHlDQUFvQztBQUNwQyw4Q0FBeUM7QUFDekMscURBQWdEO0FBQ2hELHNEQUFpRDtBQUNqRCx5REFBb0Q7QUFDcEQsbURBQThDO0FBQzlDLHdEQUFtRDtBQUduRCxvREFBK0M7QUFDL0MsMENBQXFDO0FBRXJDLHdEQUFtRDtBQUVuRCx3REFBbUQ7QUFDbkQscURBQWdEO0FBQ2hELDhEQUF5RDtBQUN6RCwrREFBMEQ7QUFDMUQsNkRBQXdEO0FBQ3hELHVEQUFrRDtBQUNsRCw4Q0FBeUM7QUFFekMsa0RBQTZDO0FBQzdDLHFDQUFnQztBQUVoQyxtQ0FBOEI7QUFDOUIsc0NBQWlDO0FBQ2pDLCtDQUEwQztBQUMxQyw0Q0FBdUM7QUFDdkMsNkNBQXdDO0FBQ3hDLDBDQUFxQztBQUNyQyxnREFBMkM7QUFDM0MsZ0RBQTJDO0FBQzNDLGdEQUEyQztBQUMzQywrQ0FBMEM7QUFDMUMsd0RBQW1EO0FBQ25ELHdEQUFtRDtBQUNuRCw2Q0FBd0M7QUFDeEMsOENBQXlDO0FBRXpDLDJEQUFzRDtBQUN0RCx3REFBbUQ7QUFPbkQsMERBQXFEO0FBQ3JELGdEQUEyQztBQUMzQyxxQ0FBZ0MifQ== |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
177217
101
2430