[
  {
    "path": ".gitignore",
    "content": "node_modules\nout\nnpm-debug.log\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nsudo: false\nnode_js:\n  - \"6\"\nscript:\n  - ./script/test.sh\ninstall:\n  - ./script/install.sh\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "README.md",
    "content": "[![](https://travis-ci.org/esdoc/esdoc-plugins.svg?branch=master)](https://travis-ci.org/esdoc/esdoc-plugins)\n# ESDoc Plugins\n\nThis repository is official plugins for ESDoc.\n\n**In most case, we recommend [esdoc-standard-plugin](./esdoc-standard-plugin)**\n\n## Each Plugins\n\n**Publisher**\n- [esdoc-publish-html-plugin](./esdoc-publish-html-plugin)\n- [esdoc-publish-markdown-plugin](./esdoc-publish-markdown-plugin) [PoC]\n\n**Integration**\n- [esdoc-integrate-manual-plugin](./esdoc-integrate-manual-plugin)\n- [esdoc-integrate-test-plugin](./esdoc-integrate-test-plugin)\n\n**Transform**\n- [esdoc-accessor-plugin](./esdoc-accessor-plugin)\n- [esdoc-brand-plugin](./esdoc-brand-plugin)\n- [esdoc-exclude-source-plugin](./esdoc-exclude-source-plugin)\n- [esdoc-importpath-plugin](./esdoc-importpath-plugin)\n- [esdoc-inject-script-plugin](./esdoc-inject-script-plugin)\n- [esdoc-inject-style-plugin](./esdoc-inject-style-plugin)\n- [esdoc-undocumented-identifier-plugin](./esdoc-undocumented-identifier-plugin)\n- [esdoc-unexported-identifier-plugin](./esdoc-unexported-identifier-plugin)\n\n**Inspection**\n- [esdoc-coverage-plugin](./esdoc-coverage-plugin)\n- [esdoc-lint-plugin](./esdoc-lint-plugin)\n- [esdoc-type-inference-plugin](./esdoc-type-inference-plugin) \n\n**External Identifier**\n- [esdoc-external-ecmascript-plugin](./esdoc-external-ecmascript-plugin)\n- [esdoc-external-nodejs-plugin](./esdoc-external-nodejs-plugin)\n- [esdoc-external-webapi-plugin](./esdoc-external-webapi-plugin)\n\n**Language**\n- [esdoc-ecmascript-proposal-plugin](./esdoc-ecmascript-proposal-plugin)\n- [esdoc-flow-type-plugin](./esdoc-flow-type-plugin) [PoC]\n- [esdoc-typescript-plugin](./esdoc-typescript-plugin) [PoC]\n\n**React**\n- [esdoc-jsx-plugin](./esdoc-jsx-plugin)\n- [esdoc-react-plugin](./esdoc-react-plugin) [PoC]\n\n"
  },
  {
    "path": "_template/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "_template/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "_template/README.md",
    "content": "# ESDoc Template Plugin\n## Install\n```bash\nnpm install esdoc-template-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-template-plugin\", \"option\": {\"foo\": true}}\n  ]\n}\n```\n\n- `foo` is default `true`\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "_template/package.json",
    "content": "{\n  \"name\": \"esdoc-template-plugin\",\n  \"version\": \"0.0.1\",\n  \"description\": \"A __TEMPLATE__ plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"alpha\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "_template/src/Plugin.js",
    "content": "class Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "_template/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"foo\": true}}\n  ]\n}\n"
  },
  {
    "path": "_template/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "_template/test/src/MyClass.js",
    "content": "export default class MyClass {\n  method1(){}\n}\n"
  },
  {
    "path": "_template/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has method doc', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#method1');\n    assert(doc);\n  });\n});\n\n"
  },
  {
    "path": "_template/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-accessor-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-accessor-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-accessor-plugin/README.md",
    "content": "# ESDoc Accessor Plugin\n## Install\n```bash\nnpm install esdoc-accessor-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-accessor-plugin\", \"option\": {\"access\": [\"public\", \"protected\", \"private\"], \"autoPrivate\": true}}\n  ]\n}\n```\n\n- `access` is default `[\"public\", \"protected\", \"private\"]`\n- `autoPrivate` is default `true`\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-accessor-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-accessor-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A accessor plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"accessor\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-accessor-plugin/src/Plugin.js",
    "content": "class Plugin {\n  constructor() {\n    this._docs = null;\n    this._option = null;\n  }\n\n  onHandleDocs(ev) {\n    const option = ev.data.option || {};\n    if (!('access' in option)) option.access = ['public', 'protected', 'private'];\n    if (!('autoPrivate' in option)) option.autoPrivate = true;\n\n    const access = option.access;\n    const autoPrivate = option.autoPrivate;\n    for (const doc of ev.data.docs) {\n      if (!doc.access) {\n        if (autoPrivate && doc.name.charAt(0) === '_') {\n          doc.access = 'private';\n        } else {\n          doc.access = 'public';\n        }\n      }\n\n      if (!access.includes(doc.access)) doc.ignore = true;\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"access\": [\"public\", \"protected\"], \"autoPrivate\": true}}\n  ]\n}\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n  /**\n   * method1 is default access.\n   */\n  method1(){}\n\n  /**\n   * method2 is public.\n   * @public\n   */\n  method2(){}\n\n  /**\n   * method3 is protected.\n   * @protected\n   */\n  method3(){}\n\n  /**\n   * method4 is private.\n   * @private\n   */\n  method4(){}\n\n  /**\n   * method5 is auto private.\n   */\n  _method5(){}\n}\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has default access', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#method1');\n    assert.equal(doc.access, 'public');\n    assert.equal(doc.ignore, undefined);\n  });\n\n  it('has public access', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#method2');\n    assert.equal(doc.access, 'public');\n    assert.equal(doc.ignore, undefined);\n  });\n\n  it('has protected access', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#method3');\n    assert.equal(doc.access, 'protected');\n    assert.equal(doc.ignore, undefined);\n  });\n\n  it('has private access and is ignored', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#method4');\n    assert.equal(doc.access, 'private');\n    assert.equal(doc.ignore, true);\n  });\n\n  it('has auto private access and is ignored', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#_method5');\n    assert.equal(doc.access, 'private');\n    assert.equal(doc.ignore, true);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-accessor-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-brand-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## Next\n- **Fix**\n  - Use the same as original logo file type ([#43](https://github.com/esdoc/esdoc-plugins/pull/43)). Thanks [@bencevans](https://github.com/bencevans)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-brand-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-brand-plugin/README.md",
    "content": "# ESDoc Brand Plugin\n## Install\n```bash\nnpm install esdoc-brand-plugin\n```\n\n## Config\nThis plugin takes a title and a repository from `package.json (name, repsitory)`.\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"package.json\": \"./package.json\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-brand-plugin\",\n      \"option\": {\n        \"logo\": \"./logo.png\",\n        \"title\": \"My Library\",\n        \"description\": \"this is awesome library\",\n        \"repository\": \"https://github.com/foo/bar\",\n        \"site\": \"http://my-library.org\",\n        \"author\": \"https://twitter.com/foo\",\n        \"image\": \"http://my-library.org/logo.png\"\n      }\n    }\n  ]\n}\n```\n\n- `logo` default is `null`\n- `title` default is `name` of `package.json`\n- `description` default is `description` of `package.json`\n- `repository` default is `repository` of `package.json`\n- `site` default is `homepage` of `package.json`\n- `author` default is `author` of `package.json`\n- `image` default is `null`. support an aspect ratio of 1:1\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-brand-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-brand-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A brand plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"cheerio\": \"0.22.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"brand\",\n    \"title\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-brand-plugin/src/Plugin.js",
    "content": "const fs = require('fs');\nconst path = require('path');\nconst cheerio = require('cheerio');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    const config = ev.data.config;\n    const option = ev.data.option || {};\n\n    // get package.json\n    let packageObj = {};\n    try {\n      const packagePath = config.package || './package.json';\n      const tmp = fs.readFileSync(packagePath).toString();\n      packageObj = JSON.parse(tmp);\n    } catch (e) {\n      // ignore\n    }\n\n    this._logo = option.logo;\n    this._description = option.description || packageObj.description;\n    this._title = option.title || packageObj.name;\n    this._repository = option.repository || this._getRepositoryURL(packageObj);\n    this._site = option.site || packageObj.homepage;\n    this._image = option.image;\n    this._author = option.author || this._getAuthor(packageObj);\n  }\n\n  onPublish(ev) {\n    if (this._repository && this._repository.indexOf('https://github.com/') === 0) {\n      const srcPath = path.resolve(__dirname, 'github.png');\n      ev.data.copyFile(srcPath, 'image/github.png');\n    }\n\n    if (this._logo) {\n      const srcPath = path.resolve(this._logo);\n      ev.data.copyFile(srcPath, 'image/brand_logo' + path.extname(this._logo));\n    }\n  }\n\n  onHandleContent(ev) {\n    const content = ev.data.content;\n    const fileName = ev.data.fileName;\n\n    if (path.extname(fileName) !== '.html') return content;\n\n    const $ = cheerio.load(content);\n\n    // logo\n    if (this._logo) {\n      const $el = $('header a[href=\"./\"]');\n      $el.text('');\n      $el.css({display: 'flex', 'align-items': 'center'});\n      $el.append('<img src=\"./image/brand_logo' + path.extname(this._logo) + '\" style=\"width:34px;\">');\n    }\n\n    // title\n    if (this._title) {\n      const $title = $('title');\n      const original = $title.text();\n      $title.text(`${original} | ${this._title}`);\n    }\n\n    // repository\n    if (this._repository) {\n      if (this._repository.indexOf('https://github.com/') === 0) {\n        const style = 'style=\"position:relative; top:3px;\"';\n        $('header').append(`<a ${style} href=\"${this._repository}\"><img width=\"20px\" src=\"./image/github.png\"/></a>`);\n      } else {\n        $('header').append(`<a href=\"${this._repository}\">Repository</a>`);\n      }\n    }\n\n    // meta tag\n    this._addMetaTag($);\n\n    ev.data.content = $.html();\n  }\n\n  _getRepositoryURL(packageObj) {\n    if (!packageObj.repository) return null;\n\n    let url = packageObj.repository.url || packageObj.repository;\n    if (typeof url !== 'string') return null;\n\n    if (url.indexOf('git@github.com:') === 0) { // url: git@github.com:foo/bar.git\n      const matched = url.match(/^git@github\\.com:(.*)\\.git$/);\n      return `https://github.com/${matched[1]}`;\n    } else if (url.match(/^[\\w\\d\\-_]+\\/[\\w\\d\\-_]+$/)) { // url: foo/bar\n      return `https://github.com/${url}`;\n    } else if (url.match(/^git\\+https:\\/\\/github.com\\/.*\\.git$/)) { // git+https://github.com/foo/bar.git\n      const matched = url.match(/^git\\+(https:\\/\\/github.com\\/.*)\\.git$/);\n      return matched[1];\n    } else if (url.match(/(https?:\\/\\/.*$)/)) { // other url\n      const matched = url.match(/(https?:\\/\\/.*$)/);\n      return matched[1];\n    }\n\n    return null;\n  }\n\n  _getAuthor(packageObj) {\n    if (!packageObj.author) return null;\n\n    if (typeof packageObj.author === 'string') {\n      return packageObj.author;\n    } else {\n      return packageObj.author.url || packageObj.author.name;\n    }\n  }\n\n  _addMetaTag($) {\n    const metaProps = [];\n\n    // normal\n    if (this._description){\n      metaProps.push({name: 'description', content: this._description});\n    }\n\n    // og tag http://ogp.me/#metadata\n    if (this._title && this._image && this._site){\n      metaProps.push({property: 'og:type', content: 'website'});\n      metaProps.push({property: 'og:url', content: this._site});\n      metaProps.push({property: 'og:site_name', content: this._title});\n      metaProps.push({property: 'og:title', content: this._title});\n      metaProps.push({property: 'og:image', content: this._image});\n\n      if (this._description) metaProps.push({property: 'og:description', content: this._description});\n      if (this._author) metaProps.push({property: 'og:author', content: this._author});\n    }\n\n    // twitter card https://dev.twitter.com/cards/types/summary\n    if (this._title && this._description){\n      metaProps.push({property: 'twitter:card', content: 'summary'});\n      metaProps.push({property: 'twitter:title', content: this._title});\n      metaProps.push({property: 'twitter:description', content: this._description});\n\n      if (this._image) metaProps.push({property: 'twitter:image', content: this._image});\n      if (this._site && this._site.indexOf('https://twitter.com/') === 0) {\n        const twitterName = this._site.replace('https://twitter.com/', '@');\n        metaProps.push({property: 'twitter:site', content: twitterName});\n        metaProps.push({property: 'twitter:creator', content: twitterName});\n      }\n    }\n\n    const $head = $('head');\n    for (const metaProp of metaProps) {\n      const prop = Object.keys(metaProp).map((key) => `${key}=\"${metaProp[key]}\"`).join(' ');\n      const metaTag = `<meta ${prop}>`;\n      $head.append(metaTag);\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-brand-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"package\": \"./test/package.json\",\n  \"plugins\": [\n    {\"name\": \"./test/misc/publish-html-mock-plugin.js\"},\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"logo\": \"./test/misc/logo.png\", \"image\": \"https://esdoc.org/manual/asset/image/logo.png\"}}\n  ]\n}\n"
  },
  {
    "path": "esdoc-brand-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-brand-plugin/test/misc/publish-html-mock-plugin.js",
    "content": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<header>\n  <a href=\"./\">Home</a>\n</header>\n</body>\n</html>\n`;\n  ev.data.writeFile('index.html', html);\n};\n"
  },
  {
    "path": "esdoc-brand-plugin/test/package.json",
    "content": "{\n  \"name\": \"esdoc-brand-plugin-test\",\n  \"description\": \"this is esdoc-brand-plugin test\",\n  \"repository\": \"https://github.com/esdoc/esdoc-optional-plugins\",\n  \"homepage\": \"https://esdoc.org\",\n  \"author\": {\n    \"name\": \"h13i32maru\",\n    \"url\": \"http://h13i32maru.jp\"\n  }\n}\n"
  },
  {
    "path": "esdoc-brand-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-brand-plugin/test/src/MyClass.test.js",
    "content": "const fs = require('fs');\nconst assert = require('assert');\nconst cheerio = require('cheerio');\n\ndescribe('test/MyClass.js:', ()=> {\n  const $ = cheerio.load(fs.readFileSync('./test/out/index.html'));\n\n  it('has brand logo', ()=>{\n    assert.equal($('header a[href=\"./\"] img[src=\"./image/brand_logo.png\"]').length, 1);\n    assert(fs.readFileSync('./test/out/image/brand_logo.png'));\n  });\n\n  it('has brand title', ()=>{\n    assert.equal($('title').text(), 'Home | esdoc-brand-plugin-test');\n  });\n\n  it('has repository link', ()=>{\n    assert.equal($('header a[href=\"https://github.com/esdoc/esdoc-optional-plugins\"]').length, 1);\n    assert.equal($('header img[src=\"./image/github.png\"]').length, 1);\n    assert(fs.readFileSync('./test/out/image/github.png'));\n  });\n\n  it('has meta tag', ()=>{\n    // normal\n    assert.equal($('meta[name=\"description\"]').attr('content'), 'this is esdoc-brand-plugin test');\n\n    // og\n    assert.equal($('meta[property=\"og:type\"]').attr('content'), 'website');\n    assert.equal($('meta[property=\"og:url\"]').attr('content'), 'https://esdoc.org');\n    assert.equal($('meta[property=\"og:site_name\"]').attr('content'), 'esdoc-brand-plugin-test');\n    assert.equal($('meta[property=\"og:title\"]').attr('content'), 'esdoc-brand-plugin-test');\n    assert.equal($('meta[property=\"og:image\"]').attr('content'), 'https://esdoc.org/manual/asset/image/logo.png');\n    assert.equal($('meta[property=\"og:description\"]').attr('content'), 'this is esdoc-brand-plugin test');\n    assert.equal($('meta[property=\"og:author\"]').attr('content'), 'http://h13i32maru.jp');\n\n    // twitter\n    assert.equal($('meta[property=\"twitter:card\"]').attr('content'), 'summary');\n    assert.equal($('meta[property=\"twitter:title\"]').attr('content'), 'esdoc-brand-plugin-test');\n    assert.equal($('meta[property=\"twitter:description\"]').attr('content'), 'this is esdoc-brand-plugin test');\n    assert.equal($('meta[property=\"twitter:image\"]').attr('content'), 'https://esdoc.org/manual/asset/image/logo.png');\n  });\n});\n\n"
  },
  {
    "path": "esdoc-coverage-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.1.0 (2017-09-09)\n- **Feat**\n  - Add `kind` option ([#7](https://github.com/esdoc/esdoc-plugins/pull/7)) Thanks [@jaxx2104](https://github.com/jaxx2104)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-coverage-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-coverage-plugin/README.md",
    "content": "# ESDoc Coverage Plugin\n## Install\n```\nnpm install esdoc-coverage-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-coverage-plugin\", \n      \"option\": {\n        \"enable\": true,\n        \"kind\": [\"class\", \"method\", \"member\", \"get\", \"set\", \"constructor\", \"function\", \"variable\"]\n      }\n    }\n  ]\n}\n```\n\n`enable` is default `true`.\n\n`kind` is default `[\"class\", \"method\", \"member\", \"get\", \"set\", \"constructor\", \"function\", \"variable\"]`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-coverage-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-coverage-plugin\",\n  \"version\": \"1.1.0\",\n  \"description\": \"A coverage plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"coverage\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-coverage-plugin/src/Plugin.js",
    "content": "const fs = require('fs');\nconst path = require('path');\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n  }\n\n  onPublish(ev) {\n    const option = ev.data.option || {};\n    if (!('enable' in option)) option.enable = true;\n    if (!option.enable) return;\n    if (!('kind' in option)) option.kind = ['class', 'method', 'member', 'get', 'set', 'constructor', 'function', 'variable'];\n    if (!option.kind) return;\n    const docs = this._docs.filter(v => option.kind.includes(v.kind));\n    const expectCount = docs.length;\n    let actualCount = 0;\n    const files = {};\n\n    for (const doc of docs) {\n      const filePath = doc.longname.split('~')[0];\n      if (!files[filePath]) files[filePath] = {expectCount: 0, actualCount: 0, undocumentLines: []};\n      files[filePath].expectCount++;\n\n      if (doc.undocument) {\n        files[filePath].undocumentLines.push(doc.lineNumber);\n      } else {\n        actualCount++;\n        files[filePath].actualCount++;\n      }\n    }\n\n    const coveragePercent = (expectCount === 0 ? 0 : Math.floor(10000 * actualCount / expectCount) / 100);\n\n    const coverage = {\n      coverage: `${coveragePercent}%`,\n      expectCount: expectCount,\n      actualCount: actualCount,\n      files: files\n    };\n\n    ev.data.writeFile('coverage.json', JSON.stringify(coverage, null, 2));\n\n    // create badge\n    const ratio = Math.floor(100 * actualCount / expectCount);\n    let color;\n    if (ratio < 50) {\n      color = '#db654f';\n    } else if (ratio < 90) {\n      color = '#dab226';\n    } else {\n      color = '#4fc921';\n    }\n\n    const filePath = path.resolve(__dirname, 'badge.svg');\n    let badge = fs.readFileSync(filePath, {encoding: 'utf-8'});\n    badge = badge.replace(/@ratio@/g, `${ratio}%`);\n    badge = badge.replace(/@color@/g, color);\n\n    ev.data.writeFile('badge.svg', badge);\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-coverage-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-coverage-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-coverage-plugin/test/src/MyClass.js",
    "content": "/**\n * this is MyClass class.\n */\nexport default class MyClass {\n  /**\n   * this is constructor.\n   */\n  constructor(){\n    /**\n     * this is p property.\n     * @type {number}\n     */\n    this.p = 100;\n  }\n\n  /**\n   * this is method.\n   */\n  method(){}\n\n  undocumentMethod(){}\n}\n"
  },
  {
    "path": "esdoc-coverage-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst fs = require('fs');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has coverage', ()=>{\n    const tmp = fs.readFileSync('./test/out/coverage.json').toString();\n    const coverage = JSON.parse(tmp);\n\n    assert.equal(coverage.coverage, '80%');\n    assert.equal(coverage.expectCount, 5);\n    assert.equal(coverage.actualCount, 4);\n    assert.deepEqual(coverage.files, {\n      'src/MyClass.js': {\n        expectCount: 5,\n        actualCount: 4,\n        undocumentLines: [21]\n      }\n    });\n  });\n\n  it('has coverage badge', ()=> {\n    const badge = fs.readFileSync('./test/out/badge.svg').toString();\n    assert(badge.includes('80%'));\n  });\n});\n\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/README.md",
    "content": "# ESDoc ECMAScript Proposal Plugin\n## Install\n```\nnpm install esdoc-ecmascript-proposal-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-ecmascript-proposal-plugin\", \"option\": {\"all\": true}}\n  ]\n}\n```\n\nIf you want to enable each proposals,\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-ecmascript-proposal-plugin\",\n      \"option\": {\n        \"classProperties\": true,\n        \"objectRestSpread\": true,\n        \"doExpressions\": true,\n        \"functionBind\": true,\n        \"functionSent\": true,\n        \"asyncGenerators\": true,\n        \"decorators\": true,\n        \"exportExtensions\": true,\n        \"dynamicImport\": true\n      }\n    }\n  ]\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-ecmascript-proposal-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A ECMAScript proposal plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"^1.1.0\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"ecmascript\",\n    \"proposal\",\n    \"experimental\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/src/Plugin.js",
    "content": "class Plugin {\n  onHandleCodeParser(ev) {\n    const option = ev.data.option;\n    const plugins = ev.data.parserOption.plugins;\n\n    if (option.all || option.classProperties) plugins.push('classProperties');\n    if (option.all || option.objectRestSpread) plugins.push('objectRestSpread');\n    if (option.all || option.doExpressions) plugins.push('doExpressions');\n    if (option.all || option.functionBind) plugins.push('functionBind');\n    if (option.all || option.functionSent) plugins.push('functionSent');\n    if (option.all || option.asyncGenerators) plugins.push('asyncGenerators');\n    if (option.all || option.decorators) plugins.push('decorators');\n    if (option.all || option.exportExtensions) plugins.push('exportExtensions');\n    if (option.all || option.dynamicImport) plugins.push('dynamicImport');\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"all\": true}}\n  ]\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/AsyncGenerators.js",
    "content": "export default class AsyncGenerators {\n  async *method() {\n    const stream = [ Promise.resolve(4), Promise.resolve(9), Promise.resolve(12) ];\n    let total = 0;\n    for await (const val of stream) {\n      total += await val;\n      yield total;\n    }\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ClassProperties.js",
    "content": "export default class ClassProperties {\n  /** @type {number} */\n  static p1 = 123;\n\n  /** @type {number} */\n  p1 = 123;\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/Decorators.js",
    "content": "@annotation1\nexport default class Decorators {\n  @annotation1\n  static method1(){}\n\n  @annotation1\n  get value1(){}\n\n  @annotation1\n  set value2(v){}\n\n  @annotation1\n  @annotation2(true)\n  method1(){}\n\n  @annotation1.bar\n  @annotation1.foo(1, 2)\n  method2() {}\n}\n\nexport function annotation1(){}\n\nexport function annotation2(){}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/DoExpressions.js",
    "content": "export default class DoExpressions {\n  method1(){\n    const a = do {\n      if(x > 10) {\n        'big';\n      } else {\n        'small';\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/DynamicImport.js",
    "content": "export default class DynamicImport {\n  method() {\n    for (let i = 0; i < 10; i++) {\n      import(`mod${$i}.js`)\n        .then(module => console.log(module))\n        .catch(err => console.log(err));\n    }\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ECMAScriptProposal.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test ecmascript proposal result:', ()=> {\n  it('parses AsyncGenerators', ()=>{\n    const doc = find('longname', 'src/AsyncGenerators.js~AsyncGenerators#method');\n    assert(doc);\n  });\n\n  it('parses ClassProperties', ()=>{\n    let doc = find('longname', 'src/ClassProperties.js~ClassProperties.p1');\n    assert.equal(doc.static, true);\n    assert.equal(doc.type.types[0], 'number');\n\n    doc = find('longname', 'src/ClassProperties.js~ClassProperties#p1');\n    assert.equal(doc.static, false);\n    assert.equal(doc.type.types[0], 'number');\n  });\n\n  it('parses Decorators', ()=>{\n    let doc = find('longname', 'src/Decorators.js~Decorators');\n    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);\n\n    doc = find('longname', 'src/Decorators.js~Decorators.method1');\n    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);\n\n    doc = find('longname', 'src/Decorators.js~Decorators#value1');\n    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);\n\n    doc = find('longname', 'src/Decorators.js~Decorators#value2');\n    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}]);\n\n    doc = find('longname', 'src/Decorators.js~Decorators#method1');\n    assert.deepEqual(doc.decorators, [{name: 'annotation1', arguments: null}, {name: 'annotation2', arguments: '(true)'}]);\n\n    doc = find('longname', 'src/Decorators.js~Decorators#method2');\n    assert.deepEqual(doc.decorators, [{name: 'annotation1.bar', arguments: null}, {name: 'annotation1.foo', arguments: '(1, 2)'}]);\n  });\n\n  it('parses DoExpressions', ()=>{\n    const doc = find('longname', 'src/DoExpressions.js~DoExpressions');\n    assert(doc);\n  });\n\n  it('parses DynamicImport', ()=>{\n    const doc = find('longname', 'src/DynamicImport.js~DynamicImport');\n    assert(doc);\n  });\n\n  it('parses ExportExtensions', ()=>{\n    const doc = find('longname', 'src/ExportExtensions.js~ExportExtensions');\n    assert(doc);\n  });\n\n  it('parses FunctionBind', ()=>{\n    const doc = find('longname', 'src/FunctionBind.js~FunctionBind');\n    assert(doc);\n  });\n\n  it('parses FunctionSent', ()=>{\n    const doc = find('longname', 'src/FunctionSent.js~FunctionSent');\n    assert(doc);\n  });\n\n  it('parses ObjectRestSpread', ()=>{\n    let doc = find('longname', 'src/ObjectRestSpread.js~ObjectRestSpread#method1');\n    assert.deepEqual(doc.params, [\n      {\n        \"nullable\": null,\n        \"types\": [\n          \"Object\"\n        ],\n        \"spread\": false,\n        \"optional\": false,\n        \"name\": \"config\",\n        \"description\": \"this is config.\"\n      },\n      {\n        \"nullable\": null,\n        \"types\": [\n          \"number\"\n        ],\n        \"spread\": false,\n        \"optional\": false,\n        \"name\": \"config.x\",\n        \"description\": \"this is number x.\"\n      },\n      {\n        \"nullable\": null,\n        \"types\": [\n          \"string\"\n        ],\n        \"spread\": false,\n        \"optional\": false,\n        \"name\": \"config.y\",\n        \"description\": \"this is string y.\"\n      },\n      {\n        \"nullable\": null,\n        \"types\": [\n          \"number[]\"\n        ],\n        \"spread\": false,\n        \"optional\": false,\n        \"name\": \"config.a\",\n        \"description\": \"thi is number[] a.\"\n      },\n      {\n        \"nullable\": null,\n        \"types\": [\n          \"string[]\"\n        ],\n        \"spread\": false,\n        \"optional\": false,\n        \"name\": \"config.b\",\n        \"description\": \"thi is number[] b.\"\n      }\n    ]);\n\n    doc = find('longname', 'src/ObjectRestSpread.js~ObjectRestSpread#method2');\n    assert.deepEqual(doc.return, {\n      \"nullable\": null,\n      \"types\": [\n        \"{a: number, b: string, c: boolean}\"\n      ],\n      \"spread\": false,\n      \"description\": \"\"\n    });\n  });\n});\n\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ExportExtensions.js",
    "content": "export * as ns from 'mod'\nexport v from \"mod\"\nexport vv, {x, y as w} from \"mod\"\nexport default from \"mod\"\n\nexport class ExportExtensions {\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/FunctionBind.js",
    "content": "function foo(){}\n\nexport default class FunctionBind {\n  method() {\n    this::foo();\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/FunctionSent.js",
    "content": "export default class FunctionSent {\n  *method() {\n    console.log(function.sent);\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/src/ObjectRestSpread.js",
    "content": "export default class ObjectRestSpread {\n  /**\n   * this is method1.\n   * @param {Object} config - this is config.\n   * @param {number} config.x - this is number x.\n   * @param {string} config.y - this is string y.\n   * @param {number[]} config.a - thi is number[] a.\n   * @param {string[]} config.b - thi is number[] b.\n   */\n  method1({x, y, ...z}){}\n\n  /**\n   * @returns {{a: number, b: string, c: boolean}}\n   */\n  method2(){\n    const a = 1;\n    const obj = {b: 'text', c: true};\n    return {a, ...obj};\n  }\n}\n"
  },
  {
    "path": "esdoc-ecmascript-proposal-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/README.md",
    "content": "# ESDoc Exclude Source Plugin\n## Install\n```bash\nnpm install esdoc-exclude-source-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-exclude-source-plugin\"}\n  ]\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-exclude-source-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A exclude source plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"exclude\",\n    \"source\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/src/Plugin.js",
    "content": "class Plugin {\n  onHandleDocs(ev) {\n    for (const doc of ev.data.docs) {\n      if (doc.kind === 'file' || doc.kind === 'testFile') doc.content = '';\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-exclude-source-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst fs = require('fs');\n\ndescribe('test/MyClass.js:', ()=> {\n  const tmp = fs.readFileSync('./test/out/index.json').toString();\n  const docs = JSON.parse(tmp);\n\n  it('does not have source code.', ()=>{\n    docs.forEach((doc) => {\n      if (doc.kind === 'file' || doc.kind === 'testFile')  {\n        assert.equal(doc.content, '');\n      }\n    });\n  });\n});\n\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/README.md",
    "content": "# ESDoc External ECMAScript Plugin\n## Install\n```bash\nnpm install esdoc-external-ecmascript-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-external-ecmascript-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-external-ecmascript-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A external ECMAScript plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"fs-extra\": \"1.0.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"external\",\n    \"ecmascript\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/src/Plugin.js",
    "content": "const fs = require('fs-extra');\nconst path = require('path');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = ev.data.config;\n    this._option = ev.data.option || {};\n    if (!('enable' in this._option)) this._option.enable = true;\n\n    if (!this._option.enable) return;\n\n    const srcPath = path.resolve(__dirname, 'external-ecmascript.js');\n    const outPath = path.resolve(this._config.source, '.external-ecmascript.js');\n\n    fs.copySync(srcPath, outPath);\n  }\n\n  onHandleDocs(ev) {\n    if (!this._option.enable) return;\n\n    const outPath = path.resolve(this._config.source, '.external-ecmascript.js');\n    fs.removeSync(outPath);\n\n    const name = path.basename(path.resolve(this._config.source)) + '/.external-ecmascript.js';\n    for (const doc of ev.data.docs) {\n      if (doc.kind === 'external' && doc.memberof === name) doc.builtinExternal = true;\n    }\n\n    const tagIndex = ev.data.docs.findIndex(doc => doc.kind === 'file' && doc.name === name);\n    ev.data.docs.splice(tagIndex, 1);\n  }\n\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/src/external-ecmascript.js",
    "content": "// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\n\n// Value properties\n/**\n * @external {Infinity} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity\n */\n\n/**\n * @external {NaN} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN\n */\n\n/**\n * @external {undefined} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined\n */\n\n/**\n * @external {null} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null\n */\n\n// Fundamental objects\n/**\n * @external {Object} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n */\n/**\n * @external {object} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n */\n\n/**\n * @external {Function} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n */\n/**\n * @external {function} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n */\n\n/**\n * @external {Boolean} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean\n */\n/**\n * @external {boolean} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean\n */\n\n/**\n * @external {Symbol} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n */\n\n/**\n * @external {Error} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n */\n\n/**\n * @external {EvalError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError\n */\n\n/**\n * @external {InternalError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError\n */\n\n/**\n * @external {RangeError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError\n */\n\n/**\n * @external {ReferenceError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError\n */\n\n/**\n * @external {SyntaxError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError\n */\n\n/**\n * @external {TypeError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError\n */\n\n/**\n * @external {URIError} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError\n */\n\n// Numbers and dates\n/**\n * @external {Number} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number\n */\n/**\n * @external {number} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number\n */\n\n/**\n * @external {Date} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date\n */\n\n// Text processing\n/**\n * @external {String} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String\n */\n/**\n * @external {string} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String\n */\n\n/**\n * @external {RegExp} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\n\n// Indexed collections\n/**\n * @external {Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n */\n\n/**\n * @external {Int8Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array\n */\n/**\n * @external {Uint8Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array\n */\n\n/**\n * @external {Uint8ClampedArray} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray\n */\n\n/**\n * @external {Int16Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array\n */\n\n/**\n * @external {Uint16Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array\n */\n\n/**\n * @external {Int32Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array\n */\n\n/**\n * @external {Uint32Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array\n */\n\n/**\n * @external {Float32Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array\n */\n\n/**\n * @external {Float64Array} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array\n */\n\n// Keyed collections\n/**\n * @external {Map} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\n */\n\n/**\n * @external {Set} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\n */\n\n/**\n * @external {WeakMap} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap\n */\n\n/**\n * @external {WeakSet} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet\n */\n\n// Structured data\n/**\n * @external {ArrayBuffer} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\n */\n\n/**\n * @external {DataView} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView\n */\n\n/**\n * @external {JSON} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON\n */\n\n// Control abstraction objects\n/**\n * @external {Promise} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n */\n\n/**\n * @external {Generator} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator\n */\n\n/**\n * @external {GeneratorFunction} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction\n */\n\n// Reflection\n/**\n * @external {Reflect} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n */\n\n/**\n * @external {Proxy} https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n */\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-external-ecmascript-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\n\ndescribe('test external ecmascript results:', ()=>{\n  const tmp = fs.readFileSync('./test/out/index.json').toString();\n  const tags = JSON.parse(tmp);\n\n  it('has external ecmascript.', ()=>{\n    const tag = tags.find(tag => tag.kind === 'external' && tag.name === 'number');\n    assert.equal(tag.externalLink, \"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number\");\n  });\n\n  it('removed external-ecmascript.js', ()=>{\n    assert.throws(()=>{\n      fs.readFileSync('./test/src/.external-ecmascript.js');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/README.md",
    "content": "# ESDoc External Node.js Plugin\n## Install\n```bash\nnpm install esdoc-external-nodejs-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-external-nodejs-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-external-nodejs-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A external Node.js plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"fs-extra\": \"1.0.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"external\",\n    \"nodejs\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/src/Plugin.js",
    "content": "const fs = require('fs-extra');\nconst path = require('path');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = ev.data.config;\n    this._option = ev.data.option || {};\n    if (!('enable' in this._option)) this._option.enable = true;\n\n    if (!this._option.enable) return;\n\n    const srcPath = path.resolve(__dirname, 'external-nodejs.js');\n    const outPath = path.resolve(this._config.source, '.external-nodejs.js');\n\n    fs.copySync(srcPath, outPath);\n  }\n\n  onHandleDocs(ev) {\n    if (!this._option.enable) return;\n\n    const outPath = path.resolve(this._config.source, '.external-nodejs.js');\n    fs.removeSync(outPath);\n\n    const name = path.basename(path.resolve(this._config.source)) + '/.external-nodejs.js';\n    for (const doc of ev.data.docs) {\n      if (doc.kind === 'external' && doc.memberof === name) doc.builtinExternal = true;\n    }\n\n    const docIndex = ev.data.docs.findIndex(doc => doc.kind === 'file' && doc.name === name);\n    ev.data.docs.splice(docIndex, 1);\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/src/external-nodejs.js",
    "content": "// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\n\n// Value properties\n/**\n * @external {http~ClientRequest} https://nodejs.org/dist/latest/docs/api/http.html#http_class_http_clientrequest\n */\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n  /**\n   * @param {http~ClientRequest} p\n   */\n  method(p){}\n}\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst fs = require('fs');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=>{\n  it('has external Node.js.', ()=>{\n    const doc = find('name', 'http~ClientRequest');\n    assert.equal(doc.externalLink, \"https://nodejs.org/dist/latest/docs/api/http.html#http_class_http_clientrequest\");\n  });\n\n  it('removed external-nodejs.js', ()=>{\n    assert.throws(()=>{\n      fs.readFileSync('./test/src/.external-nodejs.js');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-external-nodejs-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/README.md",
    "content": "# ESDoc External WebAPI Plugin\n## Install\n```bash\nnpm install esdoc-external-webapi-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-external-webapi-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-external-webapi-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A external Web API plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"fs-extra\": \"1.0.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"external\",\n    \"webapi\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/src/Plugin.js",
    "content": "const fs = require('fs-extra');\nconst path = require('path');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = ev.data.config;\n    this._option = ev.data.option || {};\n    if (!('enable' in this._option)) this._option.enable = true;\n\n    if (!this._option.enable) return;\n\n    const srcPath = path.resolve(__dirname, 'external-webapi.js');\n    const outPath = path.resolve(this._config.source, '.external-webapi.js');\n\n    fs.copySync(srcPath, outPath);\n  }\n\n  onHandleDocs(ev) {\n    if (!this._option.enable) return;\n\n    const outPath = path.resolve(this._config.source, '.external-webapi.js');\n    fs.removeSync(outPath);\n\n    const name = path.basename(path.resolve(this._config.source)) + '/.external-webapi.js';\n    for (const doc of ev.data.docs) {\n      if (doc.kind === 'external' && doc.memberof === name) doc.builtinExternal = true;\n    }\n\n    const docIndex = ev.data.docs.findIndex(doc => doc.kind === 'file' && doc.name === name);\n    ev.data.docs.splice(docIndex, 1);\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/src/external-webapi.js",
    "content": "// https://developer.mozilla.org/en-US/docs/Web/API\n\n/**\n * @external {CanvasRenderingContext2D} https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D\n */\n\n/**\n * @external {DocumentFragment} https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment\n */\n\n/**\n * @external {Element} https://developer.mozilla.org/en-US/docs/Web/API/Element\n */\n\n/**\n * @external {Event} https://developer.mozilla.org/en-US/docs/Web/API/Event\n */\n\n/**\n * @external {Node} https://developer.mozilla.org/en-US/docs/Web/API/Node\n */\n\n/**\n * @external {NodeList} https://developer.mozilla.org/en-US/docs/Web/API/NodeList\n */\n\n/**\n * @external {XMLHttpRequest} https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest\n */\n\n/**\n * @external {AudioContext} https://developer.mozilla.org/en/docs/Web/API/AudioContext\n */\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=>{\n\n  it('has external web api.', ()=>{\n    const doc = find('name', 'XMLHttpRequest');\n    assert.equal(doc.externalLink, 'https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest');\n  });\n\n  it('removed external-webapi.js', ()=>{\n    assert.throws(()=>{\n      fs.readFileSync('./test/src/.external-webapi.js');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-external-webapi-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-flow-type-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.2 (2018-04-29)\n- **Fix**\n  - Broken `@type {type} desc` ([#30](https://github.com/esdoc/esdoc-plugins/pull/30)) Thanks [@samskivert](https://github.com/samskivert)\n\n## 1.0.1 (2017-09-03)\n- **Fix**\n  - [esdoc-flow-type-plugin] Broken `@return {type} desc` ([#23](https://github.com/esdoc/esdoc-plugins/pull/23)) Thanks [@samskivert](https://github.com/samskivert)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-flow-type-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-flow-type-plugin/README.md",
    "content": "# ESDoc Flow Type Plugin (PoC)\n**This plugin is proof of concept.**\n\n## Install\n```bash\nnpm install esdoc-flow-type-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-flow-type-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n- `enable` is default `true`\n\n## Example\n```js\nexport class Foo {\n  // without document\n  member: number;\n  \n  // without document\n  method1(n: number): string {\n  }\n  \n  // without @param and @return\n  /**\n   * this is method2.\n   */\n  method2(n: number): string {\n  }\n  \n  // without type in @param and @return\n  /**\n   * this is method3.\n   * @param n - this is param desc.\n   * @return this is return desc. \n   */\n  method3(n: number): string {\n  }\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-flow-type-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-flow-type-plugin\",\n  \"version\": \"1.0.2\",\n  \"description\": \"A flow type plugin for ESDoc [PoC]\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\",\n    \"esdoc-standard-plugin\": \"latest\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"flow\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-flow-type-plugin/src/Plugin.js",
    "content": "const ASTUtil = require('esdoc/out/src/Util/ASTUtil').default;\nconst CommentParser = require('esdoc/out/src/Parser/CommentParser').default;\nconst InvalidCodeLogger = require('esdoc/out/src/Util/InvalidCodeLogger').default;\n\nfunction formatExpression(expr) {\n  switch (expr.type) {\n  case 'ObjectExpression':\n    return `{${expr.properties.map(formatExpression)}}`;\n  default: // XLiteral\n    return expr.value ? String(expr.value) : undefined;\n  }\n}\n\nfunction formatTypeId(id) {\n  switch (id.type) {\n  case 'QualifiedTypeIdentifier':\n    return `${formatTypeId(id.qualification)}.${formatTypeId(id.id)}`;\n  case 'Identifier':\n    return id.name;\n  default:\n    return id.type;\n  }\n}\n\nfunction isOptional(type) {\n  // TODO: should detect 'foo | void' here as well...\n  return type.type === 'NullableTypeAnnotation';\n}\n\nfunction formatTypeAnnotation(type) {\n  switch (type.type) {\n  case 'GenericTypeAnnotation':\n    return type.typeParameters ?\n      `${formatTypeId(type.id)}<${formatTypeAnnotations(type.typeParameters.params, ', ')}>` :\n      formatTypeId(type.id);\n  case 'TupleTypeAnnotation':\n    return `[${formatTypeAnnotations(type.types, ', ')}]`;\n  case 'NullableTypeAnnotation':\n    return `?${formatTypeAnnotation(type.typeAnnotation)}`;\n  case 'UnionTypeAnnotation':\n    return formatTypeAnnotations(type.types, '|');\n  case 'ArrayTypeAnnotation':\n    return `${formatTypeAnnotation(type.elementType)}[]`;\n  default:\n    return type.type.replace('TypeAnnotation', '').toLowerCase();\n  }\n}\n\nfunction formatTypeAnnotations(types, sep) {\n  return types.map(formatTypeAnnotation).join(sep);\n}\n\nclass FlowTypePlugin {\n  constructor() {\n    this._enable = true;\n  }\n\n  onStart(ev) {\n    if (!ev.data.option) return;\n    if ('enable' in ev.data.option) this._enable = ev.data.option.enable;\n  }\n\n  onHandleCodeParser(ev) {\n    if (this._enable) ev.data.parserOption.plugins.push('flow');\n  }\n\n  onHandleAST(ev) {\n    if (!this._enable) return;\n\n    ASTUtil.traverse(ev.data.ast, (node, parent, path) =>{\n      try {\n        this._dispatch(node, parent, path);\n      } catch (e) {\n        console.log(`\u001b[31m${e.message}\u001b[0m`);\n        InvalidCodeLogger.show(ev.data.filePath, node);\n      }\n    });\n  }\n\n  _dispatch(node, parent, path) {\n    switch (node.type) {\n      case 'ClassMethod':\n        switch (node.kind) {\n          case 'constructor':\n            this._applyCallableParam(node);\n            break;\n          case 'method':\n            this._applyCallableParam(node);\n            this._applyCallableReturn(node);\n            break;\n          case 'get':\n            this._applyClassMethodGetter(node);\n            break;\n          case 'set':\n            this._applyClassMethodSetter(node);\n            break;\n          default:\n            console.warn(`Unknown ClassMethod kind: ${node.kind}`);\n            break;\n        }\n        break;\n      case 'ClassProperty':\n        this._applyClassProperty(node);\n        break;\n      case 'FunctionDeclaration':\n        this._applyCallableParam(node);\n        this._applyCallableReturn(node);\n        break;\n    }\n  }\n\n  _applyCallableParam(node) {\n    if (!node.params) return;\n\n    // get comments\n    const {tags, commentNode} = CommentParser.parseFromNode(node);\n\n    // get types\n    const types = node.params.map(param => {\n      switch (param.type) {\n      case 'Identifier':\n        return {\n          type: this._getTypeFromAnnotation(param.typeAnnotation),\n          name: param.name,\n          tagName: param.typeAnnotation && isOptional(param.typeAnnotation) ?\n            `[${param.name}]` : param.name,\n        };\n      case 'AssignmentPattern':\n        return {\n          type: this._getTypeFromAnnotation(param.left.typeAnnotation),\n          name: param.name,\n          tagName: `[${param.left.name}=${formatExpression(param.right)}]`,\n        };\n      case 'RestElement':\n        return {\n          type: `...${this._getTypeFromAnnotation(param.typeAnnotation)}`,\n          name: param.argument.name,\n          tagName: param.argument.name,\n        };\n      default:\n        console.warn(`Unhandled method parameter type: ${param.type}`);\n        console.dir(param);\n        return {\n          type: '*',\n          name: param.name,\n          tagName: param.name,\n        };\n      }\n    });\n    const paramTags = tags.filter(tag => tag.tagName === '@param');\n\n    // merge\n    // case: params without comments\n    if (paramTags.length === 0 && types.length) {\n      const tmp = types.map(({type, tagName}) => {\n        return {\n          tagName: '@param',\n          tagValue: `{${type}} ${tagName}`\n        };\n      });\n      tags.push(...tmp);\n\n      commentNode.value = CommentParser.buildComment(tags);\n      return;\n    }\n\n    // case: params with comments\n    if (paramTags.length === types.length) {\n      for (let i = 0; i < paramTags.length; i++) {\n        const paramTag = paramTags[i];\n        const type = types[i];\n        let text = paramTag.tagValue;\n        if (text.charAt(0) !== '{') { // does not have type\n          if (text.charAt(0) !== '[') { // does not have attrs\n            text = `${type.tagName} ${text.substring(text.indexOf(' ')+1)}`;\n          }\n          paramTag.tagValue = `{${type.type}} ${text}`;\n        }\n      }\n\n      commentNode.value = CommentParser.buildComment(tags);\n      return;\n    }\n\n    // case: mismatch params and comments\n    throw new Error('mismatch params and comments');\n  }\n\n  _applyCallableReturn(node) {\n    if (!node.returnType) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(node.returnType);\n    if (!type) return;\n\n    // get comments\n    const {tags, commentNode} = CommentParser.parseFromNode(node);\n    const returnTag = tags.find(tag => tag.tagName === '@return' || tag.tagName === '@returns');\n\n    // merge\n    if (returnTag) {\n      if (returnTag.tagValue.charAt(0) !== '{') { // return with comment but does not have tpe\n        returnTag.tagValue = `{${type}} ${returnTag.tagValue}`;\n      }\n      // otherwise @return already has type annotation, leave as is\n    } else {\n      tags.push({tagName: '@return', tagValue: `{${type}}`});\n    }\n\n    commentNode.value = CommentParser.buildComment(tags);\n  }\n\n  _applyClassMethodGetter(classMethodNode) {\n    if (classMethodNode.kind !== 'get') return;\n    if (!classMethodNode.returnType) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(classMethodNode.returnType);\n    if (!type) return;\n\n    // get comments\n    const {tags, commentNode} = CommentParser.parseFromNode(classMethodNode);\n    const typeComment = tags.find(tag => tag.tagName === '@type');\n\n    if (typeComment) {\n      if (typeComment.tagValue.charAt(0) !== '{') { // type with comment but does not have tpe\n        typeComment.tagValue = `{${type}}`;\n      }\n      // otherwise getter already has type annotation, leave as is\n    } else {\n      tags.push({tagName: '@type', tagValue: `{${type}}`});\n    }\n\n    commentNode.value = CommentParser.buildComment(tags);\n  }\n\n  _applyClassMethodSetter(classMethodNode) {\n    if (classMethodNode.kind !== 'set') return;\n    if (!classMethodNode.params) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(classMethodNode.params[0].typeAnnotation);\n    if (!type) return;\n\n    // get comment\n    const {tags, commentNode} = CommentParser.parseFromNode(classMethodNode);\n    const typeComment = tags.find(tag => tag.tagName === '@type');\n    if (typeComment) return;\n\n    // merge\n    // case: param without comment\n    tags.push({tagName: '@type', tagValue: `{${type}}`});\n    commentNode.value = CommentParser.buildComment(tags);\n  }\n\n  _applyClassProperty(classPropertyNode) {\n    if (!classPropertyNode.typeAnnotation) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(classPropertyNode.typeAnnotation);\n    if (!type) return;\n\n    // get comments\n    const {tags, commentNode} = CommentParser.parseFromNode(classPropertyNode);\n    const typeComment = tags.find(tag => tag.tagName === '@type');\n\n    if (typeComment) {\n      if (typeComment.tagValue.charAt(0) !== '{') { // type with comment but does not have tpe\n        typeComment.tagValue = `{${type}}`;\n      }\n      // otherwise property already has type annotation, leave as is\n    } else {\n      tags.push({tagName: '@type', tagValue: `{${type}}`});\n    }\n\n    commentNode.value = CommentParser.buildComment(tags);\n  }\n\n  _getTypeFromAnnotation(typeAnnotation) {\n    if (!typeAnnotation) return '*';\n\n    return formatTypeAnnotation(typeAnnotation.typeAnnotation);\n  }\n}\n\nmodule.exports = new FlowTypePlugin();\n"
  },
  {
    "path": "esdoc-flow-type-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"},\n    {\"name\": \"esdoc-standard-plugin\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-flow-type-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-flow-type-plugin/test/src/FlowType.js",
    "content": "// @flow\nexport class TestFlowTypeClass {\n  member1: number;\n\n  get getter1(): string {}\n\n  set setter1(v: number) {}\n\n  method1(n: number, x: Foo): string {\n    return 'Hello'.repeat(n);\n  }\n\n  /**\n   * this is method2.\n   */\n  method2(n: number, x: Foo): string {\n    return 'Hello'.repeat(n);\n  }\n\n  /**\n   * this is method3.\n   * @param n - this is n\n   * @param x - this is x\n   * @return this is return\n   */\n  method3(n: number, x: Foo): string {\n    return 'Hello'.repeat(n);\n  }\n\n  /**\n   * this is method4.\n   * @param t - this is t\n   * @param x - this is x\n   * @param o - this is o\n   * @param q - this is q\n   * @return this is return\n   */\n  method4(t: [number, number], x: Foo<string>, o: string|void, q: THREE.Vector3): ?string {\n    return 'Hello'.repeat(t[0]);\n  }\n}\n\nexport function testFlowTypeFunction(n: number, x: Foo): string{}\n"
  },
  {
    "path": "esdoc-flow-type-plugin/test/src/FlowType.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/FlowType.js:', ()=> {\n  it('has type of method, without comment', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method1');\n\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n\n  it('has type of method, without tags', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method2');\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n\n  it('has type of method, without type', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method3');\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n\n  it('has type of method, extracting proper argument types', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#method4');\n    assert.equal(doc.params.length, 4);\n    assert.deepEqual(doc.params[0].types, ['[number, number]']);\n    assert.deepEqual(doc.params[1].types, ['Foo<string>']);\n    assert.deepEqual(doc.params[2].types, ['string' , 'void']);\n    assert.deepEqual(doc.params[3].types, ['THREE.Vector3']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n    assert.equal(doc.return.nullable, true);\n  });\n\n  it('has type of getter, without comment', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#getter1');\n    assert.deepEqual(doc.type.types, ['string']);\n  });\n\n  it('has type of setter, without comment', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#setter1');\n    assert.deepEqual(doc.type.types, ['number']);\n  });\n\n  it('has type of member, without comment', ()=>{\n    const doc = find('longname', 'src/FlowType.js~TestFlowTypeClass#member1');\n    assert.deepEqual(doc.type.types, ['number']);\n  });\n\n  it('has type of function, without comment', ()=>{\n    const doc = find('longname', 'src/FlowType.js~testFlowTypeFunction');\n\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-flow-type-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-importpath-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.2 (2018-04-29)\n- **Fix**\n  - Strip last slash ([#37](https://github.com/esdoc/esdoc-plugins/pull/37)) Thanks [@LestaD](https://github.com/LestaD)\n\n## 1.0.1 (2017-09-09)\n- **Feat**\n  - Add `option.stripPackageName` ([#21](https://github.com/esdoc/esdoc-plugins/pull/21)) Thanks [@BKcore](https://github.com/BKcore)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-importpath-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-importpath-plugin/README.md",
    "content": "# ESDoc Import Path Plugin\nThis is a plugin that converts the import path in documentation.\nESDoc displays the import path of class/function into the document.\nHowever, the import path may be different from real import path because usually ES2015 is transpiled to use it.\n\nFor example, ``src/MyClass.js`` will be referred to as ``import MyClass from 'my-module/src/MyClass.js'`` in the documentation.\nHowever, in practice it is different from the real import path when you use because it is transpiled\n(for example, ``import MyClass from 'my-module/lib/MyClass.js'``).\n\nTherefore, convert the import path by using following setting.\n\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-importpath-plugin\",\n      \"option\": {\n        \"stripPackageName\": false,\n        \"replaces\": [\n          {\"from\": \"^src/\", \"to\": \"lib/\"}\n        ]\n      }\n    }\n  ]\n}\n```\n\n``from`` is regular expression and ``to``is letter. In the internal ``from`` and ``to`` are used with ``String#replace(new RegExp (from), to)``.\n\nWhen writing multi rules, it will also be carried out transformation many times.\nFor example, ``[{from: \"^src/\", to: \"lib/\"}, {from: \"MyFooClass\", to: \"my-foo\"}]`` converted as follows:\n\n- `` my-module/src/MyFooClass.js`` => `` my-module/lib/MyFooClass.js`` => ``my-module/lib/my-foo``\n\n``stripPackageName`` is a boolean that when set to ``true`` will strip the package name from the import path.\n\nThis is useful for projects that have custom module resolvers where you want to be able to replace the whole path.\n\n## Install\n```sh\nnpm install esdoc-importpath-plugin\n```\n\n## Config\n\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-importpath-plugin\",\n      \"option\": {\n        \"replaces\": [\n          {\"from\": \"^src/\", \"to\": \"lib\"}\n        ]\n      }\n    }\n  ]\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://twitter.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-importpath-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-importpath-plugin\",\n  \"version\": \"1.0.2\",\n  \"description\": \"A import path plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"import\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/src/Plugin.js",
    "content": "const fs = require('fs');\n\nclass Plugin {\n  onHandleConfig(ev) {\n    this._config = ev.data.config;\n  }\n\n  onHandleDocs(ev) {\n    const packagePath = this._config.package || './package.json';\n    const option = ev.data.option;\n\n    for (let item of option.replaces) {\n      item.from = new RegExp(item.from);\n    }\n\n    // get package.json\n    let packageName = '';\n    let mainPath = '';\n    try {\n      const packageJSON = fs.readFileSync(packagePath).toString();\n      const packageObj = JSON.parse(packageJSON);\n      packageName = packageObj.name;\n      if(packageObj.main) mainPath = packageObj.main;\n    } catch (e) {\n      // ignore\n    }\n\n    for (const doc of ev.data.docs) {\n      if (!doc.importPath) continue;\n\n      let importPath = doc.importPath;\n      if (packageName) importPath = importPath.replace(new RegExp(`^${packageName}/`), '');\n\n      for (let item of option.replaces) {\n        importPath = importPath.replace(item.from, item.to);\n      }\n\n      if (importPath === mainPath || importPath.trim().length === 0) {\n        doc.importPath = packageName;\n      } else if (packageName && option.stripPackageName !== true) {\n        doc.importPath = `${packageName}/${importPath}`;\n      } else {\n        doc.importPath = importPath;\n      }\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"package\": \"./test/package.json\",\n  \"plugins\": [\n    {\n      \"name\": \"./src/Plugin.js\",\n      \"option\": {\n        \"replaces\": [\n          {\"from\": \"^src/\", \"to\": \"lib/\"},\n          {\"from\": \"^lib/MyClass2.js\", \"to\": \"lib/foo\"}\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/package.json",
    "content": "{\n  \"name\": \"esdoc-importpath-plugin\",\n  \"main\": \"lib/Index.js\"\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/Index.js",
    "content": "export default class Index {\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/MyClass1.js",
    "content": "export default class MyClass1 {\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/MyClass2.js",
    "content": "export default class MyClass2 {\n}\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/src/all.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n\n  it('converts simply', ()=> {\n    const doc = find('name', 'MyClass1');\n    assert.equal(doc.importPath, 'esdoc-importpath-plugin/lib/MyClass1.js');\n  });\n\n  it('converts multiple', ()=>{\n    const doc = find('name', 'MyClass2');\n    assert.equal(doc.importPath, 'esdoc-importpath-plugin/lib/foo');\n  });\n\n  it('converts with package name', ()=>{\n    const doc = find('name', 'Index');\n    assert.equal(doc.importPath, 'esdoc-importpath-plugin');\n  });\n});\n"
  },
  {
    "path": "esdoc-importpath-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/CHANGELOG.md",
    "content": "# Changelog\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/README.md",
    "content": "# ESDoc Inject GTM Plugin\n\n## Install\n\n```bash\nnpm install esdoc-inject-gtm-plugin\n```\n\n## Config\n\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-inject-script-plugin\", \"option\": {\"enable\": true, \"id\": \"GTM-XXXXX\"}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\n\nMIT\n\n## Author\n\n[9renpoto](https://github.com/9renpoto)\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-inject-gtm-plugin\",\n  \"description\": \"A inject google-tag-manager plugin for ESDoc\",\n  \"version\": \"0.0.1\",\n  \"author\": \"9renpoto\",\n  \"dependencies\": {\n    \"cheerio\": \"^1.0.0-rc.2\",\n    \"fs-extra\": \"^4.0.1\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"^3.5.0\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"keywords\": [\n    \"esdoc\",\n    \"inject\",\n    \"plugin\",\n    \"script\"\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"src/Plugin.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  }\n}\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/src/Plugin.js",
    "content": "const fs = require(\"fs-extra\")\nconst path = require(\"path\")\nconst cheerio = require(\"cheerio\")\n\nconst toSnippet = id => {\n  return `<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','${id}');</script>`\n}\n\nclass Plugin {\n  onStart(ev) {\n    this._option = ev.data.option || {}\n    if (!(\"enable\" in this._option)) this._option.enable = true\n  }\n\n  onHandleContent(ev) {\n    if (!this._option.enable) return\n\n    const fileName = ev.data.fileName\n    if (path.extname(fileName) !== \".html\") return\n\n    const $ = cheerio.load(ev.data.content)\n\n    $(\"head\").append(toSnippet(this._option.id))\n\n    ev.data.content = $.html()\n  }\n\n  onPublish(ev) {\n    if (!this._option.enable) return\n    ev.data.writeFile(\"gtm.js\", toSnippet(this._option.id))\n  }\n}\n\nmodule.exports = new Plugin()\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./test/misc/publish-html-mock-plugin.js\"},\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"id\": \"GTM-XXXXX\"}}\n  ]\n}\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/misc/publish-html-mock-plugin.js",
    "content": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<header></header>\n</body>\n</html>\n`;\n  ev.data.writeFile('index.html', html);\n};\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-inject-gtm-plugin/test/src/MyClass.test.js",
    "content": "const assert = require(\"assert\")\nconst path = require(\"path\")\nconst fs = require(\"fs\")\nconst cheerio = require(\"cheerio\")\n\ndescribe(\"test inject script result:\", () => {\n  it(\"has injected script tag title\", () => {\n    const html = fs.readFileSync(\"./test/out/index.html\").toString()\n    const $ = cheerio.load(html)\n    assert.equal($(\"script\").length, 1)\n  })\n})\n"
  },
  {
    "path": "esdoc-inject-script-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-inject-script-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-inject-script-plugin/README.md",
    "content": "# ESDoc Inject Script Plugin\n## Install\n```bash\nnpm install esdoc-inject-script-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-inject-script-plugin\", \"option\": {\"enable\": true, \"scripts\": [\"./foo.js\"]}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-inject-script-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-inject-script-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A inject script plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"cheerio\": \"0.22.0\",\n    \"fs-extra\": \"1.0.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"inject\",\n    \"script\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-inject-script-plugin/src/Plugin.js",
    "content": "const fs = require('fs-extra');\nconst path = require('path');\nconst cheerio = require('cheerio');\n\nclass Plugin {\n  onStart(ev) {\n    this._option = ev.data.option || {};\n    if (!('enable' in this._option)) this._option.enable = true;\n  }\n\n  onHandleContent(ev) {\n    if (!this._option.enable) return;\n\n    const fileName = ev.data.fileName;\n    if (path.extname(fileName) !== '.html') return;\n\n    const $ = cheerio.load(ev.data.content);\n\n    let i = 0;\n    for (const script of this._option.scripts) {\n      const src = `./inject/script/${i}-${path.basename(script)}`;\n      $('head').append(`<script src=\"${src}\"></script>`);\n    }\n\n    ev.data.content = $.html();\n  }\n\n  onPublish(ev) {\n    if (!this._option.enable) return;\n\n    let i = 0;\n    for (const script of this._option.scripts) {\n      const outPath = `inject/script/${i}-${path.basename(script)}`;\n      const content = fs.readFileSync(script).toString();\n      ev.data.writeFile(outPath, content);\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./test/misc/publish-html-mock-plugin.js\"},\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"scripts\": [\"./test/misc/inject.js\"]}}\n  ]\n}\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/misc/inject.js",
    "content": "console.log('this is injected script');\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/misc/publish-html-mock-plugin.js",
    "content": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<header></header>\n</body>\n</html>\n`;\n  ev.data.writeFile('index.html', html);\n};\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-inject-script-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\nconst cheerio = require('cheerio');\n\ndescribe('test inject script result:', ()=> {\n  it('has injected script tag title', ()=>{\n    const html = fs.readFileSync('./test/out/index.html').toString();\n    const $ = cheerio.load(html);\n    assert.equal($('script[src=\"./inject/script/0-inject.js\"]').length, 1);\n  });\n\n  it('has injected script', ()=>{\n    const script = fs.readFileSync('./test/out/inject/script/0-inject.js').toString();\n    assert.equal(script, \"console.log('this is injected script');\\n\");\n\n  });\n});\n\n"
  },
  {
    "path": "esdoc-inject-style-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-inject-style-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-inject-style-plugin/README.md",
    "content": "# ESDoc Inject Style Plugin\n## Install\n```bash\nnpm install esdoc-inject-style-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-inject-style-plugin\", \"option\": {\"enable\": true, \"styles\": [\"./foo.css\"]}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-inject-style-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-inject-style-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A inject style plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"cheerio\": \"0.22.0\",\n    \"fs-extra\": \"1.0.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"inject\",\n    \"style\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-inject-style-plugin/src/Plugin.js",
    "content": "const fs = require('fs');\nconst path = require('path');\nconst cheerio = require('cheerio');\n\nclass Plugin {\n  onStart(ev) {\n    this._option = ev.data.option || {};\n    if (!('enable' in this._option)) this._option.enable = true;\n  }\n\n  onHandleContent(ev) {\n    if (!this._option.enable) return;\n    if (path.extname(ev.data.fileName) !== '.html') return;\n\n    const $ = cheerio.load(ev.data.content);\n\n    let i = 0;\n    for (const style of this._option.styles) {\n      const src = `./inject/css/${i}-${path.basename(style)}`;\n      $('head').append(`<link rel=\"stylesheet\" href=\"${src}\"/>`);\n    }\n\n    ev.data.content = $.html();\n  }\n\n  onPublish(ev) {\n    if (!this._option.enable) return;\n\n    let i = 0;\n    for (const style of this._option.styles) {\n      const outPath = `inject/css/${i}-${path.basename(style)}`;\n      const content = fs.readFileSync(style).toString();\n      ev.data.writeFile(outPath, content);\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./test/misc/publish-html-mock-plugin.js\"},\n    {\"name\": \"./src/Plugin.js\", \"option\": {\"styles\": [\"./test/misc/inject.css\"]}}\n  ]\n}\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/misc/inject.css",
    "content": "body { background: #eee; }\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/misc/publish-html-mock-plugin.js",
    "content": "exports.onPublish = function(ev) {\n  const html = `\n<!DOCTYPE html>\n<html>\n<head>\n<title>Home</title>\n</head>\n<body>\n<header></header>\n</body>\n</html>\n`;\n  ev.data.writeFile('index.html', html);\n};\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n}\n"
  },
  {
    "path": "esdoc-inject-style-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\nconst cheerio = require('cheerio');\n\ndescribe('test inject style result:', ()=> {\n  it('has injected style tag title', ()=>{\n    const html = fs.readFileSync('./test/out/index.html').toString();\n    const $ = cheerio.load(html);\n    assert.equal($('link[href=\"./inject/css/0-inject.css\"]').length, 1);\n  });\n\n  it('has injected style', ()=>{\n    const style = fs.readFileSync('./test/out/inject/css/0-inject.css').toString();\n    assert.equal(style, \"body { background: #eee; }\\n\");\n\n  });\n});\n\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/README.md",
    "content": "# ESDoc Integrate Manual Plugin\n## Install\n```bash\nnpm install esdoc-integrate-manual-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-integrate-manual-plugin\",\n      \"option\": {\n        \"index\": \"./manual/index.md\",\n        \"globalIndex\": true,\n        \"asset\": \"./manual/asset\",\n        \"files\": [\n          \"./manual/overview.md\",\n          \"./manual/design.md\",\n          \"./manual/installation.md\",\n          \"./manual/usage1.md\",\n          \"./manual/usage2.md\",\n          \"./manual/tutorial.md\",\n          \"./manual/configuration.md\",\n          \"./manual/example.md\",\n          \"./manual/advanced.md\",\n          \"./manual/faq.md\",\n          \"./CHANGELOG.md\"\n        ]\n      }\n    }\n  ]\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-integrate-manual-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A integrate manual plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"manual\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/src/Plugin.js",
    "content": "const fs = require('fs');\nconst path = require('path');\nconst assert = require('assert');\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n    this._option = ev.data.option;\n\n    this._exec();\n  }\n\n  _exec(){\n    this._setDefault();\n\n    const docs = this._generateDocs();\n    this._docs.push(...docs);\n  }\n\n  _setDefault() {\n    if (!this._option) return;\n\n    assert(this._option.files);\n    if (!('coverage' in this._option)) this._option.coverage = true;\n  }\n\n  _generateDocs() {\n    const manual = this._option;\n    const results = [];\n\n    if (!this._option) return results;\n\n    if (manual.index) {\n      results.push({\n        kind: 'manualIndex',\n        globalIndex: manual.globalIndex,\n        content: fs.readFileSync(manual.index).toString(),\n        longname: path.resolve(manual.index),\n        name: manual.index,\n        static: true,\n        access: 'public'\n      });\n    } else {\n      results.push({\n        kind: 'manualIndex',\n        globalIndex: false,\n        content: null,\n        longname: '', // longname does not must be null.\n        name: manual.index,\n        static: true,\n        access: 'public'\n      });\n    }\n\n    if (manual.asset) {\n      results.push({\n        kind: 'manualAsset',\n        longname: path.resolve(manual.asset),\n        name: manual.asset,\n        static: true,\n        access: 'public'\n      });\n    }\n\n    for (const filePath of manual.files) {\n      results.push({\n        kind: 'manual',\n        longname: path.resolve(filePath),\n        name: filePath,\n        content: fs.readFileSync(filePath).toString(),\n        static: true,\n        access: 'public'\n      });\n    }\n\n    return results;\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/CHANGELOG.md",
    "content": "# Changelog\n\n## 0.0.1\n- **Fix**\n  - fix a bug\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\n      \"name\": \"./src/Plugin.js\",\n      \"option\": {\n        \"index\": \"./test/manual/index.md\",\n        \"globalIndex\": true,\n        \"asset\": \"./test/manual/asset\",\n        \"files\": [\n          \"./test/manual/overview.md\",\n          \"./test/manual/design.md\",\n          \"./test/manual/installation.md\",\n          \"./test/manual/usage1.md\",\n          \"./test/manual/usage2.md\",\n          \"./test/manual/tutorial.md\",\n          \"./test/manual/configuration.md\",\n          \"./test/manual/example.md\",\n          \"./test/manual/advanced.md\",\n          \"./test/manual/faq.md\",\n          \"./test/CHANGELOG.md\"\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/advanced.md",
    "content": "# Advanced\nfoo\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/all.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/manual:', ()=>{\n  it('has manual index', ()=>{\n    const doc = find('longname', /manual\\/index.md$/);\n    assert.equal(doc.content, file(doc.name));\n    assert.equal(doc.globalIndex, true);\n  });\n\n  it('has manual asset', ()=>{\n    const doc = find('longname', /manual\\/asset$/);\n    assert(doc);\n  });\n\n  it('has manual overview', ()=>{\n    const doc = find('longname', /manual\\/overview.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual design', ()=>{\n    const doc = find('longname', /manual\\/design.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual installation', ()=>{\n    const doc = find('longname', /manual\\/installation.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual usage', ()=>{\n    const [doc1, doc2] = find('longname', /manual\\/usage1.md$/, /manual\\/usage2.md$/);\n    assert.equal(doc1.content, file(doc1.name));\n    assert.equal(doc2.content, file(doc2.name));\n  });\n\n  it('has manual tutorial', ()=>{\n    const doc = find('longname', /manual\\/tutorial.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual configuration', ()=>{\n    const doc = find('longname', /manual\\/configuration.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual example', ()=>{\n    const doc = find('longname', /manual\\/example.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual advanced', ()=>{\n    const doc = find('longname', /manual\\/advanced.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual faq', ()=>{\n    const doc = find('longname', /manual\\/faq.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n\n  it('has manual changelog', ()=>{\n    const doc = find('longname', /CHANGELOG.md$/);\n    assert.equal(doc.content, file(doc.name));\n  });\n});\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/configuration.md",
    "content": "# Configuration\nthis is configuration.\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/design.md",
    "content": "# Design\n## Concept\nfoo\n\n## Architecture\nfoo\n\n\n## Model\nfoo\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/example.md",
    "content": "# Example\n\n## Minimum Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\"\n}\n```\n\n## Integration Test Code Into Documentation\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"test\": {\n    \"type\": \"mocha\",\n    \"source\": \"./test\"\n  }\n}\n```\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/faq.md",
    "content": "# FAQ\n\n- [Goal](#goal)\n\n## Goal\nESDoc has two goals.\nThe first goal is reducing the cost to write an documentation, it is able to continuously maintenance.\nThe second goal is without looking the source code of a library, it is to be able to use the library.\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/index.md",
    "content": "# ESDoc Manual\ntbd\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/installation.md",
    "content": "# Installation\n\n```sh\nnpm install -g esdoc\n```\n\n## indent 2\n### indent 3\n#### indent 4\n##### indent 5\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/overview.md",
    "content": "# Overview\n\nESDoc is a documentation generator for JavaScript(ES6).\n\n<img class=\"screen-shot\" src=\"https://esdoc.org/image/top.png\" width=\"500px\" style=\"max-width: 500px; border: 1px solid rgba(0,0,0,0.1); box-shadow: 1px 1px 1px rgba(0,0,0,0.5);\">\n\n## Feature\n- Generates detailed document.\n- Measures document coverage.\n- Integrate test codes into documentation.\n- [ESDoc Hosting Service](https://doc.esdoc.org)\n\n## Demo\n- [ESDoc](https://esdoc.org/esdoc) is self-hosting &#x1F604;\n\n## License\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://twitter.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/tutorial.md",
    "content": "# Tutorial\nthis is tutorial.\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/usage1.md",
    "content": "# Usage\n\n```sh\nesdoc -c esdoc.json\n```\n\n``esdoc.json``\n\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\"\n}\n```\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/manual/usage2.md",
    "content": "# Usage2\nthis is usage2\n\n## h2 in usage2\nthis is h2 in usage2\n\n### h3 in usage2\nthis is h2 in usage3\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/src/Dummy.js",
    "content": "export default class TestDummy {}\n"
  },
  {
    "path": "esdoc-integrate-manual-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/README.md",
    "content": "# ESDoc Integrate Test Plugin\n## Install\n```bash\nnpm install esdoc-integrate-test-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./docs\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-integrate-test-plugin\",\n      \"option\": {\n        \"source\": \"./test/\",\n        \"interfaces\": [\"describe\", \"it\", \"context\", \"suite\", \"test\"],\n        \"includes\": [\"(spec|Spec|test|Test)\\\\.js$\"],\n        \"excludes\": [\"\\\\.config\\\\.js$\"]\n      }\n    }\n  ]\n}\n```\n\n- `source` is required\n- `interfaces` default is `[\"describe\", \"it\", \"context\", \"suite\", \"test\"]`\n- `includes` default is `[\"(spec|Spec|test|Test)\\\\.js$\"]`\n- `excludes` default is `[\"\\\\.config\\\\.js$\"]`\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-integrate-test-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A integrate test plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"test\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/Plugin.js",
    "content": "const assert = require('assert');\nconst path = require('path');\nconst fs = require('fs');\nconst TestDocFactory = require('./TestDocFactory');\n\n// hack\nconst ESParser = require('esdoc/out/src/Parser/ESParser').default;\nconst InvalidCodeLogger = require('esdoc/out/src/Util/InvalidCodeLogger').default;\nconst PathResolver = require('esdoc/out/src/Util/PathResolver').default;\nconst ASTUtil = require('esdoc/out/src/Util/ASTUtil').default;\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n    this._option = ev.data.option;\n\n    this._exec();\n  }\n\n  _exec() {\n    this._setDefault();\n\n    const docs = this._generateDocs();\n    this._docs.push(...docs);\n  }\n\n  _setDefault() {\n    if (!this._option) return;\n\n    const option = this._option;\n    assert(option.source);\n    if (!option.interfaces) option.interfaces = ['describe', 'it', 'context', 'suite', 'test'];\n    if (!option.includes) option.includes = ['(spec|Spec|test|Test)\\\\.js$'];\n    if (!option.excludes) option.excludes = ['\\\\.config\\\\.js$'];\n  }\n\n  /**\n   * Generate document from test code.\n   */\n  _generateDocs() {\n    const option = this._option;\n    const results = [];\n\n    if (!option) return results;\n\n    const includes = option.includes.map((v) => new RegExp(v));\n    const excludes = option.excludes.map((v) => new RegExp(v));\n    const sourceDirPath = path.resolve(option.source);\n\n    this._walk(option.source, (filePath)=>{\n      const relativeFilePath = path.relative(sourceDirPath, filePath);\n      let match = false;\n      for (const reg of includes) {\n        if (relativeFilePath.match(reg)) {\n          match = true;\n          break;\n        }\n      }\n      if (!match) return;\n\n      for (const reg of excludes) {\n        if (relativeFilePath.match(reg)) return;\n      }\n\n      console.log(`parse: ${filePath}`);\n      const temp = this._traverse(option.interfaces, option.source, filePath);\n      if (!temp) return;\n      results.push(...temp.results);\n\n      // todo: enable work\n      // asts.push({filePath: `test${path.sep}${relativeFilePath}`, ast: temp.ast});\n    });\n\n    return results;\n  }\n\n  /**\n   * walk recursive in directory.\n   * @param {string} dirPath - target directory path.\n   * @param {function(entryPath: string)} callback - callback for find file.\n   * @private\n   */\n  _walk(dirPath, callback) {\n    const entries = fs.readdirSync(dirPath);\n\n    for (const entry of entries) {\n      const entryPath = path.resolve(dirPath, entry);\n      const stat = fs.statSync(entryPath);\n\n      if (stat.isFile()) {\n        callback(entryPath);\n      } else if (stat.isDirectory()) {\n        this._walk(entryPath, callback);\n      }\n    }\n  }\n\n  /**\n   * traverse doc comment in test code file.\n   * @param {string[]} interfaces - test interface names.\n   * @param {string} inDirPath - root directory path.\n   * @param {string} filePath - target test code file path.\n   * @returns {Object} return document info that is traversed.\n   * @property {DocObject[]} results - this is contained test code.\n   * @property {AST} ast - this is AST of test code.\n   * @private\n   */\n  _traverse(interfaces, inDirPath, filePath) {\n    let ast;\n    try {\n      ast = ESParser.parse(filePath);\n    } catch (e) {\n      InvalidCodeLogger.showFile(filePath, e);\n      return null;\n    }\n    const pathResolver = new PathResolver(inDirPath, filePath);\n    const factory = new TestDocFactory(interfaces, ast, pathResolver);\n\n    ASTUtil.traverse(ast, (node, parent)=>{\n      try {\n        factory.push(node, parent);\n      } catch (e) {\n        InvalidCodeLogger.show(filePath, node);\n        throw e;\n      }\n    });\n\n    return {results: factory.results, ast: ast};\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/TestDoc.js",
    "content": "// hack: depends on esdoc internal class\nconst AbstractDoc = require('esdoc/out/src/Doc/AbstractDoc').default;\nconst ParamParser = require('esdoc/out/src/Parser/ParamParser').default;\n\n/**\n * Doc Class from test code file.\n */\nclass TestDoc extends AbstractDoc {\n  /**\n   * apply own tag.\n   * @private\n   */\n  _apply() {\n    super._apply();\n\n    this._$testTarget();\n\n    Reflect.deleteProperty(this._value, 'export');\n    Reflect.deleteProperty(this._value, 'importPath');\n    Reflect.deleteProperty(this._value, 'importStyle');\n  }\n\n  /** use name property of self node. */\n  _$kind() {\n    super._$kind();\n\n    this._value.kind = 'test';\n  }\n\n  /** set name and testId from special esdoc property. */\n  _$name() {\n    super._$name();\n\n    this._value.name = this._node._esdocTestName;\n    this._value.testId = this._node._esdocTestId;\n  }\n\n  /** set memberof to use parent test nod and file path. */\n  _$memberof() {\n    super._$memberof();\n\n    const chain = [];\n    let parent = this._node.parent;\n    while (parent) {\n      if (parent._esdocTestName) chain.push(parent._esdocTestName);\n      parent = parent.parent;\n    }\n\n    const filePath = this._pathResolver.filePath;\n\n    if (chain.length) {\n      this._value.memberof = `${filePath}~${chain.reverse().join('.')}`;\n      this._value.testDepth = chain.length;\n    } else {\n      this._value.memberof = filePath;\n      this._value.testDepth = 0;\n    }\n  }\n\n  /** set describe by using test node arguments. */\n  _$desc() {\n    super._$desc();\n    if (this._value.description) return;\n\n    this._value.description = this._node.arguments[0].value;\n  }\n\n  /** for @testTarget. */\n  _$testTarget() {\n    const values = this._findAllTagValues(['@test', '@testTarget']);\n    if (!values) return;\n\n    this._value.testTargets = [];\n    for (const value of values) {\n      const {typeText} = ParamParser.parseParamValue(value, true, false, false);\n      this._value.testTargets.push(typeText);\n    }\n  }\n\n  _$test() {\n    // alias of testTarget\n  }\n}\n\nmodule.exports = TestDoc;\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/TestDocFactory.js",
    "content": "const assert = require('assert');\nconst TestDoc = require('./TestDoc');\nconst TestFileDoc = require('./TestFileDoc');\n// hack: depends on ESDoc internal class\nconst CommentParser = require('esdoc/out/src/Parser/CommentParser').default;\n\nconst already = Symbol('already');\n\n/**\n * Test doc factory class.\n * @example\n * let factory = new TestDocFactory('mocha', ast, pathResolver);\n * factory.push(node, parentNode);\n * let results = factory.results;\n */\nclass TestDocFactory {\n  /**\n   * get unique id.\n   * @returns {number} unique id.\n   * @private\n   */\n  static _getUniqueId() {\n    if (!this._sequence) /** @type {number} */ this._sequence = 0;\n\n    return this._sequence++;\n  }\n\n  /**\n   * @type {DocObject[]}\n   */\n  get results() {\n    return [...this._results];\n  }\n\n  /**\n   * create instance.\n   * @param {string[]} interfaces - test interface names.\n   * @param {AST} ast - AST of test code.\n   * @param {PathResolver} pathResolver - path resolver of test code.\n   */\n  constructor(interfaces, ast, pathResolver) {\n    /** @type {string} */\n    this._interfaces = interfaces;\n\n    /** @type {AST} */\n    this._ast = ast;\n\n    /** @type {PathResolver} */\n    this._pathResolver = pathResolver;\n\n    /** @type {DocObject[]} */\n    this._results = [];\n\n    // file doc\n    const doc = new TestFileDoc(ast, ast, pathResolver, []);\n    this._results.push(doc.value);\n  }\n\n  /**\n   * push node, and factory process the node.\n   * @param {ASTNode} node - target node.\n   * @param {ASTNode} parentNode - parent node of target node.\n   */\n  push(node, parentNode) {\n    if (node[already]) return;\n\n    node[already] = true;\n    Reflect.defineProperty(node, 'parent', {value: parentNode});\n\n    this._push(node);\n  }\n\n  /**\n   * push node as mocha test code.\n   * @param {ASTNode} node - target node.\n   * @private\n   */\n  _push(node) {\n    if (node.type !== 'ExpressionStatement') return;\n\n    const expression = node.expression;\n    if (expression.type !== 'CallExpression') return;\n\n    if (!this._interfaces.includes(expression.callee.name)) return;\n\n    expression[already] = true;\n    Reflect.defineProperty(expression, 'parent', {value: node});\n\n    let tags = [];\n    if (node.leadingComments && node.leadingComments.length) {\n      const comment = node.leadingComments[node.leadingComments.length - 1];\n      tags = CommentParser.parse(comment);\n    }\n\n    const uniqueId = this.constructor._getUniqueId();\n    expression._esdocTestId = uniqueId;\n    expression._esdocTestName = expression.callee.name + uniqueId;\n\n    const testDoc = new TestDoc(this._ast, expression, this._pathResolver, tags);\n\n    this._results.push(testDoc.value);\n  }\n}\n\nmodule.exports = TestDocFactory;\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/src/TestFileDoc.js",
    "content": "// hack: depends on esdoc internal class\nconst FileDoc = require('esdoc/out/src/Doc/FileDoc').default;\n\n/**\n * Doc class for test code file.\n */\nclass TestFileDoc extends FileDoc {\n  /** set ``testFile`` to kind. */\n  _$kind() {\n    this._value.kind = 'testFile';\n  }\n}\n\nmodule.exports = TestFileDoc;\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\n      \"name\": \"./src/Plugin.js\",\n      \"option\": {\n        \"source\": \"./test/test\",\n        \"excludes\": [\"\\\\.test\\\\.js$\"]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/src/Dummy.js",
    "content": "export default class Dummy {\n}\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/test/Test.js",
    "content": "/**\n * @test {TestTarget1}\n */\ndescribe('describe/', ()=>{\n  /**\n   * @test {TestTarget2}\n   */\n  it('describe/it', ()=>{});\n\n  /**\n   * @test {TestTarget3}\n   */\n  describe('describe/describe/', ()=>{\n    /**\n     * @test {TestTarget4}\n     */\n    it('describe/describe/it', ()=>{});\n  });\n\n  /**\n   * @test {TestTarget5}\n   */\n  context('describe/context/', ()=>{\n    /**\n     * @test {TestTarget6}\n     */\n    it('describe/context/it', ()=>{});\n  });\n});\n\n/**\n * @test {TestTarget7}\n */\nsuite('suite/', ()=>{\n  /**\n   * @test {TestTarget8}\n   */\n  test('suite/test', ()=>{});\n\n  /**\n   * @test {TestTarget9}\n   */\n  suite('suite/suite/', ()=>{\n    /**\n     * @test {TestTarget10}\n     */\n    test('suite/suite/test', ()=>{});\n  })\n});\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/test/Test.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Test.js:', ()=>{\n  it('has describe/', ()=>{\n    const doc = find('longname', 'test/Test.js~describe0');\n    assert.equal(doc.testId, 0);\n    assert.equal(doc.testDepth, 0);\n    assert.equal(doc.description, 'describe/');\n    assert.deepEqual(doc.testTargets, ['TestTarget1']);\n  });\n\n  it('has describe/it', ()=>{\n    const doc = find('longname', 'test/Test.js~describe0.it1');\n    assert.equal(doc.testId, 1);\n    assert.equal(doc.testDepth, 1);\n    assert.equal(doc.description, 'describe/it');\n    assert.deepEqual(doc.testTargets, ['TestTarget2']);\n  });\n\n  it('has describe/describe', ()=>{\n    const doc = find('longname', 'test/Test.js~describe0.describe2');\n    assert.equal(doc.testId, 2);\n    assert.equal(doc.testDepth, 1);\n    assert.equal(doc.description, 'describe/describe/');\n    assert.deepEqual(doc.testTargets, ['TestTarget3']);\n  });\n\n  it('has describe/describe/it', ()=>{\n    const doc = find('longname', 'test/Test.js~describe0.describe2.it3');\n    assert.equal(doc.testId, 3);\n    assert.equal(doc.testDepth, 2);\n    assert.equal(doc.description, 'describe/describe/it');\n    assert.deepEqual(doc.testTargets, ['TestTarget4']);\n  });\n\n  it('has describe/context/it', ()=>{\n    const doc = find('longname', 'test/Test.js~describe0.context4.it5');\n    assert.equal(doc.testId, 5);\n    assert.equal(doc.testDepth, 2);\n    assert.equal(doc.description, 'describe/context/it');\n    assert.deepEqual(doc.testTargets, ['TestTarget6']);\n  });\n\n  it('has suite/', ()=>{\n    const doc = find('longname', 'test/Test.js~suite6');\n    assert.equal(doc.testId, 6);\n    assert.equal(doc.testDepth, 0);\n    assert.equal(doc.description, 'suite/');\n    assert.deepEqual(doc.testTargets, ['TestTarget7']);\n  });\n\n  it('has suite/test', ()=>{\n    const doc = find('longname', 'test/Test.js~suite6.test7');\n    assert.equal(doc.testId, 7);\n    assert.equal(doc.testDepth, 1);\n    assert.equal(doc.description, 'suite/test');\n    assert.deepEqual(doc.testTargets, ['TestTarget8']);\n  });\n\n  it('has suite/suite/', ()=>{\n    const doc = find('longname', 'test/Test.js~suite6.suite8');\n    assert.equal(doc.testId, 8);\n    assert.equal(doc.testDepth, 1);\n    assert.equal(doc.description, 'suite/suite/');\n    assert.deepEqual(doc.testTargets, ['TestTarget9']);\n  });\n\n  it('has suite/suite/test', ()=>{\n    const doc = find('longname', 'test/Test.js~suite6.suite8.test9');\n    assert.equal(doc.testId, 9);\n    assert.equal(doc.testDepth, 2);\n    assert.equal(doc.description, 'suite/suite/test');\n    assert.deepEqual(doc.testTargets, ['TestTarget10']);\n  });\n});\n\n\n"
  },
  {
    "path": "esdoc-integrate-test-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-jsx-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-jsx-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-jsx-plugin/README.md",
    "content": "# ESDoc JSX Plugin\n## Install\n```bash\nnpm install esdoc-jsx-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-jsx-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n- `enable` is default `true`\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-jsx-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-jsx-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A JSX plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"jsx\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-jsx-plugin/src/Plugin.js",
    "content": "class Plugin {\n  onHandleCodeParser(ev) {\n    const option = ev.data.option || {};\n    const plugins = ev.data.parserOption.plugins;\n\n    if (!('enable' in option)) option.enable = true;\n\n    if (option.enable) plugins.push('jsx');\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-jsx-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-jsx-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-jsx-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n  method(){\n    return <div>hello</div>;\n  }\n}\n"
  },
  {
    "path": "esdoc-jsx-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('can parse jsx', ()=>{\n    const doc = find('longname', 'src/MyClass.js~MyClass#method');\n    assert(doc);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-jsx-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-lint-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## Next\n- **Fix**\n  - Crash if export with variable (e.g. `/** foo */ export const foo = (p)=>{}`) ([#48](https://github.com/esdoc/esdoc-plugins/pull/48)). Thanks [@paztis](https://github.com/paztis)\n\n## 1.0.1 (2017-09-09)\n- **Fix**\n  - Disabling lint bug ([#4](https://github.com/esdoc/esdoc-plugins/pull/4), [#19](https://github.com/esdoc/esdoc-plugins/pull/19)) Thanks [@pzuraq](https://github.com/pzuraq) [@moshest](https://github.com/moshest)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-lint-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-lint-plugin/README.md",
    "content": "# ESDoc Lint Plugin\n## Install\n```bash\nnpm install esdoc-lint-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-lint-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n`enable` is default `true`\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n\n"
  },
  {
    "path": "esdoc-lint-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-lint-plugin\",\n  \"version\": \"1.0.1\",\n  \"description\": \"A lint plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"lint\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-lint-plugin/src/Plugin.js",
    "content": "const path = require('path');\nconst fs = require('fs');\n// hack: using a internal code of esdoc.\nconst ASTNodeContainer = require('esdoc/out/src/Util/ASTNodeContainer.js').default;\n\n/**\n * Lint Output Builder class.\n */\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n    this._option = ev.data.option || {};\n    this._results = null;\n    if (!('enable' in this._option)) this._option.enable = true;\n  }\n\n  onPublish(ev) {\n    if (!this._option.enable) return;\n\n    const tmpResults = [];\n    const docs = this._docs.filter(v => ['method', 'function'].includes(v.kind));\n    for (const doc of docs) {\n      if (doc.undocument) continue;\n\n      const node = ASTNodeContainer.getNode(doc.__docId__);\n      const codeParams = this._getParamsFromNode(node);\n      const docParams = this._getParamsFromDoc(doc);\n      if (this._match(codeParams, docParams)) continue;\n\n      tmpResults.push({node, doc, codeParams, docParams});\n    }\n\n    const results = this._formatResult(tmpResults);\n\n    ev.data.writeFile('lint.json', JSON.stringify(results, null, 2));\n\n    this._results = results;\n  }\n\n  onComplete() {\n    if (!this._option.enable) return;\n\n    this._showResult();\n  }\n\n  /**\n   * get variable names of method argument.\n   * @param {ASTNode} node - target node.\n   * @returns {string[]} variable names.\n   * @private\n   */\n  _getParamsFromNode(node) {\n    let params;\n    switch (node.type) {\n      case 'FunctionExpression':\n      case 'FunctionDeclaration':\n        params = node.params || [];\n        break;\n      case 'ClassMethod':\n        params = node.params || [];\n        break;\n      case 'ArrowFunctionExpression':\n        params = node.params || [];\n        break;\n      default:\n        throw new Error(`unknown node type. type = ${node.type}`);\n    }\n\n    const result = [];\n    for (const param of params) {\n      switch (param.type) {\n        case 'Identifier':\n          result.push(param.name);\n          break;\n        case 'AssignmentPattern':\n          if (param.left.type === 'Identifier') {\n            result.push(param.left.name);\n          } else if (param.left.type === 'ObjectPattern') {\n            result.push('*');\n          }\n          break;\n        case 'RestElement':\n          result.push(param.argument.name);\n          break;\n        case 'ObjectPattern':\n          result.push('*');\n          break;\n        case 'ArrayPattern':\n          result.push('*');\n          break;\n        default:\n          throw new Error(`unknown param type: ${param.type}`);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * get variable names of method argument.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string[]} variable names.\n   * @private\n   */\n  _getParamsFromDoc(doc) {\n    const params = doc.params || [];\n    return params.map(v => v.name).filter(v => !v.includes('.')).filter(v => !v.includes('['));\n  }\n\n  _match(codeParams, docParams) {\n    if (codeParams.length !== docParams.length) return false;\n\n    for (let i = 0; i < codeParams.length; i++) {\n      if (codeParams[i] === '*') {\n        // nothing\n      } else if (codeParams[i] !== docParams[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * show invalid lint code.\n   * @param {Object[]} tmpResults - target results.\n   * @param {DocObject} tmpResults[].doc\n   * @param {ASTNode} tmpResults[].node\n   * @param {string[]} tmpResults[].codeParams\n   * @param {string[]} tmpResults[].docParams\n   * @private\n   */\n  _formatResult(tmpResults) {\n    const results = [];\n    for (const result of tmpResults) {\n      const doc = result.doc;\n      const node = result.node;\n      const filePath = doc.longname.split('~')[0];\n      const name = doc.longname.split('~')[1];\n\n      let startLineNumber;\n\n      if (node.leadingComments) {\n        const comment = node.leadingComments[node.leadingComments.length - 1];\n        startLineNumber = comment.loc.start.line;\n      } else if (node.parent.leadingComments) {\n        const comment = node.parent.leadingComments[node.parent.leadingComments.length - 1];\n        startLineNumber = comment.loc.start.line;\n      } else {\n        // Missing leadingComments fallback: will report the node start line instead of the comment one\n        startLineNumber = node.loc.start.line;\n      }\n\n      const endLineNumber = node.loc.start.line;\n      const fileDoc = this._docs.find(tag => tag.kind === 'file' && tag.name === filePath);\n      const lines = fileDoc.content.split('\\n');\n      const targetLines = [];\n\n      for (let i = startLineNumber - 1; i < endLineNumber; i++) {\n        targetLines.push({lineNumber: i, line: lines[i]});\n      }\n\n      results.push({\n        name: name,\n        filePath: filePath,\n        lines: targetLines,\n        codeParams: result.codeParams,\n        docParams: result.docParams,\n      });\n    }\n\n    return results;\n  }\n\n  _showResult() {\n    if (!this._option.enable) return;\n    for (const result of this._results) {\n      console.log(`\u001b[33mwarning: signature mismatch: ${result.name} ${result.filePath}#${result.lines[0].lineNumber}\u001b[32m`);\n      for (const line of result.lines) {\n        console.log(`${line.lineNumber}| ${line.line}`);\n      }\n      console.log('\u001b[0m');\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-lint-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-lint-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-lint-plugin/test/src/MyArrowFunction.js",
    "content": "\n/**\n * this is arrowFunction1 with a good import\n * @param p1\n * @param p2\n */\nexport const arrowFunction1 = (p1, p2) => {};\n\n/**\n * this is arrowFunction2 with a bad import\n * necessary to tests the missing leadingComments\n * @param p1\n */\nexport const arrowFunction2 = (p1, p2) => {};\n"
  },
  {
    "path": "esdoc-lint-plugin/test/src/MyClass.js",
    "content": "/**\n * this is MyClass.\n */\nexport default class MyClass {\n  /**\n   * this is method1.\n   * @param {number} x\n   */\n  method1(p){}\n\n  /**\n   * this is method2.\n   * @param {number} x1\n   * @param {number[]} x2\n   * @param {Object} x3\n   */\n  method2(p1 = 10, p2 = [1,2,3], p3 = {foo:1, bar: 2}){}\n\n  /**\n   * this is method3.\n   * @param {number[]} x\n   */\n  method3(...p){}\n\n  /**\n   * this is method4.\n   * @param {Object} o\n   */\n  method4({p1, p2}, {p3, p4}){}\n}\n"
  },
  {
    "path": "esdoc-lint-plugin/test/src/results.test.js",
    "content": "const assert = require('assert');\nconst fs = require('fs');\nconst path = require('path');\n\ndescribe('test/results.js:', ()=>{\n  const tmp = fs.readFileSync('./test/out/lint.json').toString();\n  const lintResults = JSON.parse(tmp);\n\n  it('has 5 lint errors.', ()=>{\n    assert.equal(lintResults.length, 5);\n    assert.equal(lintResults[0].name, 'arrowFunction2');\n    assert.equal(lintResults[1].name, 'MyClass#method1');\n    assert.equal(lintResults[2].name, 'MyClass#method2');\n    assert.equal(lintResults[3].name, 'MyClass#method3');\n    assert.equal(lintResults[4].name, 'MyClass#method4');\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/.babelrc",
    "content": "{\n  \"plugins\": [\n    \"transform-es2015-modules-commonjs\"\n  ]\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## Next\n- **Fix**\n  - Crash if object key includes a comma ([#49](https://github.com/esdoc/esdoc-plugins/pull/49)). Thanks [@josephschmitt](https://github.com/josephschmitt)\n\n## 1.1.1 (2018-04-29)\n- **Chore**\n  - Update `marked`\n\n## 1.1.0 (2017-09-10)\n- **Feat**\n  - Support custom template ([#12](https://github.com/esdoc/esdoc-plugins/pull/12)) Thanks [@andersevenrud](https://github.com/andersevenrud)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-publish-html-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-publish-html-plugin/README.md",
    "content": "# ESDoc Publish HTML Plugin\n## Install\n```bash\nnpm install esdoc-publish-html-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-publish-html-plugin\"}\n  ]\n}\n```\n\n## Custom Template\nTo use a custom template (ex `my-template` placed in the working directory):\n```json\n    {\"name\": \"esdoc-publish-html-plugin\", \"option\": {\"template\": \"my-template\"}}\n```\n\nWe recommend that you base on [the original template](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-publish-html-plugin/src/Builder/template).\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-publish-html-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-publish-html-plugin\",\n  \"version\": \"1.1.1\",\n  \"description\": \"A publish HTML plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"cheerio\": \"0.22.0\",\n    \"fs-extra\": \"1.0.0\",\n    \"escape-html\": \"1.0.3\",\n    \"babel-generator\": \"6.11.4\",\n    \"ice-cap\": \"0.0.4\",\n    \"marked\": \"0.3.19\",\n    \"taffydb\": \"2.7.2\"\n  },\n  \"devDependencies\": {\n    \"babel-cli\": \"6.11.4\",\n    \"babel-plugin-transform-es2015-modules-commonjs\": \"6.11.5\",\n    \"babel-register\": \"6.11.6\",\n    \"esdoc\": \"^1.1.0\",\n    \"esdoc-accessor-plugin\": \"^1.0.0\",\n    \"esdoc-brand-plugin\": \"^1.0.0\",\n    \"esdoc-coverage-plugin\": \"^1.1.0\",\n    \"esdoc-ecmascript-proposal-plugin\": \"^1.0.0\",\n    \"esdoc-external-ecmascript-plugin\": \"^1.0.0\",\n    \"esdoc-integrate-manual-plugin\": \"^1.0.0\",\n    \"esdoc-integrate-test-plugin\": \"^1.0.0\",\n    \"esdoc-type-inference-plugin\": \"^1.0.1\",\n    \"esdoc-undocumented-identifier-plugin\": \"^1.0.0\",\n    \"esdoc-unexported-identifier-plugin\": \"^1.0.0\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"build\": \"rm -rf ./out/src && babel --out-dir out/src --ignore 'Builder/template' src && cp -a src/Builder/template out/src/Builder/\",\n    \"test\": \"rm -rf ./test/fixture/out && mocha -t 10000 --require ./node_modules/babel-register --require ./test/src/init.js --recursive ./test/src -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"publish\",\n    \"html\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"out/src\",\n    \"README.md\"\n  ],\n  \"main\": \"out/src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/ClassDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\nimport {parseExample} from './util.js';\n\n/**\n * Class Output Builder class.\n */\nexport default class ClassDocBuilder extends DocBuilder {\n  exec(writeFile) {\n    const ice = this._buildLayoutDoc();\n    ice.autoDrop = false;\n    const docs = this._find({kind: ['class']});\n    for (const doc of docs) {\n      const fileName = this._getOutputFileName(doc);\n      const baseUrl = this._getBaseUrl(fileName);\n      const title = this._getTitle(doc);\n      ice.load('content', this._buildClassDoc(doc), IceCap.MODE_WRITE);\n      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);\n      ice.text('title', title, IceCap.MODE_WRITE);\n      writeFile(fileName, ice.html);\n    }\n  }\n\n  /**\n   * build class output.\n   * @param {DocObject} doc - class doc object.\n   * @returns {IceCap} built output.\n   * @private\n   */\n  _buildClassDoc(doc) {\n    const expressionExtends = this._buildExpressionExtendsHTML(doc);\n    const mixinClasses = this._buildMixinClassesHTML(doc);\n    const extendsChain = this._buildExtendsChainHTML(doc);\n    const directSubclass = this._buildDirectSubclassHTML(doc);\n    const indirectSubclass = this._buildIndirectSubclassHTML(doc);\n    const instanceDocs = this._find({kind: 'variable'}).filter((v)=> {\n      return v.type && v.type.types.includes(doc.longname);\n    });\n\n    const ice = new IceCap(this._readTemplate('class.html'));\n\n    // header\n    if (doc.export && doc.importPath && doc.importStyle) {\n      const link = this._buildFileDocLinkHTML(doc, doc.importPath);\n      ice.into('importPath', `import ${doc.importStyle} from '${link}'`, (code, ice)=>{\n        ice.load('importPathCode', code);\n      });\n    }\n    ice.text('access', doc.access);\n    ice.text('kind', doc.interface ? 'interface' : 'class');\n    ice.load('source', this._buildFileDocLinkHTML(doc, 'source'), 'append');\n    ice.text('since', doc.since, 'append');\n    ice.text('version', doc.version, 'append');\n    ice.load('variation', this._buildVariationHTML(doc), 'append');\n\n    ice.into('expressionExtends', expressionExtends, (expressionExtends, ice)=> ice.load('expressionExtendsCode', expressionExtends));\n    ice.load('mixinExtends', mixinClasses, 'append');\n    ice.load('extendsChain', extendsChain, 'append');\n    ice.load('directSubclass', directSubclass, 'append');\n    ice.load('indirectSubclass', indirectSubclass, 'append');\n    ice.load('implements', this._buildDocsLinkHTML(doc.implements, null, false, ', '), 'append');\n    ice.load('indirectImplements', this._buildDocsLinkHTML(doc._custom_indirect_implements, null, false, ', '), 'append');\n    ice.load('directImplemented', this._buildDocsLinkHTML(doc._custom_direct_implemented, null, false, ', '), 'append');\n    ice.load('indirectImplemented', this._buildDocsLinkHTML(doc._custom_indirect_implemented, null, false, ', '), 'append');\n\n    // self\n    ice.text('name', doc.name);\n    ice.load('description', doc.description);\n    ice.load('deprecated', this._buildDeprecatedHTML(doc));\n    ice.load('experimental', this._buildExperimentalHTML(doc));\n    ice.load('see', this._buildDocsLinkHTML(doc.see), 'append');\n    ice.load('todo', this._buildDocsLinkHTML(doc.todo), 'append');\n    ice.load('decorator', this._buildDecoratorHTML(doc), 'append');\n\n    ice.into('instanceDocs', instanceDocs, (instanceDocs, ice)=>{\n      ice.loop('instanceDoc', instanceDocs, (i, instanceDoc, ice)=>{\n        ice.load('instanceDoc', this._buildDocLinkHTML(instanceDoc.longname));\n      });\n    });\n\n    ice.into('exampleDocs', doc.examples, (examples, ice)=>{\n      ice.loop('exampleDoc', examples, (i, example, ice)=>{\n        const parsed = parseExample(example);\n        ice.text('exampleCode', parsed.body);\n        ice.text('exampleCaption', parsed.caption);\n      });\n    });\n\n    ice.into('tests', doc._custom_tests, (tests, ice)=>{\n      ice.loop('test', tests, (i, test, ice)=>{\n        const testDoc = this._find({longname: test})[0];\n        ice.load('test', this._buildFileDocLinkHTML(testDoc, testDoc.testFullDescription));\n      });\n    });\n\n    // summary\n    ice.load('staticMemberSummary', this._buildSummaryHTML(doc, 'member', 'Members', true));\n    ice.load('staticMethodSummary', this._buildSummaryHTML(doc, 'method', 'Methods', true));\n    ice.load('constructorSummary', this._buildSummaryHTML(doc, 'constructor', 'Constructor', false));\n    ice.load('memberSummary', this._buildSummaryHTML(doc, 'member', 'Members', false));\n    ice.load('methodSummary', this._buildSummaryHTML(doc, 'method', 'Methods', false));\n\n    ice.load('inheritedSummary', this._buildInheritedSummaryHTML(doc), 'append');\n\n    // detail\n    ice.load('staticMemberDetails', this._buildDetailHTML(doc, 'member', 'Members', true));\n    ice.load('staticMethodDetails', this._buildDetailHTML(doc, 'method', 'Methods', true));\n    ice.load('constructorDetails', this._buildDetailHTML(doc, 'constructor', 'Constructors', false));\n    ice.load('memberDetails', this._buildDetailHTML(doc, 'member', 'Members', false));\n    ice.load('methodDetails', this._buildDetailHTML(doc, 'method', 'Methods', false));\n\n    return ice;\n  }\n\n  /**\n   * build variation of doc.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} variation links html.\n   * @private\n   * @experimental\n   */\n  _buildVariationHTML(doc) {\n    const variationDocs = this._find({memberof: doc.memberof, name: doc.name});\n    const html = [];\n    for (const variationDoc of variationDocs) {\n      if (variationDoc.variation === doc.variation) continue;\n\n      html.push(this._buildDocLinkHTML(variationDoc.longname, `(${variationDoc.variation || 1})`));\n    }\n\n    return html.join(', ');\n  }\n\n  /**\n   * build mixin extends html.\n   * @param {DocObject} doc - target class doc.\n   * @return {string} mixin extends html.\n   */\n  _buildMixinClassesHTML(doc) {\n    if (!doc.extends) return '';\n    if (doc.extends.length <= 1) return '';\n\n    const links = [];\n    for (const longname of doc.extends) {\n      links.push(this._buildDocLinkHTML(longname));\n    }\n\n    return `<div>${links.join(', ')}</div>`;\n  }\n\n  /**\n   * build expression extends html.\n   * @param {DocObject} doc - target class doc.\n   * @return {string} expression extends html.\n   */\n  _buildExpressionExtendsHTML(doc) {\n    if (!doc.expressionExtends) return '';\n\n    const html = doc.expressionExtends.replace(/[A-Z_$][a-zA-Z0-9_$]*/g, (v)=>{\n      return this._buildDocLinkHTML(v);\n    });\n\n    return `class ${doc.name} extends ${html}`;\n  }\n\n  /**\n   * build class ancestor extends chain.\n   * @param {DocObject} doc - target class doc.\n   * @returns {string} extends chain links html.\n   * @private\n   */\n  _buildExtendsChainHTML(doc) {\n    if (!doc._custom_extends_chains) return '';\n    if (doc.extends.length > 1) return '';\n\n    const links = [];\n    for (const longname of doc._custom_extends_chains) {\n      links.push(this._buildDocLinkHTML(longname));\n    }\n\n    links.push(doc.name);\n\n    return `<div>${links.join(' → ')}</div>`;\n  }\n\n  /**\n   * build in-direct subclass list.\n   * @param {DocObject} doc - target class doc.\n   * @returns {string} html of in-direct subclass links.\n   * @private\n   */\n  _buildIndirectSubclassHTML(doc) {\n    if (!doc._custom_indirect_subclasses) return '';\n\n    const links = [];\n    for (const longname of doc._custom_indirect_subclasses) {\n      links.push(this._buildDocLinkHTML(longname));\n    }\n\n    return `<div>${links.join(', ')}</div>`;\n  }\n\n  /**\n   * build direct subclass list.\n   * @param {DocObject} doc - target class doc.\n   * @returns {string} html of direct subclass links.\n   * @private\n   */\n  _buildDirectSubclassHTML(doc) {\n    if (!doc._custom_direct_subclasses) return '';\n\n    const links = [];\n    for (const longname of doc._custom_direct_subclasses) {\n      links.push(this._buildDocLinkHTML(longname));\n    }\n\n    return `<div>${links.join(', ')}</div>`;\n  }\n\n  /**\n   * build inherited method/member summary.\n   * @param {DocObject} doc - target class doc.\n   * @returns {string} html of inherited method/member from ancestor classes.\n   * @private\n   */\n  _buildInheritedSummaryHTML(doc) {\n    if (['class', 'interface'].indexOf(doc.kind) === -1) return '';\n\n    const longnames = [\n      ...doc._custom_extends_chains || []\n      // ...doc.implements || [],\n      // ...doc._custom_indirect_implements || [],\n    ];\n\n    const html = [];\n    for (const longname of longnames) {\n      const superDoc = this._find({longname})[0];\n\n      if (!superDoc) continue;\n\n      const targetDocs = this._find({memberof: longname, kind: ['member', 'method', 'get', 'set']});\n\n      targetDocs.sort((a, b)=>{\n        if (a.static !== b.static) return -(a.static - b.static);\n\n        let order = {get: 0, set: 0, member: 1, method: 2};\n        if (order[a.kind] !== order[b.kind]) {\n          return order[a.kind] - order[b.kind];\n        }\n\n        order = {public: 0, protected: 1, private: 2};\n        if (a.access !== b.access) return order[a.access] - order[b.access];\n\n        if (a.name !== b.name) return a.name < b.name ? -1 : 1;\n\n        order = {get: 0, set: 1, member: 2};\n        return order[a.kind] - order[b.kind];\n      });\n\n      const title = `<span class=\"toggle closed\"></span> From ${superDoc.kind} ${this._buildDocLinkHTML(longname, superDoc.name)}`;\n      const result = this._buildSummaryDoc(targetDocs, '----------');\n      if (result) {\n        result.load('title', title, IceCap.MODE_WRITE);\n        html.push(result.html);\n      }\n    }\n\n    return html.join('\\n');\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/DocBuilder.js",
    "content": "/* eslint-disable max-lines */\nimport fs from 'fs';\nimport path from 'path';\nimport escape from 'escape-html';\nimport IceCap from 'ice-cap';\nimport {shorten, parseExample, escapeURLHash} from './util.js';\nimport DocResolver from './DocResolver.js';\nimport NPMUtil from 'esdoc/out/src/Util/NPMUtil.js';\n\n/**\n * Builder base class.\n */\nexport default class DocBuilder {\n  /**\n   * create instance.\n   * @param {String} template - template absolute path\n   * @param {Taffy} data - doc object database.\n   */\n  constructor(template, data, tags) {\n    this._template = template;\n    this._data = data;\n    this._tags = tags;\n    new DocResolver(this).resolve();\n  }\n\n  /* eslint-disable no-unused-vars */\n  /**\n   * execute building output.\n   * @abstract\n   * @param {function(html: string, filePath: string)} writeFile - is called each manual.\n   * @param {function(src: string, dest: string)} copyDir - is called asset.\n   */\n  exec(writeFile, copyDir) {\n  }\n\n  /**\n   * find doc object.\n   * @param {...Object} cond - find condition.\n   * @returns {DocObject[]} found doc objects.\n   * @private\n   */\n  _find(...cond) {\n    return this._orderedFind(null, ...cond);\n  }\n\n  /**\n   * find all identifiers with kind grouping.\n   * @returns {{class: DocObject[], interface: DocObject[], function: DocObject[], variable: DocObject[], typedef: DocObject[], external: DocObject[]}} found doc objects.\n   * @private\n   */\n  _findAllIdentifiersKindGrouping() {\n    const result = {\n      class: this._find([{kind: 'class', interface: false}]),\n      interface: this._find([{kind: 'class', interface: true}]),\n      function: this._find([{kind: 'function'}]),\n      variable: this._find([{kind: 'variable'}]),\n      typedef: this._find([{kind: 'typedef'}]),\n      external: this._find([{kind: 'external'}]).filter(v => !v.builtinExternal)\n    };\n    return result;\n  }\n\n  /**\n   * fuzzy find doc object by name.\n   * - equal with longname\n   * - equal with name\n   * - include in longname\n   * - include in ancestor\n   *\n   * @param {string} name - target identifier name.\n   * @param {string} [kind] - target kind.\n   * @returns {DocObject[]} found doc objects.\n   * @private\n   */\n  _findByName(name, kind = null) {\n    let docs;\n\n    if (kind) {\n      docs = this._orderedFind(null, {longname: name, kind: kind});\n    } else {\n      docs = this._orderedFind(null, {longname: name});\n    }\n    if (docs.length) return docs;\n\n    if (kind) {\n      docs = this._orderedFind(null, {name: name, kind: kind});\n    } else {\n      docs = this._orderedFind(null, {name: name});\n    }\n    if (docs.length) return docs;\n\n    const regexp = new RegExp(`[~]${name.replace('*', '\\\\*')}$`); // if name is `*`, need to escape.\n    if (kind) {\n      docs = this._orderedFind(null, {longname: {regex: regexp}, kind: kind});\n    } else {\n      docs = this._orderedFind(null, {longname: {regex: regexp}});\n    }\n    if (docs.length) return docs;\n\n    // inherited method?\n    const matched = name.match(/(.*)[.#](.*)$/); // instance method(Foo#bar) or static method(Foo.baz)\n    if (matched) {\n      const parent = matched[1];\n      const childName = matched[2];\n      const parentDoc = this._findByName(parent, 'class')[0];\n      if (parentDoc && parentDoc._custom_extends_chains) {\n        for (const superLongname of parentDoc._custom_extends_chains) {\n          const docs = this._find({memberof: superLongname, name: childName});\n          if (docs.length) return docs;\n        }\n      }\n    }\n\n    return [];\n  }\n\n  /**\n   * find doc objects that is ordered.\n   * @param {string} order - doc objects order(``column asec`` or ``column desc``).\n   * @param {...Object} cond - condition objects\n   * @returns {DocObject[]} found doc objects.\n   * @private\n   */\n  _orderedFind(order, ...cond) {\n    const data = this._data(...cond);\n\n    if (order) {\n      return data.order(`${order}, name asec`).map(v => v);\n    } else {\n      return data.order('name asec').map(v => v);\n    }\n  }\n\n  /**\n   * read html template.\n   * @param {string} fileName - template file name.\n   * @return {string} html of template.\n   * @protected\n   */\n  _readTemplate(fileName) {\n    const filePath = path.resolve(this._template, `./${fileName}`);\n    return fs.readFileSync(filePath, {encoding: 'utf-8'});\n  }\n\n\n  /**\n   * build common layout output.\n   * @return {IceCap} layout output.\n   * @private\n   */\n  _buildLayoutDoc() {\n    const ice = new IceCap(this._readTemplate('layout.html'), {autoClose: false});\n\n    const packageObj = NPMUtil.findPackage();\n    if (packageObj) {\n      ice.text('esdocVersion', `(${packageObj.version})`);\n    } else {\n      ice.drop('esdocVersion');\n    }\n\n    const existTest = this._tags.find(tag => tag.kind.indexOf('test') === 0);\n    ice.drop('testLink', !existTest);\n\n    const existManual = this._tags.find(tag => tag.kind.indexOf('manual') === 0);\n    ice.drop('manualHeaderLink', !existManual);\n\n    const manualIndex = this._tags.find(tag => tag.kind === 'manualIndex');\n    if (manualIndex && manualIndex.globalIndex) {\n      ice.drop('manualHeaderLink');\n    }\n\n    ice.load('nav', this._buildNavDoc());\n    return ice;\n  }\n\n  /**\n   * build common navigation output.\n   * @return {IceCap} navigation output.\n   * @private\n   */\n  _buildNavDoc() {\n    const html = this._readTemplate('nav.html');\n    const ice = new IceCap(html);\n\n    const kinds = ['class', 'function', 'variable', 'typedef', 'external'];\n    const allDocs = this._find({kind: kinds}).filter(v => !v.builtinExternal);\n    const kindOrder = {class: 0, interface: 1, function: 2, variable: 3, typedef: 4, external: 5};\n\n    // see: IdentifiersDocBuilder#_buildIdentifierDoc\n    allDocs.sort((a, b)=>{\n      const filePathA = a.longname.split('~')[0];\n      const filePathB = b.longname.split('~')[0];\n      const dirPathA = path.dirname(filePathA);\n      const dirPathB = path.dirname(filePathB);\n      const kindA = a.interface ? 'interface' : a.kind;\n      const kindB = b.interface ? 'interface' : b.kind;\n      if (dirPathA === dirPathB) {\n        if (kindA === kindB) {\n          return a.longname > b.longname ? 1 : -1;\n        } else {\n          return kindOrder[kindA] > kindOrder[kindB] ? 1 : -1;\n        }\n      } else {\n        return dirPathA > dirPathB ? 1 : -1;\n      }\n    });\n    let lastDirPath = '.';\n    ice.loop('doc', allDocs, (i, doc, ice)=>{\n      const filePath = doc.longname.split('~')[0].replace(/^.*?[/]/, '');\n      const dirPath = path.dirname(filePath);\n      const kind = doc.interface ? 'interface' : doc.kind;\n      const kindText = kind.charAt(0).toUpperCase();\n      const kindClass = `kind-${kind}`;\n      ice.load('name', this._buildDocLinkHTML(doc.longname));\n      ice.load('kind', kindText);\n      ice.attr('kind', 'class', kindClass);\n      ice.text('dirPath', dirPath);\n      ice.attr('dirPath', 'href', `identifiers.html#${escapeURLHash(dirPath)}`);\n      ice.drop('dirPath', lastDirPath === dirPath);\n      lastDirPath = dirPath;\n    });\n\n    return ice;\n  }\n\n  /**\n   * find doc object for each access.\n   * @param {DocObject} doc - parent doc object.\n   * @param {string} kind - kind property condition.\n   * @param {boolean} isStatic - static property condition\n   * @returns {Array[]} found doc objects.\n   * @property {Array[]} 0 - ['Public', DocObject[]]\n   * @property {Array[]} 1 - ['Protected', DocObject[]]\n   * @property {Array[]} 2 - ['Private', DocObject[]]\n   * @private\n   */\n  _findAccessDocs(doc, kind, isStatic = true) {\n    const cond = {kind: kind, static: isStatic};\n\n    if (doc) cond.memberof = doc.longname;\n\n    /* eslint-disable default-case */\n    switch (kind) {\n      case 'class':\n        cond.interface = false;\n        break;\n      case 'interface':\n        cond.kind = 'class';\n        cond.interface = true;\n        break;\n      case 'member':\n        cond.kind = ['member', 'get', 'set'];\n        break;\n    }\n\n    const publicDocs = this._find(cond, {access: 'public'}).filter(v => !v.builtinExternal);\n    const protectedDocs = this._find(cond, {access: 'protected'}).filter(v => !v.builtinExternal);\n    const privateDocs = this._find(cond, {access: 'private'}).filter(v => !v.builtinExternal);\n    const accessDocs = [['Public', publicDocs], ['Protected', protectedDocs], ['Private', privateDocs]];\n\n    return accessDocs;\n  }\n\n  /**\n   * build summary output html by parent doc.\n   * @param {DocObject} doc - parent doc object.\n   * @param {string} kind - target kind property.\n   * @param {string} title - summary title.\n   * @param {boolean} [isStatic=true] - target static property.\n   * @returns {string} html of summary.\n   * @private\n   */\n  _buildSummaryHTML(doc, kind, title, isStatic = true) {\n    const accessDocs = this._findAccessDocs(doc, kind, isStatic);\n    let html = '';\n    for (const accessDoc of accessDocs) {\n      const docs = accessDoc[1];\n      if (!docs.length) continue;\n\n      let prefix = '';\n      if (docs[0].static) prefix = 'Static ';\n      const _title = `${prefix}${accessDoc[0]} ${title}`;\n\n      const result = this._buildSummaryDoc(docs, _title);\n      if (result) {\n        html += result.html;\n      }\n    }\n\n    return html;\n  }\n\n  /**\n   * build summary output html by docs.\n   * @param {DocObject[]} docs - target docs.\n   * @param {string} title - summary title.\n   * @param {boolean} innerLink - if true, link in summary is inner link.\n   * @param {boolean} kindIcon - use kind icon.\n   * @return {IceCap} summary output.\n   * @protected\n   */\n  _buildSummaryDoc(docs, title, innerLink = false, kindIcon = false) {\n    if (docs.length === 0) return null;\n\n    const ice = new IceCap(this._readTemplate('summary.html'));\n\n    ice.text('title', title);\n    ice.loop('target', docs, (i, doc, ice)=>{\n      ice.text('generator', doc.generator ? '*' : '');\n      ice.text('async', doc.async ? 'async' : '');\n      ice.load('name', this._buildDocLinkHTML(doc.longname, null, innerLink, doc.kind));\n      ice.load('signature', this._buildSignatureHTML(doc));\n      ice.load('description', shorten(doc, true));\n      ice.text('abstract', doc.abstract ? 'abstract' : '');\n      ice.text('access', doc.access);\n      if (['get', 'set'].includes(doc.kind)) {\n        ice.text('kind', doc.kind);\n      } else {\n        ice.drop('kind');\n      }\n\n      if (['member', 'method', 'get', 'set'].includes(doc.kind)) {\n        ice.text('static', doc.static ? 'static' : '');\n      } else {\n        ice.drop('static');\n      }\n\n      if (kindIcon) {\n        const kind = doc.interface ? 'interface' : doc.kind;\n        ice.text('kind-icon', kind.charAt(0).toUpperCase());\n        ice.attr('kind-icon', 'class', `kind-${kind}`, IceCap.MODE_APPEND);\n      } else {\n        ice.drop('kind-icon');\n      }\n\n      ice.text('since', doc.since);\n      ice.load('deprecated', this._buildDeprecatedHTML(doc));\n      ice.load('experimental', this._buildExperimentalHTML(doc));\n      ice.text('version', doc.version);\n    });\n\n    return ice;\n  }\n\n  /**\n   * build detail output html by parent doc.\n   * @param {DocObject} doc - parent doc object.\n   * @param {string} kind - target kind property.\n   * @param {string} title - detail title.\n   * @param {boolean} [isStatic=true] - target static property.\n   * @returns {string} html of detail.\n   * @private\n   */\n  _buildDetailHTML(doc, kind, title, isStatic = true) {\n    const accessDocs = this._findAccessDocs(doc, kind, isStatic);\n    let html = '';\n    for (const accessDoc of accessDocs) {\n      const docs = accessDoc[1];\n      if (!docs.length) continue;\n\n      let prefix = '';\n      if (docs[0].static) prefix = 'Static ';\n      const _title = `${prefix}${accessDoc[0]} ${title}`;\n\n      const result = this._buildDetailDocs(docs, _title);\n      if (result) html += result.html;\n    }\n\n    return html;\n  }\n\n  /* eslint-disable max-statements */\n  /**\n   * build detail output html by docs.\n   * @param {DocObject[]} docs - target docs.\n   * @param {string} title - detail title.\n   * @return {IceCap} detail output.\n   * @private\n   */\n  _buildDetailDocs(docs, title) {\n    const ice = new IceCap(this._readTemplate('details.html'));\n\n    ice.text('title', title);\n    ice.drop('title', !docs.length);\n\n    ice.loop('detail', docs, (i, doc, ice)=>{\n      const scope = doc.static ? 'static' : 'instance';\n      ice.attr('anchor', 'id', `${scope}-${doc.kind}-${doc.name}`);\n      ice.text('generator', doc.generator ? '*' : '');\n      ice.text('async', doc.async ? 'async' : '');\n      ice.text('name', doc.name);\n      ice.load('signature', this._buildSignatureHTML(doc));\n      ice.load('description', doc.description || this._buildOverrideMethodDescription(doc));\n      ice.text('abstract', doc.abstract ? 'abstract' : '');\n      ice.text('access', doc.access);\n      if (['get', 'set'].includes(doc.kind)) {\n        ice.text('kind', doc.kind);\n      } else {\n        ice.drop('kind');\n      }\n      if (doc.export && doc.importPath && doc.importStyle) {\n        const link = this._buildFileDocLinkHTML(doc, doc.importPath);\n        ice.into('importPath', `import ${doc.importStyle} from '${link}'`, (code, ice)=>{\n          ice.load('importPathCode', code);\n        });\n      } else {\n        ice.drop('importPath');\n      }\n\n      if (['member', 'method', 'get', 'set'].includes(doc.kind)) {\n        ice.text('static', doc.static ? 'static' : '');\n      } else {\n        ice.drop('static');\n      }\n\n      ice.load('source', this._buildFileDocLinkHTML(doc, 'source'));\n      ice.text('since', doc.since, 'append');\n      ice.load('deprecated', this._buildDeprecatedHTML(doc));\n      ice.load('experimental', this._buildExperimentalHTML(doc));\n      ice.text('version', doc.version, 'append');\n      ice.load('see', this._buildDocsLinkHTML(doc.see), 'append');\n      ice.load('todo', this._buildDocsLinkHTML(doc.todo), 'append');\n      ice.load('override', this._buildOverrideMethod(doc));\n      ice.load('decorator', this._buildDecoratorHTML(doc), 'append');\n\n      let isFunction = false;\n      if (['method', 'constructor', 'function'].indexOf(doc.kind) !== -1) isFunction = true;\n      if (doc.kind === 'typedef' && doc.params && doc.type.types[0] === 'function') isFunction = true;\n\n      if (isFunction) {\n        ice.load('properties', this._buildProperties(doc.params, 'Params:'));\n      } else {\n        ice.load('properties', this._buildProperties(doc.properties, 'Properties:'));\n      }\n\n      // return\n      if (doc.return) {\n        ice.load('returnDescription', doc.return.description);\n        const typeNames = [];\n        for (const typeName of doc.return.types) {\n          typeNames.push(this._buildTypeDocLinkHTML(typeName));\n        }\n        if (typeof doc.return.nullable === 'boolean') {\n          const nullable = doc.return.nullable;\n          ice.load('returnType', `${typeNames.join(' | ')} (nullable: ${nullable})`);\n        } else {\n          ice.load('returnType', typeNames.join(' | '));\n        }\n\n        ice.load('returnProperties', this._buildProperties(doc.properties, 'Return Properties:'));\n      } else {\n        ice.drop('returnParams');\n      }\n\n      // throws\n      if (doc.throws) {\n        ice.loop('throw', doc.throws, (i, exceptionDoc, ice)=>{\n          ice.load('throwName', this._buildDocLinkHTML(exceptionDoc.types[0]));\n          ice.load('throwDesc', exceptionDoc.description);\n        });\n      } else {\n        ice.drop('throwWrap');\n      }\n\n      // fires\n      if (doc.emits) {\n        ice.loop('emit', doc.emits, (i, emitDoc, ice)=>{\n          ice.load('emitName', this._buildDocLinkHTML(emitDoc.types[0]));\n          ice.load('emitDesc', emitDoc.description);\n        });\n      } else {\n        ice.drop('emitWrap');\n      }\n\n      // listens\n      if (doc.listens) {\n        ice.loop('listen', doc.listens, (i, listenDoc, ice)=>{\n          ice.load('listenName', this._buildDocLinkHTML(listenDoc.types[0]));\n          ice.load('listenDesc', listenDoc.description);\n        });\n      } else {\n        ice.drop('listenWrap');\n      }\n\n      // example\n      ice.into('example', doc.examples, (examples, ice)=>{\n        ice.loop('exampleDoc', examples, (i, exampleDoc, ice)=>{\n          const parsed = parseExample(exampleDoc);\n          ice.text('exampleCode', parsed.body);\n          ice.text('exampleCaption', parsed.caption);\n        });\n      });\n\n      // tests\n      ice.into('tests', doc._custom_tests, (tests, ice)=>{\n        ice.loop('test', tests, (i, test, ice)=>{\n          const testDoc = this._find({longname: test})[0];\n          ice.load('test', this._buildFileDocLinkHTML(testDoc, testDoc.testFullDescription));\n        });\n      });\n    });\n\n    return ice;\n  }\n\n  /**\n   * get output html page title.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} page title.\n   * @private\n   */\n  _getTitle(doc = '') {\n    const name = doc.name || doc.toString();\n\n    if (name) {\n      return `${name}`;\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * get base url html page. it is used html base tag.\n   * @param {string} fileName - output file path.\n   * @returns {string} base url.\n   * @protected\n   */\n  _getBaseUrl(fileName) {\n    const baseUrl = '../'.repeat(fileName.split('/').length - 1);\n    return baseUrl;\n  }\n\n  /**\n   * gat url of output html page.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} url of output html. it is relative path from output root dir.\n   * @private\n   */\n  _getURL(doc) {\n    let inner = false;\n    if (['variable', 'function', 'member', 'typedef', 'method', 'constructor', 'get', 'set'].includes(doc.kind)) {\n      inner = true;\n    }\n\n    if (inner) {\n      const scope = doc.static ? 'static' : 'instance';\n      const fileName = this._getOutputFileName(doc);\n      return `${fileName}#${scope}-${doc.kind}-${doc.name}`;\n    } else {\n      const fileName = this._getOutputFileName(doc);\n      return fileName;\n    }\n  }\n\n  /**\n   * get file name of output html page.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} file name.\n   * @private\n   */\n  _getOutputFileName(doc) {\n    switch (doc.kind) {\n      case 'variable':\n        return 'variable/index.html';\n      case 'function':\n        return 'function/index.html';\n      case 'member': // fall\n      case 'method': // fall\n      case 'constructor': // fall\n      case 'set': // fall\n      case 'get': { // fal\n        const parentDoc = this._find({longname: doc.memberof})[0];\n        return this._getOutputFileName(parentDoc);\n      }\n      case 'external':\n        return 'external/index.html';\n      case 'typedef':\n        return 'typedef/index.html';\n      case 'class':\n        return `class/${doc.longname}.html`;\n      case 'file':\n        return `file/${doc.name}.html`;\n      case 'testFile':\n        return `test-file/${doc.name}.html`;\n      case 'test':\n        return 'test.html';\n      default:\n        throw new Error('DocBuilder: can not resolve file name.');\n    }\n  }\n\n  /**\n   * build html link to file page.\n   * @param {DocObject} doc - target doc object.\n   * @param {string} text - link text.\n   * @returns {string} html of link.\n   * @private\n   */\n  _buildFileDocLinkHTML(doc, text = null) {\n    if (!doc) return '';\n\n    let fileDoc;\n    if (doc.kind === 'file' || doc.kind === 'testFile') {\n      fileDoc = doc;\n    } else {\n      const filePath = doc.longname.split('~')[0];\n      fileDoc = this._find({kind: ['file', 'testFile'], name: filePath})[0];\n    }\n\n    if (!fileDoc) return '';\n\n    if (!text) text = fileDoc.name;\n\n    if (doc.kind === 'file' || doc.kind === 'testFile') {\n      return `<span><a href=\"${this._getURL(fileDoc)}\">${text}</a></span>`;\n    } else {\n      return `<span><a href=\"${this._getURL(fileDoc)}#lineNumber${doc.lineNumber}\">${text}</a></span>`;\n    }\n  }\n\n  /**\n   * build html link of type.\n   * @param {string} typeName - type name(e.g. ``number[]``, ``Map<number, string>``)\n   * @returns {string} html of link.\n   * @private\n   * @todo re-implement with parser combinator.\n   */\n  _buildTypeDocLinkHTML(typeName) {\n    // e.g. number[]\n    let matched = typeName.match(/^(.*?)\\[\\]$/);\n    if (matched) {\n      typeName = matched[1];\n      return `<span>${this._buildDocLinkHTML(typeName, typeName)}<span>[]</span></span>`;\n    }\n\n    // e.g. function(a: number, b: string): boolean\n    matched = typeName.match(/function *\\((.*?)\\)(.*)/);\n    if (matched) {\n      const functionLink = this._buildDocLinkHTML('function');\n      if (!matched[1] && !matched[2]) return `<span>${functionLink}<span>()</span></span>`;\n\n      let innerTypes = [];\n      if (matched[1]) {\n        // bad hack: Map.<string, boolean> => Map.<string\\Z boolean>\n        // bad hack: {a: string, b: boolean} => {a\\Y string\\Z b\\Y boolean}\n        const inner = matched[1]\n          .replace(/<.*?>/g, (a)=> a.replace(/,/g, '\\\\Z'))\n          .replace(/{.*?}/g, (a)=> a.replace(/,/g, '\\\\Z').replace(/:/g, '\\\\Y'));\n        innerTypes = inner.split(',').map((v)=>{\n          const tmp = v.split(':').map((v)=> v.trim());\n          if (tmp.length !== 2) throw new SyntaxError(`Invalid function type annotation: \\`${matched[0]}\\``);\n\n          const paramName = tmp[0];\n          const typeName = tmp[1].replace(/\\\\Z/g, ',').replace(/\\\\Y/g, ':');\n          return `${paramName}: ${this._buildTypeDocLinkHTML(typeName)}`;\n        });\n      }\n\n      let returnType = '';\n      if (matched[2]) {\n        const type = matched[2].split(':')[1];\n        if (type) returnType = `: ${this._buildTypeDocLinkHTML(type.trim())}`;\n      }\n\n      return `<span>${functionLink}<span>(${innerTypes.join(', ')})</span>${returnType}</span>`;\n    }\n\n    // e.g. {a: number, b: string}\n    matched = typeName.match(/^\\{(.*?)\\}$/);\n    if (matched) {\n      if (!matched[1]) return '{}';\n\n      // bad hack: Map.<string, boolean> => Map.<string\\Z boolean>\n      // bad hack: {a: string, b: boolean} => {a\\Y string\\Z b\\Y boolean}\n      const inner = matched[1]\n        .replace(/<.*?>/g, (a)=> a.replace(/,/g, '\\\\Z'))\n        .replace(/{.*?}/g, (a)=> a.replace(/,/g, '\\\\Z').replace(/:/g, '\\\\Y'));\n\n      let broken = false;\n\n      const innerTypes = inner.split(',').map((v)=>{\n        const tmp = v.split(':').map((v)=> v.trim());\n\n        // edge case: if object key includes comma, this parsing is broken.\n        // e.g. {\"a,b\": 10}\n        // https://github.com/esdoc/esdoc-plugins/pull/49\n        if (!tmp[0] || !tmp[1]) {\n          broken = true;\n          return;\n        }\n\n        const paramName = tmp[0];\n        let typeName = tmp[1].replace(/\\\\Z/g, ',').replace(/\\\\Y/g, ':');\n        if (typeName.includes('|')) {\n          typeName = typeName.replace(/^\\(/, '').replace(/\\)$/, '');\n          const typeNames = typeName.split('|').map(v => v.trim());\n          const html = [];\n          for (const unionType of typeNames) {\n            html.push(this._buildTypeDocLinkHTML(unionType));\n          }\n          return `${paramName}: ${html.join('|')}`;\n        } else {\n          return `${paramName}: ${this._buildTypeDocLinkHTML(typeName)}`;\n        }\n      });\n\n      if (broken) return `*`;\n\n      return `{${innerTypes.join(', ')}}`;\n    }\n\n    // e.g. Map<number, string>\n    matched = typeName.match(/^(.*?)\\.?<(.*?)>$/);\n    if (matched) {\n      const mainType = matched[1];\n      // bad hack: Map.<string, boolean> => Map.<string\\Z boolean>\n      // bad hack: {a: string, b: boolean} => {a\\Y string\\Z b\\Y boolean}\n      const inner = matched[2]\n        .replace(/<.*?>/g, (a)=> a.replace(/,/g, '\\\\Z'))\n        .replace(/{.*?}/g, (a)=> a.replace(/,/g, '\\\\Z').replace(/:/g, '\\\\Y'));\n      const innerTypes = inner.split(',').map((v) => {\n        return v.split('|').map((vv) => {\n          vv = vv.trim().replace(/\\\\Z/g, ',').replace(/\\\\Y/g, ':');\n          return this._buildTypeDocLinkHTML(vv);\n        }).join('|');\n      });\n\n      const html = `${this._buildDocLinkHTML(mainType, mainType)}<${innerTypes.join(', ')}>`;\n      return html;\n    }\n\n    if (typeName.indexOf('...') === 0) {\n      typeName = typeName.replace('...', '');\n      if (typeName.includes('|')) {\n        const typeNames = typeName.replace('(', '').replace(')', '').split('|');\n        const typeLinks = typeNames.map((v) => this._buildDocLinkHTML(v));\n        return `...(${typeLinks.join('|')})`;\n      } else {\n        return `...${this._buildDocLinkHTML(typeName)}`;\n      }\n    } else if (typeName.indexOf('?') === 0) {\n      typeName = typeName.replace('?', '');\n      return `?${this._buildDocLinkHTML(typeName)}`;\n    } else {\n      return this._buildDocLinkHTML(typeName);\n    }\n  }\n\n  /**\n   * build html link to identifier.\n   * @param {string} longname - link to this.\n   * @param {string} [text] - link text. default is name property of doc object.\n   * @param {boolean} [inner=false] - if true, use inner link.\n   * @param {string} [kind] - specify target kind property.\n   * @returns {string} html of link.\n   * @private\n   */\n  _buildDocLinkHTML(longname, text = null, inner = false, kind = null) {\n    if (!longname) return '';\n\n    if (typeof longname !== 'string') throw new Error(JSON.stringify(longname));\n\n    const doc = this._findByName(longname, kind)[0];\n\n    if (!doc) {\n      // if longname is HTML tag, not escape.\n      if (longname.indexOf('<') === 0) {\n        return `<span>${longname}</span>`;\n      } else {\n        return `<span>${escape(text || longname)}</span>`;\n      }\n    }\n\n    if (doc.kind === 'external') {\n      text = doc.name;\n      return `<span><a href=\"${doc.externalLink}\">${text}</a></span>`;\n    } else {\n      text = escape(text || doc.name);\n      const url = this._getURL(doc, inner);\n      if (url) {\n        return `<span><a href=\"${url}\">${text}</a></span>`;\n      } else {\n        return `<span>${text}</span>`;\n      }\n    }\n  }\n\n  /**\n   * build html links to identifiers\n   * @param {string[]} longnames - link to these.\n   * @param {string} [text] - link text. default is name property of doc object.\n   * @param {boolean} [inner=false] - if true, use inner link.\n   * @param {string} [separator='\\n'] - used link separator.\n   * @returns {string} html links.\n   * @private\n   */\n  _buildDocsLinkHTML(longnames, text = null, inner = false, separator = '\\n') {\n    if (!longnames) return '';\n    if (!longnames.length) return '';\n\n    const links = [];\n    for (const longname of longnames) {\n      if (!longname) continue;\n      const link = this._buildDocLinkHTML(longname, text, inner);\n      links.push(`<li>${link}</li>`);\n    }\n\n    if (!links.length) return '';\n\n    return `<ul>${links.join(separator)}</ul>`;\n  }\n\n  /**\n   * build identifier signature html.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} signature html.\n   * @private\n   */\n  _buildSignatureHTML(doc) {\n    // call signature\n    const callSignatures = [];\n    if (doc.params) {\n      for (const param of doc.params) {\n        const paramName = param.name;\n        if (paramName.indexOf('.') !== -1) continue; // for object property\n        if (paramName.indexOf('[') !== -1) continue; // for array property\n\n        const types = [];\n        for (const typeName of param.types) {\n          types.push(this._buildTypeDocLinkHTML(typeName));\n        }\n\n        callSignatures.push(`${paramName}: ${types.join(' | ')}`);\n      }\n    }\n\n    // return signature\n    const returnSignatures = [];\n    if (doc.return) {\n      for (const typeName of doc.return.types) {\n        returnSignatures.push(this._buildTypeDocLinkHTML(typeName));\n      }\n    }\n\n    // type signature\n    let typeSignatures = [];\n    if (doc.type) {\n      for (const typeName of doc.type.types) {\n        typeSignatures.push(this._buildTypeDocLinkHTML(typeName));\n      }\n    }\n\n    // callback is not need type. because type is always function.\n    if (doc.kind === 'function') {\n      typeSignatures = [];\n    }\n\n    let html = '';\n    if (callSignatures.length) {\n      html = `(${callSignatures.join(', ')})`;\n    } else if (['function', 'method', 'constructor'].includes(doc.kind)) {\n      html = '()';\n    }\n    if (returnSignatures.length) html = `${html}: ${returnSignatures.join(' | ')}`;\n    if (typeSignatures.length) html = `${html}: ${typeSignatures.join(' | ')}`;\n\n    return html;\n  }\n\n  /**\n   * build properties output.\n   * @param {ParsedParam[]} [properties=[]] - properties in doc object.\n   * @param {string} title - output title.\n   * @return {IceCap} built properties output.\n   * @private\n   */\n  _buildProperties(properties = [], title = 'Properties:') {\n    const ice = new IceCap(this._readTemplate('properties.html'));\n\n    ice.text('title', title);\n\n    ice.loop('property', properties, (i, prop, ice)=>{\n      ice.autoDrop = false;\n      ice.attr('property', 'data-depth', prop.name.split('.').length - 1);\n      ice.text('name', prop.name);\n      ice.attr('name', 'data-depth', prop.name.split('.').length - 1);\n      ice.load('description', prop.description);\n\n      const typeNames = [];\n      for (const typeName of prop.types) {\n        typeNames.push(this._buildTypeDocLinkHTML(typeName));\n      }\n      ice.load('type', typeNames.join(' | '));\n\n      // appendix\n      const appendix = [];\n      if (prop.optional) {\n        appendix.push('<li>optional</li>');\n      }\n      if ('defaultValue' in prop) {\n        appendix.push(`<li>default: ${prop.defaultValue}</li>`);\n      }\n      if (typeof prop.nullable === 'boolean') {\n        appendix.push(`<li>nullable: ${prop.nullable}</li>`);\n      }\n      if (appendix.length) {\n        ice.load('appendix', `<ul>${appendix.join('\\n')}</ul>`);\n      } else {\n        ice.text('appendix', '');\n      }\n    });\n\n    if (!properties || properties.length === 0) {\n      ice.drop('properties');\n    }\n\n    return ice;\n  }\n\n  /**\n   * build deprecated html.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} if doc is not deprecated, returns empty.\n   * @private\n   */\n  _buildDeprecatedHTML(doc) {\n    if (doc.deprecated) {\n      const deprecated = [`this ${doc.kind} was deprecated.`];\n      if (typeof doc.deprecated === 'string') deprecated.push(doc.deprecated);\n      return deprecated.join(' ');\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * build experimental html.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} if doc is not experimental, returns empty.\n   * @private\n   */\n  _buildExperimentalHTML(doc) {\n    if (doc.experimental) {\n      const experimental = [`this ${doc.kind} is experimental.`];\n      if (typeof doc.experimental === 'string') experimental.push(doc.experimental);\n      return experimental.join(' ');\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * build method of ancestor class link html.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} html link. if doc does not override ancestor method, returns empty.\n   * @private\n   */\n  _buildOverrideMethod(doc) {\n    const parentDoc = this._findByName(doc.memberof)[0];\n    if (!parentDoc) return '';\n    if (!parentDoc._custom_extends_chains) return '';\n\n    const chains = [...parentDoc._custom_extends_chains].reverse();\n    for (const longname of chains) {\n      const superClassDoc = this._findByName(longname)[0];\n      if (!superClassDoc) continue;\n\n      const superMethodDoc = this._find({name: doc.name, memberof: superClassDoc.longname})[0];\n      if (!superMethodDoc) continue;\n\n      return this._buildDocLinkHTML(superMethodDoc.longname, `${superClassDoc.name}#${superMethodDoc.name}`, true);\n    }\n\n    return '';\n  }\n\n  /**\n   * build method of ancestor class description.\n   * @param {DocObject} doc - target doc object.\n   * @returns {string} description. if doc does not override ancestor method, returns empty.\n   * @private\n   */\n  _buildOverrideMethodDescription(doc) {\n    const parentDoc = this._findByName(doc.memberof)[0];\n    if (!parentDoc) return '';\n    if (!parentDoc._custom_extends_chains) return '';\n\n    const chains = [...parentDoc._custom_extends_chains].reverse();\n    for (const longname of chains) {\n      const superClassDoc = this._findByName(longname)[0];\n      if (!superClassDoc) continue;\n\n      const superMethodDoc = this._find({name: doc.name, memberof: superClassDoc.longname})[0];\n      if (!superMethodDoc) continue;\n\n      if (superMethodDoc.description) return superMethodDoc.description;\n    }\n\n    return '';\n  }\n\n  _buildDecoratorHTML(doc) {\n    if (!doc.decorators) return '';\n\n    const links = [];\n    for (const decorator of doc.decorators) {\n      const link = this._buildDocLinkHTML(decorator.name, decorator.name, false, 'function');\n      if (decorator.arguments) {\n        links.push(`<li>${link}${decorator.arguments}</li>`);\n      } else {\n        links.push(`<li>${link}</li>`);\n      }\n    }\n\n    if (!links.length) return '';\n\n    return `<ul>${links.join('\\n')}</ul>`;\n  }\n\n  // _buildAuthorHTML(doc, separator = '\\n') {\n  //  if (!doc.author) return '';\n  //\n  //  var html = [];\n  //  for (var author of doc.author) {\n  //    var matched = author.match(/(.*?) *<(.*?)>/);\n  //    if (matched) {\n  //      var name = matched[1];\n  //      var link = matched[2];\n  //      if (link.indexOf('http') === 0) {\n  //        html.push(`<li><a href=\"${link}\">${name}</a></li>`)\n  //      } else {\n  //        html.push(`<li><a href=\"mailto:${link}\">${name}</a></li>`)\n  //      }\n  //    } else {\n  //      html.push(`<li>${author}</li>`)\n  //    }\n  //  }\n  //\n  //  return `<ul>${html.join(separator)}</ul>`;\n  // }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/DocResolver.js",
    "content": "import {markdown} from './util.js';\n\n/**\n * Resolve various properties in doc object.\n */\nexport default class DocResolver {\n  /**\n   * create instance.\n   * @param {DocBuilder} builder - target doc builder.\n   */\n  constructor(builder) {\n    this._builder = builder;\n    this._data = builder._data;\n  }\n\n  /**\n   * resolve various properties.\n   */\n  resolve() {\n    if (this._data.__RESOLVED_ALL__) return;\n\n    console.log('resolve: extends chain');\n    this._resolveExtendsChain();\n\n    console.log('resolve: necessary');\n    this._resolveNecessary();\n\n    console.log('resolve: ignore');\n    this._resolveIgnore();\n\n    console.log('resolve: link');\n    this._resolveLink();\n\n    console.log('resolve: markdown in description');\n    this._resolveMarkdown();\n\n    console.log('resolve: test relation');\n    this._resolveTestRelation();\n\n    this._data.__RESOLVED_ALL__ = true;\n  }\n\n  /**\n   * resolve ignore property.\n   * remove docs that has ignore property.\n   * @private\n   */\n  _resolveIgnore() {\n    if (this._data.__RESOLVED_IGNORE__) return;\n\n    const docs = this._builder._find({ignore: true});\n    for (const doc of docs) {\n      const longname = doc.longname.replace(/[$]/g, '\\\\$');\n      const regex = new RegExp(`^${longname}[.~#]`);\n      this._data({longname: {regex: regex}}).remove();\n    }\n    this._data({ignore: true}).remove();\n\n    this._data.__RESOLVED_IGNORE__ = true;\n  }\n\n  /**\n   * resolve description as markdown.\n   * @private\n   */\n  _resolveMarkdown() {\n    if (this._data.__RESOLVED_MARKDOWN__) return;\n\n    function convert(obj) {\n      for (const key of Object.keys(obj)) {\n        const value = obj[key];\n        if (key === 'description' && typeof value === 'string') {\n          obj[`${key}Raw`] = obj[key];\n          obj[key] = markdown(value, false);\n        } else if (typeof value === 'object' && value) {\n          convert(value);\n        }\n      }\n    }\n\n    const docs = this._builder._find();\n    for (const doc of docs) {\n      convert(doc);\n    }\n\n    this._data.__RESOLVED_MARKDOWN__ = true;\n  }\n\n  /**\n   * resolve @link as html link.\n   * @private\n   * @todo resolve all ``description`` property.\n   */\n  _resolveLink() {\n    if (this._data.__RESOLVED_LINK__) return;\n\n    const link = (str)=>{\n      if (!str) return str;\n\n      return str.replace(/\\{@link ([\\w#_\\-.:~\\/$]+)}/g, (str, longname)=>{\n        return this._builder._buildDocLinkHTML(longname, longname);\n      });\n    };\n\n    this._data().each((v)=>{\n      v.description = link(v.description);\n\n      if (v.params) {\n        for (const param of v.params) {\n          param.description = link(param.description);\n        }\n      }\n\n      if (v.properties) {\n        for (const property of v.properties) {\n          property.description = link(property.description);\n        }\n      }\n\n      if (v.return) {\n        v.return.description = link(v.return.description);\n      }\n\n      if (v.throws) {\n        for (const _throw of v.throws) {\n          _throw.description = link(_throw.description);\n        }\n      }\n\n      if (v.see) {\n        for (let i = 0; i < v.see.length; i++) {\n          if (v.see[i].indexOf('{@link') === 0) {\n            v.see[i] = link(v.see[i]);\n          } else if (v.see[i].indexOf('<a href') === 0) {\n            // ignore\n          } else {\n            v.see[i] = `<a href=\"${v.see[i]}\">${v.see[i]}</a>`;\n          }\n        }\n      }\n    });\n\n    this._data.__RESOLVED_LINK__ = true;\n  }\n\n  /**\n   * resolve class extends chain.\n   * add following special property.\n   * - ``_custom_extends_chain``: ancestor class chain.\n   * - ``_custom_direct_subclasses``: class list that direct extends target doc.\n   * - ``_custom_indirect_subclasses``: class list that indirect extends target doc.\n   * - ``_custom_indirect_implements``: class list that target doc indirect implements.\n   * - ``_custom_direct_implemented``: class list that direct implements target doc.\n   * - ``_custom_indirect_implemented``: class list that indirect implements target doc.\n   *\n   * @private\n   */\n  _resolveExtendsChain() {\n    if (this._data.__RESOLVED_EXTENDS_CHAIN__) return;\n\n    const extendsChain = (doc) => {\n      if (!doc.extends) return;\n\n      const selfDoc = doc;\n\n      // traverse super class.\n      const chains = [];\n\n      /* eslint-disable */\n      while (1) {\n        if (!doc.extends) break;\n\n        let superClassDoc = this._builder._findByName(doc.extends[0])[0];\n\n        if (superClassDoc) {\n          // this is circular extends\n          if (superClassDoc.longname === selfDoc.longname) { break; }\n\n          chains.push(superClassDoc.longname);\n          doc = superClassDoc;\n        } else {\n          chains.push(doc.extends[0]);\n          break;\n        }\n      }\n\n      if (chains.length) {\n        // direct subclass\n        let superClassDoc = this._builder._findByName(chains[0])[0];\n        if (superClassDoc) {\n          if (!superClassDoc._custom_direct_subclasses) superClassDoc._custom_direct_subclasses = [];\n          superClassDoc._custom_direct_subclasses.push(selfDoc.longname);\n        }\n\n        // indirect subclass\n        for (let superClassLongname of chains.slice(1)) {\n          superClassDoc = this._builder._findByName(superClassLongname)[0];\n          if (superClassDoc) {\n            if (!superClassDoc._custom_indirect_subclasses) superClassDoc._custom_indirect_subclasses = [];\n            superClassDoc._custom_indirect_subclasses.push(selfDoc.longname);\n          }\n        }\n\n        // indirect implements and mixes\n        for (let superClassLongname of chains) {\n          superClassDoc = this._builder._findByName(superClassLongname)[0];\n          if (!superClassDoc) continue;\n\n          // indirect implements\n          if (superClassDoc.implements) {\n            if (!selfDoc._custom_indirect_implements) selfDoc._custom_indirect_implements = [];\n            selfDoc._custom_indirect_implements.push(...superClassDoc.implements);\n          }\n\n          // indirect mixes\n          //if (superClassDoc.mixes) {\n          //  if (!selfDoc._custom_indirect_mixes) selfDoc._custom_indirect_mixes = [];\n          //  selfDoc._custom_indirect_mixes.push(...superClassDoc.mixes);\n          //}\n        }\n\n        // extends chains\n        selfDoc._custom_extends_chains = chains.reverse();\n      }\n    };\n\n    let implemented = (doc) =>{\n      let selfDoc = doc;\n\n      // direct implemented (like direct subclass)\n      for (let superClassLongname of selfDoc.implements || []) {\n        let superClassDoc = this._builder._findByName(superClassLongname)[0];\n        if (!superClassDoc) continue;\n        if(!superClassDoc._custom_direct_implemented) superClassDoc._custom_direct_implemented = [];\n        superClassDoc._custom_direct_implemented.push(selfDoc.longname);\n      }\n\n      // indirect implemented (like indirect subclass)\n      for (let superClassLongname of selfDoc._custom_indirect_implements || []) {\n        let superClassDoc = this._builder._findByName(superClassLongname)[0];\n        if (!superClassDoc) continue;\n        if(!superClassDoc._custom_indirect_implemented) superClassDoc._custom_indirect_implemented = [];\n        superClassDoc._custom_indirect_implemented.push(selfDoc.longname);\n      }\n    };\n\n    //var mixed = (doc) =>{\n    //  var selfDoc = doc;\n    //\n    //  // direct mixed (like direct subclass)\n    //  for (var superClassLongname of selfDoc.mixes || []) {\n    //    var superClassDoc = this._builder._find({longname: superClassLongname})[0];\n    //    if (!superClassDoc) continue;\n    //    if(!superClassDoc._custom_direct_mixed) superClassDoc._custom_direct_mixed = [];\n    //    superClassDoc._custom_direct_mixed.push(selfDoc.longname);\n    //  }\n    //\n    //  // indirect mixed (like indirect subclass)\n    //  for (var superClassLongname of selfDoc._custom_indirect_mixes || []) {\n    //    var superClassDoc = this._builder._find({longname: superClassLongname})[0];\n    //    if (!superClassDoc) continue;\n    //    if(!superClassDoc._custom_indirect_mixed) superClassDoc._custom_indirect_mixed = [];\n    //    superClassDoc._custom_indirect_mixed.push(selfDoc.longname);\n    //  }\n    //};\n\n    let docs = this._builder._find({kind: 'class'});\n    for (let doc of docs) {\n      extendsChain(doc);\n      implemented(doc);\n      //mixed(doc);\n    }\n\n    this._data.__RESOLVED_EXTENDS_CHAIN__ = true;\n  }\n\n  /**\n   * resolve necessary identifier.\n   *\n   * ```javascript\n   * class Foo {}\n   *\n   * export default Bar extends Foo {}\n   * ```\n   *\n   * ``Foo`` is not exported, but ``Bar`` extends ``Foo``.\n   * ``Foo`` is necessary.\n   * So, ``Foo`` must be exported by force.\n   *\n   * @private\n   */\n  _resolveNecessary() {\n    let builder = this._builder;\n    this._data({export: false}).update(function() {\n      let doc = this;\n      let childNames = [];\n      if (doc._custom_direct_subclasses) childNames.push(...doc._custom_direct_subclasses);\n      if (doc._custom_indirect_subclasses) childNames.push(...doc._custom_indirect_subclasses);\n      if (doc._custom_direct_implemented) childNames.push(...doc._custom_direct_implemented);\n      if (doc._custom_indirect_implemented) childNames.push(...doc._custom_indirect_implemented);\n\n      for (let childName of childNames) {\n        let childDoc = builder._find({longname: childName})[0];\n        if (!childDoc) continue;\n        if (!childDoc.ignore && childDoc.export) {\n          doc.ignore = false;\n          return doc;\n        }\n      }\n    });\n  }\n\n  /**\n   * resolve test and identifier relation. add special property.\n   * - ``_custom_tests``: longnames of test doc.\n   * - ``_custom_test_targets``: longnames of identifier.\n   *\n   * @private\n   */\n  _resolveTestRelation() {\n    if (this._data.__RESOLVED_TEST_RELATION__) return;\n\n    let testDocs = this._builder._find({kind: 'test'});\n    for (let testDoc of testDocs) {\n      let testTargets = testDoc.testTargets;\n      if (!testTargets) continue;\n\n      for (let testTarget of testTargets) {\n        let doc = this._builder._findByName(testTarget)[0];\n        if (doc) {\n          if (!doc._custom_tests) doc._custom_tests = [];\n          doc._custom_tests.push(testDoc.longname);\n\n          if (!testDoc._custom_test_targets) testDoc._custom_test_targets = [];\n          testDoc._custom_test_targets.push([doc.longname, testTarget]);\n        } else {\n          if (!testDoc._custom_test_targets) testDoc._custom_test_targets = [];\n          testDoc._custom_test_targets.push([testTarget, testTarget]);\n        }\n      }\n    }\n\n    // test full description\n    for (let testDoc of testDocs) {\n      let desc = [];\n      let parents = (testDoc.memberof.split('~')[1] || '').split('.');\n      for (let parent of parents) {\n        let doc = this._builder._find({kind: 'test', name: parent})[0];\n        if (!doc) continue;\n        desc.push(doc.descriptionRaw);\n      }\n      desc.push(testDoc.descriptionRaw);\n      testDoc.testFullDescription = desc.join(' ');\n    }\n\n    this._data.__RESOLVED_TEST_RELATION__ = true;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/FileDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\n\n/**\n * File output builder class.\n */\nexport default class FileDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const ice = this._buildLayoutDoc();\n\n    const docs = this._find({kind: 'file'});\n    for (const doc of docs) {\n      const fileName = this._getOutputFileName(doc);\n      const baseUrl = this._getBaseUrl(fileName);\n      const title = this._getTitle(doc);\n      ice.load('content', this._buildFileDoc(doc), IceCap.MODE_WRITE);\n      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);\n      ice.text('title', title, IceCap.MODE_WRITE);\n      writeFile(fileName, ice.html);\n    }\n  }\n\n  /**\n   * build file output html.\n   * @param {DocObject} doc - target file doc object.\n   * @returns {string} html of file page.\n   * @private\n   */\n  _buildFileDoc(doc) {\n    const ice = new IceCap(this._readTemplate('file.html'));\n    ice.text('title', doc.name);\n    ice.text('content', doc.content);\n    ice.drop('emptySourceCode', !!doc.content);\n    return ice.html;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/IdentifiersDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\nimport path from 'path';\nimport {escapeURLHash} from './util';\n\n/**\n * Identifier output builder class.\n */\nexport default class IdentifiersDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const ice = this._buildLayoutDoc();\n    const title = this._getTitle('Reference');\n    ice.load('content', this._buildIdentifierDoc());\n    ice.text('title', title, IceCap.MODE_WRITE);\n    writeFile('identifiers.html', ice.html);\n  }\n\n  /**\n   * build identifier output.\n   * @return {IceCap} built output.\n   * @private\n   */\n  _buildIdentifierDoc() {\n    const ice = new IceCap(this._readTemplate('identifiers.html'));\n\n    // traverse docs and create Map<dirPath, doc[]>\n    const dirDocs = new Map();\n    const kinds = ['class', 'interface', 'function', 'variable', 'typedef', 'external'];\n    for (const doc of this._tags) {\n      if (!kinds.includes(doc.kind)) continue;\n      if (doc.builtinExternal) continue;\n      if (doc.ignore) continue;\n\n      const filePath = doc.memberof.replace(/^.*?[/]/, '');\n      const dirPath = path.dirname(filePath);\n      if (!dirDocs.has(dirPath)) dirDocs.set(dirPath, []);\n      dirDocs.get(dirPath).push(doc);\n    }\n\n    // create a summary of dir\n    const dirPaths = Array.from(dirDocs.keys()).sort((a, b) => a > b ? 1 : -1);\n    const kindOrder = {class: 0, interface: 1, function: 2, variable: 3, typedef: 4, external: 5};\n    ice.loop('dirSummaryWrap', dirPaths, (i, dirPath, ice) =>{\n      const docs = dirDocs.get(dirPath);\n\n      // see: DocBuilder#_buildNavDoc\n      docs.sort((a, b) =>  {\n        const kindA = a.interface ? 'interface' : a.kind;\n        const kindB = b.interface ? 'interface' : b.kind;\n        if (kindA === kindB) {\n          return a.longname > b.longname ? 1 : -1;\n        } else {\n          return kindOrder[kindA] > kindOrder[kindB] ? 1 : -1;\n        }\n      });\n\n      const dirPathLabel = dirPath === '.' ? '' : dirPath;\n      const summary = this._buildSummaryDoc(docs, `summary`, false, true);\n      ice.text('dirPath', dirPathLabel);\n      ice.attr('dirPath', 'id', escapeURLHash(dirPath));\n      ice.load('dirSummary', summary);\n    });\n\n    const dirTree = this._buildDirTree(dirPaths);\n    ice.load('dirTree', dirTree);\n    ice.drop('dirTreeWrap', !dirTree);\n\n    return ice;\n  }\n\n  _buildDirTree(dirPaths) {\n    const lines = [];\n    for (const dirPath of dirPaths) {\n      const padding = dirPath.split('/').length - 1;\n      const dirName = path.basename(dirPath);\n      if (dirName === '.') continue;\n      const hash = escapeURLHash(dirPath);\n      lines.push(`<div style=\"padding-left: ${padding}em\"><a href=\"#${hash}\">${dirName}</a></div>`);\n    }\n\n    return lines.join('\\n');\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/IndexDocBuilder.js",
    "content": "import path from 'path';\nimport IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\nimport {markdown} from './util.js';\n\n/**\n * Index output builder class.\n */\nexport default class IndexDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const ice = this._buildLayoutDoc();\n    const title = this._getTitle('Home');\n    ice.load('content', this._buildIndexDoc());\n    ice.text('title', title, IceCap.MODE_WRITE);\n    writeFile('index.html', ice.html);\n  }\n\n  /**\n   * build index output.\n   * @returns {string} html of index output.\n   * @private\n   */\n  _buildIndexDoc() {\n    const indexTag = this._tags.find(tag => tag.kind === 'index');\n    if (!indexTag) return 'Please create README.md';\n\n    const indexContent = indexTag.content;\n\n    const html = this._readTemplate('index.html');\n    const ice = new IceCap(html);\n    const ext = path.extname(indexTag.name);\n    if (['.md', '.markdown'].includes(ext)) {\n      ice.load('index', markdown(indexContent));\n    } else {\n      ice.load('index', indexContent);\n    }\n\n    return ice.html;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/ManualDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport path from 'path';\nimport {Buffer} from 'buffer';\nimport cheerio from 'cheerio';\nimport DocBuilder from './DocBuilder.js';\nimport {markdown, escapeURLHash} from './util.js';\n\n/**\n * Manual Output Builder class.\n */\nexport default class ManualDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir, readFile) {\n\n    const manuals = this._tags.filter(tag => tag.kind === 'manual');\n    const manualIndex = this._tags.find(tag => tag.kind === 'manualIndex');\n    const manualAsset = this._tags.find(tag => tag.kind === 'manualAsset');\n\n    if (manuals.length === 0) return;\n\n    const ice = this._buildLayoutDoc();\n    ice.autoDrop = false;\n    ice.attr('rootContainer', 'class', ' manual-root');\n\n    {\n      const fileName = 'manual/index.html';\n      const baseUrl = this._getBaseUrl(fileName);\n      const badge = this._writeBadge(manuals, writeFile);\n      ice.load('content', this._buildManualCardIndex(manuals, manualIndex, badge), IceCap.MODE_WRITE);\n      ice.load('nav', this._buildManualNav(manuals), IceCap.MODE_WRITE);\n      ice.text('title', 'Manual', IceCap.MODE_WRITE);\n      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);\n      ice.attr('rootContainer', 'class', ' manual-index');\n      writeFile(fileName, ice.html);\n\n      if (manualIndex.globalIndex) {\n        ice.attr('baseUrl', 'href', './', IceCap.MODE_WRITE);\n        writeFile('index.html', ice.html);\n      }\n\n      ice.attr('rootContainer', 'class', ' manual-index', IceCap.MODE_REMOVE);\n    }\n\n    for (const manual of manuals) {\n      const fileName = this._getManualOutputFileName(manual.name);\n      const baseUrl = this._getBaseUrl(fileName);\n      ice.load('content', this._buildManual(manual), IceCap.MODE_WRITE);\n      ice.load('nav', this._buildManualNav(manuals), IceCap.MODE_WRITE);\n      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);\n      writeFile(fileName, ice.html);\n    }\n\n    if (manualAsset) {\n      copyDir(manualAsset.name, 'manual/asset');\n    }\n  }\n\n  /**\n   * this is\n   * @param {manual[]} manuals\n   * @param {function(filePath:string, content:string)} writeFile\n   * @returns {boolean}\n   * @private\n   */\n  _writeBadge(manuals, writeFile) {\n    const specialFileNamePatterns = [\n      '(overview.*)',\n      '(design.*)',\n      '(installation.*)|(install.*)',\n      '(usage.*)',\n      '(configuration.*)|(config.*)',\n      '(example.*)',\n      '(faq.*)',\n      '(changelog.*)'\n    ];\n\n    let count = 0;\n    for (const pattern of specialFileNamePatterns) {\n      const regexp = new RegExp(pattern, 'i');\n      for (const manual of manuals) {\n        const fileName = path.parse(manual.name).name;\n        if (fileName.match(regexp)) {\n          count++;\n          break;\n        }\n      }\n    }\n\n    if (count !== specialFileNamePatterns.length) return false;\n\n    let badge = this._readTemplate('image/manual-badge.svg');\n    badge = badge.replace(/@value@/g, 'perfect');\n    badge = badge.replace(/@color@/g, '#4fc921');\n    writeFile('manual-badge.svg', badge);\n\n    return true;\n  }\n\n  /**\n   * build manual navigation.\n   * @param {Manual[]} manuals - target manuals.\n   * @return {IceCap} built navigation\n   * @private\n   */\n  _buildManualNav(manuals) {\n    const ice = new IceCap(this._readTemplate('manualIndex.html'));\n\n    ice.loop('manual', manuals, (i, manual, ice)=>{\n      const toc = [];\n      const fileName = this._getManualOutputFileName(manual.name);\n      const html = markdown(manual.content);\n      const $root = cheerio.load(html).root();\n      const h1Count = $root.find('h1').length;\n\n      $root.find('h1,h2,h3,h4,h5').each((i, el)=>{\n        const $el = cheerio(el);\n        const label = $el.text();\n        const indent = `indent-${el.tagName.toLowerCase()}`;\n\n        let link = `${fileName}#${$el.attr('id')}`;\n        if (el.tagName.toLowerCase() === 'h1' && h1Count === 1) link = fileName;\n\n        toc.push({label, link, indent});\n      });\n\n      ice.loop('manualNav', toc, (i, tocItem, ice)=>{\n        ice.attr('manualNav', 'class', tocItem.indent);\n        ice.attr('manualNav', 'data-link', tocItem.link.split('#')[0]);\n        ice.text('link', tocItem.label);\n        ice.attr('link', 'href', tocItem.link);\n      });\n    });\n\n    return ice;\n  }\n\n  /**\n   * build manual.\n   * @param {Object} manual - target manual.\n   * @return {IceCap} built manual.\n   * @private\n   */\n  _buildManual(manual) {\n    const html = markdown(manual.content);\n    const ice = new IceCap(this._readTemplate('manual.html'));\n    ice.load('content', html);\n\n    // convert relative src to base url relative src.\n    const $root = cheerio.load(ice.html).root();\n    $root.find('img').each((i, el)=>{\n      const $el = cheerio(el);\n      const src = $el.attr('src');\n      if (!src) return;\n      if (src.match(/^http[s]?:/)) return;\n      if (src.charAt(0) === '/') return;\n      $el.attr('src', `./manual/${src}`);\n    });\n    $root.find('a').each((i, el)=>{\n      const $el = cheerio(el);\n      const href = $el.attr('href');\n      if (!href) return;\n      if (href.match(/^http[s]?:/)) return;\n      if (href.charAt(0) === '/') return;\n      if (href.charAt(0) === '#') return;\n      $el.attr('href', `./manual/${href}`);\n    });\n\n    return $root.html();\n  }\n\n  /**\n   * built manual card style index.\n   * @param {Object[]} manuals - target manual.\n   * @return {IceCap} built index.\n   * @private\n   */\n  _buildManualCardIndex(manuals, manualIndex, badgeFlag) {\n    const cards = [];\n    for (const manual of manuals) {\n      const fileName = this._getManualOutputFileName(manual.name);\n      const html = this._buildManual(manual);\n      const $root = cheerio.load(html).root();\n      const h1Count = $root.find('h1').length;\n\n      $root.find('h1').each((i, el)=>{\n        const $el = cheerio(el);\n        const label = $el.text();\n        const link = h1Count === 1 ? fileName : `${fileName}#${$el.attr('id')}`;\n        let card = `<h1>${label}</h1>`;\n        const nextAll = $el.nextAll();\n\n        for (let i = 0; i < nextAll.length; i++) {\n          const next = nextAll.get(i);\n          const tagName = next.tagName.toLowerCase();\n          if (tagName === 'h1') return;\n          const $next = cheerio(next);\n          card += `<${tagName}>${$next.html()}</${tagName}>`;\n        }\n\n        cards.push({label, link, card});\n      });\n    }\n\n    const ice = new IceCap(this._readTemplate('manualCardIndex.html'));\n    ice.loop('cards', cards, (i, card, ice)=>{\n      ice.attr('link', 'href', card.link);\n      ice.load('card', card.card);\n    });\n\n    if (manualIndex && manualIndex.content) {\n      const userIndex = markdown(manualIndex.content);\n      ice.load('manualUserIndex', userIndex);\n    } else {\n      ice.drop('manualUserIndex', true);\n    }\n\n    // fixme?\n    ice.drop('manualBadge', !manualIndex.coverage || !badgeFlag);\n\n    return ice;\n  }\n\n  /**\n   * get manual file name.\n   * @param {string} filePath - target manual markdown file path.\n   * @returns {string} file name.\n   * @private\n   */\n  _getManualOutputFileName(filePath) {\n    const fileName = path.parse(filePath).name;\n    return `manual/${fileName}.html`;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/SearchIndexBuilder.js",
    "content": "import DocBuilder from './DocBuilder.js';\n\n/**\n * Search index of identifier builder class.\n */\nexport default class SearchIndexBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const searchIndex = [];\n    const docs = this._find({});\n\n    for (const doc of docs) {\n      if (doc.kind === 'index') continue;\n      if (doc.kind.indexOf('manual') === 0) continue;\n\n      let indexText;\n      let url;\n      let displayText;\n\n      if (doc.importPath) {\n        displayText = `<span>${doc.name}</span> <span class=\"search-result-import-path\">${doc.importPath}</span>`;\n        indexText = `${doc.importPath}~${doc.name}`.toLowerCase();\n        url = this._getURL(doc);\n      } else if (doc.kind === 'test') {\n        displayText = doc.testFullDescription;\n        indexText = [...(doc.testTargets || []), ...(doc._custom_test_targets || [])].join(' ').toLowerCase();\n        const filePath = doc.longname.split('~')[0];\n        const fileDoc = this._find({kind: 'testFile', name: filePath})[0];\n        url = `${this._getURL(fileDoc)}#lineNumber${doc.lineNumber}`;\n      } else if (doc.kind === 'external') {\n        displayText = doc.longname;\n        indexText = displayText.toLowerCase();\n        url = doc.externalLink;\n      } else if (doc.kind === 'file' || doc.kind === 'testFile') {\n        displayText = doc.name;\n        indexText = displayText.toLowerCase();\n        url = this._getURL(doc);\n      } else if (doc.kind === 'packageJSON'){\n        continue;\n      } else {\n        displayText = doc.longname;\n        indexText = displayText.toLowerCase();\n        url = this._getURL(doc);\n      }\n\n      let kind = doc.kind;\n      /* eslint-disable default-case */\n      switch (kind) {\n        case 'constructor':\n          kind = 'method';\n          break;\n        case 'get':\n        case 'set':\n          kind = 'member';\n          break;\n      }\n\n      searchIndex.push([indexText, url, displayText, kind]);\n    }\n\n    searchIndex.sort((a, b)=>{\n      if (a[2] === b[2]) {\n        return 0;\n      } else if (a[2] < b[2]) {\n        return -1;\n      } else {\n        return 1;\n      }\n    });\n\n    const javascript = `window.esdocSearchIndex = ${JSON.stringify(searchIndex, null, 2)}`;\n\n    writeFile('script/search_index.js', javascript);\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/SingleDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\n\n/**\n * Single output builder class.\n * \"single\" means function, variable, typedef, external, etc...\n */\nexport default class SingleDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const ice = this._buildLayoutDoc();\n    ice.autoClose = false;\n\n    const kinds = ['function', 'variable', 'typedef'];\n    for (const kind of kinds) {\n      const docs = this._find({kind: kind});\n      if (!docs.length) continue;\n      const fileName = this._getOutputFileName(docs[0]);\n      const baseUrl = this._getBaseUrl(fileName);\n      let title = kind.replace(/^(\\w)/, (c)=> c.toUpperCase());\n      title = this._getTitle(title);\n\n      ice.load('content', this._buildSingleDoc(kind), IceCap.MODE_WRITE);\n      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);\n      ice.text('title', title, IceCap.MODE_WRITE);\n      writeFile(fileName, ice.html);\n    }\n  }\n\n  /**\n   * build single output.\n   * @param {string} kind - target kind property.\n   * @returns {string} html of single output\n   * @private\n   */\n  _buildSingleDoc(kind) {\n    const title = kind.replace(/^(\\w)/, (c)=> c.toUpperCase());\n    const ice = new IceCap(this._readTemplate('single.html'));\n    ice.text('title', title);\n    ice.load('summaries', this._buildSummaryHTML(null, kind, 'Summary'), 'append');\n    ice.load('details', this._buildDetailHTML(null, kind, ''));\n    return ice.html;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/SourceDocBuilder.js",
    "content": "import fs from 'fs';\nimport IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\nimport {dateForUTC} from './util.js';\n\n/**\n * Source output html builder class.\n */\nexport default class SourceDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir, coverage) {\n    this._coverage = coverage;\n    const ice = this._buildLayoutDoc();\n    const fileName = 'source.html';\n    const baseUrl = this._getBaseUrl(fileName);\n    const title = this._getTitle('Source');\n\n    ice.attr('baseUrl', 'href', baseUrl);\n    ice.load('content', this._buildSourceHTML());\n    ice.text('title', title, IceCap.MODE_WRITE);\n\n    writeFile(fileName, ice.html);\n  }\n\n  /**\n   * build source list output html.\n   * @returns {string} html of source list.\n   * @private\n   */\n  _buildSourceHTML() {\n    const ice = new IceCap(this._readTemplate('source.html'));\n    const docs = this._find({kind: 'file'});\n    let coverage;\n    if (this._coverage) coverage = this._coverage.files;\n\n    ice.drop('coverageBadge', !coverage);\n    ice.attr('files', 'data-use-coverage', !!coverage);\n\n    if (coverage) {\n      const actual = this._coverage.actualCount;\n      const expect = this._coverage.expectCount;\n      const coverageCount = `${actual}/${expect}`;\n      ice.text('totalCoverageCount', coverageCount);\n    }\n\n    ice.loop('file', docs, (i, doc, ice)=>{\n      const filePath = doc.name;\n      const content = doc.content;\n      const lines = content.split('\\n').length - 1;\n      const stat = fs.statSync(doc.longname);\n      const date = dateForUTC(stat.ctime);\n      let coverageRatio;\n      let coverageCount;\n      let undocumentLines;\n      if (coverage && coverage[filePath]) {\n        const actual = coverage[filePath].actualCount;\n        const expect = coverage[filePath].expectCount;\n        coverageRatio = `${Math.floor(100 * actual / expect)} %`;\n        coverageCount = `${actual}/${expect}`;\n        undocumentLines = coverage[filePath].undocumentLines.sort().join(',');\n      } else {\n        coverageRatio = '-';\n      }\n\n      const identifierDocs = this._find({\n        longname: {left: `${doc.name}~`},\n        kind: ['class', 'function', 'variable']\n      });\n      const identifiers = identifierDocs.map(doc =>{\n        return this._buildDocLinkHTML(doc.longname);\n      });\n\n      if (undocumentLines) {\n        const url = this._getURL(doc);\n        const link = this._buildFileDocLinkHTML(doc).replace(/href=\".*\\.html\"/, `href=\"${url}#errorLines=${undocumentLines}\"`);\n        ice.load('filePath', link);\n      } else {\n        ice.load('filePath', this._buildFileDocLinkHTML(doc));\n      }\n      ice.text('coverage', coverageRatio);\n      ice.text('coverageCount', coverageCount);\n      ice.text('lines', lines);\n      ice.text('updated', date);\n      ice.text('size', `${stat.size} byte`);\n      ice.load('identifier', identifiers.join('\\n') || '-');\n    });\n    return ice.html;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/StaticFileBuilder.js",
    "content": "import path from 'path';\nimport DocBuilder from './DocBuilder.js';\n\n/**\n * Static file output builder class.\n */\nexport default class StaticFileBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    copyDir(path.resolve(this._template, 'css'), './css');\n    copyDir(path.resolve(this._template, 'script'), './script');\n    copyDir(path.resolve(this._template, 'image'), './image');\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/TestDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\n\n/**\n * Test file output html builder class.\n */\nexport default class TestDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const testDoc = this._find({kind: 'test'})[0];\n    if (!testDoc) return;\n\n    const ice = this._buildLayoutDoc();\n    const fileName = this._getOutputFileName(testDoc);\n    const baseUrl = this._getBaseUrl(fileName);\n    const title = this._getTitle('Test');\n\n    ice.load('content', this._buildTestDocHTML());\n    ice.attr('baseUrl', 'href', baseUrl);\n    ice.text('title', title);\n    writeFile(fileName, ice.html);\n  }\n\n  /**\n   * build whole test file output html.\n   * @returns {string} html of whole test file.\n   * @private\n   */\n  _buildTestDocHTML() {\n    const ice = new IceCap(this._readTemplate('test.html'));\n    const testDocHTML = this._buildTestInterfaceDocHTML();\n    ice.load('tests', testDocHTML);\n    return ice.html;\n  }\n\n  /**\n   * build test describe list html.\n   * @param {number} [depth=0] - test depth.\n   * @param {string} [memberof] - target test.\n   * @returns {string} html of describe list.\n   * @private\n   */\n  _buildTestInterfaceDocHTML(depth = 0, memberof = null) {\n    const cond = {kind: 'test', testDepth: depth};\n    if (memberof) cond.memberof = memberof;\n    const docs = this._orderedFind('testId asec', cond);\n\n    const resultHTMLs = [];\n    for (const doc of docs) {\n      const childHTML = this._buildTestInterfaceDocHTML(depth + 1, doc.longname);\n\n      const ice = new IceCap(this._readTemplate('testInterface.html'));\n      const padding = 10 * (depth + 1);\n      ice.attr('testInterface', 'data-test-depth', depth);\n      ice.into('testInterface', doc, (doc, ice)=>{\n        // description\n        const descriptionHTML = this._buildFileDocLinkHTML(doc, doc.description);\n\n        // identifier\n        let testTargetsHTML = [];\n        for (const testTarget of doc._custom_test_targets || []) {\n          testTargetsHTML.push(this._buildDocLinkHTML(testTarget[0], testTarget[1]));\n        }\n        testTargetsHTML = testTargetsHTML.join('\\n') || '-';\n\n        // apply\n        ice.drop('testInterfaceToggle', !childHTML);\n        ice.load('testDescription', descriptionHTML);\n        ice.attr('testDescription', 'style', `padding-left: ${padding}px`);\n        ice.load('testTarget', testTargetsHTML);\n      });\n\n      resultHTMLs.push(ice.html);\n      if(childHTML) resultHTMLs.push(childHTML);\n    }\n\n    return resultHTMLs.join('\\n');\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/TestFileDocBuilder.js",
    "content": "import IceCap from 'ice-cap';\nimport DocBuilder from './DocBuilder.js';\n\n/**\n * File output html builder class.\n */\nexport default class TestFileDocBuilder extends DocBuilder {\n  exec(writeFile, copyDir) {\n    const ice = this._buildLayoutDoc();\n\n    const docs = this._find({kind: 'testFile'});\n    for (const doc of docs) {\n      const fileName = this._getOutputFileName(doc);\n      const baseUrl = this._getBaseUrl(fileName);\n      const title = this._getTitle(doc);\n      ice.load('content', this._buildFileDoc(doc), IceCap.MODE_WRITE);\n      ice.attr('baseUrl', 'href', baseUrl, IceCap.MODE_WRITE);\n      ice.text('title', title, IceCap.MODE_WRITE);\n      writeFile(fileName, ice.html);\n    }\n  }\n\n  /**\n   * build file output html.\n   * @param {DocObject} doc - target file doc object.\n   * @returns {string} html of file output.\n   * @private\n   */\n  _buildFileDoc(doc) {\n    const ice = new IceCap(this._readTemplate('file.html'));\n    ice.text('title', doc.name);\n    ice.text('content', doc.content);\n    ice.drop('emptySourceCode', !!doc.content);\n    return ice.html;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/class.html",
    "content": "<div class=\"header-notice\">\n  <div data-ice=\"importPath\" class=\"import-path\"><pre class=\"prettyprint\"><code data-ice=\"importPathCode\"></code></pre></div>\n  <span data-ice=\"access\"></span>\n  <span data-ice=\"kind\"></span>\n  <span data-ice=\"variation\">| variation </span>\n  <span data-ice=\"version\">| version </span>\n  <span data-ice=\"since\">| since </span>\n  <span data-ice=\"source\">| </span>\n</div>\n\n<div class=\"self-detail detail\">\n  <h1 data-ice=\"name\"></h1>\n\n  <div data-ice=\"instanceDocs\" class=\"instance-docs\">\n    <span>You can directly use an instance of this class.</span>\n    <span data-ice=\"instanceDoc\"></span>\n  </div>\n\n  <div class=\"expression-extends\" data-ice=\"expressionExtends\"><h4>Expression Extends:</h4><pre class=\"prettyprint\"><code data-ice=\"expressionExtendsCode\"></code></pre></div>\n  <div class=\"flat-list\" data-ice=\"mixinExtends\"><h4>Mixin Extends:</h4></div>\n  <div class=\"flat-list\" data-ice=\"extendsChain\"><h4>Extends:</h4></div>\n  <div class=\"flat-list\" data-ice=\"directSubclass\"><h4>Direct Subclass:</h4></div>\n  <div class=\"flat-list\" data-ice=\"indirectSubclass\"><h4>Indirect Subclass:</h4></div>\n  <div class=\"flat-list\" data-ice=\"implements\"><h4>Implements:</h4></div>\n  <div class=\"flat-list\" data-ice=\"indirectImplements\"><h4>Indirect Implements:</h4></div>\n  <div class=\"flat-list\" data-ice=\"directImplemented\"><h4>Direct Implemented:</h4></div>\n  <div class=\"flat-list\" data-ice=\"indirectImplemented\"><h4>Indirect Implemented:</h4></div>\n\n  <div class=\"deprecated\" data-ice=\"deprecated\"></div>\n  <div class=\"experimental\" data-ice=\"experimental\"></div>\n  <div class=\"description\" data-ice=\"description\"></div>\n  <div class=\"decorator\" data-ice=\"decorator\"><h4>Decorators:</h4></div>\n\n  <div data-ice=\"see\"><h4>See:</h4></div>\n\n  <div data-ice=\"exampleDocs\">\n    <h4>Example:</h4>\n    <div class=\"example-doc\" data-ice=\"exampleDoc\">\n      <div class=\"example-caption\" data-ice=\"exampleCaption\"></div>\n      <pre class=\"prettyprint source-code\"><code data-ice=\"exampleCode\"></code></pre>\n    </div>\n  </div>\n\n  <div data-ice=\"tests\">\n    <h4>Test:</h4>\n    <ul>\n      <li data-ice=\"test\"></li>\n    </ul>\n  </div>\n\n  <div data-ice=\"todo\"><h4>TODO:</h4></div>\n</div>\n\n<div data-ice=\"staticMemberSummary\"><h2>Static Member Summary</h2></div>\n<div data-ice=\"staticMethodSummary\"><h2>Static Method Summary</h2></div>\n<div data-ice=\"constructorSummary\"><h2>Constructor Summary</h2></div>\n<div data-ice=\"memberSummary\"><h2>Member Summary</h2></div>\n<div data-ice=\"methodSummary\"><h2>Method Summary</h2></div>\n\n<div class=\"inherited-summary\" data-ice=\"inheritedSummary\"><h2>Inherited Summary</h2></div>\n\n<div data-ice=\"staticMemberDetails\"></div>\n<div data-ice=\"staticMethodDetails\"></div>\n<div data-ice=\"constructorDetails\"></div>\n<div data-ice=\"memberDetails\"></div>\n<div data-ice=\"methodDetails\"></div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/github.css",
    "content": "/* github markdown */\n.github-markdown {\n  font-size: 16px;\n}\n\n.github-markdown h1,\n.github-markdown h2,\n.github-markdown h3,\n.github-markdown h4,\n.github-markdown h5 {\n  margin-top: 1em;\n  margin-bottom: 16px;\n  font-weight: bold;\n  padding: 0;\n}\n\n.github-markdown h1:nth-of-type(1) {\n  margin-top: 0;\n}\n\n.github-markdown h1 {\n  font-size: 2em;\n  padding-bottom: 0.3em;\n}\n\n.github-markdown h2 {\n  font-size: 1.75em;\n  padding-bottom: 0.3em;\n}\n\n.github-markdown h3 {\n  font-size: 1.5em;\n}\n\n.github-markdown h4 {\n  font-size: 1.25em;\n}\n\n.github-markdown h5 {\n  font-size: 1em;\n}\n\n.github-markdown ul, .github-markdown ol {\n  padding-left: 2em;\n}\n\n.github-markdown pre > code {\n  font-size: 0.85em;\n}\n\n.github-markdown table {\n  margin-bottom: 1em;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n.github-markdown table tr {\n  background-color: #fff;\n  border-top: 1px solid #ccc;\n}\n\n.github-markdown table th,\n.github-markdown table td {\n  padding: 6px 13px;\n  border: 1px solid #ddd;\n}\n\n.github-markdown table tr:nth-child(2n) {\n  background-color: #f8f8f8;\n}\n\n.github-markdown hr {\n  border-right: 0;\n  border-bottom: 1px solid #e5e5e5;\n  border-left: 0;\n  border-top: 0;\n}\n\n/** badge(.svg) does not have border */\n.github-markdown img:not([src*=\".svg\"]) {\n  max-width: 100%;\n  box-shadow: 1px 1px 1px rgba(0,0,0,0.5);\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/identifiers.css",
    "content": ".identifiers-wrap {\n  display: flex;\n  align-items: flex-start;\n}\n\n.identifier-dir-tree {\n  background: #fff;\n  border: solid 1px #ddd;\n  border-radius: 0.25em;\n  top: 52px;\n  position: -webkit-sticky;\n  position: sticky;\n  max-height: calc(100vh - 155px);\n  overflow-y: scroll;\n  min-width: 200px;\n  margin-left: 1em;\n}\n\n.identifier-dir-tree-header {\n  padding: 0.5em;\n  background-color: #fafafa;\n  border-bottom: solid 1px #ddd;\n}\n\n.identifier-dir-tree-content {\n  padding: 0 0.5em 0;\n}\n\n.identifier-dir-tree-content > div {\n  padding-top: 0.25em;\n  padding-bottom: 0.25em;\n}\n\n.identifier-dir-tree-content a {\n  color: inherit;\n}\n\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/manual.css",
    "content": ".github-markdown .manual-toc {\n  padding-left: 0;\n}\n\n.manual-index .manual-cards {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.manual-index .manual-card-wrap {\n  width: 280px;\n  padding: 10px 20px 10px 0;\n  box-sizing: border-box;\n}\n\n.manual-index .manual-card-wrap > h1 {\n  margin: 0;\n  font-size: 1em;\n  font-weight: 600;\n  padding: 0.2em 0 0.2em 0.5em;\n  border-radius: 0.1em 0.1em 0 0;\n  border: none;\n}\n\n.manual-index .manual-card-wrap > h1 span {\n  color: #555;\n}\n\n.manual-index .manual-card {\n  height: 200px;\n  overflow: hidden;\n  border: solid 1px rgba(230, 230, 230, 0.84);\n  border-radius: 0 0 0.1em 0.1em;\n  padding: 8px;\n  position: relative;\n}\n\n.manual-index .manual-card > div {\n  transform: scale(0.4);\n  transform-origin: 0 0;\n  width: 250%;\n}\n\n.manual-index .manual-card > a {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: rgba(210, 210, 210, 0.1);\n}\n\n.manual-index .manual-card > a:hover {\n  background: none;\n}\n\n.manual-index .manual-badge {\n  margin: 0;\n}\n\n.manual-index .manual-user-index {\n  margin-bottom: 1em;\n  border-bottom: solid 1px #ddd;\n}\n\n.manual-root .navigation {\n  padding-left: 4px;\n  margin-top: 4px;\n}\n\n.navigation .manual-toc-root > div {\n  padding-left: 0.25em;\n  padding-right: 0.75em;\n}\n\n.github-markdown .manual-toc-title a {\n  color: inherit;\n}\n\n.manual-breadcrumb-list {\n  font-size: 0.8em;\n  margin-bottom: 1em;\n}\n\n.manual-toc-title a:hover {\n  color: #039BE5;\n}\n\n.manual-toc li {\n  margin: 0.75em 0;\n  list-style-type: none;\n}\n\n.navigation .manual-toc [class^=\"indent-h\"] a {\n  color: #666;\n}\n\n.navigation .manual-toc .indent-h1 a {\n  color: #555;\n  font-weight: 600;\n  display: block;\n}\n\n.manual-toc .indent-h1 {\n  display: block;\n  margin: 0.4em 0 0 0.25em;\n  padding: 0.2em 0 0.2em 0.5em;\n  border-radius: 0.1em;\n}\n\n.manual-root .navigation .manual-toc li:not(.indent-h1) {\n  margin-top: 0.5em;\n}\n\n.manual-toc .indent-h2 {\n  display: none;\n  margin-left: 1.5em;\n}\n.manual-toc .indent-h3 {\n  display: none;\n  margin-left: 2.5em;\n}\n.manual-toc .indent-h4 {\n  display: none;\n  margin-left: 3.5em;\n}\n.manual-toc .indent-h5 {\n  display: none;\n  margin-left: 4.5em;\n}\n\n.manual-nav li {\n  margin: 0.75em 0;\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/prettify-tomorrow.css",
    "content": "/* Tomorrow Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* Pretty printing styles. Used with prettify.js. */\n/* SPAN elements with the classes below are added by prettyprint. */\n/* plain text */\n.pln {\n  color: #4d4d4c; }\n\n@media screen {\n  /* string content */\n  .str {\n    color: #718c00; }\n\n  /* a keyword */\n  .kwd {\n    color: #8959a8; }\n\n  /* a comment */\n  .com {\n    color: #8e908c; }\n\n  /* a type name */\n  .typ {\n    color: #4271ae; }\n\n  /* a literal value */\n  .lit {\n    color: #f5871f; }\n\n  /* punctuation */\n  .pun {\n    color: #4d4d4c; }\n\n  /* lisp open bracket */\n  .opn {\n    color: #4d4d4c; }\n\n  /* lisp close bracket */\n  .clo {\n    color: #4d4d4c; }\n\n  /* a markup tag name */\n  .tag {\n    color: #c82829; }\n\n  /* a markup attribute name */\n  .atn {\n    color: #f5871f; }\n\n  /* a markup attribute value */\n  .atv {\n    color: #3e999f; }\n\n  /* a declaration */\n  .dec {\n    color: #f5871f; }\n\n  /* a variable name */\n  .var {\n    color: #c82829; }\n\n  /* a function name */\n  .fun {\n    color: #4271ae; } }\n/* Use higher contrast and text-weight for printable form. */\n@media print, projection {\n  .str {\n    color: #060; }\n\n  .kwd {\n    color: #006;\n    font-weight: bold; }\n\n  .com {\n    color: #600;\n    font-style: italic; }\n\n  .typ {\n    color: #404;\n    font-weight: bold; }\n\n  .lit {\n    color: #044; }\n\n  .pun, .opn, .clo {\n    color: #440; }\n\n  .tag {\n    color: #006;\n    font-weight: bold; }\n\n  .atn {\n    color: #404; }\n\n  .atv {\n    color: #060; } }\n/* Style */\n/*\npre.prettyprint {\n  background: white;\n  font-family: Consolas, Monaco, 'Andale Mono', monospace;\n  font-size: 12px;\n  line-height: 1.5;\n  border: 1px solid #ccc;\n  padding: 10px; }\n*/\n\n/* Specify class=linenums on a pre to get line numbering */\nol.linenums {\n  margin-top: 0;\n  margin-bottom: 0; }\n\n/* IE indents via margin-left */\nli.L0,\nli.L1,\nli.L2,\nli.L3,\nli.L4,\nli.L5,\nli.L6,\nli.L7,\nli.L8,\nli.L9 {\n  /* */ }\n\n/* Alternate shading for lines */\nli.L1,\nli.L3,\nli.L5,\nli.L7,\nli.L9 {\n  /* */ }\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/search.css",
    "content": "/* search box */\n.search-box {\n  position: absolute;\n  top: 10px;\n  right: 50px;\n  padding-right: 8px;\n  padding-bottom: 10px;\n  line-height: normal;\n  font-size: 12px;\n}\n\n.search-box img {\n  width: 20px;\n  vertical-align: top;\n}\n\n.search-input {\n  display: inline;\n  visibility: hidden;\n  width: 0;\n  padding: 2px;\n  height: 1.5em;\n  outline: none;\n  background: transparent;\n  border: 1px #0af;\n  border-style: none none solid none;\n  vertical-align: bottom;\n}\n\n.search-input-edge {\n  display: none;\n  width: 1px;\n  height: 5px;\n  background-color: #0af;\n  vertical-align: bottom;\n}\n\n.search-result {\n  position: absolute;\n  display: none;\n  height: 600px;\n  width: 100%;\n  padding: 0;\n  margin-top: 5px;\n  margin-left: 24px;\n  background: white;\n  box-shadow: 1px 1px 4px rgb(0,0,0);\n  white-space: nowrap;\n  overflow-y: scroll;\n}\n\n.search-result-import-path {\n  color: #aaa;\n  font-size: 12px;\n}\n\n.search-result li {\n  list-style: none;\n  padding: 2px 4px;\n}\n\n.search-result li a {\n  display: block;\n}\n\n.search-result li.selected {\n  background: #ddd;\n}\n\n.search-result li.search-separator {\n  background: rgb(37, 138, 175);\n  color: white;\n}\n\n.search-box.active .search-input {\n  visibility: visible;\n  transition: width 0.2s ease-out;\n  width: 300px;\n}\n\n.search-box.active .search-input-edge {\n  display: inline-block;\n}\n\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/source.css",
    "content": "table.files-summary {\n  width: 100%;\n  margin: 10px 0;\n  border-spacing: 0;\n  border: 0;\n  border-collapse: collapse;\n  text-align: right;\n}\n\ntable.files-summary tbody tr:hover {\n  background: #eee;\n}\n\ntable.files-summary td:first-child,\ntable.files-summary td:nth-of-type(2) {\n  text-align: left;\n}\n\ntable.files-summary[data-use-coverage=\"false\"] td.coverage {\n  display: none;\n}\n\ntable.files-summary thead {\n  background: #fafafa;\n}\n\ntable.files-summary td {\n  border: solid 1px #ddd;\n  padding: 4px 10px;\n  vertical-align: top;\n}\n\ntable.files-summary td.identifiers > span {\n  display: block;\n  margin-top: 4px;\n}\ntable.files-summary td.identifiers > span:first-child {\n  margin-top: 0;\n}\n\ntable.files-summary .coverage-count {\n  font-size: 12px;\n  color: #aaa;\n  display: inline-block;\n  min-width: 40px;\n}\n\n.total-coverage-count {\n  position: relative;\n  bottom: 2px;\n  font-size: 12px;\n  color: #666;\n  font-weight: 500;\n  padding-left: 5px;\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/style.css",
    "content": "@import url(https://fonts.googleapis.com/css?family=Roboto:400,300,700);\n@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600,700);\n@import url(./manual.css);\n@import url(./source.css);\n@import url(./test.css);\n@import url(./identifiers.css);\n@import url(./github.css);\n@import url(./search.css);\n\n* {\n  margin: 0;\n  padding: 0;\n  text-decoration: none;\n}\n\nhtml\n{\n  font-family: 'Source Sans Pro', 'Roboto', sans-serif;\n  overflow: auto;\n  /*font-size: 14px;*/\n  /*color: #4d4e53;*/\n  /*color: rgba(0, 0, 0, .68);*/\n  color: #555;\n  background-color: #fff;\n}\n\na {\n  /*color: #0095dd;*/\n  /*color:rgb(37, 138, 175);*/\n  color: #039BE5;\n}\n\ncode a:hover {\n  text-decoration: underline;\n}\n\nul, ol {\n  padding-left: 20px;\n}\n\nul li {\n  list-style: disc;\n  margin: 4px 0;\n}\n\nol li {\n  margin: 4px 0;\n}\n\nh1 {\n  margin-bottom: 10px;\n  font-size: 34px;\n  font-weight: 300;\n  border-bottom: solid 1px #ddd;\n}\n\nh2 {\n  margin-top: 24px;\n  margin-bottom: 10px;\n  font-size: 20px;\n  border-bottom: solid 1px #ddd;\n  font-weight: 300;\n}\n\nh3 {\n  position: relative;\n  font-size: 16px;\n  margin-bottom: 12px;\n  padding: 4px;\n  font-weight: 300;\n}\n\ndetails {\n  cursor: pointer;\n}\n\ndel {\n  text-decoration: line-through;\n}\n\np {\n  margin-bottom: 15px;\n  line-height: 1.5;\n}\n\ncode {\n  font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n}\n\npre > code {\n  display: block;\n}\n\npre.prettyprint, pre > code {\n  padding: 4px;\n  margin: 1em 0;\n  background-color: #f5f5f5;\n  border-radius: 3px;\n}\n\npre.prettyprint > code {\n  margin: 0;\n}\n\np > code,\nli > code {\n  padding: 0.2em 0.5em;\n  margin: 0;\n  font-size: 85%;\n  background-color: rgba(0,0,0,0.04);\n  border-radius: 3px;\n}\n\n.code {\n  font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n  font-size: 13px;\n}\n\n.import-path pre.prettyprint,\n.import-path pre.prettyprint code {\n  margin: 0;\n  padding: 0;\n  border: none;\n  background: white;\n}\n\n.layout-container {\n  /*display: flex;*/\n  /*flex-direction: row;*/\n  /*justify-content: flex-start;*/\n  /*align-items: stretch;*/\n}\n\n.layout-container > header {\n  display: flex;\n  height: 40px;\n  line-height: 40px;\n  font-size: 16px;\n  padding: 0 10px;\n  margin: 0;\n  position: fixed;\n  width: 100%;\n  z-index: 1;\n  background-color: #fafafa;\n  top: 0;\n  border-bottom: solid 1px #ddd;\n}\n.layout-container > header > a{\n  margin: 0 5px;\n  color: #444;\n}\n\n.layout-container > header > a.repo-url-github {\n  font-size: 0;\n  display: inline-block;\n  width: 20px;\n  height: 38px;\n  background: url(\"../image/github.png\") no-repeat center;\n  background-size: 20px;\n  vertical-align: top;\n}\n\n.navigation {\n  position: fixed;\n  top: 0;\n  left: 0;\n  box-sizing: border-box;\n  width: 250px;\n  height: 100%;\n  padding-top: 40px;\n  padding-left: 15px;\n  padding-bottom: 2em;\n  margin-top:1em;\n  overflow-x: scroll;\n  box-shadow: rgba(255, 255, 255, 1) -1px 0 0 inset;\n  border-right: 1px solid #ddd;\n}\n\n.navigation ul {\n  padding: 0;\n}\n\n.navigation li {\n  list-style: none;\n  margin: 4px 0;\n  white-space: nowrap;\n}\n\n.navigation li a {\n  color: #666;\n}\n\n.navigation .nav-dir-path {\n  display: block;\n  margin-top: 0.7em;\n  margin-bottom: 0.25em;\n  font-weight: 600;\n}\n\n.kind-class,\n.kind-interface,\n.kind-function,\n.kind-typedef,\n.kind-variable,\n.kind-external {\n  margin-left: 0.75em;\n  width: 1.2em;\n  height: 1.2em;\n  display: inline-block;\n  text-align: center;\n  border-radius: 0.2em;\n  margin-right: 0.2em;\n  font-weight: bold;\n  line-height: 1.2em;\n}\n\n.kind-class {\n  color: #009800;\n  background-color: #bfe5bf;\n}\n\n.kind-interface {\n  color: #fbca04;\n  background-color: #fef2c0;\n}\n\n.kind-function {\n  color: #6b0090;\n  background-color: #d6bdde;\n}\n\n.kind-variable {\n  color: #eb6420;\n  background-color: #fad8c7;\n}\n\n.kind-typedef {\n  color: #db001e;\n  background-color: #edbec3;\n}\n\n.kind-external {\n  color: #0738c3;\n  background-color: #bbcbea;\n}\n\n.summary span[class^=\"kind-\"] {\n  margin-left: 0;\n}\n\nh1 .version,\nh1 .url a {\n  font-size: 14px;\n  color: #aaa;\n}\n\n.content {\n  margin-top: 40px;\n  margin-left: 250px;\n  padding: 10px 50px 10px 20px;\n}\n\n.header-notice {\n  font-size: 14px;\n  color: #aaa;\n  margin: 0;\n}\n\n.expression-extends .prettyprint {\n  margin-left: 10px;\n  background: white;\n}\n\n.extends-chain {\n  border-bottom: 1px solid#ddd;\n  padding-bottom: 10px;\n  margin-bottom: 10px;\n}\n\n.extends-chain span:nth-of-type(1) {\n  padding-left: 10px;\n}\n\n.extends-chain > div {\n  margin: 5px 0;\n}\n\n.description table {\n  font-size: 14px;\n  border-spacing: 0;\n  border: 0;\n  border-collapse: collapse;\n}\n\n.description thead {\n  background: #999;\n  color: white;\n}\n\n.description table td,\n.description table th {\n  border: solid 1px #ddd;\n  padding: 4px;\n  font-weight: normal;\n}\n\n.flat-list ul {\n  padding-left: 0;\n}\n\n.flat-list li {\n  display: inline;\n  list-style: none;\n}\n\ntable.summary {\n  width: 100%;\n  margin: 10px 0;\n  border-spacing: 0;\n  border: 0;\n  border-collapse: collapse;\n}\n\ntable.summary thead {\n  background: #fafafa;\n}\n\ntable.summary td {\n  border: solid 1px #ddd;\n  padding: 4px 10px;\n}\n\ntable.summary tbody td:nth-child(1) {\n  text-align: right;\n  white-space: nowrap;\n  min-width: 64px;\n  vertical-align: top;\n}\n\ntable.summary tbody td:nth-child(2) {\n  width: 100%;\n  border-right: none;\n}\n\ntable.summary tbody td:nth-child(3) {\n  white-space: nowrap;\n  border-left: none;\n  vertical-align: top;\n}\n\ntable.summary td > div:nth-of-type(2) {\n  padding-top: 4px;\n  padding-left: 15px;\n}\n\ntable.summary td p {\n  margin-bottom: 0;\n}\n\n.inherited-summary thead td {\n  padding-left: 2px;\n}\n\n.inherited-summary thead a {\n  color: white;\n}\n\n.inherited-summary .summary tbody {\n  display: none;\n}\n\n.inherited-summary .summary .toggle {\n  padding: 0 4px;\n  font-size: 12px;\n  cursor: pointer;\n}\n.inherited-summary .summary .toggle.closed:before {\n  content: \"▶\";\n}\n.inherited-summary .summary .toggle.opened:before {\n  content: \"▼\";\n}\n\n.member, .method {\n  margin-bottom: 24px;\n}\n\ntable.params {\n  width: 100%;\n  margin: 10px 0;\n  border-spacing: 0;\n  border: 0;\n  border-collapse: collapse;\n}\n\ntable.params thead {\n  background: #eee;\n  color: #aaa;\n}\n\ntable.params td {\n  padding: 4px;\n  border: solid 1px #ddd;\n}\n\ntable.params td p {\n  margin: 0;\n}\n\n.content .detail > * {\n  margin: 15px 0;\n}\n\n.content .detail > h3 {\n  color: black;\n  background-color: #f0f0f0;\n}\n\n.content .detail > div {\n  margin-left: 10px;\n}\n\n.content .detail > .import-path {\n  margin-top: -8px;\n}\n\n.content .detail + .detail {\n  margin-top: 30px;\n}\n\n.content .detail .throw td:first-child {\n  padding-right: 10px;\n}\n\n.content .detail h4 + :not(pre) {\n  padding-left: 0;\n  margin-left: 10px;\n}\n\n.content .detail h4 + ul li {\n  list-style: none;\n}\n\n.return-param * {\n  display: inline;\n}\n\n.argument-params {\n  margin-bottom: 20px;\n}\n\n.return-type {\n  padding-right: 10px;\n  font-weight: normal;\n}\n\n.return-desc {\n  margin-left: 10px;\n  margin-top: 4px;\n}\n\n.return-desc p {\n  margin: 0;\n}\n\n.deprecated, .experimental, .instance-docs {\n  border-left: solid 5px orange;\n  padding-left: 4px;\n  margin: 4px 0;\n}\n\ntr.listen p,\ntr.throw p,\ntr.emit p{\n  margin-bottom: 10px;\n}\n\n.version, .since {\n  color: #aaa;\n}\n\nh3 .right-info {\n  position: absolute;\n  right: 4px;\n  font-size: 14px;\n}\n\n.version + .since:before {\n  content: '| ';\n}\n\n.see {\n  margin-top: 10px;\n}\n\n.see h4 {\n  margin: 4px 0;\n}\n\n.content .detail h4 + .example-doc {\n  margin: 6px 0;\n}\n\n.example-caption {\n  position: relative;\n  bottom: -1px;\n  display: inline-block;\n  padding: 4px;\n  font-style: italic;\n  background-color: #f5f5f5;\n  font-weight: bold;\n  border-radius: 3px;\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.example-caption + pre.source-code {\n  margin-top: 0;\n  border-top-left-radius: 0;\n}\n\nfooter, .file-footer {\n  text-align: right;\n  font-style: italic;\n  font-weight: 100;\n  font-size: 13px;\n  margin-right: 50px;\n  margin-left: 270px;\n  border-top: 1px solid #ddd;\n  padding-top: 30px;\n  margin-top: 20px;\n  padding-bottom: 10px;\n}\n\nfooter img {\n  width: 24px;\n  vertical-align: middle;\n  padding-left: 4px;\n  position: relative;\n  top: -3px;\n  opacity: 0.6;\n}\n\npre.source-code {\n  padding: 4px;\n}\n\npre.raw-source-code > code {\n  padding: 0;\n  margin: 0;\n  font-size: 12px;\n  background: #fff;\n  border: solid 1px #ddd;\n  line-height: 1.5;\n}\n\npre.raw-source-code > code > ol {\n  counter-reset:number;\n  list-style:none;\n  margin:0;\n  padding:0;\n  overflow: hidden;\n}\n\npre.raw-source-code > code > ol li:before {\n  counter-increment: number;\n  content: counter(number);\n  display: inline-block;\n  min-width: 3em;\n  color: #aaa;\n  text-align: right;\n  padding-right: 1em;\n}\n\npre.source-code.line-number {\n  padding: 0;\n}\n\npre.source-code ol {\n  background: #eee;\n  padding-left: 40px;\n}\n\npre.source-code li {\n  background: white;\n  padding-left: 4px;\n  list-style: decimal;\n  margin: 0;\n}\n\npre.source-code.line-number li.active {\n  background: rgb(255, 255, 150) !important;\n}\n\npre.source-code.line-number li.error-line {\n  background: #ffb8bf;\n}\n\n.inner-link-active {\n  /*background: rgb(255, 255, 150) !important;*/\n  background: #039BE5 !important;\n  color: #fff !important;\n  padding-left: 0.1em !important;\n}\n\n.inner-link-active a {\n  color: inherit;\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/css/test.css",
    "content": "table.test-summary thead {\n  background: #fafafa;\n}\n\ntable.test-summary thead .test-description {\n  width: 50%;\n}\n\ntable.test-summary {\n  width: 100%;\n  margin: 10px 0;\n  border-spacing: 0;\n  border: 0;\n  border-collapse: collapse;\n}\n\ntable.test-summary thead .test-count {\n  width: 3em;\n}\n\ntable.test-summary tbody tr:hover {\n  background-color: #eee;\n}\n\ntable.test-summary td {\n  border: solid 1px #ddd;\n  padding: 4px 10px;\n  vertical-align: top;\n}\n\ntable.test-summary td p {\n  margin: 0;\n}\n\ntable.test-summary tr.test-interface .toggle {\n  display: inline-block;\n  float: left;\n  margin-right: 4px;\n  cursor: pointer;\n  font-size: 0.8em;\n  padding-top: 0.25em;\n}\n\ntable.test-summary tr.test-interface .toggle.opened:before {\n  content: '▼';\n}\n\ntable.test-summary tr.test-interface .toggle.closed:before {\n  content: '▶';\n}\n\ntable.test-summary .test-target > span {\n  display: block;\n  margin-top: 4px;\n}\ntable.test-summary .test-target > span:first-child {\n  margin-top: 0;\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/details.html",
    "content": "<h2 data-ice=\"title\"></h2>\n<div class=\"detail\" data-ice=\"detail\">\n  <h3 data-ice=\"anchor\">\n    <span class=\"access\" data-ice=\"access\"></span>\n    <span data-ice=\"static\"></span>\n    <span class=\"kind\" data-ice=\"kind\"></span>\n    <span class=\"abstract\" data-ice=\"abstract\"></span>\n    <span data-ice=\"async\"></span>\n    <span data-ice=\"generator\"></span>\n    <span class=\"code\" data-ice=\"name\"></span><span class=\"code\" data-ice=\"signature\"></span>\n    <span class=\"right-info\">\n      <span class=\"version\" data-ice=\"version\">version </span>\n      <span class=\"since\" data-ice=\"since\">since </span>\n      <span data-ice=\"source\"></span>\n    </span>\n  </h3>\n\n  <div data-ice=\"importPath\" class=\"import-path\"><pre class=\"prettyprint\"><code data-ice=\"importPathCode\"></code></pre></div>\n  <div class=\"deprecated\" data-ice=\"deprecated\"></div>\n  <div class=\"experimental\" data-ice=\"experimental\"></div>\n  <div data-ice=\"description\"></div>\n\n  <div data-ice=\"override\"><h4>Override:</h4></div>\n\n  <div data-ice=\"properties\"></div>\n\n  <div class=\"return-params\" data-ice=\"returnParams\">\n    <h4>Return:</h4>\n    <table>\n      <tbody>\n        <tr>\n          <td class=\"return-type code\" data-ice=\"returnType\"></td>\n          <td class=\"return-desc\" data-ice=\"returnDescription\"></td>\n        </tr>\n      </tbody>\n    </table>\n    <div data-ice=\"returnProperties\"></div>\n  </div>\n\n  <div data-ice=\"emitWrap\">\n    <h4>Emit:</h4>\n    <table>\n      <tbody>\n      <tr class=\"emit\" data-ice=\"emit\">\n        <td><p data-ice=\"emitName\"></p></td>\n        <td data-ice=\"emitDesc\"></td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n\n  <div data-ice=\"listenWrap\">\n    <h4>Listen:</h4>\n    <table>\n      <tbody>\n      <tr class=\"listen\" data-ice=\"listen\">\n        <td><p data-ice=\"listenName\"></p></td>\n        <td data-ice=\"listenDesc\"></td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n\n  <div data-ice=\"throwWrap\">\n    <h4>Throw:</h4>\n    <table>\n      <tbody>\n      <tr class=\"throw\" data-ice=\"throw\">\n        <td><p data-ice=\"throwName\"></p></td>\n        <td data-ice=\"throwDesc\"></td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n\n  <div data-ice=\"decorator\"><h4>Decorators:</h4></div>\n\n  <div data-ice=\"example\">\n    <h4>Example:</h4>\n    <div class=\"example-doc\" data-ice=\"exampleDoc\">\n      <div class=\"example-caption\" data-ice=\"exampleCaption\"></div>\n      <pre class=\"prettyprint source-code\"><code data-ice=\"exampleCode\"></code></pre>\n    </div>\n  </div>\n\n  <div data-ice=\"tests\">\n    <h4>Test:</h4>\n    <ul>\n      <li data-ice=\"test\"></li>\n    </ul>\n  </div>\n\n  <div data-ice=\"see\"><h4>See:</h4></div>\n  <div data-ice=\"todo\"><h4>TODO:</h4></div>\n</div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/file.html",
    "content": "<h1 data-ice=\"title\"></h1>\n<pre class=\"source-code line-number raw-source-code\"><code class=\"prettyprint linenums\" data-ice=\"content\"></code></pre>\n<p data-ice=\"emptySourceCode\">Sorry, this documentation does not provide source code.</p>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/identifiers.html",
    "content": "<h1>References</h1>\n\n<div class=\"identifiers-wrap\">\n  <div>\n    <div data-ice=\"dirSummaryWrap\">\n      <h2 data-ice=\"dirPath\"></h2>\n      <div data-ice=\"dirSummary\"></div>\n    </div>\n  </div>\n\n  <div class=\"identifier-dir-tree\" data-ice=\"dirTreeWrap\">\n    <div class=\"identifier-dir-tree-header\">Directories</div>\n    <div class=\"identifier-dir-tree-content\" data-ice=\"dirTree\"></div>\n  </div>\n</div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/index.html",
    "content": "<div data-ice=\"index\" class=\"github-markdown\"></div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/layout.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <base data-ice=\"baseUrl\">\n  <title data-ice=\"title\"></title>\n  <link type=\"text/css\" rel=\"stylesheet\" href=\"css/style.css\"/>\n  <link type=\"text/css\" rel=\"stylesheet\" href=\"css/prettify-tomorrow.css\"/>\n  <script src=\"script/prettify/prettify.js\"></script>\n  <script src=\"script/manual.js\"></script>\n</head>\n<body class=\"layout-container\" data-ice=\"rootContainer\">\n\n<header>\n  <a href=\"./\">Home</a>\n  <a href=\"./manual/index.html\" data-ice=\"manualHeaderLink\">Manual</a>\n  <a href=\"identifiers.html\">Reference</a>\n  <a href=\"source.html\">Source</a>\n  <a href=\"test.html\" data-ice=\"testLink\">Test</a>\n  <div class=\"search-box\">\n  <span>\n    <img src=\"./image/search.png\"/>\n    <span class=\"search-input-edge\"></span><input class=\"search-input\"/><span class=\"search-input-edge\"></span>\n  </span>\n    <ul class=\"search-result\"></ul>\n  </div>\n</header>\n\n<nav class=\"navigation\" data-ice=\"nav\"></nav>\n\n<div class=\"content\" data-ice=\"content\"></div>\n\n<footer class=\"footer\">\n  Generated by <a href=\"https://esdoc.org\">ESDoc<span data-ice=\"esdocVersion\"></span><img src=\"./image/esdoc-logo-mini-black.png\"/></a>\n</footer>\n\n<script src=\"script/search_index.js\"></script>\n<script src=\"script/search.js\"></script>\n<script src=\"script/pretty-print.js\"></script>\n<script src=\"script/inherited-summary.js\"></script>\n<script src=\"script/test-summary.js\"></script>\n<script src=\"script/inner-link.js\"></script>\n<script src=\"script/patch-for-local.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/manual.html",
    "content": "<div class=\"github-markdown\" data-ice=\"content\"></div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/manualCardIndex.html",
    "content": "<div class=\"github-markdown\">\n  <div class=\"manual-user-index\" data-ice=\"manualUserIndex\"></div>\n\n  <p class=\"manual-badge\" data-ice=\"manualBadge\"><img src=\"./manual-badge.svg\"/></p>\n\n  <div class=\"manual-cards\">\n    <div class=\"manual-card-wrap\" data-ice=\"cards\">\n      <div class=\"manual-card\">\n        <div data-ice=\"card\"></div>\n        <a data-ice=\"link\"></a>\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/manualIndex.html",
    "content": "<div class=\"manual-toc-root\">\n  <div data-ice=\"manual\">\n    <ul class=\"manual-toc\">\n      <li data-ice=\"manualNav\"><a href=\"\" data-ice=\"link\"></a></li>\n    </ul>\n  </div>\n</div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/nav.html",
    "content": "<div>\n  <ul>\n    <li data-ice=\"doc\"><a data-ice=\"dirPath\" class=\"nav-dir-path\"></a><span data-ice=\"kind\"></span><span data-ice=\"name\"></span></li>\n  </ul>\n</div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/properties.html",
    "content": "<div data-ice=\"properties\">\n  <h4 data-ice=\"title\"></h4>\n  <table class=\"params\">\n    <thead>\n    <tr><td>Name</td><td>Type</td><td>Attribute</td><td>Description</td></tr>\n    </thead>\n    <tbody>\n    <tr data-ice=\"property\">\n      <td data-ice=\"name\" class=\"code\"></td>\n      <td data-ice=\"type\" class=\"code\"></td>\n      <td data-ice=\"appendix\"></td>\n      <td data-ice=\"description\"></td>\n    </tr>\n    </tbody>\n  </table>\n</div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/inherited-summary.js",
    "content": "(function(){\n  function toggle(ev) {\n    var button = ev.target;\n    var parent = ev.target.parentElement;\n    while(parent) {\n      if (parent.tagName === 'TABLE' && parent.classList.contains('summary')) break;\n      parent = parent.parentElement;\n    }\n\n    if (!parent) return;\n\n    var tbody = parent.querySelector('tbody');\n    if (button.classList.contains('opened')) {\n      button.classList.remove('opened');\n      button.classList.add('closed');\n      tbody.style.display = 'none';\n    } else {\n      button.classList.remove('closed');\n      button.classList.add('opened');\n      tbody.style.display = 'block';\n    }\n  }\n\n  var buttons = document.querySelectorAll('.inherited-summary thead .toggle');\n  for (var i = 0; i < buttons.length; i++) {\n    buttons[i].addEventListener('click', toggle);\n  }\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/inner-link.js",
    "content": "// inner link(#foo) can not correctly scroll, because page has fixed header,\n// so, I manually scroll.\n(function(){\n  var matched = location.hash.match(/errorLines=([\\d,]+)/);\n  if (matched) return;\n\n  function adjust() {\n    window.scrollBy(0, -55);\n    var el = document.querySelector('.inner-link-active');\n    if (el) el.classList.remove('inner-link-active');\n\n    // ``[ ] . ' \" @`` are not valid in DOM id. so must escape these.\n    var id = location.hash.replace(/([\\[\\].'\"@$])/g, '\\\\$1');\n    var el = document.querySelector(id);\n    if (el) el.classList.add('inner-link-active');\n  }\n\n  window.addEventListener('hashchange', adjust);\n\n  if (location.hash) {\n    setTimeout(adjust, 0);\n  }\n})();\n\n(function(){\n  var els = document.querySelectorAll('[href^=\"#\"]');\n  var href = location.href.replace(/#.*$/, ''); // remove existed hash\n  for (var i = 0; i < els.length; i++) {\n    var el = els[i];\n    el.href = href + el.getAttribute('href'); // because el.href is absolute path\n  }\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/manual.js",
    "content": "(function(){\n  var matched = location.pathname.match(/\\/(manual\\/.*\\.html)$/);\n  if (!matched) return;\n\n  var currentName = matched[1];\n  var cssClass = '.navigation .manual-toc li[data-link=\"' + currentName + '\"]';\n  var styleText = cssClass + '{ display: block; }\\n';\n  styleText += cssClass + '.indent-h1 a { color: #039BE5 }';\n  var style = document.createElement('style');\n  style.textContent = styleText;\n  document.querySelector('head').appendChild(style);\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/patch-for-local.js",
    "content": "(function(){\n  if (location.protocol === 'file:') {\n    var elms = document.querySelectorAll('a[href=\"./\"]');\n    for (var i = 0; i < elms.length; i++) {\n      elms[i].href = './index.html';\n    }\n  }\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/prettify/Apache-License-2.0.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/prettify/prettify.js",
    "content": "!function(){/*\n\n Copyright (C) 2006 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nwindow.PR_SHOULD_USE_CONTINUATION=!0;\n(function(){function T(a){function d(e){var b=e.charCodeAt(0);if(92!==b)return b;var a=e.charAt(1);return(b=w[a])?b:\"0\"<=a&&\"7\">=a?parseInt(e.substring(1),8):\"u\"===a||\"x\"===a?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?\"\\\\x0\":\"\\\\x\")+e.toString(16);e=String.fromCharCode(e);return\"\\\\\"===e||\"-\"===e||\"]\"===e||\"^\"===e?\"\\\\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]/g);e=\n[];var a=\"^\"===b[0],c=[\"[\"];a&&c.push(\"^\");for(var a=a?1:0,g=b.length;a<g;++a){var h=b[a];if(/\\\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),k;a+2<g&&\"-\"===b[a+1]?(k=d(b[a+2]),a+=2):k=h;e.push([h,k]);65>k||122<h||(65>k||90<h||e.push([Math.max(65,h)|32,Math.min(k,90)|32]),97>k||122<h||e.push([Math.max(97,h)&-33,Math.min(k,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];g=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=g[1]+1?g[1]=Math.max(g[1],h[1]):b.push(g=h);for(a=0;a<b.length;++a)h=b[a],\nc.push(f(h[0])),h[1]>h[0]&&(h[1]+1>h[0]&&c.push(\"-\"),c.push(f(h[1])));c.push(\"]\");return c.join(\"\")}function v(e){for(var a=e.source.match(/(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)/g),c=a.length,d=[],g=0,h=0;g<c;++g){var k=a[g];\"(\"===k?++h:\"\\\\\"===k.charAt(0)&&(k=+k.substring(1))&&(k<=h?d[k]=-1:a[g]=f(k))}for(g=1;g<d.length;++g)-1===d[g]&&(d[g]=++A);for(h=g=0;g<c;++g)k=a[g],\"(\"===k?(++h,d[h]||(a[g]=\"(?:\")):\"\\\\\"===\nk.charAt(0)&&(k=+k.substring(1))&&k<=h&&(a[g]=\"\\\\\"+d[k]);for(g=0;g<c;++g)\"^\"===a[g]&&\"^\"!==a[g+1]&&(a[g]=\"\");if(e.ignoreCase&&n)for(g=0;g<c;++g)k=a[g],e=k.charAt(0),2<=k.length&&\"[\"===e?a[g]=b(k):\"\\\\\"!==e&&(a[g]=k.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return a.join(\"\")}for(var A=0,n=!1,l=!1,m=0,c=a.length;m<c;++m){var p=a[m];if(p.ignoreCase)l=!0;else if(/[a-z]/i.test(p.source.replace(/\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi,\"\"))){n=!0;\nl=!1;break}}for(var w={b:8,t:9,n:10,v:11,f:12,r:13},r=[],m=0,c=a.length;m<c;++m){p=a[m];if(p.global||p.multiline)throw Error(\"\"+p);r.push(\"(?:\"+v(p)+\")\")}return new RegExp(r.join(\"|\"),l?\"gi\":\"g\")}function U(a,d){function f(a){var c=a.nodeType;if(1==c){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)f(c);c=a.nodeName.toLowerCase();if(\"br\"===c||\"li\"===c)v[l]=\"\\n\",n[l<<1]=A++,n[l++<<1|1]=a}}else if(3==c||4==c)c=a.nodeValue,c.length&&(c=d?c.replace(/\\r\\n?/g,\"\\n\"):c.replace(/[ \\t\\r\\n]+/g,\n\" \"),v[l]=c,n[l<<1]=A,A+=c.length,n[l++<<1|1]=a)}var b=/(?:^|\\s)nocode(?:\\s|$)/,v=[],A=0,n=[],l=0;f(a);return{a:v.join(\"\").replace(/\\n$/,\"\"),c:n}}function J(a,d,f,b,v){f&&(a={h:a,l:1,j:null,m:null,a:f,c:null,i:d,g:null},b(a),v.push.apply(v,a.g))}function V(a){for(var d=void 0,f=a.firstChild;f;f=f.nextSibling)var b=f.nodeType,d=1===b?d?a:f:3===b?W.test(f.nodeValue)?a:d:d;return d===a?void 0:d}function G(a,d){function f(a){for(var l=a.i,m=a.h,c=[l,\"pln\"],p=0,w=a.a.match(v)||[],r={},e=0,t=w.length;e<\nt;++e){var z=w[e],q=r[z],g=void 0,h;if(\"string\"===typeof q)h=!1;else{var k=b[z.charAt(0)];if(k)g=z.match(k[1]),q=k[0];else{for(h=0;h<A;++h)if(k=d[h],g=z.match(k[1])){q=k[0];break}g||(q=\"pln\")}!(h=5<=q.length&&\"lang-\"===q.substring(0,5))||g&&\"string\"===typeof g[1]||(h=!1,q=\"src\");h||(r[z]=q)}k=p;p+=z.length;if(h){h=g[1];var B=z.indexOf(h),D=B+h.length;g[2]&&(D=z.length-g[2].length,B=D-h.length);q=q.substring(5);J(m,l+k,z.substring(0,B),f,c);J(m,l+k+B,h,K(q,h),c);J(m,l+k+D,z.substring(D),f,c)}else c.push(l+\nk,q)}a.g=c}var b={},v;(function(){for(var f=a.concat(d),l=[],m={},c=0,p=f.length;c<p;++c){var w=f[c],r=w[3];if(r)for(var e=r.length;0<=--e;)b[r.charAt(e)]=w;w=w[1];r=\"\"+w;m.hasOwnProperty(r)||(l.push(w),m[r]=null)}l.push(/[\\0-\\uffff]/);v=T(l)})();var A=d.length;return f}function y(a){var d=[],f=[];a.tripleQuotedStrings?d.push([\"str\",/^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\nnull,\"'\\\"\"]):a.multiLineStrings?d.push([\"str\",/^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,null,\"'\\\"`\"]):d.push([\"str\",/^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,null,\"\\\"'\"]);a.verbatimStrings&&f.push([\"str\",/^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/,null]);var b=a.hashComments;b&&(a.cStyleComments?(1<b?d.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,\"#\"]):d.push([\"com\",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,\nnull,\"#\"]),f.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,null])):d.push([\"com\",/^#[^\\r\\n]*/,null,\"#\"]));a.cStyleComments&&(f.push([\"com\",/^\\/\\/[^\\r\\n]*/,null]),f.push([\"com\",/^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,null]));if(b=a.regexLiterals){var v=(b=1<b?\"\":\"\\n\\r\")?\".\":\"[\\\\S\\\\s]\";f.push([\"lang-regex\",RegExp(\"^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*(\"+\n(\"/(?=[^/*\"+b+\"])(?:[^/\\\\x5B\\\\x5C\"+b+\"]|\\\\x5C\"+v+\"|\\\\x5B(?:[^\\\\x5C\\\\x5D\"+b+\"]|\\\\x5C\"+v+\")*(?:\\\\x5D|$))+/\")+\")\")])}(b=a.types)&&f.push([\"typ\",b]);b=(\"\"+a.keywords).replace(/^ | $/g,\"\");b.length&&f.push([\"kwd\",new RegExp(\"^(?:\"+b.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),null]);d.push([\"pln\",/^\\s+/,null,\" \\r\\n\\t\\u00a0\"]);b=\"^.[^\\\\s\\\\w.$@'\\\"`/\\\\\\\\]*\";a.regexLiterals&&(b+=\"(?!s*/)\");f.push([\"lit\",/^@[a-z_$][a-z_$@0-9]*/i,null],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/,null],[\"pln\",/^[a-z_$][a-z_$@0-9]*/i,\nnull],[\"lit\",/^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*/i,null,\"0123456789\"],[\"pln\",/^\\\\[\\s\\S]?/,null],[\"pun\",new RegExp(b),null]);return G(d,f)}function L(a,d,f){function b(a){var c=a.nodeType;if(1==c&&!A.test(a.className))if(\"br\"===a.nodeName)v(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((3==c||4==c)&&f){var d=a.nodeValue,q=d.match(n);q&&(c=d.substring(0,q.index),a.nodeValue=c,(d=d.substring(q.index+q[0].length))&&\na.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),v(a),c||a.parentNode.removeChild(a))}}function v(a){function b(a,c){var d=c?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=b(k,1),e=a.nextSibling;k.appendChild(d);for(var f=e;f;f=e)e=f.nextSibling,k.appendChild(f)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=b(a.nextSibling,0);for(var d;(d=a.parentNode)&&1===d.nodeType;)a=d;c.push(a)}for(var A=/(?:^|\\s)nocode(?:\\s|$)/,n=/\\r\\n?|\\n/,l=a.ownerDocument,m=l.createElement(\"li\");a.firstChild;)m.appendChild(a.firstChild);\nfor(var c=[m],p=0;p<c.length;++p)b(c[p]);d===(d|0)&&c[0].setAttribute(\"value\",d);var w=l.createElement(\"ol\");w.className=\"linenums\";d=Math.max(0,d-1|0)||0;for(var p=0,r=c.length;p<r;++p)m=c[p],m.className=\"L\"+(p+d)%10,m.firstChild||m.appendChild(l.createTextNode(\"\\u00a0\")),w.appendChild(m);a.appendChild(w)}function t(a,d){for(var f=d.length;0<=--f;){var b=d[f];I.hasOwnProperty(b)?E.console&&console.warn(\"cannot override language handler %s\",b):I[b]=a}}function K(a,d){a&&I.hasOwnProperty(a)||(a=/^\\s*</.test(d)?\n\"default-markup\":\"default-code\");return I[a]}function M(a){var d=a.j;try{var f=U(a.h,a.l),b=f.a;a.a=b;a.c=f.c;a.i=0;K(d,b)(a);var v=/\\bMSIE\\s(\\d+)/.exec(navigator.userAgent),v=v&&8>=+v[1],d=/\\n/g,A=a.a,n=A.length,f=0,l=a.c,m=l.length,b=0,c=a.g,p=c.length,w=0;c[p]=n;var r,e;for(e=r=0;e<p;)c[e]!==c[e+2]?(c[r++]=c[e++],c[r++]=c[e++]):e+=2;p=r;for(e=r=0;e<p;){for(var t=c[e],z=c[e+1],q=e+2;q+2<=p&&c[q+1]===z;)q+=2;c[r++]=t;c[r++]=z;e=q}c.length=r;var g=a.h;a=\"\";g&&(a=g.style.display,g.style.display=\"none\");\ntry{for(;b<m;){var h=l[b+2]||n,k=c[w+2]||n,q=Math.min(h,k),B=l[b+1],D;if(1!==B.nodeType&&(D=A.substring(f,q))){v&&(D=D.replace(d,\"\\r\"));B.nodeValue=D;var N=B.ownerDocument,u=N.createElement(\"span\");u.className=c[w+1];var y=B.parentNode;y.replaceChild(u,B);u.appendChild(B);f<h&&(l[b+1]=B=N.createTextNode(A.substring(q,h)),y.insertBefore(B,u.nextSibling))}f=q;f>=h&&(b+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(x){E.console&&console.log(x&&x.stack||x)}}var E=window,C=[\"break,continue,do,else,for,if,return,while\"],\nF=[[C,\"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],H=[F,\"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],\nO=[F,\"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient\"],P=[F,\"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield\"],\nF=[F,\"abstract,async,await,constructor,debugger,enum,eval,export,function,get,implements,instanceof,interface,let,null,set,undefined,var,with,yield,Infinity,NaN\"],Q=[C,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],R=[C,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],C=[C,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],\nS=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,W=/\\S/,X=y({keywords:[H,P,O,F,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",Q,R,C],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),I={};t(X,[\"default-code\"]);t(G([],[[\"pln\",/^[^<?]+/],[\"dec\",\n/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\"default-markup htm html mxml xhtml xml xsl\".split(\" \"));t(G([[\"pln\",/^[\\s]+/,null,\" \\t\\r\\n\"],[\"atv\",/^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/,null,\n\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],[\"pun\",/^[=<>\\/]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],[\"lang-css\",/^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-css\",/^style\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-css\",/^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]]),[\"in.tag\"]);t(G([],[[\"atv\",/^[\\s\\S]+/]]),[\"uq.val\"]);t(y({keywords:H,\nhashComments:!0,cStyleComments:!0,types:S}),\"c cc cpp cxx cyc m\".split(\" \"));t(y({keywords:\"null,true,false\"}),[\"json\"]);t(y({keywords:P,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:S}),[\"cs\"]);t(y({keywords:O,cStyleComments:!0}),[\"java\"]);t(y({keywords:C,hashComments:!0,multiLineStrings:!0}),[\"bash\",\"bsh\",\"csh\",\"sh\"]);t(y({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),[\"cv\",\"py\",\"python\"]);t(y({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",\nhashComments:!0,multiLineStrings:!0,regexLiterals:2}),[\"perl\",\"pl\",\"pm\"]);t(y({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\",\"ruby\"]);t(y({keywords:F,cStyleComments:!0,regexLiterals:!0}),[\"javascript\",\"js\",\"ts\",\"typescript\"]);t(y({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes\",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,\nregexLiterals:!0}),[\"coffee\"]);t(G([],[[\"str\",/^[\\s\\S]+/]]),[\"regex\"]);var Y=E.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:y,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",PR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\",prettyPrintOne:E.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var b=document.createElement(\"div\");b.innerHTML=\"<pre>\"+a+\"</pre>\";\nb=b.firstChild;f&&L(b,f,!0);M({j:d,m:f,h:b,l:1,a:null,i:null,c:null,g:null});return b.innerHTML},prettyPrint:E.prettyPrint=function(a,d){function f(){for(var b=E.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p<t.length&&c.now()<b;p++){for(var d=t[p],l=g,m=d;m=m.previousSibling;){var n=m.nodeType,u=(7===n||8===n)&&m.nodeValue;if(u?!/^\\??prettify\\b/.test(u):3!==n||/\\S/.test(m.nodeValue))break;if(u){l={};u.replace(/\\b(\\w+)=([\\w:.%+-]+)/g,function(a,b,c){l[b]=c});break}}m=d.className;if((l!==g||r.test(m))&&\n!e.test(m)){n=!1;for(u=d.parentNode;u;u=u.parentNode)if(q.test(u.tagName)&&u.className&&r.test(u.className)){n=!0;break}if(!n){d.className+=\" prettyprinted\";n=l.lang;if(!n){var n=m.match(w),C;!n&&(C=V(d))&&z.test(C.tagName)&&(n=C.className.match(w));n&&(n=n[1])}if(y.test(d.tagName))u=1;else var u=d.currentStyle,x=v.defaultView,u=(u=u?u.whiteSpace:x&&x.getComputedStyle?x.getComputedStyle(d,null).getPropertyValue(\"white-space\"):0)&&\"pre\"===u.substring(0,3);x=l.linenums;(x=\"true\"===x||+x)||(x=(x=m.match(/\\blinenums\\b(?::(\\d+))?/))?\nx[1]&&x[1].length?+x[1]:!0:!1);x&&L(d,x,u);M({j:n,h:d,m:x,l:u,a:null,i:null,c:null,g:null})}}}p<t.length?E.setTimeout(f,250):\"function\"===typeof a&&a()}for(var b=d||document.body,v=b.ownerDocument||document,b=[b.getElementsByTagName(\"pre\"),b.getElementsByTagName(\"code\"),b.getElementsByTagName(\"xmp\")],t=[],n=0;n<b.length;++n)for(var l=0,m=b[n].length;l<m;++l)t.push(b[n][l]);var b=null,c=Date;c.now||(c={now:function(){return+new Date}});var p=0,w=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/,r=/\\bprettyprint\\b/,\ne=/\\bprettyprinted\\b/,y=/pre|xmp/i,z=/^code$/i,q=/^(?:pre|code|xmp)$/i,g={};f()}},H=E.define;\"function\"===typeof H&&H.amd&&H(\"google-code-prettify\",[],function(){return Y})})();}()\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/pretty-print.js",
    "content": "(function(){\n  prettyPrint();\n  var lines = document.querySelectorAll('.prettyprint.linenums li[class^=\"L\"]');\n  for (var i = 0; i < lines.length; i++) {\n    lines[i].id = 'lineNumber' + (i + 1);\n  }\n\n  var matched = location.hash.match(/errorLines=([\\d,]+)/);\n  if (matched) {\n    var lines = matched[1].split(',');\n    for (var i = 0; i < lines.length; i++) {\n      var id = '#lineNumber' + lines[i];\n      var el = document.querySelector(id);\n      el.classList.add('error-line');\n    }\n    return;\n  }\n\n  if (location.hash) {\n    // ``[ ] . ' \" @`` are not valid in DOM id. so must escape these.\n    var id = location.hash.replace(/([\\[\\].'\"@$])/g, '\\\\$1');\n    var line = document.querySelector(id);\n    if (line) line.classList.add('active');\n  }\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/search.js",
    "content": "(function(){\n  var searchIndex = window.esdocSearchIndex;\n  var searchBox = document.querySelector('.search-box');\n  var input = document.querySelector('.search-input');\n  var result = document.querySelector('.search-result');\n  var selectedIndex = -1;\n  var prevText;\n\n  // active search box and focus when mouse enter on search box.\n  searchBox.addEventListener('mouseenter', function(){\n    searchBox.classList.add('active');\n    input.focus();\n  });\n\n  // search with text when key is upped.\n  input.addEventListener('keyup', function(ev){\n    var text = ev.target.value.toLowerCase();\n    if (!text) {\n      result.style.display = 'none';\n      result.innerHTML = '';\n      return;\n    }\n\n    if (text === prevText) return;\n    prevText = text;\n\n    var html = {class: [], method: [], member: [], function: [], variable: [], typedef: [], external: [], file: [], test: [], testFile: []};\n    var len = searchIndex.length;\n    var kind;\n    for (var i = 0; i < len; i++) {\n      var pair = searchIndex[i];\n      if (pair[0].indexOf(text) !== -1) {\n        kind = pair[3];\n        html[kind].push('<li><a href=\"' + pair[1] + '\">' + pair[2] + '</a></li>');\n      }\n    }\n\n    var innerHTML = '';\n    for (kind in html) {\n      var list = html[kind];\n      if (!list.length) continue;\n      innerHTML += '<li class=\"search-separator\">' + kind + '</li>\\n' + list.join('\\n');\n    }\n    result.innerHTML = innerHTML;\n    if (innerHTML) result.style.display = 'block';\n    selectedIndex = -1;\n  });\n\n  // down, up and enter key are pressed, select search result.\n  input.addEventListener('keydown', function(ev){\n    if (ev.keyCode === 40) {\n      // arrow down\n      var current = result.children[selectedIndex];\n      var selected = result.children[selectedIndex + 1];\n      if (selected && selected.classList.contains('search-separator')) {\n        var selected = result.children[selectedIndex + 2];\n        selectedIndex++;\n      }\n\n      if (selected) {\n        if (current) current.classList.remove('selected');\n        selectedIndex++;\n        selected.classList.add('selected');\n      }\n    } else if (ev.keyCode === 38) {\n      // arrow up\n      var current = result.children[selectedIndex];\n      var selected = result.children[selectedIndex - 1];\n      if (selected && selected.classList.contains('search-separator')) {\n        var selected = result.children[selectedIndex - 2];\n        selectedIndex--;\n      }\n\n      if (selected) {\n        if (current) current.classList.remove('selected');\n        selectedIndex--;\n        selected.classList.add('selected');\n      }\n    } else if (ev.keyCode === 13) {\n      // enter\n      var current = result.children[selectedIndex];\n      if (current) {\n        var link = current.querySelector('a');\n        if (link) location.href = link.href;\n      }\n    } else {\n      return;\n    }\n\n    ev.preventDefault();\n  });\n\n  // select search result when search result is mouse over.\n  result.addEventListener('mousemove', function(ev){\n    var current = result.children[selectedIndex];\n    if (current) current.classList.remove('selected');\n\n    var li = ev.target;\n    while (li) {\n      if (li.nodeName === 'LI') break;\n      li = li.parentElement;\n    }\n\n    if (li) {\n      selectedIndex = Array.prototype.indexOf.call(result.children, li);\n      li.classList.add('selected');\n    }\n  });\n\n  // clear search result when body is clicked.\n  document.body.addEventListener('click', function(ev){\n    selectedIndex = -1;\n    result.style.display = 'none';\n    result.innerHTML = '';\n  });\n\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/script/test-summary.js",
    "content": "(function(){\n  function toggle(ev) {\n    var button = ev.target;\n    var parent = ev.target.parentElement;\n    while(parent) {\n      if (parent.tagName === 'TR' && parent.classList.contains('test-interface')) break;\n      parent = parent.parentElement;\n    }\n\n    if (!parent) return;\n\n    var direction;\n    if (button.classList.contains('opened')) {\n      button.classList.remove('opened');\n      button.classList.add('closed');\n      direction = 'closed';\n    } else {\n      button.classList.remove('closed');\n      button.classList.add('opened');\n      direction = 'opened';\n    }\n\n    var targetDepth = parseInt(parent.dataset.testDepth, 10) + 1;\n    var nextElement = parent.nextElementSibling;\n    while (nextElement) {\n      var depth = parseInt(nextElement.dataset.testDepth, 10);\n      if (depth >= targetDepth) {\n        if (direction === 'opened') {\n          if (depth === targetDepth)  nextElement.style.display = '';\n        } else if (direction === 'closed') {\n          nextElement.style.display = 'none';\n          var innerButton = nextElement.querySelector('.toggle');\n          if (innerButton && innerButton.classList.contains('opened')) {\n            innerButton.classList.remove('opened');\n            innerButton.classList.add('closed');\n          }\n        }\n      } else {\n        break;\n      }\n      nextElement = nextElement.nextElementSibling;\n    }\n  }\n\n  var buttons = document.querySelectorAll('.test-summary tr.test-interface .toggle');\n  for (var i = 0; i < buttons.length; i++) {\n    buttons[i].addEventListener('click', toggle);\n  }\n\n  var topDescribes = document.querySelectorAll('.test-summary tr[data-test-depth=\"0\"]');\n  for (var i = 0; i < topDescribes.length; i++) {\n    topDescribes[i].style.display = '';\n  }\n})();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/single.html",
    "content": "<h1 data-ice=\"title\"></h1>\n<div data-ice=\"summaries\"></div>\n<div data-ice=\"details\"></div>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/source.html",
    "content": "<h1>Source <img data-ice=\"coverageBadge\" src=\"./badge.svg\"><span data-ice=\"totalCoverageCount\" class=\"total-coverage-count\"></span></h1>\n\n<table class=\"files-summary\" data-ice=\"files\">\n  <thead>\n    <tr>\n      <td>File</td>\n      <td>Identifier</td>\n      <td class=\"coverage\">Document</td>\n      <td style=\"display: none;\">Size</td>\n      <td style=\"display: none;\">Lines</td>\n      <td style=\"display: none;\">Updated</td>\n    </tr>\n  </thead>\n  <tbody>\n    <tr data-ice=\"file\">\n      <td data-ice=\"filePath\"></td>\n      <td data-ice=\"identifier\" class=\"identifiers\"></td>\n      <td class=\"coverage\"><span data-ice=\"coverage\"></span><span data-ice=\"coverageCount\" class=\"coverage-count\"></span></td>\n      <td style=\"display: none;\" data-ice=\"size\"></td>\n      <td style=\"display: none;\" data-ice=\"lines\"></td>\n      <td style=\"display: none;\" data-ice=\"updated\"></td>\n    </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/summary.html",
    "content": "<table class=\"summary\" data-ice=\"summary\">\n  <thead><tr><td data-ice=\"title\" colspan=\"3\"></td></tr></thead>\n  <tbody>\n  <tr data-ice=\"target\">\n    <td>\n      <span class=\"access\" data-ice=\"access\"></span>\n      <span data-ice=\"static\"></span>\n      <span class=\"kind\" data-ice=\"kind\"></span>\n      <span class=\"abstract\" data-ice=\"abstract\"></span>\n      <span class=\"override\" data-ice=\"override\"></span>\n    </td>\n    <td>\n      <div>\n        <p>\n          <span data-ice=\"kind-icon\"></span>\n          <span data-ice=\"async\"></span>\n          <span data-ice=\"generator\"></span>\n          <span class=\"code\" data-ice=\"name\"></span><span class=\"code\" data-ice=\"signature\"></span>\n        </p>\n      </div>\n      <div>\n        <div class=\"deprecated\" data-ice=\"deprecated\"></div>\n        <div class=\"experimental\" data-ice=\"experimental\"></div>\n        <div data-ice=\"description\"></div>\n      </div>\n    </td>\n    <td>\n      <span class=\"version\" data-ice=\"version\">version </span>\n      <span class=\"since\" data-ice=\"since\">since </span>\n    </td>\n  </tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/test.html",
    "content": "<h1>Test</h1>\n<table class=\"test-summary\">\n  <thead>\n    <tr>\n      <td class=\"test-description\">Description</td>\n      <td class=\"test-target\">Identifier</td>\n    </tr>\n  </thead>\n\n  <tbody data-ice=\"tests\"></tbody>\n</table>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/template/testInterface.html",
    "content": "<tr class=\"test-interface\" data-ice=\"testInterface\" style=\"display: none;\">\n  <td data-ice=\"testDescription\"><span data-ice=\"testInterfaceToggle\" class=\"toggle closed\"></span></td>\n  <td data-ice=\"testTarget\" class=\"test-target\"></td>\n</tr>\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Builder/util.js",
    "content": "import marked from 'marked';\nimport escape from 'escape-html';\n\n/**\n * shorten description.\n * e.g. ``this is JavaScript. this is Java.`` => ``this is JavaScript.``.\n *\n * @param {DocObject} doc - target doc object.\n * @param {boolean} [asMarkdown=false] - is true, test as markdown and convert to html.\n * @returns {string} shorten description.\n * @todo shorten before process markdown.\n */\nexport function shorten(doc, asMarkdown = false) {\n  if (!doc) return '';\n\n  if (doc.summary) return doc.summary;\n\n  const desc = doc.descriptionRaw;\n  if (!desc) return '';\n\n  let len = desc.length;\n  let inSQuote = false;\n  let inWQuote = false;\n  let inCode = false;\n  for (let i = 0; i < desc.length; i++) {\n    const char1 = desc.charAt(i);\n    const char2 = desc.charAt(i + 1);\n    const char4 = desc.substr(i, 6);\n    const char5 = desc.substr(i, 7);\n    if (char1 === '\\'') inSQuote = !inSQuote;\n    else if (char1 === '\"') inWQuote = !inWQuote;\n    else if (char4 === '<code>') inCode = true;\n    else if (char5 === '</code>') inCode = false;\n\n    if (inSQuote || inCode || inWQuote) continue;\n\n    if (char1 === '.') {\n      if (char2 === ' ' || char2 === '\\n' || char2 === '<') {\n        len = i + 1;\n        break;\n      }\n    } else if (char1 === '\\n' && char2 === '\\n') {\n      len = i + 1;\n      break;\n    }\n  }\n\n  let result = desc.substr(0, len);\n  if (asMarkdown) {\n    result = markdown(result);\n  }\n\n  return result;\n}\n\n/**\n * convert markdown text to html.\n * @param {string} text - markdown text.\n * @param {boolean} [breaks=false] if true, break line. FYI gfm is not breaks.\n * @return {string} html.\n */\nexport function markdown(text, breaks = false) {\n  // original render does not support multi-byte anchor\n  const renderer = new marked.Renderer();\n  renderer.heading = function (text, level) {\n    const id = escapeURLHash(text);\n    return `<h${level} id=${id}>${text}</h${level}>`;\n  };\n\n  const availableTags = ['span', 'a', 'p', 'div', 'img', 'h1', 'h2', 'h3', 'h4', 'h5', 'br', 'hr', 'li', 'ul', 'ol', 'code', 'pre', 'details', 'summary', 'kbd'];\n  const availableAttributes = ['src', 'href', 'title', 'class', 'id', 'name', 'width', 'height', 'target'];\n\n  const compiled = marked(text, {\n    renderer: renderer,\n    gfm: true,\n    tables: true,\n    breaks: breaks,\n    sanitize: true,\n    sanitizer: (tag) =>{\n      if (tag.match(/<!--.*-->/)) {\n        return tag;\n      }\n      const tagName = tag.match(/^<\\/?(\\w+)/)[1];\n      if (!availableTags.includes(tagName)) {\n        return escape(tag);\n      }\n\n      const sanitizedTag = tag.replace(/([\\w\\-]+)=([\"'].*?[\"'])/g, (_, attr, val)=>{\n        if (!availableAttributes.includes(attr)) return '';\n        /* eslint-disable no-script-url */\n        if (val.indexOf('javascript:') !== -1) return '';\n        return `${attr}=${val}`;\n      });\n\n      return sanitizedTag;\n    },\n    highlight: function(code) {\n      // return `<pre class=\"source-code\"><code class=\"prettyprint\">${escape(code)}</code></pre>`;\n      return `<code class=\"source-code prettyprint\">${escape(code)}</code>`;\n    }\n  });\n\n  return compiled;\n}\n\n/**\n * get UTC date string.\n * @param {Date} date - target date object.\n * @returns {string} UTC date string(yyyy-mm-dd hh:mm:ss)\n */\nexport function dateForUTC(date) {\n  function pad(num, len) {\n    const count = Math.max(0, len - `${num}`.length);\n    return '0'.repeat(count) + num;\n  }\n\n  const year = date.getUTCFullYear();\n  const month = pad(date.getUTCMonth() + 1, 2);\n  const day = pad(date.getUTCDay() + 1, 2);\n  const hours = pad(date.getUTCHours(), 2);\n  const minutes = pad(date.getUTCMinutes(), 2);\n  const seconds = pad(date.getUTCSeconds(), 2);\n\n  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds} (UTC)`;\n}\n\n/**\n * parse ``@example`` value.\n * ``@example`` value can have ``<caption>`` tag.\n *\n * @param {string} example - target example value.\n * @returns {{body: string, caption: string}} parsed example value.\n */\nexport function parseExample(example) {\n  let body = example;\n  let caption = '';\n\n  /* eslint-disable no-control-regex */\n  const regexp = new RegExp('^<caption>(.*?)</caption>\\n');\n  const matched = example.match(regexp);\n  if (matched) {\n    body = example.replace(regexp, '');\n    caption = matched[1].trim();\n  }\n\n  return {body, caption};\n}\n\n/**\n * escape URL hash.\n * @param {string} hash - URL hash for HTML a tag and id tag\n * @returns {string} escaped URL hash\n */\nexport function escapeURLHash(hash) {\n  return hash.toLowerCase().replace(/[~!@#$%^&*()_+=\\[\\]\\\\{}|;':\"<>?,.\\/ ]/g, '-');\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/src/Plugin.js",
    "content": "import path from 'path';\nimport {taffy} from 'taffydb';\nimport IceCap from 'ice-cap';\nimport DocBuilder from './Builder/DocBuilder';\nimport StaticFileBuilder from './Builder/StaticFileBuilder.js';\nimport IdentifiersDocBuilder from './Builder/IdentifiersDocBuilder.js';\nimport IndexDocBuilder from './Builder/IndexDocBuilder.js';\nimport ClassDocBuilder from './Builder/ClassDocBuilder.js';\nimport SingleDocBuilder from './Builder/SingleDocBuilder.js';\nimport FileDocBuilder from './Builder/FileDocBuilder.js';\nimport SearchIndexBuilder from './Builder/SearchIndexBuilder.js';\nimport SourceDocBuilder from './Builder/SourceDocBuilder.js';\nimport TestDocBuilder from './Builder/TestDocBuilder.js';\nimport TestFileDocBuilder from './Builder/TestFileDocBuilder.js';\nimport ManualDocBuilder from './Builder/ManualDocBuilder.js';\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n  }\n\n  onPublish(ev) {\n    this._option = ev.data.option || {};\n    this._template = typeof this._option.template === 'string'\n      ? path.resolve(process.cwd(), this._option.template)\n      : path.resolve(__dirname, './Builder/template');\n    this._exec(this._docs, ev.data.writeFile, ev.data.copyDir, ev.data.readFile);\n  }\n\n  _exec(tags, writeFile, copyDir, readFile) {\n    IceCap.debug = !!this._option.debug;\n\n    const data = taffy(tags);\n\n    //bad hack: for other plugin uses builder.\n    DocBuilder.createDefaultBuilder = () => {\n      return new DocBuilder(this._template, data, tags);\n    };\n\n    let coverage = null;\n    try {\n      coverage = JSON.parse(readFile('coverage.json'));\n    } catch (e) {\n      // nothing\n    }\n\n    new IdentifiersDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new IndexDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new ClassDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new SingleDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new FileDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new StaticFileBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new SearchIndexBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    new SourceDocBuilder(this._template, data, tags).exec(writeFile, copyDir, coverage);\n    new ManualDocBuilder(this._template, data, tags).exec(writeFile, copyDir, readFile);\n\n    const existTest = tags.find(tag => tag.kind.indexOf('test') === 0);\n    if (existTest) {\n      new TestDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n      new TestFileDocBuilder(this._template, data, tags).exec(writeFile, copyDir);\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/CHANGELOG.md",
    "content": "# Changelog\n\n## 0.0.1\n- **Fix**\n  - fix a bug\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/README.md",
    "content": "[![Build Status](https://travis-ci.org/esdoc/esdoc.svg?branch=master)](https://travis-ci.org/esdoc/esdoc)\n[![Coverage Status](https://coveralls.io/repos/esdoc/esdoc/badge.svg)](https://coveralls.io/r/esdoc/esdoc)\n\n# ESDoc Test Fixture\nthis is ESDoc Test Fixture README.\n\n- item1\n- item2\n- item3\n\n1st line.\nsecond line.\n\nhttp://github.com/h13i32maru/esdoc\n\n```javascript\nexport default class Foo {\n  static get foo() {}\n  \n  constructor(p1) {\n  }\n}\nvar foo = 123;\n```\n\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Content Cell  | Content Cell  |\n| Content Cell  | Content Cell  |\n\n**text**\n\n~~text~~\n\n# text\n## text\n### text\n#### text\n##### text\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/esdoc.json",
    "content": "{\n  \"source\": \"./test/fixture/src\",\n  \"destination\": \"./test/fixture/out\",\n  \"index\": \"./test/fixture/README.md\",\n  \"package\": \"./test/fixture/package.json\",\n  \"plugins\": [\n    {\"name\": \"esdoc-brand-plugin\", \"option\": {\"logo\": \"./test/fixture/logo.png\", \"image\": \"https://esdoc.org/manual/asset/image/logo.png\"}},\n    {\"name\": \"esdoc-coverage-plugin\"},\n    {\"name\": \"esdoc-ecmascript-proposal-plugin\", \"option\": {\"all\": true}},\n    {\"name\": \"esdoc-external-ecmascript-plugin\", \"option\": {\"enable\": true}},\n    {\"name\": \"esdoc-accessor-plugin\", \"option\": {\"access\": [\"public\", \"protected\", \"private\"], \"autoPrivate\": true}},\n    {\"name\": \"esdoc-type-inference-plugin\", \"option\": {\"enable\": true}},\n    {\"name\": \"esdoc-undocumented-identifier-plugin\"},\n    {\"name\": \"esdoc-unexported-identifier-plugin\"},\n    {\"name\": \"esdoc-integrate-manual-plugin\", \"option\": {\n      \"index\": \"./test/fixture/manual/index.md\",\n      \"files\": [\n        \"./test/fixture/manual/overview.md\",\n        \"./test/fixture/manual/design.md\",\n        \"./test/fixture/manual/installation.md\",\n        \"./test/fixture/manual/tutorial.md\",\n        \"./test/fixture/manual/usage1.md\",\n        \"./test/fixture/manual/usage2.md\",\n        \"./test/fixture/manual/configuration.md\",\n        \"./test/fixture/manual/example.md\",\n        \"./test/fixture/manual/advanced.md\",\n        \"./test/fixture/manual/faq.md\",\n        \"./test/fixture/CHANGELOG.md\"\n      ]\n    }},\n    {\"name\": \"esdoc-integrate-test-plugin\", \"option\": {\n      \"type\": \"mocha\",\n      \"source\": \"./test/fixture/test\",\n      \"includes\": [\"Test.js$\"]\n    }},\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/advanced.md",
    "content": "# Advanced\nfoo\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/configuration.md",
    "content": "# Configuration\nthis is configuration.\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/design.md",
    "content": "# Design\n## Concept\nfoo\n\n## Architecture\nfoo\n\n\n## Model\nfoo\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/example.md",
    "content": "# Example\n\n## Minimum Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\"\n}\n```\n\n## Integration Test Code Into Documentation\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"test\": {\n    \"type\": \"mocha\",\n    \"source\": \"./test\"\n  }\n}\n```\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/faq.md",
    "content": "# FAQ\n\n- [Goal](#goal)\n\n## Goal\nESDoc has two goals.\nThe first goal is reducing the cost to write an documentation, it is able to continuously maintenance.\nThe second goal is without looking the source code of a library, it is to be able to use the library.\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/index.md",
    "content": "# ESDoc Manual\ntbd\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/installation.md",
    "content": "# Installation\n\n```sh\nnpm install -g esdoc\n```\n\n## indent 2\n### indent 3\n#### indent 4\n##### indent 5\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/overview.md",
    "content": "# Overview\n\nESDoc is a documentation generator for JavaScript(ES6).\n\n<img class=\"screen-shot\" src=\"https://esdoc.org/manual/asset/image/top.png\" width=\"500px\" style=\"max-width: 500px; border: 1px solid rgba(0,0,0,0.1); box-shadow: 1px 1px 1px rgba(0,0,0,0.5);\">\n\n## Feature\n- Generates detailed document.\n- Measures document coverage.\n- Integrate test codes into documentation.\n- [ESDoc Hosting Service](https://doc.esdoc.org)\n\n## Demo\n- [ESDoc](https://esdoc.org/esdoc) is self-hosting &#x1F604;\n\n## License\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://twitter.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/tutorial.md",
    "content": "# Tutorial\nthis is tutorial.\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/usage1.md",
    "content": "# Usage\n\n```sh\nesdoc -c esdoc.json\n```\n\n``esdoc.json``\n\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\"\n}\n```\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/manual/usage2.md",
    "content": "# Usage2\nthis is usage2\n\n## h2 in usage2\nthis is h2 in usage2\n\n### h3 in usage2\nthis is h2 in usage3\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/package.json",
    "content": "{\n  \"name\": \"esdoc-test-fixture\",\n  \"version\": \"1.2.3\",\n  \"private\": true,\n  \"description\": \"this is esdoc-publish-html-plugin fixture\",\n  \"author\": {\n    \"name\": \"h13i32maru\",\n    \"url\": \"http://h13i32maru.jp\"\n  },\n  \"homepage\": \"http://esdoc.org\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc\"\n  },\n  \"main\": \"./src/Class/Definition.js\"\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Abstract/Definition.js",
    "content": "/**\n * this is TestAbstractDefinition.\n */\nexport default class TestAbstractDefinition {\n  /**\n   * this is abstract method1.\n   * @abstract\n   */\n  method1(){}\n\n  /**\n   * this is abstract method2.\n   * @abstract\n   */\n  method2(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Abstract/Override.js",
    "content": "import TestAbstractDefinition from './Definition';\n\n/**\n * this is TestAbstractOverride\n */\nexport default class TestAbstractOverride extends TestAbstractDefinition {\n  /**\n   * this is override method1.\n   * @override\n   */\n  method1(){}\n\n  /**\n   * this is override method2 with automatically detection.\n   */\n  method2(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Access/Class.js",
    "content": "/**\n * this is TestAccessClassPublic.\n * @public\n */\nexport default class TestAccessClassPublic {}\n\n/**\n * this is TestAccessClassProtected.\n * @protected\n */\nexport class TestAccessClassProtected {}\n\n/**\n * this is TestAccessClassPrivate.\n * @private\n */\nexport class TestAccessClassPrivate {}\n\n/**\n * this is TestAccessClassAutoPrivate.\n */\nexport class _TestAccessClassAutoPrivate {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Access/Function.js",
    "content": "/**\n * this is testAccessFunctionPublic.\n * @public\n */\nexport default function testAccessFunctionPublic(){}\n\n/**\n * this is testAccessFunctionProtected.\n * @protected\n */\nexport function testAccessFunctionProtected(){}\n\n/**\n * this is testAccessFunctionPrivate.\n * @private\n */\nexport function testAccessFunctionPrivate(){}\n\n/**\n * this is testAccessFunctionAutoPrivate.\n */\nexport function _testAccessFunctionAutoPrivate(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Access/Method.js",
    "content": "/**\n * this is TestAccessMethod.\n */\nexport default class TestAccessMethod {\n  /**\n   * this is method1.\n   * @public\n   */\n  method1(){}\n\n  /**\n   * this is method2.\n   * @protected\n   */\n  method2(){}\n\n  /**\n   * this is method3.\n   * @private\n   */\n  method3(){}\n\n  /**\n   * this is _method4.\n   */\n  _method4(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Access/Property.js",
    "content": "/**\n * this is TestAccessProperty.\n */\nexport default class TestAccessProperty {\n  constructor() {\n    /**\n     * this is p1.\n     * @public\n     * @type {number}\n     */\n    this.p1 = 123;\n\n    /**\n     * this is p2.\n     * @protected\n     * @type {number}\n     */\n    this.p2 = 123;\n\n    /**\n     * this is p3.\n     * @private\n     * @type {number}\n     */\n    this.p3 = 123;\n\n    /**\n     * this is _p4.\n     * @type {number}\n     */\n    this._p4 = 123;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Access/Variable.js",
    "content": "/**\n * this is testAccessVariablePublic.\n * @type {number}\n * @public\n */\nexport const testAccessVariablePublic = 123;\n\n/**\n * this is testAccessVariableProtected.\n * @type {number}\n * @protected\n */\nexport const testAccessVariableProtected = 123;\n\n/**\n * this is testAccessVariablePrivate.\n * @type {number}\n * @private\n */\nexport const testAccessVariablePrivate = 123;\n\n/**\n * this is _testAccessVariableAutoPrivate.\n * @type {number}\n */\nexport const _testAccessVariableAutoPrivate = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Async/Function.js",
    "content": "/**\n * this is testAsyncFunction.\n */\nexport default async function testAsyncFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Async/Method.js",
    "content": "/**\n * this is TestAsyncMethod.\n */\nexport default class TestAsyncMethod {\n  /**\n   * this is async method1.\n   */\n  async method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Class/Definition.js",
    "content": "/**\n * this is TestClassDefinition.\n */\nexport default class TestClassDefinition {\n  /**\n   * this is static method1.\n   */\n  static method1(){\n    /**\n     * this is static p1.\n     * @type {number}\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is get value1.\n   * @type {number}\n   */\n  get value1(){}\n\n  /**\n   * this is set value2.\n   * @type {number}\n   */\n  set value2(v){}\n\n  /**\n   * this is constructor.\n   */\n  constructor(){\n    /**\n     * this is p1.\n     * @type {number}\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/ClassProperty/Definition.js",
    "content": "/**\n * this is TestClassPropertyDefinition.\n * @todo test `Access`, `Deprecated`, `Desc`, `Duplication`, `Example`, `Experimental`, `Guess`, `Ignore`, `Link`, `See`, `Since`, `Todo` and `Version`.\n */\nexport default class TestClassPropertyDefinition {\n  /**\n   * this is static p1.\n   * @type {number}\n   */\n  static p1 = 123;\n\n  /**\n   * this is p1.\n   * @type {number}\n   */\n  p1 = 123;\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Computed/Method.js",
    "content": "/**\n * this is TestComputedMethod\n */\nexport default class TestComputedMethod {\n  /**\n   * this is foo.\n   */\n  ['foo'](){}\n\n  /**\n   * this is iterator.\n   */\n  [Symbol.iterator]() { }\n\n  /**\n   * this is [foo].\n   */\n  [foo](){}\n\n  /**\n   * this is [foo.bar.baz].\n   */\n  [foo.bar.baz](){}\n\n  /**\n   * this is [foo + bar].\n   */\n  [foo + bar](){}\n\n  /**\n   * this is [foo.p + bar].\n   */\n  [foo.p + bar](){}\n\n  /**\n   * this is [foo()].\n   */\n  [foo()](){}\n\n  /**\n   * this is [foo.bar()].\n   */\n  [foo.bar()](){}\n\n  /**\n   * this is [`${foo}`].\n   */\n  [`${foo}`](){}\n\n  /**\n   * this is *[foo.bar]\n   */\n  *[foo.bar](){}\n}\n\n/**\n * @ignore\n */\nconst foo = '';\n\n/**\n * @ignore\n */\nconst bar = '';\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Computed/Property.js",
    "content": "/**\n * this is TestComputedProperty\n */\nexport default class TestComputedProperty {\n  /**\n   * this is constructor.\n   */\n  constructor(){\n    /**\n     * this is foo.\n     * @type {number}\n     */\n    this['foo'] = 123;\n\n    /**\n     * this is iterator.\n     * @type {number}\n     */\n    this[Symbol.iterator] = 123;\n\n    /**\n     * this is [foo].\n     * @type {number}\n     */\n    this[foo] = 123;\n\n    /**\n     * this is [foo.bar].\n     * @type {number}\n     */\n    this[foo.bar] = 123;\n\n    /**\n     * this is [foo.bar.baz].\n     * @type {number}\n     */\n    this[foo.bar.baz] = 123;\n\n    /**\n     * this is [foo + bar].\n     * @type {number}\n     */\n    this[foo + bar] = 123;\n\n    /**\n     * this is [foo.p + bar].\n     * @type {number}\n     */\n    this[foo.p + bar] = 123;\n\n    /**\n     * this is [foo()].\n     * @type {number}\n     */\n    this[foo()] = 123;\n\n    /**\n     * this is [foo.bar()].\n     * @type {number}\n     */\n    this[foo.bar()] = 123;\n\n    /**\n     * this is [`${foo}`].\n     * @type {number}\n     */\n    this[`${foo}`] = 123;\n  }\n}\n\n/**\n * @ignore\n */\nconst foo = '';\n\n/**\n * @ignore\n */\nconst bar = '';\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Decorator/Definition.js",
    "content": "/**\n * this is TestDecoratorDefinition.\n */\n@testDecoratorAnnotation1\nexport default class TestDecoratorDefinition {\n  /**\n   * this is static method1.\n   */\n  @testDecoratorAnnotation1\n  static method1(){}\n\n  /**\n   * this is get value1.\n   * @type {number}\n   */\n  @testDecoratorAnnotation1\n  get value1(){}\n\n  /**\n   * this is set value2.\n   * @type {number}\n   */\n  @testDecoratorAnnotation1\n  set value2(v){}\n\n  /**\n   * this is method1.\n   */\n  @testDecoratorAnnotation1\n  @testDecoratorAnnotation2(true)\n  method1(){}\n}\n\n/**\n * this is testDecoratorAnnotation1.\n */\nexport function testDecoratorAnnotation1(){}\n\n/**\n * this is testDecoratorAnnotation2.\n */\nexport function testDecoratorAnnotation2(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Deprecated/Class.js",
    "content": "/**\n * this is TestDeprecatedClass.\n * @deprecated this is deprecated.\n */\nexport default class TestDeprecatedClass {\n  constructor() {\n    /**\n     * this is p1.\n     * @type {number}\n     * @deprecated\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @deprecated\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Deprecated/Function.js",
    "content": "/**\n * this is testDeprecatedFunction.\n * @deprecated\n */\nexport default function testDeprecatedFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Deprecated/Variable.js",
    "content": "/**\n * this is testDeprecatedVariable.\n * @deprecated\n */\nexport const testDeprecatedVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Desc/Class.js",
    "content": "/**\n * @desc this is TestDescClass.\n */\nexport default class TestDescClass {\n  /**\n   * @desc this is constructor.\n   */\n  constructor() {\n    /**\n     * @desc this is p1.\n     * @type {number}\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * @desc this is method1.\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Desc/Function.js",
    "content": "/**\n * @desc this is testDescFunction.\n */\nexport default function testDescFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Desc/Markdown.js",
    "content": "/**\n * this is TestDescMarkdown.\n *\n * ```html\n * <div>text</div>\n * <ul>\n *   <li>item1</li>\n *   <li>item2</li>\n *   <li>item3</li>\n * </ul>\n * ```\n *\n * # Inner Link\n * - item1\n * - item2\n * - item3\n *\n * [inner link](#inner-link)\n *\n * ```js\n * let foo = 'this is code block'\n * ```\n *\n * | Left align | Right align | Center align |\n * |:-----------|------------:|:------------:|\n * | This       |        This |     This     |\n * | column     |      column |    column    |\n */\nexport default class TestDescMarkdown {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Desc/MultiLine.js",
    "content": "/**\n * this is TestDescMultiLine.\n */\nexport default class TestDescMultiLine {\n  /**\n   * this is method1.\n   * this is second line.\n   */\n  method1(){}\n\n  /**\n   * this is method2. this is second sentence.\n   */\n  method2(){}\n\n  /**\n   * this is\n   * method3. this is second sentence.\n   */\n  method3(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Desc/Variable.js",
    "content": "/**\n * @desc this is testDescVariable.\n * @type {number}\n */\nexport const testDescVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Destructuring/Array.js",
    "content": "/**\n * this is TestDestructuringArray.\n */\nexport default class TestDestructuringArray {\n  /**\n   * this is method1.\n   * @param {number[]} p - this is p.\n   * @param {number} p[0] - this is first of p.\n   * @param {number} p[1] - this is second of p.\n   */\n  method1([p1, p2]){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Destructuring/Object.js",
    "content": "/**\n * this is TestDestructuringObject.\n */\nexport default class TestDestructuringObject {\n  /**\n   * this is method1.\n   * @param {Object} p - this is object p.\n   * @param {number} p.p1 - this is property p1 of p.\n   * @param {string} p.p2 - this is property p2 of p.\n   */\n  method1({p1, p2}){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Duplication/Definition.js",
    "content": "/**\n * this is TestDuplicationDefinition.\n */\nexport default class TestDuplicationDefinition {\n  /**\n   * this is constructor.\n   */\n  constructor() {\n    this.value = 10;\n\n    this.onClick = this.onClick.bind(this);\n  }\n\n  /**\n   * this is set value.\n   * @type {number}\n   */\n  set value(v){}\n\n  /**\n   * this is get value.\n   * @type {number}\n   */\n  get value(){}\n\n  /**\n   * this is onClick.\n   * @param {number} p - this is p.\n   */\n  onClick(p){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Emits/Function.js",
    "content": "/**\n * this is testEmitsFunction.\n * @emits {TestEmitsFunctionEvent}\n */\nexport default function testEmitsFunction(){}\n\nexport class TestEmitsFunctionEvent {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Emits/Method.js",
    "content": "/**\n * this is TestEmitsMethod.\n */\nexport default class TestEmitsMethod {\n  /**\n   * this is method1.\n   * @emits {TestEmitsMethodEvent1} emits event when foo.\n   * @emits {TestEmitsMethodEvent2} emits event when bar.\n   */\n  method1(){}\n}\n\nexport class TestEmitsMethodEvent1 {}\n\nexport class TestEmitsMethodEvent2 {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Example/Caption.js",
    "content": "/**\n * this is TestExampleCaption.\n * @example <caption>this is caption</caption>\n * const foo = 123;\n * console.log(foo);\n */\nexport default class TestExampleCaption {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Example/Class.js",
    "content": "/**\n * this is TestExampleClass.\n * @example\n * const foo = 123;\n * console.log(foo);\n *\n * @example\n * const bar = 123;\n * console.log(bar);\n */\nexport default class TestExampleClass {\n  /**\n   * this is constructor.\n   * @example\n   * const foo = 123;\n   */\n  constructor() {\n    /**\n     * this is p1.\n     * @type {number}\n     * @example\n     * const foo = 123;\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @example\n   * const foo = 123;\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Example/Function.js",
    "content": "/**\n * this is testExampleFunction.\n * @example\n * const foo = 123;\n */\nexport default function testExampleFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Example/Variable.js",
    "content": "/**\n * this is testExampleVariable.\n * @type {number}\n * @example\n * const foo = 123;\n */\nexport const testExampleVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Experimental/Class.js",
    "content": "/**\n * this is TestExperimentalClass.\n * @experimental this is experimental\n */\nexport default class TestExperimentalClass {\n  /**\n   * this is constructor.\n   */\n  constructor(){\n    /**\n     * this is p1.\n     * @type {number}\n     * @experimental\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @experimental\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Experimental/Function.js",
    "content": "/**\n * this is testExperimentalFunction.\n * @experimental\n */\nexport default function testExperimentalFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Experimental/Variable.js",
    "content": "/**\n * this is testExperimentalVariable.\n * @type {number}\n * @experimental\n */\nexport const testExperimentalVariable =123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/ExponentiationOperator/Definition.js",
    "content": "/**\n * this is TestExponentiationOperatorDefinition.\n */\nexport default class TestExponentiationOperatorDefinition {\n  /**\n   * this is method1.\n   * @return {number}\n   */\n  method1(){\n    return 2 ** 3 ;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/AnonymousClass.js",
    "content": "/**\n * this is anonymous class.\n */\nexport default class {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/AnonymousFunction.js",
    "content": "/**\n * this is anonymous function.\n */\nexport default function(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/ArrowFunction.js",
    "content": "/**\n * this is ArrowFunction.\n */\nexport default ()=>{}\n\n/**\n * this is testExportArrowFunction2.\n */\nexport const testExportArrowFunction2 = ()=>{};\n\n/**\n * this is testExportArrowFunction3.\n */\nconst testExportArrowFunction3 = ()=>{};\n\n// this is undocument\nexport const testExportArrowFunction4 = ()=>{};\n\n/**\n * this is testExportArrowFunction5.\n */\nconst testExportArrowFunction5 = ()=>{};\nexport {testExportArrowFunction5};\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Class.js",
    "content": "/**\n * this is TestExportClass1.\n */\nexport default class TestExportClass1 {}\n\n/**\n * this is TestExportClass2.\n */\nexport class TestExportClass2 {}\n\n/**\n * this is TestExportClass3.\n */\nclass TestExportClass3 {}\nexport {TestExportClass3};\n\n/**\n * this is TestExportClass4.\n */\nconst TestExportClass4 = class {};\nexport {TestExportClass4};\n\n// this is undocument.\nexport class TestExportClass5 {}\n\n/**\n * this is TestExportClass6.\n */\nclass TestExportClass6 {}\n\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/ClassIndirectDefault.js",
    "content": "/**\n * this is TestExportClassIndirectDefault.\n */\nclass TestExportClassIndirectDefault {}\nexport default TestExportClassIndirectDefault;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Default.js",
    "content": "/**\n * this is TestExportDefault.\n */\nexport default class TestExportDefault {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Extends.js",
    "content": "/**\n * this is TestExportExtendsInner.\n */\nclass TestExportExtendsInner {}\n\n/**\n * this is TestExportExtends.\n */\nexport class TestExportExtends extends TestExportExtendsInner {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Function.js",
    "content": "/**\n * this is testExportFunction1.\n */\nexport default function testExportFunction1(){}\n\n/**\n * this is testExportFunction2.\n */\nexport function testExportFunction2(){}\n\n/**\n * this is testExportFunction3.\n */\nexport const testExportFunction3 = function(){};\n\n/**\n * this is testExportFunction4.\n */\nfunction testExportFunction4(){}\n\n/**\n * this is testExportFunction5.\n */\nconst testExportFunction5 = function(){};\n\n/**\n * this is testExportFunction6.\n */\nexport function *testExportFunction6(){}\n\n// this is undocument\nexport function testExportFunction7(){}\n\n/**\n * this is testExportFunction8.\n */\nfunction testExportFunction8() {}\nexport {testExportFunction8};\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/FunctionIndirectDefault.js",
    "content": "/**\n * this is testExportFunctionIndirectDefault\n */\nfunction testExportFunctionIndirectDefault() {}\nexport default testExportFunctionIndirectDefault;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Multiple.js",
    "content": "/**\n * this is TestExportMultiple\n */\nclass TestExportMultiple {}\n\n/**\n * this is instance of TestExportMultiple.\n */\nconst testExportMultiple = new TestExportMultiple();\n\nexport {TestExportMultiple, testExportMultiple};\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Named.js",
    "content": "/**\n * this is TestExportNamed.\n */\nexport class TestExportNamed {}\n\nexport {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/NewExpression.js",
    "content": "/**\n * this is TestExportNewExpression.\n */\nclass TestExportNewExpression {}\n\n/**\n * this is instance of TestExportNewExpression.\n */\nexport default new TestExportNewExpression();\n\n/**\n * this is TestExportNewExpression2.\n */\nclass TestExportNewExpression2 {}\n\n/**\n * this is instance of TestExportNewExpression2.\n */\nexport const testExportNewExpression2 = new TestExportNewExpression2();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/NewExpressionIndirect.js",
    "content": "/**\n * this is TestExportNewExpressionIndirect.\n */\nclass TestExportNewExpressionIndirect {}\n\n/**\n * @ignore\n */\nconst testExportNewExpressionIndirect = new TestExportNewExpressionIndirect();\n\n/**\n * this is instance of TestExportNewExpressionIndirect.\n */\nexport default testExportNewExpressionIndirect;\n\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/NewExpressionProperty.js",
    "content": "/**\n * this is TestExportNewExpressionProperty.\n */\nclass TestExportNewExpressionProperty {}\n\nconst obj = {};\nobj.TestExportNewExpressionProperty = TestExportNewExpressionProperty;\n\n/**\n * this is instance of TestExportNewExpressionProperty.\n */\nexport default new obj.TestExportNewExpressionProperty();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/Variable.js",
    "content": "/**\n * this is testExportVariable1.\n * @type {Object}\n * @property {number} p1 - this is p1.\n * @property {string[]} p2 - this is p2.\n */\nexport default testExportVariable1 = {};\n\n/**\n * this is testExportVariable2.\n * @type {number}\n */\nexport const testExportVariable2 = 123;\n\n/**\n * this is testExportVariable3.\n * @type {number}\n */\nconst testExportVariable3 = 123;\n\n// this is undocument\nexport const testExportVariable4 = 123;\nexport const testExportVariable5 = [];\n\n/**\n * this is testExportVariable6.\n * @type {Object}\n * @property {number} p1 - this is p1.\n * @property {string} p2 - this is p2.\n */\nconst testExportVariable6 = {};\nexport {testExportVariable6};\n\n/**\n * this is testExportVariable7 with unknown type.\n * @see https://github.com/esdoc/esdoc/issues/75\n */\nexport const testExportVariable7 = new foo.Bar();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Export/VariableIndirectDefault.js",
    "content": "/**\n * this is testExportVariableIndirectDefault.\n * @type {{x1: number, x2: string}}\n */\nconst testExportVariableIndirectDefault = {};\nexport default testExportVariableIndirectDefault;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Builtin.js",
    "content": "/**\n * this is TestExtendsBuiltin.\n */\nexport default class TestExtendsBuiltin extends Array {\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Deep.js",
    "content": "export class TestExtendsDeepShape extends Array {\n  static get staticValueShape(){}\n\n  static set staticValueShape(v){}\n\n  static staticMethodShape(){\n    this.staticPShape = 123;\n  }\n\n  get valueShape(){}\n\n  set valueShape(v){}\n\n  methodShape() {\n    this.pShape = 123;\n  }\n}\n\nexport class TestExtendsDeepRectangle extends TestExtendsDeepShape {\n  static get staticValueRectangle(){}\n\n  static set staticValueRectangle(v){}\n\n  static staticMethodRectangle(){\n    this.staticPRectangle = 123;\n  }\n\n  get valueRectangle(){}\n\n  set valueRectangle(v){}\n\n  methodRectangle(){\n    this.pRectangle = 123;\n  }\n}\n\nexport default class TestExtendsDeepSquare extends TestExtendsDeepRectangle {\n  static get staticValueSquare(){}\n\n  static set staticValueSquare(v){}\n\n  static staticMethodSquare(){\n    this.staticPSquare = 123;\n  }\n\n  get valueSquare(){}\n\n  set valueSquare(v){}\n\n  methodSquare(){\n    this.pSquare = 123;\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Expression.js",
    "content": "/**\n * this is TestExtendsExpressionInner.\n */\nfunction TestExtendsExpressionInner(){}\n\n/**\n * this is TestExtendsExpression.\n */\nexport default class TestExtendsExpression extends TestExtendsExpressionInner(123) {\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Inner.js",
    "content": "class _TestExtendsInner {\n  /**\n   * this is method1.\n   */\n  method1(){}\n\n  /**\n   * this is method2.\n   */\n  method2(){}\n}\n\n/**\n * this is TestExtendsInner.\n */\nexport default class TestExtendsInner extends _TestExtendsInner {\n  /**\n   * this is method1 with override.\n   */\n  method1(){}\n\n  /**\n   * this is method3.\n   */\n  method3(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Mixin.js",
    "content": "/**\n * @ignore\n * @param a\n * @param b\n */\nfunction mixin(a, b){}\n\nexport class TestExtendsMixinInner1 {\n  /**\n   * this is method1.\n   */\n  method1(){}\n}\n\nexport class TestExtendsMixinInner2 {\n  /**\n   * this is method2.\n   */\n  method2(){}\n}\n\n/**\n * this is TestExtendsMixin.\n */\nexport default class TestExtendsMixin extends mixin(TestExtendsMixinInner1, TestExtendsMixinInner2) {\n  /**\n   * this is method3.\n   */\n  method3(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Outer.js",
    "content": "import TestExtendsBuiltin from './Builtin.js';\n\n/**\n * this is TextExtendsOuter.\n */\nexport default class TestExtendsOuter extends  TestExtendsBuiltin {\n  /**\n   * this is method1.\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Extends/Property.js",
    "content": "import obj from 'TestExtendsPropertyPackage';\n\n/**\n * this is TestExtendsProperty.\n */\nexport default class TestExtendsProperty extends obj.TestExtendsPropertyInner {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/External/Definition.js",
    "content": "/**\n * @external {TestExternalDefinition} http://example.com\n */\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Generator/Function.js",
    "content": "/**\n * this is testGeneratorFunction.\n */\nexport default function *testGeneratorFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Generator/Method.js",
    "content": "/**\n * this is TestGeneratorMethod.\n */\nexport default class TestGeneratorMethod {\n  /**\n   * this is generator method1.\n   */\n  *method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Ignore/Class.js",
    "content": "/**\n * this is TestIgnoreClass1.\n * @ignore\n */\nexport default class TestIgnoreClass1 {\n  method1(){}\n}\n\n/**\n * this is TestIgnoreClass2.\n */\nexport class TestIgnoreClass2 {\n  /**\n   * this is constructor.\n   */\n  constructor(){\n    /**\n     * this is p1.\n     * @type {number}\n     * @ignore\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @ignore\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Ignore/Function.js",
    "content": "/**\n * this is testIgnoreFunction.\n * @ignore\n */\nexport default function testIgnoreFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Ignore/Variable.js",
    "content": "/**\n * this is testIgnoreVariable.\n * @type {number}\n * @ignore\n */\nexport const testIgnoreVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Interface/Definition.js",
    "content": "/**\n * this is TestInterfaceDefinition\n * @interface\n */\nexport default class TestInterfaceDefinition {\n  /**\n   * this is interface method1.\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Interface/Implements.js",
    "content": "/**\n * this is TestInterfaceImplements.\n * @implements {TestInterfaceDefinition}\n * @implements {TestInterfaceImplementsInner}\n */\nexport default class TestInterfaceImplements {\n  /**\n   * this is implements method1.\n   */\n  method1(){}\n\n  /**\n   * this is implements method2.\n   */\n  method2(){}\n}\n\n/**\n * this is TestInterfaceImplementsInner\n * @interface\n */\nexport class TestInterfaceImplementsInner {\n  /**\n   * this is interface method2.\n   */\n  method2(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Invalid/CodeSyntax.js",
    "content": "this is invalid syntax.\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Invalid/DocSyntax.js",
    "content": "/**\n * @param {} p\n */\nfunction testInvalidCodeSyntax(p){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Link/Class.js",
    "content": "/**\n * this is TestLinkClass.\n * link to {@link testLinkFunction}\n */\nexport default class TestLinkClass {\n  /**\n   * this is constructor.\n   * link to {@link testLinkFunction}\n   */\n  constructor(){\n    /**\n     * this is p1.\n     * link to {@link testLinkFunction}\n     * @type {number}\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * link to {@link testLinkFunction}\n   */\n  method1(){}\n}\n\nexport class TestLinkClass2 extends TestLinkClass {\n}\n\nexport class TestLinkClass3 extends TestLinkClass2 {\n  /**\n   * {@link TestLinkClass2#method1}\n   */\n  method1FooBar() {\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Link/Function.js",
    "content": "/**\n * this is testLinkFunction.\n * link to {@link TestLinkClass}\n * link to {@link TestLinkClass#p1}\n * link to {@link TestLinkClass#method1}\n */\nexport default function testLinkFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Link/Variable.js",
    "content": "/**\n * this is testLinkVariable.\n * link to {@link TestLinkClass}\n * @type {number}\n */\nexport const testLinkVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Listens/Function.js",
    "content": "/**\n * this is testListensFunction.\n * @listens {TestListensFunctionEvent}\n */\nexport default function testListensFunction(){}\n\n/**\n * this is TestListensFunctionEvent.\n */\nexport class TestListensFunctionEvent {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Listens/Method.js",
    "content": "/**\n * this is TestListensMethod.\n */\nexport default class TestListensMethod {\n  /**\n   * this is method1.\n   * @listens {TestListensMethodEvent1} listen event because foo.\n   * @listens {TestListensMethodEvent2} listen event because bar.\n   */\n  method1(){}\n}\n\n/**\n * this is TestListensMethodEvent1.\n */\nexport class TestListensMethodEvent1 {}\n\n/**\n * this is TestListensMethodEvent2.\n */\nexport class TestListensMethodEvent2 {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Param/Function.js",
    "content": "/**\n * this is testParamFunction.\n * @param {number} p1 - this is p1.\n * @param {TestClassDefinition} p2 - this is p2.\n */\nexport default function testParamFunction(p1, p2){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Param/Method.js",
    "content": "/**\n * this is TestParamMethod.\n */\nexport default class TestParamMethod {\n  /**\n   * this is method1.\n   * @param {number} p1 - this is p1.\n   * @param {TestClassDefinition} p2 - this is p2.\n   */\n  method1(p1, p2){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Property/Return.js",
    "content": "/**\n * this is TestPropertyReturn.\n */\nexport default class TestPropertyReturn {\n  /**\n   * this is method1.\n   * @return {Object} - this is return value.\n   * @property {number} x1 - this is x1 of return value.\n   * @property {TestClassDefinition} x2 - this is x2 of return value.\n   */\n  method1(){\n    return {};\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Return/Function.js",
    "content": "/**\n * this is testReturnFunction1.\n * @returns {TestClassDefinition} - this is return value.\n */\nexport default function testReturnFunction1(){}\n\n/**\n * this is testReturnFunction2.\n * @returns {number} - this is return value.\n */\nexport function testReturnFunction2(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Return/Method.js",
    "content": "/**\n * this is TestReturnMethod.\n */\nexport default class TestReturnMethod {\n  /**\n   * this is method1.\n   * @returns {number} - this is return value.\n   */\n  method1(){\n    return 123;\n  }\n\n  /**\n   * this is method2.\n   * @returns {TestClassDefinition} - this is return value.\n   */\n  method2(){\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/See/Class.js",
    "content": "/**\n * this is TestSeeClass.\n * @see http://foo.example.com\n * @see http://bar.example.com\n */\nexport default class TestSeeClass {\n  /**\n   * this is constructor.\n   * @see http://example.com\n   */\n  constructor(){\n    /**\n     * this is p1.\n     * @type {number}\n     * @see http://example.com\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @see http://example.com\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/See/Function.js",
    "content": "/**\n * this is testSeeFunction.\n * @see http://example.com\n */\nexport default function testSeeFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/See/Variable.js",
    "content": "/**\n * this is testSeeVariable.\n * @type {number}\n * @see http://example.com\n */\nexport const testSeeVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Since/Class.js",
    "content": "/**\n * this TestSinceClass.\n * @since 1.2.3\n */\nexport default class TestSinceClass {\n  /**\n   * this is constructor.\n   * @since 1.2.3\n   */\n  constructor() {\n    /**\n     * this is p1.\n     * @type {number}\n     * @since 1.2.3\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @since 1.2.3\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Since/Function.js",
    "content": "/**\n * this is testSinceFunction.\n * @since 1.2.3\n */\nexport default function testSinceFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Since/Variable.js",
    "content": "/**\n * this is testSinceVariable.\n * @type {number}\n * @since 1.2.3\n */\nexport const testSinceVariable =123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Throws/Function.js",
    "content": "/**\n * this is testThrowsFunction.\n * @throws {TestThrowsFunctionError}\n */\nexport default function testThrowsFunction(){}\n\n/**\n * this is TestThrowsFunctionError.\n */\nexport class TestThrowsFunctionError {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Throws/Method.js",
    "content": "/**\n * this is TestThrowsMethod.\n */\nexport default class TestThrowsMethod {\n  /**\n   * this is method1.\n   * @throws {TestThrowsMethodError1} throw error if foo.\n   * @throws {TestThrowsMethodError2} throw error if bar.\n   */\n  method1(){}\n}\n\n/**\n * this is TestThrowsMethodError1.\n */\nexport class TestThrowsMethodError1 {}\n\n/**\n * this is TestThrowsMethodError2.\n */\nexport class TestThrowsMethodError2 {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Todo/Class.js",
    "content": "/**\n * this is TestTodoClass.\n * @todo this is first todo.\n * @todo this is second todo.\n */\nexport default class TestTodoClass {\n  /**\n   * this is constructor.\n   * @todo this is todo.\n   */\n  constructor() {\n    /**\n     * this is p1.\n     * @type {number}\n     * @todo this is todo.\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @todo this is todo.\n   */\n  method1() {}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Todo/Function.js",
    "content": "/**\n * this is testTodoFunction.\n * @todo this is todo.\n */\nexport default function testTodoFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Todo/Variable.js",
    "content": "/**\n * this is testTodoVariable.\n * @todo this is todo.\n */\nexport const testTodoVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/TrailingComma/Definition.js",
    "content": "/**\n * this is TestTrailingCommaDefinition.\n */\nexport default class TestTrailingCommaDefinition {\n  /**\n   * this is method1.\n   * @param {number} p1 - this is p1.\n   * @param {string} p2 - this is p2.\n   */\n  method1(p1, p2,) {}\n\n  /**\n   * this is method2.\n   */\n  method2(){\n    this.method1(1, 'abc',);\n  }\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Array.js",
    "content": "/**\n * this is TestTypeArray.\n */\nexport default class TestTypeArray {\n  /**\n   * this is method1.\n   * @param {number[]} p1 - this is number array p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Class.js",
    "content": "export default class TestTypeClass {\n  /**\n   * this is method1.\n   * @param {TestTypeClassInner} p1 - this is class p1.\n   */\n  method1(p1){}\n}\n\nexport class TestTypeClassInner {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Complex.js",
    "content": "export default class TestTypeComplex {\n  // function\n  /**\n   * this is method1.\n   * @param {function(x1: number[], x2: Map<string, boolean>): Object} p1 - this is p1.\n   */\n  method1(p1){}\n\n  // generics\n  /**\n   * this is method2.\n   * @param {Map<number, string[]>} p1 - this is p1.\n   */\n  method2(p1){}\n\n  // record\n  /**\n   * this is method3.\n   * @param {{x1: number[], x2: Map<string, boolean>, x3: {y1: number, y2: string}}} p1 - this is p1.\n   */\n  method3(p1){}\n\n  // union\n  /**\n   * this is method4.\n   * @param {?(number|string)} p1 - this is p1.\n   * @param {!(number|string)} p2 - this is p2.\n   */\n  method4(p1, p2){}\n\n  // union in generics\n  /**\n   * this is method5.\n   * @param {Promise<string|number, Error>} p1 - this is p1.\n   */\n  method5(p1){}\n\n  // union with spread\n  /**\n   * this is method6.\n   * @param {...(number|string)} p1 - this is p1.\n   */\n  method6(...p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Default.js",
    "content": "/**\n * this is TestTypeDefault.\n */\nexport default class TestTypeDefault {\n  /**\n   * this is method1.\n   * @param {number} [p1=123] - this is default number p1.\n   * @param {string[]} [p2=[]] - this is default string array p2.\n   */\n  method1(p1 = 123, p2 = []){}\n\n  /**\n   * this is method2.\n   * @param {Foo} [p1 = new Foo()] - this is default object p1.\n   */\n  method2(p1 = new Foo()){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/External.js",
    "content": "/**\n * this is TestTypeExternal\n */\nexport default class TestTypeExternal {\n  /**\n   * this is method1.\n   * @param {ArrayBuffer} p1 - this external p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Function.js",
    "content": "/**\n * this is TestTypeFunction.\n */\nexport default class TestTypeFunction {\n  /**\n   * this is method1.\n   * @param {function(x1: number, x2: string): boolean} p1 - this is function p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Generics.js",
    "content": "/**\n * this is TestTypeGenerics.\n */\nexport default class TestTypeGenerics {\n  /**\n   * this is method1.\n   * @param {Array<number>} p1 - this is array p1.\n   * @param {Map<number, string>} p2 - this map p2.\n   * @param {Promise<number[], Error>} p3 - this is promise p3.\n   */\n  method1(p1, p2, p3){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Literal.js",
    "content": "/**\n * this is TestTypeLiteral.\n */\nexport default class TestTypeLiteral {\n  /**\n   * this is method1.\n   * @param {number} p1 - this is number p1.\n   * @param {string} p2 - this is string p2.\n   * @param {boolean} p3 - this is boolean p3.\n   */\n  method1(p1, p2, p3){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Nullable.js",
    "content": "export default class TypeTestNullable {\n  /**\n   * this is method1\n   * @param {?number} p1 - this is nullable number p1.\n   * @param {!string} p2 - this is not nullable string p2.\n   */\n  method1(p1, p2){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Object.js",
    "content": "/**\n * this is TestTypeObject.\n */\nexport default class TestTypeObject {\n  /**\n   * this is method1.\n   * @param {Object} p1 - this is object p1.\n   * @param {number} p1.x1 - this is number x1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Optional.js",
    "content": "/**\n * this is TestTypeOptional.\n */\nexport default class TestTypeOptional {\n  /**\n   * this is method1.\n   * @param {number} [p1] - this is optional number p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Record.js",
    "content": "/**\n * this is TestTypeRecord.\n */\nexport default class TestTypeRecord {\n  /**\n   * this is method1.\n   * @param {{x1: number, x2: string}} p1 - this is record p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Spread.js",
    "content": "/**\n * this is TestTypeSpread.\n */\nexport default class TestTypeSpread {\n  /**\n   * this is method1.\n   * @param {...number} p1 - this is spread number p1.\n   */\n  method1(...p1){}\n\n  /**\n   * this is method2.\n   * @param {Object} config - this is config.\n   * @param {number} config.x - this is number x.\n   * @param {string} config.y - this is string y.\n   * @param {number[]} config.a - thi is number[] a.\n   * @param {string[]} config.b - thi is number[] b.\n   */\n  method2({x, y, ...z}){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Typedef.js",
    "content": "/**\n * @typedef {Object} TestTypeTypedefInner\n */\n\n/**\n * this is TestTypedef.\n */\nexport default class TestTypeTypedef {\n  /**\n   * this is method1.\n   * @param {TestTypeTypedefInner} p1 - this is typedef p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Type/Union.js",
    "content": "/**\n * this is TestTypeUnion.\n */\nexport default class TestTypeUnion {\n  /**\n   * this is method1.\n   * @param {number|string} p1 - this is number or string p1.\n   */\n  method1(p1){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Typedef/Definition.js",
    "content": "/**\n * this is TestTypedefDefinition.\n * @typedef {Object} TestTypedefDefinition\n * @property {number} p1 - this is p1.\n */\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Undocument/Definition.js",
    "content": "// this is undocument.\nexport default class TestUndocumentDefinition {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Unknown/Definition.js",
    "content": "/**\n * this is TestUnknownDefinition.\n * @foobar this is unknown tag.\n */\nexport default class TestUnknownDefinition {}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Variable/ArrayPattern.js",
    "content": "/**\n * this is testVariableArrayPattern1.\n * @type {number}\n */\nexport const [testVariableArrayPattern1, testVariableArrayPattern2] = [1, 2];\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Variable/Definition.js",
    "content": "/**\n * this is testVariableDefinition.\n * @type {number}\n */\nexport const testVariableDefinition = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Variable/ObjectPattern.js",
    "content": "/**\n * this is testVariableObjectPattern1.\n * @type {number}\n */\nexport const {testVariableObjectPattern1, testVariableObjectPattern2} = {testVariableObjectPattern1: 1, testVariableObjectPattern2: 2};\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Version/Class.js",
    "content": "/**\n * this is TestVersionClass.\n * @version 1.2.3\n */\nexport default class TestVersionClass {\n  /**\n   * this is constructor.\n   * @version 1.2.3\n   */\n  constructor(){\n    /**\n     * this is p1.\n     * @type {number}\n     * @version 1.2.3\n     */\n    this.p1 = 123;\n  }\n\n  /**\n   * this is method1.\n   * @version 1.2.3\n   */\n  method1(){}\n}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Version/Function.js",
    "content": "/**\n * this is testVersionFunction.\n * @version 1.2.3\n */\nexport default function testVersionFunction(){}\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/src/Version/Variable.js",
    "content": "/**\n * this is testVersionVariable.\n * @type {number}\n * @version 1.2.3\n */\nexport const testVersionVariable = 123;\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/fixture/test/DescTest.js",
    "content": "/** @test {TestDescClass} */\ndescribe('Use describe style mocha interface', ()=>{\n  /** @test {TestDescClass#constructor} */\n  it('Use it style mocha interface', ()=>{\n  });\n\n  /** @test {TestDescClass#p1} */\n  describe('Nested describe', ()=>{\n    /** @test {testDescVariable} */\n    it('Nested it in describe', ()=>{\n    });\n  });\n\n  /** @test {TestDescClass#method1} */\n  context('Use context style mocha interface', ()=>{\n    /** @test {testDescFunction} */\n    it('Nested it in context', ()=>{\n    });\n  });\n});\n\n/** @test {TestDescClass} */\nsuite('Use suite style mocha interface', ()=>{\n  /** @test {TestDescClass#constructor} */\n  test('Use test style mocha interface', ()=>{\n  });\n\n  /** @test {TestDescClass#p1} */\n  suite('Nested suite', ()=>{\n    /** @test {TestDescClass#method1} */\n    test('Nested test', ()=>{\n    });\n  })\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/AbstractTest/DefinitionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {DocBuilder} */\ndescribe('TestAbstractDefinition:', ()=> {\n  const doc = readDoc('class/src/Abstract/Definition.js~TestAbstractDefinition.html');\n\n  /** @test {DocBuilder#_buildSummaryDoc} */\n  it('has abstract method in summary.', ()=> {\n    find(doc, '[data-ice=\"summary\"]', (doc)=> {\n      assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public abstract method1() this is abstract method1');\n      assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(2)', 'public abstract method2() this is abstract method2');\n    });\n  });\n\n  /** @test {DocBuilder#_buildDetailDocs} */\n  it('has abstract method in detail.', ()=>{\n    assert.includes(doc, '[data-ice=\"detail\"]:nth-of-type(1)', 'public abstract method1()');\n    assert.includes(doc, '[data-ice=\"detail\"]:nth-of-type(2)', 'public abstract method2()');\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/AbstractTest/OverrideTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {DocBuilder} */\ndescribe('TestAbstractOverrideDefinition:', ()=> {\n  const doc = readDoc('class/src/Abstract/Override.js~TestAbstractOverride.html');\n\n  /** @test {DocBuilder#_buildOverrideMethod} */\n  it('has override description in summary.', ()=> {\n    find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=> {\n      assert.includes(doc, '[data-ice=\"override\"] a', 'TestAbstractDefinition#method1');\n      assert.includes(doc, '[data-ice=\"override\"] a', 'class/src/Abstract/Definition.js~TestAbstractDefinition.html#instance-method-method1', 'href');\n    });\n\n    find(doc, '[data-ice=\"detail\"]:nth-of-type(2)', (doc)=> {\n      assert.includes(doc, '[data-ice=\"override\"] a', 'TestAbstractDefinition#method2');\n      assert.includes(doc, '[data-ice=\"override\"] a', 'class/src/Abstract/Definition.js~TestAbstractDefinition.html#instance-method-method2', 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/AsyncTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#_$async} */\ndescribe('testAsyncFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has async mark', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testAsyncFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public async testAsyncFunction()');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has async mark.', ()=>{\n      findParent(doc, '[id=\"static-function-testAsyncFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public async testAsyncFunction()');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/AsyncTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {MethodDoc#_$async} */\ndescribe('TestAsyncMethod', ()=> {\n  const doc = readDoc('class/src/Async/Method.js~TestAsyncMethod.html');\n\n  describe('in summary', ()=> {\n    it('has async mark.', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public async method1()');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has async mark.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public async method1()');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ClassPropertyTest/DefinitionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDocBuilder} */\ndescribe('TestClassPropertyDefinition:', ()=> {\n  const doc = readDoc('class/src/ClassProperty/Definition.js~TestClassPropertyDefinition.html');\n\n  /** @test {ClassDocBuilder#_buildClassDoc} */\n  describe('in summary', ()=>{\n    it('has static member', ()=>{\n      find(doc, '[data-ice=\"staticMemberSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public static p1: number this is static p1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) [data-ice=\"name\"] a', 'class/src/ClassProperty/Definition.js~TestClassPropertyDefinition.html#static-member-p1', 'href');\n        });\n      });\n    });\n\n    it('has member.', ()=>{\n      find(doc, '[data-ice=\"memberSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=> {\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public p1: number this is p1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) [data-ice=\"name\"] a', 'class/src/ClassProperty/Definition.js~TestClassPropertyDefinition.html#instance-member-p1', 'href');\n        });\n      });\n    });\n  });\n\n  /** @test {ClassDocBuilder#_buildClassDoc} */\n  describe('in detail', ()=>{\n    it('has static member.', ()=>{\n      find(doc, '[data-ice=\"staticMemberDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '#static-member-p1', 'public static p1: number');\n          assert.includes(doc, '[data-ice=\"description\"]', 'this is static p1.');\n        });\n      });\n    });\n\n    it('has member.', ()=>{\n      find(doc, '[data-ice=\"memberDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '#instance-member-p1', 'public p1: number');\n          assert.includes(doc, '#instance-member-p1 + [data-ice=\"description\"]', 'this is p1.');\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ClassTest/DefinitionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDocBuilder} */\ndescribe('TestClassDefinition:', ()=> {\n  const doc = readDoc('class/src/Class/Definition.js~TestClassDefinition.html');\n\n  /** @test {DocBuilder#_getTitle} */\n  describe('in title:', ()=>{\n    it('has document title', ()=> {\n      assert.includes(doc, 'head title', 'TestClassDefinition');\n    });\n  });\n\n  /** @test {ClassDocBuilder#_buildClassDoc} */\n  describe('in header', ()=>{\n    it('has header notice.', ()=> {\n      find(doc, '[data-ice=\"content\"] .header-notice', (doc)=> {\n        assert.includes(doc, '[data-ice=\"importPath\"]', \"import TestClassDefinition from 'esdoc-test-fixture'\");\n        assert.includes(doc, '[data-ice=\"access\"]', 'public');\n        assert.includes(doc, '[data-ice=\"kind\"]', 'class');\n        assert.includes(doc, '[data-ice=\"source\"]', 'source');\n        assert.includes(doc, '[data-ice=\"source\"] a', 'file/src/Class/Definition.js.html#lineNumber4', 'href');\n      });\n    });\n  });\n\n  /** @test {ClassDocBuilder#_buildClassDoc} */\n  describe('in detail', ()=>{\n    it('has self detail.', ()=>{\n      find(doc, '[data-ice=\"content\"] .self-detail', (doc)=>{\n        assert.includes(doc, '[data-ice=\"name\"]', 'TestClassDefinition');\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is TestClassDefinition.');\n      });\n    });\n  });\n\n  /** @test {ClassDocBuilder#_buildClassDoc} */\n  describe('in summary', ()=>{\n    it('has static member', ()=>{\n      find(doc, '[data-ice=\"staticMemberSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public static p1: number this is static p1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) [data-ice=\"name\"] a', 'class/src/Class/Definition.js~TestClassDefinition.html#static-member-p1', 'href');\n        });\n      });\n    });\n\n    it('has static method.', ()=>{\n      find(doc, '[data-ice=\"staticMethodSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public static method1() this is static method1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) a', 'class/src/Class/Definition.js~TestClassDefinition.html#static-method-method1', 'href');\n        });\n      });\n    });\n\n    it('has constructor.', ()=>{\n      find(doc, '[data-ice=\"constructorSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public constructor() this is constructor.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) [data-ice=\"name\"] a', 'class/src/Class/Definition.js~TestClassDefinition.html#instance-constructor-constructor', 'href');\n        });\n      });\n    });\n\n    it('has member.', ()=>{\n      find(doc, '[data-ice=\"memberSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=> {\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public p1: number this is p1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) [data-ice=\"name\"] a', 'class/src/Class/Definition.js~TestClassDefinition.html#instance-member-p1', 'href');\n\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(2)', 'public get value1: number this is get value1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(2) [data-ice=\"name\"] a', 'class/src/Class/Definition.js~TestClassDefinition.html#instance-get-value1', 'href');\n\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(3)', 'public set value2: number this is set value2.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(3) [data-ice=\"name\"] a', 'class/src/Class/Definition.js~TestClassDefinition.html#instance-set-value2', 'href');\n        });\n      });\n    });\n\n    it('has method summary.', ()=>{\n      find(doc, '[data-ice=\"methodSummary\"]', (doc)=>{\n        find(doc, 'table[data-ice=\"summary\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1)', 'public method1() this is method1.');\n          assert.includes(doc, '[data-ice=\"target\"]:nth-of-type(1) [data-ice=\"name\"] a', 'class/src/Class/Definition.js~TestClassDefinition.html#instance-method-method1', 'href');\n        });\n      });\n    });\n  });\n\n  /** @test {ClassDocBuilder#_buildClassDoc} */\n  describe('in detail', ()=>{\n    it('has static member.', ()=>{\n      find(doc, '[data-ice=\"staticMemberDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '#static-member-p1', 'public static p1: number');\n          assert.includes(doc, '[data-ice=\"description\"]', 'this is static p1.');\n        });\n      });\n    });\n\n    it('has static method.', ()=>{\n      find(doc, '[data-ice=\"staticMethodDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '#static-method-method1', 'public static method1()');\n          assert.includes(doc, '[data-ice=\"description\"]', 'this is static method1.');\n        });\n      });\n    });\n\n    it('has member.', ()=>{\n      find(doc, '[data-ice=\"memberDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '#instance-member-p1', 'public p1: number');\n          assert.includes(doc, '#instance-member-p1 + [data-ice=\"description\"]', 'this is p1.');\n        });\n\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(2)', (doc)=>{\n          assert.includes(doc, '#instance-get-value1', 'public get value1: number');\n          assert.includes(doc, '#instance-get-value1 + [data-ice=\"description\"]', 'this is get value1.');\n        });\n\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(3)', (doc)=>{\n          assert.includes(doc, '#instance-set-value2', 'public set value2: number');\n          assert.includes(doc, '#instance-set-value2 + [data-ice=\"description\"]', 'this is set value2.');\n        });\n      });\n    });\n\n    it('has constructor detail.', ()=>{\n      find(doc, '[data-ice=\"constructorDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '#instance-constructor-constructor', 'public constructor()');\n          assert.includes(doc, '#instance-constructor-constructor + [data-ice=\"description\"]', 'this is constructor.');\n        });\n      });\n    });\n\n    it('has method detail.', ()=>{\n      find(doc, '[data-ice=\"methodDetails\"]', (doc)=>{\n        find(doc, '[data-ice=\"detail\"]:nth-of-type(1)', (doc)=> {\n          assert.includes(doc, '#instance-method-method1', 'public method1()');\n          assert.includes(doc, '#instance-method-method1 ~ [data-ice=\"description\"]', 'this is method1.');\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ComputedTest/MethodTest.js",
    "content": "/* eslint-disable no-template-curly-in-string, no-multi-spaces */\nimport {readDoc, assert, find} from './../../util.js';\n\n/** @test {MethodDoc#@_name} */\ndescribe('TestComputedMethod:', ()=> {\n  const doc = readDoc('class/src/Computed/Method.js~TestComputedMethod.html');\n\n  describe('in summary:', ()=>{\n    it('has computed methods.', ()=> {\n      find(doc, '[data-ice=\"summary\"]', (doc)=>{\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-['foo']\"]`,            `['foo']`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[Symbol.iterator]\"]`,  `[Symbol.iterator]`);\n        assert.includes(doc, '[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[`${foo}`]\"]',       '[`${foo}`]');\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo + bar]\"]`,        `[foo + bar]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo()]\"]`,            `[foo()]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo.bar()]\"]`,        `[foo.bar()]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo.bar.baz]\"]`,      `[foo.bar.baz]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo.bar]\"]`,          `[foo.bar]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo.p + bar]\"]`,      `[foo.p + bar]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Method.js~TestComputedMethod.html#instance-method-[foo]\"]`,              `[foo]`);\n      });\n    });\n  });\n\n  describe('in detail:', ()=>{\n    it('has computed method.', ()=>{\n      assert.includes(doc, `[id=\"instance-method-['foo']\"] [data-ice=\"name\"]`,            `['foo']`);\n      assert.includes(doc, `[id=\"instance-method-[Symbol.iterator]\"] [data-ice=\"name\"]`,  `[Symbol.iterator]`);\n      assert.includes(doc, '[id=\"instance-method-[`${foo}`]\"] [data-ice=\"name\"]',       '[`${foo}`]');\n      assert.includes(doc, `[id=\"instance-method-[foo + bar]\"] [data-ice=\"name\"]`,        `[foo + bar]`);\n      assert.includes(doc, `[id=\"instance-method-[foo()]\"] [data-ice=\"name\"]`,            `[foo()]`);\n      assert.includes(doc, `[id=\"instance-method-[foo.bar()]\"] [data-ice=\"name\"]`,        `[foo.bar()]`);\n      assert.includes(doc, `[id=\"instance-method-[foo.bar.baz]\"] [data-ice=\"name\"]`,      `[foo.bar.baz]`);\n      assert.includes(doc, `[id=\"instance-method-[foo.bar]\"] [data-ice=\"name\"]`,          `[foo.bar]`);\n      assert.includes(doc, `[id=\"instance-method-[foo.p + bar]\"] [data-ice=\"name\"]`,      `[foo.p + bar]`);\n      assert.includes(doc, `[id=\"instance-method-[foo]\"] [data-ice=\"name\"]`,              `[foo]`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ComputedTest/PropertyTest.js",
    "content": "/* eslint-disable no-template-curly-in-string, no-multi-spaces */\nimport {readDoc, assert, find} from './../../util.js';\n\n/** @test {MemberDoc#@_name} */\ndescribe('TestComputedProperty:', ()=> {\n  const doc = readDoc('class/src/Computed/Property.js~TestComputedProperty.html');\n\n  describe('in summary:', ()=>{\n    it('has computed properties.', ()=> {\n      find(doc, '[data-ice=\"memberSummary\"]', (doc)=>{\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-['foo']\"]`,             `['foo']`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[Symbol.iterator]\"]`,  `[Symbol.iterator]`);\n        assert.includes(doc, '[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[`${foo}`]\"]',         '[`${foo}`]');\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo + bar]\"]`,        `[foo + bar]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo()]\"]`,            `[foo()]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo.bar()]\"]`,        `[foo.bar()]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo.bar.baz]\"]`,      `[foo.bar.baz]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo.bar]\"]`,          `[foo.bar]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo.p + bar]\"]`,      `[foo.p + bar]`);\n        assert.includes(doc, `[href=\"class/src/Computed/Property.js~TestComputedProperty.html#instance-member-[foo]\"]`,              `[foo]`);\n      });\n    });\n  });\n\n  describe('in detail:', ()=>{\n    it('has computed properties.', ()=>{\n      assert.includes(doc, `[id=\"instance-member-['foo']\"] [data-ice=\"name\"]`,            `['foo']`);\n      assert.includes(doc, `[id=\"instance-member-[Symbol.iterator]\"] [data-ice=\"name\"]`,  `[Symbol.iterator]`);\n      assert.includes(doc, '[id=\"instance-member-[`${foo}`]\"] [data-ice=\"name\"]',         '[`${foo}`]');\n      assert.includes(doc, `[id=\"instance-member-[foo + bar]\"] [data-ice=\"name\"]`,        `[foo + bar]`);\n      assert.includes(doc, `[id=\"instance-member-[foo()]\"] [data-ice=\"name\"]`,            `[foo()]`);\n      assert.includes(doc, `[id=\"instance-member-[foo.bar()]\"] [data-ice=\"name\"]`,        `[foo.bar()]`);\n      assert.includes(doc, `[id=\"instance-member-[foo.bar.baz]\"] [data-ice=\"name\"]`,      `[foo.bar.baz]`);\n      assert.includes(doc, `[id=\"instance-member-[foo.bar]\"] [data-ice=\"name\"]`,          `[foo.bar]`);\n      assert.includes(doc, `[id=\"instance-member-[foo.p + bar]\"] [data-ice=\"name\"]`,      `[foo.p + bar]`);\n      assert.includes(doc, `[id=\"instance-member-[foo]\"] [data-ice=\"name\"]`,              `[foo]`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DecoratorTest/DefinitionTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/**\n * @test {ClassDocBuilder#_buildClassDoc}\n * @test {DocBuilder#_buildDetailDocs}\n */\ndescribe('TestDecoratorDefinition:', ()=> {\n  const doc = readDoc('class/src/Decorator/Definition.js~TestDecoratorDefinition.html');\n\n  it('has decorator at class.', ()=>{\n    find(doc, '[data-ice=\"content\"] .self-detail', (doc)=>{\n      assert.includes(doc, '[data-ice=\"decorator\"]', 'testDecoratorAnnotation1');\n    });\n  });\n\n  it('has decorator at static method.', ()=>{\n    findParent(doc, '[id=\"static-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"decorator\"]', 'testDecoratorAnnotation1');\n    });\n  });\n\n  it('has decorator at getter.', ()=>{\n    findParent(doc, '[id=\"instance-get-value1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"decorator\"]', 'testDecoratorAnnotation1');\n    });\n  });\n\n  it('has decorator at setter.', ()=>{\n    findParent(doc, '[id=\"instance-set-value2\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"decorator\"]', 'testDecoratorAnnotation1');\n    });\n  });\n\n  it('has decorator at method.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"decorator\"] li:nth-of-type(1)', 'testDecoratorAnnotation1');\n      assert.includes(doc, '[data-ice=\"decorator\"] li:nth-of-type(2)', 'testDecoratorAnnotation2(true)');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DeprecatedTest/ClassTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {AbstractDoc#@deprecated} */\ndescribe('TestDeprecatedClass:', ()=> {\n  const doc = readDoc('class/src/Deprecated/Class.js~TestDeprecatedClass.html');\n\n  describe('in self detail:', ()=> {\n    it('has deprecated message of self.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"deprecated\"]', 'this class was deprecated. this is deprecated.');\n    });\n  });\n\n  describe('in summary:', ()=> {\n    it('has deprecated message of member and method.', ()=> {\n      find(doc, '[data-ice=\"summary\"] [href=\"class/src/Deprecated/Class.js~TestDeprecatedClass.html#instance-member-p1\"]', (doc)=> {\n        doc = doc.parents('[data-ice=\"target\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this member was deprecated.');\n      });\n\n      find(doc, '[data-ice=\"summary\"] [href=\"class/src/Deprecated/Class.js~TestDeprecatedClass.html#instance-method-method1\"]', (doc)=> {\n        doc = doc.parents('[data-ice=\"target\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this method was deprecated.');\n      });\n    });\n  });\n\n  describe('in details:', ()=>{\n    it('has deprecated message of member and method.', ()=>{\n      find(doc, '[id=\"instance-member-p1\"]', (doc)=>{\n        doc = doc.parents('[data-ice=\"detail\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this member was deprecated.');\n      });\n\n      find(doc, '[id=\"instance-method-method1\"]', (doc)=>{\n        doc = doc.parents('[data-ice=\"detail\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this method was deprecated.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DeprecatedTest/FunctionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {AbstractDoc#@deprecated} */\ndescribe('testDeprecatedFunction:', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has deprecated message.', ()=> {\n      find(doc, '[data-ice=\"summary\"] [href=\"function/index.html#static-function-testDeprecatedFunction\"]', (doc)=>{\n        doc = doc.parents('[data-ice=\"target\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this function was deprecated.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has deprecated message of member and method.', ()=>{\n      find(doc, '[id=\"static-function-testDeprecatedFunction\"]', (doc)=>{\n        doc = doc.parents('[data-ice=\"detail\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this function was deprecated.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DeprecatedTest/VariableTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {AbstractDoc#@deprecated} */\ndescribe('testDeprecatedVariable:', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has deprecated message.', ()=> {\n      find(doc, '[data-ice=\"summary\"] [href=\"variable/index.html#static-variable-testDeprecatedVariable\"]', (doc)=>{\n        doc = doc.parents('[data-ice=\"target\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this variable was deprecated.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has deprecated message.', ()=>{\n      find(doc, '[id=\"static-variable-testDeprecatedVariable\"]', (doc)=>{\n        doc = doc.parents('[data-ice=\"detail\"]');\n        assert.includes(doc, '[data-ice=\"deprecated\"]', 'this variable was deprecated.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DescTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@desc} */\ndescribe('TestDescClass', ()=> {\n  const doc = readDoc('class/src/Desc/Class.js~TestDescClass.html');\n\n  describe('in self detail', ()=> {\n    it('has desc.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"description\"]', 'this is TestDescClass.');\n    });\n  });\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      assert.includes(doc, '[data-ice=\"constructorSummary\"] [data-ice=\"description\"]', 'this is constructor.');\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-member-p1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is p1.');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method1.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is constructor.');\n      });\n\n      findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is p1.');\n      });\n\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method1.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DescTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@desc} */\ndescribe('testDescFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testDescFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is testDescFunction.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-function-testDescFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is testDescFunction.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DescTest/MarkdownTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {AbstractDoc#@desc} */\ndescribe('TestDescMarkdown:', ()=> {\n  const doc = readDoc('class/src/Desc/Markdown.js~TestDescMarkdown.html');\n\n  describe('in self detail', ()=> {\n    it('has markdown desc.', ()=> {\n      find(doc, '.self-detail [data-ice=\"description\"]', (doc)=>{\n        // line\n        assert.includes(doc.find('p:nth-child(1)'), null, 'this is TestDescMarkdown.');\n\n        // code fence of html\n        assert.includes(doc.find('pre:nth-child(2) code.lang-html code.source-code.prettyprint'), null,\n          `<div>text</div> <ul> <li>item1</li> <li>item2</li> <li>item3</li> </ul>`\n        );\n\n        // header\n        assert.includes(doc.find('h1#inner-link:nth-child(3)'), null, 'Inner Link');\n\n        // list\n        assert.includes(doc.find('ul:nth-child(4) li:nth-child(1)'), null, 'item1');\n        assert.includes(doc.find('ul:nth-child(4) li:nth-child(2)'), null, 'item2');\n        assert.includes(doc.find('ul:nth-child(4) li:nth-child(3)'), null, 'item3');\n\n        // link\n        assert.includes(doc.find('p:nth-child(5) a[href$=\"#inner-link\"]'), null, 'inner link');\n\n        // code fence of js\n        assert.includes(doc.find('pre:nth-child(6) code.lang-js code.source-code.prettyprint'), null,\n          `let foo = 'this is code block'`\n        );\n\n        // table\n        assert.includes(doc.find('table:nth-child(7) thead tr'), null, 'Left align Right align Center align');\n        assert.includes(doc.find('table:nth-child(7) tbody tr:nth-child(1)'), null, 'This This This');\n        assert.includes(doc.find('table:nth-child(7) tbody tr:nth-child(2)'), null, 'column column column');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DescTest/MultiLineTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@desc} */\ndescribe('TestDescMultiLine:', ()=> {\n  const doc = readDoc('class/src/Desc/MultiLine.js~TestDescMultiLine.html');\n\n  describe('in summary', ()=> {\n    it('has first sentence desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method1.');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method2\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method2.');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method3\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method3.');\n      });\n    });\n  });\n\n  describe('in details:', ()=>{\n    it('has all sentence desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method1. this is second line.');\n      });\n\n      findParent(doc, '[id=\"instance-method-method2\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method2. this is second sentence.');\n      });\n\n      findParent(doc, '[id=\"instance-method-method3\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method3. this is second sentence.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DescTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@desc} */\ndescribe('testDescVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testDescVariable\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is testDescVariable.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testDescVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is testDescVariable.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DestructuringTest/ArrayTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@param} */\ndescribe('TestDestructuringArray', ()=> {\n  const doc = readDoc('class/src/Destructuring/Array.js~TestDestructuringArray.html');\n\n  describe('in summary', ()=> {\n    it('has array destructuring', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'method1(p: number[])');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has array destructuring.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'method1(p: number[])');\n        assert.includes(doc, 'table.params', 'p number[] this is p.');\n        assert.includes(doc, 'table.params', 'p[0] number this is first of p.');\n        assert.includes(doc, 'table.params', 'p[1] number this is second of p.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DestructuringTest/ObjectTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@param} */\ndescribe('TestDestructuringObject', ()=> {\n  const doc = readDoc('class/src/Destructuring/Object.js~TestDestructuringObject.html');\n\n  describe('in summary', ()=> {\n    it('has object destructuring', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'method1(p: Object)');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has object destructuring.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'method1(p: Object)');\n        assert.includes(doc, 'table.params', 'p Object this is object p.');\n        assert.includes(doc, 'table.params', 'p.p1 number this is property p1 of p.');\n        assert.includes(doc, 'table.params', 'p.p2 string this is property p2 of p.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/DuplicationTest/DefinitionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {DocResolver#_resolveDuplication} */\ndescribe('TestDuplicationDefinition', ()=> {\n  const doc = readDoc('class/src/Duplication/Definition.js~TestDuplicationDefinition.html');\n\n  describe('in summary', ()=> {\n    it('has setter/getter/method.', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-set-value\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public set value: number');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-get-value\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public get value: number');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-onClick\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public onClick(p: number)');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has setter/getter/method.', ()=>{\n      findParent(doc, '[id=\"instance-set-value\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, null, 'public set value: number');\n      });\n\n      findParent(doc, '[id=\"instance-get-value\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, null, 'public get value: number');\n      });\n\n      findParent(doc, '[id=\"instance-method-onClick\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, null, 'public onClick(p: number)');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/EmitsTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@emits} */\ndescribe('testEmitsFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-function-testEmitsFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"emitName\"] [href$=\"TestEmitsFunctionEvent.html\"]', 'TestEmitsFunctionEvent');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/EmitsTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@emits} */\ndescribe('TestEmitsMethod', ()=> {\n  const doc = readDoc('class/src/Emits/Method.js~TestEmitsMethod.html');\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        findParent(doc, '[data-ice=\"emit\"] [href$=\"TestEmitsMethodEvent1.html\"]', '[data-ice=\"emit\"]', (doc)=>{\n          assert.includes(doc, 'a', 'TestEmitsMethodEvent1');\n          assert.includes(doc, 'a', 'class/src/Emits/Method.js~TestEmitsMethodEvent1.html', 'href');\n          assert.includes(doc, null, 'TestEmitsMethodEvent1 emits event when foo');\n        });\n\n        findParent(doc, '[data-ice=\"emit\"] [href$=\"TestEmitsMethodEvent2.html\"]', '[data-ice=\"emit\"]', (doc)=>{\n          assert.includes(doc, 'a', 'TestEmitsMethodEvent2');\n          assert.includes(doc, 'a', 'class/src/Emits/Method.js~TestEmitsMethodEvent2.html', 'href');\n          assert.includes(doc, null, 'TestEmitsMethodEvent2 emits event when bar');\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExamleTest/CaptionTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/** @test {AbstractDoc#@example} */\ndescribe('TestExampleCaption', ()=> {\n  const doc = readDoc('class/src/Example/Caption.js~TestExampleCaption.html');\n\n  describe('in self detail', ()=> {\n    it('has caption of example.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"exampleDoc\"] [data-ice=\"exampleCaption\"]', 'this is caption');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExamleTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@example} */\ndescribe('TestExampleClass', ()=> {\n  const doc = readDoc('class/src/Example/Class.js~TestExampleClass.html');\n\n  describe('in self detail', ()=> {\n    it('has example.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"exampleDoc\"]:nth-of-type(1)', 'const foo = 123; console.log(foo);');\n      assert.includes(doc, '.self-detail [data-ice=\"exampleDoc\"]:nth-of-type(2)', 'const bar = 123; console.log(bar);');\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has example.', ()=>{\n      findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"exampleDoc\"]', 'const foo = 123;');\n      });\n\n      findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"exampleDoc\"]', 'const foo = 123;');\n      });\n\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"exampleDoc\"]', 'const foo = 123;');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExamleTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@example} */\ndescribe('testExampleFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-function-testExampleFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"exampleDoc\"]', 'const foo = 123;');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExamleTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@example} */\ndescribe('testDescVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testExampleVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"exampleDoc\"]', 'const foo = 123;');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExperimentalTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@experimental} */\ndescribe('TestExperimentalClass', ()=> {\n  const doc = readDoc('class/src/Experimental/Class.js~TestExperimentalClass.html');\n\n  describe('in self detail', ()=> {\n    it('has desc.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"experimental\"]', 'this class is experimental. this is experimental');\n    });\n  });\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-member-p1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this member is experimental.');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this method is experimental.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this member is experimental.');\n      });\n\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this method is experimental.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExperimentalTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@experimental} */\ndescribe('testExperimentalFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testExperimentalFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this function is experimental.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-function-testExperimentalFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this function is experimental.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExperimentalTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@experimental} */\ndescribe('testExperimentalVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testExperimentalVariable\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this variable is experimental.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testExperimentalVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"experimental\"]', 'this variable is experimental.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExponentialOperatorTest/DefinitionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {ESParser} */\ndescribe('TestExponentiationOperatorDefinition', ()=> {\n  const doc = readDoc('class/src/ExponentiationOperator/Definition.js~TestExponentiationOperatorDefinition.html');\n\n  describe('in self detail', ()=> {\n    it('has desc.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"description\"]', 'this is TestExponentiationOperatorDefinition.');\n    });\n  });\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method1.');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method1.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/AnonymousClassTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/** @test {ClassDoc#@_name} */\ndescribe('TestExportAnonymousClass', ()=> {\n  const doc = readDoc('class/src/Export/AnonymousClass.js~AnonymousClass.html');\n\n  describe('in self detail', ()=> {\n    it('is named with anonymous.', ()=> {\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import AnonymousClass from 'esdoc-test-fixture/src/Export/AnonymousClass.js'`);\n      assert.includes(doc, '.self-detail [data-ice=\"name\"]', 'AnonymousClass');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/AnonymousFunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#@_name} */\ndescribe('testExportAnonymousFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-AnonymousFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public AnonymousFunction()');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-function-AnonymousFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public AnonymousFunction()');\n        assert.includes(doc, '[data-ice=\"importPath\"]', `import AnonymousFunction from 'esdoc-test-fixture/src/Export/AnonymousFunction.js'`);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/ArrowFunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#@_name} */\ndescribe('test export arrow function', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has default import path with direct arrow function definition.', ()=> {\n    findParent(doc, '[id=\"static-function-ArrowFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import ArrowFunction from 'esdoc-test-fixture/src/Export/ArrowFunction.js'`);\n    });\n  });\n\n  it('has named import path with direct arrow function definition.', ()=>{\n    findParent(doc, '[id=\"static-function-testExportArrowFunction2\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportArrowFunction2} from 'esdoc-test-fixture/src/Export/ArrowFunction.js'`);\n    });\n  });\n\n  it('is not documented with direct arrow function expression', ()=> {\n    try {\n      findParent(doc, '[id=\"static-function-testExportArrowFunction3\"]', '[data-ice=\"detail\"]', ()=>{});\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n\n  it('has named import path with undocument', ()=>{\n    findParent(doc, '[id=\"static-function-testExportArrowFunction4\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportArrowFunction4} from 'esdoc-test-fixture/src/Export/ArrowFunction.js'`);\n    });\n  });\n\n  it('has named import path with indirect function definition.', ()=> {\n    findParent(doc, '[id=\"static-function-testExportArrowFunction5\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportArrowFunction5} from 'esdoc-test-fixture/src/Export/ArrowFunction.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/ClassIndirectDefaultTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/**\n * @test {AbstractDoc#@_export}\n * @test {ClassDocBuilder@_buildClassDoc}\n */\ndescribe('test export class indirect default', ()=> {\n  it('has default import path with indirect class definition.', ()=> {\n    const doc = readDoc('class/src/Export/ClassIndirectDefault.js~TestExportClassIndirectDefault.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import TestExportClassIndirectDefault from 'esdoc-test-fixture/src/Export/ClassIndirectDefault.js'`);\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/ClassTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/**\n * @test {AbstractDoc#@_export}\n * @test {ClassDocBuilder@_buildClassDoc}\n */\ndescribe('test export class', ()=> {\n  it('has default import path with direct class definition.', ()=> {\n    const doc = readDoc('class/src/Export/Class.js~TestExportClass1.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import TestExportClass1 from 'esdoc-test-fixture/src/Export/Class.js'`);\n  });\n\n  it('has named import path with direct.', ()=>{\n    const doc = readDoc('class/src/Export/Class.js~TestExportClass2.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import {TestExportClass2} from 'esdoc-test-fixture/src/Export/Class.js'`);\n  });\n\n  it('has named import path with indirect class definition', ()=>{\n    const doc = readDoc('class/src/Export/Class.js~TestExportClass3.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import {TestExportClass3} from 'esdoc-test-fixture/src/Export/Class.js'`);\n  });\n\n  it('has named import path with indirect class expression', ()=>{\n    const doc = readDoc('class/src/Export/Class.js~TestExportClass4.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import {TestExportClass4} from 'esdoc-test-fixture/src/Export/Class.js'`);\n  });\n\n  it('has named import path with undocument', ()=>{\n    const doc = readDoc('class/src/Export/Class.js~TestExportClass5.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import {TestExportClass5} from 'esdoc-test-fixture/src/Export/Class.js'`);\n  });\n\n  it('is not documented.', ()=> {\n    try {\n      readDoc('class/src/Export/Class.js~TestExportClass6.html');\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/DefaultTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/**\n * @test {AbstractDoc#@_export}\n * @test {ClassDocBuilder@_buildClassDoc}\n */\ndescribe('TestExportDefault', ()=> {\n  const doc = readDoc('class/src/Export/Default.js~TestExportDefault.html');\n  it('has default import path.', ()=> {\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import TestExportDefault from 'esdoc-test-fixture/src/Export/Default.js'`);\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/ExtendTest.js",
    "content": "import {readDoc} from './../../util.js';\n\n/** @test {DocResolver#_resolveNecessary} */\ndescribe('TestExportExtendsInner', ()=> {\n  it('is documented.', ()=> {\n    readDoc('class/src/Export/Extends.js~TestExportExtendsInner.html');\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/FunctionIndirectDefaultTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#@_name} */\ndescribe('test export function indirect default', ()=> {\n  const doc = readDoc('function/index.html');\n  it('has default import path with indirect function definition', ()=>{\n    findParent(doc, '[id=\"static-function-testExportFunctionIndirectDefault\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportFunctionIndirectDefault from 'esdoc-test-fixture/src/Export/FunctionIndirectDefault.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#@_name} */\ndescribe('test export function', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has default import path with direct function definition.', ()=> {\n    findParent(doc, '[id=\"static-function-testExportFunction1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportFunction1 from 'esdoc-test-fixture/src/Export/Function.js'`);\n    });\n  });\n\n  it('has named import path with direct function definition.', ()=>{\n    findParent(doc, '[id=\"static-function-testExportFunction2\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportFunction2} from 'esdoc-test-fixture/src/Export/Function.js'`);\n    });\n  });\n\n  it('has named import path with direct function expression', ()=>{\n    findParent(doc, '[id=\"static-function-testExportFunction3\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportFunction3} from 'esdoc-test-fixture/src/Export/Function.js'`);\n    });\n  });\n\n  it('is not documented with direct function definition', ()=> {\n    try {\n      findParent(doc, '[id=\"static-function-testExportFunction4\"]', '[data-ice=\"detail\"]', ()=>{});\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n\n  it('is not documented with direct function expression', ()=> {\n    try {\n      findParent(doc, '[id=\"static-function-testExportFunction5\"]', '[data-ice=\"detail\"]', ()=>{});\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n\n  it('has named import path with direct generator function definition.', ()=>{\n    findParent(doc, '[id=\"static-function-testExportFunction6\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportFunction6} from 'esdoc-test-fixture/src/Export/Function.js'`);\n    });\n  });\n\n  it('has named import path with undocument', ()=>{\n    findParent(doc, '[id=\"static-function-testExportFunction7\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportFunction7} from 'esdoc-test-fixture/src/Export/Function.js'`);\n    });\n  });\n\n  it('has named import path with indirect function definition.', ()=> {\n    findParent(doc, '[id=\"static-function-testExportFunction8\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportFunction8} from 'esdoc-test-fixture/src/Export/Function.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/MultipleTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {DocFactory#_inspectExportNamedDeclaration} */\ndescribe('test multiple export', ()=> {\n  it('is documented.', ()=>{\n    const doc1 = readDoc('class/src/Export/Multiple.js~TestExportMultiple.html');\n    assert.includes(doc1, '.header-notice [data-ice=\"importPath\"]', `import {TestExportMultiple} from 'esdoc-test-fixture/src/Export/Multiple.js'`);\n\n    const doc2 = readDoc('variable/index.html');\n    findParent(doc2, '[id=\"static-variable-testExportMultiple\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportMultiple} from 'esdoc-test-fixture/src/Export/Multiple.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/NamedTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/**\n * @test {AbstractDoc#@_export}\n * @test {ClassDocBuilder@_buildClassDoc}\n */\ndescribe('TestExportNamed', ()=> {\n  it('has named import path.', ()=>{\n    const doc = readDoc('class/src/Export/Named.js~TestExportNamed.html');\n    assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', `import {TestExportNamed} from 'esdoc-test-fixture/src/Export/Named.js'`);\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/NewExpressionIndirectTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/**\n * @test {DocFactory#_inspectExportDefaultDeclaration}\n * @test {DocFactory#_inspectExportNamedDeclaration}\n */\ndescribe('test default export with new expression and indirect.', ()=> {\n  it('has instance description', ()=> {\n    const doc = readDoc('class/src/Export/NewExpressionIndirect.js~TestExportNewExpressionIndirect.html');\n\n    find(doc, '[data-ice=\"instanceDocs\"]', (doc)=>{\n      assert.includes(doc, null, 'You can directly use an instance of this class. testExportNewExpressionIndirect');\n      assert.includes(doc, 'a', 'testExportNewExpressionIndirect');\n      assert.includes(doc, 'a', 'variable/index.html#static-variable-testExportNewExpressionIndirect', 'href');\n    });\n\n    // does not have import path because the class is not clear exported.\n    try {\n      assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', 'import');\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n\n  it('has class description', ()=>{\n    const doc = readDoc('variable/index.html');\n\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testExportNewExpressionIndirect\"]', '[data-ice=\"target\"]', (doc)=>{\n      assert.includes(doc, null, 'public testExportNewExpressionIndirect: TestExportNewExpressionIndirect');\n    });\n\n    findParent(doc, '#static-variable-testExportNewExpressionIndirect', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, 'h3', 'public testExportNewExpressionIndirect: TestExportNewExpressionIndirect');\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportNewExpressionIndirect from 'esdoc-test-fixture/src/Export/NewExpressionIndirect.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/NewExpressionPropertyTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/**\n * @test {DocFactory#_inspectExportDefaultDeclaration}\n * @test {DocFactory#_inspectExportNamedDeclaration}\n */\ndescribe('test default export with new expression and property.', ()=> {\n  it('has instance description', ()=> {\n    const doc = readDoc('class/src/Export/NewExpressionProperty.js~TestExportNewExpressionProperty.html');\n\n    find(doc, '[data-ice=\"instanceDocs\"]', (doc)=>{\n      assert.includes(doc, null, 'You can directly use an instance of this class. testExportNewExpressionProperty');\n      assert.includes(doc, 'a', 'testExportNewExpressionProperty');\n      assert.includes(doc, 'a', 'variable/index.html#static-variable-testExportNewExpressionProperty', 'href');\n    });\n\n    // does not have import path because the class is not clear exported.\n    try {\n      assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', 'import');\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n\n  it('has class description', ()=>{\n    const doc = readDoc('variable/index.html');\n\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testExportNewExpressionProperty\"]', '[data-ice=\"target\"]', (doc)=>{\n      assert.includes(doc, null, 'public testExportNewExpressionProperty: TestExportNewExpressionProperty');\n    });\n\n    findParent(doc, '#static-variable-testExportNewExpressionProperty', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, 'h3', 'public testExportNewExpressionProperty: TestExportNewExpressionProperty');\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportNewExpressionProperty from 'esdoc-test-fixture/src/Export/NewExpressionProperty.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/NewExpressionTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/**\n * @test {DocFactory#_inspectExportDefaultDeclaration}\n * @test {DocFactory#_inspectExportNamedDeclaration}\n */\ndescribe('test default export with new expression.', ()=> {\n  describe('default export', ()=>{\n    it('has instance description', ()=> {\n      const doc = readDoc('class/src/Export/NewExpression.js~TestExportNewExpression.html');\n\n      find(doc, '[data-ice=\"instanceDocs\"]', (doc)=>{\n        assert.includes(doc, null, 'You can directly use an instance of this class. testExportNewExpression');\n        assert.includes(doc, 'a', 'testExportNewExpression');\n        assert.includes(doc, 'a', 'variable/index.html#static-variable-testExportNewExpression', 'href');\n      });\n\n      // does not have import path because the class is not clear exported.\n      try {\n        assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', 'import');\n      } catch (e) {\n        return;\n      }\n      assert(false);\n    });\n\n    it('has class description', ()=>{\n      const doc = readDoc('variable/index.html');\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testExportNewExpression\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, null, 'public testExportNewExpression: TestExportNewExpression');\n      });\n\n      findParent(doc, '#static-variable-testExportNewExpression', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public testExportNewExpression: TestExportNewExpression');\n        assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportNewExpression from 'esdoc-test-fixture/src/Export/NewExpression.js'`);\n      });\n    });\n  });\n\n  describe('named export', ()=>{\n    it('has instance description', ()=> {\n      const doc = readDoc('class/src/Export/NewExpression.js~TestExportNewExpression2.html');\n\n      find(doc, '[data-ice=\"instanceDocs\"]', (doc)=>{\n        assert.includes(doc, null, 'You can directly use an instance of this class. testExportNewExpression2');\n        assert.includes(doc, 'a', 'testExportNewExpression2');\n        assert.includes(doc, 'a', 'variable/index.html#static-variable-testExportNewExpression2', 'href');\n      });\n\n      // does not have import path because the class is not clear exported.\n      try {\n        assert.includes(doc, '.header-notice [data-ice=\"importPath\"]', 'import');\n      } catch (e) {\n        return;\n      }\n      assert(false);\n    });\n\n    it('has class description', ()=>{\n      const doc = readDoc('variable/index.html');\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testExportNewExpression2\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, null, 'public testExportNewExpression2: TestExportNewExpression2');\n      });\n\n      findParent(doc, '#static-variable-testExportNewExpression2', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public testExportNewExpression2: TestExportNewExpression2');\n        assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportNewExpression2} from 'esdoc-test-fixture/src/Export/NewExpression.js'`);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/VariableIndirectDefaultTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {VariableDoc#@_name} */\ndescribe('test export variable indirect default', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  it('has default import path with indirect variable definition.', ()=> {\n    findParent(doc, '[id=\"static-variable-testExportVariableIndirectDefault\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportVariableIndirectDefault from 'esdoc-test-fixture/src/Export/VariableIndirectDefault.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExportTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {VariableDoc#@_name} */\ndescribe('test export variable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  it('has default import path with direct variable definition.', ()=> {\n    findParent(doc, '[id=\"static-variable-testExportVariable1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import testExportVariable1 from 'esdoc-test-fixture/src/Export/Variable.js'`);\n    });\n  });\n\n  it('has named import path with direct variable definition.', ()=>{\n    findParent(doc, '[id=\"static-variable-testExportVariable2\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportVariable2} from 'esdoc-test-fixture/src/Export/Variable.js'`);\n    });\n  });\n\n  it('is not documented with direct variable definition', ()=> {\n    try {\n      findParent(doc, '[id=\"static-variable-testExportVariable3\"]', '[data-ice=\"detail\"]', ()=>{});\n    } catch (e) {\n      return;\n    }\n    assert(false);\n  });\n\n  it('has named import path with none doc comment', ()=>{\n    findParent(doc, '[id=\"static-variable-testExportVariable4\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportVariable4} from 'esdoc-test-fixture/src/Export/Variable.js'`);\n    });\n\n    findParent(doc, '[id=\"static-variable-testExportVariable5\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportVariable5} from 'esdoc-test-fixture/src/Export/Variable.js'`);\n    });\n  });\n\n  it('has named import path with indirect variable definition.', ()=>{\n    findParent(doc, '[id=\"static-variable-testExportVariable6\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportVariable6} from 'esdoc-test-fixture/src/Export/Variable.js'`);\n    });\n  });\n\n  it('has named import path with unknown type.', ()=>{\n    findParent(doc, '[id=\"static-variable-testExportVariable7\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"importPath\"]', `import {testExportVariable7} from 'esdoc-test-fixture/src/Export/Variable.js'`);\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/BuiltinTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDoc#@extends} */\ndescribe('TestExtendsBuiltin', ()=> {\n  const doc = readDoc('class/src/Extends/Builtin.js~TestExtendsBuiltin.html');\n\n  it('has extends chain.', ()=> {\n    find(doc, '.self-detail [data-ice=\"extendsChain\"]', (doc)=>{\n      assert.includes(doc, null, 'Array → TestExtendsBuiltin');\n      assert.includes(doc, 'a', 'Array');\n      assert.includes(doc, 'a', 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array', 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/DeepTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/**\n * @test {ClassDoc#@extends}\n * @test {ClassDocBuilder#_buildInheritedSummaryHTML}\n */\ndescribe('test deep extends', ()=>{\n  describe('TestExtendsDeepSquare', ()=> {\n    const doc = readDoc('class/src/Extends/Deep.js~TestExtendsDeepSquare.html');\n\n    it('has extends chain.', ()=> {\n      find(doc, '.self-detail [data-ice=\"extendsChain\"]', (doc)=>{\n        assert.includes(doc, null, 'TestExtendsDeepShape → TestExtendsDeepRectangle → TestExtendsDeepSquare');\n        assert.includes(doc, 'a[href$=\"Array\"]', 'Array');\n        assert.includes(doc, 'a[href=\"class/src/Extends/Deep.js~TestExtendsDeepShape.html\"]', 'TestExtendsDeepShape');\n        assert.includes(doc, 'a[href=\"class/src/Extends/Deep.js~TestExtendsDeepRectangle.html\"]', 'TestExtendsDeepRectangle');\n      });\n    });\n\n    it('has super^1 class methods and more.', ()=>{\n      findParent(doc, '[data-ice=\"inheritedSummary\"] a[href$=\"TestExtendsDeepRectangle.html\"]', '[data-ice=\"summary\"]', (doc)=>{\n        assert.includes(doc, 'thead', 'From class TestExtendsDeepRectangle');\n        assert.includes(doc, 'thead a', 'class/src/Extends/Deep.js~TestExtendsDeepRectangle.html', 'href');\n\n        assert.includes(doc, 'a[href$=\"#static-get-staticValueRectangle\"]', 'staticValueRectangle');\n        assert.includes(doc, 'a[href$=\"#static-set-staticValueRectangle\"]', 'staticValueRectangle');\n        assert.includes(doc, 'a[href$=\"#static-member-staticPRectangle\"]', 'staticPRectangle');\n        assert.includes(doc, 'a[href$=\"#static-method-staticMethodRectangle\"]', 'staticMethodRectangle');\n\n        assert.includes(doc, 'a[href$=\"#instance-get-valueRectangle\"]', 'valueRectangle');\n        assert.includes(doc, 'a[href$=\"#instance-set-valueRectangle\"]', 'valueRectangle');\n        assert.includes(doc, 'a[href$=\"#instance-member-pRectangle\"]', 'pRectangle');\n        assert.includes(doc, 'a[href$=\"#instance-method-methodRectangle\"]', 'methodRectangle');\n      });\n    });\n\n    it('has super^2 class methods and more.', ()=>{\n      findParent(doc, '[data-ice=\"inheritedSummary\"] a[href$=\"TestExtendsDeepShape.html\"]', '[data-ice=\"summary\"]', (doc)=>{\n        assert.includes(doc, 'thead', 'From class TestExtendsDeepShape');\n        assert.includes(doc, 'thead a', 'class/src/Extends/Deep.js~TestExtendsDeepShape.html', 'href');\n\n        assert.includes(doc, 'a[href$=\"#static-get-staticValueShape\"]', 'staticValueShape');\n        assert.includes(doc, 'a[href$=\"#static-set-staticValueShape\"]', 'staticValueShape');\n        assert.includes(doc, 'a[href$=\"#static-member-staticPShape\"]', 'staticPShape');\n        assert.includes(doc, 'a[href$=\"#static-method-staticMethodShape\"]', 'staticMethodShape');\n\n        assert.includes(doc, 'a[href$=\"#instance-get-valueShape\"]', 'valueShape');\n        assert.includes(doc, 'a[href$=\"#instance-set-valueShape\"]', 'valueShape');\n        assert.includes(doc, 'a[href$=\"#instance-member-pShape\"]', 'pShape');\n        assert.includes(doc, 'a[href$=\"#instance-method-methodShape\"]', 'methodShape');\n      });\n    });\n  });\n\n  describe('TestExtendsDeepRectangle', ()=>{\n    const doc = readDoc('class/src/Extends/Deep.js~TestExtendsDeepRectangle.html');\n\n    it('has direct subclass.', ()=> {\n      find(doc, '.self-detail [data-ice=\"directSubclass\"]', (doc)=>{\n        assert.includes(doc, 'a[href=\"class/src/Extends/Deep.js~TestExtendsDeepSquare.html\"]', 'TestExtendsDeepSquare');\n      });\n    });\n  });\n\n  describe('TestExtendsDeepShape', ()=>{\n    const doc = readDoc('class/src/Extends/Deep.js~TestExtendsDeepShape.html');\n\n    it('has direct subclass.', ()=> {\n      find(doc, '.self-detail [data-ice=\"directSubclass\"]', (doc)=>{\n        assert.includes(doc, 'a[href=\"class/src/Extends/Deep.js~TestExtendsDeepRectangle.html\"]', 'TestExtendsDeepRectangle');\n      });\n    });\n\n    it('has indirect subclass.', ()=> {\n      find(doc, '.self-detail [data-ice=\"indirectSubclass\"]', (doc)=>{\n        assert.includes(doc, 'a[href=\"class/src/Extends/Deep.js~TestExtendsDeepSquare.html\"]', 'TestExtendsDeepSquare');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/ExpressionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDoc#@extends} */\ndescribe('TestExtendsExpression', ()=> {\n  const doc = readDoc('class/src/Extends/Expression.js~TestExtendsExpression.html');\n\n  it('has expression extends.', ()=> {\n    find(doc, '.self-detail [data-ice=\"expressionExtends\"]', (doc)=>{\n      assert.includes(doc, 'pre code', 'class TestExtendsExpression extends TestExtendsExpressionInner(123)');\n    });\n  });\n\n  it('has extends chain.', ()=> {\n    find(doc, '.self-detail [data-ice=\"extendsChain\"]', (doc)=>{\n      assert.includes(doc, null, 'TestExtendsExpressionInner → TestExtendsExpression');\n      assert.includes(doc, 'a[href$=\"#static-function-TestExtendsExpressionInner\"]', 'TestExtendsExpressionInner');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/InnerTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/**\n * @test {ClassDoc#@extends}\n * @test {DocResolver@_resolveNecessary}\n */\ndescribe('TestExtendsInner', ()=> {\n  it('has extends chain.', ()=>{\n    const doc = readDoc('class/src/Extends/Inner.js~TestExtendsInner.html');\n    find(doc, '.self-detail [data-ice=\"extendsChain\"]', (doc)=>{\n      assert.includes(doc, null, '_TestExtendsInner → TestExtendsInner');\n      assert.includes(doc, 'a[href$=\"_TestExtendsInner.html\"]', '_TestExtendsInner');\n    });\n  });\n\n  it('has direct subclass.', ()=>{\n    const doc = readDoc('class/src/Extends/Inner.js~_TestExtendsInner.html');\n    find(doc, '.self-detail [data-ice=\"directSubclass\"]', (doc)=>{\n      assert.includes(doc, 'a[href=\"class/src/Extends/Inner.js~TestExtendsInner.html\"]', 'TestExtendsInner');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/MixinTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/**\n * @test {ClassDoc#@extends}\n * @test {DocResolver#_resolveNecessary}\n */\ndescribe('TestExtendsMixin', ()=> {\n  const doc = readDoc('class/src/Extends/Mixin.js~TestExtendsMixin.html');\n\n  it('has expression extends.', ()=> {\n    find(doc, '.self-detail [data-ice=\"expressionExtends\"]', (doc)=>{\n      assert.includes(doc, 'pre code', 'class TestExtendsMixin extends mixin(TestExtendsMixinInner1, TestExtendsMixinInner2)');\n    });\n  });\n\n  it('has extends chain.', ()=> {\n    find(doc, '.self-detail [data-ice=\"mixinExtends\"]', (doc)=>{\n      assert.includes(doc, null, 'TestExtendsMixinInner1, TestExtendsMixinInner2');\n      assert.includes(doc, 'a[href=\"class/src/Extends/Mixin.js~TestExtendsMixinInner1.html\"]', 'TestExtendsMixinInner1');\n      assert.includes(doc, 'a[href=\"class/src/Extends/Mixin.js~TestExtendsMixinInner2.html\"]', 'TestExtendsMixinInner2');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/OuterTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/** @test {ClassDoc#@extends} */\ndescribe('TestExtendsOuter', ()=> {\n  const doc = readDoc('class/src/Extends/Outer.js~TestExtendsOuter.html');\n\n  it('has extends chain.', ()=> {\n    find(doc, '.self-detail [data-ice=\"extendsChain\"]', (doc)=>{\n      assert.includes(doc, null, 'Array → TestExtendsBuiltin → TestExtendsOuter');\n      assert.includes(doc, 'a[href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\"]', 'Array');\n      assert.includes(doc, 'a[href=\"class/src/Extends/Builtin.js~TestExtendsBuiltin.html\"]', 'TestExtendsBuiltin');\n    });\n  });\n\n  it('has inherited methods and more', ()=>{\n    it('has super class methods and more.', ()=>{\n      findParent(doc, '[data-ice=\"inheritedSummary\"] a[href$=\"TestExtendsBuiltin.html\"]', '[data-ice=\"summary\"]', (doc)=>{\n        assert.includes(doc, 'thead', 'From class TestExtendsBuiltin');\n        assert.includes(doc, 'thead a', 'class/src/Extends/Builtin.js~TestExtendsBuiltin.html', 'href');\n        assert.includes(doc, 'a[href$=\"#instance-method-method1\"]', 'method1');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExtendsTest/PropertyTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDoc#@extends} */\ndescribe('TestExtendsProperty', ()=> {\n  const doc = readDoc('class/src/Extends/Property.js~TestExtendsProperty.html');\n\n  it('has extends chain.', ()=> {\n    find(doc, '.self-detail [data-ice=\"extendsChain\"]', (doc)=>{\n      assert.includes(doc, null, 'TestExtendsPropertyPackage~obj.TestExtendsPropertyInner → TestExtendsProperty');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ExternalTest/DefinitionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {ExternalDoc#@_name} */\ndescribe('TestExternalDefinition', ()=> {\n  const doc = readDoc('index.html');\n\n  it('has external document.', ()=> {\n    findParent(doc, '[data-ice=\"nav\"] [data-ice=\"doc\"] a[href=\"http://example.com\"]', '[data-ice=\"doc\"]', (doc)=> {\n      assert.includes(doc, '[data-ice=\"name\"]', 'TestExternalDefinition');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/GeneratorTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@_generator} */\ndescribe('testGeneratorFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has generator mark', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testGeneratorFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public * testGeneratorFunction()');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has generator mark.', ()=>{\n      findParent(doc, '[id=\"static-function-testGeneratorFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public * testGeneratorFunction()');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/GeneratorTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@_generator} */\ndescribe('TestGeneratorMethod', ()=> {\n  const doc = readDoc('class/src/Generator/Method.js~TestGeneratorMethod.html');\n\n  describe('in summary', ()=> {\n    it('has generator mark.', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public * method1()');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has generator mark.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public * method1()');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/IgnoreTest/ClassTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {DocResolver#_resolveIgnore */\ndescribe('test ignore class', ()=>{\n  describe('TestIgnoreClass1', ()=> {\n    it('is not documented.', ()=> {\n      assert.throws(()=> readDoc('class/src/Ignore/Class.js~TestIgnoreClass1.html'));\n    });\n  });\n\n  describe('TestIgnoreClass2', ()=>{\n    const doc = readDoc('class/src/Ignore/Class.js~TestIgnoreClass2.html');\n\n    it('does not have ignored member.', ()=>{\n      assert.throws(()=> find(doc, '[data-ice=\"summary\"] [href$=\"#instance-member-p1\"]', ()=>{}));\n      assert.throws(()=> find(doc, '[id=\"instance-member-p1\"]', ()=>{}));\n    });\n\n    it('does not have ignored method.', ()=>{\n      assert.throws(()=> find(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', ()=>{}));\n      assert.throws(()=> find(doc, '[id=\"instance-method-method1\"]', ()=>{}));\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/IgnoreTest/FunctionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {DocResolver#_resolveIgnore */\ndescribe('testIgnoreFunction', ()=>{\n  const doc = readDoc('function/index.html');\n\n  it('is not documented.', ()=>{\n    assert.throws(()=> find(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testIgnoreFunction\"]', ()=>{}));\n    assert.throws(()=> find(doc, '[id=\"static-function-testIgnoreFunction\"]', ()=>{}));\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/IgnoreTest/VariableTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {DocResolver#_resolveIgnore */\ndescribe('testIgnoreVariable', ()=>{\n  const doc = readDoc('variable/index.html');\n\n  it('is not documented.', ()=>{\n    assert.throws(()=> find(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testIgnoreVariable\"]', ()=>{}));\n    assert.throws(()=> find(doc, '[id=\"static-variable-testIgnoreVariable\"]', ()=>{}));\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/InterfaceTest/DefinitionTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDoc#@interface} */\ndescribe('TestInterfaceDefinition', ()=> {\n  const doc = readDoc('class/src/Interface/Definition.js~TestInterfaceDefinition.html');\n\n  it('has interface mark.', ()=> {\n    assert.includes(doc, '.header-notice [data-ice=\"kind\"]', 'interface');\n  });\n\n  it('has direct subclass.', ()=>{\n    find(doc, '.self-detail [data-ice=\"directImplemented\"]', (doc)=>{\n      assert.includes(doc, 'a[href=\"class/src/Interface/Implements.js~TestInterfaceImplements.html\"]', 'TestInterfaceImplements');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/InterfaceTest/ImplementsTest.js",
    "content": "import {readDoc, assert, find} from './../../util.js';\n\n/** @test {ClassDoc#@implements} */\ndescribe('TestInterfaceImplements', ()=> {\n  const doc = readDoc('class/src/Interface/Implements.js~TestInterfaceImplements.html');\n\n  it('has implements.', ()=>{\n    find(doc, '.self-detail [data-ice=\"implements\"]', (doc)=>{\n      assert.includes(doc, 'ul', 'TestInterfaceDefinition, TestInterfaceImplementsInner');\n      assert.includes(doc, 'ul a[href=\"class/src/Interface/Definition.js~TestInterfaceDefinition.html\"]', 'TestInterfaceDefinition');\n      assert.includes(doc, 'ul a[href=\"class/src/Interface/Implements.js~TestInterfaceImplementsInner.html\"]', 'TestInterfaceImplementsInner');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/LinkTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {DocResolver#_resolveLink} */\ndescribe('TestLinkClass', ()=> {\n  const doc = readDoc('class/src/Link/Class.js~TestLinkClass.html');\n\n  it('has link from class.', ()=> {\n    assert.includes(doc, '.self-detail [data-ice=\"description\"] a[href=\"function/index.html#static-function-testLinkFunction\"]', 'testLinkFunction');\n  });\n\n  it('has link from constructor.', ()=>{\n    findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"function/index.html#static-function-testLinkFunction\"]', 'testLinkFunction');\n    });\n  });\n\n  it('has link from member.', ()=>{\n    findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"function/index.html#static-function-testLinkFunction\"]', 'testLinkFunction');\n    });\n  });\n\n  it('has link from method.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"function/index.html#static-function-testLinkFunction\"]', 'testLinkFunction');\n    });\n  });\n});\n\n/** @test {DocResolver#_resolveLink} */\ndescribe('TestLinkClass3', () => {\n  const doc = readDoc('class/src/Link/Class.js~TestLinkClass3.html');\n\n  it('has link to inherited class method.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1FooBar\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"class/src/Link/Class.js~TestLinkClass.html#instance-method-method1\"]', 'TestLinkClass2#method1');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/LinkTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {DocResolver#_resolveLink} */\ndescribe('testLinkFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has link.', ()=>{\n    findParent(doc, '[id=\"static-function-testLinkFunction\"]', '[data-ice=\"detail\"]', (doc)=> {\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"class/src/Link/Class.js~TestLinkClass.html\"]', 'TestLinkClass');\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"class/src/Link/Class.js~TestLinkClass.html#instance-member-p1\"]', 'TestLinkClass#p1');\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"class/src/Link/Class.js~TestLinkClass.html#instance-method-method1\"]', 'TestLinkClass#method1');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/LinkTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {DocResolver#_resolveLink} */\ndescribe('testLinkVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  it('has link.', ()=>{\n    findParent(doc, '[id=\"static-variable-testLinkVariable\"]', '[data-ice=\"detail\"]', (doc)=> {\n      assert.includes(doc, '[data-ice=\"description\"] a[href=\"class/src/Link/Class.js~TestLinkClass.html\"]', 'TestLinkClass');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ListensTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@listens} */\ndescribe('testListensFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has listens.', ()=>{\n    findParent(doc, '[id=\"static-function-testListensFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"listen\"] a[href=\"class/src/Listens/Function.js~TestListensFunctionEvent.html\"]', 'TestListensFunctionEvent');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ListensTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@listens} */\ndescribe('TestListensMethod', ()=> {\n  const doc = readDoc('class/src/Listens/Method.js~TestListensMethod.html');\n\n  it('has listens.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      findParent(doc, 'a[href=\"class/src/Listens/Method.js~TestListensMethodEvent1.html\"]', '[data-ice=\"listen\"]', (doc)=>{\n        assert.includes(doc, null, 'TestListensMethodEvent1 listen event because foo.');\n        assert.includes(doc, 'a[href=\"class/src/Listens/Method.js~TestListensMethodEvent1.html\"]', 'TestListensMethodEvent1');\n      });\n\n      findParent(doc, 'a[href=\"class/src/Listens/Method.js~TestListensMethodEvent2.html\"]', '[data-ice=\"listen\"]', (doc)=>{\n        assert.includes(doc, null, 'TestListensMethodEvent2 listen event because bar.');\n        assert.includes(doc, 'a[href=\"class/src/Listens/Method.js~TestListensMethodEvent2.html\"]', 'TestListensMethodEvent2');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ParamTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#@param} */\ndescribe('testParamFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has param.', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testParamFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public testParamFunction(p1: number, p2: TestClassDefinition)');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has param.', ()=>{\n      findParent(doc, '[id=\"static-function-testParamFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public testParamFunction(p1: number, p2: TestClassDefinition)');\n        assert.includes(doc, '.params tbody tr:nth-child(1)', 'p1 number this is p1.');\n        assert.includes(doc, '.params tbody tr:nth-child(2)', 'p2 TestClassDefinition this is p2.');\n        assert.includes(doc, '.params tbody tr:nth-child(2) a', 'class/src/Class/Definition.js~TestClassDefinition.html', 'href');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ParamTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@desc} */\ndescribe('TestParamMethod', ()=> {\n  const doc = readDoc('class/src/Param/Method.js~TestParamMethod.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public method1(p1: number, p2: TestClassDefinition)');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public method1(p1: number, p2: TestClassDefinition)');\n        assert.includes(doc, '.params tbody tr:nth-child(1)', 'p1 number this is p1.');\n        assert.includes(doc, '.params tbody tr:nth-child(2)', 'p2 TestClassDefinition this is p2.');\n        assert.includes(doc, '.params tbody tr:nth-child(2) a', 'class/src/Class/Definition.js~TestClassDefinition.html', 'href');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/PropertyTest/ReturnTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@property} */\ndescribe('TestPropertyReturn', ()=> {\n  const doc = readDoc('class/src/Property/Return.js~TestPropertyReturn.html');\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"returnProperties\"] tbody tr:nth-child(1)', 'x1 number this is x1 of return value.');\n        assert.includes(doc, '[data-ice=\"returnProperties\"] tbody tr:nth-child(2)', 'x2 TestClassDefinition this is x2 of return value.');\n        assert.includes(doc, '[data-ice=\"returnProperties\"] tbody tr:nth-child(2) a', 'class/src/Class/Definition.js~TestClassDefinition.html', 'href');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ReturnTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {FunctionDoc#@return} */\ndescribe('test return', ()=>{\n  const doc = readDoc('function/index.html');\n\n  describe('testReturnFunction1', ()=> {\n    describe('in summary', ()=> {\n      it('has return.', ()=> {\n        findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testReturnFunction1\"]', '[data-ice=\"target\"]', (doc)=> {\n          assert.includes(doc, null, 'public testReturnFunction1(): TestClassDefinition');\n        });\n      });\n    });\n\n    describe('in details', ()=>{\n      it('has return.', ()=>{\n        findParent(doc, '[id=\"static-function-testReturnFunction1\"]', '[data-ice=\"detail\"]', (doc)=>{\n          assert.includes(doc, 'h3', 'public testReturnFunction1(): TestClassDefinition');\n          assert.includes(doc, '[data-ice=\"returnParams\"] tbody tr', 'TestClassDefinition this is return value.');\n          assert.includes(doc, '[data-ice=\"returnParams\"] tbody tr a', 'class/src/Class/Definition.js~TestClassDefinition.html', 'href');\n        });\n      });\n    });\n  });\n\n  describe('testReturnFunction2', ()=> {\n    describe('in summary', ()=> {\n      it('has return.', ()=> {\n        findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testReturnFunction2\"]', '[data-ice=\"target\"]', (doc)=> {\n          assert.includes(doc, null, 'public testReturnFunction2(): number');\n        });\n      });\n    });\n\n    describe('in details', ()=>{\n      it('has return.', ()=>{\n        findParent(doc, '[id=\"static-function-testReturnFunction2\"]', '[data-ice=\"detail\"]', (doc)=>{\n          assert.includes(doc, 'h3', 'public testReturnFunction2(): number');\n          assert.includes(doc, '[data-ice=\"returnParams\"] tbody tr', 'number this is return value.');\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ReturnTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {MethodDoc#@return} */\ndescribe('TestReturnMethod', ()=> {\n  const doc = readDoc('class/src/Return/Method.js~TestReturnMethod.html');\n\n  describe('in summary', ()=> {\n    it('has return', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public method1(): number');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method2\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public method2(): TestClassDefinition');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public method1(): number');\n        assert.includes(doc, '[data-ice=\"returnParams\"] tbody tr', 'number this is return value.');\n      });\n\n      findParent(doc, '[id=\"instance-method-method2\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public method2(): TestClassDefinition');\n        assert.includes(doc, '[data-ice=\"returnParams\"] tbody tr', 'TestClassDefinition this is return value.');\n        assert.includes(doc, '[data-ice=\"returnParams\"] tbody tr a', 'class/src/Class/Definition.js~TestClassDefinition.html', 'href');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/SeeTest/ClassTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@see} */\ndescribe('TestSeeClass', ()=> {\n  const doc = readDoc('class/src/See/Class.js~TestSeeClass.html');\n\n  it('has see from class.', ()=> {\n    find(doc, '.self-detail [data-ice=\"see\"]', (doc)=>{\n      assert.includes(doc, 'a[href=\"http://foo.example.com\"]', 'http://foo.example.com');\n      assert.includes(doc, 'a[href=\"http://bar.example.com\"]', 'http://bar.example.com');\n    });\n  });\n\n  it('has see from constructor.', ()=>{\n    findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"see\"] a[href=\"http://example.com\"]', 'http://example.com');\n    });\n  });\n\n  it('has see from member.', ()=>{\n    findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"see\"] a[href=\"http://example.com\"]', 'http://example.com');\n    });\n  });\n\n  it('has see from method.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"see\"] a[href=\"http://example.com\"]', 'http://example.com');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/SeeTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@see} */\ndescribe('testSeeFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has see.', ()=>{\n    findParent(doc, '[id=\"static-function-testSeeFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"see\"] a[href=\"http://example.com\"]', 'http://example.com');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/SeeTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@see} */\ndescribe('testSeeVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  it('has see.', ()=>{\n    findParent(doc, '[id=\"static-variable-testSeeVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"see\"] a[href=\"http://example.com\"]', 'http://example.com');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/SinceTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@since} */\ndescribe('TestSinceClass', ()=> {\n  const doc = readDoc('class/src/Since/Class.js~TestSinceClass.html');\n\n  it('has since at class.', ()=> {\n    assert.includes(doc, '.header-notice [data-ice=\"since\"]', 'since 1.2.3');\n  });\n\n  describe('in summary', ()=>{\n    it('has since at constructor.', ()=>{\n      findParent(doc, '[href$=\"#instance-constructor-constructor\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n\n    it('has since at member.', ()=>{\n      findParent(doc, '[href$=\"#instance-member-p1\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n\n    it('has since at method.', ()=>{\n      findParent(doc, '[href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n  });\n\n  describe('in detail', ()=>{\n    it('has since at constructor.', ()=>{\n      findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n\n    it('has since at member.', ()=>{\n      findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n\n    it('has since at method.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/SinceTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@since} */\ndescribe('testSinceFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=>{\n    it('has since.', ()=>{\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testSinceFunction\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n  });\n\n  describe('in detail', ()=>{\n    it('has since.', ()=>{\n      findParent(doc, '[id=\"static-function-testSinceFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/SinceTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@since} */\ndescribe('testSinceVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=>{\n    it('has since.', ()=>{\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testSinceVariable\"]', '[data-ice=\"target\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n  });\n\n  describe('in detail', ()=>{\n    it('has since.', ()=>{\n      findParent(doc, '[id=\"static-variable-testSinceVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"since\"]', 'since 1.2.3');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ThrowsTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@throws} */\ndescribe('testThrowsFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has throws.', ()=>{\n    findParent(doc, '[id=\"static-function-testThrowsFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"throw\"] a[href=\"class/src/Throws/Function.js~TestThrowsFunctionError.html\"]', 'TestThrowsFunctionError');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/ThrowsTest/MethodTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@throws} */\ndescribe('TestThrowsMethod', ()=> {\n  const doc = readDoc('class/src/Throws/Method.js~TestThrowsMethod.html');\n\n  it('has throws.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, 'tr[data-ice=\"throw\"]:nth-child(1)', 'TestThrowsMethodError1 throw error if foo.');\n      assert.includes(doc, 'tr[data-ice=\"throw\"]:nth-child(1) a', 'class/src/Throws/Method.js~TestThrowsMethodError1.html', 'href');\n\n      assert.includes(doc, 'tr[data-ice=\"throw\"]:nth-child(2)', 'TestThrowsMethodError2 throw error if bar.');\n      assert.includes(doc, 'tr[data-ice=\"throw\"]:nth-child(2) a', 'class/src/Throws/Method.js~TestThrowsMethodError2.html', 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TodoTest/ClassTest.js",
    "content": "import {readDoc, assert, find, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@todo} */\ndescribe('TestTodoClass', ()=> {\n  const doc = readDoc('class/src/Todo/Class.js~TestTodoClass.html');\n\n  it('has todo at class.', ()=> {\n    find(doc, '.self-detail [data-ice=\"todo\"]', (doc)=>{\n      assert.includes(doc, 'li:nth-child(1)', 'this is first todo.');\n      assert.includes(doc, 'li:nth-child(2)', 'this is second todo.');\n    });\n  });\n\n  it('has todo at constructor.', ()=>{\n    findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"todo\"]', 'this is todo');\n    });\n  });\n\n  it('has see from member.', ()=>{\n    findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"todo\"]', 'this is todo');\n    });\n  });\n\n  it('has see from method.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"todo\"]', 'this is todo');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TodoTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@todo} */\ndescribe('testTodoFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  it('has todo.', ()=>{\n    findParent(doc, '[id=\"static-function-testTodoFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"todo\"]', 'this is todo.');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TodoTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@todo} */\ndescribe('testTodoVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  it('has see.', ()=>{\n    findParent(doc, '[id=\"static-variable-testTodoVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"todo\"]', 'this is todo.');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TrailingCommaTest/DefinitionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {ESParser} */\ndescribe('TestTrailingCommaDefinition', ()=> {\n  const doc = readDoc('class/src/TrailingComma/Definition.js~TestTrailingCommaDefinition.html');\n\n  describe('in self detail', ()=> {\n    it('has desc.', ()=> {\n      assert.includes(doc, '.self-detail [data-ice=\"description\"]', 'this is TestTrailingCommaDefinition.');\n    });\n  });\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public method1(p1: number, p2: string)');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method2\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public method2()');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '.params [data-ice=\"property\"]:nth-of-type(1)', 'p1 number this is p1.');\n        assert.includes(doc, '.params [data-ice=\"property\"]:nth-of-type(2)', 'p2 string this is p2.');\n      });\n\n      findParent(doc, '[id=\"instance-method-method2\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"description\"]', 'this is method2.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/ArrayTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeArray', ()=> {\n  const doc = readDoc('class/src/Type/Array.js~TestTypeArray.html');\n\n  it('has array type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: number[])');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeClass', ()=> {\n  const doc = readDoc('class/src/Type/Class.js~TestTypeClass.html');\n\n  it('has class type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: TestTypeClassInner)');\n      assert.includes(doc, 'a[href=\"class/src/Type/Class.js~TestTypeClassInner.html\"]', 'TestTypeClassInner');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/ComplexTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeComplex', ()=> {\n  const doc = readDoc('class/src/Type/Complex.js~TestTypeComplex.html');\n\n  it('has function complex type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: function(x1: number[], x2: Map<string, boolean>): Object)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object'\n      ], 'href');\n    });\n  });\n\n  it('has complex generics type.', ()=>{\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method2\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method2(p1: Map<number, string[]>)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n      ], 'href');\n    });\n  });\n\n  it('has complex record type.', ()=>{\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method3\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method3(p1: {x1: number[], x2: Map<string, boolean>, x3: {y1: number, y2: string}})');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n      ], 'href');\n    });\n  });\n\n  it('has complex union type.', ()=>{\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method4\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method4(p1: number | string, p2: number | string)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n      ], 'href');\n    });\n  });\n\n  it('has complex union type in generics.', ()=>{\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method5\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method5(p1: Promise<string|number, Error>)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error'\n      ], 'href');\n    });\n  });\n\n  it('has complex union type with spread.', ()=>{\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method6\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method6(p1: ...(number|string))');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/DefaultTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeDefault', ()=> {\n  const doc = readDoc('class/src/Type/Default.js~TestTypeDefault.html');\n\n  it('has default value.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(1)', 'optional default: 123');\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(2)', 'optional default: []');\n    });\n  });\n\n  it('has default value of object.', ()=>{\n    findParent(doc, '[id=\"instance-method-method2\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(1)', 'optional default: new Foo()');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/ExternalTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeExternal', ()=> {\n  const doc = readDoc('class/src/Type/External.js~TestTypeExternal.html');\n\n  it('has external type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: ArrayBuffer)');\n      assert.includes(doc, 'a[href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\"]', 'ArrayBuffer');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeFunction', ()=> {\n  const doc = readDoc('class/src/Type/Function.js~TestTypeFunction.html');\n\n  it('has function type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: function(x1: number, x2: string): boolean)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/GenericsTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeGenerics', ()=> {\n  const doc = readDoc('class/src/Type/Generics.js~TestTypeGenerics.html');\n\n  it('has generics type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: Array<number>, p2: Map<number, string>, p3: Promise<number[], Error>)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/LiteralTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeLiteral', ()=> {\n  const doc = readDoc('class/src/Type/Literal.js~TestTypeLiteral.html');\n\n  it('has literal type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: number, p2: string, p3: boolean)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/NullableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeNullable', ()=> {\n  const doc = readDoc('class/src/Type/Nullable.js~TypeTestNullable.html');\n\n  it('has nullable value.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(1)', 'nullable: true');\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(2)', 'nullable: false');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/ObjectTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeObject', ()=> {\n  const doc = readDoc('class/src/Type/Object.js~TestTypeObject.html');\n\n  it('has object type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: Object)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object'\n      ], 'href');\n    });\n  });\n\n  it('has object property.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(1)', 'p1 Object this is object p1.');\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(2)', 'p1.x1 number this is number x1.');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/OptionalTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeOptional', ()=> {\n  const doc = readDoc('class/src/Type/Optional.js~TestTypeOptional.html');\n\n  it('has optional attribute.', ()=>{\n    findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n      assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(1)', 'optional');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/RecordTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeRecord', ()=> {\n  const doc = readDoc('class/src/Type/Record.js~TestTypeRecord.html');\n\n  it('has record type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: {x1: number, x2: string})');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/SpreadTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeSpread', ()=> {\n  const doc = readDoc('class/src/Type/Spread.js~TestTypeSpread.html');\n\n  it('has spread type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: ...number)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number'\n      ], 'href');\n    });\n  });\n\n  it('has object spread type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method2\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method2(config: Object)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/TypedefTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeTypedef', ()=> {\n  const doc = readDoc('class/src/Type/Typedef.js~TestTypeTypedef.html');\n\n  it('has typedef type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: TestTypeTypedefInner)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'typedef/index.html#static-typedef-TestTypeTypedefInner'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypeTest/UnionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/**\n * @test {ParamParser#parseParamValue}\n * @test {ParamParser#parseParam}\n */\ndescribe('TestTypeUnion', ()=> {\n  const doc = readDoc('class/src/Type/Union.js~TestTypeUnion.html');\n\n  it('has union type.', ()=> {\n    findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n      assert.includes(doc, null, 'method1(p1: number | string)');\n      assert.multiIncludes(doc, '[data-ice=\"signature\"] a', [\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number',\n        'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/TypedefTest/DefinitionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {TypedefDoc} */\ndescribe('TestTypedefDefinition', ()=> {\n  const doc = readDoc('typedef/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-typedef-TestTypedefDefinition\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public TestTypedefDefinition: Object');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-typedef-TestTypedefDefinition\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public TestTypedefDefinition: Object');\n        assert.includes(doc, '.params [data-ice=\"property\"]:nth-child(1)', 'p1 number this is p1.');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/UndocumentTest/DefinitionTest.js",
    "content": "import {readDoc, assert} from './../../util.js';\n\n/**\n * @test {DocFactory#_traverseComments}\n * @test {AbstractDoc#@desc}\n * @test {DocResolver#_resolveUndocumentIdentifier}\n */\ndescribe('TestUndocumentDefinition', ()=> {\n  const doc = readDoc('class/src/Undocument/Definition.js~TestUndocumentDefinition.html');\n\n  it('is exist', ()=> {\n    assert.includes(doc, '.self-detail [data-ice=\"name\"]', 'TestUndocumentDefinition');\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/VariableTest/ArrayPatterTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {VariableDoc} */\ndescribe('testVariableArrayPattern', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testVariableArrayPattern1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public testVariableArrayPattern1: number');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testVariableArrayPattern1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public testVariableArrayPattern1: number');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/VariableTest/DefinitionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {VariableDoc} */\ndescribe('testVariableDefinition', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testVariableDefinition\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public testVariableDefinition: number');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testVariableDefinition\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public testVariableDefinition: number');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/VariableTest/ObjectPatterTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {VariableDoc} */\ndescribe('testVariableObjectPattern', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has desc', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testVariableObjectPattern1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, null, 'public testVariableObjectPattern1: number');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testVariableObjectPattern1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, 'h3', 'public testVariableObjectPattern1: number');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/VersionTest/ClassTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@version} */\ndescribe('TestVersionClass', ()=> {\n  const doc = readDoc('class/src/Version/Class.js~TestVersionClass.html');\n\n  describe('in self detail', ()=> {\n    it('has version.', ()=> {\n      assert.includes(doc, '.header-notice [data-ice=\"version\"]', '1.2.3');\n    });\n  });\n\n  describe('in summary', ()=> {\n    it('has version', ()=> {\n      assert.includes(doc, '[data-ice=\"constructorSummary\"] [data-ice=\"version\"]', '1.2.3');\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-member-p1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#instance-method-method1\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has version', ()=>{\n      findParent(doc, '[id=\"instance-constructor-constructor\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n\n      findParent(doc, '[id=\"instance-member-p1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n\n      findParent(doc, '[id=\"instance-method-method1\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/VersionTest/FunctionTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@version} */\ndescribe('testVersionFunction', ()=> {\n  const doc = readDoc('function/index.html');\n\n  describe('in summary', ()=> {\n    it('has version', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-function-testVersionFunction\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has version.', ()=>{\n      findParent(doc, '[id=\"static-function-testVersionFunction\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/DocumentTest/VersionTest/VariableTest.js",
    "content": "import {readDoc, assert, findParent} from './../../util.js';\n\n/** @test {AbstractDoc#@version} */\ndescribe('testVersionVariable', ()=> {\n  const doc = readDoc('variable/index.html');\n\n  describe('in summary', ()=> {\n    it('has version', ()=> {\n      findParent(doc, '[data-ice=\"summary\"] [href$=\"#static-variable-testVersionVariable\"]', '[data-ice=\"target\"]', (doc)=> {\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n    });\n  });\n\n  describe('in details', ()=>{\n    it('has desc.', ()=>{\n      findParent(doc, '[id=\"static-variable-testVersionVariable\"]', '[data-ice=\"detail\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"version\"]', '1.2.3');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/FileTest/FileTest.js",
    "content": "import {readDoc, assert} from './../util.js';\n\n/** @test {FileDocBuilder} */\ndescribe('test source code file', ()=> {\n  const doc = readDoc('file/src/Desc/Class.js.html');\n\n  it('has source code.', ()=>{\n    assert.includes(doc, 'body [data-ice=\"title\"]', 'src/Desc/Class.js');\n    assert.includes(doc, 'code[data-ice=\"content\"]', 'export default class TestDescClass {');\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/IdentifiersTest/IdentifiersTest.js",
    "content": "import {readDoc, assert, findParent} from './../util.js';\n\n/** @test {IdentifiersDocBuilder} */\ndescribe('test identifiers', ()=> {\n  const doc = readDoc('identifiers.html');\n\n  it('has Abstract summary.', ()=>{\n    findParent(doc, '#abstract', '[data-ice=\"dirSummaryWrap\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"dirSummary\"] [data-ice=\"target\"]:nth-of-type(1)', 'public C TestAbstractDefinition');\n    });\n  });\n\n  it('has Version summary.', ()=>{\n    findParent(doc, '#version', '[data-ice=\"dirSummaryWrap\"]', (doc)=>{\n      assert.includes(doc, '[data-ice=\"dirSummary\"] [data-ice=\"target\"]:nth-of-type(1)', 'public C TestVersionClass');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/IndexTest/IndexTest.js",
    "content": "import {readDoc, assert} from './../util.js';\n\n/** @test {IndexDocBuilder} */\ndescribe('test index', ()=> {\n  const doc = readDoc('index.html');\n\n  it('has README.md', ()=>{\n    assert.includes(doc, '[data-ice=\"index\"]', 'this is ESDoc Test Fixture README.');\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/ManualTest/ManualTest.js",
    "content": "import {readDoc, assert, find} from './../util.js';\n\n/** @test {ManualDocBuilder} */\ndescribe('test manual', ()=>{\n  describe('test navigation', ()=>{\n    it('has manual link in header', ()=>{\n      const doc = readDoc('index.html');\n      assert.includes(doc, '[data-ice=\"manualHeaderLink\"]', 'Manual');\n      assert.includes(doc, '[data-ice=\"manualHeaderLink\"]', './manual/index.html', 'href');\n    });\n\n    /** @test {ManualDocBuilder#_buildManualNav} */\n    it('has manual navigation', ()=>{\n      const doc = readDoc('manual/index.html');\n      find(doc, '[data-ice=\"nav\"]', (doc)=>{\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(1)', 'Overview Feature Demo License Author');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(2)', 'Design Concept Architecture Model');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(3)', 'Installation indent 2 indent 3 indent 4 indent 5');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(4)', 'Tutorial');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(5)', 'Usage');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(6)', 'Usage2 h2 in usage2 h3 in usage2');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(7)', 'Configuration');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(8)', 'Example Minimum Config Integration Test Code Into Documentation');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(9)', 'Advanced');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(10)', 'FAQ Goal');\n        assert.includes(doc, '[data-ice=\"manual\"]:nth-of-type(11)', 'Changelog 0.0.1');\n\n        // overview\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(1)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/overview.html', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(2) a', 'manual/overview.html#feature', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(3) a', 'manual/overview.html#demo', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(4) a', 'manual/overview.html#license', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(5) a', 'manual/overview.html#author', 'href');\n        });\n\n        // design\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(2)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/design.html', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(2) a', 'manual/design.html#concept', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(3) a', 'manual/design.html#architecture', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(4) a', 'manual/design.html#model', 'href');\n        });\n\n        // installation\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(3)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/installation.html', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(2) a', 'manual/installation.html#indent-2', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(3) a', 'manual/installation.html#indent-3', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(4) a', 'manual/installation.html#indent-4', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(5) a', 'manual/installation.html#indent-5', 'href');\n        });\n\n        // tutorial\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(4)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/tutorial.html', 'href');\n        });\n\n        // usage1\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(5)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/usage1.html', 'href');\n        });\n\n        // usage2\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(6)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/usage2.html', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(2) a', 'manual/usage2.html#h2-in-usage2', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(3) a', 'manual/usage2.html#h3-in-usage2', 'href');\n        });\n\n        // configuration\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(7)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/configuration.html', 'href');\n        });\n\n        // example\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(8)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/example.html', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(2) a', 'manual/example.html#minimum-config', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(3) a', 'manual/example.html#integration-test-code-into-documentation', 'href');\n        });\n\n        // advanced\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(9)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/advanced.html', 'href');\n        });\n\n        // faq\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(10)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/faq.html', 'href');\n        });\n\n        // changelog\n        find(doc, '[data-ice=\"manual\"]:nth-of-type(11)', (doc)=>{\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(1) a', 'manual/CHANGELOG.html', 'href');\n          assert.includes(doc, '[data-ice=\"manualNav\"]:nth-of-type(2) a', 'manual/CHANGELOG.html#0-0-1', 'href');\n        });\n      });\n    });\n  });\n\n  /** @test {ManualDocBuilder#_buildManualIndex} */\n  describe('test each heading tags', ()=>{\n    const doc = readDoc('manual/index.html');\n\n    it('has overview heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(1)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/overview.html', 'href');\n      });\n    });\n\n    it('has design heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(2)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/design.html', 'href');\n      });\n    });\n\n    it('has installation heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(3)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/installation.html', 'href');\n      });\n    });\n\n    it('has tutorial heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(4)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/tutorial.html', 'href');\n      });\n    });\n\n    it('has usage heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(5)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/usage1.html', 'href');\n      });\n    });\n\n    it('has usage2 heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(6)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/usage2.html', 'href');\n      });\n    });\n\n    it('has configuration heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(7)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/configuration.html', 'href');\n      });\n    });\n\n    it('has example heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(8)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/example.html', 'href');\n      });\n    });\n\n    it('has advanced heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(9)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/advanced.html', 'href');\n      });\n    });\n\n    it('has faq heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(10)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/faq.html', 'href');\n      });\n    });\n\n    it('has changelog heading tags', ()=>{\n      find(doc, '.manual-card-wrap:nth-of-type(11)', (doc)=>{\n        assert.includes(doc, '.manual-card > a', 'manual/CHANGELOG.html', 'href');\n      });\n    });\n  });\n\n  /** @test {ManualDocBuilder#_buildManual} */\n  describe('test each manual', ()=>{\n    it('has overview', ()=>{\n      const doc = readDoc('manual/overview.html');\n      assert.includes(doc, '.github-markdown h1', 'Overview');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"]', 'ESDoc is a documentation generator for JavaScript(ES6).');\n    });\n\n    it('has installation', ()=>{\n      const doc = readDoc('manual/installation.html');\n      assert.includes(doc, '.github-markdown h1', 'Installation');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"]', 'npm install -g esdoc');\n    });\n\n    it('has usage', ()=>{\n      const doc = readDoc('manual/usage1.html');\n      assert.includes(doc, '.github-markdown h1:nth-of-type(1)', 'Usage');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"]', 'esdoc -c esdoc.json');\n    });\n\n    it('has tutorial', ()=>{\n      const doc = readDoc('manual/tutorial.html');\n      assert.includes(doc, '.github-markdown h1', 'Tutorial');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"]', 'this is tutorial');\n    });\n\n    it('has configuration', ()=>{\n      const doc = readDoc('manual/configuration.html');\n      assert.includes(doc, '.github-markdown h1', 'Configuration');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"]', 'this is configuration');\n    });\n\n    it('has example', ()=>{\n      const doc = readDoc('manual/example.html');\n      assert.includes(doc, '.github-markdown h1', 'Example');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"] h2:nth-of-type(1)', 'Minimum Config');\n    });\n\n    it('has faq', ()=>{\n      const doc = readDoc('manual/faq.html');\n      assert.includes(doc, '.github-markdown h1', 'FAQ');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"]', 'ESDoc has two goals.');\n    });\n\n    it('has changelog', ()=>{\n      const doc = readDoc('manual/CHANGELOG.html');\n      assert.includes(doc, '.github-markdown h1', 'Changelog');\n      assert.includes(doc, '.github-markdown[data-ice=\"content\"] h2:nth-of-type(1)', '0.0.1');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/NavTest/NavTest.js",
    "content": "import {readDoc, assert, findParent} from './../util.js';\n\n/** @test {DocBuilder#_buildNavDoc} */\ndescribe('test navigation:', ()=> {\n  const doc = readDoc('index.html');\n\n  it('has class', ()=>{\n    findParent(doc, '[data-ice=\"nav\"] a[href=\"class/src/Desc/Class.js~TestDescClass.html\"]', '[data-ice=\"doc\"]', (doc)=>{\n      assert.includes(doc, null, 'TestDescClass');\n    });\n  });\n\n  it('has interface.', ()=>{\n    findParent(doc, '[data-ice=\"nav\"] a[href=\"class/src/Interface/Definition.js~TestInterfaceDefinition.html\"]', '[data-ice=\"doc\"]', (doc)=>{\n      assert.includes(doc, null, 'TestInterfaceDefinition');\n    });\n  });\n\n  it('has function.', ()=>{\n    findParent(doc, '[data-ice=\"nav\"] a[href=\"function/index.html#static-function-testDescFunction\"]', '[data-ice=\"doc\"]', (doc)=>{\n      assert.includes(doc, null, 'testDescFunction');\n    });\n  });\n\n  it('has variable.', ()=>{\n    findParent(doc, '[data-ice=\"nav\"] a[href=\"variable/index.html#static-variable-testDescVariable\"]', '[data-ice=\"doc\"]', (doc)=>{\n      assert.includes(doc, null, 'testDescVariable');\n    });\n  });\n\n  it('has typedef.', ()=>{\n    findParent(doc, '[data-ice=\"nav\"] a[href=\"typedef/index.html#static-typedef-TestTypedefDefinition\"]', '[data-ice=\"doc\"]', (doc)=>{\n      assert.includes(doc, null, 'TestTypedefDefinition');\n    });\n  });\n\n  it('has external.', ()=>{\n    findParent(doc, '[data-ice=\"nav\"] a[href=\"http://example.com\"]', '[data-ice=\"doc\"]', (doc)=>{\n      assert.includes(doc, null, 'TestExternalDefinition');\n    });\n  });\n});\n\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/SearchTest/SearchTest.js",
    "content": "import fs from 'fs';\nimport assert from 'assert';\n\ndescribe('test search', ()=>{\n  const searchIndexJS = fs.readFileSync('./test/fixture/out/script/search_index.js', {encoding: 'utf8'}).toString();\n  const searchIndexJSON = searchIndexJS.replace('window.esdocSearchIndex = ', '');\n  const searchIndex = JSON.parse(searchIndexJSON);\n\n  function find(searchIndex, url) {\n    const results = [];\n    for (const item of searchIndex) {\n      if (item[1] === url) results.push(item);\n    }\n\n    if (results.length > 1) assert(false, `some ${url} found. results = ${results}`);\n\n    return results[0];\n  }\n\n  it('has class index', ()=>{\n    assert.deepEqual(find(searchIndex, 'class/src/Desc/Class.js~TestDescClass.html'), [\n      'esdoc-test-fixture/src/desc/class.js~testdescclass',\n      'class/src/Desc/Class.js~TestDescClass.html',\n      '<span>TestDescClass</span> <span class=\"search-result-import-path\">esdoc-test-fixture/src/Desc/Class.js</span>',\n      'class'\n    ]);\n  });\n\n  it('has member index', ()=>{\n    assert.deepEqual(find(searchIndex, 'class/src/Desc/Class.js~TestDescClass.html#instance-member-p1'), [\n      'src/desc/class.js~testdescclass#p1',\n      'class/src/Desc/Class.js~TestDescClass.html#instance-member-p1',\n      'src/Desc/Class.js~TestDescClass#p1',\n      'member'\n    ]);\n  });\n\n  it('has method index', ()=>{\n    assert.deepEqual(find(searchIndex, 'class/src/Desc/Class.js~TestDescClass.html#instance-method-method1'), [\n      'src/desc/class.js~testdescclass#method1',\n      'class/src/Desc/Class.js~TestDescClass.html#instance-method-method1',\n      'src/Desc/Class.js~TestDescClass#method1',\n      'method'\n    ]);\n  });\n\n  it('has interface index', ()=>{\n    assert.deepEqual(find(searchIndex, 'class/src/Interface/Definition.js~TestInterfaceDefinition.html'), [\n      'esdoc-test-fixture/src/interface/definition.js~testinterfacedefinition',\n      'class/src/Interface/Definition.js~TestInterfaceDefinition.html',\n      '<span>TestInterfaceDefinition</span> <span class=\"search-result-import-path\">esdoc-test-fixture/src/Interface/Definition.js</span>',\n      'class'\n    ]);\n  });\n\n  it('has function index', ()=>{\n    assert.deepEqual(find(searchIndex, 'function/index.html#static-function-testDescFunction'), [\n      'esdoc-test-fixture/src/desc/function.js~testdescfunction',\n      'function/index.html#static-function-testDescFunction',\n      '<span>testDescFunction</span> <span class=\"search-result-import-path\">esdoc-test-fixture/src/Desc/Function.js</span>',\n      'function'\n    ]);\n  });\n\n  it('has variable index', ()=>{\n    assert.deepEqual(find(searchIndex, 'variable/index.html#static-variable-testDescVariable'), [\n      'esdoc-test-fixture/src/desc/variable.js~testdescvariable',\n      'variable/index.html#static-variable-testDescVariable',\n      '<span>testDescVariable</span> <span class=\"search-result-import-path\">esdoc-test-fixture/src/Desc/Variable.js</span>',\n      'variable'\n    ]);\n  });\n\n  it('has typedef index', ()=>{\n    assert.deepEqual(find(searchIndex, 'typedef/index.html#static-typedef-TestTypedefDefinition'), [\n      'src/typedef/definition.js~testtypedefdefinition',\n      'typedef/index.html#static-typedef-TestTypedefDefinition',\n      'src/Typedef/Definition.js~TestTypedefDefinition',\n      'typedef'\n    ]);\n  });\n\n  it('has external index', ()=>{\n    assert.deepEqual(find(searchIndex, 'http://example.com'), [\n      'src/external/definition.js~testexternaldefinition',\n      'http://example.com',\n      'src/External/Definition.js~TestExternalDefinition',\n      'external'\n    ]);\n  });\n\n  it('has file index', ()=>{\n    assert.deepEqual(find(searchIndex, 'file/src/Desc/Class.js.html'), [\n      'src/desc/class.js',\n      'file/src/Desc/Class.js.html',\n      'src/Desc/Class.js',\n      'file'\n    ]);\n  });\n\n  it('has test file index', ()=>{\n    assert.deepEqual(find(searchIndex, 'test-file/test/DescTest.js.html'), [\n      'test/desctest.js',\n      'test-file/test/DescTest.js.html',\n      'test/DescTest.js',\n      'testFile'\n    ]);\n  });\n\n  it('has test index', ()=>{\n    assert.deepEqual(find(searchIndex, 'test-file/test/DescTest.js.html#lineNumber2'), [\n      'testdescclass src/desc/class.js~testdescclass,testdescclass',\n      'test-file/test/DescTest.js.html#lineNumber2',\n      'Use describe style mocha interface',\n      'test'\n    ]);\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/TestTest/TestLinkTest.js",
    "content": "import {readDoc, assert, findParent} from './../util.js';\n\n/** @test {ClassDocBuilder} */\ndescribe('test link of test', ()=>{\n  const doc = readDoc('class/src/Desc/Class.js~TestDescClass.html');\n\n  it('has link of test at class', ()=>{\n    assert.multiIncludes(doc, '.self-detail [data-ice=\"test\"] a', [\n      'Use describe style mocha interface',\n      'Use suite style mocha interface'\n    ]);\n\n    assert.multiIncludes(doc, '.self-detail [data-ice=\"test\"] a', [\n      'test-file/test/DescTest.js.html#lineNumber2',\n      'test-file/test/DescTest.js.html#lineNumber23'\n    ], 'href');\n  });\n\n  it('has link of test at constructor', ()=>{\n    findParent(doc, '#instance-constructor-constructor', '[data-ice=\"detail\"]', (doc)=>{\n      assert.multiIncludes(doc, '[data-ice=\"test\"] a', [\n        'Use describe style mocha interface Use it style mocha interface',\n        'Use suite style mocha interface Use test style mocha interface'\n      ]);\n\n      assert.multiIncludes(doc, '[data-ice=\"test\"] a', [\n        'test-file/test/DescTest.js.html#lineNumber4',\n        'test-file/test/DescTest.js.html#lineNumber25',\n      ], 'href');\n    });\n  });\n\n  it('has link of test at member', ()=>{\n    findParent(doc, '#instance-member-p1', '[data-ice=\"detail\"]', (doc)=>{\n      assert.multiIncludes(doc, '[data-ice=\"test\"] a', [\n        'Use describe style mocha interface Nested describe',\n        'Use suite style mocha interface Nested suite'\n      ]);\n\n      assert.multiIncludes(doc, '[data-ice=\"test\"] a', [\n        'test-file/test/DescTest.js.html#lineNumber8',\n        'test-file/test/DescTest.js.html#lineNumber29'\n      ], 'href');\n    });\n  });\n\n  it('has link of test at method', ()=>{\n    findParent(doc, '#instance-method-method1', '[data-ice=\"detail\"]', (doc)=>{\n      assert.multiIncludes(doc, '[data-ice=\"test\"] a', [\n        'Use describe style mocha interface Use context style mocha interface',\n        'Use suite style mocha interface Nested suite Nested test'\n      ]);\n\n      assert.multiIncludes(doc, '[data-ice=\"test\"] a', [\n        'test-file/test/DescTest.js.html#lineNumber15',\n        'test-file/test/DescTest.js.html#lineNumber31'\n      ], 'href');\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/TestTest/TestTest.js",
    "content": "import {readDoc, assert, findParent} from './../util.js';\n\n/**\n * @test {TestDocBuilder}\n * @test {TestDocBuilder#_buildTestDocHTML}\n */\ndescribe('test integration of test', ()=> {\n  const doc = readDoc('test.html').find('[data-ice=\"tests\"]');\n\n  describe('describe/it style', ()=>{\n    it('has describe', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber2\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Use describe style mocha interface TestDescClass');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber2',\n          'class/src/Desc/Class.js~TestDescClass.html'\n        ], 'href');\n      });\n    });\n\n    it('has it', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber4\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Use it style mocha interface TestDescClass#constructor');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber4',\n          'class/src/Desc/Class.js~TestDescClass.html#instance-constructor-constructor'\n        ], 'href');\n      });\n    });\n\n    it('has nested describe', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber8\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Nested describe TestDescClass#p1');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber8',\n          'class/src/Desc/Class.js~TestDescClass.html#instance-member-p1'\n        ], 'href');\n      });\n    });\n\n    it('has nested it', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber10\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Nested it in describe testDescVariable');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber10',\n          'variable/index.html#static-variable-testDescVariable'\n        ], 'href');\n      });\n    });\n  });\n\n\n  describe('context style', ()=>{\n    it('has context', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber15\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Use context style mocha interface TestDescClass#method1');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber15',\n          'class/src/Desc/Class.js~TestDescClass.html#instance-method-method1'\n        ], 'href');\n      });\n    });\n\n    it('has context it', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber17\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Nested it in context testDescFunction');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber17',\n          'function/index.html#static-function-testDescFunction'\n        ], 'href');\n      });\n    });\n  });\n\n  describe('suite/test style', ()=>{\n    it('has suite', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber23\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Use suite style mocha interface TestDescClass');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber23',\n          'class/src/Desc/Class.js~TestDescClass.html'\n        ], 'href');\n      });\n    });\n\n    it('has test', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber25\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Use test style mocha interface TestDescClass#constructor');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber25',\n          'class/src/Desc/Class.js~TestDescClass.html#instance-constructor-constructor'\n        ], 'href');\n      });\n    });\n\n    it('has nested suite', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber29\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Nested suite TestDescClass#p1');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber29',\n          'class/src/Desc/Class.js~TestDescClass.html#instance-member-p1'\n        ], 'href');\n      });\n    });\n\n    it('has nested test', ()=>{\n      findParent(doc, 'a[href=\"test-file/test/DescTest.js.html#lineNumber31\"]', '[data-ice=\"testInterface\"]', (doc)=>{\n        assert.includes(doc, null, 'Nested test TestDescClass#method1');\n        assert.multiIncludes(doc, 'a', [\n          'test-file/test/DescTest.js.html#lineNumber31',\n          'class/src/Desc/Class.js~TestDescClass.html#instance-method-method1'\n        ], 'href');\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/init.js",
    "content": "const path = require('path');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/fixture/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-publish-html-plugin/test/src/util.js",
    "content": "import _assert from 'assert';\nimport fs from 'fs';\nimport cheerio from 'cheerio';\n// import path from 'path';\n// import ESDocCLI from '../../src/ESDocCLI.js';\n\n// export function cli(configPath = null) {\n//   const cliPath = path.resolve('./src/cli.js');\n//   const argv = ['node', cliPath];\n//\n//   if (configPath) {\n//     configPath = path.resolve(configPath);\n//     argv.push('-c', configPath);\n//     console.log(`process: ${configPath}`);\n//   }\n//\n//   const cli = new ESDocCLI(argv);\n//   consoleLogSwitch(false);\n//   cli.exec();\n//   consoleLogSwitch(true);\n// }\n\nexport function readDoc(fileName, dirName = './test/fixture/out') {\n  const html = fs.readFileSync(`${dirName}/${fileName}`, {encoding: 'utf-8'});\n  const $ = cheerio.load(html);\n  return $('html').first();\n}\n\nexport function find($el, selector, callback) {\n  const $els = $el.find(selector);\n  if (!$els.length) _assert(false, `node is not found. selector = \"${selector}\"`);\n  if ($els.length !== 1) _assert(false, `many nodes are found. selector = \"${selector}\"`);\n\n  callback($els.first());\n}\n\nexport function findParent($el, selector, parentSelector, callback) {\n  find($el, selector, ($child)=>{\n    const $parents = $child.parents(parentSelector);\n\n    if (!$parents.length) _assert(false, `parent is not found. selector = \"${parentSelector}\"`);\n    if ($parents.length !== 1) _assert(false, `many parents are found. selector = \"${parentSelector}\"`);\n\n    callback($parents.first());\n  });\n}\n\nfunction getActual($el, selector, attr) {\n  let $target;\n  if (selector) {\n    const $els = $el.find(selector);\n    if (!$els.length) _assert(false, `node is not found. selector = \"${selector}\"`);\n    if ($els.length !== 1) _assert(false, `many nodes are found. selector = \"${selector}\"`);\n    $target = $els.first();\n  } else {\n    $target = $el;\n  }\n\n  if (!$target.length) {\n    _assert(false, `node is not found. selector = \"${selector}\"`);\n  }\n\n  let actual;\n  if (attr) {\n    actual = $target.attr(attr);\n  } else {\n    actual = $target.text().replace(/\\s+/g, ' ');\n  }\n\n  if (actual === null) {\n    _assert(false, `actual is null. selector = ${selector}, attr = ${attr}`);\n  }\n\n  return actual;\n}\n\n_assert.includes = function($el, selector, expect, attr) {\n  const actual = getActual($el, selector, attr);\n  _assert(actual.includes(expect) === true, `selector: \"${selector}\",\\nactual: ${actual}\\nexpect: ${expect}`);\n};\n\n_assert.multiIncludes = function($el, selector, expects, attr) {\n  const $targets = $el.find(selector);\n  if ($targets.length !== expects.length) _assert(false, `node length and expects length is mismatch. selector = \"${selector}\"`);\n\n  for (let i = 0; i < $targets.length; i++) {\n    const $target = $targets.eq(i);\n    let actual;\n    if (attr) {\n      actual = $target.attr(attr);\n    } else {\n      actual = $target.text().replace(/\\s+/g, ' ');\n    }\n\n    if (actual === null) {\n      _assert(false, `actual is null. selector = ${selector}, attr = ${attr}`);\n    }\n\n    const expect = expects[i];\n    _assert(actual.includes(expect) === true, `selector: \"${selector}\",\\nactual: ${actual}\\nexpect: ${expect}`);\n  }\n};\n\n_assert.notIncludes = function($el, selector, expect, attr) {\n  const actual = getActual($el, selector, attr);\n  _assert(actual.includes(expect) === false, `selector: \"${selector}\"`);\n};\n\nexport const assert = _assert;\n\n// const consoleLog = console.log;\n// export function consoleLogSwitch(on) {\n//   if (on) {\n//     console.log = consoleLog;\n//   } else {\n//     console.log = ()=>{};\n//   }\n// }\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## Next\n- **Feat**\n  - Add `option.filename` ([#56](https://github.com/esdoc/esdoc-plugins/pull/56)). Thanks [@Verikon](https://github.com/Verikon)\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/README.md",
    "content": "# ESDoc Publish Markdown Plugin (PoC)\n**This plugin is proof of concept.**\n**So, the plugin has only minimum features.**\n**We are waiting for your pull request!**\n\n## Example\n[example](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-publish-markdown-plugin/misc/index.md)\n\n<img src=\"https://raw.githubusercontent.com/esdoc/esdoc-plugins/master/esdoc-publish-markdown-plugin/misc/ss.png\" width=\"400px\">\n\n## Install\n```bash\nnpm install esdoc-publish-markdown-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-publish-markdown-plugin\",\n      \"option\": {\n        \"filename\":\"README.md\"\n      }\n    }\n  ]\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/misc/index.md",
    "content": "# Class\n\n## `MyClass`\n\nthis is MyClass\n\n### `constructor()`\n\nthis is constructor\n\n### `member1: number`\n\nthis is member1.\n\n### `member2: string`\n\nthis is member2.\n\n### `method1(p1: ...number): boolean`\n\nthis is method1.\n\n| Name | Type | Attribute | Description |\n| --- | --- | --- | --- |\n| p1 | ...number |  | this is p1 |\n\n### `method2(p1: number)`\n\nthis is method2.\n\n| Name | Type | Attribute | Description |\n| --- | --- | --- | --- |\n| p1 | number | optional: true, default: 10 | this is p1 |\n\n# Function\n\n## `myFunction(p1: number): string`\n\nthis is myFunction\n\n| Name | Type | Attribute | Description |\n| --- | --- | --- | --- |\n| p1 | number |  | this is p1. |"
  },
  {
    "path": "esdoc-publish-markdown-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-publish-markdown-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A publish markdown plugin for ESDoc [PoC]\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"ice-cap\": \"0.0.4\",\n    \"to-markdown\": \"3.0.4\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"markdown\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/src/AbstractBuilder.js",
    "content": "const path = require('path');\nconst fs = require('fs');\n\nclass AbstractBuilder {\n  constructor(docs) {\n    this._docs = docs;\n  }\n\n  makeHTML() {\n    return '';\n  }\n\n  _findAll(cond = {}) {\n    const keys = Object.keys(cond);\n    return this._docs.filter((doc) =>{\n      for (const key of keys) if (doc[key] !== cond[key]) return false;\n      return true;\n    });\n  }\n\n  _find(cond = {}) {\n    return this._findAll(cond)[0];\n  }\n\n  _makeSignature(doc) {\n    if (['constructor', 'method', 'function'].includes(doc.kind)) {\n      let params = [];\n      if (doc.params) params = doc.params.map(param => `${param.name}: ${param.types.join('|')}`);\n      const type = doc.return ? `: ${doc.return.types.join('|')}` : '';\n      return `\\`${doc.name}(${params.join(', ')})${type}\\``;\n    }\n\n    if (['member', 'variable'].includes(doc.kind)) {\n      const type = doc.type ? doc.type.types.join('|') : '*';\n      return `\\`${doc.name}: ${type}\\``;\n    }\n  }\n\n  _makeParamAttribute(param) {\n    const attrs = [];\n    if (param.nullable !== null) attrs.push(`nullable: ${param.nullable}`);\n    if (param.optional) attrs.push('optional: true');\n    if (param.defaultValue) attrs.push(`default: ${param.defaultValue}`);\n\n    return attrs.join(', ');\n  }\n\n  _readTemplate(fileName) {\n    const filePath = path.resolve(__dirname, `./template/${fileName}`);\n    return fs.readFileSync(filePath, {encoding: 'utf-8'});\n  }\n}\n\nmodule.exports = AbstractBuilder;\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/src/ClassBuilder.js",
    "content": "const AbstractBuilder = require('./AbstractBuilder');\nconst IceCap = require('ice-cap').default;\n\nclass ClassBuilder extends AbstractBuilder {\n  makeHTML() {\n    const docs = this._findAll({kind: 'class'});\n    const outputs = [];\n\n    for (const doc of docs) {\n      const ice = new IceCap(this._readTemplate('class.html'));\n\n      this._applyBody(doc, ice);\n      this._applyConstructor(doc, ice);\n      this._applyMember(doc, ice);\n      this._applyMethod(doc, ice);\n\n      outputs.push(ice.html);\n    }\n\n    return outputs.join('\\n');\n  }\n\n  _applyBody(classDoc, ice) {\n    ice.text('className', `\\`${classDoc.name}\\``);\n    ice.text('classDesc', classDoc.description);\n  }\n\n  _applyConstructor(classDoc, ice) {\n    const constructorDoc = this._find({kind: 'constructor', memberof: classDoc.longname});\n    if (constructorDoc) {\n      ice.text('constructorSignature', this._makeSignature(constructorDoc));\n      ice.text('constructorDesc', constructorDoc.description);\n    }\n  }\n\n  _applyMember(classDoc, ice) {\n    const memberDocs = this._findAll({kind: 'member', memberof: classDoc.longname});\n    ice.loop('member', memberDocs, (index, doc, ice) =>{\n      ice.text('memberSignature', this._makeSignature(doc));\n      ice.text('memberDesc', doc.description);\n    });\n  }\n\n  _applyMethod(classDoc, ice) {\n    const methodDocs = this._findAll({kind: 'method', memberof: classDoc.longname});\n    ice.loop('method', methodDocs, (index, doc, ice) =>{\n      ice.text('methodSignature', this._makeSignature(doc));\n      ice.text('methodDesc', doc.description);\n\n      const params = doc.params || [];\n      ice.loop('methodParam', params, (index, param, ice) =>{\n        ice.text('name', param.name);\n        ice.text('type', param.types.join('|'));\n        ice.text('attribute', this._makeParamAttribute(param) || ' ');\n        ice.text('desc', param.description);\n      });\n    });\n  }\n}\n\nmodule.exports = ClassBuilder;\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/src/FunctionBuilder.js",
    "content": "const AbstractBuilder = require('./AbstractBuilder');\nconst IceCap = require('ice-cap').default;\n\nclass FunctionBuilder extends AbstractBuilder {\n  makeHTML() {\n    const docs = this._docs.filter(doc => doc.kind === 'function');\n    const outputs = [];\n\n    for (const doc of docs) {\n      const ice = new IceCap(this._readTemplate('function.html'));\n      this._applyBody(doc, ice);\n      this._applyParam(doc, ice);\n      outputs.push(ice.html);\n    }\n\n    return outputs.join('\\n');\n  }\n\n  _applyBody(doc, ice) {\n    ice.text('functionName', this._makeSignature(doc));\n    ice.text('functionDesc', doc.description);\n  }\n\n  _applyParam(doc, ice) {\n    const params = doc.params || [];\n    ice.loop('functionParam', params, (index, param, ice) =>{\n      ice.text('name', param.name);\n      ice.text('type', param.types.join('|'));\n      ice.text('attribute', this._makeParamAttribute(param) || ' ');\n      ice.text('desc', param.description);\n    });\n  }\n}\n\nmodule.exports = FunctionBuilder;\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/src/Plugin.js",
    "content": "const toMarkdown = require('to-markdown');\nconst ClassBuilder = require('./ClassBuilder');\nconst FunctionBuilder = require('./FunctionBuilder');\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n  }\n\n  onPublish(ev) {\n\n    // create builder\n    const classBuilder = new ClassBuilder(this._docs);\n    const functionBuilder = new FunctionBuilder(this._docs);\n\n    // create html\n    let html = '';\n    html += '<h1>Class</h1>\\n' + classBuilder.makeHTML() + '\\n';\n    html += '<h1>Function</h1>\\n' + functionBuilder.makeHTML() + '\\n';\n\n    // to markdown\n    const markdown = this._toMarkdown(html);\n\n    // write file\n    const filename = ev.data.option && ev.data.option.filename ? ev.data.option.filename : 'index.md';\n    ev.data.writeFile(filename, markdown);\n  }\n\n  _toMarkdown(html) {\n    // div is using as wrapper. so remove self tag.\n    const converter = {\n      filter: 'div',\n      replacement: function (innerHTML, node) {\n        return innerHTML;\n      }\n    };\n\n    return toMarkdown(html, {gfm: true, converters: [converter]});\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/src/template/class.html",
    "content": "<h2 data-ice=\"className\"></h2>\n<p data-ice=\"classDesc\"></p>\n\n<h3 data-ice=\"constructorSignature\"></h3>\n<p data-ice=\"constructorDesc\"></p>\n\n<div data-ice=\"member\">\n  <h3 data-ice=\"memberSignature\"></h3>\n  <p data-ice=\"memberDesc\"></p>\n</div>\n\n<div data-ice=\"method\">\n  <h3 data-ice=\"methodSignature\"></h3>\n  <p data-ice=\"methodDesc\"></p>\n  <table>\n    <thead>\n    <tr>\n      <td>Name</td>\n      <td>Type</td>\n      <td>Attribute</td>\n      <td>Description</td>\n    </tr>\n    </thead>\n    <tbody>\n    <tr data-ice=\"methodParam\">\n      <td data-ice=\"name\"></td>\n      <td data-ice=\"type\"></td>\n      <td data-ice=\"attribute\"></td>\n      <td data-ice=\"desc\"></td>\n    </tr>\n    </tbody>\n  </table>\n</div>\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/src/template/function.html",
    "content": "<h2 data-ice=\"functionName\"></h2>\n<p data-ice=\"functionDesc\"></p>\n\n<table>\n  <thead>\n  <tr>\n    <td>Name</td>\n    <td>Type</td>\n    <td>Attribute</td>\n    <td>Description</td>\n  </tr>\n  </thead>\n  <tbody>\n  <tr data-ice=\"functionParam\">\n    <td data-ice=\"name\"></td>\n    <td data-ice=\"type\"></td>\n    <td data-ice=\"attribute\"></td>\n    <td data-ice=\"desc\"></td>\n  </tr>\n  </tbody>\n</table>\n\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/src/MyClass.js",
    "content": "/**\n * this is MyClass\n */\nexport default class MyClass {\n  /**\n   * this is constructor\n   */\n  constructor() {\n    /**\n     * this is member1.\n     * @type {number}\n     */\n    this.member1 = 10;\n\n    /**\n     * this is member2.\n     * @type {string}\n     */\n    this.member2 = 'foo';\n  }\n\n  /**\n   * this is method1.\n   * @param {...number} p1 - this is p1\n   * @return {boolean} return boolean\n   */\n  method1(...p1){}\n\n  /**\n   * this is method2.\n   * @param {number} [p1=10] - this is p1\n   */\n  method2(p1 = 10){}\n}\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {hasLine} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has class', ()=>{\n    assert(hasLine('## `MyClass`'));\n    assert(hasLine('this is MyClass'));\n  });\n\n  it('has constructor', ()=>{\n    assert(hasLine('### `constructor()`'));\n    assert(hasLine('this is constructor'));\n  });\n\n  it('has member', ()=>{\n    assert(hasLine('### `member1: number`'));\n    assert(hasLine('this is member1.'));\n  });\n\n  it('has method', ()=>{\n    assert(hasLine('### `method1(p1: ...number): boolean`'));\n    assert(hasLine('this is method1.'));\n    assert(hasLine('| p1 | ...number |  | this is p1 |'));\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/src/myFunction.js",
    "content": "/**\n * this is myFunction\n * @param {number} p1 - this is p1.\n * @return {string} return string.\n */\nexport default function myFunction(p1){}\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/src/myFunction.test.js",
    "content": "const assert = require('assert');\nconst {hasLine} = require('../util');\n\ndescribe('test/myFunction.js:', ()=> {\n  it('has function', ()=>{\n    assert(hasLine('## `myFunction(p1: number): string`'));\n    assert(hasLine('this is myFunction'));\n  });\n\n  it('has param', ()=>{\n    assert(hasLine('| p1 | number |  | this is p1. |'));\n  });\n});\n"
  },
  {
    "path": "esdoc-publish-markdown-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nconst md = fs.readFileSync('./test/out/index.md').toString();\nconst lines = md.split('\\n');\n\nmodule.exports.hasLine = function hasLine(line) {\n  return lines.includes(line);\n};\n"
  },
  {
    "path": "esdoc-react-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.1 (2017-09-10)\n- **Fix**\n  - Crash when `esdoc-publish-html-plugin`@1.1.0\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-react-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-react-plugin/README.md",
    "content": "# ESDoc React Plugin (PoC)\n**This plugin is proof of concept.**\n**So, the plugin has only minimum features.**\n**We are waiting for your pull request!**\n\n## Example\n```js\n/**\n * This is MyClass.\n * @reactProps {!number} prop1 - this is prop1\n * @reactProps {string} prop2 - this is prop2\n */\nexport default class MyClass extends React.Component {\n}\n```\n\n<img src=\"https://raw.githubusercontent.com/esdoc/esdoc-plugins/master/esdoc-react-plugin/misc/ss.png\" width=\"400px\">\n\n## Install\n```bash\nnpm install esdoc-react-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-standard-plugin\"},\n    {\"name\": \"esdoc-react-plugin\"}\n  ]\n}\n```\n\n## Dependency\n- esdoc-standard-plugin\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-react-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-react-plugin\",\n  \"version\": \"1.0.1\",\n  \"description\": \"A React plugin for ESDoc [PoC]\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"cheerio\": \"1.0.0-rc.1\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"esdoc-standard-plugin\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"react\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-react-plugin/src/Plugin.js",
    "content": "const path = require('path');\nconst cheerio = require('cheerio');\nconst ParamParser = require('esdoc/out/src/Parser/ParamParser').default;\nconst DocBuilder = require('esdoc-publish-html-plugin/out/src/Builder/DocBuilder').default;\n\nclass Plugin {\n  constructor() {\n    this._docs = null;\n    this._reactPropsDocs = null;\n  }\n\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n\n    const reactPropsDocs = [];\n    for (const doc of ev.data.docs) {\n      if (doc.kind !== 'class') continue;\n      if (!doc.unknown) continue;\n\n      const reactProps = doc.unknown.filter(v => v.tagName === '@reactProps');\n      if (!reactProps.length) continue;\n\n      reactPropsDocs.push({\n        longname: doc.longname,\n        fileName: `${doc.longname}.html`,\n        reactProps: reactProps\n      });\n    }\n\n    this._reactPropsDocs = reactPropsDocs;\n  }\n\n  onHandleContent(ev) {\n    const content = ev.data.content;\n    const fileName = ev.data.fileName;\n\n    // only html\n    if (path.extname(fileName) !== '.html') return;\n\n    // find target doc\n    const doc = this._reactPropsDocs.find(doc => {\n      const regexp = new RegExp(`${doc.fileName}$`);\n      if (fileName.match(regexp)) return true;\n    });\n    if (!doc) return;\n\n    // create esdoc properties from react props\n    const properties = doc.reactProps.map(reactProp => {\n      const {typeText, paramName, paramDesc} = ParamParser.parseParamValue(reactProp.tagValue);\n      return ParamParser.parseParam(typeText, paramName, paramDesc);\n    });\n\n    // hack: create html\n    const docBuilder = DocBuilder.createDefaultBuilder();\n    const html = docBuilder._buildProperties(properties, 'React Props:').html;\n\n    // append html\n    const $ = cheerio.load(content);\n    $('.self-detail.detail').append(html);\n\n    ev.data.content = $.html();\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-react-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"esdoc-standard-plugin\"},\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-react-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-react-plugin/test/src/MyClass.js",
    "content": "/**\n * This is MyClass.\n * @reactProps {!number} prop1 - this is prop1\n * @reactProps {string} prop2 - this is prop2\n */\nexport default class MyClass extends React.Component {\n}\n\n/**\n * this is NonReactClass\n */\nexport class NonReactClass {\n}\n"
  },
  {
    "path": "esdoc-react-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {load, text} = require('../util');\n\ndescribe('test/MyClass.js:', ()=> {\n  it('has React props', ()=>{\n    const $ = load('./test/out/class/src/MyClass.js~MyClass.html');\n    const $table = $('.self-detail.detail [data-ice=\"properties\"]');\n\n    assert.equal(text($table, 'tbody tr:nth-child(1)'), 'prop1 number nullable: false this is prop1');\n    assert.equal(text($table, 'tbody tr:nth-child(2)'), 'prop2 string this is prop2');\n  });\n\n  it('does not have React props', ()=>{\n    const $ = load('./test/out/class/src/MyClass.js~NonReactClass.html');\n    const $table = $('.self-detail.detail [data-ice=\"properties\"]');\n\n    assert.equal($table.length, 0);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-react-plugin/test/util.js",
    "content": "const fs = require('fs');\nconst cheerio = require('cheerio');\n\nmodule.exports.load = function(fileName) {\n  const html = fs.readFileSync(fileName, {encoding: 'utf-8'});\n  return cheerio.load(html);\n};\n\nmodule.exports.text = function($el, query) {\n  return $el.find(query).text().replace(/\\s+/g, ' ').trim();\n};\n"
  },
  {
    "path": "esdoc-standard-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-standard-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-standard-plugin/README.md",
    "content": "# ESDoc Standard Plugin\n## Install\n```bash\nnpm install esdoc-standard-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\n      \"name\": \"esdoc-standard-plugin\",\n      \"option\": {\n        \"lint\": {\"enable\": true},\n        \"coverage\": {\"enable\": true},\n        \"accessor\": {\"access\": [\"public\", \"protected\", \"private\"], \"autoPrivate\": true},\n        \"undocumentIdentifier\": {\"enable\": true},\n        \"unexportedIdentifier\": {\"enable\": false},\n        \"typeInference\": {\"enable\": true},\n        \"brand\": {\n          \"logo\": \"./logo.png\",\n          \"title\": \"My Library\",\n          \"description\": \"this is awesome library\",\n          \"repository\": \"https://github.com/foo/bar\",\n          \"site\": \"http://my-library.org\",\n          \"author\": \"https://twitter.com/foo\",\n          \"image\": \"http://my-library.org/logo.png\"\n        },\n        \"manual\": {\n          \"index\": \"./manual/index.md\",\n          \"globalIndex\": true,\n          \"asset\": \"./manual/asset\",\n          \"files\": [\n            \"./manual/overview.md\",\n            \"./manual/design.md\",\n            \"./manual/installation.md\",\n            \"./manual/usage1.md\",\n            \"./manual/usage2.md\",\n            \"./manual/tutorial.md\",\n            \"./manual/configuration.md\",\n            \"./manual/example.md\",\n            \"./manual/advanced.md\",\n            \"./manual/faq.md\",\n            \"./CHANGELOG.md\"\n          ]\n        },\n        \"test\": {\n          \"source\": \"./test/\",\n          \"interfaces\": [\"describe\", \"it\", \"context\", \"suite\", \"test\"],\n          \"includes\": [\"(spec|Spec|test|Test)\\\\.js$\"],\n          \"excludes\": [\"\\\\.config\\\\.js$\"]\n        }\n      }\n    }\n  ]\n}\n```\n\nThe `esdoc-standard-plugin` is a glue plugin. The following plugins are used by this.\n- [esdoc-lint-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-lint-plugin)\n- [esdoc-coverage-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-coverage-plugin)\n- [esdoc-accessor-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-accessor-plugin)\n- [esdoc-type-inference-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-type-inference-plugin)\n- [esdoc-external-ecmascript-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-external-ecmascript-plugin)\n- [esdoc-brand-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-brand-plugin)\n- [esdoc-undocumented-identifier-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-undocumented-identifier-plugin)\n- [esdoc-unexported-identifier-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-unexported-identifier-plugin)\n- [esdoc-integrate-manual-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-integrate-manual-plugin)\n- [esdoc-integrate-test-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-integrate-test-plugin)\n- [esdoc-publish-html-plugin](https://github.com/esdoc/esdoc-plugins/tree/master/esdoc-publish-html-plugin)\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-standard-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-standard-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A standard plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"esdoc-lint-plugin\": \"^1.0.0\",\n    \"esdoc-coverage-plugin\": \"^1.0.0\",\n    \"esdoc-accessor-plugin\": \"^1.0.0\",\n    \"esdoc-external-ecmascript-plugin\": \"^1.0.0\",\n    \"esdoc-brand-plugin\": \"^1.0.0\",\n    \"esdoc-undocumented-identifier-plugin\": \"^1.0.0\",\n    \"esdoc-unexported-identifier-plugin\": \"^1.0.0\",\n    \"esdoc-publish-html-plugin\": \"^1.0.0\",\n    \"esdoc-type-inference-plugin\": \"^1.0.0\",\n    \"esdoc-integrate-manual-plugin\": \"^1.0.0\",\n    \"esdoc-integrate-test-plugin\": \"^1.0.0\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"standard\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-standard-plugin/src/Plugin.js",
    "content": "class Plugin {\n  onHandlePlugins(ev) {\n    const option = ev.data.option || {};\n    const plugins = [\n      {name: 'esdoc-lint-plugin', option: option.lint},\n      {name: 'esdoc-coverage-plugin', option: option.coverage},\n      {name: 'esdoc-accessor-plugin', option: option.accessor},\n      {name: 'esdoc-type-inference-plugin', option: option.typeInference},\n      {name: 'esdoc-external-ecmascript-plugin'},\n      {name: 'esdoc-brand-plugin', option: option.brand},\n      {name: 'esdoc-undocumented-identifier-plugin', option: option.undocumentIdentifier},\n      {name: 'esdoc-unexported-identifier-plugin', option: option.unexportedIdentifier},\n      {name: 'esdoc-integrate-manual-plugin', option: option.manual},\n      {name: 'esdoc-integrate-test-plugin', option: option.test},\n      {name: 'esdoc-publish-html-plugin'}\n    ];\n\n    const existPluginNames = ev.data.plugins.map(plugin => plugin.name);\n    for (const plugin of plugins) {\n      if (existPluginNames.includes(plugin.name)) continue;\n      if (plugin.option === undefined) delete plugin.option;\n      ev.data.plugins.push(plugin);\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-standard-plugin/test/README.md",
    "content": "[![Build Status](https://travis-ci.org/esdoc/esdoc.svg?branch=master)](https://travis-ci.org/esdoc/esdoc)\n[![Coverage Status](https://coveralls.io/repos/esdoc/esdoc/badge.svg)](https://coveralls.io/r/esdoc/esdoc)\n\n# ESDoc Test Fixture\nthis is ESDoc Test Fixture README.\n\n- item1\n- item2\n- item3\n\n1st line.\nsecond line.\n\nhttp://github.com/h13i32maru/esdoc\n\n```javascript\nexport default class Foo {\n  static get foo() {}\n  \n  constructor(p1) {\n  }\n}\nvar foo = 123;\n```\n\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Content Cell  | Content Cell  |\n| Content Cell  | Content Cell  |\n\n**text**\n\n~~text~~\n\n# text\n## text\n### text\n#### text\n##### text\n"
  },
  {
    "path": "esdoc-standard-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"index\": \"./test/README.md\",\n  \"package\": \"./test/package.json\",\n  \"plugins\": [\n    {\n      \"name\": \"./src/Plugin.js\",\n      \"option\": {\n        \"brand\": {\n          \"title\": \"My Library\"\n        },\n        \"manual\": {\n          \"files\": [\"./test/manual/overview.md\"]\n        },\n        \"test\": {\n          \"source\": \"./test/test\",\n          \"includes\": [\"Test.js$\"]\n        }\n      }\n    },\n    {\n      \"name\": \"./test/spy-plugin.js\"\n    }\n  ]\n}\n"
  },
  {
    "path": "esdoc-standard-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-standard-plugin/test/manual/overview.md",
    "content": "# This is Overview\nfixture\n"
  },
  {
    "path": "esdoc-standard-plugin/test/package.json",
    "content": "{\n  \"name\": \"esdoc-test-fixture\",\n  \"version\": \"1.2.3\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc\"\n  },\n  \"main\": \"./src/Class/Definition.js\"\n}\n"
  },
  {
    "path": "esdoc-standard-plugin/test/spy-plugin.js",
    "content": "exports.onHandlePlugins = function(ev) {\n  exports.testTargetPlugins = ev.data.plugins;\n};\n\n"
  },
  {
    "path": "esdoc-standard-plugin/test/src/MyClass.js",
    "content": "export default class MyClass {\n  /**\n   * this is invalid param name.\n   * @param xxx\n   */\n  invalidMeethod(p){}\n\n  /**\n   * @param {number} p\n   */\n  method1(p){}\n\n  /**\n   * @protected\n   */\n  method2(){}\n\n  /**\n   * @private\n   */\n  method3(){}\n\n  _method4(p = 1){}\n}\n"
  },
  {
    "path": "esdoc-standard-plugin/test/src/Plugin.test.js",
    "content": "const assert = require('assert');\nconst path = require('path');\n\ndescribe('test standard plugin:', ()=>{\n  it('dynamically load plugins', ()=>{\n    const plugins = require('../spy-plugin.js').testTargetPlugins;\n\n    assert.deepEqual(plugins, [\n      {name: './src/Plugin.js', option: {\n        brand: {\n          title: 'My Library'\n        },\n        manual: {\n          files: ['./test/manual/overview.md']\n        },\n        test: {\n          source: \"./test/test\",\n          includes: [\"Test.js$\"]\n        }\n      }},\n      {name: './test/spy-plugin.js'},\n      {name: 'esdoc-lint-plugin'},\n      {name: 'esdoc-coverage-plugin'},\n      {name: 'esdoc-accessor-plugin'},\n      {name: 'esdoc-type-inference-plugin'},\n      {name: 'esdoc-external-ecmascript-plugin'},\n      {name: 'esdoc-brand-plugin', option: {title: 'My Library'}},\n      {name: 'esdoc-undocumented-identifier-plugin'},\n      {name: 'esdoc-unexported-identifier-plugin'},\n      {name: 'esdoc-integrate-manual-plugin', option: {\n        coverage: true,\n        files: ['./test/manual/overview.md']\n      }},\n      {name: 'esdoc-integrate-test-plugin', option: {\n        source: \"./test/test\",\n        interfaces: [\"describe\", \"it\", \"context\", \"suite\", \"test\"],\n        includes: [\"Test.js$\"],\n        excludes: [\"\\\\.config\\\\.js$\"]\n      }},\n      {name: 'esdoc-publish-html-plugin'},\n    ]);\n\n  });\n});\n"
  },
  {
    "path": "esdoc-standard-plugin/test/test/MyClassTest.js",
    "content": "const assert = require('assert');\nconst MyClass = require('../src/MyClass');\n\n/**\n * @test {MyClass}\n */\ndescribe('MyClass', ()=>{\n  it('has MyClass', ()=>{\n    assert(MyClass)\n  });\n});\n"
  },
  {
    "path": "esdoc-type-inference-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## Next\n- **Fix**\n  - Crash if `export default foo = new Foo()` ([#55](https://github.com/esdoc/esdoc-plugins/pull/55)). Thanks [@ushu](https://github.com/ushu)\n\n## 1.0.1 (2017-09-03)\n- **Fix**\n  - Broken if array sparse destructuring ([esdoc/esdoc#394](https://github.com/esdoc/esdoc/pull/394)) Thanks [@technicallyfeasible](https://github.com/technicallyfeasible)\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-type-inference-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-type-inference-plugin/README.md",
    "content": "# ESDoc Type Inference Plugin(PoC)\n**This is Proof of Concept**\n## Install\n```bash\nnpm install esdoc-type-inference-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-type-inference-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n- `enable` is default `true`\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-type-inference-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-type-inference-plugin\",\n  \"version\": \"1.0.1\",\n  \"description\": \"A type inference plugin for ESDoc [PoC]\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"inference\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-type-inference-plugin/src/Plugin.js",
    "content": "const ASTNodeContainer = require('esdoc/out/src/Util/ASTNodeContainer.js').default;\nconst ASTUtil = require('esdoc/out/src/Util/ASTUtil').default;\n\nclass Plugin {\n  onHandleDocs(ev) {\n    this._docs = ev.data.docs;\n    this._option = ev.data.option || {};\n\n    if (!('enable' in this._option)) this._option.enable = true;\n\n    this._exec();\n  }\n\n  _exec() {\n    if (!this._option.enable) return this._docs;\n\n    this._inferenceMethod();\n    this._inferenceFunction();\n    this._inferenceGetter();\n    this._inferenceSetter();\n    this._inferenceMember();\n    this._inferenceVariable();\n  }\n\n  _inferenceMethod() {\n    const docs = this._docs.filter((doc) => doc.kind === 'method');\n\n    for (const doc of docs) {\n      const node = ASTNodeContainer.getNode(doc.__docId__);\n      if (!doc.params) doc.params = this._inferenceParam(node);\n      if (!doc.return) doc.return = this._inferenceReturn(node);\n    }\n  }\n\n  _inferenceFunction() {\n    const docs = this._docs.filter((doc) => doc.kind === 'function');\n\n    for (const doc of docs) {\n      const node = ASTNodeContainer.getNode(doc.__docId__);\n      if (!doc.params) doc.params = this._inferenceParam(node);\n      if (!doc.return) doc.return = this._inferenceReturn(node);\n    }\n  }\n\n  _inferenceGetter() {\n    const docs = this._docs.filter((doc) => doc.kind === 'get');\n\n    for (const doc of docs) {\n      const node = ASTNodeContainer.getNode(doc.__docId__);\n      if (!doc.type) doc.type = this._inferenceReturn(node);\n    }\n  }\n\n  _inferenceSetter() {\n    // todo: infer setter is not working. please implement inference.\n    // const docs = this._docs.filter((doc) => doc.kind === 'set');\n    //\n    // for (const doc of docs) {\n    //   const node = ASTNodeContainer.getNode(doc.__docId__);\n    //   if (!doc.type) doc.type = this._inferenceType(node.right);\n    // }\n  }\n\n  _inferenceMember() {\n    const docs = this._docs.filter((doc) => doc.kind === 'member');\n\n    for (const doc of docs) {\n      const node = ASTNodeContainer.getNode(doc.__docId__);\n      if (!doc.type) doc.type = this._inferenceType(node.right);\n    }\n  }\n\n  _inferenceVariable() {\n    const docs = this._docs.filter((doc) => doc.kind === 'variable');\n\n    for (const doc of docs) {\n      if (doc.type) continue;\n\n      const node = ASTNodeContainer.getNode(doc.__docId__);\n\n      let className;\n\n      // e.g. `export default foo = new Foo();`\n      if (node.type === 'AssignmentExpression') {\n        if (node.right && node.right.type === 'NewExpression') {\n          className = node.right.callee.name;\n        } else {\n          doc.type = this._inferenceType(node.right);\n          continue;\n        }\n      }\n\n      // e.g. `let foo = new Foo();`\n      if (node.type === 'VariableDeclaration') {\n        if (node.declarations[0].init.type === 'NewExpression') {\n          className = node.declarations[0].init.callee.name;\n        } else {\n          doc.type = this._inferenceType(node.declarations[0].init);\n          continue;\n        }\n      }\n\n      // can not infer className\n      if (!className) {\n        doc.type = {types: ['*']};\n        continue;\n      }\n\n      if (className) {\n        // infer from same file.\n        const classDoc = this._docs.find((_doc) =>{\n          if (_doc.kind === 'class' && _doc.memberof === doc.memberof && _doc.name === className) {\n            return true;\n          }\n        });\n        if (classDoc) {\n          doc.type = {types: [classDoc.longname]};\n          continue;\n        }\n\n        // ambiguous infer from other file\n        const ambiguousClassDocs = this._docs.filter((_doc) => {\n          if (_doc.kind === 'class' && _doc.name === className) {\n            return true;\n          }\n        });\n        if (ambiguousClassDocs.length === 1) {\n          doc.type = {types: [ambiguousClassDocs[0].longname]};\n          continue;\n        }\n\n        // can not infer\n        doc.type = {types: ['*']};\n      } else {\n        doc.type = {types: ['*']};\n      }\n    }\n  }\n\n  _inferenceParam(node) {\n    const params = node.params;\n    const _params = [];\n    for (let i = 0; i < params.length; i++) {\n      const param = params[i];\n      const result = {};\n\n      switch (param.type) {\n        case 'Identifier':\n          // e.g. func(a){}\n          result.name = param.name;\n          result.types = ['*'];\n          break;\n\n        case 'AssignmentPattern':\n          if (param.left.type === 'Identifier') {\n            result.name = param.left.name;\n          } else if (param.left.type === 'ObjectPattern') {\n            result.name = `objectPattern${i === 0 ? '' : i}`;\n          } else if (param.left.type === 'ArrayPattern') {\n            result.name = `arrayPattern${i === 0 ? '' : i}`;\n          }\n\n          result.optional = true;\n\n          if (param.right.type.includes('Literal')) {\n            // e.g. func(a = 10){}\n            result.types = param.right.value === null ? ['*'] : [typeof param.right.value];\n            result.defaultRaw = param.right.value;\n            result.defaultValue = `${result.defaultRaw}`;\n          } else if (param.right.type === 'ArrayExpression') {\n            // e.g. func(a = [123]){}\n            result.types = param.right.elements.length ? [`${typeof param.right.elements[0].value}[]`] : ['*[]'];\n            result.defaultRaw = param.right.elements.map((elm)=> elm.value);\n            result.defaultValue = `${JSON.stringify(result.defaultRaw)}`;\n          } else if (param.right.type === 'ObjectExpression') {\n            const typeMap = {};\n            for (const prop of param.left.properties || []) {\n              typeMap[prop.key.name] = '*';\n            }\n\n            // e.g. func(a = {key: 123}){}\n            const obj = {};\n            for (const prop of param.right.properties) {\n              obj[prop.key.name] = prop.value.value;\n              typeMap[prop.key.name] = typeof prop.value.value;\n            }\n\n            const types = [];\n            for (const key of Object.keys(typeMap)) {\n              types.push(`\"${key}\": ${typeMap[key]}`);\n            }\n\n            result.types = [`{${types.join(', ')}}`];\n            result.defaultRaw = obj;\n            result.defaultValue = `${JSON.stringify(result.defaultRaw)}`;\n          } else if (param.right.type === 'Identifier') {\n            // e.g. func(a = value){}\n            result.types = ['*'];\n            result.defaultRaw = param.right.name;\n            result.defaultValue = `${param.right.name}`;\n          } else {\n            // e.g. func(a = new Foo()){}, func(a = foo()){}\n            // CallExpression, NewExpression\n            result.types = ['*'];\n          }\n          break;\n        case 'RestElement':\n          // e.g. func(...a){}\n          result.name = `${param.argument.name}`;\n          result.types = ['...*'];\n          result.spread = true;\n          break;\n        case 'ObjectPattern': {\n          const objectPattern = [];\n          const raw = {};\n          for (const property of param.properties) {\n            if (property.type === 'ObjectProperty') {\n              objectPattern.push(`\"${property.key.name}\": *`);\n              raw[property.key.name] = null;\n            } else if (property.type === 'RestProperty') {\n              objectPattern.push(`...${property.argument.name}: Object`);\n              raw[property.argument.name] = {};\n            }\n          }\n          result.name = `objectPattern${i === 0 ? '' : i}`;\n          result.types = [`{${objectPattern.join(', ')}}`];\n          result.defaultRaw = raw;\n          result.defaultValue = `${JSON.stringify(result.defaultRaw)}`;\n          break;\n        }\n        case 'ArrayPattern': {\n          // e.g. func([a, b = 10]){}\n          let arrayType = null;\n          const raw = [];\n\n          for (const element of param.elements) {\n            if (!element) { // case `function([, v]){}\n              raw.push('undefined');\n            } else if (element.type === 'Identifier') {\n              raw.push('null');\n            } else if (element.type === 'AssignmentPattern') {\n              if ('value' in element.right) {\n                if (!arrayType && element.right.value !== null) arrayType = typeof element.right.value;\n                raw.push(JSON.stringify(element.right.value));\n              } else {\n                raw.push('*');\n              }\n            }\n          }\n\n          if (!arrayType) arrayType = '*';\n          result.name = `arrayPattern${i === 0 ? '' : i}`;\n          result.types = [`${arrayType}[]`];\n          result.defaultRaw = raw;\n          result.defaultValue = `[${raw.join(', ')}]`;\n          break;\n        }\n        default:\n          logger.w('unknown param.type', param);\n      }\n\n      _params.push(result);\n    }\n\n    return _params;\n  }\n\n  _inferenceReturn(node) {\n    const body = node.body;\n    const result = {};\n    const inferenceType = this._inferenceType.bind(this);\n\n    ASTUtil.traverse(body, (node, parent, path)=>{\n      // `return` in Function is not the body's `return`\n      if (node.type.includes('Function')) {\n        path.skip();\n        return;\n      }\n\n      if (node.type !== 'ReturnStatement') return;\n\n      if (!node.argument) return;\n\n      result.types = inferenceType(node.argument).types;\n    });\n\n    if (result.types) {\n      return result;\n    }\n\n    return null;\n  }\n\n  _inferenceType(right) {\n    if (!right) {\n      return {types: ['*']};\n    }\n\n    if (right.type === 'TemplateLiteral') {\n      return {types: ['string']};\n    }\n\n    if (right.type === 'NullLiteral') {\n      return {types: ['*']};\n    }\n\n    if (right.type.includes('Literal')) {\n      return {types: [typeof right.value]};\n    }\n\n    if (right.type === 'ArrayExpression') {\n      if (right.elements.length) {\n        return {types: [`${typeof right.elements[0].value}[]`]};\n      } else {\n        return {types: ['*[]']};\n      }\n    }\n\n    if (right.type === 'ObjectExpression') {\n      const typeMap = {};\n      for (const prop of right.properties) {\n        switch (prop.type) {\n          case 'ObjectProperty': {\n            const name = `\"${prop.key.name || prop.key.value}\"`;\n            typeMap[name] = prop.value.value ? typeof prop.value.value : '*';\n            break;\n          }\n          case 'ObjectMethod': {\n            const name = `\"${prop.key.name || prop.key.value}\"`;\n            typeMap[name] = 'function';\n            break;\n          }\n          case 'SpreadProperty': {\n            const name = `...${prop.argument.name}`;\n            typeMap[name] = 'Object';\n            break;\n          }\n          default: {\n            const name = `\"${prop.key.name || prop.key.value}\"`;\n            typeMap[name] = '*';\n          }\n        }\n      }\n\n      const types = [];\n      for (const key of Object.keys(typeMap)) {\n        types.push(`${key}: ${typeMap[key]}`);\n      }\n\n      return {types: [`{${types.join(', ')}}`]};\n    }\n\n    return {types: ['*']};\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Getter.js",
    "content": "export default class TestGetter {\n  get getLiteral () {\n    return 123;\n  }\n\n  get getArray () {\n    return [123, 456];\n  }\n\n  get getObject() {\n    return {x1: 123, x2: 'text'};\n  }\n\n  get getTemplateLiteral() {\n    return `text`;\n  }\n}\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Getter.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Getter.js:', ()=>{\n  it('infer type that is literal', ()=>{\n    const doc = find('longname', 'src/Getter.js~TestGetter#getLiteral');\n    assert.deepEqual(doc.type, {types: ['number']});\n  });\n\n  it('infer type that is array', ()=>{\n    const doc = find('longname', 'src/Getter.js~TestGetter#getArray');\n    assert.deepEqual(doc.type, {types: ['number[]']});\n  });\n\n  it('infer type that is object', ()=>{\n    const doc = find('longname', 'src/Getter.js~TestGetter#getObject');\n    assert.deepEqual(doc.type, {types: ['{\"x1\": number, \"x2\": string}']});\n  });\n\n  it('infer type that is template literal', ()=>{\n    const doc = find('longname', 'src/Getter.js~TestGetter#getTemplateLiteral');\n    assert.deepEqual(doc.type, {types: ['string']});\n  });\n});\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Member.js",
    "content": "export default class TestMember {\n  constructor() {\n    // literal\n    this.memberLiteral = 123;\n\n    // array\n    this.memberArray = [123, 456];\n\n    // object\n    this.memberObject = {x1: 123, x2: 'text'};\n\n    // template literal\n    this.memberTemplateLiteral= `text`;\n  }\n}\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Member.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Member.js:', ()=>{\n  it('infer type that is literal', ()=>{\n    const doc = find('longname', 'src/Member.js~TestMember#memberLiteral');\n    assert.deepEqual(doc.type, {types: ['number']});\n  });\n\n  it('infer type that is array', ()=>{\n    const doc = find('longname', 'src/Member.js~TestMember#memberArray');\n    assert.deepEqual(doc.type, {types: ['number[]']});\n  });\n\n  it('infer type that is object', ()=>{\n    const doc = find('longname', 'src/Member.js~TestMember#memberObject');\n    assert.deepEqual(doc.type, {types: ['{\"x1\": number, \"x2\": string}']});\n  });\n\n  it('infer type that is template literal', ()=>{\n    const doc = find('longname', 'src/Member.js~TestMember#memberTemplateLiteral');\n    assert.deepEqual(doc.type, {types: ['string']});\n  });\n});\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Param.js",
    "content": "export default class TestParam {\n  // literal default\n  methodLiteral(p1 = 123){}\n\n  // identifier default\n  methodIdentifier(p1 = value){}\n\n  // new expression default\n  methodNewExpression(p1 = new Foo()){}\n\n  // array default\n  methodArray(p1 = [123, 456]){}\n\n  // array destructuring\n  methodArrayDestructuring([p1, p2]){}\n\n  // array default and destructuring\n  methodArrayAndDestructuring([p1, p2] = [123, 456]){}\n\n  // sparse array destructuring\n  methodArraySparseDestructuring([, p2]) {}\n\n  // object default\n  methodObject(p1 = {x1: \"text\", x2: true}){}\n\n  // object destructuring\n  methodObjectDestructuring({x1, x2}){}\n\n  // object default and destructuring\n  methodObjectAndDestructuring({x1, x2} = {x1: 123, x2: \"text\"}){}\n\n  // spread\n  methodSpread(...p1){}\n\n  // array destructuring and partial default\n  methodArrayDestructuringAndPartialDefault([p1, p2 = 10, p3 = null, p4 = 'text', p5 = v]){}\n}\n\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Param.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Param.js:', ()=> {\n  it('infer literal param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodLiteral');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"p1\",\n        \"optional\": true,\n        \"types\": [\n          \"number\"\n        ],\n        \"defaultRaw\": 123,\n        \"defaultValue\": \"123\"\n      }\n    ]);\n  });\n\n  it('infer identifier param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodIdentifier');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"p1\",\n        \"optional\": true,\n        \"types\": [\n          \"*\"\n        ],\n        \"defaultRaw\": \"value\",\n        \"defaultValue\": \"value\"\n      }\n    ]);\n  });\n\n  it('infer new expression param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodNewExpression');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"p1\",\n        \"optional\": true,\n        \"types\": [\n          \"*\"\n        ]\n      }\n    ]);\n  });\n\n  it('infer array param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodArray');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"p1\",\n        \"optional\": true,\n        \"types\": [\n          \"number[]\"\n        ],\n        \"defaultRaw\": [\n          123,\n          456\n        ],\n        \"defaultValue\": \"[123,456]\"\n      }\n    ]);\n  });\n\n  it('infer array destructuring param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodArrayDestructuring');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"arrayPattern\",\n        \"types\": [\n          \"*[]\"\n        ],\n        \"defaultRaw\": [\n          \"null\",\n          \"null\"\n        ],\n        \"defaultValue\": \"[null, null]\"\n      }\n    ]);\n  });\n\n  it('infer array default and destructuring param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodArrayAndDestructuring');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"arrayPattern\",\n        \"optional\": true,\n        \"types\": [\n          \"number[]\"\n        ],\n        \"defaultRaw\": [\n          123,\n          456\n        ],\n        \"defaultValue\": \"[123,456]\"\n      }\n    ]);\n  });\n\n  it('infer array sparse destructuring param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodArraySparseDestructuring');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"arrayPattern\",\n        \"types\": [\n          \"*[]\"\n        ],\n        \"defaultRaw\": [\n          'undefined',\n          'null'\n        ],\n        \"defaultValue\": \"[undefined, null]\"\n      }\n    ]);\n  });\n\n  it('infer object param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodObject');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"p1\",\n        \"optional\": true,\n        \"types\": [\n          \"{\\\"x1\\\": string, \\\"x2\\\": boolean}\"\n        ],\n        \"defaultRaw\": {\n          \"x1\": \"text\",\n          \"x2\": true\n        },\n        \"defaultValue\": \"{\\\"x1\\\":\\\"text\\\",\\\"x2\\\":true}\"\n      }\n    ]);\n  });\n\n  it('infer object destructuring param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodObjectDestructuring');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"objectPattern\",\n        \"types\": [\n          \"{\\\"x1\\\": *, \\\"x2\\\": *}\"\n        ],\n        \"defaultRaw\": {\n          \"x1\": null,\n          \"x2\": null\n        },\n        \"defaultValue\": \"{\\\"x1\\\":null,\\\"x2\\\":null}\"\n      }\n    ]);\n  });\n\n  it('infer object default and destructuring param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodObjectAndDestructuring');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"objectPattern\",\n        \"optional\": true,\n        \"types\": [\n          \"{\\\"x1\\\": number, \\\"x2\\\": string}\"\n        ],\n        \"defaultRaw\": {\n          \"x1\": 123,\n          \"x2\": \"text\"\n        },\n        \"defaultValue\": \"{\\\"x1\\\":123,\\\"x2\\\":\\\"text\\\"}\"\n      }\n    ]);\n  });\n\n  it('infer spread param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodSpread');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"p1\",\n        \"types\": [\n          \"...*\"\n        ],\n        \"spread\": true\n      }\n    ]);\n  });\n\n  it('infer array destructuring and partial default param', ()=>{\n    const doc = find('longname', 'src/Param.js~TestParam#methodArrayDestructuringAndPartialDefault');\n    assert.deepEqual(doc.params, [\n      {\n        \"name\": \"arrayPattern\",\n        \"types\": [\n          \"number[]\"\n        ],\n        \"defaultRaw\": [\n          \"null\",\n          \"10\",\n          \"*\",\n          \"\\\"text\\\"\",\n          \"*\"\n        ],\n        \"defaultValue\": \"[null, 10, *, \\\"text\\\", *]\"\n      }\n    ]);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Return.js",
    "content": "export default class TestReturn {\n  // literal\n  methodLiteral(){\n    return 123;\n  }\n\n  // array\n  methodArray(){\n    return [123, 456];\n  }\n\n  // object\n  methodObject(){\n    return {x1: 123, x2: 'text'};\n  }\n\n  // template literal\n  methodTemplateLiteral(){\n    return `text`;\n  }\n}\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Return.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Return.js:', ()=>{\n  it('infer return value that is literal', ()=>{\n    const doc = find('longname', 'src/Return.js~TestReturn#methodLiteral');\n    assert.deepEqual(doc.return, {types: ['number']});\n  });\n\n  it('infer return value that is array', ()=>{\n    const doc = find('longname', 'src/Return.js~TestReturn#methodArray');\n    assert.deepEqual(doc.return, {types: ['number[]']});\n  });\n\n  it('infer return value that is object', ()=>{\n    const doc = find('longname', 'src/Return.js~TestReturn#methodObject');\n    assert.deepEqual(doc.return, {types: ['{\"x1\": number, \"x2\": string}']});\n  });\n\n  it('infer return value that is template literal', ()=>{\n    const doc = find('longname', 'src/Return.js~TestReturn#methodTemplateLiteral');\n    assert.deepEqual(doc.return, {types: ['string']});\n  });\n});\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Variable.js",
    "content": "// literal\nexport const testVariableLiteral = 123;\n\n// array\nexport const testVariableArray = [123, 456];\n\n// object\nexport const testVariableObject = {x1: 123, x2: \"text\"};\n\n// template literal\nexport const testVariableTemplateLiteral = `text`;\n\n// new expression with same file\nexport class TestVariableNewExpression {}\nexport default new TestVariableNewExpression();\n\n// new expression with other file\nimport TestMember from './Member';\nexport const testVariableNewExpressionOtherFile = new TestMember();\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/src/Variable.test.js",
    "content": "const assert = require('assert');\nconst {find} = require('../util');\n\ndescribe('test/Variable.js:', ()=>{\n  it('infer type that is literal', ()=>{\n    const doc = find('longname', 'src/Variable.js~testVariableLiteral');\n    assert.deepEqual(doc.type, {types: ['number']});\n  });\n\n  it('infer type that is array', ()=>{\n    const doc = find('longname', 'src/Variable.js~testVariableArray');\n    assert.deepEqual(doc.type, {types: ['number[]']});\n  });\n\n  it('infer type that is object', ()=>{\n    const doc = find('longname', 'src/Variable.js~testVariableObject');\n    assert.deepEqual(doc.type, {types: ['{\"x1\": number, \"x2\": string}']});\n  });\n\n  it('infer type that is template literal', ()=>{\n    const doc = find('longname', 'src/Variable.js~testVariableTemplateLiteral');\n    assert.deepEqual(doc.type, {types: ['string']});\n  });\n\n  it('infer type that is new expression with same file', ()=>{\n    const doc = find('longname', 'src/Variable.js~testVariableNewExpression');\n    assert.deepEqual(doc.type, {types: ['src/Variable.js~TestVariableNewExpression']});\n  });\n\n  it('infer type that is new expression with other file', ()=>{\n    const doc = find('longname', 'src/Variable.js~testVariableNewExpressionOtherFile');\n    assert.deepEqual(doc.type, {types: ['src/Member.js~TestMember']});\n  });\n});\n"
  },
  {
    "path": "esdoc-type-inference-plugin/test/util.js",
    "content": "exports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n"
  },
  {
    "path": "esdoc-typescript-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## Next\n- **Fix**\n  - Crash if overload methods ([#42](https://github.com/esdoc/esdoc-plugins/pull/42)). Thanks [@tchakabam](https://github.com/tchakabam)\n- **Chore**\n  - Update typescript\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-typescript-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-typescript-plugin/README.md",
    "content": "# ESDoc TypeScript Plugin (PoC)\n**This plugin is proof of concept**\n\n## Install\n```bash\nnpm install esdoc-typescript-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-typescript-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n- `enable` is default `true`\n\n## Example\n```js\nexport class Foo {\n  // without document, with initializer\n  member: number = 10;\n  \n  // without document\n  method1(n: number): string {\n  }\n  \n  // without @param and @return\n  /**\n   * this is method2.\n   */\n  method2(n: number): string {\n  }\n  \n  // without type in @param and @return\n  /**\n   * this is method3.\n   * @param n - this is param desc.\n   * @return this is return desc. \n   */\n  method3(n: number): string {\n  }\n}\n```\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-typescript-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-typescript-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A TypeScript plugin for ESDoc [PoC]\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"dependencies\": {\n    \"typescript\": \"^2.8.3\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"^1.1.0\",\n    \"esdoc-standard-plugin\": \"^1.0.0\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"typescript\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-typescript-plugin/src/Plugin.js",
    "content": "const path = require('path');\nconst ts = require('typescript');\nconst CommentParser = require('esdoc/out/src/Parser/CommentParser').default;\n\nclass Plugin {\n  constructor() {\n    this._enable = true;\n  }\n\n  onStart(ev) {\n    if (!ev.data.option) return;\n    if ('enable' in ev.data.option) this._enable = ev.data.option.enable;\n  }\n\n  onHandleConfig(ev) {\n    if (!this._enable) return;\n\n    if (!ev.data.config.includes)  ev.data.config.includes = [];\n    ev.data.config.includes.push('\\\\.ts$', '\\\\.js$');\n  }\n\n  onHandleCodeParser(ev) {\n    if (!this._enable) return;\n\n    const esParser = ev.data.parser;\n    const esParserOption = ev.data.parserOption;\n    const filePath = ev.data.filePath;\n\n    // ev.data.parser = this._tsParser.bind(this, esParser, esParserOption, filePath);\n\n    ev.data.parser = (code) =>{\n      try {\n        return this._tsParser(esParser, esParserOption, filePath, code);\n      } catch(e) {\n        console.log(e)\n      }\n    };\n  }\n\n  // https://github.com/Microsoft/TypeScript/blob/master/src/services/transpile.ts#L26\n  _tsParser(esParser, esParserOption, filePath, code) {\n    // return if not typescript\n    if (path.extname(filePath) !== '.ts') return esParser(code);\n\n    // create ast and get target nodes\n    const sourceFile = ts.createSourceFile(filePath, code, ts.ScriptTarget.Latest, true);\n    const nodes = this._getTargetTSNodes(sourceFile);\n\n    // rewrite jsdoc comment\n    nodes.sort((a,b) => b.pos - a.pos); // hack: transpile comment with reverse\n    const codeChars = [...code];\n    for (const node of nodes) {\n      const jsDocNode = this._getJSDocNode( node);\n      if (jsDocNode && jsDocNode.comment) codeChars.splice(jsDocNode.pos, jsDocNode.end - jsDocNode.pos);\n\n      const newComment = this._transpileComment(node, jsDocNode ? jsDocNode.comment : '', code);\n      codeChars.splice(node.pos, 0, newComment);\n    }\n    const newTSCode = codeChars.join('');\n\n    // transpile typescript to es\n    const esCode = this._transpileTS2ES(newTSCode);\n\n    return esParser(esCode);\n  }\n\n  _getTargetTSNodes(sourceFile) {\n    const nodes = [];\n    walk(sourceFile);\n    return nodes;\n\n    function walk(node) {\n      switch (node.kind) {\n        case ts.SyntaxKind.ClassDeclaration:\n        case ts.SyntaxKind.MethodDeclaration:\n        case ts.SyntaxKind.PropertyDeclaration:\n        case ts.SyntaxKind.GetAccessor:\n        case ts.SyntaxKind.SetAccessor:\n        case ts.SyntaxKind.FunctionDeclaration:\n          nodes.push(node);\n          break;\n      }\n\n      ts.forEachChild(node, walk);\n    }\n  }\n\n  _getJSDocNode(node) {\n    if (!node.jsDoc) return null;\n\n    return node.jsDoc[node.jsDoc.length - 1];\n  }\n\n  _transpileComment(node, comment, code) {\n    const esNode = {type: 'CommentBlock', value: `*\\n${comment}`};\n    const tags = CommentParser.parse(esNode);\n\n    this._applyLOC(node, tags, code);\n\n    switch(node.kind) {\n      case ts.SyntaxKind.ClassDeclaration:\n        // do nothing\n        break;\n      case ts.SyntaxKind.MethodDeclaration:\n        this._applyCallableParam(node, tags);\n        this._applyCallableReturn(node, tags);\n        break;\n      case ts.SyntaxKind.PropertyDeclaration:\n        this._applyClassProperty(node, tags);\n        break;\n      case ts.SyntaxKind.GetAccessor:\n        this._applyClassMethodGetter(node, tags);\n        break;\n      case ts.SyntaxKind.SetAccessor:\n        this._applyClassMethodSetter(node, tags);\n        break;\n      case ts.SyntaxKind.FunctionDeclaration:\n        this._applyCallableParam(node, tags);\n        this._applyCallableReturn(node, tags);\n        break;\n    }\n\n    return `\\n/*${CommentParser.buildComment(tags)} */\\n`;\n  }\n\n  _applyLOC(node, tags, code) {\n    let loc = 1;\n    const codeChars = [...code];\n    for (let i = 0; i < node.name.end; i++) {\n      if (codeChars[i] === '\\n') loc++;\n    }\n    tags.push({tagName: '@lineNumber', tagValue: `${loc}`});\n  }\n\n  _applyCallableParam(node, tags) {\n    const types = node.parameters.map(param => {\n      return {\n        type: this._getTypeFromAnnotation(param.type),\n        name: param.name.text\n      };\n    });\n\n    const paramTags = tags.filter(tag => tag.tagName === '@param');\n\n    // merge\n    // case: params without comments\n    if (paramTags.length === 0 && types.length) {\n      const tmp = types.map(({type, name}) => {\n        return {\n          tagName: '@param',\n          tagValue: `{${type}} ${name}`\n        };\n      });\n      tags.push(...tmp);\n      return;\n    }\n\n    // case: params with comments\n    if (paramTags.length === types.length) {\n      for (let i = 0; i < paramTags.length; i++) {\n        const paramTag = paramTags[i];\n        const type = types[i];\n        if (paramTag.tagValue.charAt(0) !== '{') { // does not have type\n          paramTag.tagValue = `{${type.type}} ${paramTag.tagValue}`;\n        }\n      }\n      return;\n    }\n\n    // case: mismatch params and comments\n    throw new Error('mismatch params and comments');\n  }\n\n  _applyCallableReturn(node, tags) {\n    if (!node.type) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(node.type);\n    if (!type) return;\n\n    // get comments\n    const returnTag = tags.find(tag => tag.tagName === '@return' || tag.tagName === '@returns');\n\n    // merge\n    if (returnTag && returnTag.tagValue.charAt(0) !== '{') { // return with comment but does not have type\n      returnTag.tagValue = `{${type}} ${returnTag.tagValue}`;\n    } else {\n      tags.push({tagName: '@return', tagValue: `{${type}}`});\n    }\n  }\n\n  _applyClassMethodGetter(node, tags) {\n    if (!node.type) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(node.type);\n    if (!type) return;\n\n    // get comments\n    const typeComment = tags.find(tag => tag.tagName === '@type');\n\n    if (typeComment && typeComment.tagValue.charAt(0) !== '{') { // type with comment but does not have tpe\n      typeComment.tagValue = `{${type}}`;\n    } else {\n      tags.push({tagName: '@type', tagValue: `{${type}}`});\n    }\n  }\n\n  _applyClassMethodSetter(node, tags) {\n    if (!node.parameters) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(node.parameters[0].type);\n    if (!type) return;\n\n    // get comment\n    const typeComment = tags.find(tag => tag.tagName === '@type');\n    if (typeComment) return;\n\n    // merge\n    // case: param without comment\n    tags.push({tagName: '@type', tagValue: `{${type}}`});\n  }\n\n  _applyClassProperty(node, tags) {\n    if (!node.type) return;\n\n    // get type\n    const type = this._getTypeFromAnnotation(node.type);\n    if (!type) return;\n\n    // get comments\n    const typeComment = tags.find(tag => tag.tagName === '@type');\n\n    if (typeComment && typeComment.tagValue.charAt(0) !== '{') { // type with comment but does not have tpe\n      typeComment.tagValue = `{${type}}`;\n    } else {\n      tags.push({tagName: '@type', tagValue: `{${type}}`});\n    }\n  }\n\n  _getTypeFromAnnotation(typeNode) {\n    if (!typeNode) {\n      return 'undefined';\n    }\n\n    switch(typeNode.kind) {\n      case ts.SyntaxKind.NumberKeyword: return 'number';\n      case ts.SyntaxKind.StringKeyword: return 'string';\n      case ts.SyntaxKind.BooleanKeyword: return 'boolean';\n      case ts.SyntaxKind.TypeReference: return typeNode.typeName.text;\n    }\n  }\n\n  _transpileTS2ES(tsCode) {\n    // todo\n    const esOption = {\n      decorators: true,\n      jsx: true,\n    };\n    const options = {\n      module: ts.ModuleKind.ES2015,\n      noResolve: true,\n      target: ts.ScriptTarget.Latest,\n      experimentalDecorators: esOption.decorators,\n      jsx: esOption.jsx ? 'preserve' : undefined,\n    };\n\n    const result = ts.transpileModule(tsCode, {compilerOptions: options});\n    return result.outputText;\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-typescript-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"},\n    {\"name\": \"esdoc-standard-plugin\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-typescript-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-typescript-plugin/test/src/TypeScript.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test/TypeScript.js:', ()=> {\n  it('has type of method, without comment', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~TestTypeScriptClass#method1');\n\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n\n  it('has type of method, without tags', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~TestTypeScriptClass#method2');\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n\n  it('has type of method, without type', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~TestTypeScriptClass#method3');\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n\n  it('has type of getter, without comment', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~TestTypeScriptClass#getter1');\n    assert.deepEqual(doc.type.types, ['string']);\n  });\n\n  it('has type of setter, without comment', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~TestTypeScriptClass#setter1');\n    assert.deepEqual(doc.type.types, ['number']);\n  });\n\n  it('has type of member, without comment', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~TestTypeScriptClass#member1');\n    assert.deepEqual(doc.type.types, ['number']);\n  });\n\n  it('has type of function, without comment', ()=>{\n    const doc = find('longname', 'src/TypeScript.ts~testTypeScriptFunction');\n\n    assert.equal(doc.params.length, 2);\n    assert.deepEqual(doc.params[0].types, ['number']);\n    assert.deepEqual(doc.params[1].types, ['Foo']);\n\n    assert.deepEqual(doc.return.types, ['string']);\n  });\n});\n\n\n"
  },
  {
    "path": "esdoc-typescript-plugin/test/src/TypeScript.ts",
    "content": "/**\n * this is TestTypeScriptClass.\n */\nexport class TestTypeScriptClass {\n  member1: number = null;\n\n  get getter1(): string { return 'Hello'; }\n\n  set setter1(v: number) {}\n\n  method1(n: number, x: Foo): string {\n    return 'Hello'.repeat(n);\n  }\n\n  /**\n   * this is method2.\n   */\n  method2(n: number, x: Foo): string {\n    return 'Hello'.repeat(n);\n  }\n\n  /**\n   * this is method3.\n   * @param n - this is n\n   * @param x - this is x\n   * @return this is return\n   */\n  method3(n: number, x: Foo): string {\n    return 'Hello'.repeat(n);\n  }\n}\n\nexport function testTypeScriptFunction(n: number, x: Foo): string{ return 'Hello'; }\n\nexport class Foo{}\n"
  },
  {
    "path": "esdoc-typescript-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/README.md",
    "content": "# ESDoc Undocumented Identifier Plugin\n## Install\n```bash\nnpm install esdoc-undocumented-identifier-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-undocumented-identifier-plugin\", \"option\": {\"enable\": true}}\n  ]\n}\n```\n\n`enable` is default `true`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-undocumented-identifier-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A undocumented identifier plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"undocument\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/src/Plugin.js",
    "content": "class Plugin {\n  onHandleDocs(ev) {\n    this._option = ev.data.option || {};\n    if (!('enable' in this._option)) this._option.enable = true;\n\n    const ignore = !this._option.enable;\n\n    for (const doc of ev.data.docs) {\n      if (doc.undocument === true && ignore && !('ignore' in doc))  {\n        doc.ignore = ignore;\n      }\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/test/src/MyClass.js",
    "content": "export class MyClass1 {\n}\n\n/**\n * this is desc\n * @ignore\n */\nexport class MyClass2 {\n}\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test undocumented identifier result:', ()=> {\n  it('does not ignore undocumented identifier.', ()=>{\n    const doc = find('name', 'MyClass1');\n    assert.equal(doc.undocument, true);\n    assert.equal(doc.ignore, undefined);\n  });\n\n  it('ignores documented identifier with @ignore.', ()=>{\n    const doc = find('name', 'MyClass2');\n    assert.equal(doc.undocument, undefined);\n    assert.equal(doc.ignore, true);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-undocumented-identifier-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 (2017-07-30)\n- Release\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ryo Maruyama\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\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/README.md",
    "content": "# ESDoc Unexported Identifier Plugin\n## Install\n```bash\nnpm install esdoc-unexported-identifier-plugin\n```\n\n## Config\n```json\n{\n  \"source\": \"./src\",\n  \"destination\": \"./doc\",\n  \"plugins\": [\n    {\"name\": \"esdoc-unexported-identifier-plugin\", \"option\": {\"enable\": false}}\n  ]\n}\n```\n\n`enable` is default `false`.\n\n## LICENSE\nMIT\n\n## Author\n[Ryo Maruyama@h13i32maru](https://github.com/h13i32maru)\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/package.json",
    "content": "{\n  \"name\": \"esdoc-unexported-identifier-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A unexported identifier plugin for ESDoc\",\n  \"author\": \"h13i32maru\",\n  \"homepage\": \"https://github.com/esdoc/esdoc-plugins\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/esdoc/esdoc-plugins\"\n  },\n  \"devDependencies\": {\n    \"esdoc\": \"latest\",\n    \"mocha\": \"2.5.3\"\n  },\n  \"engines\": {\n    \"node\": \">= 6.0.0\"\n  },\n  \"scripts\": {\n    \"test\": \"rm -rf ./test/out && mocha --require ./test/init.js $(find test/ -regex '.*.test.js$') -R spec\"\n  },\n  \"keywords\": [\n    \"esdoc\",\n    \"unexported\",\n    \"plugin\"\n  ],\n  \"files\": [\n    \"src\",\n    \"README.md\"\n  ],\n  \"main\": \"src/Plugin.js\"\n}\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/src/Plugin.js",
    "content": "class Plugin {\n  onHandleDocs(ev) {\n    const option = ev.data.option || {};\n    if (!('enable' in option)) option.enable = false;\n\n    const ignore = !option.enable;\n\n    for (const doc of ev.data.docs) {\n      if (doc.export === false && ignore && !('ignore' in doc))  {\n        doc.ignore = ignore;\n      }\n    }\n  }\n}\n\nmodule.exports = new Plugin();\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/test/esdoc.json",
    "content": "{\n  \"source\": \"./test/src\",\n  \"destination\": \"./test/out\",\n  \"excludes\": [\"\\\\.test\\\\.js$\"],\n  \"plugins\": [\n    {\"name\": \"./src/Plugin.js\"}\n  ]\n}\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/test/init.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst ESDocCLI = require('esdoc/out/src/ESDocCLI.js').default;\n\nfunction cli() {\n  const cliPath = path.resolve('./node_modules/esdoc/out/ESDocCLI.js');\n  const argv = ['node', cliPath, '-c', './test/esdoc.json'];\n  const cli = new ESDocCLI(argv);\n  cli.exec();\n  global.docs = JSON.parse(fs.readFileSync('./test/out/index.json').toString());\n}\n\ncli();\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/test/src/MyClass.js",
    "content": "class MyClass1 {\n}\n\n/**\n * @ignore\n */\nexport class MyClass2 {\n}\n\nexport class MyClass3 {\n}\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/test/src/MyClass.test.js",
    "content": "const assert = require('assert');\nconst {find, file} = require('../util');\n\ndescribe('test unexported identifier result:', ()=> {\n\n  it('ignores unexported identifier.', ()=>{\n    const doc = find('name', 'MyClass1');\n    assert.equal(doc.export, false);\n    assert.equal(doc.ignore, true);\n  });\n\n  it('ignores exported identifier with @ignore.', ()=>{\n    const doc = find('name', 'MyClass2');\n    assert.equal(doc.export, true);\n    assert.equal(doc.ignore, true);\n  });\n\n  it('does not ignore exported identifier.', ()=>{\n    const doc = find('name', 'MyClass3');\n    assert.equal(doc.export, true);\n    assert.equal(doc.ignore, undefined);\n  });\n});\n\n"
  },
  {
    "path": "esdoc-unexported-identifier-plugin/test/util.js",
    "content": "const fs = require('fs');\n\nexports.find = function(key, ...values) {\n  if (values.length === 1) {\n    return global.docs.find((doc) => {\n      if (typeof values[0] === 'string') return doc[key] === values[0];\n      if (values[0] instanceof RegExp) return doc[key].match(values[0]);\n    });\n  }\n\n  const results = [];\n  for (const value of values) {\n    const result = global.docs.find(doc => {\n      if (typeof value === 'string') return doc[key] === value;\n      if (value instanceof RegExp) return doc[key].match(value);\n    });\n\n    results.push(result);\n  }\n\n  return results;\n};\n\nexports.file = function (filePath) {\n  return fs.readFileSync(filePath).toString();\n};\n\n"
  },
  {
    "path": "script/check.sh",
    "content": "#!/bin/bash\n\nfor plugin in $(ls -1 -d esdoc-*)\ndo\n  cd $plugin\n#  localDate=$(TZ=UTC git log --date=format-local:%Y-%m-%d -n 1 ./ | grep Date | cut -d ' ' -f 4 | cut -d 'T' -f 1)\n  npmDate=$(npm view ./ | grep modified | awk -F \"'\" '{print $2}')\n  log=$(git log --since=\"$npmDate\" --invert-grep --grep=\"bump v\" -n 1 ./)\n  if [ \"$log\" != \"\" ]; then\n    echo $plugin\n  fi\n  cd ../\ndone\n"
  },
  {
    "path": "script/install.sh",
    "content": "#!/bin/bash -e\n\nfor plugin in $(ls -1 -d esdoc-*)\ndo\n  echo $plugin\n  (cd $plugin && npm install)\n  echo ========================================================================\ndone\n"
  },
  {
    "path": "script/test.sh",
    "content": "#!/bin/bash -e\n\nfor plugin in $(ls -1 -d esdoc-*)\ndo\n  echo $plugin\n  (cd $plugin && npm run test)\n  echo ========================================================================\ndone\n"
  }
]