[
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"extends\": [\n    \"airbnb-base\"\n  ],\n  \"env\": {\n    \"es6\": true,\n    \"node\": true,\n    \"jest\": true,\n    \"cypress/globals\": true\n  },\n  \"plugins\": [\n    \"cypress\"\n  ],\n  \"settings\": {\n    \"import/core-modules\": [\n      \"jsdoc/env\"\n    ]\n  },\n  \"rules\": {\n    \"no-param-reassign\": [\"error\", {\n      \"props\": true,\n      \"ignorePropertyModificationsFor\": [\n        \"doclet\", // _isVueFile, ...\n        \"e\" // for e.doclet\n      ]\n    }],\n    \"no-underscore-dangle\": [\"error\", {\n      \"allow\": [\n        \"_isVueDoc\",\n        \"_vueProps\",\n        \"_vueData\",\n        \"_vueComputed\",\n        \"_vueEvent\"\n      ]\n    }]\n  }\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: Kocal\ncustom: paypal.me/HAlliaume\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: Node CI\n\non:\n    pull_request:\n        branches:\n            - '*'\n\njobs:\n    ci:\n        runs-on: ${{ matrix.os }}\n\n        strategy:\n            matrix:\n                os: [ubuntu-latest]\n                node-version: [10.x, 12.x, 14.x]\n                include:\n                    -   os: windows-latest\n                        node: 12.x\n\n        steps:\n            -   name: Set git to use LF\n                run: |\n                    git config --global core.autocrlf false\n                    git config --global core.eol lf\n                if: matrix.os == 'windows-latest'\n\n            -   uses: actions/checkout@v2\n\n            -   name: Use Node.js ${{ matrix.node-version }}\n                uses: actions/setup-node@v1\n                with:\n                    node-version: ${{ matrix.node-version }}\n\n            -   name: Get yarn cache directory\n                id: yarn-cache\n                run: echo \"::set-output name=dir::$(yarn cache dir)\"\n\n            -   name: Restore yarn cache (if available)\n                uses: actions/cache@v1\n                with:\n                    path: ${{ steps.yarn-cache.outputs.dir }}\n                    key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}\n                    restore-keys: |\n                        ${{ runner.os }}-yarn-\n\n            -   run: yarn install --frozen-lockfile\n\n            -   run: |\n                    cd example\n                    yarn install --frozen-lockfile\n                    yarn docs\n                    yarn docs:docstrap\n                    yarn docs:minami\n                    yarn docs:tui\n                    cd ..\n\n            -   run: yarn lint\n\n            -   run: yarn test -i && npx codecov\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n    push:\n        branches:\n            - master\n\njobs:\n    release:\n        runs-on: ubuntu-latest\n\n        steps:\n            -   uses: actions/checkout@v2\n\n            -   name: Install Node.js\n                uses: actions/setup-node@v1\n                with:\n                    node-version: 12.x\n\n            -   run: yarn install --frozen-lockfile\n\n            -   run: yarn semantic-release\n                env:\n                    NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n                    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\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# Bower dependency directory (https://bower.io/)\nbower_components\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# Typescript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\nexample/docs*\ncypress/screenshots/\ncypress/videos/\n"
  },
  {
    "path": ".releaserc",
    "content": "{\n  \"extends\": \"@kocal/semantic-release-preset\"\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Hugo Alliaume\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": "JSDoc for VueJS\n===============\n\n[![npm version](https://badge.fury.io/js/jsdoc-vuejs.svg)](https://badge.fury.io/js/jsdoc-vuejs)\n[![Build Status (Travis)](https://travis-ci.org/Kocal/jsdoc-vuejs.svg?branch=master)](https://travis-ci.org/Kocal/jsdoc-vuejs)\n[![Build Status (AppVeyor)](https://ci.appveyor.com/api/projects/status/a36pui6w1qhqq582?svg=true)](https://ci.appveyor.com/project/Kocal/jsdoc-vuejs)\n[![codecov](https://codecov.io/gh/Kocal/jsdoc-vuejs/branch/master/graph/badge.svg)](https://codecov.io/gh/Kocal/jsdoc-vuejs)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/850b7601f2bf4e8787a6aadbafa8afef)](https://www.codacy.com/app/kocal/jsdoc-vuejs?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=Kocal/jsdoc-vuejs&amp;utm_campaign=Badge_Grade)\n\nA JSDoc plugin for listing props, data, computed data, and methods from `.vue` files.\n\n:warning: This branch is for Vue 3. If you still use Vue 2, please see [`3.x` branch](https://github.com/Kocal/jsdoc-vuejs/tree/3.x).\n\n---\n\n## Requirements\n\n- Node 10+\n- Vue 3\n\n## Installation\n\n```bash\n$ npm install --save-dev jsdoc jsdoc-vuejs\n```\n\nYou also need to install `@vue/compiler-sfc` that match your Vue version:\n\n```bash\n$ npm install --save-dev @vue/compiler-sfc\n```\n\n## Usage\n\nYour should update your JSDoc configuration to enable JSDoc-VueJS:\n\n```json\n{\n  \"plugins\": [\n    \"node_modules/jsdoc-vuejs\"\n  ],\n  \"source\": {\n    \"includePattern\": \"\\\\.(vue|js)$\"\n  }\n}\n```\n\nUpdate your .vue files with one of the following tags:\n\n- `@vue-prop`\n- `@vue-data`\n- `@vue-computed`\n- `@vue-event`\n\nAll of those tags work the same way than [`@param` tag](http://usejsdoc.org/tags-param.html).\n\n```vue\n<template>\n  <div>Hello world!</div>\n</template>\n\n<script>\n  /**\n   * @vue-prop {Number} initialCounter - Initial counter's value\n   * @vue-prop {Number} [step=1] - Step\n   * @vue-data {Number} counter - Current counter's value\n   * @vue-computed {String} message\n   * @vue-event {Number} increment - Emit counter's value after increment\n   * @vue-event {Number} decrement - Emit counter's value after decrement\n   */\n  export default {\n    props: {\n      initialCounter: {\n        type: Number,\n        required: true,\n      },\n      step: {\n        type: Number,\n        default: 1,\n      },\n    },\n    data () {\n      return {\n        counter: 0,\n      }\n    },\n    computed: {\n      message() {\n        return `Current value is ${this.counter}`;\n      }\n    },\n    methods: {\n      increment() {\n        this.counter += 1;\n        this.$emit('increment', this.counter);\n      },\n      decrement() {\n        this.counter -= 1;\n        this.$emit('decrement', this.counter);\n      }\n    }\n  }\n</script>\n```\n\n## Supported templates\n\nThe rendering engine has been rewritten in v2, it can supports every JSDoc templates that exists.\n\nActually, it supports 4 templates:\n- Default\n- [Docstrap](https://github.com/docstrap/docstrap)\n- [Minami](https://github.com/nijikokun/minami)\n- [Tui](https://github.com/nhnent/tui.jsdoc-template)\n\nIf you use a template that is not supported, it will use the default one as a fallback.\n\nFeel free to open an issue/pull request if your template is not supported!\n\n<details>\n<summary>Default</summary>\n\n![](./screenshots/templates/default.png)\n\n</details>\n\n<details>\n<summary>Docstrap</summary>\n\n![](./screenshots/templates/docstrap.png)\n\n</details>\n\n<details>\n<summary>Minami</summary>\n\n![](./screenshots/templates/minami.png)\n\n</details>\n\n<details>\n<summary>Tui</summary>\n\n![](./screenshots/templates/tui.png)\n\n</details>\n\n## Testing\n\n### Install Dependencies\n\n```bash\n$ git clone https://github.com/Kocal/jsdoc-vuejs\n$ cd jsdoc-vuejs\n$ yarn install\n\n# For testing the example docs\n$ cd example\n$ yarn install\n```\n\n#### Generate documentations\n\n```bash\n$ cd example\n\n# Generate docs for every renderer\n$ yarn docs:all\n\n# or one by one\n$ yarn docs # default jsdoc template\n$ yarn docs:docstrap\n$ yarn docs:minami\n$ yarn docs:tui\n```\n\n### Unit\n\n```bash\n$ yarn test\n```\n\n### E2E\n\nBefore running integration tests with [Cypress](https://cypress.io), \nyou should generate documentation with all renderers:\n\n```bash\n$ cd example\n$ yarn docs:all\n```\n\nAnd then run Cypress:\n\n```bash\n$ cd ..\n$ yarn cypress run\n```\n\n## License\n\nMIT.\n"
  },
  {
    "path": "UPGRADE.md",
    "content": "## Upgrade from 1.x to 2.x\n\n### Configuration\n\nYou MUST remove `jsdoc-vuejs` configuration key inside JSDoc config file,\nbecause it is not used anymore.\n\n**Before:**\n```json\n{\n  \"plugins\": [\n    \"node_modules/jsdoc-vuejs\"\n  ],\n  \"source\": {\n    \"includePattern\": \"\\\\.(vue|js)$\"\n  },\n  \"jsdoc-vuejs\": {\n    \"followImports\": true // enable/disable require/import function \n  }\n}\n```\n\n**After:**\n```json\n{\n  \"plugins\": [\n    \"node_modules/jsdoc-vuejs\"\n  ],\n  \"source\": {\n    \"includePattern\": \"\\\\.(vue|js)$\"\n  }\n}\n```\n\n### Usage\n\nYou SHOULD NOT use `@vue` tag anymore. \n\nInstead, you should use `@vue-prop`, `@vue-data`, and `@vue-computed` like this:\n\n```vue\n<template>\n  <div>Hello world</div>\n</template>\n\n<script>\n/**\n* @vue-prop {Number} initialCounter\n* @vue-prop {Number} [step=1] Step\n* @vue-data {Number} counter - Current counter's value\n* @vue-computed {String} message A message\n*/\nexport default {\n  // ...\n}\n</script>\n``` \n"
  },
  {
    "path": "__tests__/core/__fixtures__/Component.vue",
    "content": "<template>\n  <div>Hello world</div>\n</template>\n\n<script>\n/**\n * @vue-data {String} [foo=bar] Foo description\n */\nexport default {\n  name: 'Component',\n  data() {\n    return {\n      foo: 'bar'\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "__tests__/core/__fixtures__/methods/Component/Component.js",
    "content": "\n/**\n * @vue-prop {String} test - test description\n * @vue-data {String} [foo=bar] - Foo description\n */\nexport default ({\n  name: 'component',\n  props: {\n    test: {\n      type: String,\n    },\n  },\n  data() {\n    return {\n      foo: 'bar',\n    };\n  },\n  methods: {},\n  computed: {},\n});\n"
  },
  {
    "path": "__tests__/core/__fixtures__/methods/Component.vue",
    "content": "<template>\n  <div>Hello world</div>\n</template>\n\n<script>\n/**\n * My component\n */\nexport default {\n  name: 'Component',\n  methods: {\n    /**\n     * Show a dialog\n     */\n    showDialog() {\n      // ...\n    }\n  }\n};\n</script>\n"
  },
  {
    "path": "__tests__/core/__fixtures__/methods/ComponentWithExportDefaultInTemplate.vue",
    "content": "<template>\n  <div>export default</div>\n</template>\n\n<script>\nexport default {\n  name: 'Component',\n  methods: {\n    /**\n     * Show a dialog\n     */\n    showDialog() {\n      // ...\n    }\n  }\n};\n</script>\n"
  },
  {
    "path": "__tests__/core/__fixtures__/methods/ComponentWithSpaces.vue",
    "content": "\n\n\n<template>\n  <div>Hello world</div>\n</template>\n\n\n\n<script>\n\n\n\n       export    default\n\n       {\n  name: 'Component',\n\n  methods: {\n\n\n    /**\n     * Show a dialog\n     */\n    showDialog() {\n      // ...\n    }\n  }\n};\n</script>\n"
  },
  {
    "path": "__tests__/core/__fixtures__/methods/ScriptBeforeTemplate.vue",
    "content": "<script>\n/**\n * @vue-data {String} [foo=bar] Foo description\n */\nexport default {\n  name: 'ScriptBeforeTemplate',\n  data() {\n    return {\n      foo: 'bar'\n    };\n  }\n};\n</script>\n\n<template>\n  <div>Hello world!</div>\n</template>\n"
  },
  {
    "path": "__tests__/core/__snapshots__/vueScriptExtractor.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`core.extractVueScript extract script 1`] = `\n\"\n/**\n * @vue-data {String} [foo=bar] Foo description\n */\nexport default {\n  name: 'Component',\n  data() {\n    return {\n      foo: 'bar'\n    }\n  }\n}\n\"\n`;\n"
  },
  {
    "path": "__tests__/core/getTemplatePath.test.js",
    "content": "/* eslint-disable no-console */\nconst { normalize } = require('path');\nconst getTemplatePath = require('../../lib/core/getTemplatePath');\n\ndescribe('guessTemplatePath', () => {\n  test('guess default', () => {\n    expect(getTemplatePath().endsWith(normalize('lib/templates/default.ejs'))).toBeTruthy();\n    expect(getTemplatePath('default').endsWith(normalize('lib/templates/default.ejs'))).toBeTruthy();\n  });\n\n  test('guess docstrap', () => {\n    const templatePath = getTemplatePath('./node_modules/ink-docstrap/template');\n\n    expect(templatePath.endsWith(normalize('lib/templates/docstrap.ejs'))).toBeTruthy();\n  });\n\n  test('guess minami', () => {\n    const templatePath = getTemplatePath('node_modules/minami');\n\n    expect(templatePath.endsWith(normalize('lib/templates/minami.ejs'))).toBeTruthy();\n  });\n\n  test('guess tui', () => {\n    const templatePath = getTemplatePath('node_modules/tui-jsdoc-template');\n\n    expect(templatePath.endsWith(normalize('lib/templates/tui.ejs'))).toBeTruthy();\n  });\n\n  test('guess unsupported', () => {\n    console.warn = jest.fn();\n\n    expect(getTemplatePath('foo-bar').endsWith(normalize('lib/templates/default.ejs'))).toBeTruthy();\n    expect(console.warn).toHaveBeenCalledWith('The template \"foo-bar\" is not recognized by jsdoc-vuejs. Using default template as fallback.');\n  });\n});\n"
  },
  {
    "path": "__tests__/core/renderer.test.js",
    "content": "const ejs = require('ejs');\nconst renderer = require('../../lib/core/renderer');\n\ndescribe('code.renderer', () => {\n  beforeEach(() => {\n    ejs.renderFile = jest.fn();\n  });\n\n  it('should call ejs render method', () => {\n    const cb = () => {};\n\n    renderer('my-template', {\n      props: ['props'], data: ['data'], computed: ['computed'], event: ['event'],\n    }, cb);\n\n    expect(ejs.renderFile).toHaveBeenCalledTimes(1);\n    expect(ejs.renderFile).toHaveBeenCalledWith(\n      'my-template',\n      {\n        props: ['props'],\n        data: ['data'],\n        computed: ['computed'],\n        event: ['event'],\n        // an helper function, it should be under keys \"utils\" or \"helpers\" btw\n        renderType: expect.any(Function),\n      },\n      cb,\n    );\n  });\n});\n"
  },
  {
    "path": "__tests__/core/seekExportDefaultLine.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst seekExportDefaultLine = require('../../lib/core/seekExportDefaultLine');\n\nconst readComponent = (componentPath, cb) => {\n  const filename = path.join(__dirname, `__fixtures__/methods/${componentPath}`);\n\n  fs.readFile(filename, 'utf8', (err, source) => cb(source));\n};\n\ndescribe('core.seekExportDefaultLine', () => {\n  test('A normal component', (done) => {\n    readComponent('Component.vue', (source) => {\n      expect(seekExportDefaultLine(source)).toBe(9);\n      done();\n    });\n  });\n\n  test('A normal component with a lot of spaces', (done) => {\n    readComponent('ComponentWithSpaces.vue', (source) => {\n      expect(seekExportDefaultLine(source)).toBe(14);\n      done();\n    });\n  });\n\n  test('When <script> is before <template>', (done) => {\n    readComponent('ScriptBeforeTemplate.vue', (source) => {\n      expect(seekExportDefaultLine(source)).toBe(5);\n      done();\n    });\n  });\n  test('When `export default` is inside <template>', (done) => {\n    readComponent('ComponentWithExportDefaultInTemplate.vue', (source) => {\n      expect(seekExportDefaultLine(source)).toBe(6);\n      done();\n    });\n  });\n  test('When component is js file', (done) => {\n    readComponent('Component/Component.js', (source) => {\n      expect(seekExportDefaultLine(source, 'Component.js')).toBe(6);\n      done();\n    });\n  });\n});\n"
  },
  {
    "path": "__tests__/core/vueScriptExtractor.js",
    "content": "const path = require('path');\nconst extractVueScript = require('../../lib/core/vueScriptExtractor');\n\ndescribe('core.extractVueScript', () => {\n  const filename = path.join(__dirname, '__fixtures__', 'Component.vue');\n\n  test('extract script', () => {\n    expect(extractVueScript(filename)).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "__tests__/stubs/jsdoc/lib/jsdoc/util/templateHelper.js",
    "content": "// Actually stub this module, to prevent follow error:\n// \"Cannot find module 'jsdoc/tag/dictionary' from 'templateHelper.js'\" :)\n\nmodule.exports = {};\n"
  },
  {
    "path": "config.js",
    "content": "const env = require('jsdoc/env');\nconst getTemplatePath = require('./lib/core/getTemplatePath');\n\nconst config = env.conf || {};\n\nconfig['jsdoc-vuejs'] = config['jsdoc-vuejs'] || {};\n\n// Detect JSDoc template if not specified\nif (!Object.prototype.hasOwnProperty.call(config['jsdoc-vuejs'], 'template')) {\n  config['jsdoc-vuejs'].template = getTemplatePath(env.opts.template || 'default');\n}\n\nmodule.exports = config;\n"
  },
  {
    "path": "cypress/fixtures/example.json",
    "content": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\",\n  \"body\": \"Fixtures are a great way to mock data for responses to routes\"\n}"
  },
  {
    "path": "cypress/integration/templates/default.spec.js",
    "content": "/* eslint-disable newline-per-chained-call */\n\ndescribe('Template: default', () => {\n  before(() => {\n    cy.visit('/../../../example/docs/module-better-components_BetterCounter.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.page-title')\n      .contains('Module: better-components/BetterCounter');\n\n    cy\n      .get('nav a[href=\"module-better-components_BetterCounter.html\"]')\n      .contains('better-components/BetterCounter');\n  });\n\n  it('should renders @desc properly', () => {\n    cy\n      .get('.container-overview')\n      .contains('BetterCounter component, like Counter component but better');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: 'Number',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: 'Array.&lt;String&gt;', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: 'Array.&lt;String&gt;', description: 'A list of bar' },\n      { name: '<code>message</code>', type: 'String', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should renders event correctly', () => {\n    const events = [\n      { name: '<code>increment</code>', type: 'Number', description: \"Emit counter's value after increment\" },\n      { name: '<code>decrement</code>', type: 'Number', description: \"Emit counter's value after decrement\" },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-event\"]').contains('Events');\n    cy.get('[data-jsdoc-vuejs=\"table-event\"]').as('table-event');\n\n    cy\n      .get('@table-event')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Payload Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-event')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        events.forEach((event, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(event.name);\n          expect($children.eq(1).html()).to.eq(event.type);\n          expect($children.eq(2).html()).to.eq(event.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n\n    cy.get('#decrement')\n      .contains('decrement()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line56\"]', 'line 56');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line48\"]', 'line 48');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .next('.description')\n      .next('h5')\n      .next('.params')\n      .next('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line65\"]', 'line 65');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\ndescribe('Template JS: default', () => {\n  /* eslint-disable newline-per-chained-call */\n  before(() => {\n    cy.visit('/../../../example/docs/module-CounterJS.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.page-title')\n      .contains('Module: CounterJS');\n\n    cy\n      .get('nav a[href=\"module-CounterJS.html\"]')\n      .contains('CounterJS');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: 'Number',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: 'Array.&lt;String&gt;', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: 'Array.&lt;String&gt;', description: 'A list of bar' },\n      { name: '<code>message</code>', type: 'String', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n\n    cy.get('#decrement')\n      .contains('decrement()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"js_CounterJS.js.html#line43\"]', 'line 43');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"js_CounterJS.js.html#line36\"]', 'line 36');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .next('.description')\n      .next('h5')\n      .next('.params')\n      .next('.details')\n      .contains('a[href=\"js_CounterJS.js.html#line51\"]', 'line 51');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\ndescribe('JS files rendered or not as Vue Component', () => {\n  before(() => {\n    cy.visit('/../../../example/docs/index.html');\n    cy.screenshot();\n  });\n\n  it('NotVueComponent should not be rendered as Vue component', () => {\n    cy.get('nav > ul > li a[href=\"global.html#helloWorld\"]').contains('helloWorld');\n    cy.get('nav > ul > li a[href=\"module-NotVueComponent.html\"]').should('not.exist');\n  });\n\n  it('NotVueComponent2 should not be rendered as Vue component', () => {\n    cy.visit('/../../../example/docs/module-NotVueComponent2.html');\n\n    cy.get('nav > ul > li a[href=\"module-NotVueComponent2.html\"]').contains('NotVueComponent2');\n    cy\n      .contains('h3', 'Methods')\n      .should('have.attr', 'class', 'subsection-title')\n      .next()\n      .contains('theMethod')\n      .next('h5')\n      .next('.params')\n      .next('.details')\n      .contains('a[href=\"js_NotVueComponent2.js.html#line11\"]', 'line 11');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/templates/docstrap.spec.js",
    "content": "/* eslint-disable newline-per-chained-call */\n\ndescribe('Template: docstrap', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-docstrap/module-better-components_BetterCounter.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.page-title')\n      .contains('Module: better-components/BetterCounter');\n\n    cy\n      .get('.nav .dropdown a[href=\"module-better-components_BetterCounter.html\"]')\n      .contains('better-components/BetterCounter');\n  });\n\n  it('should renders @desc properly', () => {\n    cy\n      .get('.container-overview')\n      .contains('BetterCounter component, like Counter component but better');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: 'Number',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props').should('have.class', 'table table-responsive table-hover table-striped');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data').should('have.class', 'table table-responsive table-hover table-striped');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: 'Array.&lt;String&gt;', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: 'Array.&lt;String&gt;', description: 'A list of bar' },\n      { name: '<code>message</code>', type: 'String', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed').should('have.class', 'table table-responsive table-hover table-striped');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should renders event correctly', () => {\n    const events = [\n      { name: '<code>increment</code>', type: 'Number', description: \"Emit counter's value after increment\" },\n      { name: '<code>decrement</code>', type: 'Number', description: \"Emit counter's value after decrement\" },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-event\"]').contains('Events');\n    cy.get('[data-jsdoc-vuejs=\"table-event\"]').as('table-event');\n\n    cy\n      .get('@table-event')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Payload Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-event')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        events.forEach((event, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(event.name);\n          expect($children.eq(1).html()).to.eq(event.type);\n          expect($children.eq(2).html()).to.eq(event.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n    cy.get('#decrement')\n      .contains('decrement()')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#sunlight-1-line-56\"]', 'line 56');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#sunlight-1-line-48\"]', 'line 48');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#sunlight-1-line-65\"]', 'line 65');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\ndescribe('Template JS: docstrap', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-docstrap/module-CounterJS.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.page-title')\n      .contains('Module: CounterJS');\n\n    cy\n      .get('.nav .dropdown a[href=\"module-CounterJS.html\"]')\n      .contains('CounterJS');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: 'Number',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props').should('have.class', 'table table-responsive table-hover table-striped');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: 'Number',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data').should('have.class', 'table table-responsive table-hover table-striped');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: 'Array.&lt;String&gt;', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: 'Array.&lt;String&gt;', description: 'A list of bar' },\n      { name: '<code>message</code>', type: 'String', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed').should('have.class', 'table table-responsive table-hover table-striped');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n    cy.get('#decrement')\n      .contains('decrement()')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"js_CounterJS.js.html#sunlight-1-line-43\"]', 'line 43');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"js_CounterJS.js.html#sunlight-1-line-36\"]', 'line 36');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"js_CounterJS.js.html#sunlight-1-line-51\"]', 'line 51');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\n\ndescribe('JS files rendered or not as Vue Component', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-docstrap/index.html');\n    cy.screenshot();\n  });\n\n  it('NotVueComponent should not be rendered as Vue component', () => {\n    cy.get('.nav .dropdown a[href=\"global.html#helloWorld\"]').contains('helloWorld');\n    cy.get('.nav .dropdown a[href=\"module-NotVueComponent.html\"]').should('not.exist');\n  });\n\n  it('NotVueComponent2 should not be rendered as Vue component', () => {\n    cy.visit('/../../../example/docs-docstrap/module-NotVueComponent2.html');\n\n    cy.get('.nav .dropdown a[href=\"module-NotVueComponent2.html\"]').contains('NotVueComponent2');\n\n    cy\n      .contains('h3', 'Methods')\n      .should('have.attr', 'class', 'subsection-title')\n      .next('dl')\n      .find('h4')\n      .contains('theMethod')\n      .parent()\n      .next('dd')\n      .find('.details')\n      .contains('a[href=\"js_NotVueComponent2.js.html#sunlight-1-line-11\"]', 'line 11');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/templates/minami.spec.js",
    "content": "/* eslint-disable newline-per-chained-call */\n\ndescribe('Template: minami', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-minami/module-better-components_BetterCounter.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.page-title')\n      .contains('better-components/BetterCounter');\n\n    cy\n      .get('.nav-item-name a[href=\"module-better-components_BetterCounter.html\"]')\n      .contains('better-components/BetterCounter');\n  });\n\n  it('should renders @desc properly', () => {\n    cy\n      .get('.container-overview')\n      .contains('BetterCounter component, like Counter component but better');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: '<code>Number</code>',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: '<code>Number</code>',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props').should('have.class', 'params');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(0).attr('class')).to.eq('name');\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: '<code>Number</code>',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data').should('have.class', 'params');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: '<code>Array.&lt;String&gt;</code>', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: '<code>Array.&lt;String&gt;</code>', description: 'A list of bar' },\n      { name: '<code>message</code>', type: '<code>String</code>', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed').should('have.class', 'params');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(0).attr('class')).to.eq('name');\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should renders event correctly', () => {\n    const events = [\n      { name: '<code>increment</code>', type: 'Number', description: \"Emit counter's value after increment\" },\n      { name: '<code>decrement</code>', type: 'Number', description: \"Emit counter's value after decrement\" },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-event\"]').contains('Events');\n    cy.get('[data-jsdoc-vuejs=\"table-event\"]').as('table-event');\n\n    cy\n      .get('@table-event')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Payload Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-event')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        events.forEach((event, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(event.name);\n          expect($children.eq(1).html()).to.eq(event.type);\n          expect($children.eq(2).html()).to.eq(event.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n    cy.get('#decrement')\n      .contains('decrement()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line56\"]', 'line 56');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line48\"]', 'line 48');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line65\"]', 'line 65');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\ndescribe('Template JS: minami', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-minami/module-CounterJS.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.page-title')\n      .contains('CounterJS');\n\n    cy\n      .get('.nav-item-name a[href=\"module-CounterJS.html\"]')\n      .contains('CounterJS');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: '<code>Number</code>',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: '<code>Number</code>',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props').should('have.class', 'params');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(0).attr('class')).to.eq('name');\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: '<code>Number</code>',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data').should('have.class', 'params');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: '<code>Array.&lt;String&gt;</code>', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: '<code>Array.&lt;String&gt;</code>', description: 'A list of bar' },\n      { name: '<code>message</code>', type: '<code>String</code>', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed').should('have.class', 'params');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(0).attr('class')).to.eq('name');\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n    cy.get('#decrement')\n      .contains('decrement()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"js_CounterJS.js.html#line43\"]', 'line 43');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"js_CounterJS.js.html#line36\"]', 'line 36');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .next('.description')\n      .next('.details')\n      .contains('a[href=\"js_CounterJS.js.html#line51\"]', 'line 51');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\n\ndescribe('JS files rendered or not as Vue Component', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-minami/index.html');\n    cy.screenshot();\n  });\n\n  it('NotVueComponent should not be rendered as Vue component', () => {\n    cy.get('.nav-item-name a[href=\"global.html#helloWorld\"]').contains('helloWorld');\n    cy.get('.nav-item-name a[href=\"module-NotVueComponent.html\"]').should('not.exist');\n  });\n\n  it('NotVueComponent2 should not be rendered as Vue component', () => {\n    cy.visit('/../../../example/docs-minami/module-NotVueComponent2.html');\n\n    cy.get('.nav-item-name a[href=\"module-NotVueComponent2.html\"]').contains('NotVueComponent2');\n    cy\n      .contains('h3', 'Methods')\n      .should('have.attr', 'class', 'subsection-title')\n      .next('.section-method')\n      .find('h4.name')\n      .contains('theMethod')\n      .next('dl.details')\n      .contains('a[href=\"js_NotVueComponent2.js.html#line11\"]', 'line 11');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/templates/tui.spec.js",
    "content": "/* eslint-disable newline-per-chained-call */\n\ndescribe('Template: tui', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-tui/module-better-components_BetterCounter.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.title')\n      .contains('Module: better-components/BetterCounter');\n\n    cy\n      .get('h2')\n      .contains('better-components/BetterCounter');\n\n    cy\n      .get('nav.lnb .lnb-api li a[href=\"module-better-components_BetterCounter.html\"]')\n      .contains('better-components/BetterCounter');\n  });\n\n  it('should renders @desc properly', () => {\n    cy\n      .get('.container-overview')\n      .contains('BetterCounter component, like Counter component but better');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: '<span class=\"param-type\">Number</span>',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: '<span class=\"param-type\">Number</span>',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props').should('have.class', 'params');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: '<span class=\"param-type\">Number</span>',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data').should('have.class', 'params');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: '<span class=\"param-type\">Array.&lt;String&gt;</span>', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: '<span class=\"param-type\">Array.&lt;String&gt;</span>', description: 'A list of bar' },\n      { name: '<code>message</code>', type: '<span class=\"param-type\">String</span>', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed').should('have.class', 'params');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should renders event correctly', () => {\n    const events = [\n      { name: '<code>increment</code>', type: '<span class=\"param-type\">Number</span>', description: \"Emit counter's value after increment\" },\n      { name: '<code>decrement</code>', type: '<span class=\"param-type\">Number</span>', description: \"Emit counter's value after decrement\" },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-event\"]').contains('Events');\n    cy.get('[data-jsdoc-vuejs=\"table-event\"]').as('table-event');\n\n    cy\n      .get('@table-event')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Payload Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-event')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        events.forEach((event, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(event.name);\n          expect($children.eq(1).html()).to.eq(event.type);\n          expect($children.eq(2).html()).to.eq(event.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n    cy.get('#decrement')\n      .contains('decrement()')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line56\"]', 'line 56');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line48\"]', 'line 48');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .contains('a[href=\"better-components_BetterCounter.vue.html#line65\"]', 'line 65');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\ndescribe('Template JS: tui', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-tui/module-CounterJS.html');\n    cy.screenshot();\n  });\n\n  it('should renders module name correctly', () => {\n    cy\n      .get('.title')\n      .contains('Module: CounterJS');\n\n    cy\n      .get('h2')\n      .contains('CounterJS');\n\n    cy\n      .get('nav.lnb .lnb-api li a[href=\"module-CounterJS.html\"]')\n      .contains('CounterJS');\n  });\n\n  it('should renders props correctly', () => {\n    const props = [\n      {\n        name: '<code>initialCounter</code>',\n        type: '<span class=\"param-type\">Number</span>',\n        defaultValue: '-',\n        required: '<b>Yes</b>',\n        description: '-',\n      },\n      {\n        name: '<code>step</code>',\n        type: '<span class=\"param-type\">Number</span>',\n        defaultValue: '<code>1</code>',\n        required: 'No',\n        description: 'Step',\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-props\"]').contains('Props').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-props\"]').as('table-props').should('have.class', 'params');\n\n    cy\n      .get('@table-props')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Required?')\n      .next().contains('Description');\n\n    cy\n      .get('@table-props')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(2);\n\n        props.forEach((prop, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(prop.name);\n          expect($children.eq(1).html()).to.eq(prop.type);\n          expect($children.eq(2).html()).to.eq(prop.defaultValue);\n          expect($children.eq(3).html()).to.eq(prop.required);\n          expect($children.eq(4).html()).to.eq(prop.description);\n        });\n      });\n  });\n\n  it('should renders data correctly', () => {\n    const data = [\n      {\n        name: '<code>counter</code>',\n        type: '<span class=\"param-type\">Number</span>',\n        defaultValue: '-',\n        description: \"Current counter's value\",\n      },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-data\"]').contains('Data').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-data\"]').as('table-data').should('have.class', 'params');\n\n    cy\n      .get('@table-data')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Default value')\n      .next().contains('Description');\n\n    cy\n      .get('@table-data')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(1);\n\n        data.forEach((d, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(d.name);\n          expect($children.eq(1).html()).to.eq(d.type);\n          expect($children.eq(2).html()).to.eq(d.defaultValue);\n          expect($children.eq(3).html()).to.eq(d.description);\n        });\n      });\n  });\n\n  it('should renders computed correctly', () => {\n    const computeds = [\n      { name: '<code>fooList</code>', type: '<span class=\"param-type\">Array.&lt;String&gt;</span>', description: 'A list of foo' },\n      { name: '<code>barList</code>', type: '<span class=\"param-type\">Array.&lt;String&gt;</span>', description: 'A list of bar' },\n      { name: '<code>message</code>', type: '<span class=\"param-type\">String</span>', description: 'A message' },\n    ];\n\n    cy.get('[data-jsdoc-vuejs=\"section-computed\"]').contains('Computed').should('have.class', 'subsection-title');\n    cy.get('[data-jsdoc-vuejs=\"table-computed\"]').as('table-computed').should('have.class', 'params');\n\n    cy\n      .get('@table-computed')\n      .find('> thead > tr > th')\n      .contains('Name')\n      .next().contains('Type')\n      .next().contains('Description');\n\n    cy\n      .get('@table-computed')\n      .find('> tbody > tr')\n      .then(($rows) => {\n        expect($rows).to.have.length(3);\n\n        computeds.forEach((computed, i) => {\n          const $row = $rows.eq(i);\n          const $children = $row.children();\n\n          expect($children.eq(0).html()).to.eq(computed.name);\n          expect($children.eq(1).html()).to.eq(computed.type);\n          expect($children.eq(2).html()).to.eq(computed.description);\n        });\n      });\n  });\n\n  it('should render methods properly', () => {\n    cy.contains('h3', 'Methods').should('have.attr', 'class', 'subsection-title');\n    cy.get('#decrement')\n      .contains('decrement()')\n      .contains('a[href=\"js_CounterJS.js.html#line43\"]', 'line 43');\n\n    cy.get('#increment')\n      .contains('increment()')\n      .contains('a[href=\"js_CounterJS.js.html#line36\"]', 'line 36');\n\n    cy.get('#showDialog')\n      .contains('showDialog(counter)')\n      .contains('a[href=\"js_CounterJS.js.html#line51\"]', 'line 51');\n\n    cy.contains('created()').should('not.exist');\n  });\n});\n\n\ndescribe('JS files rendered or not as Vue Component', () => {\n  before(() => {\n    cy.visit('/../../../example/docs-tui/index.html');\n    cy.screenshot();\n  });\n\n  it('NotVueComponent should not be rendered as Vue component', () => {\n    cy.get('.lnb-api a[href=\"global.html#helloWorld\"]').contains('helloWorld');\n    cy.get('.lnb-api a[href=\"module-NotVueComponent.html\"]').should('not.exist');\n  });\n\n  it('NotVueComponent2 should not be rendered as Vue component', () => {\n    cy.visit('/../../../example/docs-tui/module-NotVueComponent2.html');\n\n    cy.get('.lnb-api a[href=\"module-NotVueComponent2.html\"]').contains('NotVueComponent2');\n    cy\n      .contains('h3', 'Methods')\n      .should('have.attr', 'class', 'subsection-title')\n      .next('dl')\n      .find('.name')\n      .contains('theMethod')\n      .find('.container-source.members')\n      .contains('a[href=\"js_NotVueComponent2.js.html#line11\"]', 'line 11');\n  });\n});\n"
  },
  {
    "path": "cypress/plugins/index.js",
    "content": "// ***********************************************************\n// This example plugins/index.js can be used to load plugins\n//\n// You can change the location of this file or turn off loading\n// the plugins file with the 'pluginsFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/plugins-guide\n// ***********************************************************\n\n// This function is called when a project is opened or re-opened (e.g. due to\n// the project's config changing)\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = (on, config) => {\n  // `on` is used to hook into various events Cypress emits\n  // `config` is the resolved Cypress config\n};\n"
  },
  {
    "path": "cypress/support/commands.js",
    "content": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom commands and overwrite\n// existing commands.\n//\n// For more comprehensive examples of custom\n// commands please read more here:\n// https://on.cypress.io/custom-commands\n// ***********************************************\n//\n//\n// -- This is a parent command --\n// Cypress.Commands.add(\"login\", (email, password) => { ... })\n//\n//\n// -- This is a child command --\n// Cypress.Commands.add(\"drag\", { prevSubject: 'element'}, (subject, options) => { ... })\n//\n//\n// -- This is a dual command --\n// Cypress.Commands.add(\"dismiss\", { prevSubject: 'optional'}, (subject, options) => { ... })\n//\n//\n// -- This is will overwrite an existing command --\n// Cypress.Commands.overwrite(\"visit\", (originalFn, url, options) => { ... })\n"
  },
  {
    "path": "cypress/support/index.js",
    "content": "// ***********************************************************\n// This example support/index.js is processed and\n// loaded automatically before your test files.\n//\n// This is a great place to put global configuration and\n// behavior that modifies Cypress.\n//\n// You can change the location of this file or turn off\n// automatically serving support files with the\n// 'supportFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/configuration\n// ***********************************************************\n\n// Import commands.js using ES2015 syntax:\nimport './commands';\n\n// Alternatively you can use CommonJS syntax:\n// require('./commands')\n"
  },
  {
    "path": "cypress.json",
    "content": "{\n  \"projectId\": \"rryrv7\",\n  \"videoCompression\": false\n}\n"
  },
  {
    "path": "example/.jsdoc-docstrap.js",
    "content": "const config = Object.assign({}, require('./.jsdoc'));\n\nconfig.opts.destination = 'docs-docstrap';\nconfig.opts.template = './node_modules/ink-docstrap/template';\nconfig.templates = {\n  linenums: true,\n  outputSourceFiles: true,\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "example/.jsdoc-minami.js",
    "content": "const config = Object.assign({}, require('./.jsdoc'));\n\nconfig.opts.destination = 'docs-minami';\nconfig.opts.template = './node_modules/minami';\n\nmodule.exports = config;\n"
  },
  {
    "path": "example/.jsdoc-tui.js",
    "content": "const config = Object.assign({}, require('./.jsdoc'));\n\nconfig.opts.destination = 'docs-tui';\nconfig.opts.template = './node_modules/tui-jsdoc-template';\n\nmodule.exports = config;\n"
  },
  {
    "path": "example/.jsdoc.js",
    "content": "module.exports = {\n  plugins: [\n    '../',\n    'plugins/markdown',\n  ],\n  source: {\n    include: [\n      'src/',\n      'src/better-components',\n      'src/js',\n      'README.md',\n    ],\n    includePattern: '\\\\.(vue|js)$',\n  },\n  opts: {\n    encoding: 'utf8',\n  },\n};\n"
  },
  {
    "path": "example/README.md",
    "content": "Demo for [jsdoc-vuejs](https://github.com/Kocal/jsdoc-vuejs)."
  },
  {
    "path": "example/package.json",
    "content": "{\n  \"scripts\": {\n    \"docs\": \"jsdoc -d docs -c .jsdoc.js\",\n    \"docs:docstrap\": \"jsdoc -c .jsdoc-docstrap.js\",\n    \"docs:minami\": \"jsdoc -c .jsdoc-minami.js\",\n    \"docs:tui\": \"jsdoc -c .jsdoc-tui.js\",\n    \"docs:all\": \"rm -rf docs* && yarn docs && yarn docs:docstrap && yarn docs:minami && yarn docs:tui\"\n  },\n  \"dependencies\": {\n    \"ink-docstrap\": \"^1.3.2\",\n    \"jsdoc\": \"^3.6.3\",\n    \"minami\": \"^1.2.3\",\n    \"tui-jsdoc-template\": \"^1.2.2\",\n    \"vuex\": \"^3.0.1\"\n  }\n}\n"
  },
  {
    "path": "example/src/Counter.vue",
    "content": "<template>\n  <div>\n    {{ counter }}\n  </div>\n</template>\n\n<script>\n/**\n * @vue-data {Number} [counter=0] Counter value\n */\nexport default {\n  name: 'Counter',\n  data() {\n    return {\n      counter: 0,\n    };\n  },\n  mounted() {\n    this.interval = setInterval(() => this.increment(), 1000);\n  },\n  beforeDestroy() {\n    clearInterval(this.interval);\n  },\n  methods: {\n    /**\n     * Increment the internal counter.\n     */\n    increment() {\n      this.counter += 1;\n    }\n  }\n};\n</script>\n"
  },
  {
    "path": "example/src/better-components/BetterCounter.vue",
    "content": "<template>\n  <div>\n    {{ message }}\n    <button @click=\"increment\">+1</button>\n    <button @click=\"decrement\">-1</button>\n    <button @click=\"showDialog(counter)\">Show counter value in dialog</button>\n  </div>\n</template>\n\n<script>\n  import { mapState } from 'vuex';\n\n  /**\n   * @module better-components/BetterCounter\n   * @desc BetterCounter component, like Counter component but better\n   * @vue-prop {Number} initialCounter\n   * @vue-prop {Number} [step=1] Step\n   * @vue-data {Number} counter - Current counter's value\n   * @vue-computed {Array.<String>} fooList - A list of foo\n   * @vue-computed {Array.<String>} barList - A list of bar\n   * @vue-computed {String} message A message\n   * @vue-event {Number} increment - Emit counter's value after increment\n   * @vue-event {Number} decrement - Emit counter's value after decrement\n   */\n  export default {\n    props: {\n      initialCounter: {type: Number, required: true},\n      step: {type: Number, default: 1}\n    },\n    data() {\n      return {\n        counter: this.initialCounter\n      }\n    },\n    computed: {\n      ...mapState({\n        fooList: state => state.$_foo.fooList,\n        barList: state => state.$_foo.barList\n      }),\n      message() {\n        return `Counter: ${this.counter}`\n      }\n    },\n    methods: {\n      /**\n       * Increment counter and emit event 'increment'\n       */\n      increment() {\n        this.counter += this.step;\n        this.$emit('increment', this.counter);\n      },\n\n      /**\n       * Decrement counter and emit event 'decrement'\n       */\n      decrement() {\n        this.counter -= this.step;\n        this.$emit('decrement', this.counter);\n      },\n\n      /**\n       * Show a dialog displaying counter value.\n       * @param {Number} counter - Counter value\n       */\n      showDialog(counter) {\n        alert(`Counter value is ${counter}.`);\n      }\n    },\n\n    /**\n     * Counter.vue `created` hook.\n     */\n    created() {\n      console.info('Counter.vue: created()');\n    },\n    mounted() {\n      console.info('Counter.vue: mounted()');\n    }\n  };\n</script>\n"
  },
  {
    "path": "example/src/js/CounterJS.js",
    "content": "import { mapState } from 'vuex';\n\n/**\n * @module CounterJS\n * @vue-prop {Number} initialCounter\n * @vue-prop {Number} [step=1] Step\n * @vue-data {Number} counter - Current counter's value\n * @vue-computed {Array.<String>} fooList - A list of foo\n * @vue-computed {Array.<String>} barList - A list of bar\n * @vue-computed {String} message A message\n */\nexport default {\n  name: 'CounterJS',\n  props: {\n    initialCounter: { type: Number, required: true },\n    step: { type: Number, default: 1 },\n  },\n  data() {\n    return {\n      counter: this.initialCounter,\n    };\n  },\n  computed: {\n    ...mapState({\n      fooList: state => state.$_foo.fooList,\n      barList: state => state.$_foo.barList,\n    }),\n    message() {\n      return `Counter: ${this.counter}`;\n    },\n  },\n  methods: {\n    /**\n     * Increment counter.\n     */\n    increment() {\n      this.counter += this.step;\n    },\n\n    /**\n     * Decrement counter.\n     */\n    decrement() {\n      this.counter -= this.step;\n    },\n\n    /**\n     * Show a dialog displaying counter value.\n     * @param {Number} counter - Counter value\n     */\n    showDialog(counter) {\n      alert(`Counter value is ${counter}.`);\n    },\n  },\n\n  /**\n   * Counter.vue `created` hook.\n   */\n  created() {\n    console.info('Counter.vue: created()');\n  },\n  mounted() {\n    console.info('Counter.vue: mounted()');\n  },\n};\n"
  },
  {
    "path": "example/src/js/NotVueComponent.js",
    "content": "import NotVueComponent2 from './NotVueComponent2';\n\nNotVueComponent2.theMethod('123');\n\n/**\n * @return {Boolean}\n */\nconst helloWorld = () => {\n  console.log('Hello world');\n  return false;\n};\n\nexport {\n  helloWorld,\n};\n"
  },
  {
    "path": "example/src/js/NotVueComponent2.js",
    "content": "/**\n * @module NotVueComponent2\n */\nmodule.exports = {\n  state: {\n    foo: 'bar',\n  },\n  /**\n   * @param {String} i\n   */\n  theMethod(i) {\n    console.log(i);\n  },\n};\n"
  },
  {
    "path": "index.js",
    "content": "const { join } = require('path');\nconst config = require('./config');\nconst render = require('./lib/core/renderer');\nconst extractVueScript = require('./lib/core/vueScriptExtractor');\nconst seekExportDefaultLine = require('./lib/core/seekExportDefaultLine');\nconst { isSingleFileComponent, isJSComponent } = require('./lib/core/issers');\nconst vueDataTag = require('./lib/tags/vue-data');\nconst vuePropTag = require('./lib/tags/vue-prop');\nconst vueComputedTag = require('./lib/tags/vue-computed');\nconst vueEventTag = require('./lib/tags/vue-event');\n\n// Used to compute good line number for Vue methods\nconst exportDefaultLines = {};\nconst mainDocletLines = {};\n\nexports.handlers = {\n  beforeParse(e) {\n    if (/\\.vue$/.test(e.filename)) {\n      exportDefaultLines[e.filename] = seekExportDefaultLine(e.source, e.filename);\n      e.source = extractVueScript(e.filename);\n    }\n  },\n  newDoclet(e) {\n    const fileIsSingleFileComponent = isSingleFileComponent(e.doclet);\n    const fileIsJSComponent = isJSComponent(e.doclet);\n    if (!fileIsSingleFileComponent && !fileIsJSComponent) {\n      return;\n    }\n\n    const fullPath = join(e.doclet.meta.path, e.doclet.meta.filename);\n    const componentName = e.doclet.meta.filename.replace(/\\.(vue|js)$/, '');\n\n    // The main doclet before `export default {}`\n    if (e.doclet.longname === 'module.exports') {\n      e.doclet.kind = 'module';\n      e.doclet.name = componentName;\n      e.doclet.alias = componentName;\n      e.doclet.longname = `module:${componentName}`;\n    }\n\n    if (\n      !/[.~#]/.test(e.doclet.longname) // filter component's properties and member, not the best way but it werks\n      && e.doclet.longname.startsWith('module:')\n    ) {\n      mainDocletLines[fullPath] = e.doclet.meta.lineno;\n    }\n\n    // It can be the main doclet before `export default {}`\n    // with at least one `@vue-*` tag\n    if (e.doclet._isVueDoc) {\n      const { template } = config['jsdoc-vuejs'];\n      const data = {\n        props: e.doclet._vueProps || [],\n        data: e.doclet._vueData || [],\n        computed: e.doclet._vueComputed || [],\n        event: e.doclet._vueEvent || [],\n      };\n\n      render(template, data, (err, str) => {\n        if (err) throw err;\n\n        e.doclet.description = (e.doclet.description || '') + str;\n      });\n\n      // Remove meta for not rendering source for this doclet\n      delete e.doclet.meta;\n    }\n\n    // Methods and hooks\n    if (e.doclet.kind === 'function' && 'memberof' in e.doclet) {\n      if (e.doclet.memberof.endsWith('.methods')) {\n        e.doclet.scope = 'instance';\n        e.doclet.memberof = e.doclet.memberof.replace(/\\.methods$/, ''); // force method to be displayed\n        if (fileIsSingleFileComponent) {\n          e.doclet.meta.lineno += exportDefaultLines[fullPath] - mainDocletLines[fullPath];\n        }\n      } else {\n        e.doclet.memberof = null; // don't include Vue hooks\n      }\n    }\n  },\n};\n\nexports.defineTags = function defineTags(dictionary) {\n  dictionary.defineTag(vueDataTag.name, vueDataTag.options);\n  dictionary.defineTag(vuePropTag.name, vuePropTag.options);\n  dictionary.defineTag(vueComputedTag.name, vueComputedTag.options);\n  dictionary.defineTag(vueEventTag.name, vueEventTag.options);\n};\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  bail: true,\n  verbose: !process.env.CI,\n  collectCoverage: !!process.env.CI,\n  collectCoverageFrom: [\n    'lib/core/*.js',\n  ],\n  testPathIgnorePatterns: [\n    '/node_modules/',\n    '/__fixtures__/',\n    '/__tests__/stubs',\n    '/cypress/',\n  ],\n  moduleNameMapper: {\n    'jsdoc/(.*)': '<rootDir>/__tests__/stubs/jsdoc/$1.js',\n  },\n};\n"
  },
  {
    "path": "lib/core/getTemplatePath.js",
    "content": "const { resolve } = require('path');\n\nmodule.exports = function getTemplatePath(template) {\n  // eslint-disable-next-line no-param-reassign\n  template = template || 'default';\n\n  const templateFilename = (() => {\n    switch (true) {\n      case template === 'default':\n        return 'default.ejs';\n      case /ink-docstrap\\/template/.test(template):\n        return 'docstrap.ejs';\n      case /minami/.test(template):\n        return 'minami.ejs';\n      case /tui-jsdoc-template/.test(template):\n        return 'tui.ejs';\n      default:\n        // eslint-disable-next-line no-console\n        console.warn(`The template \"${template}\" is not recognized by jsdoc-vuejs. Using default template as fallback.`);\n        return 'default.ejs';\n    }\n  })();\n\n  const path = resolve(__dirname, '../templates', templateFilename);\n\n  return resolve(path);\n};\n"
  },
  {
    "path": "lib/core/issers.js",
    "content": "const path = require('path');\n\nconst hasVueTagRE = /\\s*\\*\\s*@vue/;\n\n// Useful because we use `@vue` tag from first doclet of a .js file\n// to determine if this file is a Vue Component.\n/**\n * @type {Object.<String, Boolean>}\n */\nconst jsComponentsCache = {};\n\n/**\n * @param {Doclet} doclet\n */\nfunction isSingleFileComponent(doclet) {\n  return doclet.meta.filename.endsWith('.vue');\n}\n\n/**\n * @param {Doclet} doclet\n */\nfunction isJSComponent(doclet) {\n  const fullPath = path.join(doclet.meta.path, doclet.meta.filename);\n\n  if (fullPath in jsComponentsCache) {\n    return jsComponentsCache[fullPath];\n  }\n\n  const res = doclet.meta.filename.endsWith('.js') && hasVueTagRE.test(doclet.comment || '');\n\n  if (res) {\n    jsComponentsCache[fullPath] = true;\n  }\n\n  return res;\n}\n\nmodule.exports = {\n  isSingleFileComponent,\n  isJSComponent,\n};\n"
  },
  {
    "path": "lib/core/renderer.js",
    "content": "const ejs = require('ejs');\nconst renderType = require('../templates/utils/renderType');\n\nmodule.exports = function render(template, {\n  props, data, computed, event,\n}, cb) {\n  ejs.renderFile(\n    template,\n    {\n      renderType,\n      props,\n      data,\n      computed,\n      event,\n    },\n    cb,\n  );\n};\n"
  },
  {
    "path": "lib/core/seekExportDefaultLine.js",
    "content": "/* eslint-disable no-continue */\n\nmodule.exports = function seekExportDefaultLine(source, filename) {\n  let inScript = filename ? filename.endsWith('.js') : false;\n\n  // eslint-disable-next-line no-restricted-syntax\n  for (const [i, line] of source.split(/\\r?\\n/).entries()) {\n    if (line.trim() === '') {\n      continue;\n    }\n\n    if (/<script[^>]*>/.test(line)) {\n      inScript = true;\n    } else if (!inScript && /<\\/script>/.test(line)) {\n      inScript = false;\n    }\n\n    if (inScript && /export\\s+default/.test(line)) {\n      return i + 1; // index starts at 0, but file's lines start at 1\n    }\n  }\n\n  return 0;\n};\n"
  },
  {
    "path": "lib/core/vueScriptExtractor.js",
    "content": "const fs = require('fs');\nconst compiler = require('@vue/compiler-sfc');\n\nmodule.exports = function extractVueScript(filename) {\n  const source = fs.readFileSync(filename, 'utf8');\n  const parsedComponent = compiler.parse(source);\n  const scriptContent = parsedComponent.descriptor.script ? parsedComponent.descriptor.script.content : '';\n\n  return scriptContent;\n};\n"
  },
  {
    "path": "lib/tags/vue-computed.js",
    "content": "exports.name = 'vue-computed';\n\nexports.options = {\n  canHaveType: true,\n  canHaveName: true,\n  onTagged(doclet, tag) {\n    doclet._isVueDoc = true;\n    doclet._vueComputed = doclet._vueComputed || [];\n    doclet._vueComputed.push(tag.value || {});\n  },\n};\n"
  },
  {
    "path": "lib/tags/vue-data.js",
    "content": "exports.name = 'vue-data';\n\nexports.options = {\n  canHaveType: true,\n  canHaveName: true,\n  onTagged(doclet, tag) {\n    doclet._isVueDoc = true;\n    doclet._vueData = doclet._vueData || [];\n    doclet._vueData.push(tag.value || {});\n  },\n};\n"
  },
  {
    "path": "lib/tags/vue-event.js",
    "content": "exports.name = 'vue-event';\n\nexports.options = {\n  canHaveType: true, // type of event-payload\n  canHaveName: true, // name of emitted event\n  onTagged(doclet, tag) {\n    doclet._isVueDoc = true;\n    doclet._vueEvent = doclet._vueEvent || [];\n    doclet._vueEvent.push(tag.value || {});\n  },\n};\n"
  },
  {
    "path": "lib/tags/vue-prop.js",
    "content": "exports.name = 'vue-prop';\n\nexports.options = {\n  canHaveType: true,\n  canHaveName: true,\n  onTagged(doclet, tag) {\n    doclet._isVueDoc = true;\n    doclet._vueProps = doclet._vueProps || [];\n    doclet._vueProps.push(tag.value || {});\n  },\n};\n"
  },
  {
    "path": "lib/templates/default.ejs",
    "content": "</p></div></div> <%# Prematurely close JSDoc default template tags %>\n\n<% if(props.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-props\">Props</h3>\n<table data-jsdoc-vuejs=\"table-props\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Default value</th>\n        <th>Required?</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% props.forEach(function(prop) { %><tr>\n        <td><code><%- prop.name %></code></td>\n        <td><%- renderType(prop.type) %></td>\n        <td><%- typeof prop.defaultvalue === 'undefined' ? '-' : `<code>${prop.defaultvalue}</code>` %></td>\n        <td><%- prop.optional ? 'No' : '<b>Yes</b>' %></td>\n        <td><%- typeof prop.description === 'undefined' ? '-' : prop.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(data.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-data\">Data</h3>\n<table data-jsdoc-vuejs=\"table-data\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Default value</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% data.forEach(function(d) { %><tr>\n        <td><code><%- d.name %></code></td>\n        <td><%- renderType(d.type) %></td>\n        <td><%- typeof d.defaultvalue === 'undefined' ? '-' : `<code>${d.defaultvalue}</code>` %></td>\n        <td><%- typeof d.description === 'undefined' ? '-' : d.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(computed.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-computed\">Computed</h3>\n<table data-jsdoc-vuejs=\"table-computed\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% computed.forEach(function(c) { %><tr>\n        <td><code><%- c.name %></code></td>\n        <td><%- renderType(c.type) %></td>\n        <td><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n\n<% if(event.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-event\">Events</h3>\n<table data-jsdoc-vuejs=\"table-event\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Payload Type</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% event.forEach(function(c) { %><tr>\n        <td><code><%- c.name %></code></td>\n        <td><%- renderType(c.type) %></td>\n        <td><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<div class=\"container-overview\"><div><p> <%# Re-open JSDoc template tags %>\n"
  },
  {
    "path": "lib/templates/docstrap.ejs",
    "content": "</p></div></div> <%# Prematurely close JSDoc default template tags %>\n\n<% if(props.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-props\">Props</h3>\n<table class=\"table table-responsive table-hover table-striped\" data-jsdoc-vuejs=\"table-props\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Default value</th>\n        <th>Required?</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% props.forEach(function(prop) { %><tr>\n        <td><code><%- prop.name %></code></td>\n        <td><%- renderType(prop.type) %></td>\n        <td><%- typeof prop.defaultvalue === 'undefined' ? '-' : `<code>${prop.defaultvalue}</code>` %></td>\n        <td><%- prop.optional ? 'No' : '<b>Yes</b>' %></td>\n        <td><%- typeof prop.description === 'undefined' ? '-' : prop.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(data.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-data\">Data</h3>\n<table class=\"table table-responsive table-hover table-striped\" data-jsdoc-vuejs=\"table-data\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Default value</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% data.forEach(function(d) { %><tr>\n        <td><code><%- d.name %></code></td>\n        <td><%- renderType(d.type) %></td>\n        <td><%- typeof d.defaultvalue === 'undefined' ? '-' : `<code>${d.defaultvalue}</code>` %></td>\n        <td><%- typeof d.description === 'undefined' ? '-' : d.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(computed.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-computed\">Computed</h3>\n<table class=\"table table-responsive table-hover table-striped\" data-jsdoc-vuejs=\"table-computed\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% computed.forEach(function(c) { %><tr>\n        <td><code><%- c.name %></code></td>\n        <td><%- renderType(c.type) %></td>\n        <td><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(event.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-event\">Events</h3>\n<table data-jsdoc-vuejs=\"table-event\" class=\"table table-responsive table-hover table-striped\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Payload Type</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% event.forEach(function(c) { %><tr>\n        <td><code><%- c.name %></code></td>\n        <td><%- renderType(c.type) %></td>\n        <td><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<div class=\"container-overview\"><div><p> <%# Re-open JSDoc template tags %>\n"
  },
  {
    "path": "lib/templates/minami.ejs",
    "content": "</p></div></div> <%# Prematurely close JSDoc default template tags %>\n\n<% if(props.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-props\">Props</h3>\n<table class=\"params\" data-jsdoc-vuejs=\"table-props\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Default value</th>\n        <th>Required?</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% props.forEach(function(prop) { %><tr>\n        <td class=\"name\"><code><%- prop.name %></code></td>\n        <td><code><%- renderType(prop.type) %></code></td>\n        <td><%- typeof prop.defaultvalue === 'undefined' ? '-' : `<code>${prop.defaultvalue}</code>` %></td>\n        <td><%- prop.optional ? 'No' : '<b>Yes</b>' %></td>\n        <td><%- typeof prop.description === 'undefined' ? '-' : prop.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(data.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-data\">Data</h3>\n<table class=\"params\" data-jsdoc-vuejs=\"table-data\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Default value</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% data.forEach(function(d) { %><tr>\n        <td class=\"name\"><code><%- d.name %></code></td>\n        <td><code><%- renderType(d.type) %></code></td>\n        <td><%- typeof d.defaultvalue === 'undefined' ? '-' : `<code>${d.defaultvalue}</code>` %></td>\n        <td><%- typeof d.description === 'undefined' ? '-' : d.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(computed.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-computed\">Computed</h3>\n<table class=\"params\" data-jsdoc-vuejs=\"table-computed\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Type</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% computed.forEach(function(c) { %><tr>\n        <td class=\"name\"><code><%- c.name %></code></td>\n        <td><code><%- renderType(c.type) %></code></td>\n        <td><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<% if(event.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-event\">Events</h3>\n<table class=\"params\" data-jsdoc-vuejs=\"table-event\">\n    <thead>\n    <tr>\n        <th>Name</th>\n        <th>Payload Type</th>\n        <th>Description</th>\n    </tr>\n    </thead>\n    <tbody><% event.forEach(function(c) { %><tr>\n        <td><code><%- c.name %></code></td>\n        <td><%- renderType(c.type) %></td>\n        <td><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n    </tr><% }) %></tbody>\n</table>\n<% } %>\n\n<div class=\"container-overview\"><div><p> <%# Re-open JSDoc template tags %>\n"
  },
  {
    "path": "lib/templates/tui.ejs",
    "content": "</p></div></div> <%# Prematurely close JSDoc default template tags %>\n\n<style>\n.container-overview {\n    display: none;\n}\n\n.main section article table td.name,\n.main section article table td.type,\n.main section article table td.attributes,\n.main section article table td.default {\n    max-width: none;\n}\n</style>\n\n<% if(props.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-props\">Props</h3>\n<div class=\"container-params\">\n    <table class=\"params\" data-jsdoc-vuejs=\"table-props\">\n        <thead>\n        <tr>\n            <th>Name</th>\n            <th>Type</th>\n            <th>Default value</th>\n            <th>Required?</th>\n            <th class=\"last\">Description</th>\n        </tr>\n        </thead>\n        <tbody><% props.forEach(function(prop) { %><tr>\n            <td class=\"name\"><code><%- prop.name %></code></td>\n            <td class=\"type\"><span class=\"param-type\"><%- renderType(prop.type) %></span></td>\n            <td class=\"description\"><%- typeof prop.defaultvalue === 'undefined' ? '-' : `<code>${prop.defaultvalue}</code>` %></td>\n            <td class=\"description\"><%- prop.optional ? 'No' : '<b>Yes</b>' %></td>\n            <td class=\"description last\"><%- typeof prop.description === 'undefined' ? '-' : prop.description %></td>\n        </tr><% }) %></tbody>\n    </table>\n</div>\n<% } %>\n\n<% if(data.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-data\">Data</h3>\n<div class=\"container-params\">\n    <table class=\"params\" data-jsdoc-vuejs=\"table-data\">\n        <thead>\n        <tr>\n            <th>Name</th>\n            <th>Type</th>\n            <th>Default value</th>\n            <th class=\"last\">Description</th>\n        </tr>\n        </thead>\n        <tbody><% data.forEach(function(d) { %><tr>\n            <td class=\"name\"><code><%- d.name %></code></td>\n            <td class=\"type\"><span class=\"param-type\"><%- renderType(d.type) %></span></td>\n            <td class=\"description\"><%- typeof d.defaultvalue === 'undefined' ? '-' : `<code>${d.defaultvalue}</code>` %></td>\n            <td class=\"description last\"><%- typeof d.description === 'undefined' ? '-' : d.description %></td>\n        </tr><% }) %></tbody>\n    </table>\n</div>\n<% } %>\n\n<% if(computed.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-computed\">Computed</h3>\n<div class=\"container-params\">\n    <table class=\"params\" data-jsdoc-vuejs=\"table-computed\">\n        <thead>\n        <tr>\n            <th>Name</th>\n            <th>Type</th>\n            <th class=\"last\">Description</th>\n        </tr>\n        </thead>\n        <tbody><% computed.forEach(function(c) { %><tr>\n            <td class=\"name\"><code><%- c.name %></code></td>\n            <td class=\"type\"><span class=\"param-type\"><%- renderType(c.type) %></span></td>\n            <td class=\"description last\"><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n        </tr><% }) %></tbody>\n    </table>\n</div>\n<% } %>\n\n<% if(event.length > 0) { %>\n<h3 class=\"subsection-title\" style=\"margin-top: 1em\" data-jsdoc-vuejs=\"section-event\">Events</h3>\n<div class=\"container-params\">\n    <table class=\"params\" data-jsdoc-vuejs=\"table-event\">\n        <thead>\n        <tr>\n            <th>Name</th>\n            <th>Payload Type</th>\n            <th class=\"last\">Description</th>\n        </tr>\n        </thead>\n        <tbody><% event.forEach(function(c) { %><tr>\n            <td class=\"name\"><code><%- c.name %></code></td>\n            <td class=\"type\"><span class=\"param-type\"><%- renderType(c.type) %></span></td>\n            <td class=\"description last\"><%- typeof c.description === 'undefined' ? '-' : c.description %></td>\n        </tr><% }) %></tbody>\n    </table>\n</div>\n<% } %>\n\n<div class=\"container-overview\"><div><p> <%# Re-open JSDoc template tags %>\n"
  },
  {
    "path": "lib/templates/utils/renderType.js",
    "content": "const { htmlsafe } = require('jsdoc/lib/jsdoc/util/templateHelper');\n\nmodule.exports = function renderTypes(type) {\n  return ((type && type.names) || []).map(htmlsafe).join('|');\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"jsdoc-vuejs\",\n  \"version\": \"0.0.0-development\",\n  \"description\": \"A JSDoc plugin for documenting vue 3 files.\",\n  \"main\": \"index.js\",\n  \"files\": [\n    \"lib\",\n    \"config.js\"\n  ],\n  \"scripts\": {\n    \"test\": \"jest\",\n    \"lint\": \"eslint --ext .js index.js config.js lib __tests__ cypress\",\n    \"semantic-release\": \"semantic-release\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Kocal/jsdoc-vuejs\"\n  },\n  \"keywords\": [\n    \"jsdoc\",\n    \"vuejs\",\n    \"vue component\",\n    \"vue file\",\n    \"vue 3\"\n  ],\n  \"author\": \"Hugo Alliaume <hugo@alliau.me>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Kocal/jsdoc-vuejs/issues\"\n  },\n  \"homepage\": \"https://github.com/Kocal/jsdoc-vuejs#readme\",\n  \"engines\": {\n    \"node\": \"^10.13.0 || >=12.0.0\"\n  },\n  \"dependencies\": {\n    \"ejs\": \"^3.0.1\"\n  },\n  \"peerDependencies\": {\n    \"jsdoc\": \">=3.0.0\",\n    \"@vue/compiler-sfc\": \">= 3.0.0\"\n  },\n  \"devDependencies\": {\n    \"@kocal/semantic-release-preset\": \"^2.0.6\",\n    \"@vue/compiler-sfc\": \"^3.1.4\",\n    \"cypress\": \"^4.0.1\",\n    \"eslint\": \"^6.2.0\",\n    \"eslint-config-airbnb-base\": \"^14.0.0\",\n    \"eslint-plugin-cypress\": \"^2.0.1\",\n    \"eslint-plugin-import\": \"^2.13.0\",\n    \"jest\": \"^24.0.0\",\n    \"jsdoc\": \"^3.6.2\",\n    \"semantic-release\": \"^17.1.1\"\n  }\n}\n"
  }
]