Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Model Driven Angular: Generating Applications w...

Model Driven Angular: Generating Applications with the CLI and Schematics -- Talk from DWX 2018 in Nuremberg, Germany

# Example: Scaffolding a Menu Component

- Using parameters
- Using templates
- Modifying existing code with the TypeScript Compiler API

https://github.com/manfredsteyer/schematics-modify-typescript-ast

# Example: Scaffolding a Crud Application

https://github.com/manfredsteyer/angular-crud
https://www.npmjs.com/package/angular-crud

# Great Intro into Schematics
https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2

# Blog Article Series about Schematics (4 parts so far)
http://www.softwarearchitekt.at/post/2017/10/29/generating-custom-code-with-the-angular-cli-and-schematics.aspx

Manfred Steyer

June 26, 2018
Tweet

More Decks by Manfred Steyer

Other Decks in Programming

Transcript

  1. ManfredSteyer About me… • Manfred Steyer • Blog: SOFTWAREarchitekt.at •

    Angular Trainings and Consultancy • Google Developer Expert (GDE) Page ▪ 3 Manfred Steyer Public: Vienna, München, Zürich In-House: everywhere http://softwarearchitekt.at/workshops
  2. ManfredSteyer Have you ever tried to … … setup a

    modern JavaScript project manually? • Compiler/ Transpiler • Package manager and packages • Build chain optimized for bundle size, performance, etc. • Testing tools including code coverage • Linting tools
  3. ManfredSteyer Contents • What is Schematics? • How to create

    custom schematics? • How to use parameters? • How to use templates? • How to scaffold whole projects?
  4. ManfredSteyer Schematics Scaffolding Tool used by Angular CLI Schematics: The

    whole project Schematic: Code Generator Collection: Set of Schematics
  5. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D E C F Your Project Staging Area Tree Object
  6. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F Your Project Staging Area Tree Object
  7. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F G Your Project Staging Area Tree Object
  8. ManfredSteyer Schematics are atomic (like db transactions) A B D

    E C F A B D' E C F G Your Project Staging Area Tree Object
  9. ManfredSteyer Schematics are atomic (like db transactions) A B D'

    E C F G A B D' E C F G Your Project Staging Area Tree Object
  10. ManfredSteyer Rule Factory export function helloWorld(options: any): Rule { return

    (tree: Tree, _context: SchematicContext) => { _context.logger.debug('Manfred was here!'); tree.create('hello.txt', 'Hello World!'); return tree; }; } Rule
  11. ManfredSteyer Testing in Demo App npm install hello-world or npm

    link ..\hello-world schematics hello-world:hello-world
  12. ManfredSteyer Testing in Demo App npm install hello-world or npm

    link ..\hello-world ng generate hello-world:hello-world
  13. ManfredSteyer Option Class in schema.ts export interface MenuOptions { name:

    string; project: string; […] menuService: boolean; […] } provided by the CLI custom stuff
  14. ManfredSteyer Rule Factory gets Parameter Object export default function (options:

    MenuOptions): Rule { return (host: Tree, context: SchematicContext) => { […] } }
  15. ManfredSteyer Rule Factory gets Parameter Object export default function (options:

    MenuOptions): Rule { return (host: Tree, context: SchematicContext) => { […] } }
  16. ManfredSteyer Template export interface <%= classify(name) %>Item { title: string;

    iconClass: string; } passed property passed function
  17. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { […] } }
  18. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { const templateSource = apply(url('./files'), [ filterTemplates(options), template({...stringUtils, ...options}), move(options.sourceDir) ]); […] } } passed properties passed functions
  19. ManfredSteyer Rule Calling Templates export default function (options: MenuOptions): Rule

    { return (host: Tree, context: SchematicContext) => { const templateSource = apply(url('./files'), [ filterTemplates(options), template({...stringUtils, ...options}), move(options.sourceDir) ]); const rule = chain([ branchAndMerge(chain([ mergeWith(templateSource), […] ])) ]); return rule(host, context); } }
  20. ManfredSteyer Declaring Generated Components import { NgModule } from '@angular/core';

    import { CommonModule } from '@angular/common'; import { SideMenuComponent } from './side-menu/side-menu.component'; @NgModule({ imports: [ CommonModule ], declarations: [ SideMenuComponent ], exports: [ SideMenuComponent ] }) export class CoreModule { }
  21. ManfredSteyer Injecting Service into Component […] import { SideMenuService }

    from './core/side-menu/side-menu.service'; @Component({ […] }) export class AppComponent { constructor( ) { // sideMenuService.show = true; } }
  22. ManfredSteyer Code File as Syntax Tree (simplified) ClassDeclaration ClassKeyword (class)

    Identifier (Demo) … SyntaxList class Demo { constructor(otherDemo: Demo) {} } Subtree w/ Constructor …
  23. ManfredSteyer Needed Steps Example covering all cases Finding Variation Points

    Define Model to describe Variation Points Write and Test Generator
  24. ManfredSteyer Installing and Updating Angular Packages ng add @cool/library •

    npm i @cool/library • execute ng-add Schematic ng update @cool/library • npm update @cool/library • execute update Schematics
  25. ManfredSteyer ng add { "schematics": { "ng-add": { "description": "Initialize

    Library", "factory": "./ng-add/index#ngAdd" }, } }
  26. ManfredSteyer ng update { "schematics": { "update": { "version": "2.0.0",

    "description": "updates to version 2.0.0", "factory": "./update/index#update" } } } Choose any name …
  27. ManfredSteyer ng update { "schematics": { "update20": { "version": "2.0.0",

    "description": "updates to version 2.0.0", "factory": "./update/index#update" }, "update21": { "version": "2.1.0", "description": "updates to version 2.1.0", "factory": "./update21/index#update" } } }
  28. ManfredSteyer Further Information • Great introduction in Angular Blog •

    https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2 • My Tutorial/ Case Study (5 articles so far) • https://goo.gl/kGS6L5 • Angular-Crud (Generator) • https://www.npmjs.com/package/angular-crud
  29. ManfredSteyer Conclusion Automate boring tasks! Official Solution in ng world

    Staging Area, Templates, Rules schema.json w/ JSON Schema Create own or tweak existing ones ng add & ng update