├── .gitignore ├── dist ├── angular-bem.d.ts ├── esm2015 │ ├── angular-bem.js │ └── bem.js ├── esm5 │ ├── angular-bem.js │ └── bem.js ├── bem.d.ts ├── LICENSE ├── package.json ├── README.md ├── angular-bem.metadata.json ├── bundles │ ├── angular-bem.umd.min.js │ ├── angular-bem.umd.min.js.map │ ├── angular-bem.umd.js.map │ └── angular-bem.umd.js ├── fesm2015 │ ├── angular-bem.js.map │ └── angular-bem.js └── fesm5 │ ├── angular-bem.js.map │ └── angular-bem.js ├── .editorconfig ├── tsconfig.json ├── LICENSE ├── package.json ├── README.md └── src └── bem.ts /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | bower_components 4 | test 5 | node_modules 6 | npm-debug.log 7 | -------------------------------------------------------------------------------- /dist/angular-bem.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Generated bundle index. Do not edit. 3 | */ 4 | export * from './bem'; 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | insert_final_newline = false 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /dist/esm2015/angular-bem.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview added by tsickle 3 | * @suppress {checkTypes} checked by tsc 4 | */ 5 | /** 6 | * Generated bundle index. Do not edit. 7 | */ 8 | export { BemConfig, BlockDirective, ElemDirective, ModDirective, BemModule } from './bem'; 9 | 10 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1iZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWJlbS8iLCJzb3VyY2VzIjpbImFuZ3VsYXItYmVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJQSxrRkFBYyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vYmVtJztcbiJdfQ== -------------------------------------------------------------------------------- /dist/esm5/angular-bem.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview added by tsickle 3 | * @suppress {checkTypes} checked by tsc 4 | */ 5 | /** 6 | * Generated bundle index. Do not edit. 7 | */ 8 | export { BemConfig, BlockDirective, ElemDirective, ModDirective, BemModule } from './bem'; 9 | 10 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1iZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWJlbS8iLCJzb3VyY2VzIjpbImFuZ3VsYXItYmVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJQSxrRkFBYyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vYmVtJztcbiJdfQ== -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "target": "es5", 5 | "module": "commonjs", 6 | "moduleResolution": "node", 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "allowSyntheticDefaultImports": true, 10 | "sourceMap": true, 11 | "noEmitHelpers": true, 12 | "importHelpers": true, 13 | "strictNullChecks": false, 14 | "baseUrl": "./src", 15 | "paths": { 16 | }, 17 | "lib": [ 18 | "dom", 19 | "es6" 20 | ], 21 | "types": [], 22 | "outDir": "dist" 23 | }, 24 | "exclude": [ 25 | "node_modules", 26 | "dist" 27 | ], 28 | "files": [ 29 | "./src/bem.ts" 30 | ], 31 | "awesomeTypescriptLoaderOptions": { 32 | "forkChecker": true, 33 | "useWebpackText": true 34 | }, 35 | "compileOnSave": false, 36 | "buildOnSave": false, 37 | "atom": { "rewriteTsconfig": false } 38 | } 39 | -------------------------------------------------------------------------------- /dist/bem.d.ts: -------------------------------------------------------------------------------- 1 | import { Renderer2, ElementRef } from '@angular/core'; 2 | export declare class BemConfig { 3 | separators?: Array; 4 | ignoreValues?: boolean; 5 | modCase?: string; 6 | } 7 | export declare class BlockDirective { 8 | element: ElementRef; 9 | renderer: Renderer2; 10 | name: string; 11 | mod: string | string[] | object; 12 | private _mods; 13 | private _modSerialized; 14 | constructor(element: ElementRef, renderer: Renderer2, name: string); 15 | ngOnChanges(): void; 16 | } 17 | export declare class ElemDirective { 18 | element: ElementRef; 19 | renderer: Renderer2; 20 | blockName: string; 21 | name: string; 22 | mod: string | string[] | object; 23 | private _mods; 24 | private _modSerialized; 25 | constructor(element: ElementRef, renderer: Renderer2, name: string, block: BlockDirective); 26 | ngOnChanges(): void; 27 | } 28 | export declare class ModDirective { 29 | } 30 | export declare class BemModule { 31 | static config(data: BemConfig): typeof BemModule; 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (c) 20013-2017 Andrey Yamanov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | 'Software'), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /dist/LICENSE: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (c) 20013-2017 Andrey Yamanov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | 'Software'), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /dist/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-bem", 3 | "version": "2.2.0", 4 | "description": "A set of Angular (v2+) directives to simplify your workflow with BEM methodology", 5 | "main": "bundles/angular-bem.umd.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/tenphi/angular-bem.git" 9 | }, 10 | "keywords": [ 11 | "angular", 12 | "bem", 13 | "directive", 14 | "markup" 15 | ], 16 | "author": "Andrey Yamanov ", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/tenphi/angular-bem/issues" 20 | }, 21 | "homepage": "https://github.com/tenphi/angular-bem#readme", 22 | "module": "fesm5/angular-bem.js", 23 | "es2015": "fesm2015/angular-bem.js", 24 | "esm5": "esm5/angular-bem.js", 25 | "esm2015": "esm2015/angular-bem.js", 26 | "fesm5": "fesm5/angular-bem.js", 27 | "fesm2015": "fesm2015/angular-bem.js", 28 | "typings": "angular-bem.d.ts", 29 | "metadata": "angular-bem.metadata.json", 30 | "sideEffects": false, 31 | "dependencies": { 32 | "tslib": "^1.9.0" 33 | }, 34 | "devDependencies": { 35 | "@angular/compiler": "^6.0.7", 36 | "@angular/compiler-cli": "^6.0.7", 37 | "@angular/core": "^6.0.0", 38 | "ng-packagr": "^3.0.3", 39 | "rxjs": "^6.0.0", 40 | "typescript": "~2.7.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-bem", 3 | "version": "2.2.0", 4 | "description": "A set of Angular (v2+) directives to simplify your workflow with BEM methodology", 5 | "main": "dist/bundles/angular-bem.umd.js", 6 | "scripts": { 7 | "build": "ng-packagr -p package.json", 8 | "prepare": "ng-packagr -p package.json" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/tenphi/angular-bem.git" 13 | }, 14 | "keywords": [ 15 | "angular", 16 | "bem", 17 | "directive", 18 | "markup" 19 | ], 20 | "author": "Andrey Yamanov ", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/tenphi/angular-bem/issues" 24 | }, 25 | "homepage": "https://github.com/tenphi/angular-bem#readme", 26 | "module": "dist/fesm5/angular-bem.js", 27 | "es2015": "dist/fesm2015/angular-bem.js", 28 | "esm5": "dist/esm5/angular-bem.js", 29 | "esm2015": "dist/esm2015/angular-bem.js", 30 | "fesm5": "dist/fesm5/angular-bem.js", 31 | "fesm2015": "dist/fesm2015/angular-bem.js", 32 | "typings": "dist/angular-bem.d.ts", 33 | "metadata": "dist/angular-bem.metadata.json", 34 | "sideEffects": false, 35 | "dependencies": { 36 | "tslib": "^1.9.0" 37 | }, 38 | "devDependencies": { 39 | "@angular/compiler": "^6.0.7", 40 | "@angular/compiler-cli": "^6.0.7", 41 | "@angular/core": "^6.0.0", 42 | "ng-packagr": "^3.0.3", 43 | "rxjs": "^6.0.0", 44 | "typescript": "~2.7.0" 45 | }, 46 | "ngPackage": { 47 | "lib": { 48 | "entryFile": "src/bem.ts" 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # angular-bem 2 | 3 | A set of directives to simplify your workflow with [BEM](https://bem.info)-markup in [Angular](https://angularjs.org) (v2+) applications. 4 | 5 | [ANGULAR 1.X VERSION IS HERE](https://github.com/tenphi/angular-bem/tree/v1) 6 | 7 | ## Changelog 8 | 9 | ### 2.1.0 10 | * Support for Angular v6+ 11 | * Refactoring 12 | 13 | ### 2.0.0 14 | * Initial release for Angular v2+ 15 | 16 | ## Install 17 | 18 | ```bash 19 | $ npm install angular-bem 20 | ``` 21 | 22 | ## Example 23 | Import this module to your app: 24 | 25 | ```javascript 26 | import { BemModule } from 'angular-bem'; 27 | 28 | @NgModule({ 29 | imports: [ BemModule ] 30 | }) 31 | export class AppModule {} 32 | ``` 33 | 34 | Now anywhere in your app you can use following syntax: 35 | 36 | ```html 37 |
38 |
39 |
40 | ``` 41 | 42 | or 43 | 44 | ```html 45 |
46 |
47 |
48 | ``` 49 | 50 | Instead of `true` you can use any property from the component. Value `true` will add mod to the block (or elem) and `false` will remove it. 51 | 52 | As a result of module's work the following markup may be produced: 53 | 54 | ```html 55 |
56 |
57 |
58 | ``` 59 | 60 | If you use `string` or `number` as a value then this value will be used as addition for the mod class like `my-block__my-element--mod-name-value`. 61 | 62 | ## Configuration 63 | 64 | You can change module behaviour with BemConfig: 65 | 66 | ```javascript 67 | import { BemModule } from 'angular-bem'; 68 | 69 | BemModule.config({ 70 | separators: ['__', '--', '-'], // el / mod / val separators 71 | modCase: 'kebab', // case of modifiers names 72 | ignoreValues: false // cast mod values to booleans 73 | }); // method returns BemModule 74 | ``` 75 | 76 | It is recommended to set `ignoreValues` to `true` but it is set to `false` by default to support traditional bem-syntax. 77 | 78 | ## Need to know 79 | * These directives don't affect scope or other directives. So you can use them at ease wherever you want. 80 | * You can only specify one element or block on single node. This limitation greatly simplify code of module and your app. 81 | * There is **no way** to create an element of parent block **inside** nested block. It's not a component-way. So please avoid it. 82 | 83 | ## License 84 | 85 | [MIT](http://opensource.org/licenses/MIT) © [Andrey Yamanov](http://tenphi.me) 86 | -------------------------------------------------------------------------------- /dist/README.md: -------------------------------------------------------------------------------- 1 | # angular-bem 2 | 3 | A set of directives to simplify your workflow with [BEM](https://bem.info)-markup in [Angular](https://angularjs.org) (v2+) applications. 4 | 5 | [ANGULAR 1.X VERSION IS HERE](https://github.com/tenphi/angular-bem/tree/v1) 6 | 7 | ## Changelog 8 | 9 | ### 2.1.0 10 | * Support for Angular v6+ 11 | * Refactoring 12 | 13 | ### 2.0.0 14 | * Initial release for Angular v2+ 15 | 16 | ## Install 17 | 18 | ```bash 19 | $ npm install angular-bem 20 | ``` 21 | 22 | ## Example 23 | Import this module to your app: 24 | 25 | ```javascript 26 | import { BemModule } from 'angular-bem'; 27 | 28 | @NgModule({ 29 | imports: [ BemModule ] 30 | }) 31 | export class AppModule {} 32 | ``` 33 | 34 | Now anywhere in your app you can use following syntax: 35 | 36 | ```html 37 |
38 |
39 |
40 | ``` 41 | 42 | or 43 | 44 | ```html 45 |
46 |
47 |
48 | ``` 49 | 50 | Instead of `true` you can use any property from the component. Value `true` will add mod to the block (or elem) and `false` will remove it. 51 | 52 | As a result of module's work the following markup may be produced: 53 | 54 | ```html 55 |
56 |
57 |
58 | ``` 59 | 60 | If you use `string` or `number` as a value then this value will be used as addition for the mod class like `my-block__my-element--mod-name-value`. 61 | 62 | ## Configuration 63 | 64 | You can change module behaviour with BemConfig: 65 | 66 | ```javascript 67 | import { BemModule } from 'angular-bem'; 68 | 69 | BemModule.config({ 70 | separators: ['__', '--', '-'], // el / mod / val separators 71 | modCase: 'kebab', // case of modifiers names 72 | ignoreValues: false // cast mod values to booleans 73 | }); // method returns BemModule 74 | ``` 75 | 76 | It is recommended to set `ignoreValues` to `true` but it is set to `false` by default to support traditional bem-syntax. 77 | 78 | ## Need to know 79 | * These directives don't affect scope or other directives. So you can use them at ease wherever you want. 80 | * You can only specify one element or block on single node. This limitation greatly simplify code of module and your app. 81 | * There is **no way** to create an element of parent block **inside** nested block. It's not a component-way. So please avoid it. 82 | 83 | ## License 84 | 85 | [MIT](http://opensource.org/licenses/MIT) © [Andrey Yamanov](http://tenphi.me) 86 | -------------------------------------------------------------------------------- /dist/angular-bem.metadata.json: -------------------------------------------------------------------------------- 1 | {"__symbolic":"module","version":4,"metadata":{"BemConfig":{"__symbolic":"class","members":{}},"BlockDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":95,"character":1},"arguments":[{"selector":"[block]"}]}],"members":{"mod":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":102,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Attribute","line":108,"character":15},"arguments":["block"]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":106,"character":23},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":107,"character":24},{"__symbolic":"reference","name":"string"}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"ElemDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":134,"character":1},"arguments":[{"selector":"[elem]"}]}],"members":{"mod":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":142,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Attribute","line":148,"character":15},"arguments":["elem"]}],null],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":106,"character":23},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":107,"character":24},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"BlockDirective"}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"ModDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":176,"character":1},"arguments":[{"selector":"[mod]"}]}],"members":{}},"BemModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":181,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"BlockDirective"},{"__symbolic":"reference","name":"ElemDirective"},{"__symbolic":"reference","name":"ModDirective"}],"exports":[{"__symbolic":"reference","name":"BlockDirective"},{"__symbolic":"reference","name":"ElemDirective"},{"__symbolic":"reference","name":"ModDirective"}]}]}],"members":{}}},"origins":{"BemConfig":"./bem","BlockDirective":"./bem","ElemDirective":"./bem","ModDirective":"./bem","BemModule":"./bem"},"importAs":"angular-bem"} -------------------------------------------------------------------------------- /dist/bundles/angular-bem.umd.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core")):"function"==typeof define&&define.amd?define("angular-bem",["exports","@angular/core"],t):t(e["angular-bem"]={},e.ng.core)}(this,function(e,r){"use strict";var t=function(){},i={el:"__",mod:"--",val:"-"},s=!1,a="kebab";function c(e,t,r,n){s&&(n=!!n),"string"!=typeof n&&"boolean"!=typeof n&&(n=!!n);var o=e;return t&&(o+=i.el+t),r&&(r=function(e){switch(a){case"kebab":return e?e.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()}).replace(/$\-/,""):"";case"snake":return e?e.replace(/[A-Z]/g,function(e){return"_"+e.toLowerCase()}).replace(/$\-/,""):"";default:return e}}(r),o+=i.mod+r,"boolean"!=typeof n&&null!=n&&(o+=i.val+n)),o}function o(t){if("string"==typeof t&&(t=t.split(/\s+/)),Array.isArray(t)){var e=t;t={},e.forEach(function(e){t[e]=!0})}else if("object"!=typeof t)return{};return t}function u(t,r,n,o,i,s){Object.keys(n).forEach(function(e){if(o[e]){if(n[e]===o[e])return;s.removeClass(i.nativeElement,c(t,r,e,o[e]))}n[e]&&s.addClass(i.nativeElement,c(t,r,e,n[e]))}),Object.keys(o).forEach(function(e){e in n||!o[e]||s.removeClass(i.nativeElement,c(t,r,e,o[e]))})}var n=function(){function e(e,t,r){this.name=r,this.element=e,(this.renderer=t).addClass(e.nativeElement,c(r))}return e.prototype.ngOnChanges=function(){if(JSON.stringify(this.mod)!==this._modSerialized){this._modSerialized=JSON.stringify(this.mod);var e=this.mod,t=this,r=t.renderer,n=t.element;u(t.name,"",e=o(e),this._mods||{},n,r),this._mods=this._mods===e?Object.assign({},e):e}},e.decorators=[{type:r.Directive,args:[{selector:"[block]"}]}],e.ctorParameters=function(){return[{type:r.ElementRef},{type:r.Renderer2},{type:String,decorators:[{type:r.Attribute,args:["block"]}]}]},e.propDecorators={mod:[{type:r.Input}]},e}(),d=function(){function e(e,t,r,n){this.blockName=n.name,this.name=r,this.element=e,(this.renderer=t).addClass(e.nativeElement,c(n.name,r))}return e.prototype.ngOnChanges=function(){if(JSON.stringify(this.mod)!==this._modSerialized){this._modSerialized=JSON.stringify(this.mod);var e=this.mod,t=this,r=t.renderer,n=t.element;u(t.blockName,t.name,e=o(e),this._mods||{},n,r),this._mods=this._mods===e?Object.assign({},e):e}},e.decorators=[{type:r.Directive,args:[{selector:"[elem]"}]}],e.ctorParameters=function(){return[{type:r.ElementRef},{type:r.Renderer2},{type:String,decorators:[{type:r.Attribute,args:["elem"]}]},{type:n}]},e.propDecorators={mod:[{type:r.Input}]},e}(),l=function(){function e(){}return e.decorators=[{type:r.Directive,args:[{selector:"[mod]"}]}],e}(),f=function(){function t(){}return t.config=function(e){if(!e)return t;if(e.separators&&(i.el=e.separators[0]||"__",i.mod=e.separators[1]||"--",i.val=e.separators[2]||"-"),"ignoreValues"in e&&(s=!!e.ignoreValues),e.modCase){if(!~["kebab","camel","snake"].indexOf(e.modCase))throw"Wrong mod case. You can use only these cases: kebab, snake, camel";a=e.modCase}return t},t.decorators=[{type:r.NgModule,args:[{declarations:[n,d,l],exports:[n,d,l]}]}],t}();e.BemConfig=t,e.BlockDirective=n,e.ElemDirective=d,e.ModDirective=l,e.BemModule=f,Object.defineProperty(e,"__esModule",{value:!0})}); 2 | //# sourceMappingURL=angular-bem.umd.min.js.map -------------------------------------------------------------------------------- /src/bem.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core'; 2 | 3 | export class BemConfig { 4 | separators?: Array; 5 | ignoreValues?: boolean; 6 | modCase?: string; 7 | } 8 | 9 | const separators = { 10 | el: '__', 11 | mod: '--', 12 | val: '-' 13 | }; 14 | let ignoreValues = false; 15 | let modCase = 'kebab'; 16 | 17 | function modNameHandler(str: string): string { 18 | switch (modCase) { 19 | case 'kebab': 20 | return str ? str.replace(/[A-Z]/g, function(s) {return '-' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 21 | case 'snake': 22 | return str ? str.replace(/[A-Z]/g, function(s) {return '_' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 23 | default: 24 | return str; 25 | } 26 | } 27 | 28 | function generateClass(blockName: string, elemName?: string, modName?: string, modValue?: boolean | string) { 29 | if (ignoreValues) { 30 | modValue = !!modValue; 31 | } 32 | 33 | if (typeof modValue !== 'string' && typeof modValue !== 'boolean') { 34 | modValue = !!modValue; 35 | } 36 | 37 | let cls = blockName; 38 | 39 | if (elemName) { 40 | cls += separators.el + elemName; 41 | } 42 | 43 | if (modName) { 44 | modName = modNameHandler(modName); 45 | cls += separators.mod + modName; 46 | if (typeof(modValue) !== 'boolean' && modValue != null) { 47 | cls += separators.val + modValue; 48 | } 49 | } 50 | 51 | return cls; 52 | } 53 | 54 | function parseMods(mods: string | string[] | object) { 55 | if (typeof mods === 'string') { 56 | mods = mods.split(/\s+/); 57 | } 58 | 59 | if (Array.isArray(mods)) { 60 | let arr = mods; 61 | 62 | mods = {}; 63 | 64 | arr.forEach(key => { 65 | mods[key] = true; 66 | }); 67 | } else if (typeof mods !== 'object') { 68 | return {}; 69 | } 70 | 71 | return mods; 72 | } 73 | 74 | function setMods(blockName: string, elemName: string, mods: object, oldMods: object, element: ElementRef, renderer: Renderer2) { 75 | Object.keys(mods).forEach(key => { 76 | if (oldMods[key]) { 77 | if (mods[key] === oldMods[key]) { 78 | return; 79 | } 80 | 81 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 82 | } 83 | 84 | if (mods[key]) { 85 | renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key])); 86 | } 87 | }); 88 | 89 | Object.keys(oldMods).forEach(key => { 90 | if (!(key in mods) && oldMods[key]) { 91 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 92 | } 93 | }); 94 | } 95 | 96 | @Directive({ 97 | selector: '[block]', 98 | }) 99 | export class BlockDirective { 100 | public element: ElementRef; 101 | public renderer: Renderer2; 102 | public name: string; 103 | @Input() public mod: string | string[] | object; 104 | private _mods: Object; 105 | private _modSerialized: string; 106 | 107 | constructor(element: ElementRef, 108 | renderer: Renderer2, 109 | @Attribute('block') name: string) { 110 | 111 | this.name = name; 112 | this.element = element; 113 | this.renderer = renderer; 114 | 115 | renderer.addClass(element.nativeElement, generateClass(name)); 116 | } 117 | 118 | ngOnChanges() { 119 | if (JSON.stringify(this.mod) !== this._modSerialized) { 120 | this._modSerialized = JSON.stringify(this.mod); 121 | 122 | let mods = this.mod; 123 | 124 | let {renderer, element, name} = this; 125 | 126 | mods = parseMods(mods); 127 | 128 | setMods(name, '', mods, this._mods || {}, element, renderer); 129 | 130 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 131 | } 132 | } 133 | } 134 | 135 | @Directive({ 136 | selector: '[elem]', 137 | }) 138 | export class ElemDirective { 139 | public element: ElementRef; 140 | public renderer: Renderer2; 141 | public blockName: string; 142 | public name: string; 143 | @Input() public mod: string | string[] | object; 144 | private _mods: Object; 145 | private _modSerialized: string; 146 | 147 | constructor(element: ElementRef, 148 | renderer: Renderer2, 149 | @Attribute('elem') name: string, 150 | block: BlockDirective) { 151 | 152 | this.blockName = block.name; 153 | this.name = name; 154 | this.element = element; 155 | this.renderer = renderer; 156 | 157 | renderer.addClass(element.nativeElement, generateClass(block.name, name)); 158 | } 159 | 160 | ngOnChanges() { 161 | if (JSON.stringify(this.mod) !== this._modSerialized) { 162 | this._modSerialized = JSON.stringify(this.mod); 163 | 164 | let mods = this.mod; 165 | 166 | let {renderer, element, blockName, name} = this; 167 | 168 | mods = parseMods(mods); 169 | 170 | setMods(blockName, name, mods, this._mods || {}, element, renderer); 171 | 172 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 173 | } 174 | } 175 | } 176 | 177 | @Directive({ 178 | selector: '[mod]', 179 | }) 180 | export class ModDirective {} 181 | 182 | @NgModule({ 183 | declarations: [ 184 | BlockDirective, 185 | ElemDirective, 186 | ModDirective, 187 | ], 188 | exports: [ 189 | BlockDirective, 190 | ElemDirective, 191 | ModDirective, 192 | ] 193 | }) 194 | export class BemModule { 195 | static config(data: BemConfig) { 196 | if (!data) { 197 | return BemModule; 198 | } 199 | 200 | if (data.separators) { 201 | separators.el = data.separators[0] || '__'; 202 | separators.mod = data.separators[1] || '--'; 203 | separators.val = data.separators[2] || '-'; 204 | } 205 | 206 | if ('ignoreValues' in data) { 207 | ignoreValues = !!data.ignoreValues; 208 | } 209 | 210 | if (data.modCase) { 211 | if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) { 212 | throw 'Wrong mod case. You can use only these cases: kebab, snake, camel'; 213 | } 214 | 215 | modCase = data.modCase; 216 | } 217 | 218 | return BemModule; 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /dist/bundles/angular-bem.umd.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["ng://angular-bem/bem.ts"],"names":["BemConfig","separators","el","mod","val","ignoreValues","modCase","generateClass","blockName","elemName","modName","modValue","cls","str","replace","s","toLowerCase","modNameHandler","parseMods","mods","split","Array","isArray","arr","forEach","key","setMods","oldMods","element","renderer","Object","keys","removeClass","nativeElement","addClass","BlockDirective","name","this","prototype","ngOnChanges","JSON","stringify","_modSerialized","_a","_mods","assign","Directive","args","selector","ElementRef","Renderer2","Attribute","Input","ElemDirective","block","BemModule","config","data","indexOf","NgModule","declarations","ModDirective","exports"],"mappings":"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","sourcesContent":["import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core';\n\nexport class BemConfig {\n separators?: Array;\n ignoreValues?: boolean;\n modCase?: string;\n}\n\nconst separators = {\n el: '__',\n mod: '--',\n val: '-'\n};\nlet ignoreValues = false;\nlet modCase = 'kebab';\n\nfunction modNameHandler(str: string): string {\n switch (modCase) {\n case 'kebab':\n return str ? str.replace(/[A-Z]/g, function(s) {return '-' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n case 'snake':\n return str ? str.replace(/[A-Z]/g, function(s) {return '_' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n default:\n return str;\n }\n}\n\nfunction generateClass(blockName: string, elemName?: string, modName?: string, modValue?: boolean | string) {\n if (ignoreValues) {\n modValue = !!modValue;\n }\n\n if (typeof modValue !== 'string' && typeof modValue !== 'boolean') {\n modValue = !!modValue;\n }\n\n let cls = blockName;\n\n if (elemName) {\n cls += separators.el + elemName;\n }\n\n if (modName) {\n modName = modNameHandler(modName);\n cls += separators.mod + modName;\n if (typeof(modValue) !== 'boolean' && modValue != null) {\n cls += separators.val + modValue;\n }\n }\n\n return cls;\n}\n\nfunction parseMods(mods: string | string[] | object) {\n if (typeof mods === 'string') {\n mods = mods.split(/\\s+/);\n }\n\n if (Array.isArray(mods)) {\n let arr = mods;\n\n mods = {};\n\n arr.forEach(key => {\n mods[key] = true;\n });\n } else if (typeof mods !== 'object') {\n return {};\n }\n\n return mods;\n}\n\nfunction setMods(blockName: string, elemName: string, mods: object, oldMods: object, element: ElementRef, renderer: Renderer2) {\n Object.keys(mods).forEach(key => {\n if (oldMods[key]) {\n if (mods[key] === oldMods[key]) {\n return;\n }\n\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n\n if (mods[key]) {\n renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key]));\n }\n });\n\n Object.keys(oldMods).forEach(key => {\n if (!(key in mods) && oldMods[key]) {\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n });\n}\n\n@Directive({\n selector: '[block]',\n})\nexport class BlockDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('block') name: string) {\n\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, name} = this;\n\n mods = parseMods(mods);\n\n setMods(name, '', mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[elem]',\n})\nexport class ElemDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public blockName: string;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('elem') name: string,\n block: BlockDirective) {\n\n this.blockName = block.name;\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(block.name, name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, blockName, name} = this;\n\n mods = parseMods(mods);\n\n setMods(blockName, name, mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[mod]',\n})\nexport class ModDirective {}\n\n@NgModule({\n declarations: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n exports: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ]\n})\nexport class BemModule {\n static config(data: BemConfig) {\n if (!data) {\n return BemModule;\n }\n\n if (data.separators) {\n separators.el = data.separators[0] || '__';\n separators.mod = data.separators[1] || '--';\n separators.val = data.separators[2] || '-';\n }\n\n if ('ignoreValues' in data) {\n ignoreValues = !!data.ignoreValues;\n }\n\n if (data.modCase) {\n if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) {\n throw 'Wrong mod case. You can use only these cases: kebab, snake, camel';\n }\n\n modCase = data.modCase;\n }\n\n return BemModule;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/fesm2015/angular-bem.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"angular-bem.js.map","sources":["ng://angular-bem/bem.ts"],"sourcesContent":["import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core';\n\nexport class BemConfig {\n separators?: Array;\n ignoreValues?: boolean;\n modCase?: string;\n}\n\nconst separators = {\n el: '__',\n mod: '--',\n val: '-'\n};\nlet ignoreValues = false;\nlet modCase = 'kebab';\n\nfunction modNameHandler(str: string): string {\n switch (modCase) {\n case 'kebab':\n return str ? str.replace(/[A-Z]/g, function(s) {return '-' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n case 'snake':\n return str ? str.replace(/[A-Z]/g, function(s) {return '_' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n default:\n return str;\n }\n}\n\nfunction generateClass(blockName: string, elemName?: string, modName?: string, modValue?: boolean | string) {\n if (ignoreValues) {\n modValue = !!modValue;\n }\n\n if (typeof modValue !== 'string' && typeof modValue !== 'boolean') {\n modValue = !!modValue;\n }\n\n let cls = blockName;\n\n if (elemName) {\n cls += separators.el + elemName;\n }\n\n if (modName) {\n modName = modNameHandler(modName);\n cls += separators.mod + modName;\n if (typeof(modValue) !== 'boolean' && modValue != null) {\n cls += separators.val + modValue;\n }\n }\n\n return cls;\n}\n\nfunction parseMods(mods: string | string[] | object) {\n if (typeof mods === 'string') {\n mods = mods.split(/\\s+/);\n }\n\n if (Array.isArray(mods)) {\n let arr = mods;\n\n mods = {};\n\n arr.forEach(key => {\n mods[key] = true;\n });\n } else if (typeof mods !== 'object') {\n return {};\n }\n\n return mods;\n}\n\nfunction setMods(blockName: string, elemName: string, mods: object, oldMods: object, element: ElementRef, renderer: Renderer2) {\n Object.keys(mods).forEach(key => {\n if (oldMods[key]) {\n if (mods[key] === oldMods[key]) {\n return;\n }\n\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n\n if (mods[key]) {\n renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key]));\n }\n });\n\n Object.keys(oldMods).forEach(key => {\n if (!(key in mods) && oldMods[key]) {\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n });\n}\n\n@Directive({\n selector: '[block]',\n})\nexport class BlockDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('block') name: string) {\n\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, name} = this;\n\n mods = parseMods(mods);\n\n setMods(name, '', mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[elem]',\n})\nexport class ElemDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public blockName: string;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('elem') name: string,\n block: BlockDirective) {\n\n this.blockName = block.name;\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(block.name, name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, blockName, name} = this;\n\n mods = parseMods(mods);\n\n setMods(blockName, name, mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[mod]',\n})\nexport class ModDirective {}\n\n@NgModule({\n declarations: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n exports: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ]\n})\nexport class BemModule {\n static config(data: BemConfig) {\n if (!data) {\n return BemModule;\n }\n\n if (data.separators) {\n separators.el = data.separators[0] || '__';\n separators.mod = data.separators[1] || '--';\n separators.val = data.separators[2] || '-';\n }\n\n if ('ignoreValues' in data) {\n ignoreValues = !!data.ignoreValues;\n }\n\n if (data.modCase) {\n if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) {\n throw 'Wrong mod case. You can use only these cases: kebab, snake, camel';\n }\n\n modCase = data.modCase;\n }\n\n return BemModule;\n }\n}\n"],"names":[],"mappings":"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"} 2 | -------------------------------------------------------------------------------- /dist/fesm5/angular-bem.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"angular-bem.js.map","sources":["ng://angular-bem/bem.ts"],"sourcesContent":["import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core';\n\nexport class BemConfig {\n separators?: Array;\n ignoreValues?: boolean;\n modCase?: string;\n}\n\nconst separators = {\n el: '__',\n mod: '--',\n val: '-'\n};\nlet ignoreValues = false;\nlet modCase = 'kebab';\n\nfunction modNameHandler(str: string): string {\n switch (modCase) {\n case 'kebab':\n return str ? str.replace(/[A-Z]/g, function(s) {return '-' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n case 'snake':\n return str ? str.replace(/[A-Z]/g, function(s) {return '_' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n default:\n return str;\n }\n}\n\nfunction generateClass(blockName: string, elemName?: string, modName?: string, modValue?: boolean | string) {\n if (ignoreValues) {\n modValue = !!modValue;\n }\n\n if (typeof modValue !== 'string' && typeof modValue !== 'boolean') {\n modValue = !!modValue;\n }\n\n let cls = blockName;\n\n if (elemName) {\n cls += separators.el + elemName;\n }\n\n if (modName) {\n modName = modNameHandler(modName);\n cls += separators.mod + modName;\n if (typeof(modValue) !== 'boolean' && modValue != null) {\n cls += separators.val + modValue;\n }\n }\n\n return cls;\n}\n\nfunction parseMods(mods: string | string[] | object) {\n if (typeof mods === 'string') {\n mods = mods.split(/\\s+/);\n }\n\n if (Array.isArray(mods)) {\n let arr = mods;\n\n mods = {};\n\n arr.forEach(key => {\n mods[key] = true;\n });\n } else if (typeof mods !== 'object') {\n return {};\n }\n\n return mods;\n}\n\nfunction setMods(blockName: string, elemName: string, mods: object, oldMods: object, element: ElementRef, renderer: Renderer2) {\n Object.keys(mods).forEach(key => {\n if (oldMods[key]) {\n if (mods[key] === oldMods[key]) {\n return;\n }\n\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n\n if (mods[key]) {\n renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key]));\n }\n });\n\n Object.keys(oldMods).forEach(key => {\n if (!(key in mods) && oldMods[key]) {\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n });\n}\n\n@Directive({\n selector: '[block]',\n})\nexport class BlockDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('block') name: string) {\n\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, name} = this;\n\n mods = parseMods(mods);\n\n setMods(name, '', mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[elem]',\n})\nexport class ElemDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public blockName: string;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('elem') name: string,\n block: BlockDirective) {\n\n this.blockName = block.name;\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(block.name, name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, blockName, name} = this;\n\n mods = parseMods(mods);\n\n setMods(blockName, name, mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[mod]',\n})\nexport class ModDirective {}\n\n@NgModule({\n declarations: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n exports: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ]\n})\nexport class BemModule {\n static config(data: BemConfig) {\n if (!data) {\n return BemModule;\n }\n\n if (data.separators) {\n separators.el = data.separators[0] || '__';\n separators.mod = data.separators[1] || '--';\n separators.val = data.separators[2] || '-';\n }\n\n if ('ignoreValues' in data) {\n ignoreValues = !!data.ignoreValues;\n }\n\n if (data.modCase) {\n if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) {\n throw 'Wrong mod case. You can use only these cases: kebab, snake, camel';\n }\n\n modCase = data.modCase;\n }\n\n return BemModule;\n }\n}\n"],"names":[],"mappings":";;;;;;AAAA,IAEA;;;oBAFA;IAMC,CAAA;AAJD,AAMA,qBAAM,UAAU,GAAG;IACjB,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,GAAG;CACT,CAAC;AACF,qBAAI,YAAY,GAAG,KAAK,CAAC;AACzB,qBAAI,OAAO,GAAG,OAAO,CAAC;;;;;AAEtB,wBAAwB,GAAW;IACjC,QAAQ,OAAO;QACb,KAAK,OAAO;YACV,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAS,CAAC,IAAG,OAAO,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;QAC3G,KAAK,OAAO;YACV,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAS,CAAC,IAAG,OAAO,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;QAC3G;YACE,OAAO,GAAG,CAAC;KACd;CACF;;;;;;;;AAED,uBAAuB,SAAiB,EAAE,QAAiB,EAAE,OAAgB,EAAE,QAA2B;IACxG,IAAI,YAAY,EAAE;QAChB,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;KACvB;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE;QACjE,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;KACvB;IAED,qBAAI,GAAG,GAAG,SAAS,CAAC;IAEpB,IAAI,QAAQ,EAAE;QACZ,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,QAAQ,CAAC;KACjC;IAED,IAAI,OAAO,EAAE;QACX,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAClC,GAAG,IAAI,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC;QAChC,IAAI,QAAO,QAAQ,CAAC,KAAK,SAAS,IAAI,QAAQ,IAAI,IAAI,EAAE;YACtD,GAAG,IAAI,UAAU,CAAC,GAAG,GAAG,QAAQ,CAAC;SAClC;KACF;IAED,OAAO,GAAG,CAAC;CACZ;;;;;AAED,mBAAmB,IAAgC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KAC1B;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,qBAAI,GAAG,GAAG,IAAI,CAAC;QAEf,IAAI,GAAG,EAAE,CAAC;QAEV,GAAG,CAAC,OAAO,CAAC,UAAA,GAAG;YACb,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;SAClB,CAAC,CAAC;KACJ;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,OAAO,EAAE,CAAC;KACX;IAED,OAAO,IAAI,CAAC;CACb;;;;;;;;;;AAED,iBAAiB,SAAiB,EAAE,QAAgB,EAAE,IAAY,EAAE,OAAe,EAAE,OAAmB,EAAE,QAAmB;IAC3H,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;QAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;YAChB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC9B,OAAO;aACR;YAED,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACpG;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;YACb,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9F;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;QAC9B,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;YAClC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACpG;KACF,CAAC,CAAC;CACJ;;IAaC,wBAAY,OAAmB,EACnB,QAAmB,EACC,IAAY;QAE1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;KAC/D;;;;IAED,oCAAW;;;IAAX;QACE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,cAAc,EAAE;YACpD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE/C,qBAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;YAEpB,eAAK,sBAAQ,EAAE,oBAAO,EAAE,gBAAI,CAAS;YAErC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvB,OAAO,CAAC,MAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE7D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;SACnE;KACF;;gBApCF,SAAS,SAAC;oBACT,QAAQ,EAAE,SAAS;iBACpB;;;;gBAjG0D,UAAU;gBAA5B,SAAS;6CA4GnC,SAAS,SAAC,OAAO;;;sBAN7B,KAAK;;yBAtGR;;;IAkJE,uBAAY,OAAmB,EACnB,QAAmB,EACA,IAAY,EAC/B,KAAqB;QAE/B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;KAC3E;;;;IAED,mCAAW;;;IAAX;QACE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,cAAc,EAAE;YACpD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE/C,qBAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;YAEpB,eAAK,sBAAQ,EAAE,oBAAO,EAAE,wBAAS,EAAE,gBAAI,CAAS;YAEhD,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvB,OAAO,CAAC,SAAS,EAAE,MAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEpE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;SACnE;KACF;;gBAvCF,SAAS,SAAC;oBACT,QAAQ,EAAE,QAAQ;iBACnB;;;;gBAxI0D,UAAU;gBAA5B,SAAS;6CAoJnC,SAAS,SAAC,MAAM;gBACV,cAAc;;;sBAPhC,KAAK;;wBA9IR;;;;;;gBAgLC,SAAS,SAAC;oBACT,QAAQ,EAAE,OAAO;iBAClB;;uBAlLD;;;;;;;;;IAkMS,gBAAM;;;;IAAb,UAAc,IAAe;QAC3B,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAC3C,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAC5C,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;SAC5C;QAED,IAAI,cAAc,IAAI,IAAI,EAAE;YAC1B,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;SACpC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBACvD,MAAM,mEAAmE,CAAC;aAC3E;YAED,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;SACxB;QAED,OAAO,SAAS,CAAC;KAClB;;gBArCF,QAAQ,SAAC;oBACR,YAAY,EAAE;wBACZ,cAAc;wBACd,aAAa;wBACb,YAAY;qBACb;oBACD,OAAO,EAAE;wBACP,cAAc;wBACd,aAAa;wBACb,YAAY;qBACb;iBACF;;oBAhMD;;;;;;;;;;"} 2 | -------------------------------------------------------------------------------- /dist/bundles/angular-bem.umd.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"angular-bem.umd.js.map","sources":["ng://angular-bem/bem.ts"],"sourcesContent":["import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core';\n\nexport class BemConfig {\n separators?: Array;\n ignoreValues?: boolean;\n modCase?: string;\n}\n\nconst separators = {\n el: '__',\n mod: '--',\n val: '-'\n};\nlet ignoreValues = false;\nlet modCase = 'kebab';\n\nfunction modNameHandler(str: string): string {\n switch (modCase) {\n case 'kebab':\n return str ? str.replace(/[A-Z]/g, function(s) {return '-' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n case 'snake':\n return str ? str.replace(/[A-Z]/g, function(s) {return '_' + s.toLowerCase(); }).replace(/$\\-/, '') : '';\n default:\n return str;\n }\n}\n\nfunction generateClass(blockName: string, elemName?: string, modName?: string, modValue?: boolean | string) {\n if (ignoreValues) {\n modValue = !!modValue;\n }\n\n if (typeof modValue !== 'string' && typeof modValue !== 'boolean') {\n modValue = !!modValue;\n }\n\n let cls = blockName;\n\n if (elemName) {\n cls += separators.el + elemName;\n }\n\n if (modName) {\n modName = modNameHandler(modName);\n cls += separators.mod + modName;\n if (typeof(modValue) !== 'boolean' && modValue != null) {\n cls += separators.val + modValue;\n }\n }\n\n return cls;\n}\n\nfunction parseMods(mods: string | string[] | object) {\n if (typeof mods === 'string') {\n mods = mods.split(/\\s+/);\n }\n\n if (Array.isArray(mods)) {\n let arr = mods;\n\n mods = {};\n\n arr.forEach(key => {\n mods[key] = true;\n });\n } else if (typeof mods !== 'object') {\n return {};\n }\n\n return mods;\n}\n\nfunction setMods(blockName: string, elemName: string, mods: object, oldMods: object, element: ElementRef, renderer: Renderer2) {\n Object.keys(mods).forEach(key => {\n if (oldMods[key]) {\n if (mods[key] === oldMods[key]) {\n return;\n }\n\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n\n if (mods[key]) {\n renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key]));\n }\n });\n\n Object.keys(oldMods).forEach(key => {\n if (!(key in mods) && oldMods[key]) {\n renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key]));\n }\n });\n}\n\n@Directive({\n selector: '[block]',\n})\nexport class BlockDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('block') name: string) {\n\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, name} = this;\n\n mods = parseMods(mods);\n\n setMods(name, '', mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[elem]',\n})\nexport class ElemDirective {\n public element: ElementRef;\n public renderer: Renderer2;\n public blockName: string;\n public name: string;\n @Input() public mod: string | string[] | object;\n private _mods: Object;\n private _modSerialized: string;\n\n constructor(element: ElementRef,\n renderer: Renderer2,\n @Attribute('elem') name: string,\n block: BlockDirective) {\n\n this.blockName = block.name;\n this.name = name;\n this.element = element;\n this.renderer = renderer;\n\n renderer.addClass(element.nativeElement, generateClass(block.name, name));\n }\n\n ngOnChanges() {\n if (JSON.stringify(this.mod) !== this._modSerialized) {\n this._modSerialized = JSON.stringify(this.mod);\n\n let mods = this.mod;\n\n let {renderer, element, blockName, name} = this;\n\n mods = parseMods(mods);\n\n setMods(blockName, name, mods, this._mods || {}, element, renderer);\n\n this._mods = this._mods === mods ? Object.assign({}, mods) : mods;\n }\n }\n}\n\n@Directive({\n selector: '[mod]',\n})\nexport class ModDirective {}\n\n@NgModule({\n declarations: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n exports: [\n BlockDirective,\n ElemDirective,\n ModDirective,\n ]\n})\nexport class BemModule {\n static config(data: BemConfig) {\n if (!data) {\n return BemModule;\n }\n\n if (data.separators) {\n separators.el = data.separators[0] || '__';\n separators.mod = data.separators[1] || '--';\n separators.val = data.separators[2] || '-';\n }\n\n if ('ignoreValues' in data) {\n ignoreValues = !!data.ignoreValues;\n }\n\n if (data.modCase) {\n if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) {\n throw 'Wrong mod case. You can use only these cases: kebab, snake, camel';\n }\n\n modCase = data.modCase;\n }\n\n return BemModule;\n }\n}\n"],"names":["Directive","ElementRef","Renderer2","Attribute","Input","NgModule"],"mappings":"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"} 2 | -------------------------------------------------------------------------------- /dist/fesm2015/angular-bem.js: -------------------------------------------------------------------------------- 1 | import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core'; 2 | 3 | /** 4 | * @fileoverview added by tsickle 5 | * @suppress {checkTypes} checked by tsc 6 | */ 7 | class BemConfig { 8 | } 9 | const /** @type {?} */ separators = { 10 | el: '__', 11 | mod: '--', 12 | val: '-' 13 | }; 14 | let /** @type {?} */ ignoreValues = false; 15 | let /** @type {?} */ modCase = 'kebab'; 16 | /** 17 | * @param {?} str 18 | * @return {?} 19 | */ 20 | function modNameHandler(str) { 21 | switch (modCase) { 22 | case 'kebab': 23 | return str ? str.replace(/[A-Z]/g, function (s) { return '-' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 24 | case 'snake': 25 | return str ? str.replace(/[A-Z]/g, function (s) { return '_' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 26 | default: 27 | return str; 28 | } 29 | } 30 | /** 31 | * @param {?} blockName 32 | * @param {?=} elemName 33 | * @param {?=} modName 34 | * @param {?=} modValue 35 | * @return {?} 36 | */ 37 | function generateClass(blockName, elemName, modName, modValue) { 38 | if (ignoreValues) { 39 | modValue = !!modValue; 40 | } 41 | if (typeof modValue !== 'string' && typeof modValue !== 'boolean') { 42 | modValue = !!modValue; 43 | } 44 | let /** @type {?} */ cls = blockName; 45 | if (elemName) { 46 | cls += separators.el + elemName; 47 | } 48 | if (modName) { 49 | modName = modNameHandler(modName); 50 | cls += separators.mod + modName; 51 | if (typeof (modValue) !== 'boolean' && modValue != null) { 52 | cls += separators.val + modValue; 53 | } 54 | } 55 | return cls; 56 | } 57 | /** 58 | * @param {?} mods 59 | * @return {?} 60 | */ 61 | function parseMods(mods) { 62 | if (typeof mods === 'string') { 63 | mods = mods.split(/\s+/); 64 | } 65 | if (Array.isArray(mods)) { 66 | let /** @type {?} */ arr = mods; 67 | mods = {}; 68 | arr.forEach(key => { 69 | mods[key] = true; 70 | }); 71 | } 72 | else if (typeof mods !== 'object') { 73 | return {}; 74 | } 75 | return mods; 76 | } 77 | /** 78 | * @param {?} blockName 79 | * @param {?} elemName 80 | * @param {?} mods 81 | * @param {?} oldMods 82 | * @param {?} element 83 | * @param {?} renderer 84 | * @return {?} 85 | */ 86 | function setMods(blockName, elemName, mods, oldMods, element, renderer) { 87 | Object.keys(mods).forEach(key => { 88 | if (oldMods[key]) { 89 | if (mods[key] === oldMods[key]) { 90 | return; 91 | } 92 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 93 | } 94 | if (mods[key]) { 95 | renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key])); 96 | } 97 | }); 98 | Object.keys(oldMods).forEach(key => { 99 | if (!(key in mods) && oldMods[key]) { 100 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 101 | } 102 | }); 103 | } 104 | class BlockDirective { 105 | /** 106 | * @param {?} element 107 | * @param {?} renderer 108 | * @param {?} name 109 | */ 110 | constructor(element, renderer, name) { 111 | this.name = name; 112 | this.element = element; 113 | this.renderer = renderer; 114 | renderer.addClass(element.nativeElement, generateClass(name)); 115 | } 116 | /** 117 | * @return {?} 118 | */ 119 | ngOnChanges() { 120 | if (JSON.stringify(this.mod) !== this._modSerialized) { 121 | this._modSerialized = JSON.stringify(this.mod); 122 | let /** @type {?} */ mods = this.mod; 123 | let { renderer, element, name } = this; 124 | mods = parseMods(mods); 125 | setMods(name, '', mods, this._mods || {}, element, renderer); 126 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 127 | } 128 | } 129 | } 130 | BlockDirective.decorators = [ 131 | { type: Directive, args: [{ 132 | selector: '[block]', 133 | },] }, 134 | ]; 135 | /** @nocollapse */ 136 | BlockDirective.ctorParameters = () => [ 137 | { type: ElementRef }, 138 | { type: Renderer2 }, 139 | { type: String, decorators: [{ type: Attribute, args: ['block',] }] } 140 | ]; 141 | BlockDirective.propDecorators = { 142 | mod: [{ type: Input }] 143 | }; 144 | class ElemDirective { 145 | /** 146 | * @param {?} element 147 | * @param {?} renderer 148 | * @param {?} name 149 | * @param {?} block 150 | */ 151 | constructor(element, renderer, name, block) { 152 | this.blockName = block.name; 153 | this.name = name; 154 | this.element = element; 155 | this.renderer = renderer; 156 | renderer.addClass(element.nativeElement, generateClass(block.name, name)); 157 | } 158 | /** 159 | * @return {?} 160 | */ 161 | ngOnChanges() { 162 | if (JSON.stringify(this.mod) !== this._modSerialized) { 163 | this._modSerialized = JSON.stringify(this.mod); 164 | let /** @type {?} */ mods = this.mod; 165 | let { renderer, element, blockName, name } = this; 166 | mods = parseMods(mods); 167 | setMods(blockName, name, mods, this._mods || {}, element, renderer); 168 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 169 | } 170 | } 171 | } 172 | ElemDirective.decorators = [ 173 | { type: Directive, args: [{ 174 | selector: '[elem]', 175 | },] }, 176 | ]; 177 | /** @nocollapse */ 178 | ElemDirective.ctorParameters = () => [ 179 | { type: ElementRef }, 180 | { type: Renderer2 }, 181 | { type: String, decorators: [{ type: Attribute, args: ['elem',] }] }, 182 | { type: BlockDirective } 183 | ]; 184 | ElemDirective.propDecorators = { 185 | mod: [{ type: Input }] 186 | }; 187 | class ModDirective { 188 | } 189 | ModDirective.decorators = [ 190 | { type: Directive, args: [{ 191 | selector: '[mod]', 192 | },] }, 193 | ]; 194 | class BemModule { 195 | /** 196 | * @param {?} data 197 | * @return {?} 198 | */ 199 | static config(data) { 200 | if (!data) { 201 | return BemModule; 202 | } 203 | if (data.separators) { 204 | separators.el = data.separators[0] || '__'; 205 | separators.mod = data.separators[1] || '--'; 206 | separators.val = data.separators[2] || '-'; 207 | } 208 | if ('ignoreValues' in data) { 209 | ignoreValues = !!data.ignoreValues; 210 | } 211 | if (data.modCase) { 212 | if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) { 213 | throw 'Wrong mod case. You can use only these cases: kebab, snake, camel'; 214 | } 215 | modCase = data.modCase; 216 | } 217 | return BemModule; 218 | } 219 | } 220 | BemModule.decorators = [ 221 | { type: NgModule, args: [{ 222 | declarations: [ 223 | BlockDirective, 224 | ElemDirective, 225 | ModDirective, 226 | ], 227 | exports: [ 228 | BlockDirective, 229 | ElemDirective, 230 | ModDirective, 231 | ] 232 | },] }, 233 | ]; 234 | 235 | /** 236 | * @fileoverview added by tsickle 237 | * @suppress {checkTypes} checked by tsc 238 | */ 239 | 240 | export { BemConfig, BlockDirective, ElemDirective, ModDirective, BemModule }; 241 | 242 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1iZW0uanMubWFwIiwic291cmNlcyI6WyJuZzovL2FuZ3VsYXItYmVtL2JlbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgRGlyZWN0aXZlLCBBdHRyaWJ1dGUsIFJlbmRlcmVyMiwgSW5wdXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEJlbUNvbmZpZyB7XG4gIHNlcGFyYXRvcnM/OiBBcnJheTxzdHJpbmc+O1xuICBpZ25vcmVWYWx1ZXM/OiBib29sZWFuO1xuICBtb2RDYXNlPzogc3RyaW5nO1xufVxuXG5jb25zdCBzZXBhcmF0b3JzID0ge1xuICBlbDogJ19fJyxcbiAgbW9kOiAnLS0nLFxuICB2YWw6ICctJ1xufTtcbmxldCBpZ25vcmVWYWx1ZXMgPSBmYWxzZTtcbmxldCBtb2RDYXNlID0gJ2tlYmFiJztcblxuZnVuY3Rpb24gbW9kTmFtZUhhbmRsZXIoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKG1vZENhc2UpIHtcbiAgICBjYXNlICdrZWJhYic6XG4gICAgICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uKHMpIHtyZXR1cm4gJy0nICsgcy50b0xvd2VyQ2FzZSgpOyB9KS5yZXBsYWNlKC8kXFwtLywgJycpIDogJyc7XG4gICAgY2FzZSAnc25ha2UnOlxuICAgICAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuICdfJyArIHMudG9Mb3dlckNhc2UoKTsgfSkucmVwbGFjZSgvJFxcLS8sICcnKSA6ICcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lOiBzdHJpbmcsIGVsZW1OYW1lPzogc3RyaW5nLCBtb2ROYW1lPzogc3RyaW5nLCBtb2RWYWx1ZT86IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgaWYgKGlnbm9yZVZhbHVlcykge1xuICAgIG1vZFZhbHVlID0gISFtb2RWYWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kVmFsdWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBtb2RWYWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgbW9kVmFsdWUgPSAhIW1vZFZhbHVlO1xuICB9XG5cbiAgbGV0IGNscyA9IGJsb2NrTmFtZTtcblxuICBpZiAoZWxlbU5hbWUpIHtcbiAgICBjbHMgKz0gc2VwYXJhdG9ycy5lbCArIGVsZW1OYW1lO1xuICB9XG5cbiAgaWYgKG1vZE5hbWUpIHtcbiAgICBtb2ROYW1lID0gbW9kTmFtZUhhbmRsZXIobW9kTmFtZSk7XG4gICAgY2xzICs9IHNlcGFyYXRvcnMubW9kICsgbW9kTmFtZTtcbiAgICBpZiAodHlwZW9mKG1vZFZhbHVlKSAhPT0gJ2Jvb2xlYW4nICYmIG1vZFZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNscyArPSBzZXBhcmF0b3JzLnZhbCArIG1vZFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9kcyhtb2RzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG9iamVjdCkge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgbW9kcyA9IG1vZHMuc3BsaXQoL1xccysvKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgbGV0IGFyciA9IG1vZHM7XG5cbiAgICBtb2RzID0ge307XG5cbiAgICBhcnIuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgbW9kc1trZXldID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kcyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gbW9kcztcbn1cblxuZnVuY3Rpb24gc2V0TW9kcyhibG9ja05hbWU6IHN0cmluZywgZWxlbU5hbWU6IHN0cmluZywgbW9kczogb2JqZWN0LCBvbGRNb2RzOiBvYmplY3QsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgT2JqZWN0LmtleXMobW9kcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmIChvbGRNb2RzW2tleV0pIHtcbiAgICAgIGlmIChtb2RzW2tleV0gPT09IG9sZE1vZHNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG9sZE1vZHNba2V5XSkpO1xuICAgIH1cblxuICAgIGlmIChtb2RzW2tleV0pIHtcbiAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG1vZHNba2V5XSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMob2xkTW9kcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICghKGtleSBpbiBtb2RzKSAmJiBvbGRNb2RzW2tleV0pIHtcbiAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG9sZE1vZHNba2V5XSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tibG9ja10nLFxufSlcbmV4cG9ydCBjbGFzcyBCbG9ja0RpcmVjdGl2ZSB7XG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIG1vZDogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3Q7XG4gIHByaXZhdGUgX21vZHM6IE9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kU2VyaWFsaXplZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIEBBdHRyaWJ1dGUoJ2Jsb2NrJykgbmFtZTogc3RyaW5nKSB7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXG4gICAgcmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudC5uYXRpdmVFbGVtZW50LCBnZW5lcmF0ZUNsYXNzKG5hbWUpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLm1vZCkgIT09IHRoaXMuX21vZFNlcmlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX21vZFNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm1vZCk7XG5cbiAgICAgIGxldCBtb2RzID0gdGhpcy5tb2Q7XG5cbiAgICAgIGxldCB7cmVuZGVyZXIsIGVsZW1lbnQsIG5hbWV9ID0gdGhpcztcblxuICAgICAgbW9kcyA9IHBhcnNlTW9kcyhtb2RzKTtcblxuICAgICAgc2V0TW9kcyhuYW1lLCAnJywgbW9kcywgdGhpcy5fbW9kcyB8fCB7fSwgZWxlbWVudCwgcmVuZGVyZXIpO1xuXG4gICAgICB0aGlzLl9tb2RzID0gdGhpcy5fbW9kcyA9PT0gbW9kcyA/IE9iamVjdC5hc3NpZ24oe30sIG1vZHMpIDogbW9kcztcbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2VsZW1dJyxcbn0pXG5leHBvcnQgY2xhc3MgRWxlbURpcmVjdGl2ZSB7XG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHVibGljIGJsb2NrTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgbW9kOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kczogT2JqZWN0O1xuICBwcml2YXRlIF9tb2RTZXJpYWxpemVkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgQEF0dHJpYnV0ZSgnZWxlbScpIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgYmxvY2s6IEJsb2NrRGlyZWN0aXZlKSB7XG5cbiAgICB0aGlzLmJsb2NrTmFtZSA9IGJsb2NrLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9jay5uYW1lLCBuYW1lKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpICE9PSB0aGlzLl9tb2RTZXJpYWxpemVkKSB7XG4gICAgICB0aGlzLl9tb2RTZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpO1xuXG4gICAgICBsZXQgbW9kcyA9IHRoaXMubW9kO1xuXG4gICAgICBsZXQge3JlbmRlcmVyLCBlbGVtZW50LCBibG9ja05hbWUsIG5hbWV9ID0gdGhpcztcblxuICAgICAgbW9kcyA9IHBhcnNlTW9kcyhtb2RzKTtcblxuICAgICAgc2V0TW9kcyhibG9ja05hbWUsIG5hbWUsIG1vZHMsIHRoaXMuX21vZHMgfHwge30sIGVsZW1lbnQsIHJlbmRlcmVyKTtcblxuICAgICAgdGhpcy5fbW9kcyA9IHRoaXMuX21vZHMgPT09IG1vZHMgPyBPYmplY3QuYXNzaWduKHt9LCBtb2RzKSA6IG1vZHM7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttb2RdJyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kRGlyZWN0aXZlIHt9XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEJsb2NrRGlyZWN0aXZlLFxuICAgIEVsZW1EaXJlY3RpdmUsXG4gICAgTW9kRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQmxvY2tEaXJlY3RpdmUsXG4gICAgRWxlbURpcmVjdGl2ZSxcbiAgICBNb2REaXJlY3RpdmUsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQmVtTW9kdWxlIHtcbiAgc3RhdGljIGNvbmZpZyhkYXRhOiBCZW1Db25maWcpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBCZW1Nb2R1bGU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuc2VwYXJhdG9ycykge1xuICAgICAgc2VwYXJhdG9ycy5lbCA9IGRhdGEuc2VwYXJhdG9yc1swXSB8fCAnX18nO1xuICAgICAgc2VwYXJhdG9ycy5tb2QgPSBkYXRhLnNlcGFyYXRvcnNbMV0gfHwgJy0tJztcbiAgICAgIHNlcGFyYXRvcnMudmFsID0gZGF0YS5zZXBhcmF0b3JzWzJdIHx8ICctJztcbiAgICB9XG5cbiAgICBpZiAoJ2lnbm9yZVZhbHVlcycgaW4gZGF0YSkge1xuICAgICAgaWdub3JlVmFsdWVzID0gISFkYXRhLmlnbm9yZVZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5tb2RDYXNlKSB7XG4gICAgICBpZiAoIX5bJ2tlYmFiJywgJ2NhbWVsJywgJ3NuYWtlJ10uaW5kZXhPZihkYXRhLm1vZENhc2UpKSB7XG4gICAgICAgIHRocm93ICdXcm9uZyBtb2QgY2FzZS4gWW91IGNhbiB1c2Ugb25seSB0aGVzZSBjYXNlczoga2ViYWIsIHNuYWtlLCBjYW1lbCc7XG4gICAgICB9XG5cbiAgICAgIG1vZENhc2UgPSBkYXRhLm1vZENhc2U7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 -------------------------------------------------------------------------------- /dist/fesm5/angular-bem.js: -------------------------------------------------------------------------------- 1 | import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core'; 2 | 3 | /** 4 | * @fileoverview added by tsickle 5 | * @suppress {checkTypes} checked by tsc 6 | */ 7 | var BemConfig = /** @class */ (function () { 8 | function BemConfig() { 9 | } 10 | return BemConfig; 11 | }()); 12 | var /** @type {?} */ separators = { 13 | el: '__', 14 | mod: '--', 15 | val: '-' 16 | }; 17 | var /** @type {?} */ ignoreValues = false; 18 | var /** @type {?} */ modCase = 'kebab'; 19 | /** 20 | * @param {?} str 21 | * @return {?} 22 | */ 23 | function modNameHandler(str) { 24 | switch (modCase) { 25 | case 'kebab': 26 | return str ? str.replace(/[A-Z]/g, function (s) { return '-' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 27 | case 'snake': 28 | return str ? str.replace(/[A-Z]/g, function (s) { return '_' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 29 | default: 30 | return str; 31 | } 32 | } 33 | /** 34 | * @param {?} blockName 35 | * @param {?=} elemName 36 | * @param {?=} modName 37 | * @param {?=} modValue 38 | * @return {?} 39 | */ 40 | function generateClass(blockName, elemName, modName, modValue) { 41 | if (ignoreValues) { 42 | modValue = !!modValue; 43 | } 44 | if (typeof modValue !== 'string' && typeof modValue !== 'boolean') { 45 | modValue = !!modValue; 46 | } 47 | var /** @type {?} */ cls = blockName; 48 | if (elemName) { 49 | cls += separators.el + elemName; 50 | } 51 | if (modName) { 52 | modName = modNameHandler(modName); 53 | cls += separators.mod + modName; 54 | if (typeof (modValue) !== 'boolean' && modValue != null) { 55 | cls += separators.val + modValue; 56 | } 57 | } 58 | return cls; 59 | } 60 | /** 61 | * @param {?} mods 62 | * @return {?} 63 | */ 64 | function parseMods(mods) { 65 | if (typeof mods === 'string') { 66 | mods = mods.split(/\s+/); 67 | } 68 | if (Array.isArray(mods)) { 69 | var /** @type {?} */ arr = mods; 70 | mods = {}; 71 | arr.forEach(function (key) { 72 | mods[key] = true; 73 | }); 74 | } 75 | else if (typeof mods !== 'object') { 76 | return {}; 77 | } 78 | return mods; 79 | } 80 | /** 81 | * @param {?} blockName 82 | * @param {?} elemName 83 | * @param {?} mods 84 | * @param {?} oldMods 85 | * @param {?} element 86 | * @param {?} renderer 87 | * @return {?} 88 | */ 89 | function setMods(blockName, elemName, mods, oldMods, element, renderer) { 90 | Object.keys(mods).forEach(function (key) { 91 | if (oldMods[key]) { 92 | if (mods[key] === oldMods[key]) { 93 | return; 94 | } 95 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 96 | } 97 | if (mods[key]) { 98 | renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key])); 99 | } 100 | }); 101 | Object.keys(oldMods).forEach(function (key) { 102 | if (!(key in mods) && oldMods[key]) { 103 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 104 | } 105 | }); 106 | } 107 | var BlockDirective = /** @class */ (function () { 108 | function BlockDirective(element, renderer, name) { 109 | this.name = name; 110 | this.element = element; 111 | this.renderer = renderer; 112 | renderer.addClass(element.nativeElement, generateClass(name)); 113 | } 114 | /** 115 | * @return {?} 116 | */ 117 | BlockDirective.prototype.ngOnChanges = /** 118 | * @return {?} 119 | */ 120 | function () { 121 | if (JSON.stringify(this.mod) !== this._modSerialized) { 122 | this._modSerialized = JSON.stringify(this.mod); 123 | var /** @type {?} */ mods = this.mod; 124 | var _a = this, renderer = _a.renderer, element = _a.element, name_1 = _a.name; 125 | mods = parseMods(mods); 126 | setMods(name_1, '', mods, this._mods || {}, element, renderer); 127 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 128 | } 129 | }; 130 | BlockDirective.decorators = [ 131 | { type: Directive, args: [{ 132 | selector: '[block]', 133 | },] }, 134 | ]; 135 | /** @nocollapse */ 136 | BlockDirective.ctorParameters = function () { return [ 137 | { type: ElementRef }, 138 | { type: Renderer2 }, 139 | { type: String, decorators: [{ type: Attribute, args: ['block',] }] } 140 | ]; }; 141 | BlockDirective.propDecorators = { 142 | mod: [{ type: Input }] 143 | }; 144 | return BlockDirective; 145 | }()); 146 | var ElemDirective = /** @class */ (function () { 147 | function ElemDirective(element, renderer, name, block) { 148 | this.blockName = block.name; 149 | this.name = name; 150 | this.element = element; 151 | this.renderer = renderer; 152 | renderer.addClass(element.nativeElement, generateClass(block.name, name)); 153 | } 154 | /** 155 | * @return {?} 156 | */ 157 | ElemDirective.prototype.ngOnChanges = /** 158 | * @return {?} 159 | */ 160 | function () { 161 | if (JSON.stringify(this.mod) !== this._modSerialized) { 162 | this._modSerialized = JSON.stringify(this.mod); 163 | var /** @type {?} */ mods = this.mod; 164 | var _a = this, renderer = _a.renderer, element = _a.element, blockName = _a.blockName, name_2 = _a.name; 165 | mods = parseMods(mods); 166 | setMods(blockName, name_2, mods, this._mods || {}, element, renderer); 167 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 168 | } 169 | }; 170 | ElemDirective.decorators = [ 171 | { type: Directive, args: [{ 172 | selector: '[elem]', 173 | },] }, 174 | ]; 175 | /** @nocollapse */ 176 | ElemDirective.ctorParameters = function () { return [ 177 | { type: ElementRef }, 178 | { type: Renderer2 }, 179 | { type: String, decorators: [{ type: Attribute, args: ['elem',] }] }, 180 | { type: BlockDirective } 181 | ]; }; 182 | ElemDirective.propDecorators = { 183 | mod: [{ type: Input }] 184 | }; 185 | return ElemDirective; 186 | }()); 187 | var ModDirective = /** @class */ (function () { 188 | function ModDirective() { 189 | } 190 | ModDirective.decorators = [ 191 | { type: Directive, args: [{ 192 | selector: '[mod]', 193 | },] }, 194 | ]; 195 | return ModDirective; 196 | }()); 197 | var BemModule = /** @class */ (function () { 198 | function BemModule() { 199 | } 200 | /** 201 | * @param {?} data 202 | * @return {?} 203 | */ 204 | BemModule.config = /** 205 | * @param {?} data 206 | * @return {?} 207 | */ 208 | function (data) { 209 | if (!data) { 210 | return BemModule; 211 | } 212 | if (data.separators) { 213 | separators.el = data.separators[0] || '__'; 214 | separators.mod = data.separators[1] || '--'; 215 | separators.val = data.separators[2] || '-'; 216 | } 217 | if ('ignoreValues' in data) { 218 | ignoreValues = !!data.ignoreValues; 219 | } 220 | if (data.modCase) { 221 | if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) { 222 | throw 'Wrong mod case. You can use only these cases: kebab, snake, camel'; 223 | } 224 | modCase = data.modCase; 225 | } 226 | return BemModule; 227 | }; 228 | BemModule.decorators = [ 229 | { type: NgModule, args: [{ 230 | declarations: [ 231 | BlockDirective, 232 | ElemDirective, 233 | ModDirective, 234 | ], 235 | exports: [ 236 | BlockDirective, 237 | ElemDirective, 238 | ModDirective, 239 | ] 240 | },] }, 241 | ]; 242 | return BemModule; 243 | }()); 244 | 245 | /** 246 | * @fileoverview added by tsickle 247 | * @suppress {checkTypes} checked by tsc 248 | */ 249 | 250 | export { BemConfig, BlockDirective, ElemDirective, ModDirective, BemModule }; 251 | 252 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1iZW0uanMubWFwIiwic291cmNlcyI6WyJuZzovL2FuZ3VsYXItYmVtL2JlbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgRGlyZWN0aXZlLCBBdHRyaWJ1dGUsIFJlbmRlcmVyMiwgSW5wdXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEJlbUNvbmZpZyB7XG4gIHNlcGFyYXRvcnM/OiBBcnJheTxzdHJpbmc+O1xuICBpZ25vcmVWYWx1ZXM/OiBib29sZWFuO1xuICBtb2RDYXNlPzogc3RyaW5nO1xufVxuXG5jb25zdCBzZXBhcmF0b3JzID0ge1xuICBlbDogJ19fJyxcbiAgbW9kOiAnLS0nLFxuICB2YWw6ICctJ1xufTtcbmxldCBpZ25vcmVWYWx1ZXMgPSBmYWxzZTtcbmxldCBtb2RDYXNlID0gJ2tlYmFiJztcblxuZnVuY3Rpb24gbW9kTmFtZUhhbmRsZXIoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKG1vZENhc2UpIHtcbiAgICBjYXNlICdrZWJhYic6XG4gICAgICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uKHMpIHtyZXR1cm4gJy0nICsgcy50b0xvd2VyQ2FzZSgpOyB9KS5yZXBsYWNlKC8kXFwtLywgJycpIDogJyc7XG4gICAgY2FzZSAnc25ha2UnOlxuICAgICAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuICdfJyArIHMudG9Mb3dlckNhc2UoKTsgfSkucmVwbGFjZSgvJFxcLS8sICcnKSA6ICcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lOiBzdHJpbmcsIGVsZW1OYW1lPzogc3RyaW5nLCBtb2ROYW1lPzogc3RyaW5nLCBtb2RWYWx1ZT86IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgaWYgKGlnbm9yZVZhbHVlcykge1xuICAgIG1vZFZhbHVlID0gISFtb2RWYWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kVmFsdWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBtb2RWYWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgbW9kVmFsdWUgPSAhIW1vZFZhbHVlO1xuICB9XG5cbiAgbGV0IGNscyA9IGJsb2NrTmFtZTtcblxuICBpZiAoZWxlbU5hbWUpIHtcbiAgICBjbHMgKz0gc2VwYXJhdG9ycy5lbCArIGVsZW1OYW1lO1xuICB9XG5cbiAgaWYgKG1vZE5hbWUpIHtcbiAgICBtb2ROYW1lID0gbW9kTmFtZUhhbmRsZXIobW9kTmFtZSk7XG4gICAgY2xzICs9IHNlcGFyYXRvcnMubW9kICsgbW9kTmFtZTtcbiAgICBpZiAodHlwZW9mKG1vZFZhbHVlKSAhPT0gJ2Jvb2xlYW4nICYmIG1vZFZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNscyArPSBzZXBhcmF0b3JzLnZhbCArIG1vZFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9kcyhtb2RzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG9iamVjdCkge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgbW9kcyA9IG1vZHMuc3BsaXQoL1xccysvKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgbGV0IGFyciA9IG1vZHM7XG5cbiAgICBtb2RzID0ge307XG5cbiAgICBhcnIuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgbW9kc1trZXldID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kcyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gbW9kcztcbn1cblxuZnVuY3Rpb24gc2V0TW9kcyhibG9ja05hbWU6IHN0cmluZywgZWxlbU5hbWU6IHN0cmluZywgbW9kczogb2JqZWN0LCBvbGRNb2RzOiBvYmplY3QsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgT2JqZWN0LmtleXMobW9kcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmIChvbGRNb2RzW2tleV0pIHtcbiAgICAgIGlmIChtb2RzW2tleV0gPT09IG9sZE1vZHNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG9sZE1vZHNba2V5XSkpO1xuICAgIH1cblxuICAgIGlmIChtb2RzW2tleV0pIHtcbiAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG1vZHNba2V5XSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMob2xkTW9kcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICghKGtleSBpbiBtb2RzKSAmJiBvbGRNb2RzW2tleV0pIHtcbiAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG9sZE1vZHNba2V5XSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tibG9ja10nLFxufSlcbmV4cG9ydCBjbGFzcyBCbG9ja0RpcmVjdGl2ZSB7XG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIG1vZDogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3Q7XG4gIHByaXZhdGUgX21vZHM6IE9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kU2VyaWFsaXplZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIEBBdHRyaWJ1dGUoJ2Jsb2NrJykgbmFtZTogc3RyaW5nKSB7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXG4gICAgcmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudC5uYXRpdmVFbGVtZW50LCBnZW5lcmF0ZUNsYXNzKG5hbWUpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLm1vZCkgIT09IHRoaXMuX21vZFNlcmlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX21vZFNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm1vZCk7XG5cbiAgICAgIGxldCBtb2RzID0gdGhpcy5tb2Q7XG5cbiAgICAgIGxldCB7cmVuZGVyZXIsIGVsZW1lbnQsIG5hbWV9ID0gdGhpcztcblxuICAgICAgbW9kcyA9IHBhcnNlTW9kcyhtb2RzKTtcblxuICAgICAgc2V0TW9kcyhuYW1lLCAnJywgbW9kcywgdGhpcy5fbW9kcyB8fCB7fSwgZWxlbWVudCwgcmVuZGVyZXIpO1xuXG4gICAgICB0aGlzLl9tb2RzID0gdGhpcy5fbW9kcyA9PT0gbW9kcyA/IE9iamVjdC5hc3NpZ24oe30sIG1vZHMpIDogbW9kcztcbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2VsZW1dJyxcbn0pXG5leHBvcnQgY2xhc3MgRWxlbURpcmVjdGl2ZSB7XG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHVibGljIGJsb2NrTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgbW9kOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kczogT2JqZWN0O1xuICBwcml2YXRlIF9tb2RTZXJpYWxpemVkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgQEF0dHJpYnV0ZSgnZWxlbScpIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgYmxvY2s6IEJsb2NrRGlyZWN0aXZlKSB7XG5cbiAgICB0aGlzLmJsb2NrTmFtZSA9IGJsb2NrLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9jay5uYW1lLCBuYW1lKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpICE9PSB0aGlzLl9tb2RTZXJpYWxpemVkKSB7XG4gICAgICB0aGlzLl9tb2RTZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpO1xuXG4gICAgICBsZXQgbW9kcyA9IHRoaXMubW9kO1xuXG4gICAgICBsZXQge3JlbmRlcmVyLCBlbGVtZW50LCBibG9ja05hbWUsIG5hbWV9ID0gdGhpcztcblxuICAgICAgbW9kcyA9IHBhcnNlTW9kcyhtb2RzKTtcblxuICAgICAgc2V0TW9kcyhibG9ja05hbWUsIG5hbWUsIG1vZHMsIHRoaXMuX21vZHMgfHwge30sIGVsZW1lbnQsIHJlbmRlcmVyKTtcblxuICAgICAgdGhpcy5fbW9kcyA9IHRoaXMuX21vZHMgPT09IG1vZHMgPyBPYmplY3QuYXNzaWduKHt9LCBtb2RzKSA6IG1vZHM7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttb2RdJyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kRGlyZWN0aXZlIHt9XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEJsb2NrRGlyZWN0aXZlLFxuICAgIEVsZW1EaXJlY3RpdmUsXG4gICAgTW9kRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQmxvY2tEaXJlY3RpdmUsXG4gICAgRWxlbURpcmVjdGl2ZSxcbiAgICBNb2REaXJlY3RpdmUsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQmVtTW9kdWxlIHtcbiAgc3RhdGljIGNvbmZpZyhkYXRhOiBCZW1Db25maWcpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBCZW1Nb2R1bGU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuc2VwYXJhdG9ycykge1xuICAgICAgc2VwYXJhdG9ycy5lbCA9IGRhdGEuc2VwYXJhdG9yc1swXSB8fCAnX18nO1xuICAgICAgc2VwYXJhdG9ycy5tb2QgPSBkYXRhLnNlcGFyYXRvcnNbMV0gfHwgJy0tJztcbiAgICAgIHNlcGFyYXRvcnMudmFsID0gZGF0YS5zZXBhcmF0b3JzWzJdIHx8ICctJztcbiAgICB9XG5cbiAgICBpZiAoJ2lnbm9yZVZhbHVlcycgaW4gZGF0YSkge1xuICAgICAgaWdub3JlVmFsdWVzID0gISFkYXRhLmlnbm9yZVZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5tb2RDYXNlKSB7XG4gICAgICBpZiAoIX5bJ2tlYmFiJywgJ2NhbWVsJywgJ3NuYWtlJ10uaW5kZXhPZihkYXRhLm1vZENhc2UpKSB7XG4gICAgICAgIHRocm93ICdXcm9uZyBtb2QgY2FzZS4gWW91IGNhbiB1c2Ugb25seSB0aGVzZSBjYXNlczoga2ViYWIsIHNuYWtlLCBjYW1lbCc7XG4gICAgICB9XG5cbiAgICAgIG1vZENhc2UgPSBkYXRhLm1vZENhc2U7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 -------------------------------------------------------------------------------- /dist/esm2015/bem.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview added by tsickle 3 | * @suppress {checkTypes} checked by tsc 4 | */ 5 | import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core'; 6 | export class BemConfig { 7 | } 8 | function BemConfig_tsickle_Closure_declarations() { 9 | /** @type {?} */ 10 | BemConfig.prototype.separators; 11 | /** @type {?} */ 12 | BemConfig.prototype.ignoreValues; 13 | /** @type {?} */ 14 | BemConfig.prototype.modCase; 15 | } 16 | const /** @type {?} */ separators = { 17 | el: '__', 18 | mod: '--', 19 | val: '-' 20 | }; 21 | let /** @type {?} */ ignoreValues = false; 22 | let /** @type {?} */ modCase = 'kebab'; 23 | /** 24 | * @param {?} str 25 | * @return {?} 26 | */ 27 | function modNameHandler(str) { 28 | switch (modCase) { 29 | case 'kebab': 30 | return str ? str.replace(/[A-Z]/g, function (s) { return '-' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 31 | case 'snake': 32 | return str ? str.replace(/[A-Z]/g, function (s) { return '_' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 33 | default: 34 | return str; 35 | } 36 | } 37 | /** 38 | * @param {?} blockName 39 | * @param {?=} elemName 40 | * @param {?=} modName 41 | * @param {?=} modValue 42 | * @return {?} 43 | */ 44 | function generateClass(blockName, elemName, modName, modValue) { 45 | if (ignoreValues) { 46 | modValue = !!modValue; 47 | } 48 | if (typeof modValue !== 'string' && typeof modValue !== 'boolean') { 49 | modValue = !!modValue; 50 | } 51 | let /** @type {?} */ cls = blockName; 52 | if (elemName) { 53 | cls += separators.el + elemName; 54 | } 55 | if (modName) { 56 | modName = modNameHandler(modName); 57 | cls += separators.mod + modName; 58 | if (typeof (modValue) !== 'boolean' && modValue != null) { 59 | cls += separators.val + modValue; 60 | } 61 | } 62 | return cls; 63 | } 64 | /** 65 | * @param {?} mods 66 | * @return {?} 67 | */ 68 | function parseMods(mods) { 69 | if (typeof mods === 'string') { 70 | mods = mods.split(/\s+/); 71 | } 72 | if (Array.isArray(mods)) { 73 | let /** @type {?} */ arr = mods; 74 | mods = {}; 75 | arr.forEach(key => { 76 | mods[key] = true; 77 | }); 78 | } 79 | else if (typeof mods !== 'object') { 80 | return {}; 81 | } 82 | return mods; 83 | } 84 | /** 85 | * @param {?} blockName 86 | * @param {?} elemName 87 | * @param {?} mods 88 | * @param {?} oldMods 89 | * @param {?} element 90 | * @param {?} renderer 91 | * @return {?} 92 | */ 93 | function setMods(blockName, elemName, mods, oldMods, element, renderer) { 94 | Object.keys(mods).forEach(key => { 95 | if (oldMods[key]) { 96 | if (mods[key] === oldMods[key]) { 97 | return; 98 | } 99 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 100 | } 101 | if (mods[key]) { 102 | renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key])); 103 | } 104 | }); 105 | Object.keys(oldMods).forEach(key => { 106 | if (!(key in mods) && oldMods[key]) { 107 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 108 | } 109 | }); 110 | } 111 | export class BlockDirective { 112 | /** 113 | * @param {?} element 114 | * @param {?} renderer 115 | * @param {?} name 116 | */ 117 | constructor(element, renderer, name) { 118 | this.name = name; 119 | this.element = element; 120 | this.renderer = renderer; 121 | renderer.addClass(element.nativeElement, generateClass(name)); 122 | } 123 | /** 124 | * @return {?} 125 | */ 126 | ngOnChanges() { 127 | if (JSON.stringify(this.mod) !== this._modSerialized) { 128 | this._modSerialized = JSON.stringify(this.mod); 129 | let /** @type {?} */ mods = this.mod; 130 | let { renderer, element, name } = this; 131 | mods = parseMods(mods); 132 | setMods(name, '', mods, this._mods || {}, element, renderer); 133 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 134 | } 135 | } 136 | } 137 | BlockDirective.decorators = [ 138 | { type: Directive, args: [{ 139 | selector: '[block]', 140 | },] }, 141 | ]; 142 | /** @nocollapse */ 143 | BlockDirective.ctorParameters = () => [ 144 | { type: ElementRef }, 145 | { type: Renderer2 }, 146 | { type: String, decorators: [{ type: Attribute, args: ['block',] }] } 147 | ]; 148 | BlockDirective.propDecorators = { 149 | mod: [{ type: Input }] 150 | }; 151 | function BlockDirective_tsickle_Closure_declarations() { 152 | /** @type {?} */ 153 | BlockDirective.prototype.element; 154 | /** @type {?} */ 155 | BlockDirective.prototype.renderer; 156 | /** @type {?} */ 157 | BlockDirective.prototype.name; 158 | /** @type {?} */ 159 | BlockDirective.prototype.mod; 160 | /** @type {?} */ 161 | BlockDirective.prototype._mods; 162 | /** @type {?} */ 163 | BlockDirective.prototype._modSerialized; 164 | } 165 | export class ElemDirective { 166 | /** 167 | * @param {?} element 168 | * @param {?} renderer 169 | * @param {?} name 170 | * @param {?} block 171 | */ 172 | constructor(element, renderer, name, block) { 173 | this.blockName = block.name; 174 | this.name = name; 175 | this.element = element; 176 | this.renderer = renderer; 177 | renderer.addClass(element.nativeElement, generateClass(block.name, name)); 178 | } 179 | /** 180 | * @return {?} 181 | */ 182 | ngOnChanges() { 183 | if (JSON.stringify(this.mod) !== this._modSerialized) { 184 | this._modSerialized = JSON.stringify(this.mod); 185 | let /** @type {?} */ mods = this.mod; 186 | let { renderer, element, blockName, name } = this; 187 | mods = parseMods(mods); 188 | setMods(blockName, name, mods, this._mods || {}, element, renderer); 189 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 190 | } 191 | } 192 | } 193 | ElemDirective.decorators = [ 194 | { type: Directive, args: [{ 195 | selector: '[elem]', 196 | },] }, 197 | ]; 198 | /** @nocollapse */ 199 | ElemDirective.ctorParameters = () => [ 200 | { type: ElementRef }, 201 | { type: Renderer2 }, 202 | { type: String, decorators: [{ type: Attribute, args: ['elem',] }] }, 203 | { type: BlockDirective } 204 | ]; 205 | ElemDirective.propDecorators = { 206 | mod: [{ type: Input }] 207 | }; 208 | function ElemDirective_tsickle_Closure_declarations() { 209 | /** @type {?} */ 210 | ElemDirective.prototype.element; 211 | /** @type {?} */ 212 | ElemDirective.prototype.renderer; 213 | /** @type {?} */ 214 | ElemDirective.prototype.blockName; 215 | /** @type {?} */ 216 | ElemDirective.prototype.name; 217 | /** @type {?} */ 218 | ElemDirective.prototype.mod; 219 | /** @type {?} */ 220 | ElemDirective.prototype._mods; 221 | /** @type {?} */ 222 | ElemDirective.prototype._modSerialized; 223 | } 224 | export class ModDirective { 225 | } 226 | ModDirective.decorators = [ 227 | { type: Directive, args: [{ 228 | selector: '[mod]', 229 | },] }, 230 | ]; 231 | export class BemModule { 232 | /** 233 | * @param {?} data 234 | * @return {?} 235 | */ 236 | static config(data) { 237 | if (!data) { 238 | return BemModule; 239 | } 240 | if (data.separators) { 241 | separators.el = data.separators[0] || '__'; 242 | separators.mod = data.separators[1] || '--'; 243 | separators.val = data.separators[2] || '-'; 244 | } 245 | if ('ignoreValues' in data) { 246 | ignoreValues = !!data.ignoreValues; 247 | } 248 | if (data.modCase) { 249 | if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) { 250 | throw 'Wrong mod case. You can use only these cases: kebab, snake, camel'; 251 | } 252 | modCase = data.modCase; 253 | } 254 | return BemModule; 255 | } 256 | } 257 | BemModule.decorators = [ 258 | { type: NgModule, args: [{ 259 | declarations: [ 260 | BlockDirective, 261 | ElemDirective, 262 | ModDirective, 263 | ], 264 | exports: [ 265 | BlockDirective, 266 | ElemDirective, 267 | ModDirective, 268 | ] 269 | },] }, 270 | ]; 271 | 272 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVtLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1iZW0vIiwic291cmNlcyI6WyJiZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RixNQUFNO0NBSUw7Ozs7Ozs7OztBQUVELHVCQUFNLFVBQVUsR0FBRztJQUNqQixFQUFFLEVBQUUsSUFBSTtJQUNSLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLEdBQUc7Q0FDVCxDQUFDO0FBQ0YscUJBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN6QixxQkFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDOzs7OztBQUV0Qix3QkFBd0IsR0FBVztJQUNqQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVMsQ0FBQyxJQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRyxLQUFLLE9BQU87WUFDVixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFTLENBQUMsSUFBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0c7WUFDRSxNQUFNLENBQUMsR0FBRyxDQUFDO0tBQ2Q7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LEdBQUcsQ0FBQztTQUM1QztRQUVELEVBQUUsQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUNwQztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sbUVBQW1FLENBQUM7YUFDM0U7WUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUN4QjtRQUVELE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDbEI7OztZQXJDRixRQUFRLFNBQUM7Z0JBQ1IsWUFBWSxFQUFFO29CQUNaLGNBQWM7b0JBQ2QsYUFBYTtvQkFDYixZQUFZO2lCQUNiO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxjQUFjO29CQUNkLGFBQWE7b0JBQ2IsWUFBWTtpQkFDYjthQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIERpcmVjdGl2ZSwgQXR0cmlidXRlLCBSZW5kZXJlcjIsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBCZW1Db25maWcge1xuICBzZXBhcmF0b3JzPzogQXJyYXk8c3RyaW5nPjtcbiAgaWdub3JlVmFsdWVzPzogYm9vbGVhbjtcbiAgbW9kQ2FzZT86IHN0cmluZztcbn1cblxuY29uc3Qgc2VwYXJhdG9ycyA9IHtcbiAgZWw6ICdfXycsXG4gIG1vZDogJy0tJyxcbiAgdmFsOiAnLSdcbn07XG5sZXQgaWdub3JlVmFsdWVzID0gZmFsc2U7XG5sZXQgbW9kQ2FzZSA9ICdrZWJhYic7XG5cbmZ1bmN0aW9uIG1vZE5hbWVIYW5kbGVyKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChtb2RDYXNlKSB7XG4gICAgY2FzZSAna2ViYWInOlxuICAgICAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuICctJyArIHMudG9Mb3dlckNhc2UoKTsgfSkucmVwbGFjZSgvJFxcLS8sICcnKSA6ICcnO1xuICAgIGNhc2UgJ3NuYWtlJzpcbiAgICAgIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24ocykge3JldHVybiAnXycgKyBzLnRvTG93ZXJDYXNlKCk7IH0pLnJlcGxhY2UoLyRcXC0vLCAnJykgOiAnJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNsYXNzKGJsb2NrTmFtZTogc3RyaW5nLCBlbGVtTmFtZT86IHN0cmluZywgbW9kTmFtZT86IHN0cmluZywgbW9kVmFsdWU/OiBib29sZWFuIHwgc3RyaW5nKSB7XG4gIGlmIChpZ25vcmVWYWx1ZXMpIHtcbiAgICBtb2RWYWx1ZSA9ICEhbW9kVmFsdWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG1vZFZhbHVlICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgbW9kVmFsdWUgIT09ICdib29sZWFuJykge1xuICAgIG1vZFZhbHVlID0gISFtb2RWYWx1ZTtcbiAgfVxuXG4gIGxldCBjbHMgPSBibG9ja05hbWU7XG5cbiAgaWYgKGVsZW1OYW1lKSB7XG4gICAgY2xzICs9IHNlcGFyYXRvcnMuZWwgKyBlbGVtTmFtZTtcbiAgfVxuXG4gIGlmIChtb2ROYW1lKSB7XG4gICAgbW9kTmFtZSA9IG1vZE5hbWVIYW5kbGVyKG1vZE5hbWUpO1xuICAgIGNscyArPSBzZXBhcmF0b3JzLm1vZCArIG1vZE5hbWU7XG4gICAgaWYgKHR5cGVvZihtb2RWYWx1ZSkgIT09ICdib29sZWFuJyAmJiBtb2RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBjbHMgKz0gc2VwYXJhdG9ycy52YWwgKyBtb2RWYWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xzO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vZHMobW9kczogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBtb2RzID09PSAnc3RyaW5nJykge1xuICAgIG1vZHMgPSBtb2RzLnNwbGl0KC9cXHMrLyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShtb2RzKSkge1xuICAgIGxldCBhcnIgPSBtb2RzO1xuXG4gICAgbW9kcyA9IHt9O1xuXG4gICAgYXJyLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIG1vZHNba2V5XSA9IHRydWU7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZHMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIG1vZHM7XG59XG5cbmZ1bmN0aW9uIHNldE1vZHMoYmxvY2tOYW1lOiBzdHJpbmcsIGVsZW1OYW1lOiBzdHJpbmcsIG1vZHM6IG9iamVjdCwgb2xkTW9kczogb2JqZWN0LCBlbGVtZW50OiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gIE9iamVjdC5rZXlzKG1vZHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAob2xkTW9kc1trZXldKSB7XG4gICAgICBpZiAobW9kc1trZXldID09PSBvbGRNb2RzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lLCBlbGVtTmFtZSwga2V5LCBvbGRNb2RzW2tleV0pKTtcbiAgICB9XG5cbiAgICBpZiAobW9kc1trZXldKSB7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lLCBlbGVtTmFtZSwga2V5LCBtb2RzW2tleV0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIE9iamVjdC5rZXlzKG9sZE1vZHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoIShrZXkgaW4gbW9kcykgJiYgb2xkTW9kc1trZXldKSB7XG4gICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lLCBlbGVtTmFtZSwga2V5LCBvbGRNb2RzW2tleV0pKTtcbiAgICB9XG4gIH0pO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYmxvY2tdJyxcbn0pXG5leHBvcnQgY2xhc3MgQmxvY2tEaXJlY3RpdmUge1xuICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcbiAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2Q6IHN0cmluZyB8IHN0cmluZ1tdIHwgb2JqZWN0O1xuICBwcml2YXRlIF9tb2RzOiBPYmplY3Q7XG4gIHByaXZhdGUgX21vZFNlcmlhbGl6ZWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBAQXR0cmlidXRlKCdibG9jaycpIG5hbWU6IHN0cmluZykge1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhuYW1lKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpICE9PSB0aGlzLl9tb2RTZXJpYWxpemVkKSB7XG4gICAgICB0aGlzLl9tb2RTZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpO1xuXG4gICAgICBsZXQgbW9kcyA9IHRoaXMubW9kO1xuXG4gICAgICBsZXQge3JlbmRlcmVyLCBlbGVtZW50LCBuYW1lfSA9IHRoaXM7XG5cbiAgICAgIG1vZHMgPSBwYXJzZU1vZHMobW9kcyk7XG5cbiAgICAgIHNldE1vZHMobmFtZSwgJycsIG1vZHMsIHRoaXMuX21vZHMgfHwge30sIGVsZW1lbnQsIHJlbmRlcmVyKTtcblxuICAgICAgdGhpcy5fbW9kcyA9IHRoaXMuX21vZHMgPT09IG1vZHMgPyBPYmplY3QuYXNzaWduKHt9LCBtb2RzKSA6IG1vZHM7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tlbGVtXScsXG59KVxuZXhwb3J0IGNsYXNzIEVsZW1EaXJlY3RpdmUge1xuICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcbiAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHB1YmxpYyBibG9ja05hbWU6IHN0cmluZztcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIG1vZDogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3Q7XG4gIHByaXZhdGUgX21vZHM6IE9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kU2VyaWFsaXplZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIEBBdHRyaWJ1dGUoJ2VsZW0nKSBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIGJsb2NrOiBCbG9ja0RpcmVjdGl2ZSkge1xuXG4gICAgdGhpcy5ibG9ja05hbWUgPSBibG9jay5uYW1lO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cbiAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2submFtZSwgbmFtZSkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMubW9kKSAhPT0gdGhpcy5fbW9kU2VyaWFsaXplZCkge1xuICAgICAgdGhpcy5fbW9kU2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMubW9kKTtcblxuICAgICAgbGV0IG1vZHMgPSB0aGlzLm1vZDtcblxuICAgICAgbGV0IHtyZW5kZXJlciwgZWxlbWVudCwgYmxvY2tOYW1lLCBuYW1lfSA9IHRoaXM7XG5cbiAgICAgIG1vZHMgPSBwYXJzZU1vZHMobW9kcyk7XG5cbiAgICAgIHNldE1vZHMoYmxvY2tOYW1lLCBuYW1lLCBtb2RzLCB0aGlzLl9tb2RzIHx8IHt9LCBlbGVtZW50LCByZW5kZXJlcik7XG5cbiAgICAgIHRoaXMuX21vZHMgPSB0aGlzLl9tb2RzID09PSBtb2RzID8gT2JqZWN0LmFzc2lnbih7fSwgbW9kcykgOiBtb2RzO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbW9kXScsXG59KVxuZXhwb3J0IGNsYXNzIE1vZERpcmVjdGl2ZSB7fVxuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBCbG9ja0RpcmVjdGl2ZSxcbiAgICBFbGVtRGlyZWN0aXZlLFxuICAgIE1vZERpcmVjdGl2ZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEJsb2NrRGlyZWN0aXZlLFxuICAgIEVsZW1EaXJlY3RpdmUsXG4gICAgTW9kRGlyZWN0aXZlLFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEJlbU1vZHVsZSB7XG4gIHN0YXRpYyBjb25maWcoZGF0YTogQmVtQ29uZmlnKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gQmVtTW9kdWxlO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnNlcGFyYXRvcnMpIHtcbiAgICAgIHNlcGFyYXRvcnMuZWwgPSBkYXRhLnNlcGFyYXRvcnNbMF0gfHwgJ19fJztcbiAgICAgIHNlcGFyYXRvcnMubW9kID0gZGF0YS5zZXBhcmF0b3JzWzFdIHx8ICctLSc7XG4gICAgICBzZXBhcmF0b3JzLnZhbCA9IGRhdGEuc2VwYXJhdG9yc1syXSB8fCAnLSc7XG4gICAgfVxuXG4gICAgaWYgKCdpZ25vcmVWYWx1ZXMnIGluIGRhdGEpIHtcbiAgICAgIGlnbm9yZVZhbHVlcyA9ICEhZGF0YS5pZ25vcmVWYWx1ZXM7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEubW9kQ2FzZSkge1xuICAgICAgaWYgKCF+WydrZWJhYicsICdjYW1lbCcsICdzbmFrZSddLmluZGV4T2YoZGF0YS5tb2RDYXNlKSkge1xuICAgICAgICB0aHJvdyAnV3JvbmcgbW9kIGNhc2UuIFlvdSBjYW4gdXNlIG9ubHkgdGhlc2UgY2FzZXM6IGtlYmFiLCBzbmFrZSwgY2FtZWwnO1xuICAgICAgfVxuXG4gICAgICBtb2RDYXNlID0gZGF0YS5tb2RDYXNlO1xuICAgIH1cblxuICAgIHJldHVybiBCZW1Nb2R1bGU7XG4gIH1cbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/bundles/angular-bem.umd.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) : 3 | typeof define === 'function' && define.amd ? define('angular-bem', ['exports', '@angular/core'], factory) : 4 | (factory((global['angular-bem'] = {}),global.ng.core)); 5 | }(this, (function (exports,core) { 'use strict'; 6 | 7 | /** 8 | * @fileoverview added by tsickle 9 | * @suppress {checkTypes} checked by tsc 10 | */ 11 | var BemConfig = (function () { 12 | function BemConfig() { 13 | } 14 | return BemConfig; 15 | }()); 16 | var /** @type {?} */ separators = { 17 | el: '__', 18 | mod: '--', 19 | val: '-' 20 | }; 21 | var /** @type {?} */ ignoreValues = false; 22 | var /** @type {?} */ modCase = 'kebab'; 23 | /** 24 | * @param {?} str 25 | * @return {?} 26 | */ 27 | function modNameHandler(str) { 28 | switch (modCase) { 29 | case 'kebab': 30 | return str ? str.replace(/[A-Z]/g, function (s) { return '-' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 31 | case 'snake': 32 | return str ? str.replace(/[A-Z]/g, function (s) { return '_' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 33 | default: 34 | return str; 35 | } 36 | } 37 | /** 38 | * @param {?} blockName 39 | * @param {?=} elemName 40 | * @param {?=} modName 41 | * @param {?=} modValue 42 | * @return {?} 43 | */ 44 | function generateClass(blockName, elemName, modName, modValue) { 45 | if (ignoreValues) { 46 | modValue = !!modValue; 47 | } 48 | if (typeof modValue !== 'string' && typeof modValue !== 'boolean') { 49 | modValue = !!modValue; 50 | } 51 | var /** @type {?} */ cls = blockName; 52 | if (elemName) { 53 | cls += separators.el + elemName; 54 | } 55 | if (modName) { 56 | modName = modNameHandler(modName); 57 | cls += separators.mod + modName; 58 | if (typeof (modValue) !== 'boolean' && modValue != null) { 59 | cls += separators.val + modValue; 60 | } 61 | } 62 | return cls; 63 | } 64 | /** 65 | * @param {?} mods 66 | * @return {?} 67 | */ 68 | function parseMods(mods) { 69 | if (typeof mods === 'string') { 70 | mods = mods.split(/\s+/); 71 | } 72 | if (Array.isArray(mods)) { 73 | var /** @type {?} */ arr = mods; 74 | mods = {}; 75 | arr.forEach(function (key) { 76 | mods[key] = true; 77 | }); 78 | } 79 | else if (typeof mods !== 'object') { 80 | return {}; 81 | } 82 | return mods; 83 | } 84 | /** 85 | * @param {?} blockName 86 | * @param {?} elemName 87 | * @param {?} mods 88 | * @param {?} oldMods 89 | * @param {?} element 90 | * @param {?} renderer 91 | * @return {?} 92 | */ 93 | function setMods(blockName, elemName, mods, oldMods, element, renderer) { 94 | Object.keys(mods).forEach(function (key) { 95 | if (oldMods[key]) { 96 | if (mods[key] === oldMods[key]) { 97 | return; 98 | } 99 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 100 | } 101 | if (mods[key]) { 102 | renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key])); 103 | } 104 | }); 105 | Object.keys(oldMods).forEach(function (key) { 106 | if (!(key in mods) && oldMods[key]) { 107 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 108 | } 109 | }); 110 | } 111 | var BlockDirective = (function () { 112 | function BlockDirective(element, renderer, name) { 113 | this.name = name; 114 | this.element = element; 115 | this.renderer = renderer; 116 | renderer.addClass(element.nativeElement, generateClass(name)); 117 | } 118 | /** 119 | * @return {?} 120 | */ 121 | BlockDirective.prototype.ngOnChanges = /** 122 | * @return {?} 123 | */ 124 | function () { 125 | if (JSON.stringify(this.mod) !== this._modSerialized) { 126 | this._modSerialized = JSON.stringify(this.mod); 127 | var /** @type {?} */ mods = this.mod; 128 | var _a = this, renderer = _a.renderer, element = _a.element, name_1 = _a.name; 129 | mods = parseMods(mods); 130 | setMods(name_1, '', mods, this._mods || {}, element, renderer); 131 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 132 | } 133 | }; 134 | BlockDirective.decorators = [ 135 | { type: core.Directive, args: [{ 136 | selector: '[block]', 137 | },] }, 138 | ]; 139 | /** @nocollapse */ 140 | BlockDirective.ctorParameters = function () { 141 | return [ 142 | { type: core.ElementRef }, 143 | { type: core.Renderer2 }, 144 | { type: String, decorators: [{ type: core.Attribute, args: ['block',] }] } 145 | ]; 146 | }; 147 | BlockDirective.propDecorators = { 148 | mod: [{ type: core.Input }] 149 | }; 150 | return BlockDirective; 151 | }()); 152 | var ElemDirective = (function () { 153 | function ElemDirective(element, renderer, name, block) { 154 | this.blockName = block.name; 155 | this.name = name; 156 | this.element = element; 157 | this.renderer = renderer; 158 | renderer.addClass(element.nativeElement, generateClass(block.name, name)); 159 | } 160 | /** 161 | * @return {?} 162 | */ 163 | ElemDirective.prototype.ngOnChanges = /** 164 | * @return {?} 165 | */ 166 | function () { 167 | if (JSON.stringify(this.mod) !== this._modSerialized) { 168 | this._modSerialized = JSON.stringify(this.mod); 169 | var /** @type {?} */ mods = this.mod; 170 | var _a = this, renderer = _a.renderer, element = _a.element, blockName = _a.blockName, name_2 = _a.name; 171 | mods = parseMods(mods); 172 | setMods(blockName, name_2, mods, this._mods || {}, element, renderer); 173 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 174 | } 175 | }; 176 | ElemDirective.decorators = [ 177 | { type: core.Directive, args: [{ 178 | selector: '[elem]', 179 | },] }, 180 | ]; 181 | /** @nocollapse */ 182 | ElemDirective.ctorParameters = function () { 183 | return [ 184 | { type: core.ElementRef }, 185 | { type: core.Renderer2 }, 186 | { type: String, decorators: [{ type: core.Attribute, args: ['elem',] }] }, 187 | { type: BlockDirective } 188 | ]; 189 | }; 190 | ElemDirective.propDecorators = { 191 | mod: [{ type: core.Input }] 192 | }; 193 | return ElemDirective; 194 | }()); 195 | var ModDirective = (function () { 196 | function ModDirective() { 197 | } 198 | ModDirective.decorators = [ 199 | { type: core.Directive, args: [{ 200 | selector: '[mod]', 201 | },] }, 202 | ]; 203 | return ModDirective; 204 | }()); 205 | var BemModule = (function () { 206 | function BemModule() { 207 | } 208 | /** 209 | * @param {?} data 210 | * @return {?} 211 | */ 212 | BemModule.config = /** 213 | * @param {?} data 214 | * @return {?} 215 | */ 216 | function (data) { 217 | if (!data) { 218 | return BemModule; 219 | } 220 | if (data.separators) { 221 | separators.el = data.separators[0] || '__'; 222 | separators.mod = data.separators[1] || '--'; 223 | separators.val = data.separators[2] || '-'; 224 | } 225 | if ('ignoreValues' in data) { 226 | ignoreValues = !!data.ignoreValues; 227 | } 228 | if (data.modCase) { 229 | if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) { 230 | throw 'Wrong mod case. You can use only these cases: kebab, snake, camel'; 231 | } 232 | modCase = data.modCase; 233 | } 234 | return BemModule; 235 | }; 236 | BemModule.decorators = [ 237 | { type: core.NgModule, args: [{ 238 | declarations: [ 239 | BlockDirective, 240 | ElemDirective, 241 | ModDirective, 242 | ], 243 | exports: [ 244 | BlockDirective, 245 | ElemDirective, 246 | ModDirective, 247 | ] 248 | },] }, 249 | ]; 250 | return BemModule; 251 | }()); 252 | 253 | /** 254 | * @fileoverview added by tsickle 255 | * @suppress {checkTypes} checked by tsc 256 | */ 257 | 258 | exports.BemConfig = BemConfig; 259 | exports.BlockDirective = BlockDirective; 260 | exports.ElemDirective = ElemDirective; 261 | exports.ModDirective = ModDirective; 262 | exports.BemModule = BemModule; 263 | 264 | Object.defineProperty(exports, '__esModule', { value: true }); 265 | 266 | }))); 267 | 268 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1iZW0udW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9hbmd1bGFyLWJlbS9iZW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIERpcmVjdGl2ZSwgQXR0cmlidXRlLCBSZW5kZXJlcjIsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBCZW1Db25maWcge1xuICBzZXBhcmF0b3JzPzogQXJyYXk8c3RyaW5nPjtcbiAgaWdub3JlVmFsdWVzPzogYm9vbGVhbjtcbiAgbW9kQ2FzZT86IHN0cmluZztcbn1cblxuY29uc3Qgc2VwYXJhdG9ycyA9IHtcbiAgZWw6ICdfXycsXG4gIG1vZDogJy0tJyxcbiAgdmFsOiAnLSdcbn07XG5sZXQgaWdub3JlVmFsdWVzID0gZmFsc2U7XG5sZXQgbW9kQ2FzZSA9ICdrZWJhYic7XG5cbmZ1bmN0aW9uIG1vZE5hbWVIYW5kbGVyKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChtb2RDYXNlKSB7XG4gICAgY2FzZSAna2ViYWInOlxuICAgICAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuICctJyArIHMudG9Mb3dlckNhc2UoKTsgfSkucmVwbGFjZSgvJFxcLS8sICcnKSA6ICcnO1xuICAgIGNhc2UgJ3NuYWtlJzpcbiAgICAgIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24ocykge3JldHVybiAnXycgKyBzLnRvTG93ZXJDYXNlKCk7IH0pLnJlcGxhY2UoLyRcXC0vLCAnJykgOiAnJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNsYXNzKGJsb2NrTmFtZTogc3RyaW5nLCBlbGVtTmFtZT86IHN0cmluZywgbW9kTmFtZT86IHN0cmluZywgbW9kVmFsdWU/OiBib29sZWFuIHwgc3RyaW5nKSB7XG4gIGlmIChpZ25vcmVWYWx1ZXMpIHtcbiAgICBtb2RWYWx1ZSA9ICEhbW9kVmFsdWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG1vZFZhbHVlICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgbW9kVmFsdWUgIT09ICdib29sZWFuJykge1xuICAgIG1vZFZhbHVlID0gISFtb2RWYWx1ZTtcbiAgfVxuXG4gIGxldCBjbHMgPSBibG9ja05hbWU7XG5cbiAgaWYgKGVsZW1OYW1lKSB7XG4gICAgY2xzICs9IHNlcGFyYXRvcnMuZWwgKyBlbGVtTmFtZTtcbiAgfVxuXG4gIGlmIChtb2ROYW1lKSB7XG4gICAgbW9kTmFtZSA9IG1vZE5hbWVIYW5kbGVyKG1vZE5hbWUpO1xuICAgIGNscyArPSBzZXBhcmF0b3JzLm1vZCArIG1vZE5hbWU7XG4gICAgaWYgKHR5cGVvZihtb2RWYWx1ZSkgIT09ICdib29sZWFuJyAmJiBtb2RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBjbHMgKz0gc2VwYXJhdG9ycy52YWwgKyBtb2RWYWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xzO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vZHMobW9kczogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBtb2RzID09PSAnc3RyaW5nJykge1xuICAgIG1vZHMgPSBtb2RzLnNwbGl0KC9cXHMrLyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShtb2RzKSkge1xuICAgIGxldCBhcnIgPSBtb2RzO1xuXG4gICAgbW9kcyA9IHt9O1xuXG4gICAgYXJyLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIG1vZHNba2V5XSA9IHRydWU7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZHMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIG1vZHM7XG59XG5cbmZ1bmN0aW9uIHNldE1vZHMoYmxvY2tOYW1lOiBzdHJpbmcsIGVsZW1OYW1lOiBzdHJpbmcsIG1vZHM6IG9iamVjdCwgb2xkTW9kczogb2JqZWN0LCBlbGVtZW50OiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gIE9iamVjdC5rZXlzKG1vZHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAob2xkTW9kc1trZXldKSB7XG4gICAgICBpZiAobW9kc1trZXldID09PSBvbGRNb2RzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lLCBlbGVtTmFtZSwga2V5LCBvbGRNb2RzW2tleV0pKTtcbiAgICB9XG5cbiAgICBpZiAobW9kc1trZXldKSB7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lLCBlbGVtTmFtZSwga2V5LCBtb2RzW2tleV0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIE9iamVjdC5rZXlzKG9sZE1vZHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoIShrZXkgaW4gbW9kcykgJiYgb2xkTW9kc1trZXldKSB7XG4gICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lLCBlbGVtTmFtZSwga2V5LCBvbGRNb2RzW2tleV0pKTtcbiAgICB9XG4gIH0pO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYmxvY2tdJyxcbn0pXG5leHBvcnQgY2xhc3MgQmxvY2tEaXJlY3RpdmUge1xuICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcbiAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBtb2Q6IHN0cmluZyB8IHN0cmluZ1tdIHwgb2JqZWN0O1xuICBwcml2YXRlIF9tb2RzOiBPYmplY3Q7XG4gIHByaXZhdGUgX21vZFNlcmlhbGl6ZWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBAQXR0cmlidXRlKCdibG9jaycpIG5hbWU6IHN0cmluZykge1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhuYW1lKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpICE9PSB0aGlzLl9tb2RTZXJpYWxpemVkKSB7XG4gICAgICB0aGlzLl9tb2RTZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpO1xuXG4gICAgICBsZXQgbW9kcyA9IHRoaXMubW9kO1xuXG4gICAgICBsZXQge3JlbmRlcmVyLCBlbGVtZW50LCBuYW1lfSA9IHRoaXM7XG5cbiAgICAgIG1vZHMgPSBwYXJzZU1vZHMobW9kcyk7XG5cbiAgICAgIHNldE1vZHMobmFtZSwgJycsIG1vZHMsIHRoaXMuX21vZHMgfHwge30sIGVsZW1lbnQsIHJlbmRlcmVyKTtcblxuICAgICAgdGhpcy5fbW9kcyA9IHRoaXMuX21vZHMgPT09IG1vZHMgPyBPYmplY3QuYXNzaWduKHt9LCBtb2RzKSA6IG1vZHM7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tlbGVtXScsXG59KVxuZXhwb3J0IGNsYXNzIEVsZW1EaXJlY3RpdmUge1xuICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcbiAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHB1YmxpYyBibG9ja05hbWU6IHN0cmluZztcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIG1vZDogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3Q7XG4gIHByaXZhdGUgX21vZHM6IE9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kU2VyaWFsaXplZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIEBBdHRyaWJ1dGUoJ2VsZW0nKSBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIGJsb2NrOiBCbG9ja0RpcmVjdGl2ZSkge1xuXG4gICAgdGhpcy5ibG9ja05hbWUgPSBibG9jay5uYW1lO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cbiAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGdlbmVyYXRlQ2xhc3MoYmxvY2submFtZSwgbmFtZSkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMubW9kKSAhPT0gdGhpcy5fbW9kU2VyaWFsaXplZCkge1xuICAgICAgdGhpcy5fbW9kU2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMubW9kKTtcblxuICAgICAgbGV0IG1vZHMgPSB0aGlzLm1vZDtcblxuICAgICAgbGV0IHtyZW5kZXJlciwgZWxlbWVudCwgYmxvY2tOYW1lLCBuYW1lfSA9IHRoaXM7XG5cbiAgICAgIG1vZHMgPSBwYXJzZU1vZHMobW9kcyk7XG5cbiAgICAgIHNldE1vZHMoYmxvY2tOYW1lLCBuYW1lLCBtb2RzLCB0aGlzLl9tb2RzIHx8IHt9LCBlbGVtZW50LCByZW5kZXJlcik7XG5cbiAgICAgIHRoaXMuX21vZHMgPSB0aGlzLl9tb2RzID09PSBtb2RzID8gT2JqZWN0LmFzc2lnbih7fSwgbW9kcykgOiBtb2RzO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbW9kXScsXG59KVxuZXhwb3J0IGNsYXNzIE1vZERpcmVjdGl2ZSB7fVxuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBCbG9ja0RpcmVjdGl2ZSxcbiAgICBFbGVtRGlyZWN0aXZlLFxuICAgIE1vZERpcmVjdGl2ZSxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEJsb2NrRGlyZWN0aXZlLFxuICAgIEVsZW1EaXJlY3RpdmUsXG4gICAgTW9kRGlyZWN0aXZlLFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEJlbU1vZHVsZSB7XG4gIHN0YXRpYyBjb25maWcoZGF0YTogQmVtQ29uZmlnKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gQmVtTW9kdWxlO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnNlcGFyYXRvcnMpIHtcbiAgICAgIHNlcGFyYXRvcnMuZWwgPSBkYXRhLnNlcGFyYXRvcnNbMF0gfHwgJ19fJztcbiAgICAgIHNlcGFyYXRvcnMubW9kID0gZGF0YS5zZXBhcmF0b3JzWzFdIHx8ICctLSc7XG4gICAgICBzZXBhcmF0b3JzLnZhbCA9IGRhdGEuc2VwYXJhdG9yc1syXSB8fCAnLSc7XG4gICAgfVxuXG4gICAgaWYgKCdpZ25vcmVWYWx1ZXMnIGluIGRhdGEpIHtcbiAgICAgIGlnbm9yZVZhbHVlcyA9ICEhZGF0YS5pZ25vcmVWYWx1ZXM7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEubW9kQ2FzZSkge1xuICAgICAgaWYgKCF+WydrZWJhYicsICdjYW1lbCcsICdzbmFrZSddLmluZGV4T2YoZGF0YS5tb2RDYXNlKSkge1xuICAgICAgICB0aHJvdyAnV3JvbmcgbW9kIGNhc2UuIFlvdSBjYW4gdXNlIG9ubHkgdGhlc2UgY2FzZXM6IGtlYmFiLCBzbmFrZSwgY2FtZWwnO1xuICAgICAgfVxuXG4gICAgICBtb2RDYXNlID0gZGF0YS5tb2RDYXNlO1xuICAgIH1cblxuICAgIHJldHVybiBCZW1Nb2R1bGU7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJEaXJlY3RpdmUiLCJFbGVtZW50UmVmIiwiUmVuZGVyZXIyIiwiQXR0cmlidXRlIiwiSW5wdXQiLCJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLFFBRUE7Ozt3QkFGQTtRQU1DLENBQUE7QUFKRCxJQU1BLHFCQUFNLFVBQVUsR0FBRztRQUNqQixFQUFFLEVBQUUsSUFBSTtRQUNSLEdBQUcsRUFBRSxJQUFJO1FBQ1QsR0FBRyxFQUFFLEdBQUc7S0FDVCxDQUFDO0lBQ0YscUJBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixxQkFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDOzs7OztJQUV0Qix3QkFBd0IsR0FBVztRQUNqQyxRQUFRLE9BQU87WUFDYixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBUyxDQUFDLElBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzNHLEtBQUssT0FBTztnQkFDVixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFTLENBQUMsSUFBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0c7Z0JBQ0UsT0FBTyxHQUFHLENBQUM7U0FDZDtLQUNGOzs7Ozs7OztJQUVELHVCQUF1QixTQUFpQixFQUFFLFFBQWlCLEVBQUUsT0FBZ0IsRUFBRSxRQUEyQjtRQUN4RyxJQUFJLFlBQVksRUFBRTtZQUNoQixRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVE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 -------------------------------------------------------------------------------- /dist/esm5/bem.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview added by tsickle 3 | * @suppress {checkTypes} checked by tsc 4 | */ 5 | import { NgModule, Directive, Attribute, Renderer2, Input, ElementRef } from '@angular/core'; 6 | var BemConfig = /** @class */ (function () { 7 | function BemConfig() { 8 | } 9 | return BemConfig; 10 | }()); 11 | export { BemConfig }; 12 | function BemConfig_tsickle_Closure_declarations() { 13 | /** @type {?} */ 14 | BemConfig.prototype.separators; 15 | /** @type {?} */ 16 | BemConfig.prototype.ignoreValues; 17 | /** @type {?} */ 18 | BemConfig.prototype.modCase; 19 | } 20 | var /** @type {?} */ separators = { 21 | el: '__', 22 | mod: '--', 23 | val: '-' 24 | }; 25 | var /** @type {?} */ ignoreValues = false; 26 | var /** @type {?} */ modCase = 'kebab'; 27 | /** 28 | * @param {?} str 29 | * @return {?} 30 | */ 31 | function modNameHandler(str) { 32 | switch (modCase) { 33 | case 'kebab': 34 | return str ? str.replace(/[A-Z]/g, function (s) { return '-' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 35 | case 'snake': 36 | return str ? str.replace(/[A-Z]/g, function (s) { return '_' + s.toLowerCase(); }).replace(/$\-/, '') : ''; 37 | default: 38 | return str; 39 | } 40 | } 41 | /** 42 | * @param {?} blockName 43 | * @param {?=} elemName 44 | * @param {?=} modName 45 | * @param {?=} modValue 46 | * @return {?} 47 | */ 48 | function generateClass(blockName, elemName, modName, modValue) { 49 | if (ignoreValues) { 50 | modValue = !!modValue; 51 | } 52 | if (typeof modValue !== 'string' && typeof modValue !== 'boolean') { 53 | modValue = !!modValue; 54 | } 55 | var /** @type {?} */ cls = blockName; 56 | if (elemName) { 57 | cls += separators.el + elemName; 58 | } 59 | if (modName) { 60 | modName = modNameHandler(modName); 61 | cls += separators.mod + modName; 62 | if (typeof (modValue) !== 'boolean' && modValue != null) { 63 | cls += separators.val + modValue; 64 | } 65 | } 66 | return cls; 67 | } 68 | /** 69 | * @param {?} mods 70 | * @return {?} 71 | */ 72 | function parseMods(mods) { 73 | if (typeof mods === 'string') { 74 | mods = mods.split(/\s+/); 75 | } 76 | if (Array.isArray(mods)) { 77 | var /** @type {?} */ arr = mods; 78 | mods = {}; 79 | arr.forEach(function (key) { 80 | mods[key] = true; 81 | }); 82 | } 83 | else if (typeof mods !== 'object') { 84 | return {}; 85 | } 86 | return mods; 87 | } 88 | /** 89 | * @param {?} blockName 90 | * @param {?} elemName 91 | * @param {?} mods 92 | * @param {?} oldMods 93 | * @param {?} element 94 | * @param {?} renderer 95 | * @return {?} 96 | */ 97 | function setMods(blockName, elemName, mods, oldMods, element, renderer) { 98 | Object.keys(mods).forEach(function (key) { 99 | if (oldMods[key]) { 100 | if (mods[key] === oldMods[key]) { 101 | return; 102 | } 103 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 104 | } 105 | if (mods[key]) { 106 | renderer.addClass(element.nativeElement, generateClass(blockName, elemName, key, mods[key])); 107 | } 108 | }); 109 | Object.keys(oldMods).forEach(function (key) { 110 | if (!(key in mods) && oldMods[key]) { 111 | renderer.removeClass(element.nativeElement, generateClass(blockName, elemName, key, oldMods[key])); 112 | } 113 | }); 114 | } 115 | var BlockDirective = /** @class */ (function () { 116 | function BlockDirective(element, renderer, name) { 117 | this.name = name; 118 | this.element = element; 119 | this.renderer = renderer; 120 | renderer.addClass(element.nativeElement, generateClass(name)); 121 | } 122 | /** 123 | * @return {?} 124 | */ 125 | BlockDirective.prototype.ngOnChanges = /** 126 | * @return {?} 127 | */ 128 | function () { 129 | if (JSON.stringify(this.mod) !== this._modSerialized) { 130 | this._modSerialized = JSON.stringify(this.mod); 131 | var /** @type {?} */ mods = this.mod; 132 | var _a = this, renderer = _a.renderer, element = _a.element, name_1 = _a.name; 133 | mods = parseMods(mods); 134 | setMods(name_1, '', mods, this._mods || {}, element, renderer); 135 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 136 | } 137 | }; 138 | BlockDirective.decorators = [ 139 | { type: Directive, args: [{ 140 | selector: '[block]', 141 | },] }, 142 | ]; 143 | /** @nocollapse */ 144 | BlockDirective.ctorParameters = function () { return [ 145 | { type: ElementRef }, 146 | { type: Renderer2 }, 147 | { type: String, decorators: [{ type: Attribute, args: ['block',] }] } 148 | ]; }; 149 | BlockDirective.propDecorators = { 150 | mod: [{ type: Input }] 151 | }; 152 | return BlockDirective; 153 | }()); 154 | export { BlockDirective }; 155 | function BlockDirective_tsickle_Closure_declarations() { 156 | /** @type {?} */ 157 | BlockDirective.prototype.element; 158 | /** @type {?} */ 159 | BlockDirective.prototype.renderer; 160 | /** @type {?} */ 161 | BlockDirective.prototype.name; 162 | /** @type {?} */ 163 | BlockDirective.prototype.mod; 164 | /** @type {?} */ 165 | BlockDirective.prototype._mods; 166 | /** @type {?} */ 167 | BlockDirective.prototype._modSerialized; 168 | } 169 | var ElemDirective = /** @class */ (function () { 170 | function ElemDirective(element, renderer, name, block) { 171 | this.blockName = block.name; 172 | this.name = name; 173 | this.element = element; 174 | this.renderer = renderer; 175 | renderer.addClass(element.nativeElement, generateClass(block.name, name)); 176 | } 177 | /** 178 | * @return {?} 179 | */ 180 | ElemDirective.prototype.ngOnChanges = /** 181 | * @return {?} 182 | */ 183 | function () { 184 | if (JSON.stringify(this.mod) !== this._modSerialized) { 185 | this._modSerialized = JSON.stringify(this.mod); 186 | var /** @type {?} */ mods = this.mod; 187 | var _a = this, renderer = _a.renderer, element = _a.element, blockName = _a.blockName, name_2 = _a.name; 188 | mods = parseMods(mods); 189 | setMods(blockName, name_2, mods, this._mods || {}, element, renderer); 190 | this._mods = this._mods === mods ? Object.assign({}, mods) : mods; 191 | } 192 | }; 193 | ElemDirective.decorators = [ 194 | { type: Directive, args: [{ 195 | selector: '[elem]', 196 | },] }, 197 | ]; 198 | /** @nocollapse */ 199 | ElemDirective.ctorParameters = function () { return [ 200 | { type: ElementRef }, 201 | { type: Renderer2 }, 202 | { type: String, decorators: [{ type: Attribute, args: ['elem',] }] }, 203 | { type: BlockDirective } 204 | ]; }; 205 | ElemDirective.propDecorators = { 206 | mod: [{ type: Input }] 207 | }; 208 | return ElemDirective; 209 | }()); 210 | export { ElemDirective }; 211 | function ElemDirective_tsickle_Closure_declarations() { 212 | /** @type {?} */ 213 | ElemDirective.prototype.element; 214 | /** @type {?} */ 215 | ElemDirective.prototype.renderer; 216 | /** @type {?} */ 217 | ElemDirective.prototype.blockName; 218 | /** @type {?} */ 219 | ElemDirective.prototype.name; 220 | /** @type {?} */ 221 | ElemDirective.prototype.mod; 222 | /** @type {?} */ 223 | ElemDirective.prototype._mods; 224 | /** @type {?} */ 225 | ElemDirective.prototype._modSerialized; 226 | } 227 | var ModDirective = /** @class */ (function () { 228 | function ModDirective() { 229 | } 230 | ModDirective.decorators = [ 231 | { type: Directive, args: [{ 232 | selector: '[mod]', 233 | },] }, 234 | ]; 235 | return ModDirective; 236 | }()); 237 | export { ModDirective }; 238 | var BemModule = /** @class */ (function () { 239 | function BemModule() { 240 | } 241 | /** 242 | * @param {?} data 243 | * @return {?} 244 | */ 245 | BemModule.config = /** 246 | * @param {?} data 247 | * @return {?} 248 | */ 249 | function (data) { 250 | if (!data) { 251 | return BemModule; 252 | } 253 | if (data.separators) { 254 | separators.el = data.separators[0] || '__'; 255 | separators.mod = data.separators[1] || '--'; 256 | separators.val = data.separators[2] || '-'; 257 | } 258 | if ('ignoreValues' in data) { 259 | ignoreValues = !!data.ignoreValues; 260 | } 261 | if (data.modCase) { 262 | if (!~['kebab', 'camel', 'snake'].indexOf(data.modCase)) { 263 | throw 'Wrong mod case. You can use only these cases: kebab, snake, camel'; 264 | } 265 | modCase = data.modCase; 266 | } 267 | return BemModule; 268 | }; 269 | BemModule.decorators = [ 270 | { type: NgModule, args: [{ 271 | declarations: [ 272 | BlockDirective, 273 | ElemDirective, 274 | ModDirective, 275 | ], 276 | exports: [ 277 | BlockDirective, 278 | ElemDirective, 279 | ModDirective, 280 | ] 281 | },] }, 282 | ]; 283 | return BemModule; 284 | }()); 285 | export { BemModule }; 286 | 287 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVtLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1iZW0vIiwic291cmNlcyI6WyJiZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RixJQUFBOzs7b0JBRkE7SUFNQyxDQUFBO0FBSkQscUJBSUM7Ozs7Ozs7OztBQUVELHFCQUFNLFVBQVUsR0FBRztJQUNqQixFQUFFLEVBQUUsSUFBSTtJQUNSLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLEdBQUc7Q0FDVCxDQUFDO0FBQ0YscUJBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN6QixxQkFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDOzs7OztBQUV0Qix3QkFBd0IsR0FBVztJQUNqQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVMsQ0FBQyxJQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRyxLQUFLLE9BQU87WUFDVixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFTLENBQUMsSUFBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0c7WUFDRSxN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QUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1NBQzVDO1FBRUQsRUFBRSxDQUFDLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0IsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3BDO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxtRUFBbUUsQ0FBQzthQUMzRTtZQUVELE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQztLQUNsQjs7Z0JBckNGLFFBQVEsU0FBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7cUJBQ2I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixZQUFZO3FCQUNiO2lCQUNGOztvQkFoTUQ7O1NBaU1hLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgRGlyZWN0aXZlLCBBdHRyaWJ1dGUsIFJlbmRlcmVyMiwgSW5wdXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEJlbUNvbmZpZyB7XG4gIHNlcGFyYXRvcnM/OiBBcnJheTxzdHJpbmc+O1xuICBpZ25vcmVWYWx1ZXM/OiBib29sZWFuO1xuICBtb2RDYXNlPzogc3RyaW5nO1xufVxuXG5jb25zdCBzZXBhcmF0b3JzID0ge1xuICBlbDogJ19fJyxcbiAgbW9kOiAnLS0nLFxuICB2YWw6ICctJ1xufTtcbmxldCBpZ25vcmVWYWx1ZXMgPSBmYWxzZTtcbmxldCBtb2RDYXNlID0gJ2tlYmFiJztcblxuZnVuY3Rpb24gbW9kTmFtZUhhbmRsZXIoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKG1vZENhc2UpIHtcbiAgICBjYXNlICdrZWJhYic6XG4gICAgICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uKHMpIHtyZXR1cm4gJy0nICsgcy50b0xvd2VyQ2FzZSgpOyB9KS5yZXBsYWNlKC8kXFwtLywgJycpIDogJyc7XG4gICAgY2FzZSAnc25ha2UnOlxuICAgICAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuICdfJyArIHMudG9Mb3dlckNhc2UoKTsgfSkucmVwbGFjZSgvJFxcLS8sICcnKSA6ICcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhc3MoYmxvY2tOYW1lOiBzdHJpbmcsIGVsZW1OYW1lPzogc3RyaW5nLCBtb2ROYW1lPzogc3RyaW5nLCBtb2RWYWx1ZT86IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgaWYgKGlnbm9yZVZhbHVlcykge1xuICAgIG1vZFZhbHVlID0gISFtb2RWYWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kVmFsdWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBtb2RWYWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgbW9kVmFsdWUgPSAhIW1vZFZhbHVlO1xuICB9XG5cbiAgbGV0IGNscyA9IGJsb2NrTmFtZTtcblxuICBpZiAoZWxlbU5hbWUpIHtcbiAgICBjbHMgKz0gc2VwYXJhdG9ycy5lbCArIGVsZW1OYW1lO1xuICB9XG5cbiAgaWYgKG1vZE5hbWUpIHtcbiAgICBtb2ROYW1lID0gbW9kTmFtZUhhbmRsZXIobW9kTmFtZSk7XG4gICAgY2xzICs9IHNlcGFyYXRvcnMubW9kICsgbW9kTmFtZTtcbiAgICBpZiAodHlwZW9mKG1vZFZhbHVlKSAhPT0gJ2Jvb2xlYW4nICYmIG1vZFZhbHVlICE9IG51bGwpIHtcbiAgICAgIGNscyArPSBzZXBhcmF0b3JzLnZhbCArIG1vZFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9kcyhtb2RzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG9iamVjdCkge1xuICBpZiAodHlwZW9mIG1vZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgbW9kcyA9IG1vZHMuc3BsaXQoL1xccysvKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgbGV0IGFyciA9IG1vZHM7XG5cbiAgICBtb2RzID0ge307XG5cbiAgICBhcnIuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgbW9kc1trZXldID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kcyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gbW9kcztcbn1cblxuZnVuY3Rpb24gc2V0TW9kcyhibG9ja05hbWU6IHN0cmluZywgZWxlbU5hbWU6IHN0cmluZywgbW9kczogb2JqZWN0LCBvbGRNb2RzOiBvYmplY3QsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgT2JqZWN0LmtleXMobW9kcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmIChvbGRNb2RzW2tleV0pIHtcbiAgICAgIGlmIChtb2RzW2tleV0gPT09IG9sZE1vZHNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG9sZE1vZHNba2V5XSkpO1xuICAgIH1cblxuICAgIGlmIChtb2RzW2tleV0pIHtcbiAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG1vZHNba2V5XSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMob2xkTW9kcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICghKGtleSBpbiBtb2RzKSAmJiBvbGRNb2RzW2tleV0pIHtcbiAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9ja05hbWUsIGVsZW1OYW1lLCBrZXksIG9sZE1vZHNba2V5XSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tibG9ja10nLFxufSlcbmV4cG9ydCBjbGFzcyBCbG9ja0RpcmVjdGl2ZSB7XG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIG1vZDogc3RyaW5nIHwgc3RyaW5nW10gfCBvYmplY3Q7XG4gIHByaXZhdGUgX21vZHM6IE9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kU2VyaWFsaXplZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIEBBdHRyaWJ1dGUoJ2Jsb2NrJykgbmFtZTogc3RyaW5nKSB7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXG4gICAgcmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudC5uYXRpdmVFbGVtZW50LCBnZW5lcmF0ZUNsYXNzKG5hbWUpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLm1vZCkgIT09IHRoaXMuX21vZFNlcmlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX21vZFNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm1vZCk7XG5cbiAgICAgIGxldCBtb2RzID0gdGhpcy5tb2Q7XG5cbiAgICAgIGxldCB7cmVuZGVyZXIsIGVsZW1lbnQsIG5hbWV9ID0gdGhpcztcblxuICAgICAgbW9kcyA9IHBhcnNlTW9kcyhtb2RzKTtcblxuICAgICAgc2V0TW9kcyhuYW1lLCAnJywgbW9kcywgdGhpcy5fbW9kcyB8fCB7fSwgZWxlbWVudCwgcmVuZGVyZXIpO1xuXG4gICAgICB0aGlzLl9tb2RzID0gdGhpcy5fbW9kcyA9PT0gbW9kcyA/IE9iamVjdC5hc3NpZ24oe30sIG1vZHMpIDogbW9kcztcbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2VsZW1dJyxcbn0pXG5leHBvcnQgY2xhc3MgRWxlbURpcmVjdGl2ZSB7XG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHVibGljIGJsb2NrTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgbW9kOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG9iamVjdDtcbiAgcHJpdmF0ZSBfbW9kczogT2JqZWN0O1xuICBwcml2YXRlIF9tb2RTZXJpYWxpemVkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgQEF0dHJpYnV0ZSgnZWxlbScpIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgYmxvY2s6IEJsb2NrRGlyZWN0aXZlKSB7XG5cbiAgICB0aGlzLmJsb2NrTmFtZSA9IGJsb2NrLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQubmF0aXZlRWxlbWVudCwgZ2VuZXJhdGVDbGFzcyhibG9jay5uYW1lLCBuYW1lKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpICE9PSB0aGlzLl9tb2RTZXJpYWxpemVkKSB7XG4gICAgICB0aGlzLl9tb2RTZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2QpO1xuXG4gICAgICBsZXQgbW9kcyA9IHRoaXMubW9kO1xuXG4gICAgICBsZXQge3JlbmRlcmVyLCBlbGVtZW50LCBibG9ja05hbWUsIG5hbWV9ID0gdGhpcztcblxuICAgICAgbW9kcyA9IHBhcnNlTW9kcyhtb2RzKTtcblxuICAgICAgc2V0TW9kcyhibG9ja05hbWUsIG5hbWUsIG1vZHMsIHRoaXMuX21vZHMgfHwge30sIGVsZW1lbnQsIHJlbmRlcmVyKTtcblxuICAgICAgdGhpcy5fbW9kcyA9IHRoaXMuX21vZHMgPT09IG1vZHMgPyBPYmplY3QuYXNzaWduKHt9LCBtb2RzKSA6IG1vZHM7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttb2RdJyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kRGlyZWN0aXZlIHt9XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEJsb2NrRGlyZWN0aXZlLFxuICAgIEVsZW1EaXJlY3RpdmUsXG4gICAgTW9kRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQmxvY2tEaXJlY3RpdmUsXG4gICAgRWxlbURpcmVjdGl2ZSxcbiAgICBNb2REaXJlY3RpdmUsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQmVtTW9kdWxlIHtcbiAgc3RhdGljIGNvbmZpZyhkYXRhOiBCZW1Db25maWcpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBCZW1Nb2R1bGU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuc2VwYXJhdG9ycykge1xuICAgICAgc2VwYXJhdG9ycy5lbCA9IGRhdGEuc2VwYXJhdG9yc1swXSB8fCAnX18nO1xuICAgICAgc2VwYXJhdG9ycy5tb2QgPSBkYXRhLnNlcGFyYXRvcnNbMV0gfHwgJy0tJztcbiAgICAgIHNlcGFyYXRvcnMudmFsID0gZGF0YS5zZXBhcmF0b3JzWzJdIHx8ICctJztcbiAgICB9XG5cbiAgICBpZiAoJ2lnbm9yZVZhbHVlcycgaW4gZGF0YSkge1xuICAgICAgaWdub3JlVmFsdWVzID0gISFkYXRhLmlnbm9yZVZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5tb2RDYXNlKSB7XG4gICAgICBpZiAoIX5bJ2tlYmFiJywgJ2NhbWVsJywgJ3NuYWtlJ10uaW5kZXhPZihkYXRhLm1vZENhc2UpKSB7XG4gICAgICAgIHRocm93ICdXcm9uZyBtb2QgY2FzZS4gWW91IGNhbiB1c2Ugb25seSB0aGVzZSBjYXNlczoga2ViYWIsIHNuYWtlLCBjYW1lbCc7XG4gICAgICB9XG5cbiAgICAgIG1vZENhc2UgPSBkYXRhLm1vZENhc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJlbU1vZHVsZTtcbiAgfVxufVxuIl19 --------------------------------------------------------------------------------