From 7071c769d49711e7f6e0466b7713ff7a4bf30b37 Mon Sep 17 00:00:00 2001 From: Bram Borggreve Date: Tue, 16 Mar 2021 00:00:07 -0500 Subject: [PATCH 1/3] feat: add working crud workspace-generator --- ...__projectName__-public.resolver.ts__tmpl__ | 4 +-- .../__projectName__-user.resolver.ts__tmpl__ | 2 +- .../generators/crud/index.ts__tmpl__ | 27 ++++++++++++------- .../generators/crud/schema.json__tmpl__ | 12 ++++----- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-public.resolver.ts__tmpl__ b/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-public.resolver.ts__tmpl__ index 24d09c98..9397ccdb 100644 --- a/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-public.resolver.ts__tmpl__ +++ b/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-public.resolver.ts__tmpl__ @@ -1,7 +1,5 @@ -import { Args, Mutation, Query, Resolver } from '@nestjs/graphql' -import { UseGuards } from '@nestjs/common' +import { Resolver } from '@nestjs/graphql' import { <%= classify(apiAppName) %><%= classify(modelName) %>DataAccessService, <%= classify(modelName) %> } from '@<%= npmScope %>/<%= apiAppName %>/<%= dasherize(modelName) %>/data-access' -import { GqlAuthGuard } from '@<%= npmScope %>/<%= apiAppName %>/auth/util' @Resolver(() => <%= classify(modelName) %>) export class <%= classify(projectName) %>PublicResolver { diff --git a/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-user.resolver.ts__tmpl__ b/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-user.resolver.ts__tmpl__ index a57235ac..912cbc5f 100644 --- a/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-user.resolver.ts__tmpl__ +++ b/packages/stack/src/schematics/api-crud/files/feature/src/lib/__projectName__-user.resolver.ts__tmpl__ @@ -1,5 +1,5 @@ -import { Args, Mutation, Query, Resolver } from '@nestjs/graphql' import { UseGuards } from '@nestjs/common' +import { Resolver } from '@nestjs/graphql' import { <%= classify(apiAppName) %><%= classify(modelName) %>DataAccessService } from '@<%= npmScope %>/<%= apiAppName %>/<%= dasherize(modelName) %>/data-access' import { GqlAuthGuard } from '@<%= npmScope %>/<%= apiAppName %>/auth/util' diff --git a/packages/stack/src/schematics/generators/generators/crud/index.ts__tmpl__ b/packages/stack/src/schematics/generators/generators/crud/index.ts__tmpl__ index f8dce1d1..bd609e61 100644 --- a/packages/stack/src/schematics/generators/generators/crud/index.ts__tmpl__ +++ b/packages/stack/src/schematics/generators/generators/crud/index.ts__tmpl__ @@ -1,15 +1,22 @@ -import {formatFiles, generateFiles, names, Tree} from '@nrwl/devkit'; -import {readJsonSync} from "fs-extra"; -import {join} from 'path'; -import * as process from "process"; +import { Tree } from '@nrwl/devkit' +import { execSync } from 'child_process' + +const sleep = (seconds = 1) => new Promise((resolve) => setTimeout(resolve, seconds * 1000)) +function run(command) { + console.log(`Running command: ${command}`) + execSync(command, { stdio: 'inherit' }) +} export default async function ( host: Tree, - { name, model, nameField, plural, dryRun }: { name: string, model: string, nameField: string, plural: string, dryRun: boolean } + { model, nameField, plural }: { model: string; nameField: string; plural: string }, ) { - console.log(`nx g @nxpm/stack:api-crud ${name} --plural ${plural}`) - console.log(`yarn prisma:apply`) - console.log(`nx g @nxpm/stack:web-crud ${name} --plural ${plural}`) - console.log(`yarn build:sdk `) - console.log({ name, model, nameField, plural, dryRun }) + run(`nx g @nxpm/stack:api-crud ${model} --plural ${plural} --nameField ${nameField}`) + run(`yarn prisma:apply`) + + console.log('Please restart the API, will continue in 10 seconds...') + await sleep(10) + + run(`nx g @nxpm/stack:web-crud ${model} --plural ${plural} --nameField ${nameField}`) + run(`yarn build:sdk`) } diff --git a/packages/stack/src/schematics/generators/generators/crud/schema.json__tmpl__ b/packages/stack/src/schematics/generators/generators/crud/schema.json__tmpl__ index 7a953bac..cfd4d5da 100644 --- a/packages/stack/src/schematics/generators/generators/crud/schema.json__tmpl__ +++ b/packages/stack/src/schematics/generators/generators/crud/schema.json__tmpl__ @@ -1,24 +1,24 @@ { "cli": "nx", - "id": "web-module", + "id": "crud", "type": "object", "properties": { - "target": { + "model": { "type": "string", - "description": "Target folder to create the module", + "description": "Name of the model (in kebab-case), for example: company-address", "$default": { "$source": "argv", "index": 0 } }, - "name": { + "plural": { "type": "string", - "description": "Name of the module (in kebab-case)", + "description": "Name of the model (in kebab-case), for example: company-addresses", "$default": { "$source": "argv", "index": 1 } } }, - "required": ["target", "name"] + "required": ["model", "plural"] } From 1b57ea1f1a15447ac06c0f255ea77edc4c5fa0e6 Mon Sep 17 00:00:00 2001 From: Bram Borggreve Date: Tue, 16 Mar 2021 01:11:39 -0500 Subject: [PATCH 2/3] feat: add IsAdmin Guard --- .../files/data-access/src/index.ts__tmpl__ | 1 + .../src/lib/__projectName__.module.ts__tmpl__ | 3 +- .../src/lib/guards/is-admin.guard.ts__tmpl__ | 36 +++++++++++++++++++ .../schematic-web-feature-shell.spec.ts.snap | 3 +- .../src/lib/__projectName__.module.ts__tmpl__ | 3 +- 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ diff --git a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/index.ts__tmpl__ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/index.ts__tmpl__ index 5a12bca7..77eb7784 100644 --- a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/index.ts__tmpl__ +++ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/index.ts__tmpl__ @@ -1,3 +1,4 @@ +export * from './lib/guards/is-admin.guard' export * from './lib/guards/is-logged-in.guard' export * from './lib/<%= projectName %>.module' export * from './lib/<%= projectName %>.service' diff --git a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/__projectName__.module.ts__tmpl__ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/__projectName__.module.ts__tmpl__ index 2d0b3dc2..c461c4b2 100644 --- a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/__projectName__.module.ts__tmpl__ +++ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/__projectName__.module.ts__tmpl__ @@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' import { <%= classify(projectName) %>Service } from './<%= projectName %>.service' +import { IsAdminGuard } from './guards/is-admin.guard' import { IsLoggedInGuard } from './guards/is-logged-in.guard' @NgModule({ @@ -9,6 +10,6 @@ import { IsLoggedInGuard } from './guards/is-logged-in.guard' CommonModule, RouterModule, ], - providers: [<%= classify(projectName) %>Service, IsLoggedInGuard], + providers: [<%= classify(projectName) %>Service, IsAdminGuard, IsLoggedInGuard], }) export class <%= classify(projectName) %>Module {} diff --git a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ new file mode 100644 index 00000000..0d46b03f --- /dev/null +++ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core' +import { CanActivate, CanActivateChild, CanLoad, Router, UrlTree } from '@angular/router' +import { Role } from '@<%= npmScope %>/<%= appName %>/core/data-access' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' +import { <%= classify(appName) %>AuthStore } from '../<%= projectName %>.store' + +@Injectable() +export class IsAdminGuard implements CanActivate, CanActivateChild, CanLoad { + constructor(private readonly store: <%= classify(appName) %>AuthStore, private readonly router: Router) {} + + canActivate(): Observable { + return this.isAdmin() + } + + canActivateChild(): Observable { + return this.isAdmin() + } + + canLoad(): Observable { + return this.isAdmin() + } + + private isAdmin(): Observable { + return this.store.user$.pipe( + map((user) => user?.role === Role.Admin), + map((isAdmin) => { + if (!isAdmin) { + console.warn(`You need to have Admin permissions.`) + return this.router.createUrlTree(['/dashboard']) + } + return true + }), + ) + } +} diff --git a/packages/stack/src/schematics/web-feature-shell/__snapshots__/schematic-web-feature-shell.spec.ts.snap b/packages/stack/src/schematics/web-feature-shell/__snapshots__/schematic-web-feature-shell.spec.ts.snap index 126725c1..b6603b55 100644 --- a/packages/stack/src/schematics/web-feature-shell/__snapshots__/schematic-web-feature-shell.spec.ts.snap +++ b/packages/stack/src/schematics/web-feature-shell/__snapshots__/schematic-web-feature-shell.spec.ts.snap @@ -4,7 +4,7 @@ exports[`web-feature-shell schematic should run successfully 1`] = ` "import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { TestAuthDataAccessModule, IsLoggedInGuard } from '@nxpm/test/auth/data-access' +import { IsAdminGuard, IsLoggedInGuard, TestAuthDataAccessModule } from '@nxpm/test/auth/data-access' import { TestLayoutComponent } from '@nxpm/test/layout' const routes: Routes = [ @@ -25,6 +25,7 @@ const routes: Routes = [ }, { path: 'admin', + canActivate: [IsAdminGuard], loadChildren: () => import('@nxpm/test/admin/feature').then((m) => m.TestAdminFeatureModule), }, { diff --git a/packages/stack/src/schematics/web-feature-shell/files/feature/src/lib/__projectName__.module.ts__tmpl__ b/packages/stack/src/schematics/web-feature-shell/files/feature/src/lib/__projectName__.module.ts__tmpl__ index 09b04ba4..e9bd26aa 100644 --- a/packages/stack/src/schematics/web-feature-shell/files/feature/src/lib/__projectName__.module.ts__tmpl__ +++ b/packages/stack/src/schematics/web-feature-shell/files/feature/src/lib/__projectName__.module.ts__tmpl__ @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { <%= classify(appName) %>AuthDataAccessModule, IsLoggedInGuard } from '@<%= npmScope %>/<%= appName %>/auth/data-access' +import { IsAdminGuard, IsLoggedInGuard, <%= classify(appName) %>AuthDataAccessModule } from '@<%= npmScope %>/<%= appName %>/auth/data-access' import { <%= classify(appName) %>LayoutComponent } from '@<%= npmScope %>/<%= appName %>/layout' const routes: Routes = [ @@ -22,6 +22,7 @@ const routes: Routes = [ }, { path: 'admin', + canActivate: [IsAdminGuard], loadChildren: () => import('@<%= npmScope %>/<%= appName %>/admin/feature').then((m) => m.<%= classify(appName) %>AdminFeatureModule), }, { From 90f8dd49495ebdf90186c1f30352aa243dc8530f Mon Sep 17 00:00:00 2001 From: Bram Borggreve Date: Tue, 16 Mar 2021 02:06:25 -0500 Subject: [PATCH 3/3] feat: add Web Ui Toast library based on @ngneat/hot-toast --- .../tests/structure/web-structure.ts | 1 + .../__snapshots__/schematic-init.spec.ts.snap | 28 +++++++++++++++++++ ...schematic-mobile-feature-core.spec.ts.snap | 3 +- .../src/lib/__projectName__.module.ts__tmpl__ | 3 +- .../src/lib/guards/is-admin.guard.ts__tmpl__ | 9 ++++-- .../files/toast/src/index.ts__tmpl__ | 1 + .../lib/__projectName__.service.ts__tmpl__ | 21 ++++++++++++++ .../web-ui-libs/libs/create-ui-lib-toast.ts | 21 ++++++++++++++ .../src/schematics/web-ui-libs/libs/index.ts | 1 + .../web-ui-libs/schematic-web-ui-libs.ts | 2 ++ 10 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 packages/stack/src/schematics/web-ui-libs/files/toast/src/index.ts__tmpl__ create mode 100644 packages/stack/src/schematics/web-ui-libs/files/toast/src/lib/__projectName__.service.ts__tmpl__ create mode 100644 packages/stack/src/schematics/web-ui-libs/libs/create-ui-lib-toast.ts diff --git a/e2e/stack-e2e/tests/structure/web-structure.ts b/e2e/stack-e2e/tests/structure/web-structure.ts index aa4d90dd..7f4ae8b2 100644 --- a/e2e/stack-e2e/tests/structure/web-structure.ts +++ b/e2e/stack-e2e/tests/structure/web-structure.ts @@ -27,6 +27,7 @@ export function webProjects(project: string) { `${project}-ui-page`, `${project}-ui-sidebar-page`, `${project}-ui-table`, + `${project}-ui-toast`, `shared-util-sdk`, ] } diff --git a/packages/stack/src/schematics/init/__snapshots__/schematic-init.spec.ts.snap b/packages/stack/src/schematics/init/__snapshots__/schematic-init.spec.ts.snap index 21cbd0e8..4b2ff659 100644 --- a/packages/stack/src/schematics/init/__snapshots__/schematic-init.spec.ts.snap +++ b/packages/stack/src/schematics/init/__snapshots__/schematic-init.spec.ts.snap @@ -186,6 +186,9 @@ exports[`init schematic should run successfully 1`] = ` \\"test-ui-table\\": { \\"tags\\": [\\"scope:test\\", \\"type:ui\\"] }, + \\"test-ui-toast\\": { + \\"tags\\": [\\"scope:test\\", \\"type:ui\\"] + }, \\"shared-util-sdk\\": { \\"tags\\": [\\"scope:shared\\", \\"type:util\\"] } @@ -1756,6 +1759,28 @@ exports[`init schematic should run successfully 2`] = ` }, \\"schematics\\": {} }, + \\"test-ui-toast\\": { + \\"projectType\\": \\"library\\", + \\"root\\": \\"libs/test/ui/toast\\", + \\"sourceRoot\\": \\"libs/test/ui/toast/src\\", + \\"prefix\\": \\"ui\\", + \\"architect\\": { + \\"lint\\": { + \\"builder\\": \\"@nrwl/linter:eslint\\", + \\"options\\": { + \\"lintFilePatterns\\": [\\"libs/test/ui/toast/src/**/*.ts\\"] + } + }, + \\"test\\": { + \\"builder\\": \\"@nrwl/jest:jest\\", + \\"options\\": { + \\"jestConfig\\": \\"libs/test/ui/toast/jest.config.js\\", + \\"passWithNoTests\\": true + } + } + }, + \\"schematics\\": {} + }, \\"shared-util-sdk\\": { \\"projectType\\": \\"library\\", \\"root\\": \\"libs/shared/util/sdk\\", @@ -1856,6 +1881,7 @@ exports[`init schematic should run successfully 3`] = ` \\"@proj/test/ui/page-header\\": [\\"libs/test/ui/page-header/src/index.ts\\"], \\"@proj/test/ui/sidebar-page\\": [\\"libs/test/ui/sidebar-page/src/index.ts\\"], \\"@proj/test/ui/table\\": [\\"libs/test/ui/table/src/index.ts\\"], + \\"@proj/test/ui/toast\\": [\\"libs/test/ui/toast/src/index.ts\\"], \\"@proj/shared/util/sdk\\": [\\"libs/shared/util/sdk/src/index.ts\\"] } } @@ -1891,6 +1917,8 @@ exports[`init schematic should run successfully 4`] = ` \\"@nestjs/passport\\": \\"^7.1.5\\", \\"@nestjs/platform-express\\": \\"^7.0.0\\", \\"@nestjs/serve-static\\": \\"2.1.4\\", + \\"@ngneat/hot-toast\\": \\"2.0.1\\", + \\"@ngneat/overview\\": \\"1.0.0\\", \\"@ngneat/svg-icon\\": \\"2.2.2\\", \\"@ngrx/component-store\\": \\"11.0.0\\", \\"@ngx-formly/core\\": \\"5.10.13\\", diff --git a/packages/stack/src/schematics/mobile-feature-core/__snapshots__/schematic-mobile-feature-core.spec.ts.snap b/packages/stack/src/schematics/mobile-feature-core/__snapshots__/schematic-mobile-feature-core.spec.ts.snap index dc1b0646..5b09e245 100644 --- a/packages/stack/src/schematics/mobile-feature-core/__snapshots__/schematic-mobile-feature-core.spec.ts.snap +++ b/packages/stack/src/schematics/mobile-feature-core/__snapshots__/schematic-mobile-feature-core.spec.ts.snap @@ -3,12 +3,13 @@ exports[`mobile-feature-core schematic should run successfully 1`] = ` "import { HttpClientModule } from '@angular/common/http' import { NgModule } from '@angular/core' +import { HotToastModule } from '@ngneat/hot-toast'; import { SvgIconsModule } from '@ngneat/svg-icon' import { TestCoreFeatureGraphQLModule } from './test-core-feature-graphql.module' @NgModule({ - imports: [HttpClientModule, TestCoreFeatureGraphQLModule, SvgIconsModule.forRoot()], + imports: [HttpClientModule, TestCoreFeatureGraphQLModule, HotToastModule.forRoot(), SvgIconsModule.forRoot()], }) export class TestCoreFeatureModule {} " diff --git a/packages/stack/src/schematics/mobile-feature-core/files/feature/src/lib/__projectName__.module.ts__tmpl__ b/packages/stack/src/schematics/mobile-feature-core/files/feature/src/lib/__projectName__.module.ts__tmpl__ index 34dd7981..74810535 100644 --- a/packages/stack/src/schematics/mobile-feature-core/files/feature/src/lib/__projectName__.module.ts__tmpl__ +++ b/packages/stack/src/schematics/mobile-feature-core/files/feature/src/lib/__projectName__.module.ts__tmpl__ @@ -1,10 +1,11 @@ import { HttpClientModule } from '@angular/common/http' import { NgModule } from '@angular/core' +import { HotToastModule } from '@ngneat/hot-toast'; import { SvgIconsModule } from '@ngneat/svg-icon' import { <%= classify(projectName) %>GraphQLModule } from './<%= projectName %>-graphql.module' @NgModule({ - imports: [HttpClientModule, <%= classify(projectName) %>GraphQLModule, SvgIconsModule.forRoot()], + imports: [HttpClientModule, <%= classify(projectName) %>GraphQLModule, HotToastModule.forRoot(), SvgIconsModule.forRoot()], }) export class <%= classify(projectName) %>Module {} diff --git a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ index 0d46b03f..8927443a 100644 --- a/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ +++ b/packages/stack/src/schematics/web-feature-auth/files/data-access/src/lib/guards/is-admin.guard.ts__tmpl__ @@ -1,13 +1,18 @@ import { Injectable } from '@angular/core' import { CanActivate, CanActivateChild, CanLoad, Router, UrlTree } from '@angular/router' import { Role } from '@<%= npmScope %>/<%= appName %>/core/data-access' +import { <%= classify(appName) %>UiToastService } from '@<%= npmScope %>/<%= appName %>/ui/toast' import { Observable } from 'rxjs' import { map } from 'rxjs/operators' import { <%= classify(appName) %>AuthStore } from '../<%= projectName %>.store' @Injectable() export class IsAdminGuard implements CanActivate, CanActivateChild, CanLoad { - constructor(private readonly store: <%= classify(appName) %>AuthStore, private readonly router: Router) {} + constructor( + private readonly router: Router, + private readonly store: <%= classify(appName) %>AuthStore, + private readonly toast: <%= classify(appName) %>UiToastService, + ) {} canActivate(): Observable { return this.isAdmin() @@ -26,7 +31,7 @@ export class IsAdminGuard implements CanActivate, CanActivateChild, CanLoad { map((user) => user?.role === Role.Admin), map((isAdmin) => { if (!isAdmin) { - console.warn(`You need to have Admin permissions.`) + this.toast.error(`You need to have Admin permissions.`) return this.router.createUrlTree(['/dashboard']) } return true diff --git a/packages/stack/src/schematics/web-ui-libs/files/toast/src/index.ts__tmpl__ b/packages/stack/src/schematics/web-ui-libs/files/toast/src/index.ts__tmpl__ new file mode 100644 index 00000000..1db7c0cd --- /dev/null +++ b/packages/stack/src/schematics/web-ui-libs/files/toast/src/index.ts__tmpl__ @@ -0,0 +1 @@ +export * from './lib/<%= projectName %>.service' diff --git a/packages/stack/src/schematics/web-ui-libs/files/toast/src/lib/__projectName__.service.ts__tmpl__ b/packages/stack/src/schematics/web-ui-libs/files/toast/src/lib/__projectName__.service.ts__tmpl__ new file mode 100644 index 00000000..47718558 --- /dev/null +++ b/packages/stack/src/schematics/web-ui-libs/files/toast/src/lib/__projectName__.service.ts__tmpl__ @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core' +import { HotToastService } from '@ngneat/hot-toast' +import { ToastOptions } from '@ngneat/hot-toast/lib/hot-toast.model' +import { Content } from '@ngneat/overview' + +@Injectable({ providedIn: 'root' }) +export class <%= classify(projectName) %>Service { + constructor(private readonly toast: HotToastService) {} + + error(message?: Content, options?: ToastOptions) { + return this.toast.error(message, options) + } + + success(message?: Content, options?: ToastOptions) { + return this.toast.success(message, options) + } + + warning(message?: Content, options?: ToastOptions) { + return this.toast.warning(message, options) + } +} diff --git a/packages/stack/src/schematics/web-ui-libs/libs/create-ui-lib-toast.ts b/packages/stack/src/schematics/web-ui-libs/libs/create-ui-lib-toast.ts new file mode 100644 index 00000000..2b5c6775 --- /dev/null +++ b/packages/stack/src/schematics/web-ui-libs/libs/create-ui-lib-toast.ts @@ -0,0 +1,21 @@ +import { Rule } from '@angular-devkit/schematics' +import { ProjectType } from '@nrwl/workspace' +import { normalizeOptions } from '../../../utils' +import { WebUiLibsSchematicSchema } from '../schema' +import { createUiLib } from './create-ui-lib' + +export function createUiLibToast(options: WebUiLibsSchematicSchema): Rule { + const name = 'toast' + const normalizedOptions = normalizeOptions({ ...options, name: `ui/${name}` }, ProjectType.Library) + + return createUiLib( + options.directory, + name, + `./files/${name}`, + { + '@ngneat/hot-toast': '2.0.1', + '@ngneat/overview': '1.0.0', + }, + normalizedOptions, + ) +} diff --git a/packages/stack/src/schematics/web-ui-libs/libs/index.ts b/packages/stack/src/schematics/web-ui-libs/libs/index.ts index 9db6b70e..edbff7c2 100644 --- a/packages/stack/src/schematics/web-ui-libs/libs/index.ts +++ b/packages/stack/src/schematics/web-ui-libs/libs/index.ts @@ -6,3 +6,4 @@ export * from './create-ui-lib-page' export * from './create-ui-lib-page-header' export * from './create-ui-lib-sidebar-page' export * from './create-ui-lib-table' +export * from './create-ui-lib-toast' diff --git a/packages/stack/src/schematics/web-ui-libs/schematic-web-ui-libs.ts b/packages/stack/src/schematics/web-ui-libs/schematic-web-ui-libs.ts index c3a93e45..5bf94287 100644 --- a/packages/stack/src/schematics/web-ui-libs/schematic-web-ui-libs.ts +++ b/packages/stack/src/schematics/web-ui-libs/schematic-web-ui-libs.ts @@ -8,6 +8,7 @@ import { createUiLibPageHeader, createUiLibSidebarPage, createUiLibTable, + createUiLibToast, } from './libs' import { WebUiLibsSchematicSchema } from './schema' @@ -26,5 +27,6 @@ export default function (options: WebUiLibsSchematicSchema): Rule { createUiLibPageHeader(options), createUiLibSidebarPage(options), createUiLibTable(options), + createUiLibToast(options), ]) }