[
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules\njspm_packages\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n\n# Generated #\n!karma.conf.js\n!karma-test-shim.js\n*.js\n*.map\n*.d.ts\ntypings\ndist\ndist.tgz"
  },
  {
    "path": ".npmignore",
    "content": "# Node\nnode_modules\nnpm-debug.log\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "#Changelog\n\n## [v5.0.0](https://github.com/vinaygopinath/ng2-meta/releases/tag/v5.0.0)\n\n**Breaking change**: ng2-meta depends on Angular 6+ and rxjs 6+. Ensure that your site works with Angular 6 before you upgrade to this version.\n\n## [v4.0.0](https://github.com/vinaygopinath/ng2-meta/releases/tag/v4.0.0)\n\n**Breaking change**: All routes must contain `canActivate: [MetaGuard]` in their route configuration to notify `ng2-meta` when the route is about to change.\n\n* More consistent meta tag updates: Meta tags are now set *before* the route is activated. Fixes [#7](https://github.com/vinaygopinath/ng2-meta/issues/7)\n\n\n## [v3.0.1](https://github.com/vinaygopinath/ng2-meta/releases/tag/v3.0.1)\n\n* [WIP] [Server-side rendering] Remove dependency on window.document\n* Set `property` attribute for opengraph tags (and `name` attribute for all others)\n\n## [v3.0.0](https://github.com/vinaygopinath/ng2-meta/releases/tag/v3.0.0)\n\n* Angular 5.x compatibility + AOT support\n\n## [v2.0.3](https://github.com/vinaygopinath/ng2-meta/releases/tag/v2.0.3)\n\n* postInstall script fix ([@bergben](https://github.com/bergben)) + support for child routes ([@Chocobozzz](https://github.com/Chocobozzz))\n\n## [v2.0.2](https://github.com/vinaygopinath/ng2-meta/releases/tag/v2.0.2)\n\n##### Bugfixes\n\n* [#13](https://github.com/vinaygopinath/ng2-meta/issues/13) Attempt 2 at fixing the \"duplicate identifier\" error while installing ng2-meta. Thanks [@Chocobozzz](https://github.com/Chocobozzz)\n\n## [v2.0.1](https://github.com/vinaygopinath/ng2-meta/releases/tag/v2.0.1)\n\n##### Bugfixes\n\n* [#13](https://github.com/vinaygopinath/ng2-meta/issues/13) Fix \"duplicate identifier\" error while installing ng2-meta. Thanks [@Bioto](https://github.com/Bioto)\n\n## [v2.0.0](https://github.com/vinaygopinath/ng2-meta/releases/tag/v2.0.0)\n\n* [#11](https://github.com/vinaygopinath/ng2-meta/issues/11) Support for angular 2.0.0 and router 3.0.0. Thanks to [@bergben](https://github.com/bergben) once again, and the folks in the thread for their input.\n\nNote: This version has **breaking changes** (needed to support angular final). If, for some reason, you would like to continue using RC4, please use v1.0.0.\n\n## [v1.0.0](https://github.com/vinaygopinath/ng2-meta/releases/tag/v1.0.0)\n\n##### Bugfixes\n\n* [#1](https://github.com/vinaygopinath/ng2-meta/issues/1) Fixed \"No provider for meta.config\" issue resulting from a missing @Optional annotation. Thanks to [@bergben](https://github.com/bergben)"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Vinay Gopinath\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.MD",
    "content": "# ng2-meta\n\n[![Join the chat at https://gitter.im/ng2-meta/Lobby](https://badges.gitter.im/ng2-meta/Lobby.svg)](https://gitter.im/ng2-meta/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\nUpdate HTML meta tags for title, description and others automatically based on the route in your Angular app.\n\nng2-meta v5.0.0+ requires **Angular 6**.\nOn **Angular 5** or lower, use ng2-meta v4.0.0 (`npm install ng2-meta@4.0.0`)\n\nFor the AngularJS (1.x) module, check out [ngMeta](https://github.com/vinaygopinath/ngMeta)\n\n## Getting started\n\n### Install\nTo install this library, run:\n\n```bash\n$ npm install ng2-meta --save\n```\n\n### Modify routes\n\nAdd meta tags and `MetaGuard` to routes. By default, `title` and `description` values are duplicated for `og:title` and `og:description`, so there's no need to add them separately.\n<pre>\n<code>\n<strong>import { MetaGuard } from 'ng2-meta';</strong>\n\nconst routes: Routes = [\n  {\n    path: 'home',\n    component: HomeComponent,\n    <strong>canActivate: [MetaGuard],\n    data: {\n      meta: {\n        title: 'Home page',\n        description: 'Description of the home page'\n      }\n    }</strong>\n  },\n  {\n    path: 'dashboard',\n    component: DashboardComponent,\n    <strong>canActivate: [MetaGuard],\n    data: {\n      meta: {\n        title: 'Dashboard',\n        description: 'Description of the dashboard page',\n        'og:image': 'http://example.com/dashboard-image.png'\n      }\n    }</strong>\n  }\n];\n</code>\n</pre>\n\n### Import MetaModule\n\n<pre>\n<code>\n...\n<strong>import { MetaModule } from 'ng2-meta';</strong>\n\n@NgModule({\n  declarations: [\n    AppComponent,\n    ...\n  ],\n  imports: [\n    BrowserModule,\n    FormsModule,\n    HttpModule,\n    RouterModule.forRoot(routes),\n    <strong>MetaModule.forRoot()</strong>\n  ],\n  bootstrap: [AppComponent]\n})\n</code>\n</pre>\n\n### Update AppComponent\n\n<pre>\n<code>\n<strong>import { MetaService } from 'ng2-meta';</strong>\n\n@Component({\n  ...\n})\nexport class AppComponent {\n  constructor(<strong>private metaService: MetaService</strong>) {}\n}\n</code>\n</pre>\n\nYou're all set! ng2-meta will update the meta tags whenever the route changes.\n\n## Options\n\n### Set defaults\n\nSet default values for tags. These values are used when routes without `meta: {}` information are encountered.\n```typescript\nimport { MetaConfig, MetaService } from 'ng2-meta';\n\nconst metaConfig: MetaConfig = {\n  //Append a title suffix such as a site name to all titles\n  //Defaults to false\n  useTitleSuffix: true,\n  defaults: {\n    title: 'Default title for pages without meta in their route',\n    titleSuffix: ' | Site Name',\n    'og:image': 'http://example.com/default-image.png',\n    'any other': 'arbitrary tag can be used'\n  }\n};\n\n@NgModule({\n  declarations: [\n    AppComponent,\n    ...\n  ],\n  imports: [\n    ...,\n    MetaModule.forRoot(metaConfig)\n  ],\n  bootstrap: [AppComponent]\n})\n\n```\n\n### Change meta tags programmatically\n```typescript\nimport { Component, OnInit } from '@angular/core';\n\nclass ProductComponent implements OnInit {\n  ...\n  constructor(private metaService: MetaService) {}\n\n  ngOnInit() {\n    this.product = //HTTP GET for product in catalogue\n    this.metaService.setTitle('Product page for '+this.product.name);\n    this.metaService.setTag('og:image',this.product.imageURL);\n  }\n}\n```\n\n### Define fallback meta content in HTML\nWhile Google executes Javascript and extracts meta tags set by ng2-meta, many bots (like Facebook and Twitter) do not execute Javascript. Consider defining fallback meta tags in your HTML for such bots. The fallback content is overridden by ng2-meta in Javascript-enabled environments.\n\n```html\n<html>\n  <head>\n    <meta name=\"title\" content=\"Website Name\">\n    <meta name=\"og:title\" content=\"Website Name\">\n    <meta name=\"description\" content=\"General description of your site\">\n    <meta name=\"og:description\" content=\"General description of your site\">\n    <meta name=\"og:image\" content=\"http://example.com/fallback-image.png\">\n  </head>\n</html>\n```\n\n## Contribute\n\nIf you wish to contribute to this repo, please check out the [open issues](https://github.com/vinaygopinath/ng2-meta/issues).\n\nIf you notice a bug that has not already been reported or would like to make a feature request, please create a [new issue](https://github.com/vinaygopinath/ng2-meta/issues/new). This helps to start a discussion with the community and avoid duplication of effort before you make any changes.\n\n## Licence\n\nMIT © [Vinay Gopinath](http://vinaygopinath.me)\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ng2-meta\",\n  \"description\": \"Dynamic meta tags and SEO in Angular2\",\n  \"version\": \"5.0.0\",\n  \"scripts\": {\n    \"lint\": \"tslint src/**/*.ts -p tsconfig.json\",\n    \"build\": \"ng-packagr -p package.json\"\n  },\n  \"ngPackage\": {\n    \"lib\": {\n      \"entryFile\": \"src/index.ts\"\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/vinaygopinath/ng2-meta\"\n  },\n  \"author\": {\n    \"name\": \"Vinay Gopinath\",\n    \"email\": \"vinay@vinaygopinath.me\",\n    \"url\": \"https://www.vinaygopinath.me\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"angular2\",\n    \"seo\",\n    \"meta tags\",\n    \"open graph\"\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/vinaygopinath/ng2-meta/issues\"\n  },\n  \"peerDependencies\": {\n    \"@angular/common\": \"^6.0.0\",\n    \"@angular/compiler\": \"^6.0.0\",\n    \"@angular/compiler-cli\": \"^6.0.0\",\n    \"@angular/core\": \"^6.0.0\",\n    \"@angular/platform-browser\": \"^6.0.0\",\n    \"@angular/router\": \"^6.0.0\",\n    \"core-js\": \"^2.5.7\",\n    \"zone.js\": \"^0.8.26\",\n    \"rxjs\": \"^6.0\"\n  },\n  \"devDependencies\": {\n    \"@angular/compiler\": \"^6.0.0\",\n    \"@angular/compiler-cli\": \"^6.0.0\",\n    \"@types/node\": \"^6.0.46\",\n    \"codelyzer\": \"^4.4.2\",\n    \"ng-packagr\": \"^3.0.3\",\n    \"tsickle\": \"^0.32\",\n    \"tslint\": \"^5.10.0\",\n    \"typescript\": \">=2.7.2\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.9.0\",\n    \"npm\": \">= 3.0.0\"\n  }\n}"
  },
  {
    "path": "src/index.ts",
    "content": "export { MetaConfig } from './models/meta-config';\nexport { MetaService } from './meta.service';\nexport { MetaModule } from './meta.module';\nexport { MetaGuard } from './meta.guard';\n"
  },
  {
    "path": "src/meta.guard.ts",
    "content": "import { Inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router';\n\nimport { MetaService } from './meta.service';\nimport { MetaConfig } from './models/meta-config';\nimport { META_CONFIG_TOKEN, META_GUARD_IDENTIFIER } from './models/meta-constants';\n\n\n@Injectable()\nexport class MetaGuard implements CanActivate {\n\n  public static IDENTIFIER = META_GUARD_IDENTIFIER;\n\n  public constructor(\n    private router: Router,\n    private metaService: MetaService,\n    @Inject(META_CONFIG_TOKEN) private metaConfig: MetaConfig\n  ) {\n  }\n\n  public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n    this._processRouteMetaTags(route.data && route.data.meta);\n    return true;\n  }\n\n  private _processRouteMetaTags(meta: any = {}) {\n\n    if (meta.disableUpdate) {\n      return;\n    }\n\n    this.metaService.setTitle(meta.title, meta.titleSuffix);\n\n    Object.keys(meta).forEach(key => {\n      if (key === 'title' || key === 'titleSuffix') {\n        return;\n      }\n      this.metaService.setTag(key, meta[key]);\n    });\n\n    Object.keys(this.metaConfig.defaults).forEach(key => {\n      if (key in meta || key === 'title' || key === 'titleSuffix') {\n        return;\n      }\n      this.metaService.setTag(key, this.metaConfig.defaults[key]);\n    });\n  }\n}\n"
  },
  {
    "path": "src/meta.module.ts",
    "content": "import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { Optional, SkipSelf } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { MetaService } from './meta.service';\nimport { DEFAULT_META_CONFIG, MetaConfig } from './models/meta-config';\nimport { META_CONFIG_TOKEN } from './models/meta-constants';\nimport { MetaGuard } from './meta.guard';\n\n@NgModule({\n  imports: [\n    RouterModule\n  ]\n})\nexport class MetaModule {\n  public static forRoot(metaConfig: MetaConfig = DEFAULT_META_CONFIG): ModuleWithProviders {\n    return {\n      ngModule: MetaModule,\n      providers: [\n        { provide: META_CONFIG_TOKEN, useValue: metaConfig },\n        MetaGuard,\n        MetaService\n      ]\n    };\n  }\n\n  public constructor(@Optional() @SkipSelf() parentModule: MetaModule) {\n    if (parentModule) {\n      throw new Error(\n        'MetaModule is already loaded. Import it in the AppModule only');\n    }\n  }\n}\n"
  },
  {
    "path": "src/meta.service.ts",
    "content": "import { Inject, Injectable } from '@angular/core';\nimport { Title, Meta } from '@angular/platform-browser';\nimport { Router, ActivatedRoute, Route } from '@angular/router';\n\nimport { MetaConfig } from './models/meta-config';\nimport { META_CONFIG_TOKEN, META_GUARD_IDENTIFIER } from './models/meta-constants';\n\nconst isDefined = (val: any) => typeof val !== 'undefined';\n\n@Injectable()\nexport class MetaService {\n\n  public constructor(\n    private router: Router,\n    private meta: Meta,\n    private titleService: Title,\n    private activatedRoute: ActivatedRoute,\n    @Inject(META_CONFIG_TOKEN) private metaConfig: MetaConfig\n  ) {\n    this._warnMissingGuard();\n  }\n\n  public setTitle(title?: string, titleSuffix?: string): MetaService {\n    let titleContent = isDefined(title) ? title : (this.metaConfig.defaults['title'] || '');\n    if (this.metaConfig.useTitleSuffix) {\n      titleContent += isDefined(titleSuffix) ? titleSuffix : (this.metaConfig.defaults['titleSuffix'] || '');\n    }\n\n    this._updateMetaTag('title', titleContent);\n    this._updateMetaTag('og:title', titleContent);\n    this.titleService.setTitle(titleContent);\n\n    return this;\n  }\n\n  public setTag(tag: string, value: string): MetaService {\n    if (tag === 'title' || tag === 'titleSuffix') {\n      throw new Error(`Attempt to set ${tag} through 'setTag': 'title' and 'titleSuffix' are reserved tag names.\n      Please use 'MetaService.setTitle' instead`);\n    }\n    let content = isDefined(value) ? value : (this.metaConfig.defaults[tag] || '');\n    this._updateMetaTag(tag, content);\n    if (tag === 'description') {\n      this._updateMetaTag('og:description', content);\n    }\n\n    return this;\n  }\n\n  private _updateMetaTag(tag: string, value: string) {\n    let prop = 'name';\n    if (tag.startsWith(`og:`)) {\n      prop = 'property';\n    }\n\n    this.meta.updateTag({\n      [prop]: tag,\n      content: value\n    });\n  }\n\n  private _warnMissingGuard() {\n    if (isDefined(this.metaConfig.warnMissingGuard) && !this.metaConfig.warnMissingGuard) {\n      return;\n    }\n\n    const hasDefaultMeta = !!Object.keys(this.metaConfig.defaults).length;\n    const hasMetaGuardInArr = (it: any) => (it && it.IDENTIFIER === META_GUARD_IDENTIFIER);\n    let hasShownWarnings = false;\n    this.router.config.forEach((route: Route) => {\n      const hasRouteMeta = route.data && route.data.meta;\n      const showWarning = !isDefined(route.redirectTo)\n        && (hasDefaultMeta || hasRouteMeta)\n        && !(route.canActivate || []).some(hasMetaGuardInArr);\n\n      if (showWarning) {\n        console.warn(`Route with path \"${route.path}\" has ${hasRouteMeta ? '' : 'default '}meta tags, but does not use MetaGuard. \\\nPlease add MetaGuard to the canActivate array in your route configuration`);\n        hasShownWarnings = true;\n      }\n    });\n\n    if (hasShownWarnings) {\n      console.warn(`To disable these warnings, set metaConfig.warnMissingGuard: false \\\nin your ng2-meta MetaConfig passed to MetaModule.forRoot()`);\n    }\n  }\n\n}\n"
  },
  {
    "path": "src/models/meta-config.ts",
    "content": "export const DEFAULT_META_CONFIG: MetaConfig = {\n  useTitleSuffix: false,\n  warnMissingGuard: true,\n  defaults: {}\n};\n/**\n * Additional site-wide configuration of meta tags.\n *\n * Use this to enable adding a title suffix to the title of each route,\n * or to set default meta tags to be used when no equivalent meta tag\n * exists in the meta configuration of the route.\n *\n *\n * Default\n * ```\n * {\n *   useTitleSuffix: false,\n *   defaults: {}\n * }\n * ```\n */\nexport interface MetaConfig {\n  /**\n   * Flag to append an optional title suffix to the title.\n   * Default value: false\n   */\n  useTitleSuffix?: boolean;\n  /**\n   * Flag to show a warning for each route that is missing MetaGuard in its `canActivate` array when\n   * * the route contains `data: { meta: {} }`\n   *\n   * OR\n   *\n   * * the site-wide MetaConfig contains default meta tags\n   *\n   * Default value: true\n   */\n  warnMissingGuard?: boolean;\n  /**\n   * A dictionary of default meta tags and their values\n   */\n  defaults?: {\n    /**\n     * The default title, used when a route does not have its own titleSuffix.\n     */\n    title?: string;\n    /**\n     * The default titleSuffix, used when useTitleSuffix is set to true\n     * and a route does not have its own titleSuffix.\n     */\n    titleSuffix?: string;\n  } & { [key: string]: string | undefined; };\n}\n"
  },
  {
    "path": "src/models/meta-constants.ts",
    "content": "import { InjectionToken } from '@angular/core';\nimport { MetaConfig } from './meta-config';\n\nexport const META_CONFIG_TOKEN = new InjectionToken<MetaConfig>('meta config');\nexport const META_GUARD_IDENTIFIER = 'MetaGuard';\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"importHelpers\": true,\n    \"types\": [],\n    \"lib\": [\n      \"dom\",\n      \"es2015\"\n    ],\n    \"noImplicitAny\": true,\n    \"module\": \"es2015\",\n    \"target\": \"es2015\",\n    \"moduleResolution\": \"node\",\n    \"removeComments\": true,\n    \"outDir\": \"./dist\",\n    \"noEmitOnError\": false\n  },\n  \"angularCompilerOptions\": {\n    \"preserveWhitespaces\": false,\n    \"annotateForClosureCompiler\": true,\n    \"skipTemplateCodegen\": true,\n    \"strictMetadataEmit\": true,\n    \"fullTemplateTypeCheck\": true,\n    \"strictInjectionParameters\": true\n  }\n}"
  },
  {
    "path": "tslint.json",
    "content": "{\n  \"extends\": [\n    \"codelyzer\"\n  ],\n  \"rules\": {\n    \"class-name\": true,\n    \"comment-format\": [\n      true,\n      \"check-space\"\n    ],\n    \"curly\": true,\n    \"eofline\": true,\n    \"forin\": true,\n    \"indent\": [\n      true,\n      \"spaces\"\n    ],\n    \"label-position\": true,\n    \"max-line-length\": [\n      true,\n      140\n    ],\n    \"member-access\": false,\n    \"member-ordering\": [\n      true,\n      \"static-before-instance\",\n      \"variables-before-functions\"\n    ],\n    \"no-arg\": true,\n    \"no-bitwise\": true,\n    \"no-console\": [\n      true,\n      \"debug\",\n      \"info\",\n      \"time\",\n      \"timeEnd\",\n      \"trace\"\n    ],\n    \"no-construct\": true,\n    \"no-debugger\": true,\n    \"no-duplicate-variable\": true,\n    \"no-empty\": false,\n    \"no-eval\": true,\n    \"no-inferrable-types\": true,\n    \"no-shadowed-variable\": true,\n    \"no-string-literal\": false,\n    \"no-switch-case-fall-through\": true,\n    \"no-trailing-whitespace\": true,\n    \"no-unused-expression\": true,\n    \"no-unused-variable\": true,\n    \"no-use-before-declare\": true,\n    \"no-var-keyword\": true,\n    \"object-literal-sort-keys\": false,\n    \"one-line\": [\n      true,\n      \"check-open-brace\",\n      \"check-catch\",\n      \"check-else\",\n      \"check-whitespace\"\n    ],\n    \"quotemark\": [\n      true,\n      \"single\"\n    ],\n    \"radix\": true,\n    \"semicolon\": [\n      \"always\"\n    ],\n    \"triple-equals\": [\n      true,\n      \"allow-null-check\"\n    ],\n    \"typedef-whitespace\": [\n      true,\n      {\n        \"call-signature\": \"nospace\",\n        \"index-signature\": \"nospace\",\n        \"parameter\": \"nospace\",\n        \"property-declaration\": \"nospace\",\n        \"variable-declaration\": \"nospace\"\n      }\n    ],\n    \"variable-name\": false,\n    \"whitespace\": [\n      true,\n      \"check-branch\",\n      \"check-decl\",\n      \"check-operator\",\n      \"check-separator\",\n      \"check-type\"\n    ],\n    \"use-input-property-decorator\": true,\n    \"use-output-property-decorator\": true,\n    \"use-host-property-decorator\": true,\n    \"no-input-rename\": true,\n    \"no-output-rename\": true,\n    \"use-life-cycle-interface\": true,\n    \"use-pipe-transform-interface\": true,\n    \"component-class-suffix\": true,\n    \"directive-class-suffix\": true\n  }\n}"
  }
]