рд╣реИрд▓реЛ, рдореЗрд░рд╛ рдирд╛рдо рдореИрдХреНрд╕рд┐рдо рд╣реИред рдЕрдм рдХрдИ рд╕рд╛рд▓реЛрдВ рд╕реЗ рдореИрдВ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди html рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЕрдкрдиреЗ рджреИрдирд┐рдХ рдХрд╛рд░реНрдп рдореЗрдВ, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдкрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рд╡реЗрдмрдкреИрдХ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдмреАрдИрдПрдо рдкрджреНрдзрддрд┐ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдЕрджреНрднреБрдд рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдХреЛрдгреАрдп рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдЬрдм рд╕реЗ рдореБрдЭреЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрджрдд рдереА, рдореИрдВ рдирдВрдЧреЗ html рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдЖрдИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рди рдХреЗрд╡рд▓ рджреЛрд╕реНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде cli рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд┐рдпрд╛, рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЕрдорд▓ рдХрд░рддреЗ рд╣реИрдВ:
ng g test-project
ред
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдореИрдВрдиреЗ scss рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЪреБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ HTML рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдШрдЯрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ, рдЕрдм рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдХреЛрдгреАрдп рдХреНрд▓реА рдорд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдирдЬреА-рдХреНрд▓реА-рдкрдЧ-рд▓реЛрдбрд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛
рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
ng add ng-cli-pug-loader
ред
рдЕрдм рдЖрдк рдкрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо AppComponent рдШрдЯрдХ рдХреЗ рдореВрд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
@Component({ selector: 'app-root', templateUrl: './app.component.pug', styleUrls: ['./app.component.scss'] })
рддрджрдиреБрд╕рд╛рд░, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди app.component.html рдХреЛ app.component.pug рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рдордЧреНрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдореИрдВрдиреЗ рд░рд╛рдЙрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
рдЕрдВрдд рдореЗрдВ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ!
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ @ рдХреЛрдгреАрдп-рджреЗрд╡рдХрд┐рдЯ рд╕реЗ рдпреЛрдЬрдирд╛рдмрджреНрдз-cli рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install -g @angular-devkit/schematics-cli
ред
рдореИрдВрдиреЗ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ:
schematics blank --name=bempug-component
ред
рд╣рдо рдмрдирд╛рдИ рдЧрдИ рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдм рд╣рдо src / collection.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json", "schematics": { "bempug-component": { "description": "A blank schematic.", "factory": "./bempug-component/index#bempugComponent" } } }
рдпрд╣ рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреА рдПрдХ рд╡рд┐рд╡рд░рдг рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬрд╣рд╛рдБ рдкреИрд░рд╛рдореАрдЯрд░ "рдлрд╝реИрдХреНрдЯрд░реА": "./bempug-component/index#bempugComponent" рд╣реИ: рдпрд╣ рд╣рдорд╛рд░реЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ "рдХрд╛рд░рдЦрд╛рдиреЗ" рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ "рдлрд╝реИрдХреНрдЯрд░реА" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ ".bempug-component/index" рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдПрдБ редjson, рдпрд╣ рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред
{ "$schema": "http://json-schema.org/schema", "id": "SchemanticsForMenu", "title": "Bempug Schema", "type": "object", "properties": { "name": { "type": "string", "$default": { "$source": "argv", "index": 0 } }, "path": { "type": "string", "format": "path", "description": "The path to create the component.", "visible": false }, "project": { "type": "string", "description": "The name of the project.", "$default": { "$source": "projectName" } } } }
рдкреИрд░рд╛рдореАрдЯрд░ рдЧреБрдг рдореЗрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:
- рдЗрдХрд╛рдИ рдХрд╛ рдирд╛рдо (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдШрдЯрдХ рд╣реЛрдЧрд╛);
- рдкрде рд╡рд╣ рдкрде рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯрд░ рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛;
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд╡рдпрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдХ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛;
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВред
"module": { "type": "string", "description": "The declaring module.", "alias": "m" }, "componentModule": { "type": "boolean", "default": true, "description": "Patern module per Component", "alias": "mc" }, "export": { "type": "boolean", "default": false, "description": "Export component from module?" }
- рдпрд╣рд╛рдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдШрдЯрдХ рдореЙрдбреНрдпреВрд▓;
- рдШрдЯрдХрдореЙрдбреНрдпреВрд▓ рд╡рд╣рд╛рдБ рдПрдХ рдЭрдВрдбрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдШрдЯрдХ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдирд╛ рд╣реИ (рддрдм рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛);
- рдирд┐рд░реНрдпрд╛рдд: рдпрд╣ рд╡рд╣ рдзреНрд╡рдЬ рд╣реИ рдЬреЛ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ;
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╕реНрдХреАрдорд╛ред рдбреАрдЯреАрдПрд╕ рдлрд╝рд╛рдЗрд▓ред
export interface BemPugOptions { name: string; project?: string; path?: string; module?: string; componentModule?: boolean; module?: string; export?: boolean; bemPugMixinPath?: string; }
рдЗрд╕рдореЗрдВ, рдЧреБрдг рд╕реНрдХреАрдорд╛.json рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЧреБрдгред рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ, index.ts рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рджреЛ рдлрд╝рд┐рд▓реНрдЯрд░рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреЗ рдШрдЯрдХреЛрдореЙрдбреНрдпреВрд▓ рдФрд░ рд╕реЗрдЯрдЕрдкрдСрдлреНрдпреВрд╢рдВрд╕ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬреЛ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
function filterTemplates(options: BemPugOptions): Rule { if (!options.componentModule) { return filter(path => !path.match(/\.module\.ts$/) && !path.match(/-item\.ts$/) && !path.match(/\.bak$/)); } return filter(path => !path.match(/\.bak$/)); } function setupOptions(options: BemPugOptions, host: Tree): void { const workspace = getWorkspace(host); if (!options.project) { options.project = Object.keys(workspace.projects)[0]; } const project = workspace.projects[options.project]; if (options.path === undefined) { const projectDirName = project.projectType === 'application' ? 'app' : 'lib'; options.path = `/${project.root}/src/${projectDirName}`; } const parsedPath = parseName(options.path, options.name); options.name = parsedPath.name; options.path = parsedPath.path; }
рдЕрдЧрд▓рд╛, рд╣рдо рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
export function bempugComponent(options: BemPugOptions): Rule { return (host: Tree, context: SchematicContext) => { setupOptions(options, host); const templateSource = apply(url('./files'), [ filterTemplates(options), template({ ...strings, ...options }), move(options.path || '') ]); const rule = chain([ branchAndMerge(chain([ mergeWith(templateSource), ])) ]); return rule(host, context); } }
рдХрд╛рд░рдЦрд╛рдирд╛ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╛рдЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдШрдЯрдХ рдлрд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд╣рдо рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдпреЛрдЬрдирд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ bempug- рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ __name@dasherize__
, рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди, рдХрд╛рд░рдЦрд╛рдирд╛ рдШрдЯрдХ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде __name@dasherize__
рдХреЛ рдмрджрд▓ __name@dasherize__
ред
рдЕрдЧрд▓рд╛, __name@dasherize__
рдЕрдВрджрд░ __name@dasherize__
рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВ
__name@dasherize__
рдкрдЧ рдШрдЯрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ- рдШрдЯрдХ рдХреЗ рд▓рд┐рдП
__name@dasherize__
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ - рдШрдЯрдХ рдХрд╛
__name@dasherize__
рдлрд╝рд╛рдЗрд▓ __name@dasherize__
-component.module.ts рдШрдЯрдХ рдореЙрдбреНрдпреВрд▓__name@dasherize__
-component.scss рдШрдЯрдХ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрдб-рдЯреВ-рдореЙрдбреНрдпреВрд▓-рд░реЗрдлрд░реЗрдВрд╕ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
import * as ts from 'typescript'; export class AddToModuleContext {
рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВред
const stringUtils = { dasherize, classify };
рдЕрдм, cli рдХрдорд╛рдВрдб рдореЗрдВ -m <рдореЙрдбреНрдпреВрд▓ рд╕рдВрджрд░реНрдн> рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ -рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлреНрд▓реИрдЧ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЗрд╕рдореЗрдВ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЕрдЧрд▓рд╛ рд╣рдо BEM рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ npm bempug рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ рдПрдХ bempugMixin.pug рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЛрдб рдмрдирд╛рдпрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдФрд░ рджреВрд╕рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рддрд╛рдХрд┐ рдорд┐рдХреНрд╕рдЪрд░ рдХреЛ рдХреЛрдгреАрдп рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдорд┐рд╢реНрд░рдг рд╣рдорд╛рд░реА рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдирдП рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
import { Rule, SchematicContext, Tree, filter, apply, template, move, chain, branchAndMerge, mergeWith, url, SchematicsException } from '@angular-devkit/schematics'; import {BemPugOptions} from "./schema"; import {getWorkspace} from "@schematics/angular/utility/config"; import {parseName} from "@schematics/angular/utility/parse-name"; import {normalize, strings} from "@angular-devkit/core"; import { AddToModuleContext } from './add-to-module-context'; import * as ts from 'typescript'; import {classify, dasherize} from "@angular-devkit/core/src/utils/strings"; import {buildRelativePath, findModuleFromOptions, ModuleOptions} from "@schematics/angular/utility/find-module"; import {addExportToModule, addImportToModule} from "@schematics/angular/utility/ast-utils"; import {InsertChange} from "@schematics/angular/utility/change"; const stringUtils = { dasherize, classify };
рдпрд╣ рд╣рдорд╛рд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
__name@dasherize__.component.pug
:
include <%= bemPugMixinPath %> +b('<%= name %>') +e('item', {m:'test'}) | <%= name %> works
рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди <% =%> рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрдпрд╛ рдШрдЯрдХ рдХреЗ рдирд╛рдо рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
__name@dasherize__.component.spec.ts:
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import {NO_ERRORS_SCHEMA} from '@angular/core'; import { <%= classify(name) %>ComponentModule } from './<%= name %>-component.module'; import { <%= classify(name) %>Component } from './<%= name %>.component'; describe('<%= classify(name) %>Component', () => { let component: <%= classify(name) %>Component; let fixture: ComponentFixture<<%= classify(name) %>Component>; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [<%= classify(name) %>ComponentModule], declarations: [], schemas: [ NO_ERRORS_SCHEMA ] }) .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(<%= classify(name) %>Component); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); });
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, <% = рд╡рд░реНрдЧреАрдХреГрдд (рдирд╛рдо)%> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрдорд▓рдХреЗрд╕ рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
__name@dasherize__.component.ts:
import { Component, OnInit, ViewEncapsulation} from '@angular/core'; @Component({ selector: 'app-<%=dasherize(name)%>-component', templateUrl: '<%=dasherize(name)%>.component.pug', styleUrls: ['./<%=dasherize(name)%>-component.scss'], encapsulation: ViewEncapsulation.None }) export class <%= classify(name) %>Component implements OnInit { constructor() {} ngOnInit(): void { } }
__name@dasherize__-component.module.ts:
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import {<%= classify(name) %>Component} from './<%= name %>.component'; @NgModule({ declarations: [ <%= classify(name) %>Component, ], imports: [ CommonModule ], exports: [ <%= classify(name) %>Component, ] }) export class <%= classify(name) %>ComponentModule { }
__name@dasherize__-component.scss:
.<%= name %>{ }
рд╣рдо `` рдПрдирдкреАрдПрдо рд░рди рдмрд┐рд▓реНрдб`` рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдШрдЯрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ!
рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХреЛрдгреАрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВред
ng gm test-schema
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ `` npm рд▓рд┐рдВрдХ <рдирд┐рд░рдкреЗрдХреНрд╖ рдкрде> рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдиреЛрдб_рдореЙрдбрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред
рдФрд░ рд╣рдо ng g bempug-component:bempug-component test -m /src/app/test-schema/test-schema.module.ts тАУexport
рд╕рд╛рде рд╕рд░реНрдХрд┐рдЯ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ ng g bempug-component:bempug-component test -m /src/app/test-schema/test-schema.module.ts тАУexport
ред
рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдПрдХ рдШрдЯрдХ рдмрдирд╛рдПрдЧреА рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдЧреАред
рдпреЛрдЬрдирд╛ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдкрд░рд┐рдЪрд┐рдд рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдкрд░ рдЖрд╡реЗрджрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдпрд╣рд╛рдВ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреИрдХреЗрдЬ рднреА npm рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред
рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рддреЛ рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╕рдордп рдореИрдВ рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рдЖрднрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реВрдВред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рд░ рдХреЛрдИ рдЬреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рддрд╛ рд╣реИ, рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ!
рдФрд░ рдПрдХ рдФрд░ рд░реЛрдорд╛рдВрдЪрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореБрдЭреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реА рд╣реИред рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВ!