diff --git a/docs/en/UI/Angular/Http-Requests.md b/docs/en/UI/Angular/Http-Requests.md new file mode 100644 index 0000000000..71878c8045 --- /dev/null +++ b/docs/en/UI/Angular/Http-Requests.md @@ -0,0 +1,209 @@ +# How to Make HTTP Requests + + + +## About HttpClient + +Angular has the amazing [HttpClient](https://angular.io/guide/http) for communication with backend services. It is a layer on top and a simplified representation of [XMLHttpRequest Web API](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest). It also is the recommended agent by Angular for any HTTP request. There is nothing wrong with using the `HttpClient` in your ABP project. + +However, `HttpClient` leaves error handling to the caller (method). In other words, HTTP errors are handled manually and by hooking into the observer of the `Observable` returned. + +```js +getConfig() { + this.http.get(this.configUrl).subscribe( + config => this.updateConfig(config), + error => { + // Handle error here + }, + ); +} +``` + +Although clear and flexible, handling errors this way is repetitive work, even when error processing is delegated to the store or any other injectable. + +An `HttpInterceptor` is able to catch `HttpErrorResponse`  and can be used for a centralized error handling. Nevertheless, cases where default error handler, therefore the interceptor, must be disabled require additional work and comprehension of Angular internals. Check [this issue](https://github.com/angular/angular/issues/20203) for details. + + + +## RestService + +ABP core module has a utility service for HTTP requests: `RestService`. Unless explicitly configured otherwise, it catches HTTP errors and dispatches a `RestOccurError` action. This action is then captured by the `ErrorHandler` introduced by the `ThemeSharedModule`. Since you should already import this module in your app, when the `RestService` is used, all HTTP errors get automatically handled by deafult. + + + +### Getting Started with RestService + +In order to use the `RestService`, you must inject it in your class as a dependency. + +```js +import { RestService } from '@abp/ng.core'; + +@Injectable({ + /* class metadata here */ +}) +class DemoService { + constructor(private rest: RestService) {} +} +``` + +You do not have to provide the `RestService` at module or component/directive level, because it is already **provided in root**. + + + +### How to Make a Request with RestService + +You can use the `request` method of the `RestService` is for HTTP requests. Here is an example: + +```js +getFoo(id: number) { + const request: Rest.Request = { + method: 'GET', + url: '/api/some/path/to/foo/' + id, + }; + + return this.rest.request(request); +} +``` + + + +The `request` method always returns an `Observable`. Therefore you can do the following wherever you use `getFoo` method: + +```js +doSomethingWithFoo(id: number) { + this.demoService.getFoo(id).subscribe( + foo => { + // Do something with foo. + } + ) +} +``` + + + +**You do not have to worry about unsubscription.** The `RestService` uses `HttpClient` behind the scenes, so every observable it returns is a finite observable, i.e. it closes subscriptions automatically upon success or error. + + + +As you see, `request` method gets a request options object with `Rest.Request` type. This generic type expects the interface of the request body. You may pass `null` when there is no body, like in a `GET` or a `DELETE` request. Here is an example where there is one: + +```js +postFoo(body: Foo) { + const request: Rest.Request = { + method: 'POST', + url: '/api/some/path/to/foo', + body + }; + + return this.rest.request(request); +} +``` + + + +You may [check here](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/rest.ts#L23) for complete `Rest.Request` type, which has only a few chages compared to [HttpRequest](https://angular.io/api/common/http/HttpRequest) class in Angular. + + + +### How to Disable Default Error Handler of RestService + +The `request` method, used with defaults, always handles errors. Let's see how you can change that behavior and handle errors yourself: + +```js +deleteFoo(id: number) { + const request: Rest.Request = { + method: 'DELETE', + url: '/api/some/path/to/foo/' + id, + }; + + return this.rest.request(request, { skipHandleError: true }); +} +``` + + + +`skipHandleError` config option, when set to `true`, disables the error handler and the returned observable starts throwing an error that you can catch in your subscription. + +```js +removeFooFromList(id: number) { + this.demoService.deleteFoo(id).subscribe( + foo => { + // Do something with foo. + }, + error => { + // Do something with error. + } + ) +} +``` + + + +### How to Get a Specific API Endpoint From Application Config + +Another nice config option that `request` method receives is `apiName` (available as of v2.4), which can be used to get a specific module endpoint from application configuration. + + + +```js +putFoo(body: Foo, id: string) { + const request: Rest.Request = { + method: 'PUT', + url: '/' + id, + body + }; + + return this.rest.request(request, {apiName: 'foo'}); +} +``` + + + +`putFoo` above will request `https://localhost:44305/api/some/path/to/foo/{id}` as long as the environment variables are as follows: + +```js +// environment.ts + +export const environment = { + apis: { + default: { + url: 'https://localhost:44305', + }, + foo: { + url: 'https://localhost:44305/api/some/path/to/foo', + }, + }, + + /* rest of the environment variables here */ +} +``` + + + +### How to Observe Response Object or HTTP Events Instead of Body + +`RestService` assumes you are generally interested in the body of a response and, by default, sets `observe` property as `'body'`. However, there may be times you are rather interested in something else, such as a custom proprietary header. For that, the `request` method receives `observe` property in its config object. + +```js +getSomeCustomHeaderValue() { + const request: Rest.Request = { + method: 'GET', + url: '/api/some/path/that/sends/some-custom-header', + }; + + return this.rest.request>( + request, + {observe: Rest.Observe.Response}, + ).pipe( + map(response => response.headers.get('Some-Custom-Header')) + ); +} +``` + + + +You may find `Rest.Observe` enum [here](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/rest.ts#L10). + +## What's Next? + +* [Localization](./Localization.md) \ No newline at end of file diff --git a/docs/en/UI/Angular/Localization.md b/docs/en/UI/Angular/Localization.md index 01394a3fea..d627f466ba 100644 --- a/docs/en/UI/Angular/Localization.md +++ b/docs/en/UI/Angular/Localization.md @@ -133,4 +133,8 @@ Localization resources are stored in the `localization` property of `ConfigState ## See Also -* [Localization in ASP.NET Core](../../Localization.md) \ No newline at end of file +* [Localization in ASP.NET Core](../../Localization.md) + +## What's Next? + +* [Permission Management](./Permission-Management.md) \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 5c2c3a8e64..a96fb911d2 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -312,6 +312,10 @@ { "text": "Angular", "items": [ + { + "text": "HTTP Requests", + "path": "UI/Angular/HTTP-Requests.md" + }, { "text": "Localization", "path": "UI/Angular/Localization.md" diff --git a/npm/ng-packs/.vscode/settings.json b/npm/ng-packs/.vscode/settings.json index 37d9a1e403..9c2678df08 100644 --- a/npm/ng-packs/.vscode/settings.json +++ b/npm/ng-packs/.vscode/settings.json @@ -6,6 +6,7 @@ "typescript.tsdk": "../node_modules/typescript/lib", "workbench.colorCustomizations": { "activityBar.background": "#258ecd", + "activityBar.activeBackground": "#258ecd", "activityBar.activeBorder": "#f0aed7", "activityBar.foreground": "#e7e7e7", "activityBar.inactiveForeground": "#e7e7e799", diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index c3e26038f0..a4a3045b0a 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -21,19 +21,19 @@ "generate:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s" }, "devDependencies": { - "@abp/ng.account": "~2.2.0", - "@abp/ng.account.config": "~2.2.0", - "@abp/ng.core": "~2.2.0", - "@abp/ng.feature-management": "~2.2.0", - "@abp/ng.identity": "~2.2.0", - "@abp/ng.identity.config": "~2.2.0", - "@abp/ng.permission-management": "~2.2.0", - "@abp/ng.setting-management": "~2.2.0", - "@abp/ng.setting-management.config": "~2.2.0", - "@abp/ng.tenant-management": "~2.2.0", - "@abp/ng.tenant-management.config": "~2.2.0", - "@abp/ng.theme.basic": "~2.2.0", - "@abp/ng.theme.shared": "~2.2.0", + "@abp/ng.account": "~2.3.0", + "@abp/ng.account.config": "~2.3.0", + "@abp/ng.core": "^2.3.0", + "@abp/ng.feature-management": "^2.3.0", + "@abp/ng.identity": "~2.3.0", + "@abp/ng.identity.config": "~2.3.0", + "@abp/ng.permission-management": "^2.3.0", + "@abp/ng.setting-management": "~2.3.0", + "@abp/ng.setting-management.config": "~2.3.0", + "@abp/ng.tenant-management": "~2.3.0", + "@abp/ng.tenant-management.config": "~2.3.0", + "@abp/ng.theme.basic": "~2.3.0", + "@abp/ng.theme.shared": "^2.3.0", "@angular-builders/jest": "^8.2.0", "@angular-devkit/build-angular": "~0.803.21", "@angular-devkit/build-ng-packagr": "~0.803.21", @@ -83,6 +83,7 @@ "snq": "^1.0.3", "symlink-manager": "^1.4.2", "ts-node": "~7.0.0", + "ts-toolbelt": "^6.3.6", "tsickle": "^0.37.0", "tslint": "~5.20.0", "typescript": "~3.5.3", diff --git a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts index ca2b92db5f..aa72942ec0 100644 --- a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts @@ -1,18 +1,17 @@ import { Injectable, TrackByFunction } from '@angular/core'; +import { O } from 'ts-toolbelt'; + +export const trackBy = (key: keyof T): TrackByFunction => (_, item) => item[key]; + +export const trackByDeep = ( + ...keys: T extends object ? O.Paths : never +): TrackByFunction => (_, item) => keys.reduce((acc, key) => acc[key], item); @Injectable({ providedIn: 'root', }) export class TrackByService { - by(key: keyof T): TrackByFunction { - return ({}, item) => item[key]; - } - - byDeep(...keys: (string | number)[]): TrackByFunction { - return ({}, item) => keys.reduce((acc, key) => acc[key], item); - } + by = trackBy; - bySelf(): TrackByFunction { - return ({}, item) => item; - } + byDeep = trackByDeep; } diff --git a/npm/ng-packs/packages/core/src/lib/states/config.state.ts b/npm/ng-packs/packages/core/src/lib/states/config.state.ts index 5269946391..8ce206dd76 100644 --- a/npm/ng-packs/packages/core/src/lib/states/config.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/config.state.ts @@ -262,7 +262,8 @@ export class ConfigState { route.url = `/${route.path}`; } - route.order = route.order || route.order === 0 ? route.order : parent.children.length; + route.children = route.children || []; + route.order = route.order || route.order === 0 ? route.order : (parent.children || []).length; parent.children = [...(parent.children || []), route].sort((a, b) => a.order - b.order); flattedRoutes[index] = parent; diff --git a/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts index 07baed4c14..1ff9ad817e 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts @@ -375,6 +375,7 @@ describe('ConfigState', () => { describe('#AddRoute', () => { const newRoute = { name: 'My new page', + children: [], iconClass: 'fa fa-dashboard', path: 'page', invisible: false, diff --git a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts index 19868e8ad5..377f129ff5 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts @@ -11,23 +11,11 @@ describe('TrackByService', () => { describe('#byDeep', () => { it('should return a function which tracks a deeply-nested property', () => { - expect( - service.byDeep( - 'a', - 'b', - 'c', - 1, - 'x', - )(284, { - a: { b: { c: [{ x: 1035 }, { x: 1036 }, { x: 1037 }] } }, - }), - ).toBe(1036); - }); - }); + const obj = { + a: { b: { c: { x: 1036 } } }, + }; - describe('#bySelf', () => { - it('should return a function which tracks the item', () => { - expect(service.bySelf()(284, 'X')).toBe('X'); + expect(service.byDeep('a', 'b', 'c', 'x')(284, obj)).toBe(1036); }); }); }); diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index db911bfb55..a9d0291af1 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -2,26 +2,26 @@ # yarn lockfile v1 -"@abp/ng.account.config@^2.2.0", "@abp/ng.account.config@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.2.0.tgz#420396fc55eadd9a5c179e87075a51437ebc964c" - integrity sha512-5BpxFnXCeCDR+m3qGMKn8rSMGwBb4mkwtejVAJXCVYoMXL8x2J9uRgDf9fkdudqpls+BIgB8BX1tRyJiY+Bg8Q== +"@abp/ng.account.config@^2.3.0", "@abp/ng.account.config@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.account.config/-/ng.account.config-2.3.0.tgz#28d65e2eb889d8b44fc726edbed7509214e8034a" + integrity sha512-Vg4+8PvGfgUC+pFtPIS53ZekJM+O4JZ8wGPGaZ/ySLpk2oSfzC/5RFS2rKq3cmySeRCJunmQinCAlBCm5zir8A== dependencies: tslib "^1.9.0" -"@abp/ng.account@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.2.0.tgz#3a200a46f83c36ae89a6724a6a2226a5f846641b" - integrity sha512-OwTOxXDI3BJ1MrlR6WtvDmNIkqi1OCWlq7MvUhuFPVmIIUI3OjxHNASk1NfWMSlu6amXDxuFEey4ItrMKnAJog== +"@abp/ng.account@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-2.3.0.tgz#9ca2a564c177c43b53f69f141405914baefbc7b2" + integrity sha512-kJCek8woGGEC1WTgo75Qr2ucyD5VV1nqqnkw8UMJ96/pqASpBJHczGTL8R4ug961i4vexKDnMbiv0SmfMlBDig== dependencies: - "@abp/ng.account.config" "^2.2.0" - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.account.config" "^2.3.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.core@^2.2.0", "@abp/ng.core@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.2.0.tgz#a553e845f7bc43838704eb15d8684869dfcb053b" - integrity sha512-HtyHJYPY6kKqySt/afgFT5j6yaN7Bx4MMvIGWHqFqZsQChWceagLk5SBFTOjCE1FgsewX2a7OT452bKjgsWsrg== +"@abp/ng.core@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-2.3.0.tgz#96bad951da07e589f11a0345171e1a142463671e" + integrity sha512-6SsgcRJQWjXvyEZ7VO2ekOoVmKkFB17vJgTvQLiyB+j2t9guAo3LPDcMGGKNum/oInkiYczf8MY7sculrElyKQ== dependencies: "@angular/localize" "~9.0.2" "@ngxs/router-plugin" "^3.6.2" @@ -33,86 +33,86 @@ snq "^1.0.3" tslib "^1.9.0" -"@abp/ng.feature-management@^2.2.0", "@abp/ng.feature-management@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.2.0.tgz#04f959ddb62a0abd99a84fb4e6ec935a796418d4" - integrity sha512-Cw0GRi+6LX5oKDwEvJJyUoh7M4hvaUE5TsuP1E3Hicg/1mMSyUDXVrLBOvAeWWolyfFTpFKLppAvoEEMpUt2eg== +"@abp/ng.feature-management@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-2.3.0.tgz#91172fa9f308b3a792a2bf1e762e24560556f412" + integrity sha512-ShytiV1SC3PwP4Hs8Ss3bk2UAZBXteHKWcrIhAvqtWsOQ2aql6e7t+FutRA3wtUuRdX6PTrMRXbMRvhCwGZUKQ== dependencies: - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.identity.config@^2.2.0", "@abp/ng.identity.config@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.2.0.tgz#ac050ed632624c490d8957a18606622637d1d6f3" - integrity sha512-sHRG0iRFrGtF2pNnKcjBaeupg39V8easzUFPU42/SVPi0XyAumrOZRbKkN2CBl0WYedqARTZxE5/nejRMXX4Fg== +"@abp/ng.identity.config@^2.3.0", "@abp/ng.identity.config@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.identity.config/-/ng.identity.config-2.3.0.tgz#e9f4904d60f94cc01b3254e0221d7cdb2274aa3b" + integrity sha512-bqCaPHCwaHUfAfNfFskGTJHGvv+hPK9Tmm7PouVa884AmeQs2j0Gwl3o93YHK2VwXENV09qb01feXapSVPsmTw== dependencies: tslib "^1.9.0" -"@abp/ng.identity@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.2.0.tgz#1cc7ffa4e2aae462d8ce2399f94cf5ad047fefae" - integrity sha512-G/hrMg/PaN0tA871D52AuKlUhsLWfWSblK0XqQiRmMp/ozsEYSvAV91n/pEScm7qx0RF01K0J5K5V8Cjb4LTyA== +"@abp/ng.identity@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-2.3.0.tgz#c973f12f5490b1d29c80f510540b18343f998b8d" + integrity sha512-vBLLxCax7MoHilakpW9XMRFGUXcdMM0syiz0PtkgKmYADIQIQ9AzcfwslK2D6wwy447s6NIoGnThtfbshoRtLw== dependencies: - "@abp/ng.identity.config" "^2.2.0" - "@abp/ng.permission-management" "^2.2.0" - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.identity.config" "^2.3.0" + "@abp/ng.permission-management" "^2.3.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.permission-management@^2.2.0", "@abp/ng.permission-management@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.2.0.tgz#56bece037aa094400f8d5585db0bfd5718437ae0" - integrity sha512-OeUZzZV+2TTWOhmpwFTvar9/4IpKz5EhI/6uabu3pOtIsU2Ms2OBbjwVUSKbhLT7e0+z5MM1nPCDoXIlYv22wA== +"@abp/ng.permission-management@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-2.3.0.tgz#16599a2e1583c9d6769edb1dc9b78a45b75b7402" + integrity sha512-vJSfcmXCXpBHMjeRb/0QoKlAcvpCQ/qS2quHFUr23nriXIeNxgEdCVHkTBZU8FMxfyTfwwrFRzF2oxn33gubbg== dependencies: - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.setting-management.config@^2.2.0", "@abp/ng.setting-management.config@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.2.0.tgz#31cf94a785fc2d5c3f1bcfe2c79afc0f1ab419ee" - integrity sha512-vZhBvKFZ6puWwujkzEEhqyQiMKdTmAeJjSxlUPRyIuwowrZhPnUk1r0ghyOLTC5fC1TDaUXF1mZ2UsBFMDvuiw== +"@abp/ng.setting-management.config@^2.3.0", "@abp/ng.setting-management.config@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.setting-management.config/-/ng.setting-management.config-2.3.0.tgz#80b9ebc659c34be4c4c45cc6f2fe2b593f491aab" + integrity sha512-nj6Hl8hlzrGJFJZo4d9DWQtf1PCSFnXup/3ajqMOCPPE+oBItY3aNY05jDyGgdr2wEdyWo/u9Invy3Jsvq8itQ== dependencies: tslib "^1.9.0" -"@abp/ng.setting-management@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.2.0.tgz#e1c976bf69bbfaa452489b8968b8669c3fba7710" - integrity sha512-LL6CUi0qpS0+9kPz/T0n1U+Kpu9gwI49+d/+xVDG+lIziGqukgwgoUwlEv+Lk0ak+RC5noLurvvJaaKd3l3mPw== +"@abp/ng.setting-management@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-2.3.0.tgz#478c603f67416df763228bc958b6ea05e7d13dd7" + integrity sha512-xJk09NdpXeg3/KezvKl+h0B4T08Hy1SofOATQpVTrE4TIsFxyXKmasMcSY4i/3+wwE1umH+6TZJwPE+pXTu9Ng== dependencies: - "@abp/ng.setting-management.config" "^2.2.0" - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.setting-management.config" "^2.3.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.tenant-management.config@^2.2.0", "@abp/ng.tenant-management.config@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.2.0.tgz#16d87f31ec069e1f3a8351ef3be9a05a3002ed26" - integrity sha512-lfW9lGERn9PBIRseJajQ0GSxo1+wfRxO7Ic/lSSPxhUbsmwg6afquYTcGiU0d+4QQOBY47ga3n0IVrNqWq1pmw== +"@abp/ng.tenant-management.config@^2.3.0", "@abp/ng.tenant-management.config@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management.config/-/ng.tenant-management.config-2.3.0.tgz#8501a3a53f1abac8a65a87782752afb2ba648bb1" + integrity sha512-gGqg7rZd5X37z9glYF2lSiFpJ3Lyi1NdqHnaxdCTui+3/weMo/5RKlf+ilUAPqR5YAMVSLi4mBYYsuShWEBBIQ== dependencies: tslib "^1.9.0" -"@abp/ng.tenant-management@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.2.0.tgz#0ce498eaf9f65ef0255fc23949a47f8ae36cf5c8" - integrity sha512-v9Y5F9fm2EXYteCWKI8QODN4ETmSdh6K7gC5Y3+/N+QaUAod8JxFNX0EIXzFGnSLbiZ0O1xA/TRJruQTv1m3SA== +"@abp/ng.tenant-management@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-2.3.0.tgz#5ec092ad9c597d4aa9f2f849fc12e955d2d24696" + integrity sha512-LyJaXuzgZr2tfFPknuGz1spOzfxfaEhPuQ6zHBOhVfQ6KtMBeagsQQoEiLJMtcygR0MRox0kzmUiyTKm4H5DoA== dependencies: - "@abp/ng.feature-management" "^2.2.0" - "@abp/ng.tenant-management.config" "^2.2.0" - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.feature-management" "^2.3.0" + "@abp/ng.tenant-management.config" "^2.3.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.theme.basic@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.2.0.tgz#7a086a27daa3bec16962dd62dfb2f39a1538e82f" - integrity sha512-fpdDjjhEQZtaZvFkVi5uhqZoYyrxCWJeQgGFvLS36TqYqvJVyoMeJBlVw0CgbY3F+u5V/GmZSVxvZAAJDpUYhg== +"@abp/ng.theme.basic@~2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-2.3.0.tgz#e5857864ae4c3274a57cc785b06cccd0ff3515a8" + integrity sha512-LuAlKqmqEFUUwI/ruB6aO1rhfsCD19Pt7PCE3M+vr/KvlYAKb89K1U8nphIfMV8PCz9IU07BwvTn/T2qIt39HQ== dependencies: - "@abp/ng.theme.shared" "^2.2.0" + "@abp/ng.theme.shared" "^2.3.0" tslib "^1.9.0" -"@abp/ng.theme.shared@^2.2.0", "@abp/ng.theme.shared@~2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.2.0.tgz#438f77498df3e2f25a1ecf9adb77a9ee5a71d2c5" - integrity sha512-w7TnDbdHpOFcT12wt/9nZDH9PkyZdTP6W+tJIGeH6zOgWC8V4MDX8Ulc9e/ZvQ8u0qRLOEmk3aE5odFQUHSlJw== +"@abp/ng.theme.shared@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-2.3.0.tgz#5b13b8e170fb0c2a4afca34434bd455ee8dfb9d6" + integrity sha512-keYnD17K8QkdSLqBbsATfeh7KwKNoUj/XsHZO8hawE3OfRuy4qYY9xghGFZUUqdIE5kF6gKlLKj4ZTZmuCvOmQ== dependencies: - "@abp/ng.core" "^2.2.0" + "@abp/ng.core" "^2.3.0" "@fortawesome/fontawesome-free" "^5.12.1" "@ng-bootstrap/ng-bootstrap" "^5.3.0" "@ngx-validate/core" "^0.0.7" @@ -11685,6 +11685,11 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" +ts-toolbelt@^6.3.6: + version "6.3.6" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.3.6.tgz#2bde29106c013ed520c32f30e1248daf8fd4f5f9" + integrity sha512-eVzym+LyQodOCfyVyQDQ6FGYbO2Xf9Nc4dGLRKlKSUpAs+8qQWHG+grDiA3ciEuNPNZ0qJnNIYkdqBW1rCWuUA== + tsickle@^0.37.0: version "0.37.1" resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09"